awb-agent-manager 1.0.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 (154) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +246 -0
  3. package/dist/lib/agent-lockfile.d.ts +37 -0
  4. package/dist/lib/agent-lockfile.js +205 -0
  5. package/dist/lib/agent-lockfile.js.map +1 -0
  6. package/dist/lib/agent-manager-commands.d.ts +34 -0
  7. package/dist/lib/agent-manager-commands.js +531 -0
  8. package/dist/lib/agent-manager-commands.js.map +1 -0
  9. package/dist/lib/base-session-manager.d.ts +127 -0
  10. package/dist/lib/base-session-manager.js +667 -0
  11. package/dist/lib/base-session-manager.js.map +1 -0
  12. package/dist/lib/chat-attachment-prep.d.ts +35 -0
  13. package/dist/lib/chat-attachment-prep.js +180 -0
  14. package/dist/lib/chat-attachment-prep.js.map +1 -0
  15. package/dist/lib/chat-session-manager.d.ts +29 -0
  16. package/dist/lib/chat-session-manager.js +400 -0
  17. package/dist/lib/chat-session-manager.js.map +1 -0
  18. package/dist/lib/circuit-breaker.d.ts +34 -0
  19. package/dist/lib/circuit-breaker.js +146 -0
  20. package/dist/lib/circuit-breaker.js.map +1 -0
  21. package/dist/lib/cli-adapters/antigravity.d.ts +15 -0
  22. package/dist/lib/cli-adapters/antigravity.js +114 -0
  23. package/dist/lib/cli-adapters/antigravity.js.map +1 -0
  24. package/dist/lib/cli-adapters/base.d.ts +115 -0
  25. package/dist/lib/cli-adapters/base.js +111 -0
  26. package/dist/lib/cli-adapters/base.js.map +1 -0
  27. package/dist/lib/cli-adapters/claude.d.ts +19 -0
  28. package/dist/lib/cli-adapters/claude.js +233 -0
  29. package/dist/lib/cli-adapters/claude.js.map +1 -0
  30. package/dist/lib/cli-adapters/codex.d.ts +14 -0
  31. package/dist/lib/cli-adapters/codex.js +152 -0
  32. package/dist/lib/cli-adapters/codex.js.map +1 -0
  33. package/dist/lib/cli-adapters/deepseek.d.ts +15 -0
  34. package/dist/lib/cli-adapters/deepseek.js +70 -0
  35. package/dist/lib/cli-adapters/deepseek.js.map +1 -0
  36. package/dist/lib/cli-adapters/index.d.ts +8 -0
  37. package/dist/lib/cli-adapters/index.js +27 -0
  38. package/dist/lib/cli-adapters/index.js.map +1 -0
  39. package/dist/lib/cli-adapters/model-introspect.d.ts +3 -0
  40. package/dist/lib/cli-adapters/model-introspect.js +65 -0
  41. package/dist/lib/cli-adapters/model-introspect.js.map +1 -0
  42. package/dist/lib/cli-error-signatures.d.ts +9 -0
  43. package/dist/lib/cli-error-signatures.js +22 -0
  44. package/dist/lib/cli-error-signatures.js.map +1 -0
  45. package/dist/lib/cli-output-summary.d.ts +2 -0
  46. package/dist/lib/cli-output-summary.js +104 -0
  47. package/dist/lib/cli-output-summary.js.map +1 -0
  48. package/dist/lib/cli-resolver.d.ts +2 -0
  49. package/dist/lib/cli-resolver.js +177 -0
  50. package/dist/lib/cli-resolver.js.map +1 -0
  51. package/dist/lib/config.d.ts +13 -0
  52. package/dist/lib/config.js +124 -0
  53. package/dist/lib/config.js.map +1 -0
  54. package/dist/lib/constants.d.ts +36 -0
  55. package/dist/lib/constants.js +51 -0
  56. package/dist/lib/constants.js.map +1 -0
  57. package/dist/lib/environment-provisioner.d.ts +31 -0
  58. package/dist/lib/environment-provisioner.js +182 -0
  59. package/dist/lib/environment-provisioner.js.map +1 -0
  60. package/dist/lib/error-log-uploader.d.ts +19 -0
  61. package/dist/lib/error-log-uploader.js +138 -0
  62. package/dist/lib/error-log-uploader.js.map +1 -0
  63. package/dist/lib/event-dispatcher.d.ts +149 -0
  64. package/dist/lib/event-dispatcher.js +799 -0
  65. package/dist/lib/event-dispatcher.js.map +1 -0
  66. package/dist/lib/event-log-recorder.d.ts +11 -0
  67. package/dist/lib/event-log-recorder.js +77 -0
  68. package/dist/lib/event-log-recorder.js.map +1 -0
  69. package/dist/lib/event-stream.d.ts +26 -0
  70. package/dist/lib/event-stream.js +177 -0
  71. package/dist/lib/event-stream.js.map +1 -0
  72. package/dist/lib/fs-browser.d.ts +30 -0
  73. package/dist/lib/fs-browser.js +287 -0
  74. package/dist/lib/fs-browser.js.map +1 -0
  75. package/dist/lib/host-mcp/logs.d.ts +19 -0
  76. package/dist/lib/host-mcp/logs.js +102 -0
  77. package/dist/lib/host-mcp/logs.js.map +1 -0
  78. package/dist/lib/host-mcp/platform.d.ts +24 -0
  79. package/dist/lib/host-mcp/platform.js +133 -0
  80. package/dist/lib/host-mcp/platform.js.map +1 -0
  81. package/dist/lib/host-mcp/screens.d.ts +22 -0
  82. package/dist/lib/host-mcp/screens.js +172 -0
  83. package/dist/lib/host-mcp/screens.js.map +1 -0
  84. package/dist/lib/host-mcp/server.d.ts +3 -0
  85. package/dist/lib/host-mcp/server.js +233 -0
  86. package/dist/lib/host-mcp/server.js.map +1 -0
  87. package/dist/lib/host-mcp/tools.d.ts +172 -0
  88. package/dist/lib/host-mcp/tools.js +1241 -0
  89. package/dist/lib/host-mcp/tools.js.map +1 -0
  90. package/dist/lib/instance-heartbeat.d.ts +55 -0
  91. package/dist/lib/instance-heartbeat.js +118 -0
  92. package/dist/lib/instance-heartbeat.js.map +1 -0
  93. package/dist/lib/legacy-import.d.ts +17 -0
  94. package/dist/lib/legacy-import.js +70 -0
  95. package/dist/lib/legacy-import.js.map +1 -0
  96. package/dist/lib/logging.d.ts +3 -0
  97. package/dist/lib/logging.js +65 -0
  98. package/dist/lib/logging.js.map +1 -0
  99. package/dist/lib/managed-agent-context.d.ts +25 -0
  100. package/dist/lib/managed-agent-context.js +33 -0
  101. package/dist/lib/managed-agent-context.js.map +1 -0
  102. package/dist/lib/managed-agent-store.d.ts +34 -0
  103. package/dist/lib/managed-agent-store.js +160 -0
  104. package/dist/lib/managed-agent-store.js.map +1 -0
  105. package/dist/lib/managed-agents.d.ts +24 -0
  106. package/dist/lib/managed-agents.js +87 -0
  107. package/dist/lib/managed-agents.js.map +1 -0
  108. package/dist/lib/mcp-client.d.ts +8 -0
  109. package/dist/lib/mcp-client.js +122 -0
  110. package/dist/lib/mcp-client.js.map +1 -0
  111. package/dist/lib/orphan-cleanup.d.ts +6 -0
  112. package/dist/lib/orphan-cleanup.js +108 -0
  113. package/dist/lib/orphan-cleanup.js.map +1 -0
  114. package/dist/lib/presence-heartbeat.d.ts +8 -0
  115. package/dist/lib/presence-heartbeat.js +61 -0
  116. package/dist/lib/presence-heartbeat.js.map +1 -0
  117. package/dist/lib/prompts.d.ts +29 -0
  118. package/dist/lib/prompts.js +208 -0
  119. package/dist/lib/prompts.js.map +1 -0
  120. package/dist/lib/rest.d.ts +61 -0
  121. package/dist/lib/rest.js +307 -0
  122. package/dist/lib/rest.js.map +1 -0
  123. package/dist/lib/run-provisioner.d.ts +21 -0
  124. package/dist/lib/run-provisioner.js +115 -0
  125. package/dist/lib/run-provisioner.js.map +1 -0
  126. package/dist/lib/self-path.d.ts +7 -0
  127. package/dist/lib/self-path.js +29 -0
  128. package/dist/lib/self-path.js.map +1 -0
  129. package/dist/lib/self-update.d.ts +46 -0
  130. package/dist/lib/self-update.js +482 -0
  131. package/dist/lib/self-update.js.map +1 -0
  132. package/dist/lib/service-install.d.ts +23 -0
  133. package/dist/lib/service-install.js +673 -0
  134. package/dist/lib/service-install.js.map +1 -0
  135. package/dist/lib/setup.d.ts +16 -0
  136. package/dist/lib/setup.js +157 -0
  137. package/dist/lib/setup.js.map +1 -0
  138. package/dist/lib/subagent-manager.d.ts +84 -0
  139. package/dist/lib/subagent-manager.js +793 -0
  140. package/dist/lib/subagent-manager.js.map +1 -0
  141. package/dist/lib/subagent-monitor.d.ts +43 -0
  142. package/dist/lib/subagent-monitor.js +229 -0
  143. package/dist/lib/subagent-monitor.js.map +1 -0
  144. package/dist/lib/ticket-session-manager.d.ts +23 -0
  145. package/dist/lib/ticket-session-manager.js +471 -0
  146. package/dist/lib/ticket-session-manager.js.map +1 -0
  147. package/dist/lib/worktree-manager.d.ts +39 -0
  148. package/dist/lib/worktree-manager.js +226 -0
  149. package/dist/lib/worktree-manager.js.map +1 -0
  150. package/dist/main.d.ts +2 -0
  151. package/dist/main.js +670 -0
  152. package/dist/main.js.map +1 -0
  153. package/dist/package.json +57 -0
  154. package/package.json +57 -0
