@winmatrix/daemon 1.0.4 → 1.0.6

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.
Files changed (46) hide show
  1. package/bin/winmatrix-daemon.js +3 -1
  2. package/dist/core/AgentProcessManager.d.ts +111 -0
  3. package/dist/core/AgentProcessManager.d.ts.map +1 -0
  4. package/dist/core/AgentProcessManager.js +702 -0
  5. package/dist/core/AgentProcessManager.js.map +1 -0
  6. package/dist/core/ConfigLoader.d.ts +110 -0
  7. package/dist/core/ConfigLoader.d.ts.map +1 -0
  8. package/dist/core/ConfigLoader.js +296 -0
  9. package/dist/core/ConfigLoader.js.map +1 -0
  10. package/dist/core/DaemonClient.d.ts +102 -0
  11. package/dist/core/DaemonClient.d.ts.map +1 -0
  12. package/dist/core/DaemonClient.js +225 -0
  13. package/dist/core/DaemonClient.js.map +1 -0
  14. package/dist/core/DaemonFileLogger.d.ts +34 -0
  15. package/dist/core/DaemonFileLogger.d.ts.map +1 -0
  16. package/dist/core/DaemonFileLogger.js +192 -0
  17. package/dist/core/DaemonFileLogger.js.map +1 -0
  18. package/dist/core/DaemonLifecycle.d.ts +22 -0
  19. package/dist/core/DaemonLifecycle.d.ts.map +1 -0
  20. package/dist/core/DaemonLifecycle.js +157 -0
  21. package/dist/core/DaemonLifecycle.js.map +1 -0
  22. package/dist/core/DiagnosticsServer.d.ts +28 -0
  23. package/dist/core/DiagnosticsServer.d.ts.map +1 -0
  24. package/dist/core/DiagnosticsServer.js +155 -0
  25. package/dist/core/DiagnosticsServer.js.map +1 -0
  26. package/dist/core/InstallationId.d.ts +14 -0
  27. package/dist/core/InstallationId.d.ts.map +1 -0
  28. package/dist/core/InstallationId.js +50 -0
  29. package/dist/core/InstallationId.js.map +1 -0
  30. package/dist/core/RuntimeDoctor.d.ts +13 -0
  31. package/dist/core/RuntimeDoctor.d.ts.map +1 -0
  32. package/dist/core/RuntimeDoctor.js +86 -0
  33. package/dist/core/RuntimeDoctor.js.map +1 -0
  34. package/dist/core/WinMatrixAgentClient.d.ts +199 -0
  35. package/dist/core/WinMatrixAgentClient.d.ts.map +1 -0
  36. package/dist/core/WinMatrixAgentClient.js +569 -0
  37. package/dist/core/WinMatrixAgentClient.js.map +1 -0
  38. package/dist/core/WorkspaceScanner.d.ts +45 -0
  39. package/dist/core/WorkspaceScanner.d.ts.map +1 -0
  40. package/dist/core/WorkspaceScanner.js +170 -0
  41. package/dist/core/WorkspaceScanner.js.map +1 -0
  42. package/dist/index.d.ts +16 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +264 -0
  45. package/dist/index.js.map +1 -0
  46. package/package.json +3 -3
