tono 0.2.0 → 0.3.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 (59) hide show
  1. package/README.md +95 -3
  2. package/dist/cli/checks.js +504 -0
  3. package/dist/cli/checks.js.map +1 -0
  4. package/dist/cli/commands/config.js +20 -3
  5. package/dist/cli/commands/config.js.map +1 -1
  6. package/dist/cli/commands/configure.js +1 -1
  7. package/dist/cli/commands/configure.js.map +1 -1
  8. package/dist/cli/commands/doctor.js +22 -0
  9. package/dist/cli/commands/doctor.js.map +1 -0
  10. package/dist/cli/commands/gateway.js +23 -10
  11. package/dist/cli/commands/gateway.js.map +1 -1
  12. package/dist/cli/commands/init.js +22 -3
  13. package/dist/cli/commands/init.js.map +1 -1
  14. package/dist/cli/commands/start.js +72 -18
  15. package/dist/cli/commands/start.js.map +1 -1
  16. package/dist/cli/commands/worker.js +458 -0
  17. package/dist/cli/commands/worker.js.map +1 -0
  18. package/dist/cli/index.js +28 -9
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/cli/launchd.js +5 -5
  21. package/dist/cli/launchd.js.map +1 -1
  22. package/dist/server/app.js +90 -14
  23. package/dist/server/app.js.map +1 -1
  24. package/dist/server/config/load.js +19 -1
  25. package/dist/server/config/load.js.map +1 -1
  26. package/dist/server/config/schema.json +19 -0
  27. package/dist/server/db/client.js +50 -1
  28. package/dist/server/db/client.js.map +1 -1
  29. package/dist/server/db/queries.js +126 -3
  30. package/dist/server/db/queries.js.map +1 -1
  31. package/dist/server/db/schema.sql +36 -21
  32. package/dist/server/events.js.map +1 -1
  33. package/dist/server/server.js +28 -11
  34. package/dist/server/server.js.map +1 -1
  35. package/dist/server/worker/agent.js +396 -0
  36. package/dist/server/worker/agent.js.map +1 -0
  37. package/dist/server/worker/pty-bridge.js +27 -0
  38. package/dist/server/worker/pty-bridge.js.map +1 -0
  39. package/dist/server/workers/github-poller.js +26 -8
  40. package/dist/server/workers/github-poller.js.map +1 -1
  41. package/dist/server/workers/reaper.js +44 -0
  42. package/dist/server/workers/reaper.js.map +1 -0
  43. package/dist/server/workers/registry.js +166 -0
  44. package/dist/server/workers/registry.js.map +1 -0
  45. package/dist/server/workers/scheduler.js +79 -130
  46. package/dist/server/workers/scheduler.js.map +1 -1
  47. package/dist/server/ws/pty.js +66 -54
  48. package/dist/server/ws/pty.js.map +1 -1
  49. package/dist/server/ws/workers.js +206 -0
  50. package/dist/server/ws/workers.js.map +1 -0
  51. package/dist/shared/types.js +4 -1
  52. package/dist/shared/types.js.map +1 -1
  53. package/dist/shared/version.js +18 -0
  54. package/dist/shared/version.js.map +1 -0
  55. package/dist/shared/worker-protocol.js +28 -0
  56. package/dist/shared/worker-protocol.js.map +1 -0
  57. package/dist/web/assets/{index-5VFn-lxF.js → index-DPB0x7SX.js} +21 -21
  58. package/dist/web/index.html +1 -1
  59. package/package.json +18 -26
