@winmatrix/daemon 0.2.0

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 (51) hide show
  1. package/README.md +59 -0
  2. package/bin/winmatrix-daemon.js +6 -0
  3. package/dist/core/AgentProcessManager.d.ts +99 -0
  4. package/dist/core/AgentProcessManager.d.ts.map +1 -0
  5. package/dist/core/AgentProcessManager.js +292 -0
  6. package/dist/core/AgentProcessManager.js.map +1 -0
  7. package/dist/core/ConfigLoader.d.ts +92 -0
  8. package/dist/core/ConfigLoader.d.ts.map +1 -0
  9. package/dist/core/ConfigLoader.js +240 -0
  10. package/dist/core/ConfigLoader.js.map +1 -0
  11. package/dist/core/DaemonFileLogger.d.ts +34 -0
  12. package/dist/core/DaemonFileLogger.d.ts.map +1 -0
  13. package/dist/core/DaemonFileLogger.js +157 -0
  14. package/dist/core/DaemonFileLogger.js.map +1 -0
  15. package/dist/core/DaemonLifecycle.d.ts +22 -0
  16. package/dist/core/DaemonLifecycle.d.ts.map +1 -0
  17. package/dist/core/DaemonLifecycle.js +155 -0
  18. package/dist/core/DaemonLifecycle.js.map +1 -0
  19. package/dist/core/DiagnosticsServer.d.ts +28 -0
  20. package/dist/core/DiagnosticsServer.d.ts.map +1 -0
  21. package/dist/core/DiagnosticsServer.js +155 -0
  22. package/dist/core/DiagnosticsServer.js.map +1 -0
  23. package/dist/core/InstallationId.d.ts +14 -0
  24. package/dist/core/InstallationId.d.ts.map +1 -0
  25. package/dist/core/InstallationId.js +50 -0
  26. package/dist/core/InstallationId.js.map +1 -0
  27. package/dist/core/RuntimeAvailabilityReporter.d.ts +27 -0
  28. package/dist/core/RuntimeAvailabilityReporter.d.ts.map +1 -0
  29. package/dist/core/RuntimeAvailabilityReporter.js +79 -0
  30. package/dist/core/RuntimeAvailabilityReporter.js.map +1 -0
  31. package/dist/core/WorkspaceScanner.d.ts +45 -0
  32. package/dist/core/WorkspaceScanner.d.ts.map +1 -0
  33. package/dist/core/WorkspaceScanner.js +166 -0
  34. package/dist/core/WorkspaceScanner.js.map +1 -0
  35. package/dist/index.d.ts +16 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +238 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/wrapper/AgentWrapper.d.ts +23 -0
  40. package/dist/wrapper/AgentWrapper.d.ts.map +1 -0
  41. package/dist/wrapper/AgentWrapper.js +873 -0
  42. package/dist/wrapper/AgentWrapper.js.map +1 -0
  43. package/dist/wrapper/ClaudeStreamParser.d.ts +63 -0
  44. package/dist/wrapper/ClaudeStreamParser.d.ts.map +1 -0
  45. package/dist/wrapper/ClaudeStreamParser.js +104 -0
  46. package/dist/wrapper/ClaudeStreamParser.js.map +1 -0
  47. package/dist/wrapper/supportedAgentTypes.d.ts +7 -0
  48. package/dist/wrapper/supportedAgentTypes.d.ts.map +1 -0
  49. package/dist/wrapper/supportedAgentTypes.js +6 -0
  50. package/dist/wrapper/supportedAgentTypes.js.map +1 -0
  51. package/package.json +39 -0
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # @winmatrix/daemon
2
+
3
+ WinMatrix 外部计算机 Daemon(Computer WebSocket + 本机 Agent)。
4
+
5
+ ## 全局命令 `winmatrix-daemon`
6
+
7
+ 在任意目录执行前,需先安装全局入口(二选一):
8
+
9
+ ### 方式 A:本仓库内 link(开发常用)
10
+
11
+ ```bash
12
+ cd packages/winmatrix-daemon
13
+ npm install
14
+ npm run build
15
+ npm link
16
+ ```
17
+
18
+ 之后可在任意路径使用:
19
+
20
+ ```bash
21
+ winmatrix-daemon help
22
+ winmatrix-daemon setup
23
+ # 任选其一写入 ~/.winmatrix/daemon.json:
24
+ winmatrix-daemon setup --token 'wmc_...' [--server ws://.../connect]
25
+ WINMATRIX_TOKEN='wmc_...' winmatrix-daemon --persist-token
26
+ # 或直接编辑 daemon.json 中的 computerToken
27
+ winmatrix-daemon restart # 会读取 daemon.json 中的 computerToken(无需每次 export)
28
+ ```
29
+
30
+ ## 配置文件
31
+
32
+ `~/.winmatrix/daemon.json`(chmod 600)字段:
33
+
34
+ | 字段 | 说明 |
35
+ |------|------|
36
+ | `serverUrl` | WebSocket 地址 |
37
+ | `computerToken` | Computer 注册 Token(`wmc_...`);亦兼容遗留键名 `token` |
38
+
39
+ 优先级:`--token` > 环境变量 `WINMATRIX_TOKEN` > 文件中的 `computerToken`。
40
+ 启动时追加 `--persist-token` 可把当前 CLI/环境变量解析出的 token 写回 JSON(便于「一次写入、以后只 restart」)。
41
+
42
+ ### 方式 B:从路径全局安装
43
+
44
+ 在仓库根目录:
45
+
46
+ ```bash
47
+ cd packages/winmatrix-daemon && npm install && npm run build && cd ../..
48
+ npm install -g ./packages/winmatrix-daemon
49
+ ```
50
+
51
+ 卸载全局:`npm uninstall -g @winmatrix/daemon`
52
+
53
+ > 发布到 npm 后,可使用 `npm install -g @winmatrix/daemon`。
54
+
55
+ ## 说明
56
+
57
+ - `bin` 入口为 `bin/winmatrix-daemon.js`,不依赖当前工作目录。
58
+ - `restart` 依赖 `~/.winmatrix/daemon.pid`(由正在运行的 daemon 写入);首次可直接 `winmatrix-daemon` 前台启动。
59
+ - 本机诊断页默认:<http://127.0.0.1:18767/>
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 全局/本地 npm bin 入口:始终从包根目录加载编译产物。
4
+ * package.json "bin" 指向本文件,便于 npm install -g / npm link。
5
+ */
6
+ import '../dist/index.js';
@@ -0,0 +1,99 @@
1
+ /**
2
+ * WinMatrix Daemon - Agent Process Manager (v2)
3
+ *
4
+ * 管理外部 Agent 适配器实例生命周期。
5
+ * 收到 server 的 agent.create / agent.stop 信令后,
6
+ * 实例化对应的 AgentAdapter 并创建 WinMatrixAgentClient 连接。
7
+ *
8
+ * 方案 B:adapter 在 daemon 进程内直接运行,不再 spawn 子进程。
9
+ */
10
+ import { WinMatrixAgentClient, AdapterRegistry, type AgentAdapter, type AgentProfile } from '@winmatrix/agent-sdk';
11
+ export interface AgentCreatePayload {
12
+ agentId: string;
13
+ /** agentType: 'claude-code' | 'hermes' | 'openclaw' */
14
+ agentType: string;
15
+ /** agent name */
16
+ name?: string;
17
+ /** Server WebSocket URL (agent 独立连接) */
18
+ serverUrl: string;
19
+ /** Agent API key */
20
+ apiKey: string;
21
+ /** Working directory */
22
+ workDir?: string;
23
+ /** Adapter-specific config */
24
+ adapterConfig?: Record<string, unknown>;
25
+ }
26
+ export interface AgentStopPayload {
27
+ agentId: string;
28
+ }
29
+ interface ManagedAgent {
30
+ agentId: string;
31
+ adapter: AgentAdapter;
32
+ client: WinMatrixAgentClient;
33
+ abortController: AbortController | null;
34
+ busy: boolean;
35
+ workDir?: string;
36
+ }
37
+ export interface TaskAuditEntry {
38
+ /** 本机本地时间(与 Daemon 日志行一致),非 UTC */
39
+ ts: string;
40
+ agentId: string;
41
+ taskId: string;
42
+ event: 'task_start' | 'task_complete' | 'task_error' | 'task_fail';
43
+ detail?: string;
44
+ }
45
+ export declare class AgentProcessManager {
46
+ private readonly agents;
47
+ private readonly registry;
48
+ private readonly taskAudit;
49
+ private static readonly TASK_AUDIT_MAX;
50
+ private onProfilesChanged;
51
+ constructor(registry?: AdapterRegistry);
52
+ /** Set callback invoked when agent profiles change (create/destroy/rescan) */
53
+ setOnProfilesChanged(fn: () => void): void;
54
+ private recordTaskAudit;
55
+ /**
56
+ * 遍历所有 managed agents,收集其 tools/skills/toolCategories 统一上报。
57
+ * 返回深拷贝的 profiles,确保修改原 meta 不影响已收集的数据。
58
+ */
59
+ collectAgentProfiles(): Promise<AgentProfile[]>;
60
+ /**
61
+ * 重新扫描所有 agent 的 skill 目录并触发立即心跳上报。
62
+ * 用于诊断页面的「刷新技能」按钮手动触发。
63
+ */
64
+ rescanAndReportProfiles(): Promise<void>;
65
+ /**
66
+ * 创建 Agent 连接并启动 adapter。
67
+ *
68
+ * 每个 agent 拥有独立的 WinMatrixAgentClient + WebSocket 连接。
69
+ */
70
+ createAgent(payload: AgentCreatePayload): Promise<{
71
+ ok: true;
72
+ agent: ManagedAgent;
73
+ } | {
74
+ ok: false;
75
+ error: string;
76
+ }>;
77
+ /**
78
+ * 停止 Agent — 取消正在执行的任务,断开连接。
79
+ */
80
+ stopAgent(payload: AgentStopPayload): Promise<{
81
+ ok: true;
82
+ } | {
83
+ ok: false;
84
+ error: string;
85
+ }>;
86
+ /** 停止所有 Agent(shutdown 时调用) */
87
+ stopAllAgents(): Promise<void>;
88
+ /** 列出当前运行的 Agent */
89
+ listAgents(): Array<{
90
+ agentId: string;
91
+ state: string;
92
+ }>;
93
+ /** 最近一段时间接受/完成的任务(内存环,供本机诊断页) */
94
+ getRecentTaskEvents(): TaskAuditEntry[];
95
+ /** 检查 Agent 是否在运行 */
96
+ isRunning(agentId: string): boolean;
97
+ }
98
+ export {};
99
+ //# sourceMappingURL=AgentProcessManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentProcessManager.d.ts","sourceRoot":"","sources":["../../src/core/AgentProcessManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,oBAAoB,EACpB,eAAe,EAEf,KAAK,YAAY,EAEjB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAM9B,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,GAAG,eAAe,GAAG,YAAY,GAAG,WAAW,CAAC;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAO;IAC7C,OAAO,CAAC,iBAAiB,CAA6B;gBAE1C,QAAQ,CAAC,EAAE,eAAe;IAItC,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI1C,OAAO,CAAC,eAAe;IAOvB;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmBrD;;;OAGG;IACG,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAc9C;;;;OAIG;IACG,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAoLzH;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA2BhG,+BAA+B;IACzB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAepC,oBAAoB;IACpB,UAAU,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAOvD,iCAAiC;IACjC,mBAAmB,IAAI,cAAc,EAAE;IAIvC,qBAAqB;IACrB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAGpC"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * WinMatrix Daemon - Agent Process Manager (v2)
3
+ *
4
+ * 管理外部 Agent 适配器实例生命周期。
5
+ * 收到 server 的 agent.create / agent.stop 信令后,
6
+ * 实例化对应的 AgentAdapter 并创建 WinMatrixAgentClient 连接。
7
+ *
8
+ * 方案 B:adapter 在 daemon 进程内直接运行,不再 spawn 子进程。
9
+ */
10
+ import { WinMatrixAgentClient, getGlobalRegistry, } from '@winmatrix/agent-sdk';
11
+ import { formatDaemonLocalTimestamp } from './DaemonFileLogger.js';
12
+ /* ── Manager Class ── */
13
+ export class AgentProcessManager {
14
+ agents = new Map();
15
+ registry;
16
+ taskAudit = [];
17
+ static TASK_AUDIT_MAX = 120;
18
+ onProfilesChanged = null;
19
+ constructor(registry) {
20
+ this.registry = registry ?? getGlobalRegistry();
21
+ }
22
+ /** Set callback invoked when agent profiles change (create/destroy/rescan) */
23
+ setOnProfilesChanged(fn) {
24
+ this.onProfilesChanged = fn;
25
+ }
26
+ recordTaskAudit(entry) {
27
+ this.taskAudit.push(entry);
28
+ if (this.taskAudit.length > AgentProcessManager.TASK_AUDIT_MAX) {
29
+ this.taskAudit.splice(0, this.taskAudit.length - AgentProcessManager.TASK_AUDIT_MAX);
30
+ }
31
+ }
32
+ /**
33
+ * 遍历所有 managed agents,收集其 tools/skills/toolCategories 统一上报。
34
+ * 返回深拷贝的 profiles,确保修改原 meta 不影响已收集的数据。
35
+ */
36
+ async collectAgentProfiles() {
37
+ const profiles = [];
38
+ for (const [agentId, agent] of this.agents) {
39
+ profiles.push({
40
+ agentId,
41
+ agentType: agent.adapter.meta.agentType,
42
+ // 深拷贝 tools 数组
43
+ tools: [...agent.adapter.meta.tools],
44
+ // 深拷贝 skills 数组及其内部对象
45
+ skills: agent.adapter.meta.skills.map(s => ({ ...s })),
46
+ // 深拷贝 toolCategories 及其内部数组
47
+ toolCategories: Object.fromEntries(Object.entries(agent.adapter.meta.toolCategories).map(([k, v]) => [k, [...v]])),
48
+ });
49
+ }
50
+ return profiles;
51
+ }
52
+ /**
53
+ * 重新扫描所有 agent 的 skill 目录并触发立即心跳上报。
54
+ * 用于诊断页面的「刷新技能」按钮手动触发。
55
+ */
56
+ async rescanAndReportProfiles() {
57
+ for (const [, agent] of this.agents) {
58
+ if (agent.adapter.discoverSkills) {
59
+ try {
60
+ const skills = await agent.adapter.discoverSkills({ workDir: agent.workDir });
61
+ agent.adapter.meta.skills.splice(0, agent.adapter.meta.skills.length, ...skills);
62
+ }
63
+ catch {
64
+ // best-effort
65
+ }
66
+ }
67
+ }
68
+ this.onProfilesChanged?.();
69
+ }
70
+ /**
71
+ * 创建 Agent 连接并启动 adapter。
72
+ *
73
+ * 每个 agent 拥有独立的 WinMatrixAgentClient + WebSocket 连接。
74
+ */
75
+ async createAgent(payload) {
76
+ if (this.agents.has(payload.agentId)) {
77
+ return { ok: false, error: `Agent ${payload.agentId} is already running` };
78
+ }
79
+ if (!this.registry.has(payload.agentType)) {
80
+ return { ok: false, error: `Unknown agent type: ${payload.agentType}. Registered: ${this.registry.listTypes().join(', ')}` };
81
+ }
82
+ const adapter = this.registry.create(payload.agentType, payload.adapterConfig);
83
+ const client = new WinMatrixAgentClient({
84
+ url: payload.serverUrl,
85
+ apiKey: payload.apiKey,
86
+ agentId: payload.agentId,
87
+ name: payload.name ?? payload.agentType,
88
+ agentType: payload.agentType,
89
+ capabilities: adapter.meta.capabilities,
90
+ autoReconnect: true,
91
+ sessionQueryHandler: async (method, params) => {
92
+ if (method === 'session.list') {
93
+ return adapter.listSessions?.(params) ?? { sessions: [], total: 0 };
94
+ }
95
+ if (method === 'session.get') {
96
+ const p = params;
97
+ return adapter.getSession?.(p.sessionId, p) ?? { sessionId: p.sessionId, title: 'N/A', createdAt: '', updatedAt: '' };
98
+ }
99
+ throw new Error(`Unsupported session method: ${method}`);
100
+ },
101
+ });
102
+ const managed = {
103
+ agentId: payload.agentId,
104
+ adapter,
105
+ client,
106
+ abortController: null,
107
+ busy: false,
108
+ workDir: payload.workDir,
109
+ };
110
+ // Handle task.assign
111
+ client.on('task', (async (taskInput) => {
112
+ const task = taskInput;
113
+ if (managed.busy) {
114
+ this.recordTaskAudit({
115
+ ts: formatDaemonLocalTimestamp(),
116
+ agentId: payload.agentId,
117
+ taskId: task.taskId,
118
+ event: 'task_fail',
119
+ detail: 'AGENT_BUSY',
120
+ });
121
+ client.sendFrame({
122
+ type: 'event',
123
+ event: 'task.error',
124
+ payload: { taskId: task.taskId, error: 'Agent busy', code: 'AGENT_BUSY' },
125
+ });
126
+ return;
127
+ }
128
+ managed.busy = true;
129
+ console.log(`[agent:${payload.agentId}] task start taskId=${task.taskId} inputLength=${task.input.length}`);
130
+ this.recordTaskAudit({
131
+ ts: formatDaemonLocalTimestamp(),
132
+ agentId: payload.agentId,
133
+ taskId: task.taskId,
134
+ event: 'task_start',
135
+ detail: `inputLength=${task.input.length}`,
136
+ });
137
+ const abortController = new AbortController();
138
+ managed.abortController = abortController;
139
+ try {
140
+ for await (const event of adapter.execute({
141
+ taskId: task.taskId,
142
+ input: task.input,
143
+ mode: 'session',
144
+ workDir: payload.workDir ?? task.workDir,
145
+ systemPrompt: task.systemPrompt,
146
+ mcpToken: task.mcpToken,
147
+ }, abortController.signal)) {
148
+ switch (event.type) {
149
+ case 'delta':
150
+ client.streamDelta(task.taskId, event.content);
151
+ break;
152
+ case 'thinking':
153
+ client.streamDelta(task.taskId, `[思考] ${event.content}`);
154
+ break;
155
+ case 'tool_call': {
156
+ try {
157
+ await client.callTool(event.name, event.args, task.taskId);
158
+ }
159
+ catch (err) {
160
+ console.error(`[agent:${payload.agentId}] tool call failed tool=${event.name} error=${err instanceof Error ? err.message : String(err)}`);
161
+ }
162
+ break;
163
+ }
164
+ case 'result':
165
+ client.completeTask(task.taskId, event.content, event.sessionId, event.usage);
166
+ console.log(`[agent:${payload.agentId}] task complete taskId=${task.taskId} sessionId=${event.sessionId ?? '-'}`);
167
+ this.recordTaskAudit({
168
+ ts: formatDaemonLocalTimestamp(),
169
+ agentId: payload.agentId,
170
+ taskId: task.taskId,
171
+ event: 'task_complete',
172
+ detail: `sessionId=${event.sessionId ?? '-'}`,
173
+ });
174
+ return;
175
+ case 'error':
176
+ client.failTask(task.taskId, event.message);
177
+ console.error(`[agent:${payload.agentId}] task error taskId=${task.taskId} error=${event.message}`);
178
+ this.recordTaskAudit({
179
+ ts: formatDaemonLocalTimestamp(),
180
+ agentId: payload.agentId,
181
+ taskId: task.taskId,
182
+ event: 'task_error',
183
+ detail: event.message,
184
+ });
185
+ return;
186
+ }
187
+ }
188
+ }
189
+ catch (err) {
190
+ const msg = err instanceof Error ? err.message : String(err);
191
+ try {
192
+ client.failTask(task.taskId, msg);
193
+ }
194
+ catch (notifyErr) {
195
+ /* ignore - best effort notification */
196
+ }
197
+ console.error(`[agent:${payload.agentId}] task failed taskId=${task.taskId} error=${msg}`);
198
+ this.recordTaskAudit({
199
+ ts: formatDaemonLocalTimestamp(),
200
+ agentId: payload.agentId,
201
+ taskId: task.taskId,
202
+ event: 'task_fail',
203
+ detail: msg,
204
+ });
205
+ }
206
+ finally {
207
+ managed.abortController = null;
208
+ managed.busy = false;
209
+ }
210
+ }));
211
+ // Connect
212
+ try {
213
+ await client.connect();
214
+ }
215
+ catch (err) {
216
+ const msg = err instanceof Error ? err.message : String(err);
217
+ return { ok: false, error: `Agent ${payload.agentId} connection failed: ${msg}` };
218
+ }
219
+ this.agents.set(payload.agentId, managed);
220
+ console.log(`[daemon] Agent ${payload.agentId} connected (type: ${payload.agentType})`);
221
+ // Discover skills on creation and write to adapter meta
222
+ if (adapter.discoverSkills) {
223
+ try {
224
+ const skills = await adapter.discoverSkills({ workDir: payload.workDir });
225
+ adapter.meta.skills.splice(0, adapter.meta.skills.length, ...skills);
226
+ }
227
+ catch {
228
+ // best-effort
229
+ }
230
+ }
231
+ // Notify profile change
232
+ this.onProfilesChanged?.();
233
+ return { ok: true, agent: managed };
234
+ }
235
+ /**
236
+ * 停止 Agent — 取消正在执行的任务,断开连接。
237
+ */
238
+ async stopAgent(payload) {
239
+ const agent = this.agents.get(payload.agentId);
240
+ if (!agent) {
241
+ return { ok: false, error: `Agent ${payload.agentId} is not running` };
242
+ }
243
+ // Cancel running task
244
+ if (agent.abortController) {
245
+ agent.abortController.abort();
246
+ }
247
+ // Disconnect
248
+ try {
249
+ await agent.client.disconnect();
250
+ }
251
+ catch {
252
+ // Best-effort
253
+ }
254
+ this.agents.delete(payload.agentId);
255
+ console.log(`[daemon] Agent ${payload.agentId} stopped`);
256
+ // Notify profile change
257
+ this.onProfilesChanged?.();
258
+ return { ok: true };
259
+ }
260
+ /** 停止所有 Agent(shutdown 时调用) */
261
+ async stopAllAgents() {
262
+ for (const [agentId, agent] of this.agents) {
263
+ try {
264
+ if (agent.abortController) {
265
+ agent.abortController.abort();
266
+ }
267
+ await agent.client.disconnect();
268
+ console.log(`[daemon] Agent ${agentId} stopped during shutdown`);
269
+ }
270
+ catch {
271
+ // Best-effort
272
+ }
273
+ }
274
+ this.agents.clear();
275
+ }
276
+ /** 列出当前运行的 Agent */
277
+ listAgents() {
278
+ return [...this.agents.values()].map((a) => ({
279
+ agentId: a.agentId,
280
+ state: a.client.getState(),
281
+ }));
282
+ }
283
+ /** 最近一段时间接受/完成的任务(内存环,供本机诊断页) */
284
+ getRecentTaskEvents() {
285
+ return [...this.taskAudit];
286
+ }
287
+ /** 检查 Agent 是否在运行 */
288
+ isRunning(agentId) {
289
+ return this.agents.has(agentId);
290
+ }
291
+ }
292
+ //# sourceMappingURL=AgentProcessManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentProcessManager.js","sourceRoot":"","sources":["../../src/core/AgentProcessManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * WinMatrix Daemon - Config Loader
3
+ *
4
+ * Loads configuration from ~/.winmatrix/daemon.json, CLI arguments, and environment variables.
5
+ * Optional field `computerToken` in daemon.json holds the Computer token (wmc_...) for restart
6
+ * without re-exporting WINMATRIX_TOKEN. Use `--persist-token` once to write CLI/env token to disk.
7
+ */
8
+ export interface DaemonConfig {
9
+ serverUrl: string;
10
+ token: string;
11
+ /** 指示 token 来源:CLI / 环境变量 / 配置文件 */
12
+ tokenSource?: 'token' | 'env' | 'file';
13
+ }
14
+ interface DaemonJsonFile {
15
+ serverUrl?: string;
16
+ /** Computer registration token (wmc_...). Legacy alias: `token` */
17
+ computerToken?: string;
18
+ token?: string;
19
+ }
20
+ /** Options after parsing argv (run / restart) */
21
+ export interface DaemonStartupOptions {
22
+ config: DaemonConfig;
23
+ /** 若 true 且在解析后 token 非空,将把 serverUrl + computerToken 写入 daemon.json */
24
+ persistCredentials: boolean;
25
+ }
26
+ /** 默认 WinMatrix 外部 Agent WebSocket 地址(与文档一致) */
27
+ export declare const DEFAULT_DAEMON_SERVER_URL = "ws://localhost:8400/api/v1/external-agents/connect";
28
+ /**
29
+ * 规范化 Daemon WebSocket 地址:
30
+ * - 纠正常见笔误 `ws://http://host` → `ws://host`
31
+ * - 将 `http(s)://` API 基址转为 `ws(s)://` 并补全路径(若未包含 connect 路径)
32
+ * - `ws(s)://host:port` 无路径时补全默认 connect 路径
33
+ */
34
+ export declare function normalizeDaemonServerUrl(input: string): string;
35
+ /** 供 setup / 运维脚本使用 */
36
+ export declare function getDaemonConfigFilePath(): string;
37
+ /** 控制台用短路径标签(POSIX 语义:~/...),与配置文件实际读取路径一致。 */
38
+ export declare function getDaemonConfigPathLabel(): string;
39
+ /**
40
+ * 判断是否已在 daemon.json 持久化 Computer token(不涉及进程环境)。
41
+ */
42
+ export declare function describeDaemonCredentialFile(): {
43
+ pathLabel: string;
44
+ fileExists: boolean;
45
+ hasStoredComputerToken: boolean;
46
+ };
47
+ /** 从 JSON 段落读取 token(computerToken 优先,其次别名 token) */
48
+ export declare function tokenFromDaemonJsonFields(file: Partial<DaemonJsonFile>): string;
49
+ export declare function loadDaemonJson(): Partial<DaemonJsonFile>;
50
+ export declare function parseCliArgs(argv: string[]): {
51
+ server?: string;
52
+ token?: string;
53
+ tokenSource?: 'token';
54
+ persistCredentials?: boolean;
55
+ };
56
+ /**
57
+ * Resolve config + optional persistence flag for daemon startup.
58
+ *
59
+ * Token priority:
60
+ * 1. CLI (--token)
61
+ * 2. Environment (WINMATRIX_TOKEN)
62
+ * 3. Config file (~/.winmatrix/daemon.json `computerToken`, or legacy `token`)
63
+ *
64
+ * Server URL priority:
65
+ * 1. CLI (--server)
66
+ * 2. daemon.json serverUrl
67
+ * 3. Default localhost WebSocket URL
68
+ */
69
+ export declare function loadDaemonStartupOptions(argv: string[]): DaemonStartupOptions;
70
+ export declare function loadConfig(argv: string[]): DaemonConfig;
71
+ /**
72
+ * 将当前解析得到的 server URL / Computer token 写回磁盘(chmod 0600)。
73
+ * `computerToken` 为空时仅从文件改写 `serverUrl`,不删除已有 `computerToken`。
74
+ */
75
+ export declare function mergeDaemonSetupConfigToDisk(opts: {
76
+ serverUrl: string;
77
+ computerToken?: string;
78
+ }): void;
79
+ /**
80
+ * Merge server URL + Computer token into ~/.winmatrix/daemon.json (chmod 0600).
81
+ * Drops legacy JSON key `token` in favor of `computerToken`.
82
+ */
83
+ export declare function persistDaemonCredentialsToDisk(config: DaemonConfig): void;
84
+ /**
85
+ * Sanitize a config for logging (token replaced with ***).
86
+ */
87
+ export declare function sanitizeConfig(config: DaemonConfig): {
88
+ serverUrl: string;
89
+ token: string;
90
+ };
91
+ export {};
92
+ //# sourceMappingURL=ConfigLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/core/ConfigLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,WAAW,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;CACxC;AAED,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,wEAAwE;IACxE,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAOD,gDAAgD;AAChD,eAAO,MAAM,yBAAyB,uDAAuD,CAAC;AAI9F;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA4B9D;AAYD,uBAAuB;AACvB,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,+CAA+C;AAC/C,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB,EAAE,OAAO,CAAC;CACjC,CAKA;AAED,qDAAqD;AACrD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM,CAG/E;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,CAexD;AA2BD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAuBA;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,oBAAoB,CA+B7E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAEvD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,IAAI,CAmBP;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAgBzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKzF"}