export type ConnectionState = "connected" | "reconnecting" | "disconnected"; interface PluginLogger { debug(msg: string, ...args: unknown[]): void; info(msg: string, ...args: unknown[]): void; warn(msg: string, ...args: unknown[]): void; error(msg: string, ...args: unknown[]): void; } interface PluginRuntime { system?: { requestHeartbeatNow?: (opts?: { reason?: string; }) => void; runHeartbeatOnce?: (opts?: { reason?: string; sessionKey?: string; heartbeat?: { target?: string; }; }) => Promise; enqueueSystemEvent?: (eventText: string, opts?: { sessionKey?: string; deliveryContext?: { channel?: string; to?: string; accountId?: string; }; deliver?: boolean; }) => void | Promise; }; } export declare class ClawReachService { private ws; private state; private heartbeatTimer; private pongTimer; private connectionCheckTimer; private reconnectTimer; private reconnectAttempt; /** Timer that clears reconnectAttempt once the socket has been OPEN for OPEN_STABLE_MS. */ private openStabilityTimer; /** Deferred timer that retries connect() after pre-connect token refresh failed. */ private preconnectRetryTimer; private lastConnectedAt; private shouldReconnect; private suppressReconnectOnClose; private connectPromise; private refreshPromise; /** Pending heartbeat retry timers, keyed by session-id fragment. Cancelled when new event arrives or event is handled. */ private pendingRetryTimers; /** notify.report 延迟派发定时器,按完整 match session_id 索引;match.generate_report 到达时取消 */ private deferredReportNotifyTimers; private logger; private runtime; private apiUrl; private wsUrl; private pluginVersion; constructor(opts: { logger: PluginLogger; runtime: PluginRuntime; apiUrl: string; wsUrl: string; pluginVersion?: string; }); getState(): ConnectionState; start(): Promise; stop(): void; send(type: string, data?: unknown): void; private connect; private createSocket; private authenticate; private handleMessage; private onSessionStart; private onYourTurn; private onGenerateReport; private onSessionFailed; private onChatMessage; private buildSessionStartHeartbeatReason; private buildGenerateReportHeartbeatReason; private buildChatNewMessageHeartbeatReason; private buildHeartbeatWithSessionExcerpt; private clipChatHistoryForHeartbeat; private onCommunityBrowseRequest; private executeBrowseInteractions; private onCommunitySummaryRequest; private buildCommunitySummaryBody; private submitCommunitySummary; private notifyOwnerFromFallback; private onNewcomerPosted; private onReportNotify; private onChatUnlocked; private onChatUnread; private onBroadcastMessage; /** Web 端资料保存后推送,静默同步到本地 profile.json(推送字段 bio→owner_bio / interests→owner_hobbies / gender→owner_gender / talk_style→speaking_tone,其余同名) */ private onProfileUpdated; private onCommunityPostRequest; private fetchCirclesFromApi; private fetchCirclesAndDispatchPost; private cancelDeferredReportNotify; private cancelPendingRetries; private shouldSkipRetry; private enqueueEvent; /** * 统一事件分发入口。所有行为由 EVENT_REGISTRY 配置驱动: * - visible=true → 走主 session,并带 deliveryContext(用户可见) * - visible=false → 仍走主 session,但不带 deliveryContext(静默执行,不直接同步到主 session) * - 所有事件统一串行队列处理:await enqueueSystemEvent → runHeartbeatOnce → 等完成 → 下一个 * - retryDelays → 有值时在首次触发后按间隔重新触发心跳(不重复入队事件文本) * - noHeartbeat → true 时只 enqueueSystemEvent 不触发心跳(纯通知类事件) */ private visibleEventQueue; private backgroundEventQueue; private processingVisibleEvent; private processingBackgroundEvent; private consecutiveFastHeartbeats; private static readonly STALE_SESSION_THRESHOLD_MS; private static readonly STALE_SESSION_MIN_STREAK; private wakeGatewayWsInFlight; private addSilentDirective; private dispatchEvent; /** * 将事件推入显示或后台队列。 * 用户可见事件与后台事件分开排队,避免长时间后台任务阻塞对用户的主动推送。 */ private enqueueQueuedEvent; /** * 串行处理用户可见事件,确保主动推送不被后台任务长期阻塞。 */ private drainVisibleEventQueue; /** * 串行处理后台事件,和用户可见事件分开调度。 */ private drainBackgroundEventQueue; /** * 处理单个事件: * enqueueSystemEvent → runHeartbeatOnce → await 完成 * * in-flight 重试:runHeartbeatOnce 返回 status=skipped/reason=requests-in-flight 时, * 说明 AI 正忙;这种 skipped 返回不消耗 AI turn,所以可以安全地轮询等 AI 空闲。 * visible 与 background 共享同一循环,但使用不同间隔数组: * - visible : [3,5,8,10,15,20]s 累计 61s,队头阻塞较短,配合用户可见推送 * - background : [5,10,20,40,60]s 累计 135s,配合 10min 判死窗口; * 135s 仍小于 180s 首次 retryDelay,避免与 retryDelays 兜底重叠 */ private static readonly INFLIGHT_RETRY_INTERVALS_VISIBLE; private static readonly INFLIGHT_RETRY_INTERVALS_BACKGROUND; private processQueuedEvent; /** * 从 sessions.json 重新检测活跃 session key,更新 settings。 */ private refreshActiveSessionKey; private wakeAiViaGatewayWs; private startHeartbeat; private stopHeartbeat; private clearPongTimer; private startConnectionCheck; private stopConnectionCheck; private scheduleReconnect; private cleanup; private setState; private handleAuthFailed; private startRefreshAndReconnect; private refreshAccessToken; private doRefreshAccessToken; private shouldRefresh; } export {};