import type { CliId } from '../adapters/cli/types.js'; /** 一个用户可选项;wrapperCli 不为空时表示它以该前缀启动(如 `aiden x claude`)。 */ export interface CliSelectOption { /** 唯一选择键:合法 CliId,或 'aiden-x-claude' / 'aiden-x-codex'。 */ readonly key: string; /** 展示名。 */ readonly label: string; /** 底层适配器 cliId。 */ readonly cliId: CliId; /** 通用启动前缀,如 'aiden x claude';普通 CLI 无此项。 */ readonly wrapperCli?: string; } /** 级联树节点:顶层 CLI;children 非空表示选中后进二级菜单(目前只有 Aiden)。 */ export interface CliSelectGroup { readonly key: string; readonly label: string; /** 叶子项:直接可选;children:进二级菜单。两者必居其一。 */ readonly option?: CliSelectOption; readonly children?: ReadonlyArray; } /** 解析结果:落进 bot 配置的 cliId(+ 可选 wrapperCli)。 */ export interface ResolvedCliSelection { readonly cliId: CliId; readonly wrapperCli?: string; } /** ttadk 默认模型(dashboard 占位 / 启动期空值兜底,CoCo 不适用)。 */ export declare const TTADK_DEFAULT_MODEL = "glm-5.1"; /** dashboard 模型框候选(账号不同会变,仅作建议,仍可自由填任意模型 id)。 */ export declare const TTADK_MODEL_SUGGESTIONS: ReadonlyArray; /** * 级联树(终端 TUI 用):顺序同 CLI_OPTIONS;'aiden' 一项展开成 children; * 末尾追加无原生 cliId 的网关分组(CJADK / TTADK)。 */ export declare const CLI_SELECT_TREE: ReadonlyArray; /** * 扁平选项(web 下拉 + 非 TTY 回退用):'aiden' 之后紧跟两个 aiden×* 项, * 末尾依次追加 cjadk×* 与 ttadk×* 项。 */ export declare const CLI_SELECT_OPTIONS: ReadonlyArray; /** 按 key 查选项;非法 key 返回 undefined。 */ export declare function lookupCliSelection(key: string): CliSelectOption | undefined; /** 反查:由一个 bot 现有的 cliId + wrapperCli 得到对应的选择键(供编辑时高亮默认)。 */ export declare function selectionKeyForBot(cliId: string, wrapperCli?: string): string; /** * 把选择键解析成可落盘的 bot 配置片段(纯映射,无副作用)。非法 key 抛错。 */ export declare function resolveCliSelection(key: string): ResolvedCliSelection; /** 按空格把 wrapperCli 前缀拆成 token(首 token 为 bin)。 */ export declare function parseWrapperCli(wrapperCli: string): string[]; /** * 剥掉 aiden x claude 拒收的 `--settings`(含其值),支持 `--settings ` 与 * `--settings=` 两种写法。其余参数原样保留。改用纯 argv 处理(跨系统、无 shell)。 */ export declare function stripSettingsArgs(args: ReadonlyArray): string[]; /** * 剥掉 aiden `aiden x ` 网关拒收的、**botmux 注入的**底层 CLI config 覆盖参数: * - `--settings ` / `--settings=`(claude 携带 hook/bypass,aiden x claude 历来就剥) * - botmux 自己注入的 Codex `-c`(session 环境,以及关闭启动更新选择器); * aiden 1.8.38+ 会直接报错拒收 `aiden x codex` 透传的 `-c`/`--config`。 * - `--dangerously-bypass-hook-trust`(codex 家族的 hook-trust 绕过 flag):aiden 网关 * 自身已管理底层 codex 的 hook-trust,botmux 再透传一份会让 codex 收到两次 → * `error: the argument '--dangerously-bypass-hook-trust' cannot be used multiple times` * 直接启动失败。故经 aiden 网关时一律剥掉这份冗余副本(bare flag,无值);aiden x claude * 路径底层 claude 从不注入此 flag,剥除是 no-op。 * 这些参数承载的 session 环境已在进程级 env(BOTMUX_SESSION_ID 等)注入、并被 wrapper * 子进程继承(见 worker.ts childEnv),故剥掉只是去掉一条冗余的 belt-and-suspenders * 通道,不丢功能。关闭启动更新的覆盖在 aiden 路径无法传递(launcher 本身禁止 config); * worker 会在极少数仍出现选择器的启动中自动选择非升级项,host 侧仍会做每日只读检查。 * `-c` 按 botmux 注入白名单精确识别,用户自带的 * `-c key=val` 一律不动;`--settings` 则沿用 aiden x claude 历来的兼容策略 * 整体剥离(复用 {@link stripSettingsArgs},不区分来源)。原生启动及 ttadk 等「裸透传」网关 * 不走本函数,仍保留 `-c`(它们的 launcher 接受并转发给真 CLI,照常生效)。cjadk 走单独的 * {@link rewriteCjadkCodexConfigArgs}(它的 `code` 子命令把 `-c` 占为 `--command`,要改写成 * `--config` 才能透传,而非剥离——故不复用本函数)。 * * 关键:识别按 botmux 注入特征(`--settings` 的语义 + Codex config 白名单)而非按某个具体 CLI—— * 任何适配器将来注入**同形态**的 config 覆盖,经 aiden 网关时都会被一并剥掉,不会重蹈 codex 覆辙。 * 注意范围仅限上述两种 botmux 注入形态:coco 的 `--config model.name=…`(承载 model、非 session * 管线,且无内置 `aiden x coco` 选项)等不同形态的 config 覆盖**有意不在此剥离**。 */ export declare function stripWrapperUnsafeArgs(args: ReadonlyArray): string[]; /** * cjadk codex 专用改写:把 botmux 给 codex 注入的 `-c ` 改写成 Codex 的 * 长形式 `--config `。 * * 起因:cjadk 的 `code` 子命令用 commander 定义了 `-c, --command `("运行自定义命令而非默认 * agent 命令"),即便 `allowUnknownOption(true)`,**已定义**的 `-c` 仍被 cjadk 自己吃掉绑到 * `--command`,不会透传给真 codex——于是 cjadk 把 `shell_environment_policy.set.BOTMUX_SESSION_ID="…"` * 当成"要运行的命令",报 `… is not installed. Please install it first.`(本次只在 cjadk codex 复现的根因; * cjadk claude 不受影响是因为 claude 注入的是 `--settings` 而非 `-c`)。 * * codex 的 `--config` 是 `-c` 的长形式(`-c, --config `),而 cjadk 的 `code` 子命令**未定义** * `--config`,故 `--config …` 落入 cjadk 的 passthrough(`allowUnknownOption`)原样转发给真 codex,效果与 `-c` * 完全一致。相比 aiden 路径的整条剥离,改写**保留**了把 BOTMUX_SESSION_ID 注入 codex shell 工具环境的通道。 * * 只改写 botmux 自己注入的 config 白名单,用户自带的 `-c key=val` 一律不动。 * 非 codex 的 cjadk 形态(cjadk claude 带 `--settings`、不带这些值)经此函数是 no-op, * `--settings` 照常保留透传。 */ export declare function rewriteCjadkCodexConfigArgs(args: ReadonlyArray): string[]; /** 该前缀是否为 ttadk 网关(`ttadk <子命令> …`)。 */ export declare function isTtadkWrapper(wrapperCli: string | undefined): boolean; /** ttadk 该子命令是否接受 `-m `(CoCo 等 requiresManagedModel=false 的不接受)。非 ttadk 前缀返回 false。 */ export declare function ttadkAcceptsModel(wrapperCli: string | undefined): boolean; /** buildWrappedLaunch 的可选项。 */ export interface WrappedLaunchOptions { /** * ttadk 网关专用:注入到 `ttadk <子命令> -m ` 的模型 id。空/未传时 * 用 {@link TTADK_DEFAULT_MODEL} 兜底;不接受 -m 的子命令(CoCo)忽略此项。 */ readonly ttadkModel?: string; } /** * /botconfig 等配置卡的 ttadk 模型候选:ttadk 网关 bot 返回 ttadk 模型候选 * ({@link TTADK_MODEL_SUGGESTIONS};CoCo 等不接受 -m 的返回 `[]` = 不渲染模型下拉); * 非 ttadk 返回 `null`,调用方据此回落底层适配器自己的 modelChoices。 */ export declare function ttadkConfigModelChoices(wrapperCli: string | undefined): string[] | null; /** * 由 wrapperCli 前缀 + 底层 CLI 的 args 构造实际 spawn 的 `{ bin, args }`。 * - bin = 前缀首 token(经 binResolver 走 PATH 解析) * - args = 前缀其余 token + CLI 参数(aiden `aiden x ` 形态会先经 * {@link stripWrapperUnsafeArgs} 剥掉 botmux 注入、aiden 拒收的 `--settings`/`-c`; * cjadk `cjadk ` 形态走 {@link rewriteCjadkCodexConfigArgs} 把 codex 注入的 `-c` * 改写成 cjadk 不会吞掉的 `--config`) * - ttadk 网关走专门分支注入 `-m --skip-check`(见 {@link buildTtadkLaunch}) * 前缀为空时返回 `{ bin: '', args }`,调用方据此跳过(不改写 spawn)。 */ /** * Wrapper-specific launch ENVIRONMENT — the single source of truth shared by * the worker spawn branch and one-shot child processes (session-group AI * titling). cjadk launches its agent inside an interactive wrapper (startup * selector + terminal quirks) unless CJADK_INTERACTIVE=0; without it a * non-TTY one-shot call can hang on the selector. */ export declare function wrapperLaunchEnv(wrapperCli: string | undefined): Record | undefined; export declare function buildWrappedLaunch(wrapperCli: string, cliArgs: ReadonlyArray, binResolver?: (bin: string) => string, opts?: WrappedLaunchOptions): { bin: string; args: string[]; }; /** * 把适配器给出的「裸 CLI 恢复命令」改写成 wrapperCli 形态,供 session-closed 卡片里 * 展示给用户手动 resume。例:`claude --resume ` + 前缀 `aiden x claude` → * `aiden x claude --resume `。wrapperCli 未设时原样返回。 * * ttadk 特例:必须带上 `-m --skip-check`(与 {@link buildTtadkLaunch} 同), * 否则用户复制粘贴这条 resume 命令会卡在 ttadk 的交互式选模型菜单。模型从 * `opts.ttadkModel`(= bot.model)取,空则用默认值(CoCo 不带 -m)。 */ export declare function decorateResumeForWrapper(cmd: string, wrapperCli: string | undefined, opts?: { ttadkModel?: string; }): string; //# sourceMappingURL=cli-selection.d.ts.map