@co0ontty/wand 4.72.2 → 4.75.0-beta.g1d477a2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +4 -4
- package/dist/claude-sdk-runner.d.ts +2 -3
- package/dist/config.d.ts +1 -1
- package/dist/config.js +48 -0
- package/dist/daemon-connection.d.ts +9 -0
- package/dist/daemon-connection.js +86 -0
- package/dist/distribution-manager.d.ts +5 -0
- package/dist/distribution-manager.js +79 -1
- package/dist/git-quick-commit.js +12 -0
- package/dist/message-truncator.js +9 -3
- package/dist/models.d.ts +39 -2
- package/dist/models.js +302 -9
- package/dist/native/darwin-arm64/wand-render +0 -0
- package/dist/native/darwin-arm64/wand-render.sha256 +1 -0
- package/dist/native/darwin-arm64/wand-render.version +1 -0
- package/dist/native/darwin-arm64/wand-structured-renderd +0 -0
- package/dist/native/darwin-arm64/wand-structured-renderd.sha256 +1 -0
- package/dist/native/darwin-arm64/wand-structured-renderd.version +1 -0
- package/dist/native/darwin-x64/wand-render +0 -0
- package/dist/native/darwin-x64/wand-render.sha256 +1 -0
- package/dist/native/darwin-x64/wand-render.version +1 -0
- package/dist/native/darwin-x64/wand-structured-renderd +0 -0
- package/dist/native/darwin-x64/wand-structured-renderd.sha256 +1 -0
- package/dist/native/darwin-x64/wand-structured-renderd.version +1 -0
- package/dist/native/linux-arm64/wand-render +0 -0
- package/dist/native/linux-arm64/wand-render.sha256 +1 -0
- package/dist/native/linux-arm64/wand-render.version +1 -0
- package/dist/native/linux-arm64/wand-structured-renderd +0 -0
- package/dist/native/linux-arm64/wand-structured-renderd.sha256 +1 -0
- package/dist/native/linux-arm64/wand-structured-renderd.version +1 -0
- package/dist/native/linux-x64/wand-render +0 -0
- package/dist/native/linux-x64/wand-render.sha256 +1 -0
- package/dist/native/linux-x64/wand-render.version +1 -0
- package/dist/native/linux-x64/wand-structured-renderd +0 -0
- package/dist/native/linux-x64/wand-structured-renderd.sha256 +1 -0
- package/dist/native/linux-x64/wand-structured-renderd.version +1 -0
- package/dist/process-manager.d.ts +12 -1
- package/dist/process-manager.js +88 -7
- package/dist/pty-terminal-state.d.ts +17 -0
- package/dist/pty-terminal-state.js +51 -1
- package/dist/render-binary.d.ts +61 -0
- package/dist/render-binary.js +204 -0
- package/dist/render-daemon-client.d.ts +202 -0
- package/dist/render-daemon-client.js +1164 -0
- package/dist/render-host.d.ts +88 -0
- package/dist/render-host.js +440 -0
- package/dist/render-protocol.d.ts +128 -0
- package/dist/render-protocol.js +99 -0
- package/dist/render-structured-client.d.ts +80 -0
- package/dist/render-structured-client.js +513 -0
- package/dist/render-structured-host.d.ts +31 -0
- package/dist/render-structured-host.js +218 -0
- package/dist/render-structured-protocol.d.ts +101 -0
- package/dist/render-structured-protocol.js +35 -0
- package/dist/server-session-routes.js +114 -12
- package/dist/server-task-routes.js +55 -6
- package/dist/server-update-routes.d.ts +2 -0
- package/dist/server-update-routes.js +44 -0
- package/dist/server.js +43 -13
- package/dist/session-ai-context.d.ts +1 -1
- package/dist/session-ai-context.js +15 -4
- package/dist/session-logger.d.ts +2 -0
- package/dist/session-logger.js +44 -1
- package/dist/session-transport.js +1 -1
- package/dist/storage.d.ts +2 -1
- package/dist/storage.js +14 -5
- package/dist/structured-client-protocol.d.ts +3 -1
- package/dist/structured-client-protocol.js +85 -25
- package/dist/structured-content.d.ts +20 -3
- package/dist/structured-content.js +80 -1
- package/dist/structured-exec-host.js +7 -1
- package/dist/structured-exec-pump.js +6 -2
- package/dist/structured-grok-adapter.js +22 -0
- package/dist/structured-pi-adapter.js +18 -2
- package/dist/structured-provider-common.d.ts +11 -9
- package/dist/structured-provider-common.js +60 -18
- package/dist/structured-session-manager.d.ts +2 -0
- package/dist/structured-session-manager.js +27 -3
- package/dist/task-types.d.ts +4 -1
- package/dist/terminal-daemon-client.d.ts +9 -2
- package/dist/terminal-daemon-client.js +119 -46
- package/dist/terminal-daemon-server.js +47 -8
- package/dist/terminal-host.d.ts +6 -0
- package/dist/terminal-host.js +3 -0
- package/dist/tui/commands.js +183 -10
- package/dist/tui/ipc-server.js +12 -0
- package/dist/types.d.ts +30 -10
- package/dist/unix-socket-keepalive.d.ts +3 -0
- package/dist/unix-socket-keepalive.js +94 -0
- package/dist/wand-task-sync.js +2 -1
- package/dist/web-ui/content/scripts.js +79 -73
- package/dist/web-ui/content/styles.css +1 -1
- package/dist/web-ui/content/tailwind.css +21 -0
- package/dist/web-ui/embedded-assets.js +2 -2
- package/dist/web-ui/thinking-efforts.d.ts +24 -0
- package/dist/web-ui/thinking-efforts.js +81 -0
- package/dist/ws-broadcast.d.ts +1 -1
- package/dist/ws-broadcast.js +28 -9
- package/package.json +8 -3
- package/scripts/install-render-binary.js +499 -0
- package/scripts/stage-render-binaries.js +626 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { type RenderMethod } from "./render-protocol.js";
|
|
2
|
+
import { type TerminalAttachResult, type TerminalHost, type TerminalSessionState, type TerminalSpawnRequest } from "./terminal-host.js";
|
|
3
|
+
/**
|
|
4
|
+
* 鉴权层面的失败(与网络抖动区分)。
|
|
5
|
+
*
|
|
6
|
+
* 特征:连接建立成功、hello 发出后对端**一个字节都没回**就关闭 —— Render 对
|
|
7
|
+
* token 不符/协议不符的处理就是直接 `close()`。单独一个类型是为了让重连策略
|
|
8
|
+
* 能把「同一把废 token」和「daemon 不在了」区分开,而不是一律 10s 重试。
|
|
9
|
+
*/
|
|
10
|
+
export declare class RenderAuthError extends Error {
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 远端 PTY 句柄。Render 可能在这个对象挂上 listener 之前就推来 data/exit
|
|
15
|
+
* (大输出场景几乎必然发生),所以先做有界缓存,挂上后按序补发。
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* 运行时自愈回调:把「端点已消失、且 config 上没有活着的 daemon」的 Render 重新拉起来。
|
|
19
|
+
* 返回 true 表示起了新进程(调用方应立刻重连)。
|
|
20
|
+
*/
|
|
21
|
+
export type RenderDaemonReviver = () => Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Render(常驻 PTY 持有者)的 Node 客户端。
|
|
24
|
+
*
|
|
25
|
+
* 与 legacy `TerminalDaemonClient` 的关键差异:**这里只有 PTY**,没有结构化运行;
|
|
26
|
+
* 另外 `disconnect()` 只解绑 socket,Render 进程与其 PTY 全部保留 —— 这正是
|
|
27
|
+
* Server 因 `npm update` 重启而 PTY 不丢的前提。
|
|
28
|
+
*/
|
|
29
|
+
export declare class RenderDaemonClient implements TerminalHost {
|
|
30
|
+
private readonly socketPath;
|
|
31
|
+
private readonly token;
|
|
32
|
+
/**
|
|
33
|
+
* token 文件路径。给了它就在**每次 connect 时重读**:Render 崩溃/升级重启后
|
|
34
|
+
* 会 `generate_token()` 轮换 token,只缓存构造期的那一把会让重连永远鉴权失败
|
|
35
|
+
* (现象是 `createOrAttach` 全部失败、错误只显示 unavailable,旧会话被永久报成 running)。
|
|
36
|
+
*/
|
|
37
|
+
private readonly tokenPath;
|
|
38
|
+
/** Persisted PTY IDs used only if v1 `list` exceeds its aggregate frame limit. */
|
|
39
|
+
private readonly knownSessionIds;
|
|
40
|
+
/**
|
|
41
|
+
* 运行时自愈回调:重连失败时问它能不能把 daemon 拉回来(返回 true = 起了新进程)。
|
|
42
|
+
* 只有「端点已消失 + config 上没有活着的 daemon」时它才动手,见 `render-host.ts`。
|
|
43
|
+
*/
|
|
44
|
+
private readonly reviveDaemon;
|
|
45
|
+
readonly persistent = true;
|
|
46
|
+
private socket;
|
|
47
|
+
private nextRequestId;
|
|
48
|
+
private readonly pending;
|
|
49
|
+
private readonly inventory;
|
|
50
|
+
private readonly handles;
|
|
51
|
+
private readonly pendingEvents;
|
|
52
|
+
private readonly pendingEventOverflows;
|
|
53
|
+
private readonly refreshingSessions;
|
|
54
|
+
private reconciling;
|
|
55
|
+
private eventsDuringReconcile;
|
|
56
|
+
private reconcileDuringSync;
|
|
57
|
+
private headerParts;
|
|
58
|
+
private headerBytes;
|
|
59
|
+
private bodyParts;
|
|
60
|
+
private bodyBytes;
|
|
61
|
+
private frameLength;
|
|
62
|
+
private disposed;
|
|
63
|
+
private reconnectTimer;
|
|
64
|
+
private reconnectDelayMs;
|
|
65
|
+
private reconnectFailureLogged;
|
|
66
|
+
private offlineOperationLogged;
|
|
67
|
+
/** 协议版本不匹配是终态:重试无意义,也不允许降级运行。 */
|
|
68
|
+
private fatalProtocolError;
|
|
69
|
+
private daemonVersion;
|
|
70
|
+
/** 最近一次 connect 时实际使用的凭据。 */
|
|
71
|
+
private activeToken;
|
|
72
|
+
/** 最后一次成功读到的凭据;token 文件暂时读不到时用它,避免重连因一次 IO 失败直接放弃。 */
|
|
73
|
+
private lastKnownToken;
|
|
74
|
+
/** 已经因为「读不到 token 文件」告警过,避免每次重连都刷一行。 */
|
|
75
|
+
private tokenReadFailureLogged;
|
|
76
|
+
/** 当前 socket 上已解出的帧数,用来区分「未鉴权被直接关闭」与网络错误。 */
|
|
77
|
+
private framesOnCurrentSocket;
|
|
78
|
+
private connecting;
|
|
79
|
+
private stopHeartbeat;
|
|
80
|
+
constructor(socketPath: string, token: string,
|
|
81
|
+
/**
|
|
82
|
+
* token 文件路径。给了它就在**每次 connect 时重读**:Render 崩溃/升级重启后
|
|
83
|
+
* 会 `generate_token()` 轮换 token,只缓存构造期的那一把会让重连永远鉴权失败
|
|
84
|
+
* (现象是 `createOrAttach` 全部失败、错误只显示 unavailable,旧会话被永久报成 running)。
|
|
85
|
+
*/
|
|
86
|
+
tokenPath?: string | null,
|
|
87
|
+
/** Persisted PTY IDs used only if v1 `list` exceeds its aggregate frame limit. */
|
|
88
|
+
knownSessionIds?: readonly string[],
|
|
89
|
+
/**
|
|
90
|
+
* 运行时自愈回调:重连失败时问它能不能把 daemon 拉回来(返回 true = 起了新进程)。
|
|
91
|
+
* 只有「端点已消失 + config 上没有活着的 daemon」时它才动手,见 `render-host.ts`。
|
|
92
|
+
*/
|
|
93
|
+
reviveDaemon?: RenderDaemonReviver | null);
|
|
94
|
+
get version(): string;
|
|
95
|
+
/** daemon 侧已知的会话数(`inventory` 是 `list`/`attach` 的权威投影)。 */
|
|
96
|
+
get sessionCount(): number;
|
|
97
|
+
/**
|
|
98
|
+
* 让 daemon 干净收摊(`shutdown mode=now`:杀掉所有 PTY 后退出)。
|
|
99
|
+
* **只允许用在「daemon 空闲」的升级场景**(sessionCount === 0);持有活会话时
|
|
100
|
+
* 调用它会杀掉用户的 shell。
|
|
101
|
+
*/
|
|
102
|
+
requestShutdownNow(): Promise<void>;
|
|
103
|
+
connect(): Promise<void>;
|
|
104
|
+
private open;
|
|
105
|
+
/**
|
|
106
|
+
* 对端一个字节都没回就断开:daemon 对 token/协议不符的处理是直接 `close()`
|
|
107
|
+
* (`wand-renderd` 的 `server.rs`),所以这是鉴权/版本问题的特征,不是网络抖动。
|
|
108
|
+
* 归类为 `RenderAuthError`,由重连策略决定「别再 10s 一次拿同一把废 token 试」。
|
|
109
|
+
*/
|
|
110
|
+
private describeConnectFailure;
|
|
111
|
+
/**
|
|
112
|
+
* 读取当前凭据:每次都用 token 文件里的**最新**值(daemon 重启会轮换)。
|
|
113
|
+
* 文件暂时读不到(渲染器正在退出、路径还没建)不是致命错误,回落到上一次成功
|
|
114
|
+
* 读到的值并告警一次;下一次连接会重试读文件。
|
|
115
|
+
*/
|
|
116
|
+
private readToken;
|
|
117
|
+
private warnTokenFileUnusable;
|
|
118
|
+
/** resize 走的是异步 RPC,但 inventory 必须立刻反映新尺寸(见 RemoteRenderProcess.resize)。 */
|
|
119
|
+
noteTerminalResize(sessionId: string, cols: number, rows: number): void;
|
|
120
|
+
attach(sessionId: string, afterSeq?: number): TerminalAttachResult | null;
|
|
121
|
+
createOrAttach(request: TerminalSpawnRequest, afterSeq?: number): Promise<TerminalAttachResult>;
|
|
122
|
+
forget(sessionId: string): void;
|
|
123
|
+
/**
|
|
124
|
+
* 只解绑:关闭 socket、清掉内存句柄,**Render 进程与它的所有 PTY 都保持运行**。
|
|
125
|
+
* 这是 Server / Render 分离的核心 —— 下一次启动 attach 回来仍拿到同一批会话。
|
|
126
|
+
*/
|
|
127
|
+
disconnect(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Best-effort 操作:Render 不可用时打 stderr,绝不把异常抛回调用方,
|
|
130
|
+
* 否则一次 PTY 抖动会顺着 ProcessManager 把整个会话路径打断。
|
|
131
|
+
*/
|
|
132
|
+
fireOperation(sessionId: string, method: RenderMethod, params?: Record<string, unknown>): void;
|
|
133
|
+
confirmWrite(sessionId: string, data: string): Promise<void>;
|
|
134
|
+
reportOperationError(sessionId: string, method: RenderMethod, error: unknown): void;
|
|
135
|
+
private listSessions;
|
|
136
|
+
/** `list` locates sessions; each `attach` is the authoritative recovery state. */
|
|
137
|
+
private loadAuthoritativeSessions;
|
|
138
|
+
private parseHello;
|
|
139
|
+
private request;
|
|
140
|
+
private consume;
|
|
141
|
+
private resetFrameDecoder;
|
|
142
|
+
private handleFrame;
|
|
143
|
+
private handleResponse;
|
|
144
|
+
private routeEvent;
|
|
145
|
+
private queuePendingEvent;
|
|
146
|
+
/** Repair a bounded event-buffer overflow without replaying a partial stream. */
|
|
147
|
+
private refreshSession;
|
|
148
|
+
/**
|
|
149
|
+
* Render 主动告知当前会话集合(例如自身清掉了已 forget 的会话)。不在
|
|
150
|
+
* 集合里的会话要给既有句柄补一个退出事件,否则 ProcessManager 会永远停在 running。
|
|
151
|
+
*/
|
|
152
|
+
private handleReconcileEvent;
|
|
153
|
+
/**
|
|
154
|
+
* Socket 断开后的重连。不做重连的话,Render 重启一次所有
|
|
155
|
+
* RemoteRenderProcess 就会静默失效,而 ProcessManager 仍显示 running。
|
|
156
|
+
*/
|
|
157
|
+
private handleDisconnect;
|
|
158
|
+
/** 被同一个凭据反复拒绝时置位:下一次重连改用长退避(见 `scheduleReconnect`)。 */
|
|
159
|
+
private authBackoff;
|
|
160
|
+
/**
|
|
161
|
+
* 安排下一次重连(已有定时器时不重排:一次失败可能会从 close/error 两条路径
|
|
162
|
+
* 各调一次,重排会把退避倍率叠成指数增长)。需要**覆盖**已有定时器的场景
|
|
163
|
+
* (鉴权失败要把 10s 换成 60s)由调用方显式清掉再调。
|
|
164
|
+
*/
|
|
165
|
+
private scheduleReconnect;
|
|
166
|
+
private tryReconnect;
|
|
167
|
+
private noteReconnectSuccess;
|
|
168
|
+
/** 自愈回调本身绝不能让重连路径抛错;失败按「没拉起」处理。 */
|
|
169
|
+
private reviveDaemonForRetry;
|
|
170
|
+
private noteReconnectFailureAndSchedule;
|
|
171
|
+
/**
|
|
172
|
+
* 重连失败的日志与「同一把废 token」判定。
|
|
173
|
+
*
|
|
174
|
+
* 判定依据:刚刚用掉的那把凭据(`activeToken`,每次连接开头从 token 文件重读)
|
|
175
|
+
* 与文件里**现在**这一把相同 → 再试同一个值不可能成功(对端持有的是别的 token,
|
|
176
|
+
* 多来自 `-c` 指到了另一个 config 或有人在手工改 token 文件),摆成 60s 长退避。
|
|
177
|
+
* 文件已经变了就按普通退避重试 —— 那正是 daemon 重启轮换 token 后的自愈路径。
|
|
178
|
+
* @returns 是否处于「同一把废凭据」状态(调用方据此换长退避)
|
|
179
|
+
*/
|
|
180
|
+
private noteReconnectFailure;
|
|
181
|
+
/** 只读 token 文件当前值(不改状态);读不到返回 null。 */
|
|
182
|
+
private currentTokenFileValue;
|
|
183
|
+
/**
|
|
184
|
+
* 断线期间 Render 可能新建/结束会话。用断线前的 inventory 与新的 `list` 对账:
|
|
185
|
+
* 活着的补发缺口 chunk;消失或已退出的给句柄补合成退出。
|
|
186
|
+
*/
|
|
187
|
+
private reconcileAfterReconnect;
|
|
188
|
+
private resultFromState;
|
|
189
|
+
private rejectPending;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 运行期校验 Render 的 SessionState。
|
|
193
|
+
*
|
|
194
|
+
* 协议是跨语言契约(Rust 侧字段名漂移过一次就是静默的空终端),所以这里不做
|
|
195
|
+
* 结构断言直接使用,而是逐字段检查:能修的补默认值,修不了的整条丢弃并打警告。
|
|
196
|
+
*/
|
|
197
|
+
export declare function normalizeRenderSessionState(value: unknown): TerminalSessionState | null;
|
|
198
|
+
/**
|
|
199
|
+
* 连接一个已经存在的 Render(socket + token 都在)。**不 spawn**,找不到就返回 null,
|
|
200
|
+
* 这样调用方可以区分「已被别处 adopt」和「需要自己拉起」。
|
|
201
|
+
*/
|
|
202
|
+
export declare function connectExistingRenderClient(configPath: string, knownSessionIds?: readonly string[], reviveDaemon?: RenderDaemonReviver | null): Promise<RenderDaemonClient | null>;
|