@@ -0,0 +1,569 @@
1
+ /**
2
+ * WinMatrix Agent SDK - Client
3
+ *
4
+ * Main client class for connecting external agents to the WinMatrix platform.
5
+ * Handles WebSocket connection, registration, heartbeat, task lifecycle, and tool calls.
6
+ */
7
+ import WebSocket from 'ws';
8
+ import { createRequest, createEvent, nextRequestId, parseFrame, isResponse, isEvent, isRequest, METHODS, EVENTS, } from '@winmatrix/protocol';
9
+ /**
10
+ * 将 canonical EngineLaunchSpec + sensitive envelope 映射回 TaskInput,
11
+ * 供 daemon 侧 adapter.execute() 消费(保持 adapter 契约不变)。
12
+ *
13
+ * 安全:mcpCapabilityToken 直接映射为 mcpToken;本函数不记录任何 secret 字段值。
14
+ */
15
+ export function launchSpecToTaskInput(spec, opts) {
16
+ // 结构化 input.blocks 文本拼接(文本块连接;非文本块降级为 JSON 占位)
17
+ const textParts = [];
18
+ for (const block of spec.input.blocks) {
19
+ if (block.kind === 'text') {
20
+ textParts.push(block.text);
21
+ }
22
+ else if (block.kind === 'image_ref') {
23
+ textParts.push(`[image: ${block.artifactRef}]`);
24
+ }
25
+ else if (block.kind === 'file_ref') {
26
+ textParts.push(`[file: ${block.artifactRef}]`);
27
+ }
28
+ else if (block.kind === 'resource_ref') {
29
+ textParts.push(`[resource: ${block.uri}]`);
30
+ }
31
+ }
32
+ const input = textParts.join('\n');
33
+ // session binding → sessionId / resumeSession
34
+ let sessionId;
35
+ let resumeSession;
36
+ if (spec.session.mode === 'resume' || spec.session.mode === 'fork') {
37
+ sessionId = spec.session.session.sessionId;
38
+ resumeSession = spec.session.mode === 'resume';
39
+ }
40
+ // engineOptions 映射为 adapter 专用 options
41
+ const engineOptions = spec.engineOptions?.values ?? {};
42
+ const claude = spec.engineId === 'claude-code'
43
+ ? {
44
+ ...(spec.permissionMode !== undefined ? { permissionMode: spec.permissionMode } : {}),
45
+ ...(spec.allowedTools !== undefined ? { tools: spec.allowedTools } : {}),
46
+ ...(spec.systemPrompt !== undefined ? { systemPrompt: spec.systemPrompt } : {}),
47
+ ...(engineOptions.maxBudgetUsd !== undefined
48
+ ? { maxBudgetUsd: Number(engineOptions.maxBudgetUsd) }
49
+ : {}),
50
+ ...(engineOptions.maxTurns !== undefined
51
+ ? { maxTurns: Number(engineOptions.maxTurns) }
52
+ : {}),
53
+ ...(engineOptions.useAgentSdk !== undefined
54
+ ? { useAgentSdk: Boolean(engineOptions.useAgentSdk) }
55
+ : {}),
56
+ }
57
+ : undefined;
58
+ const hermes = spec.engineId === 'hermes'
59
+ ? {
60
+ ...(spec.model?.modelId ? { model: spec.model.modelId } : {}),
61
+ ...(engineOptions.provider !== undefined
62
+ ? { provider: String(engineOptions.provider) }
63
+ : {}),
64
+ ...(engineOptions.toolsets !== undefined
65
+ ? {
66
+ toolsets: Array.isArray(engineOptions.toolsets)
67
+ ? engineOptions.toolsets.map(String)
68
+ : String(engineOptions.toolsets).split(','),
69
+ }
70
+ : {}),
71
+ }
72
+ : undefined;
73
+ const openclaw = spec.engineId === 'openclaw'
74
+ ? {
75
+ ...(engineOptions.gatewayHost !== undefined
76
+ ? { gatewayHost: String(engineOptions.gatewayHost) }
77
+ : {}),
78
+ ...(engineOptions.gatewayPort !== undefined
79
+ ? { gatewayPort: Number(engineOptions.gatewayPort) }
80
+ : {}),
81
+ }
82
+ : undefined;
83
+ return {
84
+ taskId: opts.taskId,
85
+ input,
86
+ // V2 信封无 TaskContext;旧路径 context 缺失时给空对象占位以维持类型
87
+ context: opts.legacy?.context ?? {},
88
+ streaming: opts.legacy?.streaming ?? false,
89
+ ...(spec.systemPrompt !== undefined ? { systemPrompt: spec.systemPrompt } : {}),
90
+ ...(spec.workDir !== undefined ? { workDir: spec.workDir } : {}),
91
+ // secretBindings.mcpCapabilityToken → mcpToken(兼容旧 adapter 字段)
92
+ ...(opts.secretBindings?.mcpCapabilityToken
93
+ ? { mcpToken: opts.secretBindings.mcpCapabilityToken }
94
+ : opts.legacy?.mcpToken !== undefined
95
+ ? { mcpToken: opts.legacy.mcpToken }
96
+ : {}),
97
+ ...(sessionId !== undefined ? { sessionId } : {}),
98
+ ...(resumeSession !== undefined ? { resumeSession } : {}),
99
+ ...(opts.runKey !== undefined ? { runKey: opts.runKey } : {}),
100
+ ...(opts.invocationFingerprint !== undefined
101
+ ? { invocationFingerprint: opts.invocationFingerprint }
102
+ : {}),
103
+ launchSpec: spec,
104
+ // 非敏感 env 透传给 adapter
105
+ env: spec.nonSensitiveEnv,
106
+ contextBudget: spec.contextBudget,
107
+ ...(claude ? { claude } : {}),
108
+ ...(hermes ? { hermes } : {}),
109
+ ...(openclaw ? { openclaw } : {}),
110
+ };
111
+ }
112
+ /* ── Client ── */
113
+ export class WinMatrixAgentClient {
114
+ options;
115
+ ws = null;
116
+ state = 'disconnected';
117
+ heartbeatTimer = null;
118
+ reconnectTimer = null;
119
+ reconnectDelay = 1000;
120
+ maxReconnectDelay = 60000;
121
+ pendingRequests = new Map();
122
+ requestTimeout = 30000;
123
+ disconnectHistory = [];
124
+ // Event handlers
125
+ taskHandler = null;
126
+ resumeHandler = null;
127
+ disconnectHandler = null;
128
+ errorHandler = null;
129
+ registeredHandler = null;
130
+ // Server-assigned config
131
+ serverConfig = null;
132
+ constructor(options) {
133
+ this.options = options;
134
+ }
135
+ /** Current lifecycle state */
136
+ getState() {
137
+ return this.state;
138
+ }
139
+ /** Set or replace the session query handler after construction */
140
+ setSessionQueryHandler(handler) {
141
+ this.options.sessionQueryHandler = handler;
142
+ }
143
+ /** Register an event handler */
144
+ on(event, handler) {
145
+ if (event === 'task') {
146
+ this.taskHandler = handler;
147
+ }
148
+ else if (event === 'resume') {
149
+ this.resumeHandler = handler;
150
+ }
151
+ else if (event === 'disconnect') {
152
+ this.disconnectHandler = handler;
153
+ }
154
+ else if (event === 'error') {
155
+ this.errorHandler = handler;
156
+ }
157
+ else if (event === 'registered') {
158
+ this.registeredHandler = handler;
159
+ }
160
+ }
161
+ /** Open connection and register with the server */
162
+ async connect() {
163
+ if (this.state !== 'disconnected') {
164
+ throw new Error(`Cannot connect from state '${this.state}'`);
165
+ }
166
+ this.setState('connecting');
167
+ try {
168
+ await this.establishConnection();
169
+ await this.register();
170
+ this.startHeartbeat();
171
+ this.reconnectDelay = 1000;
172
+ this.disconnectHistory = [];
173
+ this.setState('registered');
174
+ }
175
+ catch (err) {
176
+ this.cleanup();
177
+ this.setState('disconnected');
178
+ if (this.options.autoReconnect) {
179
+ this.scheduleReconnect();
180
+ }
181
+ throw err;
182
+ }
183
+ }
184
+ /** Gracefully disconnect */
185
+ disconnect() {
186
+ this.cleanup();
187
+ this.setState('disconnected');
188
+ }
189
+ /**
190
+ * 向 WinMatrix 上报本地 Hermes/OpenClaw HTTP(或命令模式)运行时可用性快照。
191
+ * 一般由 bridge 周期性调用;需在 `registered` 状态下发送。
192
+ */
193
+ notifyRuntimeAvailability(payload) {
194
+ if (this.state !== 'registered')
195
+ return;
196
+ try {
197
+ this.sendEvent(EVENTS.RUNTIME_AVAILABILITY, payload);
198
+ }
199
+ catch {
200
+ /* 发送瞬时竞态时忽略 */
201
+ }
202
+ }
203
+ /** Send a streaming delta for an active task */
204
+ streamDelta(taskId, content, meta, engineEvent) {
205
+ this.sendEvent(EVENTS.TASK_DELTA, {
206
+ taskId,
207
+ content,
208
+ ...(meta ? { meta } : {}),
209
+ ...(engineEvent ? { engineEvent } : {}),
210
+ });
211
+ }
212
+ /** Mark a task as completed with a result. sessionId and usage are passed at top level for server-side DB persistence. */
213
+ completeTask(taskId, result, sessionId, usage) {
214
+ try {
215
+ this.options.bridgeHooks?.onTaskCompleted?.(taskId, result);
216
+ }
217
+ catch (e) {
218
+ const msg = e instanceof Error ? e.message : String(e);
219
+ console.warn(`[WinMatrixAgentClient] bridgeHooks.onTaskCompleted failed: ${msg}`);
220
+ }
221
+ this.sendEvent(EVENTS.TASK_COMPLETE, { taskId, result, sessionId, usage });
222
+ }
223
+ /** Mark a task as failed with an error message */
224
+ failTask(taskId, error, code) {
225
+ try {
226
+ this.options.bridgeHooks?.onTaskFailed?.(taskId, error, code);
227
+ }
228
+ catch (e) {
229
+ const msg = e instanceof Error ? e.message : String(e);
230
+ console.warn(`[WinMatrixAgentClient] bridgeHooks.onTaskFailed failed: ${msg}`);
231
+ }
232
+ const payload = { taskId, error };
233
+ if (code)
234
+ payload.code = code;
235
+ this.sendEvent(EVENTS.TASK_ERROR, payload);
236
+ }
237
+ /** Call a WinMatrix tool and wait for the result */
238
+ async callTool(toolName, args, taskId, agentId) {
239
+ const callId = nextRequestId();
240
+ const params = { callId, toolName, args };
241
+ if (taskId)
242
+ params.taskId = taskId;
243
+ if (agentId)
244
+ params.agentId = agentId;
245
+ const response = await this.sendRequest(METHODS.TOOL_CALL, params);
246
+ if (!response.ok) {
247
+ throw new Error(response.error ?? 'Tool call failed');
248
+ }
249
+ const payload = response.payload;
250
+ return payload && typeof payload === 'object' && 'result' in payload ? payload.result : response.payload;
251
+ }
252
+ /**
253
+ * Send an arbitrary frame to the server.
254
+ * Wraps the low-level sendRaw, keeping the WS write path encapsulated.
255
+ */
256
+ sendFrame(frame) {
257
+ this.sendRaw(frame);
258
+ }
259
+ /* ── Protected: Connection (overridable by DaemonClient) ── */
260
+ establishConnection() {
261
+ return new Promise((resolve, reject) => {
262
+ const ws = new WebSocket(this.options.url);
263
+ this.ws = ws;
264
+ ws.on('open', () => {
265
+ if (this.ws !== ws)
266
+ return;
267
+ this.setState('connected');
268
+ resolve();
269
+ });
270
+ ws.on('error', (err) => {
271
+ if (this.ws !== ws)
272
+ return;
273
+ const detail = err?.message?.trim()
274
+ ? err.message
275
+ : String(err.code ?? err);
276
+ reject(new Error(`WebSocket failed for ${this.options.url}: ${detail || 'unknown'}`, {
277
+ cause: err,
278
+ }));
279
+ });
280
+ ws.on('close', () => {
281
+ this.handleDisconnect(ws);
282
+ });
283
+ ws.on('message', (data) => {
284
+ if (this.ws !== ws)
285
+ return;
286
+ this.handleMessage(data);
287
+ });
288
+ });
289
+ }
290
+ async register() {
291
+ const params = {
292
+ agentId: this.options.agentId,
293
+ apiKey: this.options.apiKey,
294
+ name: this.options.name,
295
+ agentType: this.options.agentType,
296
+ capabilities: this.options.capabilities,
297
+ };
298
+ const response = await this.sendRequest(METHODS.REGISTER, params);
299
+ if (!response.ok) {
300
+ throw new Error(`Registration failed: ${response.error ?? 'unknown error'}`);
301
+ }
302
+ this.serverConfig = response.payload;
303
+ }
304
+ /* ── Protected: Messaging (overridable by DaemonClient) ── */
305
+ sendRequest(method, params) {
306
+ return new Promise((resolve, reject) => {
307
+ const id = nextRequestId();
308
+ const frame = createRequest(id, method, params);
309
+ const timer = setTimeout(() => {
310
+ this.pendingRequests.delete(id);
311
+ reject(new Error(`Request ${id} (${method}) timed out`));
312
+ }, this.requestTimeout);
313
+ this.pendingRequests.set(id, { resolve, reject, timer });
314
+ this.sendRaw(frame);
315
+ });
316
+ }
317
+ sendEvent(event, payload) {
318
+ const frame = createEvent(event, payload);
319
+ this.sendRaw(frame);
320
+ }
321
+ sendRaw(data) {
322
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
323
+ console.warn('[WinMatrixAgentClient] WebSocket not connected, dropping frame');
324
+ return;
325
+ }
326
+ this.ws.send(JSON.stringify(data));
327
+ }
328
+ handleMessage(data) {
329
+ const raw = typeof data === 'string' ? data : data.toString('utf-8');
330
+ const frame = parseFrame(raw);
331
+ if (!frame)
332
+ return;
333
+ if (isResponse(frame)) {
334
+ this.handleResponse(frame);
335
+ }
336
+ else if (isEvent(frame)) {
337
+ this.handleEventFrame(frame);
338
+ }
339
+ else if (isRequest(frame)) {
340
+ this.handleIncomingRequest(frame);
341
+ }
342
+ }
343
+ /**
344
+ * 处理服务端发来的请求帧(如 task.assign)
345
+ *
346
+ * 服务端通过 waitForResponse 发送 { type: 'req', method: 'task.assign', params } 帧,
347
+ * SDK 需要回复 { type: 'res', id, ok: true } 确认收到,然后异步处理任务。
348
+ */
349
+ handleIncomingRequest(frame) {
350
+ if (frame.method === METHODS.TASK_ASSIGN && this.taskHandler) {
351
+ // 立即回复确认
352
+ const admission = this.options.taskAssignAdmission?.(frame.params) ?? { ok: true };
353
+ if (!admission.ok) {
354
+ this.sendRaw({ type: 'res', id: frame.id, ok: false, error: admission.error });
355
+ return;
356
+ }
357
+ this.sendRaw({
358
+ type: 'res',
359
+ id: frame.id,
360
+ ok: true,
361
+ payload: { disposition: admission.disposition ?? 'accepted' },
362
+ });
363
+ if (admission.disposition === 'existing')
364
+ return;
365
+ const params = frame.params;
366
+ // 新版统一信封(design D11.1):存在 launchSpec 字段即为 V2,
367
+ // 从 canonical LaunchSpec + sensitive envelope 重建 TaskInput。
368
+ const taskPayload = params.launchSpec
369
+ ? launchSpecToTaskInput(params.launchSpec, {
370
+ taskId: params.taskId,
371
+ runKey: params.runKey,
372
+ invocationFingerprint: params.invocationFingerprint,
373
+ secretBindings: params.secretBindings,
374
+ legacy: {
375
+ context: params.context,
376
+ streaming: params.streaming,
377
+ mcpToken: params.mcpToken,
378
+ },
379
+ })
380
+ : {
381
+ taskId: params.taskId,
382
+ input: params.input,
383
+ context: params.context,
384
+ streaming: params.streaming,
385
+ systemPrompt: params.systemPrompt,
386
+ mcpToken: params.mcpToken,
387
+ sessionId: params.sessionId,
388
+ resumeSession: params.resumeSession,
389
+ };
390
+ this.options.bridgeHooks?.onTaskAssigned?.(taskPayload);
391
+ try {
392
+ const result = this.taskHandler(taskPayload);
393
+ if (result instanceof Promise) {
394
+ result.catch((err) => {
395
+ const msg = err instanceof Error ? err.message : String(err);
396
+ this.failTask(params.taskId, `Task handler error: ${msg}`);
397
+ });
398
+ }
399
+ }
400
+ catch (err) {
401
+ const msg = err instanceof Error ? err.message : String(err);
402
+ this.failTask(params.taskId, `Task handler error: ${msg}`);
403
+ }
404
+ }
405
+ else if ((frame.method === METHODS.SESSION_LIST ||
406
+ frame.method === METHODS.SESSION_GET ||
407
+ frame.method === METHODS.SESSION_SEARCH ||
408
+ frame.method === METHODS.SESSION_DELETE) &&
409
+ this.options.sessionQueryHandler) {
410
+ this.options
411
+ .sessionQueryHandler(frame.method, frame.params)
412
+ .then((result) => {
413
+ this.sendRaw({ type: 'res', id: frame.id, ok: true, payload: result });
414
+ })
415
+ .catch((err) => {
416
+ const msg = err instanceof Error ? err.message : String(err);
417
+ this.sendRaw({ type: 'res', id: frame.id, ok: false, error: msg });
418
+ });
419
+ }
420
+ else if ((frame.method === METHODS.TASK_EVENTS_SUBSCRIBE ||
421
+ frame.method === METHODS.TASK_INSPECT ||
422
+ frame.method === METHODS.TASK_INTERACTION_RESPOND ||
423
+ frame.method === METHODS.TASK_CANCEL_RUN ||
424
+ frame.method === METHODS.TASK_ACTIVE_LIST ||
425
+ frame.method === METHODS.AGENT_ENGINE_LIST ||
426
+ frame.method === METHODS.AGENT_ENGINE_MODELS ||
427
+ frame.method === METHODS.AGENT_ENGINE_OPTIONS ||
428
+ frame.method === METHODS.AGENT_ENGINE_PROBE) &&
429
+ this.options.agentEngineRequestHandler) {
430
+ this.options
431
+ .agentEngineRequestHandler(frame.method, frame.params)
432
+ .then((result) => {
433
+ this.sendRaw({ type: 'res', id: frame.id, ok: true, payload: result });
434
+ })
435
+ .catch((err) => {
436
+ const msg = err instanceof Error ? err.message : String(err);
437
+ this.sendRaw({ type: 'res', id: frame.id, ok: false, error: msg });
438
+ });
439
+ }
440
+ else if (frame.method === METHODS.PING) {
441
+ // 服务端 ping,回复 pong
442
+ this.sendRaw({ type: 'res', id: frame.id, ok: true });
443
+ }
444
+ else {
445
+ // 未知请求,回复错误
446
+ this.sendRaw({ type: 'res', id: frame.id, ok: false, error: `Unknown method: ${frame.method}` });
447
+ }
448
+ }
449
+ handleResponse(frame) {
450
+ const pending = this.pendingRequests.get(frame.id);
451
+ if (!pending)
452
+ return;
453
+ clearTimeout(pending.timer);
454
+ this.pendingRequests.delete(frame.id);
455
+ pending.resolve(frame);
456
+ }
457
+ handleEventFrame(frame) {
458
+ if (frame.event === EVENTS.TASK_RESUME) {
459
+ const payload = frame.payload;
460
+ if (payload?.taskId) {
461
+ this.resumeHandler?.({ taskId: payload.taskId, text: payload.text });
462
+ }
463
+ }
464
+ // task.cancel 事件分支已删除(harden-external-computer-daemon P0):
465
+ // 旧实现无条件回 task.cancelled 假 ACK、进程照跑;真实取消走
466
+ // task.cancelRun 请求(agentEngineRequestHandler → TASK_CANCEL_RUN)。
467
+ }
468
+ /* ── Protected: Lifecycle ── */
469
+ setState(state) {
470
+ const prev = this.state;
471
+ this.state = state;
472
+ if (state === 'registered' && state !== prev) {
473
+ this.registeredHandler?.();
474
+ }
475
+ }
476
+ startHeartbeat() {
477
+ const interval = this.serverConfig?.config.heartbeatInterval ?? 30000;
478
+ this.heartbeatTimer = setInterval(() => {
479
+ if (this.ws?.readyState === WebSocket.OPEN) {
480
+ this.sendRequest(METHODS.PING).catch((err) => {
481
+ const msg = err instanceof Error ? err.message : String(err);
482
+ this.errorHandler?.(new Error(`Heartbeat failed: ${msg}`));
483
+ });
484
+ }
485
+ }, interval);
486
+ }
487
+ handleDisconnect(socket = this.ws) {
488
+ if (socket && this.ws && socket !== this.ws) {
489
+ this.cleanupSocket(socket);
490
+ return;
491
+ }
492
+ this.cleanup(socket ?? undefined);
493
+ this.setState('disconnected');
494
+ // Rapid disconnect detection: 3 disconnects within 5s → back off to max delay.
495
+ const now = Date.now();
496
+ this.disconnectHistory.push(now);
497
+ this.disconnectHistory = this.disconnectHistory.filter((ts) => now - ts <= 5000);
498
+ if (this.disconnectHistory.length >= 3) {
499
+ this.reconnectDelay = this.maxReconnectDelay;
500
+ console.warn(`[WinMatrixAgentClient] rapid disconnect detected (${this.disconnectHistory.length} disconnects within 5s); backing off to ${this.maxReconnectDelay}ms`);
501
+ }
502
+ if (this.disconnectHandler) {
503
+ this.disconnectHandler();
504
+ }
505
+ if (this.options.autoReconnect) {
506
+ this.scheduleReconnect();
507
+ }
508
+ }
509
+ scheduleReconnect() {
510
+ if (this.reconnectTimer)
511
+ return;
512
+ const baseDelay = this.reconnectDelay;
513
+ this.reconnectDelay = Math.min(baseDelay * 2, this.maxReconnectDelay);
514
+ // Apply ±25% jitter to avoid synchronized reconnect storms.
515
+ const jitterFactor = 0.75 + Math.random() * 0.5;
516
+ const delay = Math.max(0, Math.round(baseDelay * jitterFactor));
517
+ this.reconnectTimer = setTimeout(() => {
518
+ this.reconnectTimer = null;
519
+ this.setState('disconnected');
520
+ this.connect().catch((err) => {
521
+ const msg = err instanceof Error ? err.message : String(err);
522
+ if (this.errorHandler) {
523
+ this.errorHandler(new Error(`Reconnect failed: ${msg}`));
524
+ }
525
+ // scheduleReconnect will be called again by connect() failure
526
+ });
527
+ }, delay);
528
+ }
529
+ cleanup(socket) {
530
+ const targetSocket = socket ?? this.ws;
531
+ const isCurrentSocket = !socket || socket === this.ws;
532
+ if (!isCurrentSocket) {
533
+ this.cleanupSocket(targetSocket);
534
+ return;
535
+ }
536
+ if (this.heartbeatTimer) {
537
+ clearInterval(this.heartbeatTimer);
538
+ this.heartbeatTimer = null;
539
+ }
540
+ if (this.reconnectTimer) {
541
+ clearTimeout(this.reconnectTimer);
542
+ this.reconnectTimer = null;
543
+ }
544
+ for (const [, pending] of this.pendingRequests) {
545
+ clearTimeout(pending.timer);
546
+ pending.reject(new Error('Connection closed'));
547
+ }
548
+ this.pendingRequests.clear();
549
+ if (targetSocket) {
550
+ this.cleanupSocket(targetSocket);
551
+ this.ws = null;
552
+ }
553
+ this.serverConfig = null;
554
+ }
555
+ cleanupSocket(socket) {
556
+ if (!socket)
557
+ return;
558
+ try {
559
+ socket.removeAllListeners();
560
+ if (socket.readyState !== WebSocket.CLOSING && socket.readyState !== WebSocket.CLOSED) {
561
+ socket.close();
562
+ }
563
+ }
564
+ catch {
565
+ // ignore close errors
566
+ }
567
+ }
568
+ }
569
+ //# sourceMappingURL=WinMatrixAgentClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WinMatrixAgentClient.js","sourceRoot":"","sources":["../../src/core/WinMatrixAgentClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * WorkspaceScanner - 扫描 workDir 获取项目元数据
3
+ *
4
+ * 在 Agent 注册成功后调用,将扫描结果通过 Daemon WS 上报至 Server。
5
+ * 安全约束:不上报绝对路径、文件内容、环境变量、含凭据的 Git remote。
6
+ */
7
+ interface TechStack {
8
+ [key: string]: string;
9
+ }
10
+ interface WorkspaceInfo {
11
+ pathSummary: string;
12
+ gitRemote?: string;
13
+ gitBranch?: string;
14
+ techStack?: TechStack;
15
+ scripts?: Record<string, string>;
16
+ installedCli?: string[];
17
+ }
18
+ interface RuntimeInfo {
19
+ version?: string;
20
+ available: boolean;
21
+ }
22
+ export interface WorkspaceReportPayload {
23
+ agentId: string;
24
+ workdir?: WorkspaceInfo;
25
+ runtimes?: Record<string, RuntimeInfo>;
26
+ }
27
+ /**
28
+ * 扫描指定工作目录,提取项目元数据。
29
+ * 所有 git/which 调用均带 5s 超时,失败不影响整体结果。
30
+ */
31
+ export declare function scanWorkDir(workDir: string): Promise<WorkspaceInfo>;
32
+ /**
33
+ * 脱敏 Git remote URL:
34
+ * - HTTPS: 移除 userinfo(用户名:密码@)
35
+ * - SSH: 保持原样(git@host:org/repo)
36
+ * - 仅保留 host/org/repo
37
+ */
38
+ export declare function sanitizeGitRemote(remote: string): string;
39
+ /**
40
+ * 检测运行时可用的运行时版本信息。
41
+ * 基于 agentType 选择性检测,避免不必要的磁盘扫描。
42
+ */
43
+ export declare function detectRuntimeInfo(runtimeBinary: string): Promise<RuntimeInfo>;
44
+ export {};
45
+ //# sourceMappingURL=WorkspaceScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceScanner.d.ts","sourceRoot":"","sources":["../../src/core/WorkspaceScanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,UAAU,SAAS;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACxC;AAaD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA2HzE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQnF"}