JetBrains AI 通过 Central CLI — 跨模块生命周期
驱动¶
JetBrains AI 模型通过用户自己的 central CLI 到达 ThinkRail,该 CLI 将 pi 扩展写入一个全局路径,并报告账户的周期性 AI 信用配额。因此,Central 表现为跨模块链路而非单一模块边界。其端到端生命周期映射、活性和配额读取组合仅存在于该链路中。
边界:此节点仅拥有组合,别无其他。 每个模块的规范对其自身表面保持权威性,且不在此重述——适配器的 argv/版本/配额解析契约是 [[module-shared]],状态/操作/配额编排是 [[submodule-server-auth]],运行时生成是 [[submodule-server-agent]],同步配额偏好是 [[submodule-server-settings]],线路形态是 [[module-contracts]],提供者控制是 [[submodule-web-panels]],全局读出是 [[submodule-web-shell]]。仅影响一个表面的更改会更新该叶子节点,而非此文件。
链路¶
唯一的端到端映射。每列由其表头中的模块拥有;此表是它们之间对应关系被陈述的唯一位置。
| 磁盘 / CLI 真实状态 | inspectJbcentral (shared) |
线路 JbcentralStatus (contracts) |
卡片 (panels) |
|---|---|---|---|
无法解析到 central |
absent |
absent |
主机操作系统安装命令 + 重新检查 |
版本低于 MINIMUM_CENTRAL_VERSION |
outdated |
outdated |
引导式更新 |
--version 无法解析 |
malformed-version |
malformed-version |
重新安装指引,无原生操作 |
| 探测启动/超时/退出失败 | probe-failed |
probe-failed |
重新检查指引 |
| 二进制存在,工件缺失 | supported |
supported |
连接 |
| 二进制 + 工件存在 | supported + configured |
configured |
已连接 / 断开连接 |
…且 Auth 行为 not connected |
—(观察结果) | signedOut 标志 |
登录 取代 主操作 |
…且 Proxy 行已停止 |
—(观察结果) | proxyStopped 标志 |
启动代理 取代 断开连接 |
| 重建未完成或操作进行中 | — | configuring |
加载指示器,不提供任何操作 |
| 候选运行时加载失败 | — | load-failed |
重试 / 断开连接 |
配额链路¶
当配额显示启用时,可见的 web shell 按配置的 1–3600 秒节奏(默认 30 秒)请求封闭的配额快照。主机首先应用同步设置以及提供者卡片标记为 Connected 的同一健康 Central 谓词,然后服务器 auth 通过一个仅内存的缓存/单飞(single-flight)对读取方进行去重,并要求 shared 以 central quota --json 方式运行绝对路径二进制文件。shared 仅接收周期性的 remaining + total 数字;contracts 仅携带隐藏/可用/过期/不可用状态;shell 将它们渲染在主机连接状态紧邻的左侧。隐藏的前端不进行轮询,禁用/不健康状态不执行配额读取,且不持久化任何配额值。生命周期边界会清除最后一次成功的回退,以便后续账户不会从先前账户继承过期数字。
生命周期表编码了两个没有任何单一模块声明的事实:
configuring和load-failed没有对应的检查项。 它们是主机重建机制的特性,而非主机文件系统的特性,因此仅跟随shared的读取方无法推导出它们。- 已退出登录和代理已停止标志是单向的。 只有主动观察到的否定状态才会设置它们;未知状态永远不会。卡片将每个标志转化为主操作的替代而非注释,因为它绝不应展示一个无法成功的操作。
决策¶
- 一个经审查的工件将检查与运行时加载连接起来。 适配器拥有其位置、存在性判定和监视器;运行时仅接收其不透明路径。由于已配置的真实性仅使用存在性,原地替换依赖于监视器而非存在性轮询。本地机制在 [[module-shared]] 和 [[submodule-server-agent]] 中保持权威性。
- 没有任何源自 Central 的文本到达客户端。 进程适配器、扩展前提供者允许列表和封闭的线路状态各自执行该保证的一部分;它们的本地契约保留在 [[module-shared]]、[[submodule-server-agent]]、[[submodule-server-auth]] 和 [[module-contracts]] 中。工件重新注册的内置提供者(
anthropic、openai、google-vertex)是 Central 在卡片之外可见的唯一位置:它们仍然是标记为kind: "central"("JetBrains AI")的普通提供者行,通过注册身份归属,以便用户可以看到哪些提供者通过 Central 到达他们,而其任何配置都不会跨越线路。配额通过结构化数字允许列表扩展了该规则:账户、套餐、使用量、充值、补充、诊断和原始输出仍保留在主机本地并被丢弃。 - 配额是独立的读取,既不是提供者状态,也不是主机计时器。 提供者生命周期和配额具有不同的延迟/失败语义,而主机拥有的计时器会在没有可见消费者的情况下运行。可见客户端拥有节奏;一个主机缓存/单飞(single-flight)可防止它们倍增 CLI 工作。
不变量¶
- 监视器失效表示经审查工件上的可能边界,而非目录活动。 平台事件分类和替换恢复机制仅属于 [[module-shared]]。
- 每条进入
configuring的路径都有有界的出口。 操作受适配器超时限制;未完成的重建在排空稳定后退出。线路状态本身不携带任何截止时间。 - 重建排空在有界时间内稳定请求的状态,与入站事件速率无关。 去抖限制的是突发宽度而非流长度,因此它无法提供此保证。
不变量 3 目前被违反,由 issue #287 跟踪。 只要
requestedSequence在准备期间发生变化,runRebuildDrain就会丢弃已完成的候选者,因此进展仍然需要静默窗口,激活可能无限期饥饿。工件范围的失效消除了无关事件的已知来源,但并未改变该算法。
事后分析。 由于产物目录缺失,watcher 回退到 pi 的状态目录,并把无关的状态写入当成了重建请求。drain 的静默窗口假设让 configuring 一直保持激活,同时反复准备运行时。每个叶子契约局部上都是一致的,但在组合中没有 spec 对它们的活性负责。
超出范围¶
适配器确切的 argv/schema/超时设置;provider-card 和 top-bar 的交互/文案;设置校验;候选准备和生成激活;wire 字段形态;启动顺序;e2e 测试夹具。每一项都保留在各自的模块 spec 中——这里列出只是为了让读者知道,本文件不是修改它们的地方。
使用方¶
[[module-shared]] · [[submodule-server-auth]] · [[submodule-server-agent]] ·
[[submodule-server-settings]] · [[module-contracts]] · [[submodule-web-store]] ·
[[submodule-web-panels]] · [[submodule-web-shell]] · [[module-cli]] (启动顺序) ·
[[module-browser-e2e]] (00-jbcentral*)
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 th/thinkrail