@@ -0,0 +1,531 @@
1
+ import { log } from './logging.js';
2
+ import { postCommandAck, fetchAgentRecord, fetchAgentCredential, provisionManagedAgentApiKey, requestManagerTriggerRepush, } from './rest.js';
3
+ import { ensureManagedAgentDir, readApiKey, writeApiKey, writeMcpConfig, writeManagedAgentConfig, writeAgentCredential, eraseAgentCredential, subagentLogPathFor, cliHomeDirFor, ensureCliHomeDir, eraseSecrets, maskKey, } from './managed-agent-store.js';
4
+ import { createAdapter } from './cli-adapters/index.js';
5
+ import { runSelfUpdate, restartManager } from './self-update.js';
6
+ const REQUIRED_CREDENTIAL_FIELDS = {
7
+ claude_subscription: ['credentials_json'],
8
+ claude_api_key: ['api_key'],
9
+ claude_oauth_token: ['oauth_token'],
10
+ deepseek_api_key: ['api_key'],
11
+ codex_subscription: ['auth_json'],
12
+ codex_api_key: ['api_key'],
13
+ antigravity_subscription: ['oauth_creds_json'],
14
+ antigravity_api_key: ['api_key'],
15
+ };
16
+ const KNOWN_COMMANDS = new Set([
17
+ 'spawn_agent',
18
+ 'stop_agent',
19
+ 'restart_agent',
20
+ 'restart_all_agents',
21
+ 'set_working_dir',
22
+ 'reload_config',
23
+ 'update_plugins',
24
+ 'refresh_mcp_config',
25
+ 'pull_working_dir',
26
+ 'update_manager',
27
+ 'restart_manager',
28
+ ]);
29
+ export class AgentManagerCommandHandler {
30
+ #config;
31
+ #deps;
32
+ constructor(config, deps) {
33
+ this.#config = config;
34
+ this.#deps = deps;
35
+ }
36
+ async handle(raw) {
37
+ let payload;
38
+ try {
39
+ payload = JSON.parse(raw);
40
+ }
41
+ catch (err) {
42
+ log(`agent_manager_command: parse failed: ${err?.message ?? err}`);
43
+ return;
44
+ }
45
+ if (!payload?.command_id) {
46
+ log('agent_manager_command: missing command_id — dropped');
47
+ return;
48
+ }
49
+ const myInstanceId = this.#deps.getInstanceId();
50
+ if (myInstanceId && payload.instance_id && payload.instance_id !== myInstanceId) {
51
+ return;
52
+ }
53
+ const command = String(payload.command || '');
54
+ if (!KNOWN_COMMANDS.has(command)) {
55
+ log(`agent_manager_command: unknown command "${command}" id=${payload.command_id}`);
56
+ await postCommandAck(this.#config, payload.command_id, 'error', `unknown command: ${command}`);
57
+ return;
58
+ }
59
+ try {
60
+ const result = await this.#dispatch(command, payload);
61
+ await postCommandAck(this.#config, payload.command_id, 'ok', result);
62
+ log(`agent_manager_command ${command} id=${payload.command_id} → ${result}`);
63
+ }
64
+ catch (err) {
65
+ const detail = err?.message ?? String(err);
66
+ log(`agent_manager_command ${command} id=${payload.command_id} FAILED: ${detail}`);
67
+ await postCommandAck(this.#config, payload.command_id, 'error', detail);
68
+ }
69
+ }
70
+ async #dispatch(command, payload) {
71
+ switch (command) {
72
+ case 'spawn_agent':
73
+ return this.#spawnAgent(payload);
74
+ case 'stop_agent':
75
+ return this.#stopAgent(payload);
76
+ case 'restart_agent':
77
+ return this.#restartAgent(payload);
78
+ case 'restart_all_agents':
79
+ return this.#restartAllAgents(payload);
80
+ case 'set_working_dir':
81
+ return this.#setWorkingDir(payload);
82
+ case 'reload_config':
83
+ return this.#reloadConfig();
84
+ case 'update_plugins':
85
+ return this.#updatePlugins(payload);
86
+ case 'refresh_mcp_config':
87
+ return this.#refreshMcpConfig(payload);
88
+ case 'pull_working_dir':
89
+ return this.#pullWorkingDir(payload);
90
+ case 'update_manager':
91
+ return this.#updateManager();
92
+ case 'restart_manager':
93
+ return this.#restartManager();
94
+ }
95
+ }
96
+ async #updateManager() {
97
+ const result = await runSelfUpdate({ log });
98
+ if (!result.changed) {
99
+ throw new Error(`update_manager: ${result.summary}`);
100
+ }
101
+ return `update_manager ok: ${result.summary}`;
102
+ }
103
+ async #restartManager() {
104
+ const result = await restartManager({ log });
105
+ if (!result.changed) {
106
+ throw new Error(`restart_manager: ${result.summary}`);
107
+ }
108
+ return `restart_manager ok: ${result.summary}`;
109
+ }
110
+ #targetAgentId(payload, command) {
111
+ const id = typeof payload.args?.agent_id === 'string' ? payload.args.agent_id.trim() : '';
112
+ if (!id)
113
+ throw new Error(`${command}: args.agent_id is required`);
114
+ return id;
115
+ }
116
+ async #spawnAgent(payload) {
117
+ const agentId = this.#targetAgentId(payload, 'spawn_agent');
118
+ const remote = await fetchAgentRecord(this.#config, agentId);
119
+ const name = remote?.name ?? payload.args?.name ?? agentId.slice(0, 8);
120
+ const cli = remote?.type ?? payload.args?.cli ?? 'claude';
121
+ const workingDir = remote?.working_dir || payload.args?.working_dir || '';
122
+ const model = (typeof remote?.model === 'string' && remote.model.trim()) ||
123
+ (typeof payload.args?.model === 'string' && payload.args.model.trim()) ||
124
+ '';
125
+ if (!workingDir) {
126
+ throw new Error('spawn_agent: working_dir is empty — set it before spawning');
127
+ }
128
+ const rec = this.#deps.registry.upsert({ agent_id: agentId, name, cli, working_dir: workingDir });
129
+ rec.status = 'spawning';
130
+ await ensureManagedAgentDir(agentId);
131
+ await writeManagedAgentConfig({
132
+ agent_id: agentId,
133
+ name,
134
+ cli,
135
+ working_dir: workingDir,
136
+ workspace_id: remote?.workspace_id || '',
137
+ model: model || null,
138
+ last_spawn_at: new Date().toISOString(),
139
+ });
140
+ let rawApiKey = await readApiKey(agentId);
141
+ let provisioned = false;
142
+ if (!rawApiKey) {
143
+ const issued = await provisionManagedAgentApiKey(this.#config, agentId);
144
+ if (!issued?.raw_key) {
145
+ throw new Error('spawn_agent: apiKey provisioning failed (server returned no key)');
146
+ }
147
+ rawApiKey = issued.raw_key;
148
+ await writeApiKey(agentId, rawApiKey);
149
+ provisioned = true;
150
+ }
151
+ const mcpConfigPath = await writeMcpConfig(agentId, this.#config.url, rawApiKey);
152
+ await ensureCliHomeDir(agentId);
153
+ const cliHomeDir = cliHomeDirFor(agentId);
154
+ const credentialIdHint = typeof payload.args?.credential_id === 'string' ? payload.args.credential_id : '';
155
+ const credential = await this.#resolveAgentCredential(agentId, cli, credentialIdHint);
156
+ if (credential) {
157
+ await writeAgentCredential(agentId, credential);
158
+ }
159
+ else {
160
+ await eraseAgentCredential(agentId);
161
+ }
162
+ let extraEnv = {};
163
+ try {
164
+ const prep = await createAdapter(cli).prepareCliHome(cliHomeDir, credential, { url: this.#config.url, apiKey: rawApiKey }, model || null);
165
+ extraEnv = prep?.extraEnv ?? {};
166
+ }
167
+ catch (err) {
168
+ log(`spawn_agent: cli-home prep failed for agent=${agentId.slice(0, 8)} cli=${cli}: ${err?.message ?? err}`);
169
+ }
170
+ if (this.#deps.contextRegistry) {
171
+ this.#deps.contextRegistry.upsert({
172
+ agent_id: agentId,
173
+ name,
174
+ cli,
175
+ working_dir: workingDir,
176
+ mcp_config_path: mcpConfigPath,
177
+ api_key: rawApiKey,
178
+ subagent_log_path: subagentLogPathFor(agentId),
179
+ cli_home_dir: cliHomeDir,
180
+ model: model || null,
181
+ extra_env: extraEnv,
182
+ credential_provider: credential?.provider ?? null,
183
+ credential_kind: credentialKind(credential),
184
+ registered_at: new Date().toISOString(),
185
+ });
186
+ }
187
+ this.#deps.registry.markRunning(agentId, process.pid);
188
+ await this.#deps.requestStreamReconnect?.();
189
+ const credentialNote = credential ? ` credential=${credential.provider}` : ' credential=none';
190
+ log(`spawn_agent: agent=${agentId.slice(0, 8)} name=${name} cli=${cli} cwd=${workingDir}` +
191
+ ` apiKey=${maskKey(rawApiKey)}${provisioned ? ' (provisioned)' : ' (reused)'}${credentialNote}`);
192
+ return (`spawn_agent ok: agent=${agentId.slice(0, 8)} cli=${cli} cwd=${workingDir}` +
193
+ ` apiKey=${provisioned ? 'provisioned' : 'reused'}${credentialNote}`);
194
+ }
195
+ async #resolveAgentCredential(agentId, cli, credentialIdHint) {
196
+ const fetched = await fetchAgentCredential(this.#config, agentId);
197
+ if (!fetched) {
198
+ if (credentialIdHint) {
199
+ log(`spawn_agent: agent=${agentId.slice(0, 8)} expected credential=${credentialIdHint.slice(0, 8)} but server returned none`);
200
+ }
201
+ return null;
202
+ }
203
+ const expectedPrefix = `${cli}_`;
204
+ if (!fetched.provider.startsWith(expectedPrefix)) {
205
+ log(`spawn_agent: agent=${agentId.slice(0, 8)} credential provider=${fetched.provider}` +
206
+ ` does not match cli=${cli}; ignoring`);
207
+ return null;
208
+ }
209
+ const required = REQUIRED_CREDENTIAL_FIELDS[fetched.provider];
210
+ if (required) {
211
+ const present = required.filter((k) => {
212
+ const v = fetched.fields?.[k];
213
+ return typeof v === 'string' && v.length > 0;
214
+ });
215
+ if (present.length === 0) {
216
+ log(`spawn_agent: agent=${agentId.slice(0, 8)} credential=${fetched.provider} ` +
217
+ `(id=${fetched.credential_id.slice(0, 8)}) has empty required field(s) ${required.join(',')} — ` +
218
+ `re-edit the credential in AWB Admin → Credentials. Falling back to operator HOME.`);
219
+ return null;
220
+ }
221
+ }
222
+ return {
223
+ credential_id: fetched.credential_id,
224
+ provider: fetched.provider,
225
+ fields: fetched.fields,
226
+ };
227
+ }
228
+ async #stopAgent(payload) {
229
+ const agentId = this.#targetAgentId(payload, 'stop_agent');
230
+ const { summary } = await this.#reapAgent(agentId, 'stop_agent command');
231
+ return summary;
232
+ }
233
+ async #reapAgent(agentId, reason) {
234
+ const hadContext = this.#deps.contextRegistry?.delete(agentId) ?? false;
235
+ const rec = this.#deps.registry.markStopped(agentId, reason);
236
+ const inflightByKey = new Map();
237
+ const captureInflight = (ticketId, role) => {
238
+ if (!ticketId)
239
+ return;
240
+ const r = role || '';
241
+ inflightByKey.set(`${ticketId}:${r}`, { ticket_id: ticketId, role: r });
242
+ };
243
+ let chatKilled = 0;
244
+ let ticketKilled = 0;
245
+ let subagentKilled = 0;
246
+ try {
247
+ const r = await this.#deps.chatSessionManager?.stopForAgent(agentId);
248
+ chatKilled = r?.count ?? 0;
249
+ for (const w of r?.inflight ?? [])
250
+ captureInflight(w.ticketId, w.role);
251
+ }
252
+ catch (err) {
253
+ log(`${reason}: chatSessionManager.stopForAgent failed: ${err?.message ?? err}`);
254
+ }
255
+ try {
256
+ const r = await this.#deps.ticketSessionManager?.stopForAgent(agentId);
257
+ ticketKilled = r?.count ?? 0;
258
+ for (const w of r?.inflight ?? [])
259
+ captureInflight(w.ticketId, w.role);
260
+ }
261
+ catch (err) {
262
+ log(`${reason}: ticketSessionManager.stopForAgent failed: ${err?.message ?? err}`);
263
+ }
264
+ try {
265
+ const r = await this.#deps.subagentManager?.stopForAgent(agentId);
266
+ subagentKilled = r?.count ?? 0;
267
+ for (const w of r?.inflight ?? [])
268
+ captureInflight(w.ticket_id, w.role);
269
+ }
270
+ catch (err) {
271
+ log(`${reason}: subagentManager.stopForAgent failed: ${err?.message ?? err}`);
272
+ }
273
+ await eraseSecrets(agentId).catch(() => undefined);
274
+ const inflight = Array.from(inflightByKey.values());
275
+ if (!rec && !hadContext && chatKilled === 0 && ticketKilled === 0 && subagentKilled === 0) {
276
+ return {
277
+ summary: `stop_agent: agent=${agentId.slice(0, 8)} not running on this manager`,
278
+ inflight,
279
+ };
280
+ }
281
+ return {
282
+ summary: `stop_agent ok: agent=${agentId.slice(0, 8)} ` +
283
+ `(context dropped, secrets erased, chat_sessions=${chatKilled} ` +
284
+ `ticket_sessions=${ticketKilled} subagents=${subagentKilled})`,
285
+ inflight,
286
+ };
287
+ }
288
+ async #restartAgent(payload) {
289
+ const agentId = this.#targetAgentId(payload, 'restart_agent');
290
+ this.#deps.circuitBreaker?.resetAgent(agentId);
291
+ let inflight = [];
292
+ try {
293
+ const reaped = await this.#reapAgent(agentId, 'restart_agent command');
294
+ inflight = reaped.inflight;
295
+ }
296
+ catch (err) {
297
+ log(`restart_agent: reap failed (continuing with respawn): ${err?.message ?? err}`);
298
+ }
299
+ const detail = await this.#spawnAgent(payload);
300
+ let resumeNote = '';
301
+ if (inflight.length > 0) {
302
+ const res = await requestManagerTriggerRepush(this.#config, agentId, inflight);
303
+ if (res) {
304
+ resumeNote = ` · resumed ${res.emitted}/${inflight.length} in-flight ticket(s)`;
305
+ }
306
+ else {
307
+ resumeNote = ` · resume re-push failed for ${inflight.length} ticket(s) (supervisor will retry)`;
308
+ }
309
+ log(`restart_agent: agent=${agentId.slice(0, 8)} re-pushed ${inflight.length} in-flight (ticket,role) — ` +
310
+ (res ? `emitted=${res.emitted} skipped=${res.skipped}` : 'transport failed'));
311
+ }
312
+ return `restart_agent → ${detail}${resumeNote}`;
313
+ }
314
+ async #restartAllAgents(payload) {
315
+ const agentIds = this.#deps.registry.liveAgentIds();
316
+ if (agentIds.length === 0) {
317
+ return 'restart_all_agents → no managed agents (no-op)';
318
+ }
319
+ let restarted = 0;
320
+ const failed = [];
321
+ for (const agentId of agentIds) {
322
+ const perAgent = {
323
+ ...payload,
324
+ args: { ...(payload.args || {}), agent_id: agentId },
325
+ };
326
+ try {
327
+ const detail = await this.#restartAgent(perAgent);
328
+ restarted++;
329
+ log(`restart_all_agents: agent=${agentId.slice(0, 8)} ok — ${detail}`);
330
+ }
331
+ catch (err) {
332
+ failed.push(agentId.slice(0, 8));
333
+ log(`restart_all_agents: agent=${agentId.slice(0, 8)} FAILED: ${err?.message ?? err}`);
334
+ }
335
+ }
336
+ const failNote = failed.length > 0 ? ` (failed: ${failed.join(', ')})` : '';
337
+ return `restart_all_agents → ${restarted} restarted, ${failed.length} failed${failNote}`;
338
+ }
339
+ async #setWorkingDir(payload) {
340
+ const agentId = this.#targetAgentId(payload, 'set_working_dir');
341
+ const workingDir = String(payload.args?.working_dir ?? '').trim();
342
+ if (!workingDir)
343
+ throw new Error('set_working_dir: working_dir is empty');
344
+ if (!this.#deps.registry.get(agentId)) {
345
+ const remote = await fetchAgentRecord(this.#config, agentId);
346
+ this.#deps.registry.upsert({
347
+ agent_id: agentId,
348
+ name: remote?.name ?? agentId.slice(0, 8),
349
+ cli: remote?.type ?? 'claude',
350
+ working_dir: workingDir,
351
+ });
352
+ }
353
+ else {
354
+ this.#deps.registry.setWorkingDir(agentId, workingDir);
355
+ }
356
+ return `set_working_dir: agent=${agentId.slice(0, 8)} cwd=${workingDir}`;
357
+ }
358
+ async #reloadConfig() {
359
+ const hook = this.#deps.reloadConfig;
360
+ if (!hook)
361
+ return 'reload_config: no reload hook wired (no-op)';
362
+ const summary = await hook();
363
+ return `reload_config: ${summary || 'reloaded'}`;
364
+ }
365
+ async #refreshMcpConfig(payload) {
366
+ const agentId = this.#targetAgentId(payload, 'refresh_mcp_config');
367
+ const rawApiKey = await readApiKey(agentId);
368
+ if (!rawApiKey) {
369
+ throw new Error(`refresh_mcp_config: no apiKey on disk for agent=${agentId.slice(0, 8)} ` +
370
+ `(spawn_agent first to provision)`);
371
+ }
372
+ const path = await writeMcpConfig(agentId, this.#config.url, rawApiKey);
373
+ return `refresh_mcp_config ok: agent=${agentId.slice(0, 8)} path=${path}`;
374
+ }
375
+ async #updatePlugins(payload) {
376
+ const agentId = this.#targetAgentId(payload, 'update_plugins');
377
+ const ctx = this.#deps.contextRegistry?.get(agentId);
378
+ if (!ctx) {
379
+ throw new Error(`update_plugins: agent=${agentId.slice(0, 8)} is not registered ` +
380
+ `(spawn_agent first so the manager owns its cli-home)`);
381
+ }
382
+ if (ctx.cli !== 'claude') {
383
+ return `update_plugins: agent=${agentId.slice(0, 8)} cli=${ctx.cli} (not applicable — claude only)`;
384
+ }
385
+ const result = await runPluginUpdate(ctx.cli_home_dir);
386
+ return (`update_plugins ok: agent=${agentId.slice(0, 8)} updated=${result.updated} ` +
387
+ `skipped=${result.skipped} failed=${result.failed}` +
388
+ (result.failed > 0 ? ` — first error: ${result.errors[0] || '(none)'}` : ''));
389
+ }
390
+ async #pullWorkingDir(payload) {
391
+ const agentId = this.#targetAgentId(payload, 'pull_working_dir');
392
+ const workingDir = String(payload.args?.working_dir ?? '').trim();
393
+ if (!workingDir) {
394
+ throw new Error('pull_working_dir: working_dir is required (server should enrich it)');
395
+ }
396
+ const result = await runGitPull(workingDir);
397
+ if (!result.ok) {
398
+ throw new Error(`pull_working_dir failed: agent=${agentId.slice(0, 8)} cwd=${workingDir} — ${result.detail}`);
399
+ }
400
+ return `pull_working_dir ok: agent=${agentId.slice(0, 8)} cwd=${workingDir} — ${result.detail}`;
401
+ }
402
+ }
403
+ function credentialKind(credential) {
404
+ if (!credential)
405
+ return 'operator_home';
406
+ if (credential.provider.endsWith('_subscription'))
407
+ return 'subscription';
408
+ if (credential.provider.endsWith('_api_key'))
409
+ return 'api_key';
410
+ if (credential.provider.endsWith('_oauth_token'))
411
+ return 'api_key';
412
+ return 'subscription';
413
+ }
414
+ async function runPluginUpdate(cliHomeDir) {
415
+ const { promises: fsp, existsSync } = await import('node:fs');
416
+ const { join } = await import('node:path');
417
+ const marketplacesDir = join(cliHomeDir, 'plugins', 'marketplaces');
418
+ if (!existsSync(marketplacesDir)) {
419
+ return { updated: 0, skipped: 0, failed: 0, errors: [] };
420
+ }
421
+ let entries;
422
+ try {
423
+ entries = await fsp.readdir(marketplacesDir);
424
+ }
425
+ catch (err) {
426
+ return { updated: 0, skipped: 0, failed: 1, errors: [err?.message ?? String(err)] };
427
+ }
428
+ let updated = 0;
429
+ let skipped = 0;
430
+ let failed = 0;
431
+ const errors = [];
432
+ for (const name of entries) {
433
+ const dir = join(marketplacesDir, name);
434
+ try {
435
+ const stat = await fsp.stat(dir);
436
+ if (!stat.isDirectory()) {
437
+ skipped++;
438
+ continue;
439
+ }
440
+ }
441
+ catch {
442
+ skipped++;
443
+ continue;
444
+ }
445
+ if (!existsSync(join(dir, '.git'))) {
446
+ skipped++;
447
+ continue;
448
+ }
449
+ const res = await runGitPull(dir);
450
+ if (res.ok) {
451
+ updated++;
452
+ }
453
+ else {
454
+ failed++;
455
+ errors.push(`${name}: ${res.detail}`);
456
+ }
457
+ }
458
+ return { updated, skipped, failed, errors };
459
+ }
460
+ async function runGitPull(dir) {
461
+ const { spawn } = await import('node:child_process');
462
+ const { existsSync } = await import('node:fs');
463
+ if (!existsSync(dir)) {
464
+ return { ok: false, detail: `directory does not exist: ${dir}` };
465
+ }
466
+ const detached = await new Promise((resolve) => {
467
+ try {
468
+ const probe = spawn('git', ['-C', dir, 'symbolic-ref', '-q', 'HEAD'], {
469
+ stdio: 'ignore',
470
+ });
471
+ probe.on('error', () => resolve(false));
472
+ probe.on('close', (code) => resolve(code !== 0));
473
+ }
474
+ catch {
475
+ resolve(false);
476
+ }
477
+ });
478
+ const gitArgs = detached ? ['fetch', '--all', '--prune'] : ['pull', '--ff-only'];
479
+ return new Promise((resolve) => {
480
+ const child = spawn('git', ['-C', dir, ...gitArgs], {
481
+ stdio: ['ignore', 'pipe', 'pipe'],
482
+ });
483
+ let stdout = '';
484
+ let stderr = '';
485
+ let settled = false;
486
+ const timer = setTimeout(() => {
487
+ if (settled)
488
+ return;
489
+ settled = true;
490
+ try {
491
+ child.kill('SIGKILL');
492
+ }
493
+ catch {
494
+ }
495
+ resolve({ ok: false, detail: 'timeout after 30s' });
496
+ }, 30_000);
497
+ child.stdout?.on('data', (b) => {
498
+ stdout += String(b);
499
+ });
500
+ child.stderr?.on('data', (b) => {
501
+ stderr += String(b);
502
+ });
503
+ child.on('error', (err) => {
504
+ if (settled)
505
+ return;
506
+ settled = true;
507
+ clearTimeout(timer);
508
+ resolve({ ok: false, detail: `spawn failed: ${err?.message ?? err}` });
509
+ });
510
+ child.on('close', (code) => {
511
+ if (settled)
512
+ return;
513
+ settled = true;
514
+ clearTimeout(timer);
515
+ const lastLine = (stderr.trim() || stdout.trim()).split('\n').filter(Boolean).pop() || '';
516
+ if (code === 0) {
517
+ const detail = detached
518
+ ? `base HEAD detached for worktree isolation — fetched origin refs${lastLine ? ` (${lastLine.slice(0, 160)})` : ''}`
519
+ : lastLine.slice(0, 200) || 'up-to-date';
520
+ resolve({ ok: true, detail });
521
+ }
522
+ else {
523
+ resolve({
524
+ ok: false,
525
+ detail: `exit=${code} ${lastLine.slice(0, 200) || '(no output)'}`,
526
+ });
527
+ }
528
+ });
529
+ });
530
+ }
531
+ //# sourceMappingURL=agent-manager-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-manager-commands.js","sourceRoot":"","sources":["../../src/lib/agent-manager-commands.ts"],"names":[],"mappings":"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"}