@@ -0,0 +1,458 @@
1
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { randomUUID } from "node:crypto";
6
+ import { execSync, spawnSync } from "node:child_process";
7
+ import { WorkerAgent } from "../../server/worker/agent.js";
8
+ import { WORKER_LABEL, buildPlist, plistPath } from "../launchd.js";
9
+ const HELP = `tono worker <subcommand>
10
+
11
+ Run a tono worker that connects to a remote gateway and executes agent tasks
12
+ on this machine. Workers are network-trusted via Tailscale; they MUST run on
13
+ the same tailnet as the gateway.
14
+
15
+ run run the worker in the FOREGROUND (this terminal). ^C to stop.
16
+ start install (or update) the LaunchAgent and load it; runs in BACKGROUND
17
+ stop unload the LaunchAgent (worker.json kept on disk)
18
+ restart unload + load (apply binary or settings changes)
19
+ status show LaunchAgent + connection status
20
+ uninstall unload and remove the LaunchAgent
21
+ logs tail ~/.tono/logs/worker.{out,err}.log
22
+
23
+ Settings persist in ~/.tono/worker.json after the first run/start, so subsequent
24
+ invocations don't need flags. Pass new flags to override and re-persist.
25
+
26
+ Common flags (run / start):
27
+ --gateway <host:port> gateway host (required first time, no scheme)
28
+ --workspaces <path> bare-clone + worktree root (default: ~/.tono/workspaces)
29
+ --logs <path> PTY log dir (default: ~/.tono/logs)
30
+ --agent <name=command> advertise an agent CLI; repeatable
31
+ --concurrency <agent=N/M> max simultaneous (implement/review) for an agent
32
+
33
+ Prerequisites on this machine:
34
+ - gh (authenticated: \`gh auth login\`)
35
+ - the agent CLIs you advertise (claude / codex / opencode)
36
+ - Tailscale (or some trusted network reach to the gateway)
37
+ `;
38
+ function parseArgs(argv) {
39
+ const out = {
40
+ agentCommands: new Map(),
41
+ concurrency: new Map(),
42
+ help: false,
43
+ };
44
+ for (let i = 0; i < argv.length; i++) {
45
+ const a = argv[i];
46
+ if (a === "--help" || a === "-h") {
47
+ out.help = true;
48
+ continue;
49
+ }
50
+ if (a === "--gateway") {
51
+ out.gateway = argv[++i];
52
+ continue;
53
+ }
54
+ if (a === "--workspaces") {
55
+ out.workspaces = argv[++i];
56
+ continue;
57
+ }
58
+ if (a === "--logs") {
59
+ out.logs = argv[++i];
60
+ continue;
61
+ }
62
+ if (a === "--agent") {
63
+ const v = argv[++i] ?? "";
64
+ const eq = v.indexOf("=");
65
+ if (eq <= 0)
66
+ throw new Error(`bad --agent value: ${v}`);
67
+ out.agentCommands.set(v.slice(0, eq), v.slice(eq + 1));
68
+ continue;
69
+ }
70
+ if (a === "--concurrency") {
71
+ const v = argv[++i] ?? "";
72
+ const eq = v.indexOf("=");
73
+ if (eq <= 0)
74
+ throw new Error(`bad --concurrency value: ${v}`);
75
+ const name = v.slice(0, eq);
76
+ const [imp, rev] = v.slice(eq + 1).split("/");
77
+ const implement = Number(imp);
78
+ const review = Number(rev ?? imp);
79
+ if (!Number.isFinite(implement) || !Number.isFinite(review)) {
80
+ throw new Error(`bad --concurrency value: ${v}`);
81
+ }
82
+ out.concurrency.set(name, { implement, review });
83
+ continue;
84
+ }
85
+ throw new Error(`unknown argument: ${a}`);
86
+ }
87
+ return out;
88
+ }
89
+ function tonoHomeDir() {
90
+ return process.env.TONO_HOME ?? join(homedir(), ".tono");
91
+ }
92
+ function workerStatePath() {
93
+ return join(tonoHomeDir(), "worker.json");
94
+ }
95
+ function loadOrCreateState() {
96
+ const path = workerStatePath();
97
+ if (existsSync(path)) {
98
+ try {
99
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
100
+ if (typeof parsed.workerId === "string" && parsed.workerId.length > 0) {
101
+ return {
102
+ workerId: parsed.workerId,
103
+ gatewayUrl: parsed.gatewayUrl,
104
+ agentCommands: parsed.agentCommands,
105
+ concurrency: parsed.concurrency,
106
+ workspacesRoot: parsed.workspacesRoot,
107
+ logsDir: parsed.logsDir,
108
+ };
109
+ }
110
+ }
111
+ catch {
112
+ // fall through; rewrite below
113
+ }
114
+ }
115
+ const fresh = { workerId: randomUUID() };
116
+ mkdirSync(tonoHomeDir(), { recursive: true });
117
+ writeFileSync(path, JSON.stringify(fresh, null, 2) + "\n");
118
+ return fresh;
119
+ }
120
+ function saveState(s) {
121
+ mkdirSync(tonoHomeDir(), { recursive: true });
122
+ writeFileSync(workerStatePath(), JSON.stringify(s, null, 2) + "\n");
123
+ }
124
+ /**
125
+ * Merge CLI args onto persisted state. CLI args win when present; missing
126
+ * args fall back to whatever's in worker.json. Returns the merged state and
127
+ * persists it back so the launchd-spawned process sees the same settings.
128
+ */
129
+ function mergeAndPersist(state, args) {
130
+ const out = { ...state };
131
+ if (args.gateway)
132
+ out.gatewayUrl = normalizeGatewayUrl(args.gateway);
133
+ if (args.workspaces)
134
+ out.workspacesRoot = expandHomePath(args.workspaces);
135
+ if (args.logs)
136
+ out.logsDir = expandHomePath(args.logs);
137
+ if (args.agentCommands.size > 0) {
138
+ out.agentCommands = { ...(out.agentCommands ?? {}) };
139
+ for (const [k, v] of args.agentCommands.entries())
140
+ out.agentCommands[k] = v;
141
+ }
142
+ if (args.concurrency.size > 0) {
143
+ out.concurrency = { ...(out.concurrency ?? {}) };
144
+ for (const [k, v] of args.concurrency.entries())
145
+ out.concurrency[k] = v;
146
+ }
147
+ saveState(out);
148
+ return out;
149
+ }
150
+ function detectVersion(cmd) {
151
+ try {
152
+ const out = execSync(`${cmd} --version`, { stdio: ["ignore", "pipe", "ignore"], timeout: 5000 }).toString().trim();
153
+ return out.split("\n")[0]?.trim();
154
+ }
155
+ catch {
156
+ return undefined;
157
+ }
158
+ }
159
+ function commandOnPath(cmd) {
160
+ try {
161
+ execSync(`command -v ${cmd}`, { stdio: ["ignore", "pipe", "ignore"], shell: "/bin/sh", timeout: 3000 });
162
+ return true;
163
+ }
164
+ catch {
165
+ return false;
166
+ }
167
+ }
168
+ function buildCapabilities(agentCommands) {
169
+ const defaults = {
170
+ "claude-code": "claude",
171
+ "codex": "codex",
172
+ "opencode": "opencode",
173
+ };
174
+ const resolved = new Map();
175
+ const seen = new Set();
176
+ for (const [name, cmd] of Object.entries(agentCommands ?? {})) {
177
+ seen.add(name);
178
+ if (commandOnPath(cmd))
179
+ resolved.set(name, cmd);
180
+ else
181
+ process.stderr.write(`tono worker: agent command "${cmd}" for ${name} not on PATH; skipping\n`);
182
+ }
183
+ for (const [name, cmd] of Object.entries(defaults)) {
184
+ if (seen.has(name))
185
+ continue;
186
+ if (commandOnPath(cmd))
187
+ resolved.set(name, cmd);
188
+ }
189
+ const agents = {};
190
+ for (const [name, cmd] of resolved.entries()) {
191
+ agents[name] = { version: detectVersion(cmd) };
192
+ }
193
+ return { capabilities: { agents }, resolved };
194
+ }
195
+ function buildCapacity(resolved, overrides) {
196
+ const byAgent = {};
197
+ for (const name of resolved.keys()) {
198
+ byAgent[name] = overrides?.[name] ?? { implement: 2, review: 2 };
199
+ }
200
+ return { byAgent };
201
+ }
202
+ function expandHomePath(p) {
203
+ if (p === "~")
204
+ return homedir();
205
+ if (p.startsWith("~/"))
206
+ return join(homedir(), p.slice(2));
207
+ return p;
208
+ }
209
+ function normalizeGatewayUrl(host) {
210
+ // Accept "host:port", "ws://host:port", "wss://host:port" (plus optional trailing /).
211
+ const stripped = host.replace(/\/$/, "");
212
+ if (stripped.startsWith("ws://") || stripped.startsWith("wss://")) {
213
+ return `${stripped}/api/workers/connect`;
214
+ }
215
+ return `ws://${stripped}/api/workers/connect`;
216
+ }
217
+ // ---- subcommand: run (foreground) ----
218
+ export async function runWorkerForeground(args) {
219
+ const state = mergeAndPersist(loadOrCreateState(), args);
220
+ if (!state.gatewayUrl) {
221
+ console.error("error: --gateway is required on first run");
222
+ console.error("");
223
+ console.error(HELP);
224
+ process.exit(2);
225
+ }
226
+ const { capabilities, resolved } = buildCapabilities(state.agentCommands);
227
+ if (resolved.size === 0) {
228
+ console.error("error: no agent CLIs detected on PATH. Install at least one of: claude, codex, opencode");
229
+ console.error("Or pass --agent <name>=<command> to point at custom binaries.");
230
+ process.exit(1);
231
+ }
232
+ const capacity = buildCapacity(resolved, state.concurrency);
233
+ const workspacesRoot = state.workspacesRoot ?? join(homedir(), ".tono", "workspaces");
234
+ const logsDir = state.logsDir ?? join(homedir(), ".tono", "logs");
235
+ mkdirSync(workspacesRoot, { recursive: true });
236
+ mkdirSync(logsDir, { recursive: true });
237
+ process.stdout.write(`tono worker ${state.workerId.slice(0, 8)} → ${state.gatewayUrl}\n`);
238
+ process.stdout.write(` agents: ${[...resolved.keys()].join(", ")}\n`);
239
+ for (const [name, cap] of Object.entries(capacity.byAgent)) {
240
+ if (!cap)
241
+ continue;
242
+ process.stdout.write(` ${name}: implement=${cap.implement} review=${cap.review}\n`);
243
+ }
244
+ process.stdout.write(` workspaces: ${workspacesRoot}\n`);
245
+ const agent = new WorkerAgent({
246
+ workerId: state.workerId,
247
+ gatewayUrl: state.gatewayUrl,
248
+ workspacesRoot,
249
+ logsDir,
250
+ capacity,
251
+ capabilities,
252
+ });
253
+ agent.start();
254
+ let shuttingDown = false;
255
+ const shutdown = async (signal) => {
256
+ if (shuttingDown)
257
+ return;
258
+ shuttingDown = true;
259
+ process.stdout.write(`tono worker received ${signal}; shutting down\n`);
260
+ await agent.stop();
261
+ setTimeout(() => process.exit(0), 1000);
262
+ };
263
+ process.on("SIGINT", () => void shutdown("SIGINT"));
264
+ process.on("SIGTERM", () => void shutdown("SIGTERM"));
265
+ await new Promise(() => { });
266
+ }
267
+ // ---- subcommand: start / stop / restart / status / uninstall / logs (launchd) ----
268
+ function entryPath() {
269
+ // dist/cli/commands/worker.js → ../index.js
270
+ const here = dirname(fileURLToPath(import.meta.url));
271
+ return resolve(here, "..", "index.js");
272
+ }
273
+ function projectRoot() {
274
+ const here = dirname(fileURLToPath(import.meta.url));
275
+ return resolve(here, "..", "..", "..");
276
+ }
277
+ function exec(cmd, argv) {
278
+ const r = spawnSync(cmd, argv, { encoding: "utf8" });
279
+ return { code: r.status ?? -1, stdout: r.stdout ?? "", stderr: r.stderr ?? "" };
280
+ }
281
+ function ensureWorkerPlist(state) {
282
+ if (!state.gatewayUrl) {
283
+ console.error("error: worker has no gateway configured. Pass --gateway <host>:<port> on first 'tono worker start'.");
284
+ process.exit(1);
285
+ }
286
+ const plistFile = plistPath(WORKER_LABEL);
287
+ const home = tonoHomeDir();
288
+ const logsDir = join(home, "logs");
289
+ mkdirSync(dirname(plistFile), { recursive: true });
290
+ mkdirSync(logsDir, { recursive: true });
291
+ const userPath = process.env.PATH ?? "";
292
+ const fallbackPath = "/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin";
293
+ const mergedPath = [userPath, fallbackPath].filter(Boolean).join(":");
294
+ // Background invocation: `tono worker run` reads worker.json for everything.
295
+ // We don't bake flags into ProgramArguments so that re-running `tono worker
296
+ // start --concurrency ...` just rewrites worker.json and (after restart)
297
+ // picks it up — no plist regeneration needed for setting tweaks.
298
+ const xml = buildPlist({
299
+ label: WORKER_LABEL,
300
+ programArgs: [process.execPath, entryPath(), "worker", "run"],
301
+ outLog: join(logsDir, "worker.out.log"),
302
+ errLog: join(logsDir, "worker.err.log"),
303
+ workingDir: projectRoot(),
304
+ tonoHome: home,
305
+ path: mergedPath,
306
+ home: process.env.HOME,
307
+ });
308
+ if (!existsSync(plistFile) || readFileSync(plistFile, "utf8") !== xml) {
309
+ writeFileSync(plistFile, xml);
310
+ console.log(`wrote ${plistFile}`);
311
+ }
312
+ return { plistFile, logsDir };
313
+ }
314
+ function start(args) {
315
+ const state = mergeAndPersist(loadOrCreateState(), args);
316
+ // If launchctl already has it loaded, refuse — like the gateway command does.
317
+ const existing = exec("launchctl", ["list", WORKER_LABEL]);
318
+ if (existing.code === 0) {
319
+ const pid = existing.stdout.match(/"PID"\s*=\s*(\d+)/)?.[1];
320
+ console.log(`worker already running (${WORKER_LABEL}${pid ? `, pid ${pid}` : ""})`);
321
+ console.log(`use 'tono worker restart' to reload, 'tono worker status' to inspect.`);
322
+ return;
323
+ }
324
+ const { plistFile, logsDir } = ensureWorkerPlist(state);
325
+ const r = exec("launchctl", ["load", "-w", plistFile]);
326
+ if (r.code !== 0) {
327
+ console.error(`launchctl load failed: ${r.stderr.trim() || r.stdout.trim()}`);
328
+ process.exit(1);
329
+ }
330
+ console.log(`worker started (${WORKER_LABEL})`);
331
+ console.log(` gateway: ${state.gatewayUrl}`);
332
+ console.log(` logs: ${logsDir}/worker.{out,err}.log`);
333
+ }
334
+ function stop() {
335
+ const plistFile = plistPath(WORKER_LABEL);
336
+ if (!existsSync(plistFile)) {
337
+ console.log(`worker not installed (no plist at ${plistFile})`);
338
+ return;
339
+ }
340
+ const r = exec("launchctl", ["unload", plistFile]);
341
+ if (r.code !== 0 && !/could not find specified service/i.test(r.stderr)) {
342
+ console.error(`launchctl unload returned ${r.code}: ${r.stderr.trim() || r.stdout.trim()}`);
343
+ process.exit(1);
344
+ }
345
+ console.log(`worker stopped (${WORKER_LABEL})`);
346
+ }
347
+ function restart(args) {
348
+ const plistFile = plistPath(WORKER_LABEL);
349
+ if (!existsSync(plistFile) && args.agentCommands.size === 0 && !args.gateway) {
350
+ console.error(`worker not installed; run 'tono worker start --gateway <host:port>' first`);
351
+ process.exit(1);
352
+ }
353
+ const state = mergeAndPersist(loadOrCreateState(), args);
354
+ ensureWorkerPlist(state);
355
+ exec("launchctl", ["unload", plistFile]);
356
+ const r = exec("launchctl", ["load", "-w", plistFile]);
357
+ if (r.code !== 0) {
358
+ console.error(`launchctl load failed: ${r.stderr.trim() || r.stdout.trim()}`);
359
+ process.exit(1);
360
+ }
361
+ console.log(`worker restarted (${WORKER_LABEL})`);
362
+ }
363
+ function uninstall() {
364
+ const plistFile = plistPath(WORKER_LABEL);
365
+ if (!existsSync(plistFile)) {
366
+ console.log(`${plistFile} does not exist; nothing to do`);
367
+ return;
368
+ }
369
+ exec("launchctl", ["unload", plistFile]);
370
+ unlinkSync(plistFile);
371
+ console.log(`removed ${plistFile}`);
372
+ }
373
+ function status() {
374
+ const plistFile = plistPath(WORKER_LABEL);
375
+ console.log(`plist: ${existsSync(plistFile) ? plistFile : "(not installed)"}`);
376
+ const state = existsSync(workerStatePath()) ? loadOrCreateState() : null;
377
+ if (state) {
378
+ console.log(`worker id: ${state.workerId}`);
379
+ console.log(`gateway: ${state.gatewayUrl ?? "(not set)"}`);
380
+ }
381
+ else {
382
+ console.log(`worker id: (none — never run)`);
383
+ }
384
+ const r = exec("launchctl", ["list", WORKER_LABEL]);
385
+ if (r.code === 0) {
386
+ const pid = r.stdout.match(/"PID"\s*=\s*(\d+)/)?.[1];
387
+ const lastExit = r.stdout.match(/"LastExitStatus"\s*=\s*(-?\d+)/)?.[1];
388
+ console.log(`launchctl: loaded${pid ? ` (pid ${pid})` : ""}${lastExit && lastExit !== "0" && !pid ? ` last exit ${lastExit}` : ""}`);
389
+ }
390
+ else {
391
+ console.log(`launchctl: not loaded`);
392
+ }
393
+ }
394
+ function logs(args) {
395
+ const which = args[0] ?? "out";
396
+ const file = which === "err"
397
+ ? join(tonoHomeDir(), "logs", "worker.err.log")
398
+ : join(tonoHomeDir(), "logs", "worker.out.log");
399
+ if (!existsSync(file)) {
400
+ console.error(`no log file at ${file} (worker hasn't run yet?)`);
401
+ process.exit(1);
402
+ }
403
+ const child = spawnSync("tail", ["-n", "200", "-f", file], { stdio: "inherit" });
404
+ process.exit(child.status ?? 0);
405
+ }
406
+ // ---- entry point ----
407
+ export async function runWorker(argv) {
408
+ const sub = argv[0];
409
+ if (sub === undefined || sub === "help" || sub === "--help" || sub === "-h") {
410
+ console.log(HELP);
411
+ return;
412
+ }
413
+ // Anything else takes optional flags after the subcommand.
414
+ const rest = argv.slice(1);
415
+ let parsed;
416
+ try {
417
+ parsed = parseArgs(rest);
418
+ }
419
+ catch (err) {
420
+ console.error(err.message);
421
+ console.error("");
422
+ console.error(HELP);
423
+ process.exit(2);
424
+ }
425
+ if (parsed.help) {
426
+ console.log(HELP);
427
+ return;
428
+ }
429
+ switch (sub) {
430
+ case "run":
431
+ await runWorkerForeground(parsed);
432
+ return;
433
+ case "start":
434
+ start(parsed);
435
+ return;
436
+ case "stop":
437
+ stop();
438
+ return;
439
+ case "restart":
440
+ restart(parsed);
441
+ return;
442
+ case "status":
443
+ status();
444
+ return;
445
+ case "uninstall":
446
+ uninstall();
447
+ return;
448
+ case "logs":
449
+ logs(rest);
450
+ return;
451
+ default:
452
+ console.error(`unknown subcommand: worker ${sub}`);
453
+ console.error("");
454
+ console.error(HELP);
455
+ process.exit(2);
456
+ }
457
+ }
458
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/cli/commands/worker.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -4,8 +4,10 @@ import { runConfig } from "./commands/config.js";
4
4
  import { runConfigure } from "./commands/configure.js";
