import type { BladeClient } from "../blade-client"; /** 一台远程电脑在某个会话眼里的样子。 */ export interface SessionComputer { id: string; label: string; hostname?: string | null; os?: string | null; arch?: string | null; /** 那台机器的用户主目录,命令默认在这里执行。 */ home?: string | null; /** daemon 启动时所在的目录。 */ workspace?: string | null; blade_home?: string | null; allowed_paths?: string[]; agent_runtimes?: unknown[]; daemon_version?: string | null; created_at: string; last_seen_at?: string | null; /** 这台电脑此刻连着后端。由服务端读心跳时间判定,不做实时探测。 */ online: boolean; /** 这次会话已经启动了它。和 `online` 互相独立。 */ enabled: boolean; /** 这次会话本身就跑在这台电脑上。 */ is_primary: boolean; } export interface SessionComputerList { computers: SessionComputer[]; } /** * 账号级电脑目录里的一台机器。 * * 只有「这台机器登记过、此刻在不在线」这类账号事实,**没有**会话授权状态—— * 「本次会话能不能用它」是另一件事,由会话接口回答。两者混在一起说,用户就会 * 把「在线」当成「已授权」,或者反过来。 */ export interface AccountComputer { id: string; label: string; hostname?: string | null; os?: string | null; arch?: string | null; blade_home?: string | null; workspace?: string | null; daemon_version?: string | null; created_at: string; last_seen_at?: string | null; online: boolean; } export interface AccountComputerList { computers: AccountComputer[]; } /** * 一台电脑在界面上该显示成什么状态。 * * - `primary` 会话自己就住在这台机器上,恒为可用且不能停用 * - `enabled` 本次会话已启动 * - `offline` 没启动且当前离线 * - `idle` 没启动,在线 * * 判定只写这一份,界面只管样式和排版——两边各写一份必然会分叉, * 然后其中一边的兜底会把另一边的错误盖住。 */ export type ComputerState = "primary" | "enabled" | "offline" | "idle"; export declare function computerState(computer: SessionComputer): ComputerState; /** * 这台电脑跑的是哪一类系统。 * * 判定放这里、图标映射留给界面:`os` 是 daemon 上报的 `runtime.GOOS`, * 各处自己 `startsWith` 一遍必然会分叉。 */ export type ComputerOS = "macos" | "windows" | "linux" | "unknown"; export declare function computerOS(computer: SessionComputer): ComputerOS; /** 系统与架构,例如 `darwin/arm64`。信息不全时尽量给出已知的那部分。 */ export declare function computerPlatformLabel(computer: SessionComputer): string; /** * 那台电脑上 blade daemon 的版本。 * * 服务端存的就是 daemon 上报的完整串(dev 构建带 commit),这里原样用, * 不在前端另拼一套格式——拼两份迟早对不上。 */ export declare function computerDaemonVersion(computer: SessionComputer): string; /** 这台电脑的勾选框能不能动。主运行时不能停用——那是会话自己的工作目录所在。 */ export declare function canToggleComputer(computer: SessionComputer): boolean; /** * 列表顺序:按接入时间,稳定不变。 * * **刻意不按在线/可用排序。** 那样排看着"手边的在前面",代价是电脑上下线、 * 勾选状态一变,整个列表就重排——用户正要点的那一项会在手指底下跑掉。 * 一个会自己动的列表比一个排序不那么聪明的列表难用得多。 * * 用 `created_at` 而不是名字:改名不会让位置变,新接入的稳定排在末尾。 */ export declare function sortComputers(computers: SessionComputer[]): SessionComputer[]; /** 会话可以操作哪些远程电脑。 */ export declare class ComputersResource { private client; constructor(client: BladeClient); /** * 列出当前账号登记过的全部电脑及其在线状态。 * * 首页还没有会话,也要能看到同一份清单——判定各写一份必然分叉,一边的兜底会把 * 另一边的错误盖住(#1597)。所以账号事实只从这一个接口读。 */ listAccount(): Promise; /** * 列出当前用户的全部电脑,带上"在不在线"和"这次会话能不能用"。 * 服务端只查库,电脑离线时同样返回,所以拿得到"它离线了"这个结论。 */ list(sessionId: string): Promise; /** * 启动或停止一台电脑。只改这次会话的可用范围,不会碰远程机器, * 电脑离线时同样能登记,等它上线就直接可用。 */ setEnabled(sessionId: string, computer: string, enabled: boolean): Promise; }