import { WebSocket } from 'ws'; import { TUNNEL_ERROR_CODES } from '../_vendored-contracts/skill-tunnel.js'; import type { HeartbeatTunnelResult, JsonRpcSuccessResponse, JsonRpcErrorResponse, SkillUpdateTunnelParams } from '../_vendored-contracts/skill-tunnel.js'; import type { BrainPushClient } from '../scheduler/types.js'; import type { LocalSkillRegistryEntry } from '../skill-runner/types.js'; export type TunnelStatus = 'connecting' | 'connected' | 'disconnected'; export interface SkillTunnelClientOptions { /** e.g. wss://api.skillfm.ai/v1/skill-tunnel */ brainUrl: string; agentToken: string; /** 来自 M1 readRegistry() 的 entries 列表 */ localSkills: LocalSkillRegistryEntry[]; skillfmLocalVersion: string; /** SKILLFM_SKILL_AUTH_SECRET — HMAC 密钥(handshake + JSON-RPC meta + 本地 skill 调用都用这把)*/ authSecret: string; onStatusChange?: (status: TunnelStatus) => void; /** 可选: 注入 fetch 给 LocalBridge(测试用)*/ fetch?: typeof fetch; /** SAFE observation local store root. Defaults to ~/.skillfm. */ skillfmHome?: string; /** Optional Brain client for consent-gated SAFE observation upload. */ brain?: Pick; /** 可选: 注入 WebSocket 构造器(测试用)*/ webSocketCtor?: typeof WebSocket; } export declare class SkillTunnelClient { private readonly opts; private readonly bridge; private readonly reconnect; private readonly heartbeat; private ws; private status; private lastConnectedAt; private stopped; private readonly pending; constructor(opts: SkillTunnelClientOptions); start(): Promise; stop(): Promise; status$(): { connected: boolean; lastConnectedAt: number | null; reconnectAttempts: number; }; /** 主动上报 skill lifecycle 事件 */ sendSkillUpdate(params: SkillUpdateTunnelParams): Promise; private connectOnce; private onOpen; private onError; private onClose; private onMessage; private handleServerRequest; private handleResponse; private sendFrame; private sendClientRequest; private buildHeartbeatStatus; private handleHeartbeatTimeout; private setStatus; } export type { JsonRpcSuccessResponse, JsonRpcErrorResponse, HeartbeatTunnelResult }; export { TUNNEL_ERROR_CODES }; //# sourceMappingURL=client.d.ts.map