autodev-cli 1.4.126 → 1.4.128
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/cli.js +2 -0
- package/out/cli.js.map +1 -1
- package/out/commands/office.d.ts +2 -0
- package/out/commands/office.js +399 -0
- package/out/commands/office.js.map +1 -0
- package/package.json +1 -1
package/out/cli.js
CHANGED
|
@@ -47,6 +47,7 @@ const tailOutput_1 = require("./commands/tailOutput");
|
|
|
47
47
|
const export_1 = require("./commands/export");
|
|
48
48
|
const import_1 = require("./commands/import");
|
|
49
49
|
const mcpOperate_1 = require("./commands/mcpOperate");
|
|
50
|
+
const office_1 = require("./commands/office");
|
|
50
51
|
const connect_2 = require("./connect");
|
|
51
52
|
const logger_1 = require("./logger");
|
|
52
53
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
@@ -122,6 +123,7 @@ const program = new commander_1.Command()
|
|
|
122
123
|
(0, export_1.exportCommand)(program);
|
|
123
124
|
(0, import_1.importCommand)(program);
|
|
124
125
|
(0, mcpOperate_1.mcpOperateCommand)(program);
|
|
126
|
+
(0, office_1.officeCommand)(program);
|
|
125
127
|
program.parseAsync(process.argv).catch((err) => {
|
|
126
128
|
console.error(err.message);
|
|
127
129
|
process.exit(1);
|
package/out/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.officeCommand = officeCommand;
|
|
37
|
+
const os = __importStar(require("os"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const http = __importStar(require("http"));
|
|
41
|
+
const https = __importStar(require("https"));
|
|
42
|
+
const url_1 = require("url");
|
|
43
|
+
const child_process_1 = require("child_process");
|
|
44
|
+
const logger_1 = require("../logger");
|
|
45
|
+
const connect_1 = require("../connect");
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// `autodev office <slug>` — run a WHOLE office with one command.
|
|
48
|
+
//
|
|
49
|
+
// A non-technical user creates an office (with N characters) in the pixel-office
|
|
50
|
+
// web UI, then runs `autodev office <slug>` here. This THIN orchestration layer:
|
|
51
|
+
// 1. lists the office's characters via the pixel-office HTTP API,
|
|
52
|
+
// 2. for each character, fetches its per-agent credentials and binds a
|
|
53
|
+
// dedicated workspace with the EXISTING single-agent machinery
|
|
54
|
+
// (`applyWsUrl`, the same code path `autodev connect --url` uses), then
|
|
55
|
+
// 3. spawns the EXISTING `autodev start` loop as a child process per
|
|
56
|
+
// character (the loop is a blocking singleton — one loop = one process).
|
|
57
|
+
//
|
|
58
|
+
// A lightweight watcher re-lists the office every N seconds and auto-starts any
|
|
59
|
+
// NEW character that appears later in the web — so agents created after launch
|
|
60
|
+
// just come online with no extra command. Ctrl-C stops every spawned loop.
|
|
61
|
+
//
|
|
62
|
+
// No new binding/loop logic is invented here; this is pure orchestration over
|
|
63
|
+
// existing pieces.
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// Office rows store a provider FAMILY name ('grok'/'claude') OR a full variant.
|
|
66
|
+
// `autodev start -p` needs a VALID id — the bare family is rejected ("Unknown
|
|
67
|
+
// provider"), so normalise it. Mirrors toAutodevProvider in the desktop app
|
|
68
|
+
// (autodev-app/src/main/pixelOffice.ts).
|
|
69
|
+
const VALID_PROVIDERS = new Set([
|
|
70
|
+
'claude-cli', 'claude-tui', 'copilot-cli', 'copilot-sdk',
|
|
71
|
+
'opencode-cli', 'opencode-sdk', 'grok-cli', 'grok-tui',
|
|
72
|
+
]);
|
|
73
|
+
function toAutodevProvider(provider) {
|
|
74
|
+
const p = String(provider ?? '').trim();
|
|
75
|
+
if (VALID_PROVIDERS.has(p)) {
|
|
76
|
+
return p;
|
|
77
|
+
}
|
|
78
|
+
const l = p.toLowerCase();
|
|
79
|
+
if (l.startsWith('grok')) {
|
|
80
|
+
return 'grok-tui';
|
|
81
|
+
}
|
|
82
|
+
if (l.startsWith('claude')) {
|
|
83
|
+
return 'claude-cli';
|
|
84
|
+
}
|
|
85
|
+
if (l.startsWith('opencode')) {
|
|
86
|
+
return 'opencode-cli';
|
|
87
|
+
}
|
|
88
|
+
if (l.startsWith('copilot')) {
|
|
89
|
+
return 'copilot-cli';
|
|
90
|
+
}
|
|
91
|
+
return 'claude-cli';
|
|
92
|
+
}
|
|
93
|
+
/** GET JSON with a `pat_` Bearer token (built-in http/https, no deps). */
|
|
94
|
+
function fetchJsonAuth(url, token, timeoutMs = 15_000) {
|
|
95
|
+
return new Promise((resolve, reject) => {
|
|
96
|
+
let parsed;
|
|
97
|
+
try {
|
|
98
|
+
parsed = new url_1.URL(url);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
reject(new Error(`Invalid URL: ${url}`));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const lib = parsed.protocol === 'http:' ? http : https;
|
|
105
|
+
const req = lib.request(url, {
|
|
106
|
+
method: 'GET',
|
|
107
|
+
headers: {
|
|
108
|
+
'Accept': 'application/json',
|
|
109
|
+
'Authorization': `Bearer ${token}`,
|
|
110
|
+
'User-Agent': 'autodev-cli',
|
|
111
|
+
},
|
|
112
|
+
}, (res) => {
|
|
113
|
+
const chunks = [];
|
|
114
|
+
res.on('data', (c) => chunks.push(c));
|
|
115
|
+
res.on('end', () => {
|
|
116
|
+
const body = Buffer.concat(chunks).toString('utf8');
|
|
117
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
118
|
+
try {
|
|
119
|
+
resolve(JSON.parse(body));
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
reject(new Error(`Invalid JSON from ${url}: ${e.message}`));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if (res.statusCode === 401 || res.statusCode === 403) {
|
|
126
|
+
reject(new Error(`Auth failed (HTTP ${res.statusCode}) — check --token. ${body.slice(0, 200)}`));
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
reject(new Error(`HTTP ${res.statusCode} from ${url}: ${body.slice(0, 300)}`));
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
req.setTimeout(timeoutMs, () => { req.destroy(new Error(`Timed out after ${timeoutMs}ms fetching ${url}`)); });
|
|
134
|
+
req.on('error', reject);
|
|
135
|
+
req.end();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/** Normalise the /agents roster response (data[] | data.agents[] | agents[] | bare array). */
|
|
139
|
+
function normalizeRoster(json) {
|
|
140
|
+
const raw = json;
|
|
141
|
+
let list = [];
|
|
142
|
+
if (Array.isArray(raw?.data)) {
|
|
143
|
+
list = raw.data;
|
|
144
|
+
}
|
|
145
|
+
else if (Array.isArray(raw?.data?.agents)) {
|
|
146
|
+
list = raw.data.agents;
|
|
147
|
+
}
|
|
148
|
+
else if (Array.isArray(raw?.agents)) {
|
|
149
|
+
list = raw.agents;
|
|
150
|
+
}
|
|
151
|
+
else if (Array.isArray(json)) {
|
|
152
|
+
list = json;
|
|
153
|
+
}
|
|
154
|
+
return list.map((a) => ({
|
|
155
|
+
id: String(a.id),
|
|
156
|
+
slug: String(a.slug ?? a.id),
|
|
157
|
+
name: String(a.name ?? a.slug ?? a.id),
|
|
158
|
+
isConnected: Boolean(a.isConnected ?? a.online),
|
|
159
|
+
provider: a.provider != null ? String(a.provider) : undefined,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
/** Filesystem-safe path segment (no separators / traversal). */
|
|
163
|
+
function safeSeg(s) {
|
|
164
|
+
return String(s).replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^[-.]+|[-.]+$/g, '') || 'agent';
|
|
165
|
+
}
|
|
166
|
+
/** Prefix every line of a child's output with the character name. */
|
|
167
|
+
function pipePrefixed(stream, name, sink) {
|
|
168
|
+
if (!stream) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
let buf = '';
|
|
172
|
+
stream.on('data', (chunk) => {
|
|
173
|
+
buf += chunk.toString('utf8');
|
|
174
|
+
let nl;
|
|
175
|
+
while ((nl = buf.indexOf('\n')) >= 0) {
|
|
176
|
+
sink(`[${name}] ${buf.slice(0, nl)}`);
|
|
177
|
+
buf = buf.slice(nl + 1);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
stream.on('end', () => { if (buf.trim()) {
|
|
181
|
+
sink(`[${name}] ${buf}`);
|
|
182
|
+
} });
|
|
183
|
+
}
|
|
184
|
+
function officeCommand(program) {
|
|
185
|
+
program
|
|
186
|
+
.command('office <slug>')
|
|
187
|
+
.description('Run a WHOLE pixel-office: bind + start every character, and auto-start new ones as they appear')
|
|
188
|
+
.option('--url <baseUrl>', 'Pixel-office base URL (e.g. https://app.pixeloffice.org)', process.env.AUTODEV_SERVER_URL)
|
|
189
|
+
.option('--token <token>', 'Personal-access token (pat_…) minted by the office owner', process.env.AUTODEV_OFFICE_TOKEN ?? process.env.AUTODEV_PAT)
|
|
190
|
+
.option('--base-dir <dir>', 'Root folder for per-character workspaces (default: ~/.autodev/offices/<slug>)')
|
|
191
|
+
.option('-p, --provider <provider>', 'Force this provider for every character (default: each agent\'s configured provider)')
|
|
192
|
+
.option('--interval <seconds>', 'Watcher poll interval for new characters (default 15; 0 disables the watcher)', '15')
|
|
193
|
+
.option('--no-watch', 'Do not keep watching for new characters after the initial launch')
|
|
194
|
+
.action(async (slug, opts) => {
|
|
195
|
+
const base = String(opts.url ?? '').replace(/\/+$/, '');
|
|
196
|
+
const token = String(opts.token ?? '');
|
|
197
|
+
if (!base) {
|
|
198
|
+
logger_1.log.error('Missing office URL. Pass --url=<baseUrl> or set AUTODEV_SERVER_URL.');
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
if (!token) {
|
|
202
|
+
logger_1.log.error('Missing token. Pass --token=<pat_…> or set AUTODEV_OFFICE_TOKEN. Mint one via the pixel-office UI (POST /api/auth/tokens).');
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
const officeSlug = safeSeg(slug);
|
|
206
|
+
const root = opts.baseDir
|
|
207
|
+
? path.resolve(opts.baseDir)
|
|
208
|
+
: path.join(os.homedir(), '.autodev', 'offices', officeSlug);
|
|
209
|
+
fs.mkdirSync(root, { recursive: true, mode: 0o700 });
|
|
210
|
+
// Only an explicit 0 disables the watcher; a malformed value warns and falls
|
|
211
|
+
// back to the default cadence rather than silently turning polling off.
|
|
212
|
+
let intervalSec = 15;
|
|
213
|
+
if (opts.interval !== undefined) {
|
|
214
|
+
const n = parseInt(opts.interval, 10);
|
|
215
|
+
if (Number.isNaN(n)) {
|
|
216
|
+
logger_1.log.warn(`Invalid --interval '${opts.interval}' — using ${intervalSec}s.`);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
intervalSec = Math.max(0, n);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const watch = opts.watch && intervalSec > 0;
|
|
223
|
+
// Locate the compiled CLI entry so children reliably run THIS build's
|
|
224
|
+
// `autodev start` even when `autodev` is not on PATH (dev/source runs).
|
|
225
|
+
// This file compiles to out/commands/office.js → cli.js is one level up.
|
|
226
|
+
const cliJs = path.join(__dirname, '..', 'cli.js');
|
|
227
|
+
logger_1.log.section('🏢 AutoAIDev — Run the whole office');
|
|
228
|
+
logger_1.log.info(`Office : ${slug}`);
|
|
229
|
+
logger_1.log.info(`Server : ${base}`);
|
|
230
|
+
logger_1.log.info(`Workspaces: ${root}`);
|
|
231
|
+
logger_1.log.info(watch ? `Watcher : every ${intervalSec}s (auto-starts new characters)` : 'Watcher : off');
|
|
232
|
+
logger_1.log.plain('');
|
|
233
|
+
// agentId → running child loop. Presence in this map means "we started it";
|
|
234
|
+
// it gates both duplicate spawns and the block-if-already-running check.
|
|
235
|
+
const children = new Map();
|
|
236
|
+
// Reserved WHILE a character's async bind is in flight (before it lands in
|
|
237
|
+
// `children`). The watcher's setInterval does not await the prior poll, so a
|
|
238
|
+
// slow creds fetch could let the next poll see children.has()===false and
|
|
239
|
+
// spawn a SECOND loop in the same workspace. `starting` is the synchronous
|
|
240
|
+
// reservation that closes that TOCTOU window.
|
|
241
|
+
const starting = new Set();
|
|
242
|
+
const notedOnline = new Set();
|
|
243
|
+
let stopping = false;
|
|
244
|
+
// Never send the agent token to a host the user didn't point us at. Mirrors
|
|
245
|
+
// the app's safeWsUrl: force the ws host to the trusted --url base, require
|
|
246
|
+
// wss for any non-local host (no plaintext token off-box). A malicious office
|
|
247
|
+
// response therefore can't redirect the token-bearing presence socket.
|
|
248
|
+
const safeWsUrl = (rawWs) => {
|
|
249
|
+
let ws, b;
|
|
250
|
+
try {
|
|
251
|
+
ws = new url_1.URL(rawWs);
|
|
252
|
+
b = new url_1.URL(base);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
if (ws.protocol !== 'ws:' && ws.protocol !== 'wss:')
|
|
258
|
+
return null;
|
|
259
|
+
if (ws.host !== b.host)
|
|
260
|
+
ws.host = b.host; // pin to the trusted base host
|
|
261
|
+
const isLocal = ws.hostname === 'localhost' || ws.hostname === '127.0.0.1' || ws.hostname === '::1';
|
|
262
|
+
if (ws.protocol === 'ws:' && (!isLocal || b.protocol === 'https:'))
|
|
263
|
+
ws.protocol = 'wss:';
|
|
264
|
+
return ws.toString();
|
|
265
|
+
};
|
|
266
|
+
const startAgent = async (a) => {
|
|
267
|
+
if (children.has(a.id) || starting.has(a.id))
|
|
268
|
+
return; // already running / in flight
|
|
269
|
+
starting.add(a.id);
|
|
270
|
+
try {
|
|
271
|
+
const dir = path.join(root, safeSeg(a.slug));
|
|
272
|
+
// Sandbox-escape guard: the workspace must stay under root.
|
|
273
|
+
const resolved = path.resolve(dir);
|
|
274
|
+
if (resolved !== root && !resolved.startsWith(root + path.sep)) {
|
|
275
|
+
logger_1.log.error(` ${a.name}: refused workspace path outside base dir (${resolved})`);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const provider = opts.provider ? toAutodevProvider(opts.provider) : toAutodevProvider(a.provider);
|
|
279
|
+
try {
|
|
280
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
281
|
+
// Fetch this character's credentials → ready-made wsUrl (token+endpoint).
|
|
282
|
+
const credsRes = await fetchJsonAuth(`${base}/api/offices/${encodeURIComponent(slug)}/agents/${encodeURIComponent(a.id)}/credentials`, token);
|
|
283
|
+
const rawWs = credsRes?.data?.wsUrl;
|
|
284
|
+
if (!credsRes?.success || !rawWs) {
|
|
285
|
+
logger_1.log.error(` ${a.name}: no credentials (${credsRes?.error ?? 'missing wsUrl'})`);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const wsUrl = safeWsUrl(rawWs);
|
|
289
|
+
if (!wsUrl) {
|
|
290
|
+
logger_1.log.error(` ${a.name}: refused unsafe wsUrl (not ws/wss)`);
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
// Bind the workspace with the EXISTING single-agent machinery: writes
|
|
294
|
+
// .autodev/settings.json, installs hooks, wires the office MCP server,
|
|
295
|
+
// grants MCP permissions AND marks the workspace Claude-trusted.
|
|
296
|
+
(0, connect_1.applyWsUrl)(dir, wsUrl);
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
logger_1.log.error(` ${a.name}: bind failed — ${err.message}`);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
// Spawn the EXISTING start loop as its own process (blocking singleton).
|
|
303
|
+
// AUTODEV_EXIT_WITH_PARENT=1 ⇒ the child reaps itself if we die.
|
|
304
|
+
const child = (0, child_process_1.spawn)(process.execPath, [cliJs, 'start', dir, '-p', provider], {
|
|
305
|
+
env: { ...process.env, AUTODEV_EXIT_WITH_PARENT: '1' },
|
|
306
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
307
|
+
});
|
|
308
|
+
children.set(a.id, { child, name: a.name });
|
|
309
|
+
logger_1.log.success(` ▶ ${a.name} (${provider}) → ${dir}`);
|
|
310
|
+
pipePrefixed(child.stdout, a.name, (line) => logger_1.log.plain(line));
|
|
311
|
+
pipePrefixed(child.stderr, a.name, (line) => logger_1.log.gray(line));
|
|
312
|
+
child.on('exit', (code, sig) => {
|
|
313
|
+
children.delete(a.id);
|
|
314
|
+
if (!stopping) {
|
|
315
|
+
logger_1.log.warn(` ⏹ ${a.name} loop exited (${sig ?? code}). It will be re-started on the next poll if still offline.`);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
child.on('error', (e) => {
|
|
319
|
+
children.delete(a.id);
|
|
320
|
+
logger_1.log.error(` ${a.name}: failed to spawn loop — ${e.message}`);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
finally {
|
|
324
|
+
// Release the reservation: from here `children` (or its absence on failure)
|
|
325
|
+
// is the source of truth again.
|
|
326
|
+
starting.delete(a.id);
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
const poll = async (initial = false) => {
|
|
330
|
+
if (stopping) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
let roster;
|
|
334
|
+
try {
|
|
335
|
+
const json = await fetchJsonAuth(`${base}/api/offices/${encodeURIComponent(slug)}/agents`, token);
|
|
336
|
+
roster = normalizeRoster(json);
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
const msg = err.message;
|
|
340
|
+
// A bad/expired token is permanent — fail loudly on the FIRST fetch rather
|
|
341
|
+
// than reporting a clean exit (no-watch) or retrying a dead credential forever.
|
|
342
|
+
if (initial && /HTTP 40[13]|Auth failed|Unauthor|Forbidden/i.test(msg)) {
|
|
343
|
+
logger_1.log.error(`${msg}\nCheck --token (or AUTODEV_OFFICE_TOKEN) and --url.`);
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
logger_1.log.warn(`Roster fetch failed (will retry): ${msg}`);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
for (const a of roster) {
|
|
350
|
+
if (children.has(a.id) || starting.has(a.id)) {
|
|
351
|
+
continue;
|
|
352
|
+
} // running / in flight
|
|
353
|
+
if (a.isConnected) { // online elsewhere — don't flap its WS
|
|
354
|
+
if (!notedOnline.has(a.id)) {
|
|
355
|
+
logger_1.log.gray(` • ${a.name} already online elsewhere — skipping.`);
|
|
356
|
+
notedOnline.add(a.id);
|
|
357
|
+
}
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
notedOnline.delete(a.id);
|
|
361
|
+
await startAgent(a);
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
// Graceful shutdown: SIGINT stops every spawned loop, then exits.
|
|
365
|
+
const shutdown = () => {
|
|
366
|
+
if (stopping) {
|
|
367
|
+
process.exit(130);
|
|
368
|
+
}
|
|
369
|
+
stopping = true;
|
|
370
|
+
logger_1.log.warn(`\n⏹ Stopping ${children.size} office loop(s)…`);
|
|
371
|
+
for (const { child } of children.values()) {
|
|
372
|
+
try {
|
|
373
|
+
child.kill('SIGINT');
|
|
374
|
+
}
|
|
375
|
+
catch { /* ignore */ }
|
|
376
|
+
}
|
|
377
|
+
setTimeout(() => process.exit(0), 2000).unref();
|
|
378
|
+
};
|
|
379
|
+
process.on('SIGINT', shutdown);
|
|
380
|
+
process.on('SIGTERM', shutdown);
|
|
381
|
+
await poll(true);
|
|
382
|
+
if (children.size === 0 && !watch) {
|
|
383
|
+
logger_1.log.warn('No characters started. Nothing to run.');
|
|
384
|
+
process.exit(0);
|
|
385
|
+
}
|
|
386
|
+
logger_1.log.gray(watch ? 'Press Ctrl+C to stop all loops. Watching for new characters…\n' : 'Press Ctrl+C to stop all loops.\n');
|
|
387
|
+
if (watch) {
|
|
388
|
+
const timer = setInterval(() => { void poll(); }, intervalSec * 1000);
|
|
389
|
+
timer.unref?.();
|
|
390
|
+
// Keep the process alive even if every child temporarily exits.
|
|
391
|
+
await new Promise(() => { });
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
// No watcher: stay alive while children run so SIGINT can reap them.
|
|
395
|
+
await new Promise(() => { });
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=office.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"office.js","sourceRoot":"","sources":["../../src/commands/office.ts"],"names":[],"mappings":"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"}
|