tono 0.1.0 → 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 (70) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +300 -0
  3. package/dist/cli/commands/config.js +86 -0
  4. package/dist/cli/commands/config.js.map +1 -0
  5. package/dist/cli/commands/configure.js +260 -0
  6. package/dist/cli/commands/configure.js.map +1 -0
  7. package/dist/cli/commands/gateway.js +194 -0
  8. package/dist/cli/commands/gateway.js.map +1 -0
  9. package/dist/cli/commands/init.js +89 -0
  10. package/dist/cli/commands/init.js.map +1 -0
  11. package/dist/cli/commands/open.js +23 -0
  12. package/dist/cli/commands/open.js.map +1 -0
  13. package/dist/cli/commands/start.js +116 -0
  14. package/dist/cli/commands/start.js.map +1 -0
  15. package/dist/cli/index.js +78 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/cli/launchd.js +56 -0
  18. package/dist/cli/launchd.js.map +1 -0
  19. package/dist/cli/prompt.js +46 -0
  20. package/dist/cli/prompt.js.map +1 -0
  21. package/dist/server/agents/claude-code.js +80 -0
  22. package/dist/server/agents/claude-code.js.map +1 -0
  23. package/dist/server/agents/codex.js +52 -0
  24. package/dist/server/agents/codex.js.map +1 -0
  25. package/dist/server/agents/opencode.js +50 -0
  26. package/dist/server/agents/opencode.js.map +1 -0
  27. package/dist/server/agents/registry.js +16 -0
  28. package/dist/server/agents/registry.js.map +1 -0
  29. package/dist/server/agents/types.js +40 -0
  30. package/dist/server/agents/types.js.map +1 -0
  31. package/dist/server/app.js +324 -0
  32. package/dist/server/app.js.map +1 -0
  33. package/dist/server/config/load.js +91 -0
  34. package/dist/server/config/load.js.map +1 -0
  35. package/dist/server/config/manager.js +38 -0
  36. package/dist/server/config/manager.js.map +1 -0
  37. package/dist/server/config/schema.json +151 -0
  38. package/dist/server/db/client.js +136 -0
  39. package/dist/server/db/client.js.map +1 -0
  40. package/dist/server/db/queries.js +158 -0
  41. package/dist/server/db/queries.js.map +1 -0
  42. package/dist/server/db/schema.sql +61 -0
  43. package/dist/server/events.js +5 -0
  44. package/dist/server/events.js.map +1 -0
  45. package/dist/server/git/worktrees.js +225 -0
  46. package/dist/server/git/worktrees.js.map +1 -0
  47. package/dist/server/github/gh.js +172 -0
  48. package/dist/server/github/gh.js.map +1 -0
  49. package/dist/server/pty/manager.js +129 -0
  50. package/dist/server/pty/manager.js.map +1 -0
  51. package/dist/server/pty/ring-buffer.js +40 -0
  52. package/dist/server/pty/ring-buffer.js.map +1 -0
  53. package/dist/server/server.js +36 -0
  54. package/dist/server/server.js.map +1 -0
  55. package/dist/server/workers/github-poller.js +185 -0
  56. package/dist/server/workers/github-poller.js.map +1 -0
  57. package/dist/server/workers/pr-watcher.js +111 -0
  58. package/dist/server/workers/pr-watcher.js.map +1 -0
  59. package/dist/server/workers/scheduler.js +209 -0
  60. package/dist/server/workers/scheduler.js.map +1 -0
  61. package/dist/server/ws/pty.js +72 -0
  62. package/dist/server/ws/pty.js.map +1 -0
  63. package/dist/shared/types.js +23 -0
  64. package/dist/shared/types.js.map +1 -0
  65. package/dist/web/assets/index-5VFn-lxF.js +129 -0
  66. package/dist/web/assets/index-CZHd5NaX.css +1 -0
  67. package/dist/web/index.html +19 -0
  68. package/package.json +79 -6
  69. package/scripts/fix-node-pty.mjs +35 -0
  70. package/index.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/cli/commands/configure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync, mkdirSync, unlinkSync, writeFileSync, readFileSync } from "node:fs";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { loadConfig, tonoHome, ConfigError } from "../../server/config/load.js";
