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
@@ -2,12 +2,21 @@ import { serve } from "@hono/node-server";
2
2
  import { WebSocketServer } from "ws";
3
3
  import { buildApp } from "./app.js";
4
4
  import { attachPtyWs } from "./ws/pty.js";
5
- export function startServer(deps) {
5
+ import { attachWorkersWs } from "./ws/workers.js";
6
+ export function startServer(args) {
6
7
  return new Promise((resolvePromise) => {
7
- const app = buildApp(deps);
8
- const wss = new WebSocketServer({ noServer: true });
9
- attachPtyWs({ wss, pty: deps.pty });
10
- const cfg = deps.configManager.cfg;
8
+ const app = buildApp(args);
9
+ const ptyWss = new WebSocketServer({ noServer: true });
10
+ const workersWss = new WebSocketServer({ noServer: true });
11
+ attachPtyWs({ wss: ptyWss, registry: args.registry, q: args.q });
12
+ attachWorkersWs({
13
+ wss: workersWss,
14
+ registry: args.registry,
15
+ q: args.q,
16
+ bus: args.bus,
17
+ log: args.log,
18
+ });
19
+ const cfg = args.configManager.cfg;
11
20
  const httpServer = serve({
12
21
  fetch: app.fetch,
13
22
  hostname: cfg.server.host,
@@ -17,19 +26,27 @@ export function startServer(deps) {
17
26
  resolvePromise({
18
27
  url: `http://${host}:${info.port}`,
19
28
  close: () => new Promise((res) => {
20
- wss.close();
29
+ ptyWss.close();
30
+ workersWss.close();
21
31
  httpServer.close(() => res());
22
32
  }),
23
33
  });
24
34
  });
25
35
  httpServer.on("upgrade", (req, socket, head) => {
26
- if (!req.url?.startsWith("/api/sessions/")) {
27
- socket.destroy();
36
+ const url = req.url ?? "";
37
+ if (url.startsWith("/api/sessions/")) {
38
+ ptyWss.handleUpgrade(req, socket, head, (ws) => {
39
+ ptyWss.emit("connection", ws, req);
40
+ });
28
41
  return;
29
42
  }
30
- wss.handleUpgrade(req, socket, head, (ws) => {
31
- wss.emit("connection", ws, req);
32
- });
43
+ if (url.startsWith("/api/workers/connect")) {
44
+ workersWss.handleUpgrade(req, socket, head, (ws) => {
45
+ workersWss.emit("connection", ws, req);
46
+ });
47
+ return;
48
+ }
49
+ socket.destroy();
33
50
  });
34
51
  });
35
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAIrC,OAAO,EAAE,QAAQ,EAAgB,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO1C,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAEpC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CACtB;YACE,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;YACzB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;SACtB,EACD,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9F,cAAc,CAAC;gBACb,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;gBAClC,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,EAAE;oBACxB,GAAG,CAAC,KAAK,EAAE,CAAC;oBACX,UAAqB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC5C,CAAC,CAAC;aACL,CAAC,CAAC;QACL,CAAC,CACQ,CAAC;QAEZ,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAoB,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;YAC9E,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAC1C,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,396 @@
1
+ import { hostname as osHostname, platform, arch as osArch } from "node:os";
2
+ import { join } from "node:path";
3
+ import { existsSync } from "node:fs";
4
+ import WebSocket from "ws";
5
+ import { decodePtyFrame, } from "../../shared/worker-protocol.js";
6
+ import { PtyManager } from "../pty/manager.js";
7
+ import { createReviewWorktree, createWorktree } from "../git/worktrees.js";
8
+ import { getAdapter } from "../agents/registry.js";
9
+ import { parsePrUrl } from "../github/gh.js";
10
+ import { bridgeSessionToWs } from "./pty-bridge.js";
11
+ const HEARTBEAT_MS = 5_000;
12
+ const RECONNECT_BASE_MS = 1_000;
13
+ const RECONNECT_MAX_MS = 15_000;
14
+ export class WorkerAgent {
15
+ opts;
16
+ ws = null;
17
+ heartbeatTimer = null;
18
+ reconnectTimer = null;
19
+ reconnectAttempt = 0;
20
+ stopped = false;
21
+ pty = new PtyManager();
22
+ active = new Map();
23
+ sessionToTask = new Map();
24
+ log;
25
+ constructor(opts) {
26
+ this.opts = opts;
27
+ this.log = opts.log ?? ((msg) => process.stdout.write(`${new Date().toISOString()} ${msg}\n`));
28
+ }
29
+ start() {
30
+ this.connect();
31
+ }
32
+ async stop() {
33
+ this.stopped = true;
34
+ if (this.reconnectTimer)
35
+ clearTimeout(this.reconnectTimer);
36
+ if (this.heartbeatTimer)
37
+ clearInterval(this.heartbeatTimer);
38
+ this.pty.killAll("SIGTERM");
39
+ if (this.ws && this.ws.readyState === this.ws.OPEN) {
40
+ try {
41
+ this.ws.close(1000, "shutdown");
42
+ }
43
+ catch { /* ignore */ }
44
+ }
45
+ }
46
+ connect() {
47
+ if (this.stopped)
48
+ return;
49
+ const ws = new WebSocket(this.opts.gatewayUrl);
50
+ this.ws = ws;
51
+ ws.on("open", () => {
52
+ this.reconnectAttempt = 0;
53
+ this.log(`[worker] connected to ${this.opts.gatewayUrl}`);
54
+ this.sendHello();
55
+ this.startHeartbeat();
56
+ });
57
+ ws.on("message", (raw, isBinary) => {
58
+ if (isBinary) {
59
+ const buf = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);
60
+ const decoded = decodePtyFrame(buf);
61
+ if (!decoded)
62
+ return;
63
+ const session = this.pty.get(decoded.sessionId);
64
+ if (!session)
65
+ return;
66
+ if (decoded.payload.length > 0) {
67
+ session.write(decoded.payload.toString("utf8"));
68
+ }
69
+ return;
70
+ }
71
+ let msg;
72
+ try {
73
+ msg = JSON.parse(raw.toString("utf8"));
74
+ }
75
+ catch {
76
+ return;
77
+ }
78
+ void this.handleControl(msg);
79
+ });
80
+ ws.on("close", () => {
81
+ this.log(`[worker] connection closed`);
82
+ this.stopHeartbeat();
83
+ this.scheduleReconnect();
84
+ });
85
+ ws.on("error", (err) => {
86
+ this.log(`[worker] ws error: ${err.message}`);
87
+ });
88
+ }
89
+ scheduleReconnect() {
90
+ if (this.stopped)
91
+ return;
92
+ if (this.reconnectTimer)
93
+ return;
94
+ const delay = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * 2 ** this.reconnectAttempt);
95
+ this.reconnectAttempt += 1;
96
+ this.log(`[worker] reconnecting in ${delay}ms`);
97
+ this.reconnectTimer = setTimeout(() => {
98
+ this.reconnectTimer = null;
99
+ this.connect();
100
+ }, delay);
101
+ }
102
+ startHeartbeat() {
103
+ this.stopHeartbeat();
104
+ this.heartbeatTimer = setInterval(() => this.sendHeartbeat(), HEARTBEAT_MS);
105
+ }
106
+ stopHeartbeat() {
107
+ if (this.heartbeatTimer)
108
+ clearInterval(this.heartbeatTimer);
109
+ this.heartbeatTimer = null;
110
+ }
111
+ sendHello() {
112
+ if (!this.ws || this.ws.readyState !== this.ws.OPEN)
113
+ return;
114
+ const msg = {
115
+ type: "worker.hello",
116
+ workerId: this.opts.workerId,
117
+ hostname: this.opts.hostname ?? osHostname(),
118
+ os: platform(),
119
+ arch: osArch(),
120
+ capabilities: this.opts.capabilities,
121
+ capacity: this.computeCapacity(),
122
+ runningSessions: this.runningSessions(),
123
+ };
124
+ try {
125
+ this.ws.send(JSON.stringify(msg));
126
+ }
127
+ catch { /* ignore */ }
128
+ }
129
+ sendHeartbeat() {
130
+ if (!this.ws || this.ws.readyState !== this.ws.OPEN)
131
+ return;
132
+ const msg = {
133
+ type: "worker.heartbeat",
134
+ capacity: this.computeCapacity(),
135
+ runningSessions: this.runningSessions(),
136
+ };
137
+ try {
138
+ this.ws.send(JSON.stringify(msg));
139
+ }
140
+ catch { /* ignore */ }
141
+ }
142
+ runningSessions() {
143
+ return [...this.active.values()].map((t) => ({ sessionId: t.sessionId, taskId: t.taskId }));
144
+ }
145
+ /**
146
+ * Compute remaining capacity: configured cap minus currently active tasks
147
+ * by (agent, kind). The configured cap on opts.capacity.byAgent is treated
148
+ * as the *total* — we subtract live work.
149
+ */
150
+ computeCapacity() {
151
+ const out = { byAgent: {} };
152
+ for (const [agent, slots] of Object.entries(this.opts.capacity.byAgent)) {
153
+ if (!slots)
154
+ continue;
155
+ let implement = slots.implement;
156
+ let review = slots.review;
157
+ for (const t of this.active.values()) {
158
+ if (t.agent !== agent)
159
+ continue;
160
+ if (t.kind === "implement")
161
+ implement -= 1;
162
+ else
163
+ review -= 1;
164
+ }
165
+ out.byAgent[agent] = {
166
+ implement: Math.max(0, implement),
167
+ review: Math.max(0, review),
168
+ };
169
+ }
170
+ return out;
171
+ }
172
+ send(msg) {
173
+ if (!this.ws || this.ws.readyState !== this.ws.OPEN)
174
+ return;
175
+ try {
176
+ this.ws.send(JSON.stringify(msg));
177
+ }
178
+ catch { /* ignore */ }
179
+ }
180
+ async handleControl(msg) {
181
+ switch (msg.type) {
182
+ case "task.assign":
183
+ await this.handleAssign(msg);
184
+ break;
185
+ case "session.input": {
186
+ const s = this.pty.get(msg.sessionId);
187
+ if (s)
188
+ s.write(msg.data);
189
+ break;
190
+ }
191
+ case "session.resize": {
192
+ const s = this.pty.get(msg.sessionId);
193
+ if (s)
194
+ s.resize(msg.cols, msg.rows);
195
+ break;
196
+ }
197
+ case "session.kill": {
198
+ const s = this.pty.get(msg.sessionId);
199
+ if (s)
200
+ s.kill(msg.signal ?? "SIGTERM");
201
+ break;
202
+ }
203
+ case "task.cancel": {
204
+ const t = this.active.get(msg.taskId);
205
+ if (!t)
206
+ break;
207
+ const s = this.pty.get(t.sessionId);
208
+ if (s)
209
+ s.kill("SIGTERM");
210
+ break;
211
+ }
212
+ case "session.scrollback.request": {
213
+ const s = this.pty.get(msg.sessionId);
214
+ if (!s)
215
+ break;
216
+ const scroll = s.scrollback();
217
+ const sz = s.size();
218
+ this.send({
219
+ type: "session.scrollback",
220
+ sessionId: msg.sessionId,
221
+ data: scroll.toString("base64"),
222
+ cols: sz.cols,
223
+ rows: sz.rows,
224
+ });
225
+ break;
226
+ }
227
+ }
228
+ }
229
+ async handleAssign(msg) {
230
+ if (this.active.has(msg.taskId)) {
231
+ this.send({ type: "task.nacked", taskId: msg.taskId, reason: "already running on this worker" });
232
+ return;
233
+ }
234
+ this.send({ type: "task.accepted", taskId: msg.taskId });
235
+ let worktreePath;
236
+ let branch;
237
+ try {
238
+ if (msg.kind === "review") {
239
+ const wt = await createReviewWorktree({
240
+ workspacesRoot: this.opts.workspacesRoot,
241
+ slug: msg.repoSlug,
242
+ prNumber: msg.issueNumber,
243
+ // Always use worker-local bare clone — the gateway's repoSourcePath
244
+ // refers to the gateway's filesystem and is not portable.
245
+ sourcePath: undefined,
246
+ });
247
+ worktreePath = wt.path;
248
+ branch = wt.branch;
249
+ }
250
+ else {
251
+ const wt = await createWorktree({
252
+ workspacesRoot: this.opts.workspacesRoot,
253
+ slug: msg.repoSlug,
254
+ issueNumber: msg.issueNumber,
255
+ baseBranch: msg.baseBranch,
256
+ sourcePath: undefined,
257
+ });
258
+ worktreePath = wt.path;
259
+ branch = wt.branch;
260
+ }
261
+ }
262
+ catch (err) {
263
+ this.log(`[worker] task #${msg.taskId} worktree failed: ${err.message}`);
264
+ this.send({ type: "task.nacked", taskId: msg.taskId, reason: `worktree failed: ${err.message}` });
265
+ return;
266
+ }
267
+ const adapter = getAdapter(msg.agent);
268
+ const specArgs = {
269
+ agentConfig: msg.agentConfig,
270
+ kind: msg.kind,
271
+ ctx: {
272
+ issueNumber: msg.issueNumber,
273
+ issueTitle: msg.issueTitle,
274
+ issueBody: msg.issueBody,
275
+ repoSlug: msg.repoSlug,
276
+ baseBranch: msg.baseBranch,
277
+ branch,
278
+ ...(msg.kind === "review" ? { prUrl: msg.prUrl ?? "", prHeadRef: branch } : {}),
279
+ },
280
+ worktreePath,
281
+ };
282
+ let resumeId = msg.resumeAgentSessionId;
283
+ if (!resumeId) {
284
+ resumeId = adapter.findExistingSession({ cwd: worktreePath });
285
+ }
286
+ const spec = resumeId
287
+ ? adapter.buildResumeSpec({ ...specArgs, sessionId: resumeId })
288
+ : adapter.buildFreshSpec(specArgs);
289
+ const sessionId = randomSessionId();
290
+ const logFile = join(this.opts.logsDir, `task-${msg.taskId}.log`);
291
+ let session;
292
+ try {
293
+ session = this.pty.spawn({ sessionId, taskId: msg.taskId, spec, logFile });
294
+ }
295
+ catch (err) {
296
+ this.log(`[worker] task #${msg.taskId} spawn failed: ${err.message}`);
297
+ this.send({ type: "task.nacked", taskId: msg.taskId, reason: `spawn failed: ${err.message}` });
298
+ return;
299
+ }
300
+ const detachBridge = bridgeSessionToWs({ ws: this.ws, session });
301
+ const tracker = {
302
+ taskId: msg.taskId,
303
+ sessionId,
304
+ worktreePath,
305
+ agent: msg.agent,
306
+ kind: msg.kind,
307
+ detachBridge,
308
+ detectedPrUrl: null,
309
+ initialPrUrl: msg.prUrl ?? null,
310
+ };
311
+ this.active.set(msg.taskId, tracker);
312
+ this.sessionToTask.set(sessionId, msg.taskId);
313
+ const startedMsg = {
314
+ type: "session.started",
315
+ taskId: msg.taskId,
316
+ sessionId,
317
+ pid: session.pid,
318
+ worktreePath,
319
+ };
320
+ this.send(startedMsg);
321
+ // For implement tasks, watch stdout for a PR URL.
322
+ if (msg.kind === "implement") {
323
+ let tail = "";
324
+ const onChunk = (chunk) => {
325
+ if (tracker.detectedPrUrl)
326
+ return;
327
+ tail = (tail + chunk.toString("utf8")).slice(-4096);
328
+ const url = parsePrUrl(tail);
329
+ if (!url)
330
+ return;
331
+ tracker.detectedPrUrl = url;
332
+ const upd = {
333
+ type: "task.update",
334
+ taskId: msg.taskId,
335
+ prUrl: url,
336
+ };
337
+ this.send(upd);
338
+ session.off("data", onChunk);
339
+ };
340
+ session.on("data", onChunk);
341
+ }
342
+ // Capture the agent session id (e.g. claude transcript uuid) for later
343
+ // resume. Fire-and-forget; if it times out we just don't resume next time.
344
+ if (!resumeId) {
345
+ void adapter
346
+ .captureSessionId({ cwd: worktreePath })
347
+ .then((agentSessionId) => {
348
+ if (!agentSessionId)
349
+ return;
350
+ this.send({ type: "task.update", taskId: msg.taskId, agentSessionId });
351
+ })
352
+ .catch(() => { });
353
+ }
354
+ else {
355
+ // Tell the gateway the resume id we used so it knows.
356
+ this.send({ type: "task.update", taskId: msg.taskId, agentSessionId: resumeId });
357
+ }
358
+ session.once("exit", ({ exitCode, signal }) => {
359
+ tracker.detachBridge();
360
+ const exitMsg = {
361
+ type: "session.exit",
362
+ sessionId,
363
+ taskId: msg.taskId,
364
+ exitCode,
365
+ signal,
366
+ prUrl: msg.kind === "review" ? tracker.initialPrUrl : (tracker.detectedPrUrl ?? parsePrUrl(session.scrollback().toString("utf8"))),
367
+ };
368
+ this.send(exitMsg);
369
+ this.active.delete(msg.taskId);
370
+ this.sessionToTask.delete(sessionId);
371
+ // Free the entry from PtyManager so a future task can reuse the id space.
372
+ this.pty.forget(sessionId);
373
+ });
374
+ }
375
+ }
376
+ // ---- helpers ----
377
+ import { randomUUID } from "node:crypto";
378
+ function randomSessionId() {
379
+ return randomUUID();
380
+ }
381
+ /** Detect which configured agents are available on PATH, returning capability metadata. */
382
+ export function detectCapabilities(commands) {
383
+ // We only verify that *some* command was provided; actual which/version probing is
384
+ // best done by the user (`tono doctor` already covers this on the gateway side).
385
+ // Here we just record the configured commands as advertised capabilities.
386
+ const agents = {};
387
+ for (const [agentName, cmd] of Object.entries(commands)) {
388
+ if (!cmd)
389
+ continue;
390
+ if (existsSync(cmd) || /^[\w.-]+$/.test(cmd)) {
391
+ agents[agentName] = {};
392
+ }
393
+ }
394
+ return { agents };
395
+ }
396
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/server/worker/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { encodePtyFrame } from "../../shared/worker-protocol.js";
2
+ /**
3
+ * Bridge a single PTY session to the worker→gateway WebSocket. Outbound PTY
4
+ * data goes as binary frames (`<36 bytes sessionId><payload>`); the worker's
5
+ * caller emits the JSON `session.exit` itself when the PTY ends.
6
+ *
7
+ * Returns a teardown function that detaches the listeners. The caller is
8
+ * responsible for keeping the Session alive — this bridge does not own it.
9
+ */
10
+ export function bridgeSessionToWs(args) {
11
+ const { ws, session } = args;
12
+ const onData = (chunk) => {
13
+ if (ws.readyState !== ws.OPEN)
14
+ return;
15
+ try {
16
+ ws.send(encodePtyFrame(session.id, chunk), { binary: true });
17
+ }
18
+ catch {
19
+ /* connection went away mid-flush; ignore — caller will tear down */
20
+ }
21
+ };
22
+ session.on("data", onData);
23
+ return () => {
24
+ session.off("data", onData);
25
+ };
26
+ }
27
+ //# sourceMappingURL=pty-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-bridge.js","sourceRoot":"","sources":["../../../src/server/worker/pty-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAyC;IACzE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAE7B,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;QAC/B,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI;YAAE,OAAO;QACtC,IAAI,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3B,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC;AACJ,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import * as gh from "../github/gh.js";
2
- import { labelForAgentKind } from "../../shared/types.js";
3
- import { resolveRepoAgents } from "../config/load.js";
2
+ import { DEFAULT_IMPLEMENT_LABEL, DEFAULT_REVIEW_LABEL, labelForAgentKind, } from "../../shared/types.js";
3
+ import { resolveDefaultAgent, resolveRepoAgents } from "../config/load.js";
4
4
  const MIN_BACKOFF_MS = 30_000;
5
5
  const MAX_BACKOFF_MS = 5 * 60_000;
6
6
  function backoffMs(failures) {
@@ -80,12 +80,13 @@ export class GithubPoller {
80
80
  async pollRepo(repo) {
81
81
  const s = this.state.get(repo.slug);
82
82
  const enabledAgents = resolveRepoAgents(this.cfg, repo.agents);
83
+ const defaultAgent = resolveDefaultAgent(this.cfg, repo);
83
84
  let queuedTotal = 0;
84
85
  let firstError = null;
85
86
  for (const agent of enabledAgents) {
86
87
  // Implement loop: poll issues with `tono-<short>` label.
87
88
  try {
88
- queuedTotal += await this.pollIssuesForAgent(repo, agent);
89
+ queuedTotal += await this.pollIssuesForAgent(repo, agent, labelForAgentKind(agent, "implement"));
89
90
  }
90
91
  catch (err) {
91
92
  firstError = firstError ?? err.message;
@@ -93,13 +94,32 @@ export class GithubPoller {
93
94
  }
94
95
  // Review loop: poll PRs with `tono-<short>-review` label.
95
96
  try {
96
- queuedTotal += await this.pollPrsForAgent(repo, agent);
97
+ queuedTotal += await this.pollPrsForAgent(repo, agent, labelForAgentKind(agent, "review"));
97
98
  }
98
99
  catch (err) {
99
100
  firstError = firstError ?? err.message;
100
101
  this.log(`[poller] ${repo.slug} ${agent}/review failed: ${err.message}`);
101
102
  }
102
103
  }
104
+ // Default-agent fall-through: bare `tono` / `tono-review` labels route to
105
+ // whichever agent the repo nominates as default. Skipped silently when no
106
+ // default is resolvable (multi-agent repo without an explicit choice).
107
+ if (defaultAgent) {
108
+ try {
109
+ queuedTotal += await this.pollIssuesForAgent(repo, defaultAgent, DEFAULT_IMPLEMENT_LABEL);
110
+ }
111
+ catch (err) {
112
+ firstError = firstError ?? err.message;
113
+ this.log(`[poller] ${repo.slug} default(${defaultAgent})/implement failed: ${err.message}`);
114
+ }
115
+ try {
116
+ queuedTotal += await this.pollPrsForAgent(repo, defaultAgent, DEFAULT_REVIEW_LABEL);
117
+ }
118
+ catch (err) {
119
+ firstError = firstError ?? err.message;
120
+ this.log(`[poller] ${repo.slug} default(${defaultAgent})/review failed: ${err.message}`);
121
+ }
122
+ }
103
123
  if (firstError) {
104
124
  s.consecutiveFailures += 1;
105
125
  s.lastError = firstError;
@@ -114,9 +134,8 @@ export class GithubPoller {
114
134
  this.bus.emit("poll:success", { repoSlug: repo.slug, count: queuedTotal, at: s.lastSuccessAt });
115
135
  }
116
136
  }
117
- async pollIssuesForAgent(repo, agent) {
137
+ async pollIssuesForAgent(repo, agent, label) {
118
138
  const kind = "implement";
119
- const label = labelForAgentKind(agent, kind);
120
139
  const issues = await gh.issueList(repo.slug, label);
121
140
  let queued = 0;
122
141
  for (const issue of issues) {
@@ -143,9 +162,8 @@ export class GithubPoller {
143
162
  }
144
163
  return queued;
145
164
  }
146
- async pollPrsForAgent(repo, agent) {
165
+ async pollPrsForAgent(repo, agent, label) {
147
166
  const kind = "review";
148
- const label = labelForAgentKind(agent, kind);
149
167
  const prs = await gh.prList(repo.slug, label);
150
168
  let queued = 0;
151
169
  for (const pr of prs) {
@@ -1 +1 @@
1
- {"version":3,"file":"github-poller.js","sourceRoot":"","sources":["../../../src/server/workers/github-poller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-poller.js","sourceRoot":"","sources":["../../../src/server/workers/github-poller.ts"],"names":[],"mappings":"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"}