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.
- package/LICENSE +21 -674
- package/README.md +300 -0
- package/dist/cli/commands/config.js +86 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/configure.js +260 -0
- package/dist/cli/commands/configure.js.map +1 -0
- package/dist/cli/commands/gateway.js +194 -0
- package/dist/cli/commands/gateway.js.map +1 -0
- package/dist/cli/commands/init.js +89 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/open.js +23 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/start.js +116 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.js +78 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/launchd.js +56 -0
- package/dist/cli/launchd.js.map +1 -0
- package/dist/cli/prompt.js +46 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/server/agents/claude-code.js +80 -0
- package/dist/server/agents/claude-code.js.map +1 -0
- package/dist/server/agents/codex.js +52 -0
- package/dist/server/agents/codex.js.map +1 -0
- package/dist/server/agents/opencode.js +50 -0
- package/dist/server/agents/opencode.js.map +1 -0
- package/dist/server/agents/registry.js +16 -0
- package/dist/server/agents/registry.js.map +1 -0
- package/dist/server/agents/types.js +40 -0
- package/dist/server/agents/types.js.map +1 -0
- package/dist/server/app.js +324 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/config/load.js +91 -0
- package/dist/server/config/load.js.map +1 -0
- package/dist/server/config/manager.js +38 -0
- package/dist/server/config/manager.js.map +1 -0
- package/dist/server/config/schema.json +151 -0
- package/dist/server/db/client.js +136 -0
- package/dist/server/db/client.js.map +1 -0
- package/dist/server/db/queries.js +158 -0
- package/dist/server/db/queries.js.map +1 -0
- package/dist/server/db/schema.sql +61 -0
- package/dist/server/events.js +5 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/git/worktrees.js +225 -0
- package/dist/server/git/worktrees.js.map +1 -0
- package/dist/server/github/gh.js +172 -0
- package/dist/server/github/gh.js.map +1 -0
- package/dist/server/pty/manager.js +129 -0
- package/dist/server/pty/manager.js.map +1 -0
- package/dist/server/pty/ring-buffer.js +40 -0
- package/dist/server/pty/ring-buffer.js.map +1 -0
- package/dist/server/server.js +36 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/workers/github-poller.js +185 -0
- package/dist/server/workers/github-poller.js.map +1 -0
- package/dist/server/workers/pr-watcher.js +111 -0
- package/dist/server/workers/pr-watcher.js.map +1 -0
- package/dist/server/workers/scheduler.js +209 -0
- package/dist/server/workers/scheduler.js.map +1 -0
- package/dist/server/ws/pty.js +72 -0
- package/dist/server/ws/pty.js.map +1 -0
- package/dist/shared/types.js +23 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/web/assets/index-5VFn-lxF.js +129 -0
- package/dist/web/assets/index-CZHd5NaX.css +1 -0
- package/dist/web/index.html +19 -0
- package/package.json +79 -6
- package/scripts/fix-node-pty.mjs +35 -0
- 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 "<";
|
|
11
|
+
case ">": return ">";
|
|
12
|
+
case "&": return "&";
|
|
13
|
+
case "'": return "'";
|
|
14
|
+
case '"': return """;
|
|
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"}
|