6
+ import { buildPlist, GATEWAY_LABEL, plistPath } from "../launchd.js";
7
+ function entryPath() {
8
+ // dist/cli/commands/gateway.js → ../index.js
9
+ const here = dirname(fileURLToPath(import.meta.url));
10
+ return resolve(here, "..", "index.js");
11
+ }
12
+ function projectRoot() {
13
+ const here = dirname(fileURLToPath(import.meta.url));
14
+ return resolve(here, "..", "..", "..");
15
+ }
16
+ function exec(cmd, args) {
17
+ const r = spawnSync(cmd, args, { encoding: "utf8" });
18
+ return { code: r.status ?? -1, stdout: r.stdout ?? "", stderr: r.stderr ?? "" };
19
+ }
20
+ export function runGateway(args) {
21
+ const sub = args[0];
22
+ switch (sub) {
23
+ case "start":
24
+ start();
25
+ return;
26
+ case "stop":
27
+ stop();
28
+ return;
29
+ case "restart":
30
+ restart();
31
+ return;
32
+ case "status":
33
+ status();
34
+ return;
35
+ case "uninstall":
36
+ uninstall();
37
+ return;
38
+ case "logs":
39
+ logs(args.slice(1));
40
+ return;
41
+ case undefined:
42
+ case "--help":
43
+ case "-h":
44
+ console.log("tono gateway <subcommand>\n" +
45
+ " start install (or update) the LaunchAgent and load it\n" +
46
+ " stop unload the LaunchAgent (config kept)\n" +
47
+ " restart unload + load (apply node binary or plist changes)\n" +
48
+ " status show LaunchAgent + HTTP health\n" +
49
+ " uninstall unload and remove the LaunchAgent\n" +
50
+ " logs tail ~/.tono/logs/daemon.{out,err}.log");
51
+ return;
52
+ default:
53
+ console.error(`unknown subcommand: gateway ${sub}`);
54
+ process.exit(2);
55
+ }
56
+ }
57
+ function ensurePlist() {
58
+ // Validate config first — refuse to install a broken setup.
59
+ try {
60
+ loadConfig();
61
+ }
62
+ catch (err) {
63
+ if (err instanceof ConfigError) {
64
+ console.error("config validation failed; refusing to update gateway:");
65
+ console.error(err.message);
66
+ process.exit(1);
67
+ }
68
+ throw err;
69
+ }
70
+ const plistFile = plistPath();
71
+ const home = tonoHome();
72
+ const logsDir = join(home, "logs");
73
+ mkdirSync(dirname(plistFile), { recursive: true });
74
+ mkdirSync(logsDir, { recursive: true });
75
+ // Capture the user's current shell PATH so the gateway can find agent CLIs
76
+ // (claude, etc.) wherever they're installed. Append common system paths in case
77
+ // the parent shell happens to be minimal.
78
+ const userPath = process.env.PATH ?? "";
79
+ const fallbackPath = "/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin";
80
+ const mergedPath = [userPath, fallbackPath].filter(Boolean).join(":");
81
+ const xml = buildPlist({
82
+ nodeBinary: process.execPath,
83
+ entry: entryPath(),
84
+ outLog: join(logsDir, "daemon.out.log"),
85
+ errLog: join(logsDir, "daemon.err.log"),
86
+ workingDir: projectRoot(),
87
+ tonoHome: home,
88
+ path: mergedPath,
89
+ home: process.env.HOME,
90
+ });
91
+ // Avoid touching mtime if plist hasn't changed (so launchctl reload is unnecessary).
92
+ if (!existsSync(plistFile) || readFileSync(plistFile, "utf8") !== xml) {
93
+ writeFileSync(plistFile, xml);
94
+ console.log(`wrote ${plistFile}`);
95
+ }
96
+ return { plistFile, logsDir };
97
+ }
98
+ function start() {
99
+ const { plistFile, logsDir } = ensurePlist();
100
+ // Re-load: unload first if already loaded so any plist changes take effect.
101
+ exec("launchctl", ["unload", plistFile]);
102
+ const r = exec("launchctl", ["load", "-w", plistFile]);
103
+ if (r.code !== 0) {
104
+ console.error(`launchctl load failed: ${r.stderr.trim() || r.stdout.trim()}`);
105
+ process.exit(1);
106
+ }
107
+ console.log(`gateway started (${GATEWAY_LABEL})`);
108
+ console.log(`logs: ${logsDir}/daemon.{out,err}.log`);
109
+ }
110
+ function stop() {
111
+ const plistFile = plistPath();
112
+ if (!existsSync(plistFile)) {
113
+ console.log(`gateway not installed (no plist at ${plistFile})`);
114
+ return;
115
+ }
116
+ const r = exec("launchctl", ["unload", plistFile]);
117
+ if (r.code !== 0 && !/could not find specified service/i.test(r.stderr)) {
118
+ console.error(`launchctl unload returned ${r.code}: ${r.stderr.trim() || r.stdout.trim()}`);
119
+ process.exit(1);
120
+ }
121
+ console.log(`gateway stopped (${GATEWAY_LABEL})`);
122
+ }
123
+ function restart() {
124
+ const plistFile = plistPath();
125
+ if (!existsSync(plistFile)) {
126
+ console.error(`gateway not installed; run 'tono gateway start' first`);
127
+ process.exit(1);
128
+ }
129
+ ensurePlist();
130
+ exec("launchctl", ["unload", plistFile]);
131
+ const r = exec("launchctl", ["load", "-w", plistFile]);
132
+ if (r.code !== 0) {
133
+ console.error(`launchctl load failed: ${r.stderr.trim() || r.stdout.trim()}`);
134
+ process.exit(1);
135
+ }
136
+ console.log(`gateway restarted (${GATEWAY_LABEL})`);
137
+ }
138
+ function uninstall() {
139
+ const plistFile = plistPath();
140
+ if (!existsSync(plistFile)) {
141
+ console.log(`${plistFile} does not exist; nothing to do`);
142
+ return;
143
+ }
144
+ exec("launchctl", ["unload", plistFile]);
145
+ unlinkSync(plistFile);
146
+ console.log(`removed ${plistFile}`);
147
+ }
148
+ function status() {
149
+ const plistFile = plistPath();
150
+ console.log(`plist: ${existsSync(plistFile) ? plistFile : "(not installed)"}`);
151
+ const r = exec("launchctl", ["list", GATEWAY_LABEL]);
152
+ if (r.code === 0) {
153
+ const pid = r.stdout.match(/"PID"\s*=\s*(\d+)/)?.[1];
154
+ const lastExit = r.stdout.match(/"LastExitStatus"\s*=\s*(-?\d+)/)?.[1];
155
+ console.log(`launchctl: loaded${pid ? ` (pid ${pid})` : ""}${lastExit && lastExit !== "0" && !pid ? ` last exit ${lastExit}` : ""}`);
156
+ }
157
+ else {
158
+ console.log(`launchctl: not loaded`);
159
+ }
160
+ pingHealth().then((res) => {
161
+ if (res.ok)
162
+ console.log(`http: ${res.url} (agents=${res.agents}, repos=${res.repos})`);
163
+ else
164
+ console.log(`http: ${res.url ?? ""} ${res.error}`);
165
+ });
166
+ }
167
+ function logs(args) {
168
+ const which = args[0] ?? "out";
169
+ const file = which === "err"
170
+ ? join(tonoHome(), "logs", "daemon.err.log")
171
+ : join(tonoHome(), "logs", "daemon.out.log");
172
+ if (!existsSync(file)) {
173
+ console.error(`no log file at ${file} (gateway hasn't run yet?)`);
174
+ process.exit(1);
175
+ }
176
+ // exec tail -f so user can stream
177
+ const child = spawnSync("tail", ["-n", "200", "-f", file], { stdio: "inherit" });
178
+ process.exit(child.status ?? 0);
179
+ }
180
+ async function pingHealth() {
181
+ try {
182
+ const cfg = loadConfig();
183
+ const url = `http://${cfg.server.host === "0.0.0.0" ? "127.0.0.1" : cfg.server.host}:${cfg.server.port}/api/health`;
184
+ const res = await fetch(url, { signal: AbortSignal.timeout(2000) });
185
+ if (!res.ok)
186
+ return { ok: false, url, error: `HTTP ${res.status}` };
187
+ const j = (await res.json());
188
+ return { ok: true, url, agents: Object.keys(j.agents ?? {}).length, repos: j.reposWatched };
189
+ }
190
+ catch (err) {
191
+ return { ok: false, error: err.message };
192
+ }
193
+ }
194
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../src/cli/commands/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAc,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAErE,SAAS,SAAS;IAChB,6CAA6C;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,IAAI,CAAC,GAAW,EAAE,IAAc;IACvC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,KAAK,EAAE,CAAC;YACR,OAAO;QACT,KAAK,MAAM;YACT,IAAI,EAAE,CAAC;YACP,OAAO;QACT,KAAK,SAAS;YACZ,OAAO,EAAE,CAAC;YACV,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,EAAE,CAAC;YACT,OAAO;QACT,KAAK,WAAW;YACd,SAAS,EAAE,CAAC;YACZ,OAAO;QACT,KAAK,MAAM;YACT,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpB,OAAO;QACT,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CACT,6BAA6B;gBAC3B,gEAAgE;gBAChE,qDAAqD;gBACrD,mEAAmE;gBACnE,+CAA+C;gBAC/C,kDAAkD;gBAClD,qDAAqD,CACxD,CAAC;YACF,OAAO;QACT;YACE,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,4DAA4D;IAC5D,IAAI,CAAC;QACH,UAAU,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,2EAA2E;IAC3E,gFAAgF;IAChF,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACxC,MAAM,YAAY,GAAG,gEAAgE,CAAC;IACtF,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEtE,MAAM,GAAG,GAAG,UAAU,CAAC;QACrB,UAAU,EAAE,OAAO,CAAC,QAAQ;QAC5B,KAAK,EAAE,SAAS,EAAE;QAClB,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACvC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACvC,UAAU,EAAE,WAAW,EAAE;QACzB,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;KACvB,CAAC,CAAC;IAEH,qFAAqF;IACrF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QACtE,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,KAAK;IACZ,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;IAC7C,4EAA4E;IAC5E,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,uBAAuB,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,IAAI;IACX,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sCAAsC,SAAS,GAAG,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,OAAO;IACd,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,WAAW,EAAE,CAAC;IACd,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,gCAAgC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IACzC,UAAU,CAAC,SAAS,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,MAAM;IACb,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACnF,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,IAAI,QAAQ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvI,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IACD,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACxB,IAAI,GAAG,CAAC,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;;YACvF,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,IAAI,CAAC,IAAc;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,KAAK,KAAK;QAC1B,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,4BAA4B,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,kCAAkC;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,UAAU;IAIvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC;QACpH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA8D,CAAC;QAC1F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;IAC9F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { configPath, tonoHome, SCHEMA_PATH } from "../../server/config/load.js";
4
+ import { openDb } from "../../server/db/client.js";
5
+ const IMPLEMENT_TEMPLATE_BASE = "You are working on GitHub issue #{issueNumber} in {repoSlug}.\n\n" +
6
+ "Title: {issueTitle}\n\n" +
7
+ "{issueBody}\n\n" +
8
+ "Implement the changes needed to resolve this issue. The current branch is " +
9
+ "{branch}, based on {baseBranch}. When implementation is complete, commit with " +
10
+ "a clear message, push the branch with `git push -u origin {branch}`, and open a " +
11
+ "pull request with `gh pr create --base {baseBranch} --fill`. If the issue is " +
12
+ "unclear or unsafe to proceed, leave a comment on the issue explaining why with " +
13
+ "`gh issue comment {issueNumber} --body \"<reason>\"` and stop.";
14
+ const REVIEW_TEMPLATE_BASE = "You are reviewing GitHub PR #{issueNumber} in {repoSlug}: \"{issueTitle}\".\n" +
15
+ "PR URL: {prUrl}\n" +
16
+ "The PR's head branch ({branch}) is checked out at the current working directory.\n\n" +
17
+ "Description:\n{issueBody}\n\n" +
18
+ "Read the diff (`gh pr diff {issueNumber}`) and inspect the changed files. Form a " +
19
+ "thorough review: correctness, edge cases, security, performance, readability.\n\n" +
20
+ "When done, post your review with " +
21
+ "`gh pr review {issueNumber} --comment --body \"<review body>\"` (use --request-changes " +
22
+ "if you found blocking issues, or --approve if it's good to merge). For inline file/line " +
23
+ "comments use `gh api repos/{repoSlug}/pulls/{issueNumber}/comments`.\n\n" +
24
+ "Do not push commits. Do not create new PRs.";
25
+ const DEFAULT_CONFIG = {
26
+ $schema: "./config.schema.json",
27
+ server: { host: "0.0.0.0", port: 7040 },
28
+ github: { pollIntervalSeconds: 60 },
29
+ workspaces: { root: "~/.tono/workspaces" },
30
+ repos: [],
31
+ agents: {
32
+ "claude-code": {
33
+ command: "claude",
34
+ args: ["--dangerously-skip-permissions"],
35
+ concurrency: { implement: 2, review: 4 },
36
+ promptTemplates: {
37
+ implement: IMPLEMENT_TEMPLATE_BASE,
38
+ review: REVIEW_TEMPLATE_BASE,
39
+ },
40
+ },
41
+ codex: {
42
+ command: "codex",
43
+ args: [],
44
+ concurrency: { implement: 1, review: 2 },
45
+ promptTemplates: {
46
+ implement: IMPLEMENT_TEMPLATE_BASE,
47
+ review: REVIEW_TEMPLATE_BASE,
48
+ },
49
+ },
50
+ opencode: {
51
+ command: "opencode",
52
+ args: ["run", "{prompt}"],
53
+ concurrency: { implement: 1, review: 2 },
54
+ promptTemplates: {
55
+ implement: IMPLEMENT_TEMPLATE_BASE,
56
+ review: REVIEW_TEMPLATE_BASE,
57
+ },
58
+ },
59
+ },
60
+ };
61
+ export function runInit(opts = {}) {
62
+ const home = tonoHome();
63
+ const cfgPath = configPath();
64
+ const schemaDest = join(home, "config.schema.json");
65
+ const workspacesDir = join(home, "workspaces");
66
+ const logsDir = join(home, "logs");
67
+ mkdirSync(home, { recursive: true });
68
+ mkdirSync(workspacesDir, { recursive: true });
69
+ mkdirSync(logsDir, { recursive: true });
70
+ copyFileSync(SCHEMA_PATH, schemaDest);
71
+ console.log(`wrote ${schemaDest}`);
72
+ if (existsSync(cfgPath) && !opts.force) {
73
+ console.log(`config already exists at ${cfgPath} (use --force to overwrite)`);
74
+ }
75
+ else {
76
+ writeFileSync(cfgPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + "\n");
77
+ console.log(`wrote ${cfgPath}`);
78
+ }
79
+ const db = openDb();
80
+ db.close();
81
+ console.log(`initialized database`);
82
+ console.log("");
83
+ console.log("tono initialized at " + home);
84
+ console.log("next:");
85
+ console.log(" 1. edit " + cfgPath + " to add a repo under \"repos\"");
86
+ console.log(" 2. run `tono config labels` to see the GitHub labels each agent listens for");
87
+ console.log(" 3. apply one of those labels to a GitHub issue or PR to trigger a task");
88
+ }
89
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { loadConfig, ConfigError } from "../../server/config/load.js";
3
+ export function runOpen() {
4
+ let cfg;
5
+ try {
6
+ cfg = loadConfig();
7
+ }
8
+ catch (err) {
9
+ if (err instanceof ConfigError) {
10
+ console.error(err.message);
11
+ process.exit(1);
12
+ }
13
+ throw err;
14
+ }
15
+ const host = cfg.server.host === "0.0.0.0" ? "localhost" : cfg.server.host;
16
+ const url = `http://${host}:${cfg.server.port}`;
17
+ const r = spawnSync("open", [url], { stdio: "inherit" });
18
+ if (r.status !== 0) {
19
+ console.error(`failed to open ${url}`);
20
+ process.exit(r.status ?? 1);
21
+ }
22
+ }
23
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/cli/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEtE,MAAM,UAAU,OAAO;IACrB,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,UAAU,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAC3E,MAAM,GAAG,GAAG,UAAU,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { loadConfig, ConfigError } from "../../server/config/load.js";
2
+ import { ConfigManager } from "../../server/config/manager.js";
3
+ import { openDb } from "../../server/db/client.js";
4
+ import { Queries } from "../../server/db/queries.js";
5
+ import { createBus } from "../../server/events.js";
6
+ import { GithubPoller } from "../../server/workers/github-poller.js";
7
+ import { PrWatcher } from "../../server/workers/pr-watcher.js";
8
+ import { Scheduler } from "../../server/workers/scheduler.js";
9
+ import { PtyManager } from "../../server/pty/manager.js";
10
+ import { startServer } from "../../server/server.js";
11
+ import * as gh from "../../server/github/gh.js";
12
+ function tsLog(msg) {
13
+ const ts = new Date().toISOString();
14
+ process.stdout.write(`${ts} ${msg}\n`);
15
+ }
16
+ export async function runStart() {
17
+ let cfg;
18
+ try {
19
+ cfg = loadConfig();
20
+ }
21
+ catch (err) {
22
+ if (err instanceof ConfigError) {
23
+ console.error(err.message);
24
+ process.exit(1);
25
+ }
26
+ throw err;
27
+ }
28
+ // Pre-flight: gh auth.
29
+ try {
30
+ const auth = await gh.authStatus();
31
+ if (!auth.ok) {
32
+ console.error("`gh` is not authenticated. Run `gh auth login` and retry.");
33
+ console.error(auth.detail);
34
+ process.exit(1);
35
+ }
36
+ }
37
+ catch (err) {
38
+ console.error(err.message);
39
+ process.exit(1);
40
+ }
41
+ tsLog(`tono starting`);
42
+ tsLog(` workspaces: ${cfg.workspaces.root}`);
43
+ tsLog(` poll: ${cfg.github.pollIntervalSeconds}s`);
44
+ const declaredAgents = Object.keys(cfg.agents);
45
+ tsLog(` agents: ${declaredAgents.join(", ") || "(none)"}`);
46
+ for (const [name, a] of Object.entries(cfg.agents)) {
47
+ if (!a)
48
+ continue;
49
+ tsLog(` - ${name}: command="${a.command}" implement=${a.concurrency.implement} review=${a.concurrency.review}`);
50
+ }
51
+ tsLog(` repos: ${cfg.repos.length}`);
52
+ for (const r of cfg.repos) {
53
+ const enabled = (r.agents && r.agents.length > 0 ? r.agents : declaredAgents).join(", ");
54
+ tsLog(` - ${r.slug} base=${r.baseBranch} agents=[${enabled}]`);
55
+ }
56
+ if (cfg.repos.length === 0) {
57
+ tsLog(`no repos configured; poller will idle until you add some via the UI Settings page.`);
58
+ }
59
+ const db = openDb();
60
+ const q = new Queries(db);
61
+ const bus = createBus();
62
+ const pty = new PtyManager();
63
+ // Single source of truth for live config; mutated by API + propagates to workers.
64
+ const configManager = new ConfigManager(cfg, (newCfg) => {
65
+ poller.refreshConfig(newCfg);
66
+ prWatcher.refresh();
67
+ tsLog(`config reloaded: ${newCfg.repos.length} repos, ${Object.keys(newCfg.agents).length} agents`);
68
+ poller.poke();
69
+ });
70
+ const scheduler = new Scheduler({ configManager, q, bus, pty, log: tsLog });
71
+ scheduler.start();
72
+ const poller = new GithubPoller(configManager.cfg, q, bus, tsLog);
73
+ poller.start();
74
+ const prWatcher = new PrWatcher(configManager, q, bus, tsLog);
75
+ prWatcher.start();
76
+ const server = await startServer({ configManager, q, pty, poller, bus });
77
+ tsLog(`HTTP + WS listening on ${server.url} (host=${cfg.server.host}, port=${cfg.server.port})`);
78
+ let shuttingDown = false;
79
+ const shutdown = async (signal) => {
80
+ if (shuttingDown)
81
+ return;
82
+ shuttingDown = true;
83
+ const live = pty.list().filter((s) => s.status === "running");
84
+ tsLog(`received ${signal}; ${live.length} live session${live.length === 1 ? "" : "s"} — letting them flush state before exiting`);
85
+ poller.stop();
86
+ prWatcher.stop();
87
+ // Mark live agent tasks so the UI can show them as resumable rather than
88
+ // running. Free-form shells have no taskId so are simply killed.
89
+ for (const s of live) {
90
+ if (s.taskId === null)
91
+ continue;
92
+ try {
93
+ q.setTaskStatus(s.taskId, "failed", { exitCode: -2 });
94
+ }
95
+ catch { /* ignore */ }
96
+ }
97
+ pty.killAll("SIGTERM");
98
+ try {
99
+ await server.close();
100
+ }
101
+ catch { /* ignore */ }
102
+ // 5s graceful window — claude saves transcripts, gh PR creation, etc.
103
+ setTimeout(() => {
104
+ try {
105
+ db.close();
106
+ }
107
+ catch { /* ignore */ }
108
+ process.exit(0);
109
+ }, 5000);
110
+ };
111
+ process.on("SIGINT", () => void shutdown("SIGINT"));
112
+ process.on("SIGTERM", () => void shutdown("SIGTERM"));
113
+ // Keep alive.
114
+ await new Promise(() => { });
115
+ }
116
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ import { runInit } from "./commands/init.js";
3
+ import { runConfig } from "./commands/config.js";
4
+ import { runConfigure } from "./commands/configure.js";
5
+ import { runStart } from "./commands/start.js";
6
+ import { runGateway } from "./commands/gateway.js";
7
+ import { runOpen } from "./commands/open.js";
8
+ const VERSION = "0.0.1";
9
+ const HELP = `tono ${VERSION}
10
+
11
+ Usage:
12
+ tono <command> [args]
13
+
14
+ Commands:
15
+ init [--force] initialize ~/.tono with default config and database
16
+ 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
22
+ 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)
25
+ open open the web UI in the default browser
26
+ config path print the config file path
27
+ config validate validate the config against the schema
28
+ help, version
29
+
30
+ Run 'tono <command> --help' for command-specific help.
31
+ `;
32
+ async function main(argv) {
33
+ const [cmd, ...rest] = argv;
34
+ switch (cmd) {
35
+ case undefined:
36
+ case "help":
37
+ case "--help":
38
+ case "-h":
39
+ console.log(HELP);
40
+ return;
41
+ case "version":
42
+ case "--version":
43
+ case "-v":
44
+ console.log(VERSION);
45
+ return;
46
+ case "init":
47
+ runInit({ force: rest.includes("--force") });
48
+ return;
49
+ case "configure":
50
+ await runConfigure();
51
+ return;
52
+ case "start":
53
+ await runStart();
54
+ return;
55
+ case "gateway":
56
+ runGateway(rest);
57
+ return;
58
+ case "daemon":
59
+ console.error("`tono daemon` was renamed to `tono gateway`. forwarding…");
60
+ runGateway(rest);
61
+ return;
62
+ case "open":
63
+ runOpen();
64
+ return;
65
+ case "config":
66
+ runConfig(rest);
67
+ return;
68
+ default:
69
+ console.error(`unknown command: ${cmd}`);
70
+ console.error(`run 'tono help' for usage`);
71
+ process.exit(2);
72
+ }
73
+ }
74
+ main(process.argv.slice(2)).catch((err) => {
75
+ console.error(err.message);
76
+ process.exit(1);
77
+ });
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,56 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ export const GATEWAY_LABEL = "com.tono.gateway";
4
+ export function plistPath() {
5
+ return join(homedir(), "Library", "LaunchAgents", `${GATEWAY_LABEL}.plist`);
6
+ }
7
+ function escapeXml(s) {
8
+ return s.replace(/[<>&'"]/g, (c) => {
9
+ switch (c) {
10
+ case "<": return "&lt;";
11
+ case ">": return "&gt;";
12
+ case "&": return "&amp;";
13
+ case "'": return "&apos;";
14
+ case '"': return "&quot;";
15
+ default: return c;
16
+ }
17
+ });
18
+ }
19
+ export function buildPlist(inp) {
20
+ const args = [inp.nodeBinary, inp.entry, "start"];
21
+ return `<?xml version="1.0" encoding="UTF-8"?>
22
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
23
+ <plist version="1.0">
24
+ <dict>
25
+ <key>Label</key>
26
+ <string>${GATEWAY_LABEL}</string>
27
+ <key>ProgramArguments</key>
28
+ <array>
29
+ ${args.map((a) => ` <string>${escapeXml(a)}</string>`).join("\n")}
30
+ </array>
31
+ <key>WorkingDirectory</key>
32
+ <string>${escapeXml(inp.workingDir)}</string>
33
+ <key>EnvironmentVariables</key>
34
+ <dict>
35
+ <key>TONO_HOME</key>
36
+ <string>${escapeXml(inp.tonoHome)}</string>
37
+ <key>PATH</key>
38
+ <string>${escapeXml(inp.path)}</string>${inp.home ? `
39
+ <key>HOME</key>
40
+ <string>${escapeXml(inp.home)}</string>` : ""}
41
+ </dict>
42
+ <key>StandardOutPath</key>
43
+ <string>${escapeXml(inp.outLog)}</string>
44
+ <key>StandardErrorPath</key>
45
+ <string>${escapeXml(inp.errLog)}</string>
46
+ <key>RunAtLoad</key>
47
+ <true/>
48
+ <key>KeepAlive</key>
49
+ <true/>
50
+ <key>ProcessType</key>
51
+ <string>Background</string>
52
+ </dict>
53
+ </plist>
54
+ `;
55
+ }
56
+ //# sourceMappingURL=launchd.js.map
@@ -0,0 +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"}