5
5
  import { runStart } from "./commands/start.js";
6
6
  import { runGateway } from "./commands/gateway.js";
7
+ import { runWorker } from "./commands/worker.js";
7
8
  import { runOpen } from "./commands/open.js";
8
- const VERSION = "0.0.1";
9
+ import { runDoctor } from "./commands/doctor.js";
10
+ import { VERSION } from "../shared/version.js";
9
11
  const HELP = `tono ${VERSION}
10
12
 
11
13
  Usage:
@@ -14,14 +16,25 @@ Usage:
14
16
  Commands:
15
17
  init [--force] initialize ~/.tono with default config and database
16
18
  configure interactive setup wizard
17
- gateway start run tono in the background as a macOS LaunchAgent
18
- gateway stop stop the background gateway
19
- gateway restart restart the background gateway
20
- gateway status show gateway + HTTP health
21
- gateway uninstall remove the LaunchAgent
19
+ doctor check that gh, git, and the configured agent CLIs are present and working
20
+ start run tono in the FOREGROUND (this terminal). Stops when you ^C or close the shell.
21
+ Best for dev / first-run sanity checks.
22
+ gateway start run tono in the BACKGROUND via a macOS LaunchAgent. Survives logout, restarts on
23
+ crash, auto-starts at login. Best for the always-on Mac mini setup.
24
+ gateway stop unload the background LaunchAgent (config kept on disk)
25
+ gateway restart reload the background LaunchAgent (apply plist or node-binary changes)
26
+ gateway status show LaunchAgent + HTTP health
27
+ gateway uninstall unload and remove the LaunchAgent
22
28
  gateway logs [out|err]
23
- tail the gateway log file
24
- start run tono in the foreground (dev mode; equivalent to what the gateway runs)
29
+ tail the background gateway's log file
30
+ worker run run a worker in the FOREGROUND, connecting to a remote gateway
31
+ worker start install + load a worker LaunchAgent (BACKGROUND, auto-restart)
32
+ worker stop unload the worker LaunchAgent
33
+ worker restart reload the worker LaunchAgent (apply settings changes)
34
+ worker status show worker LaunchAgent + connection state
35
+ worker uninstall unload and remove the worker LaunchAgent
36
+ worker logs [out|err]
37
+ tail the background worker's log file
25
38
  open open the web UI in the default browser
26
39
  config path print the config file path
27
40
  config validate validate the config against the schema
@@ -44,14 +57,20 @@ async function main(argv) {
44
57
  console.log(VERSION);
45
58
  return;
46
59
  case "init":
47
- runInit({ force: rest.includes("--force") });
60
+ await runInit({ force: rest.includes("--force") });
48
61
  return;
49
62
  case "configure":
50
63
  await runConfigure();
51
64
  return;
65
+ case "doctor":
66
+ await runDoctor();
67
+ return;
52
68
  case "start":
53
69
  await runStart();
54
70
  return;
71
+ case "worker":
72
+ await runWorker(rest);
73
+ return;
55
74
  case "gateway":
56
75
  runGateway(rest);
57
76
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,IAAI,GAAG,QAAQ,OAAO;;;;;;;;;;;;;;;;;;;;;;CAsB3B,CAAC;AAEF,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAE5B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO;QACT,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO;QACT,KAAK,WAAW;YACd,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACT,KAAK,OAAO;YACV,MAAM,QAAQ,EAAE,CAAC;YACjB,OAAO;QACT,KAAK,SAAS;YACZ,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,KAAK,QAAQ;YACX,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC1E,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;YACV,OAAO;QACT,KAAK,QAAQ;YACX,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO;QACT;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,IAAI,GAAG,QAAQ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC3B,CAAC;AAEF,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAE5B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO;QACT,KAAK,MAAM;YACT,MAAM,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,KAAK,WAAW;YACd,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,OAAO;QACT,KAAK,OAAO;YACV,MAAM,QAAQ,EAAE,CAAC;YACjB,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO;QACT,KAAK,SAAS;YACZ,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,KAAK,QAAQ;YACX,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC1E,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;YACV,OAAO;QACT,KAAK,QAAQ;YACX,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO;QACT;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import { homedir } from "node:os";
2
2
  import { join } from "node:path";
3
3
  export const GATEWAY_LABEL = "com.tono.gateway";
4
- export function plistPath() {
5
- return join(homedir(), "Library", "LaunchAgents", `${GATEWAY_LABEL}.plist`);
4
+ export const WORKER_LABEL = "com.tono.worker";
5
+ export function plistPath(label = GATEWAY_LABEL) {
6
+ return join(homedir(), "Library", "LaunchAgents", `${label}.plist`);
6
7
  }
7
8
  function escapeXml(s) {
8
9
  return s.replace(/[<>&'"]/g, (c) => {
@@ -17,16 +18,15 @@ function escapeXml(s) {
17
18
  });
18
19
  }
19
20
  export function buildPlist(inp) {
20
- const args = [inp.nodeBinary, inp.entry, "start"];
21
21
  return `<?xml version="1.0" encoding="UTF-8"?>
