import { type UserSettings } from '../core/user-settings.js'; import type { WebGuiRegistration } from '../web-gui/registry.js'; export interface DaemonSpawnOptions { /** 恒传给 daemon 入口(--port,strictPort 语义)。 */ port: number; /** --respawn-of 受控交接豁免旗标(§3.7;CLI 命令面未用,respawn 链复用)。 */ respawnOf?: number; } export interface DaemonSpawnResult { pid: number; logFile: string; } export interface DaemonCliDeps { /** env 注入(端口起点 GODOT_MCP_WEB_GUI_PORT;缺省 process.env)。 */ env?: NodeJS.ProcessEnv; /** registry 目录注入(透传真实 listRegistrations;缺省 ~/.godot-mcp/web-gui/)。 */ registryDir?: string; /** registry 读取注入(测试序列可控;缺省真 listRegistrations 绑 registryDir)。 */ listRegistrations?: (opts: { dir?: string; }) => Promise; /** settings.json 读取注入(测试 fake;缺省真实 readUserSettings 绑 settingsDir)。 * 首启预检(终验收 V1,spec §3.10 条款 3)消费——readUserSettings 容错设计 * 永不 reject(缺失/损坏 → 空 settings),CLI 侧无需再包防御。 */ readSettings?: (dir?: string) => Promise; /** settings.json 目录注入(透传真实 readUserSettings;缺省 ~/.godot-mcp/)。 */ settingsDir?: string; /** daemon spawn 注入(测试 fake;缺省真实 detached spawn + 日志 fd)。 */ spawnDaemon?: (opts: DaemonSpawnOptions) => DaemonSpawnResult; /** 受控关停 HTTP 注入(测试 fake;缺省真实 node:http POST,超时 reject)。 */ postShutdown?: (opts: { port: number; token: string; restart: boolean; timeoutMs: number; }) => Promise<{ status: number; }>; /** 进程树强杀注入(缺省 core/process-state killPidTree 同源实现)。 */ killPidTree?: (pid: number) => void; /** 端口空闲探测注入(缺省 net.connect 127.0.0.1,connect 成功=占用)。 */ isPortFree?: (port: number) => Promise; /** --open 浏览器 opener(缺省 open.ts defaultOpener 同源复用)。 */ opener?: (url: string) => void; /** 轮询 sleep 注入(测试零等待)。 */ sleep?: (ms: number) => Promise; /** kill 兜底审计注入(测试 fake 断言被调;缺省直调 appendMachineAuditLine 真实现)。 */ auditKill?: (pid: number, reason: KillFallbackReason) => void | Promise; /** 进程退出注入(缺省 process.exit;exit code 经 EXIT_CODES 注册表)。 */ exit?: (code: number) => never; } /** spawn 完整 argv(含入口)。--port 恒在(批 A ledger:防非 respawn 场景顺延漂移)。 */ export declare function buildDaemonArgv(entry: string, port: number, respawnOf?: number): string[]; /** 受控关停 URL:token 走 query 第一优先级通道(server.ts extractToken:306 先例), * 不发明 Origin——Node http 原生请求无 Origin 头,originAllowed 无 Origin 放行。 */ export declare function buildShutdownUrl(port: number, token: string, restart: boolean): string; /** 端口起点:GODOT_MCP_WEB_GUI_PORT 合法数字透传;'0'/非数字/缺席 → 9550 * (对齐 server.ts WebGuiServerOptions.portStart 注释的同款 env 语义)。 */ export declare function resolveBasePort(env: NodeJS.ProcessEnv): number; /** daemon 入口路径:本模块(build/cli/daemon.js)同级 daemon/main.js; * 源布局(src/cli)下 main.js 不存在 → defaultSpawnDaemon 的 existsSync 守卫报错。 */ export declare function daemonEntryPath(): string; /** kill 兜底路径的审计归因(spec §3.9 daemon 生命周期机器级留痕): * force=--force 直杀;timeout=受控请求超时/网络错误;stale_registry=200 确认但 * 登记迟迟不清;restart_fallback=restart 受控失败退化为 kill+start。 */ export type KillFallbackReason = 'force' | 'timeout' | 'stale_registry' | 'restart_fallback'; /** CLI 入口(router case 'daemon' 接线)。用法错误 exit 2;操作失败 exit 1;成功 exit 0 * (EXIT_CODES 注册表;test/p2-exit-path-repair.test.ts EX-b 静态扫描自动覆盖本文件: * 扫描递归 src/cli 全目录 + 本文件全用常量,无字面值,天然合规无需改该测试)。 */ export declare function runDaemonCli(args: string[], deps?: DaemonCliDeps): Promise;