@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 @@
1
+ {"version":3,"file":"DaemonLifecycle.js","sourceRoot":"","sources":["../../src/core/DaemonLifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 本机只读诊断 HTTP 服务(默认 127.0.0.1:18767):状态、子 Agent、最近日志。
3
+ * 不鉴权 — 仅回环,切勿 bind 到 0.0.0.0。
4
+ */
5
+ import http from 'node:http';
6
+ import type { DaemonFileLogger } from './DaemonFileLogger.js';
7
+ import type { AgentProcessManager } from './AgentProcessManager.js';
8
+ export interface DaemonDiagnosticsContext {
9
+ version: string;
10
+ installationId: string;
11
+ /** 已脱敏 */
12
+ serverUrl: string;
13
+ computerState: string | null;
14
+ computerId: string | null;
15
+ uptimeSec: number;
16
+ }
17
+ export declare function startDiagnosticsServer(options: {
18
+ fileLogger: DaemonFileLogger;
19
+ agentManager: AgentProcessManager;
20
+ getContext: () => DaemonDiagnosticsContext;
21
+ onRescanProfiles?: () => Promise<{
22
+ ok: boolean;
23
+ error?: string;
24
+ }>;
25
+ host?: string;
26
+ port?: number;
27
+ }): http.Server;
28
+ //# sourceMappingURL=DiagnosticsServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticsServer.d.ts","sourceRoot":"","sources":["../../src/core/DiagnosticsServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAKpE,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAoFD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,UAAU,EAAE,gBAAgB,CAAC;IAC7B,YAAY,EAAE,mBAAmB,CAAC;IAClC,UAAU,EAAE,MAAM,wBAAwB,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CAAC,MAAM,CAqEd"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * 本机只读诊断 HTTP 服务(默认 127.0.0.1:18767):状态、子 Agent、最近日志。
3
+ * 不鉴权 — 仅回环,切勿 bind 到 0.0.0.0。
4
+ */
5
+ import http from 'node:http';
6
+ const DEFAULT_HOST = '127.0.0.1';
7
+ const DEFAULT_PORT = 18767;
8
+ function json(res, code, body) {
9
+ const payload = JSON.stringify(body);
10
+ res.writeHead(code, {
11
+ 'Content-Type': 'application/json; charset=utf-8',
12
+ 'Cache-Control': 'no-store',
13
+ });
14
+ res.end(payload);
15
+ }
16
+ function htmlDashboard() {
17
+ return `<!DOCTYPE html>
18
+ <html lang="zh-CN">
19
+ <head>
20
+ <meta charset="utf-8" />
21
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
22
+ <title>WinMatrix Daemon</title>
23
+ <style>
24
+ body { font-family: system-ui, sans-serif; margin: 16px; background: #0f1419; color: #e6edf3; }
25
+ h1 { font-size: 1.1rem; }
26
+ pre { background: #161b22; padding: 12px; overflow: auto; max-height: 420px; border-radius: 6px; font-size: 12px; line-height: 1.4; }
27
+ section { margin-bottom: 20px; }
28
+ .muted { color: #8b949e; font-size: 13px; }
29
+ a { color: #58a6ff; }
30
+ code { background: #21262d; padding: 2px 6px; border-radius: 4px; }
31
+ </style>
32
+ </head>
33
+ <body>
34
+ <h1>WinMatrix Daemon 本机诊断</h1>
35
+ <p class="muted">仅监听 127.0.0.1;API:<code>/api/status</code> <code>/api/agents</code> <code>/api/tasks</code> <code>/api/logs</code> <code>POST /api/rescan-profiles</code></p>
36
+ <p><button id="rescanBtn" style="padding:6px 14px;cursor:pointer;">刷新技能</button> <span id="rescanMsg" style="margin-left:8px;font-size:13px;"></span></p>
37
+ <section>
38
+ <h2>状态</h2>
39
+ <pre id="status">加载中…</pre>
40
+ </section>
41
+ <section>
42
+ <h2>子 Agent</h2>
43
+ <pre id="agents">加载中…</pre>
44
+ </section>
45
+ <section>
46
+ <h2>近期任务</h2>
47
+ <p class="muted">仅在<strong>本子 Agent WebSocket</strong>收到服务端 <code>task.assign</code> 并由适配器执行时写入(进程内存)。OpenClaw 工作站 HTTP / <code>openclaw_chat</code> 工具、或未绑定到此 Daemon 上「子 Agent」注册 ID 的对话不会出现在此处;重启 Daemon 后会清空。</p>
48
+ <pre id="tasks">加载中…</pre>
49
+ </section>
50
+ <section>
51
+ <h2>最近日志</h2>
52
+ <pre id="logs">加载中…</pre>
53
+ </section>
54
+ <script>
55
+ async function load() {
56
+ const [st, ag, tk, lg] = await Promise.all([
57
+ fetch('/api/status').then(r => r.json()),
58
+ fetch('/api/agents').then(r => r.json()),
59
+ fetch('/api/tasks').then(r => r.json()),
60
+ fetch('/api/logs?lines=200').then(r => r.json()),
61
+ ]);
62
+ document.getElementById('status').textContent = JSON.stringify(st.data ?? st, null, 2);
63
+ document.getElementById('agents').textContent = JSON.stringify(ag.data ?? ag, null, 2);
64
+ document.getElementById('tasks').textContent = JSON.stringify(tk.data ?? tk, null, 2);
65
+ document.getElementById('logs').textContent = ((lg.data && lg.data.lines) || []).join(String.fromCharCode(10));
66
+ }
67
+ document.getElementById('rescanBtn').onclick = async function() {
68
+ const btn = document.getElementById('rescanBtn');
69
+ const msg = document.getElementById('rescanMsg');
70
+ btn.disabled = true;
71
+ msg.textContent = '扫描中...';
72
+ try {
73
+ const r = await fetch('/api/rescan-profiles', { method: 'POST' });
74
+ const j = await r.json();
75
+ msg.textContent = j.success ? '已刷新并上报' : ('失败: ' + (j.error || '未知错误'));
76
+ } catch(e) {
77
+ msg.textContent = '请求失败: ' + e.message;
78
+ } finally {
79
+ btn.disabled = false;
80
+ }
81
+ };
82
+ load();
83
+ setInterval(load, 8000);
84
+ </script>
85
+ </body>
86
+ </html>`;
87
+ }
88
+ export function startDiagnosticsServer(options) {
89
+ const host = options.host ?? process.env.WINMATRIX_DAEMON_DIAG_HOST ?? DEFAULT_HOST;
90
+ const port = Number(process.env.WINMATRIX_DAEMON_DIAG_PORT ?? options.port ?? DEFAULT_PORT);
91
+ const server = http.createServer((req, res) => {
92
+ const url = new URL(req.url ?? '/', `http://${host}`);
93
+ try {
94
+ if (req.method === 'GET' && url.pathname === '/') {
95
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
96
+ res.end(htmlDashboard());
97
+ return;
98
+ }
99
+ if (req.method === 'GET' && url.pathname === '/api/status') {
100
+ json(res, 200, { success: true, data: options.getContext() });
101
+ return;
102
+ }
103
+ if (req.method === 'GET' && url.pathname === '/api/agents') {
104
+ json(res, 200, {
105
+ success: true,
106
+ data: options.agentManager.listAgents(),
107
+ });
108
+ return;
109
+ }
110
+ if (req.method === 'GET' && url.pathname === '/api/tasks') {
111
+ json(res, 200, {
112
+ success: true,
113
+ data: options.agentManager.getRecentTaskEvents(),
114
+ });
115
+ return;
116
+ }
117
+ if (req.method === 'GET' && url.pathname === '/api/logs') {
118
+ const lines = Math.min(2000, Math.max(1, Number(url.searchParams.get('lines')) || 200));
119
+ json(res, 200, {
120
+ success: true,
121
+ data: {
122
+ logDir: options.fileLogger.getLogDirectory(),
123
+ lines: options.fileLogger.getRecentLines(lines),
124
+ },
125
+ });
126
+ return;
127
+ }
128
+ if (req.method === 'POST' && url.pathname === '/api/rescan-profiles') {
129
+ if (options.onRescanProfiles) {
130
+ options.onRescanProfiles().then((result) => {
131
+ json(res, result.ok ? 200 : 500, { success: result.ok, data: result.ok ? null : undefined, error: result.error });
132
+ }).catch((e) => {
133
+ json(res, 500, { success: false, error: e instanceof Error ? e.message : String(e) });
134
+ });
135
+ }
136
+ else {
137
+ json(res, 501, { success: false, error: 'Profile rescan not configured' });
138
+ }
139
+ return;
140
+ }
141
+ json(res, 404, { success: false, error: 'Not found' });
142
+ }
143
+ catch (e) {
144
+ json(res, 500, { success: false, error: e instanceof Error ? e.message : String(e) });
145
+ }
146
+ });
147
+ server.listen(port, host, () => {
148
+ console.log(`[daemon] Diagnostics UI http://${host}:${port}/`);
149
+ });
150
+ server.on('error', (err) => {
151
+ console.error(`[daemon] Diagnostics server error: ${err instanceof Error ? err.message : String(err)}`);
152
+ });
153
+ return server;
154
+ }
155
+ //# sourceMappingURL=DiagnosticsServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticsServer.js","sourceRoot":"","sources":["../../src/core/DiagnosticsServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * WinMatrix Daemon - Installation ID
3
+ *
4
+ * Generates a unique installation UUID on first run and persists it to
5
+ * ~/.winmatrix/installation (0600). The ~/.winmatrix directory is created
6
+ * with 0700 permissions. On subsequent runs, the existing ID is read back.
7
+ */
8
+ /**
9
+ * Get the persisted installation ID, or generate and persist a new one.
10
+ * The ~/.winmatrix directory is created with 0700 if it doesn't exist.
11
+ * The installation file is written with 0600 permissions.
12
+ */
13
+ export declare function getOrCreateInstallationId(): string;
14
+ //# sourceMappingURL=InstallationId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallationId.d.ts","sourceRoot":"","sources":["../../src/core/InstallationId.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiCH;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAelD"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * WinMatrix Daemon - Installation ID
3
+ *
4
+ * Generates a unique installation UUID on first run and persists it to
5
+ * ~/.winmatrix/installation (0600). The ~/.winmatrix directory is created
6
+ * with 0700 permissions. On subsequent runs, the existing ID is read back.
7
+ */
8
+ import { randomUUID } from 'node:crypto';
9
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, chmodSync } from 'node:fs';
10
+ import { homedir } from 'node:os';
11
+ import path from 'node:path';
12
+ /* ── Constants ── */
13
+ const DAEMON_HOME_DIR = '.winmatrix';
14
+ const INSTALLATION_FILE = 'installation';
15
+ /* ── Helpers ── */
16
+ function getDaemonHome() {
17
+ return path.join(homedir(), DAEMON_HOME_DIR);
18
+ }
19
+ function getInstallationPath() {
20
+ return path.join(getDaemonHome(), INSTALLATION_FILE);
21
+ }
22
+ function ensureDaemonHome() {
23
+ const dir = getDaemonHome();
24
+ if (!existsSync(dir)) {
25
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
26
+ // Explicit chmod to guarantee 0700 regardless of umask
27
+ chmodSync(dir, 0o700);
28
+ }
29
+ }
30
+ /* ── Public API ── */
31
+ /**
32
+ * Get the persisted installation ID, or generate and persist a new one.
33
+ * The ~/.winmatrix directory is created with 0700 if it doesn't exist.
34
+ * The installation file is written with 0600 permissions.
35
+ */
36
+ export function getOrCreateInstallationId() {
37
+ ensureDaemonHome();
38
+ const filePath = getInstallationPath();
39
+ if (existsSync(filePath)) {
40
+ const id = readFileSync(filePath, 'utf-8').trim();
41
+ if (id.length > 0) {
42
+ return id;
43
+ }
44
+ // File exists but is empty — regenerate
45
+ }
46
+ const id = randomUUID();
47
+ writeFileSync(filePath, id, { mode: 0o600 });
48
+ return id;
49
+ }
50
+ //# sourceMappingURL=InstallationId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallationId.js","sourceRoot":"","sources":["../../src/core/InstallationId.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,qBAAqB;AAErB,MAAM,eAAe,GAAG,YAAY,CAAC;AACrC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEzC,mBAAmB;AAEnB,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,uDAAuD;QACvD,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,sBAAsB;AAEtB;;;;GAIG;AACH,MAAM,UAAU,yBAAyB;IACvC,gBAAgB,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IAEvC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,wCAAwC;IAC1C,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type ClaudeRuntimeDoctorResult, type Runtime } from '@winmatrix/agent-sdk';
2
+ import { type DaemonRuntimeEntry } from './ConfigLoader.js';
3
+ export interface RuntimeDoctorSummary {
4
+ runtimes: Runtime[];
5
+ claude: ClaudeRuntimeDoctorResult;
6
+ }
7
+ export declare function daemonRuntimeEntryFromClaudeDoctor(result: ClaudeRuntimeDoctorResult): DaemonRuntimeEntry;
8
+ export declare function adapterClaudePathFromRuntimeEntry(runtime: Pick<DaemonRuntimeEntry, 'available' | 'resolvedPath' | 'command'> | undefined): string | undefined;
9
+ export declare function runDaemonRuntimeDoctor(options?: {
10
+ persist?: boolean;
11
+ }): Promise<RuntimeDoctorSummary>;
12
+ export declare function formatClaudeDoctorLines(result: ClaudeRuntimeDoctorResult): string[];
13
+ //# sourceMappingURL=RuntimeDoctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeDoctor.d.ts","sourceRoot":"","sources":["../../src/core/RuntimeDoctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,yBAAyB,EAC9B,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,yBAAyB,CAAC;CACnC;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,yBAAyB,GAChC,kBAAkB,CAYpB;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,GAAG,cAAc,GAAG,SAAS,CAAC,GAAG,SAAS,GACtF,MAAM,GAAG,SAAS,CAKpB;AAsBD,wBAAsB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6B3G;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,EAAE,CAqBnF"}
@@ -0,0 +1,86 @@
1
+ import { detectRuntimes, runClaudeRuntimeDoctor, OpenClawAdapter, } from '@winmatrix/agent-sdk';
2
+ import { persistDaemonRuntimeToDisk, } from './ConfigLoader.js';
3
+ export function daemonRuntimeEntryFromClaudeDoctor(result) {
4
+ return {
5
+ available: result.available,
6
+ checkedAt: result.checkedAt,
7
+ version: result.version,
8
+ command: result.command,
9
+ args: result.args,
10
+ shell: result.shell,
11
+ resolvedPath: result.resolvedPath,
12
+ source: result.source,
13
+ error: result.error,
14
+ };
15
+ }
16
+ export function adapterClaudePathFromRuntimeEntry(runtime) {
17
+ if (runtime?.available !== true) {
18
+ return undefined;
19
+ }
20
+ return runtime.resolvedPath ?? runtime.command;
21
+ }
22
+ /**
23
+ * 探测本机 openclaw CLI 可用性(spawn `openclaw --version`)。
24
+ * CLI 模式下不连 gateway(无 WS-RPC scope/protocol 问题),仅验 CLI 可执行。
25
+ * Promise.race 3s 兜底(虽然 healthCheck 内部 spawnSync 已有 5s timeout,双保险)。
26
+ */
27
+ async function probeOpenClawGateway(timeoutMs = 3_000) {
28
+ try {
29
+ const adapter = new OpenClawAdapter({});
30
+ const status = await Promise.race([
31
+ adapter.healthCheck(),
32
+ new Promise((resolve) => setTimeout(() => resolve({ available: false }), timeoutMs)),
33
+ ]);
34
+ return { available: status.available, version: status.version };
35
+ }
36
+ catch {
37
+ return { available: false };
38
+ }
39
+ }
40
+ export async function runDaemonRuntimeDoctor(options) {
41
+ const claude = runClaudeRuntimeDoctor();
42
+ const runtimeEntry = daemonRuntimeEntryFromClaudeDoctor(claude);
43
+ if (options?.persist !== false) {
44
+ persistDaemonRuntimeToDisk('claude', runtimeEntry);
45
+ }
46
+ const runtimes = detectRuntimes().map((runtime) => (runtime.name === 'claude'
47
+ ? {
48
+ name: 'claude',
49
+ version: claude.version,
50
+ available: claude.available,
51
+ }
52
+ : runtime));
53
+ // openclaw 是 WS gateway(非 CLI),detectRuntimes 探不到;用 healthCheck 探测默认本机 gateway
54
+ const openclawStatus = await probeOpenClawGateway();
55
+ runtimes.push({
56
+ name: 'openclaw',
57
+ available: openclawStatus.available,
58
+ version: openclawStatus.version,
59
+ });
60
+ return {
61
+ claude,
62
+ runtimes,
63
+ };
64
+ }
65
+ export function formatClaudeDoctorLines(result) {
66
+ const lines = [
67
+ `[daemon] doctor claude: ${result.available ? 'available' : 'unavailable'}`,
68
+ `[daemon] checkedAt: ${result.checkedAt}`,
69
+ `[daemon] source: ${result.source ?? '-'}`,
70
+ `[daemon] command: ${result.command ?? '-'}`,
71
+ ];
72
+ if (result.args && result.args.length > 0) {
73
+ lines.push(`[daemon] args: ${JSON.stringify(result.args)}`);
74
+ }
75
+ if (result.resolvedPath) {
76
+ lines.push(`[daemon] resolvedPath: ${result.resolvedPath}`);
77
+ }
78
+ if (result.version) {
79
+ lines.push(`[daemon] version: ${result.version}`);
80
+ }
81
+ if (result.error) {
82
+ lines.push(`[daemon] error: ${result.error}`);
83
+ }
84
+ return lines;
85
+ }
86
+ //# sourceMappingURL=RuntimeDoctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeDoctor.js","sourceRoot":"","sources":["../../src/core/RuntimeDoctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
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 { RegisterParams, TaskAssignParams, type EngineProgressEvent, type EngineLaunchSpec, type ExternalTaskSecretBindings, RuntimeAvailabilityPayload, BaseResponse, BaseRequest, InboundFrame, type ContextBudget } from '@winmatrix/protocol';
9
+ export type ClientState = 'disconnected' | 'connecting' | 'connected' | 'registered';
10
+ export interface TaskInput {
11
+ taskId: string;
12
+ input: string;
13
+ context: TaskAssignParams['context'];
14
+ streaming: boolean;
15
+ /** 服务端生成的系统提示词 */
16
+ systemPrompt?: string;
17
+ /** 本任务的 MCP ToolProxy token(per-task session ID) */
18
+ mcpToken?: string;
19
+ /** Adapter session id for resume */
20
+ sessionId?: string;
21
+ /** When true, adapter resumes sessionId */
22
+ resumeSession?: boolean;
23
+ /** 新版信封透传的工作目录(来自 LaunchSpec.workDir);V1 路径不设置。 */
24
+ workDir?: string;
25
+ /**
26
+ * 统一 Agent Engine Gateway Run key(`${recordId}:${attemptNo}`)。
27
+ * 仅在新版 task.assign 信封(launchSpec)中携带;旧版 V1 assign 时不设置。
28
+ * daemon 用其做幂等 launch(同一 runKey 重复 assign 不重复执行)。
29
+ */
30
+ runKey?: string;
31
+ /** 新版信封的 invocation fingerprint;不同 fingerprint 拒绝为同一 runKey 启动。 */
32
+ invocationFingerprint?: string;
33
+ /** 原始 canonical LaunchSpec(结构化 input/session/model 等),供 adapter 高级用法使用。 */
34
+ launchSpec?: EngineLaunchSpec;
35
+ /** 非敏感环境变量(来自 LaunchSpec.nonSensitiveEnv)。 */
36
+ env?: Record<string, string>;
37
+ /** 当前 turn 上下文预算(来自 LaunchSpec.contextBudget)。 */
38
+ contextBudget?: ContextBudget;
39
+ /** Claude 引擎选项(来自 LaunchSpec.permissionMode/allowedTools/engineOptions)。 */
40
+ claude?: {
41
+ permissionMode?: string;
42
+ tools?: string[];
43
+ disallowedTools?: string[];
44
+ systemPrompt?: string;
45
+ maxBudgetUsd?: number;
46
+ maxTurns?: number;
47
+ useAgentSdk?: boolean;
48
+ };
49
+ /** Hermes 引擎选项(来自 LaunchSpec.model/engineOptions)。 */
50
+ hermes?: {
51
+ model?: string;
52
+ provider?: string;
53
+ toolsets?: string[];
54
+ };
55
+ /** OpenClaw 引擎选项(来自 LaunchSpec.engineOptions)。 */
56
+ openclaw?: {
57
+ gatewayHost?: string;
58
+ gatewayPort?: number;
59
+ };
60
+ }
61
+ /**
62
+ * 将 canonical EngineLaunchSpec + sensitive envelope 映射回 TaskInput,
63
+ * 供 daemon 侧 adapter.execute() 消费(保持 adapter 契约不变)。
64
+ *
65
+ * 安全:mcpCapabilityToken 直接映射为 mcpToken;本函数不记录任何 secret 字段值。
66
+ */
67
+ export declare function launchSpecToTaskInput(spec: EngineLaunchSpec, opts: {
68
+ taskId: string;
69
+ runKey?: string;
70
+ invocationFingerprint?: string;
71
+ secretBindings?: ExternalTaskSecretBindings;
72
+ legacy?: Partial<TaskInput>;
73
+ }): TaskInput;
74
+ export interface WinMatrixAgentClientOptions {
75
+ /** WebSocket URL of the WinMatrix server (e.g. ws://localhost:8400/api/v1/external-agents/connect) */
76
+ url: string;
77
+ /** Agent identifier */
78
+ agentId: string;
79
+ /** API key for authentication */
80
+ apiKey: string;
81
+ /** Display name for this agent */
82
+ name: string;
83
+ /** Agent type identifier */
84
+ agentType: string;
85
+ /** Capability declaration */
86
+ capabilities: RegisterParams['capabilities'];
87
+ /**
88
+ * Optional hooks (e.g. Dual Runtime Bridge task journaling).
89
+ * - `onTaskAssigned`: once per task.assign, before the task handler runs.
90
+ * - `onTaskCompleted` / `onTaskFailed`: before task.complete / task.error frames are sent.
91
+ */
92
+ bridgeHooks?: {
93
+ onTaskAssigned?: (task: TaskInput) => void;
94
+ /** Invoked before sending task.complete (e.g. bridge task journal). */
95
+ onTaskCompleted?: (taskId: string, result: unknown) => void;
96
+ /** Invoked before sending task.error (e.g. bridge task journal). */
97
+ onTaskFailed?: (taskId: string, error: string, code?: string) => void;
98
+ };
99
+ /**
100
+ * When true, the client schedules its own exponential backoff reconnect on disconnect
101
+ * or failed connect(). Default false — prefer orchestrating reconnect at the host (daemon)
102
+ * so policies (auth backoff-off, single owner) stay in one place.
103
+ */
104
+ autoReconnect?: boolean;
105
+ /**
106
+ * Session query handler — called when the server sends session.list / session.get RPC.
107
+ * The handler receives the method name and params, and should return the result payload
108
+ * to send back in the response frame.
109
+ */
110
+ sessionQueryHandler?: (method: string, params: unknown) => Promise<unknown>;
111
+ /** Daemon-side handler for versioned Agent Engine Run control/discovery RPCs. */
112
+ agentEngineRequestHandler?: (method: string, params: unknown) => Promise<unknown>;
113
+ /** Validate task.assign identity/capacity before acknowledging launch. */
114
+ taskAssignAdmission?: (params: unknown) => {
115
+ ok: true;
116
+ disposition?: 'accepted' | 'existing';
117
+ } | {
118
+ ok: false;
119
+ error: string;
120
+ };
121
+ }
122
+ type EventHandler<T = void> = (data: T) => void | Promise<void>;
123
+ export declare class WinMatrixAgentClient {
124
+ private readonly options;
125
+ private ws;
126
+ private state;
127
+ protected heartbeatTimer: ReturnType<typeof setInterval> | null;
128
+ private reconnectTimer;
129
+ private reconnectDelay;
130
+ private readonly maxReconnectDelay;
131
+ private pendingRequests;
132
+ private requestTimeout;
133
+ private disconnectHistory;
134
+ private taskHandler;
135
+ private resumeHandler;
136
+ private disconnectHandler;
137
+ private errorHandler;
138
+ private registeredHandler;
139
+ private serverConfig;
140
+ constructor(options: WinMatrixAgentClientOptions);
141
+ /** Current lifecycle state */
142
+ getState(): ClientState;
143
+ /** Set or replace the session query handler after construction */
144
+ setSessionQueryHandler(handler: (method: string, params: unknown) => Promise<unknown>): void;
145
+ /** Register an event handler */
146
+ on(event: 'task' | 'resume' | 'disconnect' | 'error' | 'registered', handler: EventHandler<unknown>): void;
147
+ /** Open connection and register with the server */
148
+ connect(): Promise<void>;
149
+ /** Gracefully disconnect */
150
+ disconnect(): void;
151
+ /**
152
+ * 向 WinMatrix 上报本地 Hermes/OpenClaw HTTP(或命令模式)运行时可用性快照。
153
+ * 一般由 bridge 周期性调用;需在 `registered` 状态下发送。
154
+ */
155
+ notifyRuntimeAvailability(payload: RuntimeAvailabilityPayload): void;
156
+ /** Send a streaming delta for an active task */
157
+ streamDelta(taskId: string, content: string, meta?: Record<string, unknown>, engineEvent?: EngineProgressEvent): void;
158
+ /** Mark a task as completed with a result. sessionId and usage are passed at top level for server-side DB persistence. */
159
+ completeTask(taskId: string, result: unknown, sessionId?: string, usage?: {
160
+ input: number;
161
+ output: number;
162
+ }): void;
163
+ /** Mark a task as failed with an error message */
164
+ failTask(taskId: string, error: string, code?: string): void;
165
+ /** Call a WinMatrix tool and wait for the result */
166
+ callTool(toolName: string, args: unknown, taskId?: string, agentId?: string): Promise<unknown>;
167
+ /**
168
+ * Send an arbitrary frame to the server.
169
+ * Wraps the low-level sendRaw, keeping the WS write path encapsulated.
170
+ */
171
+ sendFrame(frame: Record<string, unknown>): void;
172
+ protected establishConnection(): Promise<void>;
173
+ protected register(): Promise<void>;
174
+ protected sendRequest(method: string, params?: unknown): Promise<BaseResponse>;
175
+ protected sendEvent(event: string, payload?: unknown): void;
176
+ protected sendRaw(data: unknown): void;
177
+ protected handleMessage(data: WebSocket.Data): void;
178
+ /**
179
+ * 处理服务端发来的请求帧(如 task.assign)
180
+ *
181
+ * 服务端通过 waitForResponse 发送 { type: 'req', method: 'task.assign', params } 帧,
182
+ * SDK 需要回复 { type: 'res', id, ok: true } 确认收到,然后异步处理任务。
183
+ */
184
+ protected handleIncomingRequest(frame: BaseRequest): void;
185
+ private handleResponse;
186
+ protected handleEventFrame(frame: InboundFrame & {
187
+ type: 'event';
188
+ event: string;
189
+ payload?: unknown;
190
+ }): void;
191
+ protected setState(state: ClientState): void;
192
+ protected startHeartbeat(): void;
193
+ protected handleDisconnect(socket?: WebSocket | null): void;
194
+ private scheduleReconnect;
195
+ private cleanup;
196
+ private cleanupSocket;
197
+ }
198
+ export {};
199
+ //# sourceMappingURL=WinMatrixAgentClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WinMatrixAgentClient.d.ts","sourceRoot":"","sources":["../../src/core/WinMatrixAgentClient.ts"],"names":[],"mappings":"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"}