import type { BackendType } from './adapters/backend/types.js'; /** A wildcard bind (0.0.0.0 / :: / '') isn't a reachable address, so a link must * resolve it to a concrete IP; a specific host is advertised verbatim. */ export declare function isWildcardBindHost(host: string): boolean; export declare function getWebExternalHost(): string; export declare function getDashboardExternalHost(): string; export interface ChatBotDiscoveryConfig { listBotsApiEnabled: boolean; listBotsApiTimeoutMs: number; } export interface HerdrTraexPluginRuntimeConfig { enabled: boolean; source: string; ref: string; } /** * Current-chat bot discovery via Lark `/members/bots`. * * Enabled by default; the dashboard Settings toggle persists the choice in * `~/.botmux/config.json` (`dashboard.chatBotDiscovery`). An explicit * `BOTMUX_LARK_LIST_BOTS_API_ENABLED` env var still overrides the persisted * value — the worker injects it into child panes so `botmux bots list` matches * the daemon's ``, and it doubles as an escape hatch. * * The endpoint is not public API, so every caller must keep the legacy * discovery path as fallback. */ export declare function resolveChatBotDiscoveryConfig(env?: NodeJS.ProcessEnv): ChatBotDiscoveryConfig; /** * TraeX ↔ herdr plugin bootstrap is a machine-wide opt-in because the plugin * writes host-level `~/.trae` hooks. There is intentionally no default plugin * source in botmux; operators provide a `source` (owner/repo[/subdir]) they trust * plus an optional pinned `ref` (tag/branch/SHA) via dashboard Settings or env. */ export declare function resolveHerdrTraexPluginConfig(env?: NodeJS.ProcessEnv): HerdrTraexPluginRuntimeConfig; /** Machine-wide VC meeting listener kill-switch. * * Missing means ON for backwards compatibility. This is intentionally separate * from per-bot vcMeetingAgent.enabled: the global setting allows the host to * stop accepting/restoring VC meeting listeners without editing each bot. */ export declare function isVcMeetingAgentGloballyEnabled(): boolean; export declare function vcMeetingAgentGlobalListenerBotAppId(): string | undefined; /** * Grace period for coalescing a newly forwarded topic with the user's * immediate root-linked clarification. Zero is an explicit kill switch. */ export declare function resolveForwardFollowupWaitMs(env?: NodeJS.ProcessEnv): number; export declare const config: { lark: { appId: string; appSecret: string; }; session: { dataDir: string; }; send: { /** @ hard-gate: every model-initiated `botmux send` reply must explicitly * choose --mention / --mention-back / --no-mention. Set * BOTMUX_REQUIRE_MENTION_DECISION=false to disable (kill-switch if the * gate misfires in production). */ requireMentionDecision: boolean; }; daemon: { cliId: import("./adapters/cli/types.js").CliId; cliPathOverride: string | undefined; backendType: BackendType; /** Auto-recovery throttle: on restart every surviving persistent-backend * session is eagerly re-forked to re-attach its pane. With dozens of * sessions per daemon (and many daemons on one box) firing them all at * once spikes CPU/IO, so the re-fork is staggered: spawn `batchSize` * workers, wait `delayMs`, repeat. Tune via BOTMUX_RECOVERY_FORK_BATCH / * BOTMUX_RECOVERY_FORK_DELAY_MS. */ recoveryForkBatchSize: number; recoveryForkDelayMs: number; forwardFollowupWaitMs: number; workingDir: string; workingDirs: string[]; allowedUsers: string[]; }; web: { host: string; workerHost: string; readonly externalHost: string; proxyBasePort: number; externalPort: number; }; dashboard: { host: string; port: number; readonly externalHost: string; ipcBasePort: number; /** Public read-only mode (default ON): GET/HEAD surfaces — sessions, * schedules, SSE — are reachable WITHOUT a token, so a stale dashboard * link degrades to read-only browsing instead of a dead "link expired" * wall. Write actions (POST/PATCH/DELETE) and the raw PTY log always * require the current token. Opt out with * BOTMUX_DASHBOARD_PUBLIC_READONLY=false. * * NOTE: this env value is only the DEFAULT. Once the toggle is changed on * the dashboard Settings page, `~/.botmux/config.json` holds the value and * permanently takes precedence over this env var(UI 接管后改 env 不再生效; * 要回到 env 控制需删掉 config.json 里的 dashboard.publicReadOnly). */ publicReadOnly: boolean; }; stuckDetector: { /** * Lightweight, AI-free fallback that warns the user when a written input * has not produced a completed turn within `timeoutMs`. Currently targets * the Codex PreToolUse hook-review blocking state (level 1 hooks browser * and level 2 per-hook review). Generic [Y/n]/permission/Press-to-continue * prompts are intentionally NOT handled — they cannot be safely inferred * from a regex and belong in a follow-up. Enabled by default because it * has no external dependencies and only fires when the worker confirms the * turn is genuinely stalled AND the snapshot matches a known hook screen. */ enabled: boolean; /** Milliseconds after a write before the detector checks whether the turn * is still unresolved. */ timeoutMs: number; }; worktreeSlugAI: { /** * Optional AI slugger for `/repo wt` auto branch/worktree naming. Disabled * by default because it sends the topic title / first prompt to the * configured OpenAI-compatible endpoint. When disabled or misconfigured, * botmux falls back to deterministic local slugification. */ enabled: boolean; baseUrl: string; apiKey: string; model: string; timeoutMs: number; /** Extra headers for the API request (JSON string). */ extraHeaders: Record; /** Extra body params for the API request (JSON string). */ extraBody: Record; }; readonly chatBotDiscovery: ChatBotDiscoveryConfig; readonly herdrTraexPlugin: HerdrTraexPluginRuntimeConfig; readonly codexRpcInputDefault: boolean; readonly noVisibleOutputHint: boolean; readonly bypassCodexHookTrust: boolean; }; export type Config = typeof config; //# sourceMappingURL=config.d.ts.map