22
22
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
23
23
  <plist version="1.0">
24
24
  <dict>
25
25
  <key>Label</key>
26
- <string>${GATEWAY_LABEL}</string>
26
+ <string>${escapeXml(inp.label)}</string>
27
27
  <key>ProgramArguments</key>
28
28
  <array>
29
- ${args.map((a) => ` <string>${escapeXml(a)}</string>`).join("\n")}
29
+ ${inp.programArgs.map((a) => ` <string>${escapeXml(a)}</string>`).join("\n")}
30
30
  </array>
31
31
  <key>WorkingDirectory</key>
32
32
  <string>${escapeXml(inp.workingDir)}</string>
@@ -1 +1 @@
1
- {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../src/cli/launchd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEhD,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,aAAa,QAAQ,CAAC,CAAC;AAC9E,CAAC;AAeD,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;QACjC,QAAQ,CAAC,EAAE,CAAC;YACV,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC;YACxB,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC;YACxB,KAAK,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC;YACzB,KAAK,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC1B,KAAK,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAgB;IACzC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO;;;;;YAKG,aAAa;;;EAGvB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;YAGxD,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;;;cAIvB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;;cAEvB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;;cAE1C,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;;;YAGrC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;;YAErB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;;;;;;;;;CAShC,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../src/cli/launchd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAE9C,MAAM,UAAU,SAAS,CAAC,QAAgB,aAAa;IACrD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC;AACtE,CAAC;AAiBD,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;QACjC,QAAQ,CAAC,EAAE,CAAC;YACV,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC;YACxB,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC;YACxB,KAAK,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC;YACzB,KAAK,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC1B,KAAK,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAgB;IACzC,OAAO;;;;;YAKG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;;EAG9B,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;YAGnE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;;;cAIvB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;;cAEvB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;;cAE1C,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;;;YAGrC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;;YAErB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;;;;;;;;;CAShC,CAAC;AACF,CAAC"}