diff --git a/src/cli/container-target.ts b/src/cli/container-target.ts index 31aee0f02d5..6be827c498e 100644 --- a/src/cli/container-target.ts +++ b/src/cli/container-target.ts @@ -1,6 +1,7 @@ import { spawnSync } from "node:child_process"; import { consumeRootOptionToken, FLAG_TERMINATOR } from "../infra/cli-root-options.js"; import { getPrimaryCommand } from "./argv.js"; +import { forwardConsumedCliRootOption } from "./root-option-forward.js"; import { takeCliRootOptionValue } from "./root-option-value.js"; type CliContainerParseResult = @@ -56,14 +57,8 @@ export function parseCliContainerArgs(argv: string[]): CliContainerParseResult { continue; } - const consumedRootOption = consumeRootOptionToken(args, i); + const consumedRootOption = forwardConsumedCliRootOption(args, i, out); if (consumedRootOption > 0) { - for (let offset = 0; offset < consumedRootOption; offset += 1) { - const token = args[i + offset]; - if (token !== undefined) { - out.push(token); - } - } i += consumedRootOption - 1; continue; } diff --git a/src/cli/profile.ts b/src/cli/profile.ts index d9fd8876c5a..b848edae605 100644 --- a/src/cli/profile.ts +++ b/src/cli/profile.ts @@ -1,9 +1,10 @@ import os from "node:os"; import path from "node:path"; -import { consumeRootOptionToken, FLAG_TERMINATOR } from "../infra/cli-root-options.js"; +import { FLAG_TERMINATOR } from "../infra/cli-root-options.js"; import { resolveRequiredHomeDir } from "../infra/home-dir.js"; import { getPrimaryCommand } from "./argv.js"; import { isValidProfileName } from "./profile-utils.js"; +import { forwardConsumedCliRootOption } from "./root-option-forward.js"; import { takeCliRootOptionValue } from "./root-option-value.js"; export type CliProfileParseResult = @@ -65,14 +66,8 @@ export function parseCliProfileArgs(argv: string[]): CliProfileParseResult { continue; } - const consumedRootOption = consumeRootOptionToken(args, i); + const consumedRootOption = forwardConsumedCliRootOption(args, i, out); if (consumedRootOption > 0) { - for (let offset = 0; offset < consumedRootOption; offset += 1) { - const token = args[i + offset]; - if (token !== undefined) { - out.push(token); - } - } i += consumedRootOption - 1; continue; } diff --git a/src/cli/root-option-forward.ts b/src/cli/root-option-forward.ts new file mode 100644 index 00000000000..bb53484e177 --- /dev/null +++ b/src/cli/root-option-forward.ts @@ -0,0 +1,21 @@ +import { consumeRootOptionToken } from "../infra/cli-root-options.js"; + +export function forwardConsumedCliRootOption( + args: readonly string[], + index: number, + out: string[], +): number { + const consumedRootOption = consumeRootOptionToken(args, index); + if (consumedRootOption <= 0) { + return 0; + } + + for (let offset = 0; offset < consumedRootOption; offset += 1) { + const token = args[index + offset]; + if (token !== undefined) { + out.push(token); + } + } + + return consumedRootOption; +} diff --git a/src/commands/oauth-env.ts b/src/commands/oauth-env.ts index 6cddf7a48dd..26b59e1b0a1 100644 --- a/src/commands/oauth-env.ts +++ b/src/commands/oauth-env.ts @@ -1,22 +1 @@ -import { isWSLEnv } from "../infra/wsl.js"; - -export function isRemoteEnvironment(): boolean { - if (process.env.SSH_CLIENT || process.env.SSH_TTY || process.env.SSH_CONNECTION) { - return true; - } - - if (process.env.REMOTE_CONTAINERS || process.env.CODESPACES) { - return true; - } - - if ( - process.platform === "linux" && - !process.env.DISPLAY && - !process.env.WAYLAND_DISPLAY && - !isWSLEnv() - ) { - return true; - } - - return false; -} +export { isRemoteEnvironment } from "../infra/remote-env.js"; diff --git a/src/infra/remote-env.ts b/src/infra/remote-env.ts new file mode 100644 index 00000000000..7ff6008a2e3 --- /dev/null +++ b/src/infra/remote-env.ts @@ -0,0 +1,22 @@ +import { isWSLEnv } from "./wsl.js"; + +export function isRemoteEnvironment(): boolean { + if (process.env.SSH_CLIENT || process.env.SSH_TTY || process.env.SSH_CONNECTION) { + return true; + } + + if (process.env.REMOTE_CONTAINERS || process.env.CODESPACES) { + return true; + } + + if ( + process.platform === "linux" && + !process.env.DISPLAY && + !process.env.WAYLAND_DISPLAY && + !isWSLEnv() + ) { + return true; + } + + return false; +} diff --git a/src/line/quick-replies.ts b/src/line/quick-replies.ts deleted file mode 100644 index 69d89476896..00000000000 --- a/src/line/quick-replies.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { messagingApi } from "@line/bot-sdk"; - -type QuickReply = messagingApi.QuickReply; -type QuickReplyItem = messagingApi.QuickReplyItem; -type TextMessage = messagingApi.TextMessage; - -export function createQuickReplyItems(labels: string[]): QuickReply { - const items: QuickReplyItem[] = labels.slice(0, 13).map((label) => ({ - type: "action", - action: { - type: "message", - label: label.slice(0, 20), - text: label, - }, - })); - return { items }; -} - -export function createTextMessageWithQuickReplies( - text: string, - quickReplyLabels: string[], -): TextMessage & { quickReply: QuickReply } { - return { - type: "text", - text, - quickReply: createQuickReplyItems(quickReplyLabels), - }; -} diff --git a/src/plugins/bundled-compat.ts b/src/plugins/bundled-compat.ts index e946be355b5..bb70d968954 100644 --- a/src/plugins/bundled-compat.ts +++ b/src/plugins/bundled-compat.ts @@ -1,4 +1,5 @@ import type { PluginEntryConfig } from "../config/types.plugins.js"; +import { hasExplicitPluginConfig } from "./config-state.js"; import type { PluginLoadOptions } from "./loader.js"; export function withBundledPluginAllowlistCompat(params: { @@ -63,3 +64,32 @@ export function withBundledPluginEnablementCompat(params: { }, }; } + +export function withBundledPluginVitestCompat(params: { + config: PluginLoadOptions["config"]; + pluginIds: readonly string[]; + env?: PluginLoadOptions["env"]; +}): PluginLoadOptions["config"] { + const env = params.env ?? process.env; + const isVitest = Boolean(env.VITEST || process.env.VITEST); + if ( + !isVitest || + hasExplicitPluginConfig(params.config?.plugins) || + params.pluginIds.length === 0 + ) { + return params.config; + } + + return { + ...params.config, + plugins: { + ...params.config?.plugins, + enabled: true, + allow: [...params.pluginIds], + slots: { + ...params.config?.plugins?.slots, + memory: "none", + }, + }, + }; +} diff --git a/src/plugins/providers.ts b/src/plugins/providers.ts index da46aace238..9e6a2cba4e1 100644 --- a/src/plugins/providers.ts +++ b/src/plugins/providers.ts @@ -1,5 +1,5 @@ import { normalizeProviderId } from "../agents/provider-id.js"; -import { hasExplicitPluginConfig } from "./config-state.js"; +import { withBundledPluginVitestCompat } from "./bundled-compat.js"; import { normalizePluginsConfig, resolveEffectiveEnableState } from "./config-state.js"; import type { PluginLoadOptions } from "./loader.js"; import { loadPluginManifestRegistry } from "./manifest-registry.js"; @@ -9,27 +9,7 @@ export function withBundledProviderVitestCompat(params: { pluginIds: readonly string[]; env?: PluginLoadOptions["env"]; }): PluginLoadOptions["config"] { - const env = params.env ?? process.env; - if ( - !env.VITEST || - hasExplicitPluginConfig(params.config?.plugins) || - params.pluginIds.length === 0 - ) { - return params.config; - } - - return { - ...params.config, - plugins: { - ...params.config?.plugins, - enabled: true, - allow: [...params.pluginIds], - slots: { - ...params.config?.plugins?.slots, - memory: "none", - }, - }, - }; + return withBundledPluginVitestCompat(params); } export function resolveBundledProviderCompatPluginIds(params: { diff --git a/src/plugins/setup-browser.ts b/src/plugins/setup-browser.ts index eca0ab486bd..c665e3cef98 100644 --- a/src/plugins/setup-browser.ts +++ b/src/plugins/setup-browser.ts @@ -1,7 +1,10 @@ -import { isWSL, isWSLEnv } from "../infra/wsl.js"; +import { isRemoteEnvironment } from "../infra/remote-env.js"; +import { isWSL } from "../infra/wsl.js"; import { runCommandWithTimeout } from "../process/exec.js"; import { detectBinary } from "./setup-binary.js"; +export { isRemoteEnvironment } from "../infra/remote-env.js"; + function shouldSkipBrowserOpenInTests(): boolean { if (process.env.VITEST) { return true; @@ -61,27 +64,6 @@ async function resolveBrowserOpenCommand(): Promise { return { argv: null }; } -export function isRemoteEnvironment(): boolean { - if (process.env.SSH_CLIENT || process.env.SSH_TTY || process.env.SSH_CONNECTION) { - return true; - } - - if (process.env.REMOTE_CONTAINERS || process.env.CODESPACES) { - return true; - } - - if ( - process.platform === "linux" && - !process.env.DISPLAY && - !process.env.WAYLAND_DISPLAY && - !isWSLEnv() - ) { - return true; - } - - return false; -} - export async function openUrl(url: string): Promise { if (shouldSkipBrowserOpenInTests()) { return false; diff --git a/src/plugins/web-search-providers.shared.ts b/src/plugins/web-search-providers.shared.ts index 9b4640022f4..d2b174e392b 100644 --- a/src/plugins/web-search-providers.shared.ts +++ b/src/plugins/web-search-providers.shared.ts @@ -1,13 +1,10 @@ import { withBundledPluginAllowlistCompat, withBundledPluginEnablementCompat, + withBundledPluginVitestCompat, } from "./bundled-compat.js"; import { resolveBundledWebSearchPluginIds } from "./bundled-web-search.js"; -import { - hasExplicitPluginConfig, - normalizePluginsConfig, - type NormalizedPluginsConfig, -} from "./config-state.js"; +import { normalizePluginsConfig, type NormalizedPluginsConfig } from "./config-state.js"; import type { PluginLoadOptions } from "./loader.js"; import type { PluginWebSearchProviderEntry } from "./types.js"; @@ -23,35 +20,6 @@ function resolveBundledWebSearchCompatPluginIds(params: { }); } -function withBundledWebSearchVitestCompat(params: { - config: PluginLoadOptions["config"]; - pluginIds: readonly string[]; - env?: PluginLoadOptions["env"]; -}): PluginLoadOptions["config"] { - const env = params.env ?? process.env; - const isVitest = Boolean(env.VITEST || process.env.VITEST); - if ( - !isVitest || - hasExplicitPluginConfig(params.config?.plugins) || - params.pluginIds.length === 0 - ) { - return params.config; - } - - return { - ...params.config, - plugins: { - ...params.config?.plugins, - enabled: true, - allow: [...params.pluginIds], - slots: { - ...params.config?.plugins?.slots, - memory: "none", - }, - }, - }; -} - function compareWebSearchProvidersAlphabetically( left: Pick, right: Pick, @@ -102,7 +70,7 @@ export function resolveBundledWebSearchResolutionConfig(params: { config: allowlistCompat, pluginIds: bundledCompatPluginIds, }); - const config = withBundledWebSearchVitestCompat({ + const config = withBundledPluginVitestCompat({ config: enablementCompat, pluginIds: bundledCompatPluginIds, env: params.env,