/** * daemon 账号级查询面(窄接口)。 * * 这是 QueryRunner 在「daemon 绑定的 Query」上把账号级查询改道到守护进程时唯一依赖的 * 契约。它只暴露 10 个账号级查询;**不包含** `Daemon` 的生命周期与写操作成员 * (`stop()` / `state` / `renameSession()` / `deleteSession()`),也**不包含** * daemon 专属的会话目录查询 `listSessions`。 * * 为什么 `listSessions` 不进这里:它是 **daemon 专属接口**,`Query` 上没有对应成员, * 因此不存在「把 Query 的既有接口代理到 daemon」这回事。本接口的职责只有一件——把 * `Query` **本来就有**的账号级查询在 daemon 形态下改道到 `daemon.*`,绝不借它给 * `Query` 扩新能力。要给 `Query` 加成员,就得同时实现它的每一个实现者 * (`QueryRunner` 与 `CloudAgentQuery`),漏一个就是编译期破坏;需要会话目录的宿主 * 直接用 `Daemon.listSessions(cwd?)`,那条不经本接口。 * * 同理 rename/delete 虽然也接受 cwd,但它们是**写操作**(改标题、删记录),属于宿主经 * `Daemon` 直接掌握的能力,绝不下放给 QueryRunner。 * * 也**不包含** `listPlugins`——它看着像账号级查询,其实是会话级的。worker 协议里 * `list_plugins` 读的是会话自己的 Config(headlessSession.ts:9198),而 daemon 的 * `daemon.list_plugins` 读 daemon 根 Config;用户经 `--plugin-dir`(即 Query 的 * `plugins` 选项)配置的插件只装进会话 Config,根 Config 永远看不到。把它列进来会 * 让 daemon 绑定的 Query 静默返回一份缺了会话插件的清单——比报错更难发现。 * 故 `Query.listPlugins()` 一律走会话面(CLI 侧已注册会话级 `list_plugins`); * 需要账号级清单的宿主直接用 `Daemon.listPlugins()`,那条不经本接口。 * * 为什么是窄接口而不是直接传整个 `Daemon`: * * 1. 职责隔离。QueryRunner 只负责把只读查询路由到 daemon 面,它不该、也不能持有 * 或操作 daemon 的生命周期。把整个 `Daemon` 塞进来会让 QueryRunner 凭空获得关闭 * daemon、改名/删除会话等与本职责无关的权力——那是 startDaemon() 的调用方 * (宿主)才应该掌握的能力。 * 2. 可测性。窄接口让单测可以用一个只实现这些方法的假对象钉住路由,不必启动 * 真实 daemon 进程,也不必构造完整的 `Daemon`。 * 3. 结构化兼容。TypeScript 是结构化类型:真正的 `Daemon` 天然满足这个更窄的接口, * 所以 `query()` 在 daemon 绑定分支里直接把 `options.daemon` 传进来即可,无需适配层。 * * 方法名与签名刻意与 `Daemon`(`../daemon/start-daemon.js`)保持一致,而不是与 `Query` * 的对外方法名一致——这样 `Daemon` 能被直接赋值给本接口。QueryRunner 负责把 Query 的 * 对外语义(吞错、可空性、入参形状)适配到这些 daemon 方法上,契约差异收敛在 * QueryRunner 一侧,不外泄到本接口。 */ import type { DaemonGetModelsParams, DaemonValidateByokModelParams } from '../daemon/protocol.js'; import type { BYOKProviderInfo, ByokConfigCheckResult, ByokConfigInfo, ByokConfigReference, CheckByokConfigInput, CreateByokConfigInput, DeleteByokConfigInput, UpdateByokConfigInput } from '../protocol/control.js'; import type { AccountInfo, ModelInfo, UsageInfo } from '../protocol/common.js'; export interface DaemonAccountQueryPlane { getModels(options?: DaemonGetModelsParams): Promise; getByokConfig(): Promise; validateByokModel(input: DaemonValidateByokModelParams): Promise; listByokConfigs(): Promise; createByokConfig(input: CreateByokConfigInput): Promise; updateByokConfig(input: UpdateByokConfigInput): Promise; deleteByokConfig(target: DeleteByokConfigInput): Promise; checkByokConfig(input: CheckByokConfigInput): Promise; getUsageInfo(): Promise; accountInfo(): Promise; }