import type { WorkbenchApi } from './agent-workbench-api.js'; /** * 触屏鉴权契约(P1-17)。 * * 工作台上凡是要把终端塞进浏览器的地方,鉴权走哪条路都不看登录态,只看「这个浏览器 * 发 WebSocket 时带不带 Cookie」: * • 桌面登录态 → 同源 `/s/`。Cookie 带得过去,而且它捎带接管授权。 * • 触屏(iOS WebView / 飞书内嵌浏览器)→ 必须换成带 `?viewToken=` 的能力地址。 * iOS WebView 发起 WS 升级时不带 Cookie,同源地址即使页面本身能加载,紧接着的 * 握手也会被 403 掉,终端永远停在 disconnected。 * • 未登录 → 同样只能走 viewToken。 * * 这两个 hook 就是那份契约本身。以前它只长在终端面板里,会话坞另起一套「永远发裸 * /s/ 链接」的写法,于是手机上点开就是 403 空白——同一份判断只能有一处实现,坞和面板 * 都从这里取。 */ /** 当前是不是触屏环境。matchMedia + change 订阅,卸载时退订;`maxTouchPoints` 兜住 * 那些同时报 hover 的混合设备(iPad 接键盘、Windows 触屏本)。 */ export declare function useTouchEnvironment(): boolean; export interface TerminalViewLink { sessionId: string; url: string; expiresAt: number | null; } export type TerminalViewLinkPhase = 'idle' | 'loading' | 'ready' | 'failed'; export interface TerminalViewLinkState { /** 当前可用的只读链接。`null` 表示还没拿到——调用方必须停在等待态, * **绝不能**回退到裸同源地址:那条路在触屏上必然是黑屏。 */ link: TerminalViewLink | null; phase: TerminalViewLinkPhase; /** 手动重试。effect 的 cleanup 会取消挂起的自动重试,所以连点不会叠定时器。 */ retry(): void; } /** * 拉取并维护一条短时 viewToken 只读链接(`GET /api/sessions//view-link`)。 * 服务端只返回同源路径,api 层已经做了形状校验与同源改写(P1-5)。 * * `enabled=false` 时不发任何请求,phase 停在 idle:桌面登录态、外部 Riff 终端这些 * 用不上能力凭证的场合就该一次都不问。 */ export declare function useTerminalViewLink(params: { api: WorkbenchApi; sessionId: string; enabled: boolean; }): TerminalViewLinkState; //# sourceMappingURL=agent-workbench-touch.d.ts.map