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":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import Ajv from "ajv";
|
|
6
|
+
import addFormats from "ajv-formats";
|
|
7
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
export const SCHEMA_PATH = join(HERE, "schema.json");
|
|
9
|
+
export function tonoHome() {
|
|
10
|
+
return process.env.TONO_HOME ?? join(homedir(), ".tono");
|
|
11
|
+
}
|
|
12
|
+
export function configPath() {
|
|
13
|
+
return join(tonoHome(), "config.json");
|
|
14
|
+
}
|
|
15
|
+
export function expandHome(p) {
|
|
16
|
+
if (p === "~")
|
|
17
|
+
return homedir();
|
|
18
|
+
if (p.startsWith("~/"))
|
|
19
|
+
return join(homedir(), p.slice(2));
|
|
20
|
+
return p;
|
|
21
|
+
}
|
|
22
|
+
export function loadSchema() {
|
|
23
|
+
return JSON.parse(readFileSync(SCHEMA_PATH, "utf8"));
|
|
24
|
+
}
|
|
25
|
+
export class ConfigError extends Error {
|
|
26
|
+
errors;
|
|
27
|
+
constructor(message, errors) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.errors = errors;
|
|
30
|
+
this.name = "ConfigError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function buildValidator() {
|
|
34
|
+
const ajv = new Ajv.default({ allErrors: true, useDefaults: true, strict: false });
|
|
35
|
+
addFormats.default(ajv);
|
|
36
|
+
return ajv.compile(loadSchema());
|
|
37
|
+
}
|
|
38
|
+
export function validate(raw) {
|
|
39
|
+
const validateFn = buildValidator();
|
|
40
|
+
if (!validateFn(raw)) {
|
|
41
|
+
const errors = validateFn.errors ?? [];
|
|
42
|
+
const summary = errors
|
|
43
|
+
.map((e) => ` - ${e.instancePath || "(root)"} ${e.message ?? "is invalid"}`)
|
|
44
|
+
.join("\n");
|
|
45
|
+
throw new ConfigError(`Config failed validation:\n${summary}`, errors);
|
|
46
|
+
}
|
|
47
|
+
return raw;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve a repo's enabled agents. If `repo.agents` is omitted, default to
|
|
51
|
+
* every agent declared in `cfg.agents`. The result is filtered to agents that
|
|
52
|
+
* actually have config (in case someone listed an agent in `repo.agents` but
|
|
53
|
+
* never declared it in the top-level map).
|
|
54
|
+
*/
|
|
55
|
+
export function resolveRepoAgents(cfg, repoAgents) {
|
|
56
|
+
const declared = Object.keys(cfg.agents);
|
|
57
|
+
if (!repoAgents || repoAgents.length === 0)
|
|
58
|
+
return declared;
|
|
59
|
+
return repoAgents.filter((a) => declared.includes(a));
|
|
60
|
+
}
|
|
61
|
+
export function resolveRepo(cfg, repo) {
|
|
62
|
+
return { ...repo, effectiveAgents: resolveRepoAgents(cfg, repo.agents) };
|
|
63
|
+
}
|
|
64
|
+
export function resolveConfig(cfg) {
|
|
65
|
+
return {
|
|
66
|
+
...cfg,
|
|
67
|
+
workspaces: { root: resolve(expandHome(cfg.workspaces.root)) },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function readConfigFile(path = configPath()) {
|
|
71
|
+
if (!existsSync(path)) {
|
|
72
|
+
throw new ConfigError(`Config not found at ${path}. Run 'tono init' to create one.`);
|
|
73
|
+
}
|
|
74
|
+
let text;
|
|
75
|
+
try {
|
|
76
|
+
text = readFileSync(path, "utf8");
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
throw new ConfigError(`Could not read ${path}: ${err.message}`);
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
return JSON.parse(text);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
throw new ConfigError(`Config at ${path} is not valid JSON: ${err.message}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function loadConfig(path = configPath()) {
|
|
89
|
+
return resolveConfig(validate(readConfigFile(path)));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/server/config/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { configPath, ConfigError, resolveConfig, validate, } from "./load.js";
|
|
3
|
+
/**
|
|
4
|
+
* Holds the live in-memory config and persists user edits back to disk.
|
|
5
|
+
* Single point through which mutations flow so we have one place to call refreshConfig
|
|
6
|
+
* on dependent workers.
|
|
7
|
+
*/
|
|
8
|
+
export class ConfigManager {
|
|
9
|
+
cfg;
|
|
10
|
+
onChange;
|
|
11
|
+
constructor(cfg, onChange) {
|
|
12
|
+
this.cfg = cfg;
|
|
13
|
+
this.onChange = onChange;
|
|
14
|
+
}
|
|
15
|
+
readRawText() {
|
|
16
|
+
return readFileSync(configPath(), "utf8");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Replace the on-disk config with the provided JSON text. Validates parse + schema
|
|
20
|
+
* before writing. Returns the new resolved config.
|
|
21
|
+
*/
|
|
22
|
+
writeRawText(text) {
|
|
23
|
+
let parsed;
|
|
24
|
+
try {
|
|
25
|
+
parsed = JSON.parse(text);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
throw new ConfigError(`Invalid JSON: ${err.message}`);
|
|
29
|
+
}
|
|
30
|
+
const next = validate(parsed); // throws ConfigError on schema failure
|
|
31
|
+
writeFileSync(configPath(), text.endsWith("\n") ? text : text + "\n");
|
|
32
|
+
const resolved = resolveConfig(next);
|
|
33
|
+
this.cfg = resolved;
|
|
34
|
+
this.onChange(resolved);
|
|
35
|
+
return resolved;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/server/config/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,QAAQ,GACT,MAAM,WAAW,CAAC;AAGnB;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACL;IAAsC;IAAzD,YAAmB,GAAmB,EAAmB,QAAuC;QAA7E,QAAG,GAAH,GAAG,CAAgB;QAAmB,aAAQ,GAAR,QAAQ,CAA+B;IAAG,CAAC;IAEpG,WAAW;QACT,OAAO,YAAY,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,IAAY;QACvB,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,WAAW,CAAC,iBAAkB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,uCAAuC;QACtE,aAAa,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://tono.local/config.schema.json",
|
|
4
|
+
"title": "Tono configuration",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["server", "github", "workspaces", "repos", "agents"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": { "type": "string" },
|
|
10
|
+
"server": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"required": ["host", "port"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"host": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"minLength": 1,
|
|
18
|
+
"default": "0.0.0.0",
|
|
19
|
+
"description": "Bind address. Use 0.0.0.0 to allow LAN access, 127.0.0.1 for localhost only."
|
|
20
|
+
},
|
|
21
|
+
"port": {
|
|
22
|
+
"type": "integer",
|
|
23
|
+
"minimum": 1,
|
|
24
|
+
"maximum": 65535,
|
|
25
|
+
"default": 7040
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"github": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"additionalProperties": false,
|
|
32
|
+
"required": ["pollIntervalSeconds"],
|
|
33
|
+
"properties": {
|
|
34
|
+
"pollIntervalSeconds": {
|
|
35
|
+
"type": "integer",
|
|
36
|
+
"minimum": 10,
|
|
37
|
+
"maximum": 3600,
|
|
38
|
+
"default": 60,
|
|
39
|
+
"description": "How often to poll GitHub for newly labeled issues and PRs, in seconds."
|
|
40
|
+
},
|
|
41
|
+
"user": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "Optional. The GitHub username tono runs as. Used for log labels only; auth comes from `gh` CLI."
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"workspaces": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"additionalProperties": false,
|
|
50
|
+
"required": ["root"],
|
|
51
|
+
"properties": {
|
|
52
|
+
"root": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"minLength": 1,
|
|
55
|
+
"default": "~/.tono/workspaces",
|
|
56
|
+
"description": "Filesystem root under which bare clones (.bare/) and per-task worktrees are created. Tilde is expanded."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"repos": {
|
|
61
|
+
"type": "array",
|
|
62
|
+
"minItems": 0,
|
|
63
|
+
"items": {
|
|
64
|
+
"type": "object",
|
|
65
|
+
"additionalProperties": false,
|
|
66
|
+
"required": ["slug", "baseBranch"],
|
|
67
|
+
"properties": {
|
|
68
|
+
"slug": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"pattern": "^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$",
|
|
71
|
+
"description": "GitHub owner/repo identifier (used by the poller to query gh)."
|
|
72
|
+
},
|
|
73
|
+
"path": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"minLength": 1,
|
|
76
|
+
"description": "Optional. Absolute path to an existing local clone (regular or bare). If omitted, tono bare-clones the repo into <workspacesRoot>/.bare/ using `gh` auth."
|
|
77
|
+
},
|
|
78
|
+
"baseBranch": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"minLength": 1,
|
|
81
|
+
"default": "main"
|
|
82
|
+
},
|
|
83
|
+
"agents": {
|
|
84
|
+
"type": "array",
|
|
85
|
+
"items": { "type": "string", "enum": ["claude-code", "opencode", "codex"] },
|
|
86
|
+
"uniqueItems": true,
|
|
87
|
+
"description": "Which agents are enabled on this repo. If omitted, all agents present in the top-level `agents` map are enabled. Each enabled agent watches its convention labels: `tono-<short>` for implement, `tono-<short>-review` for review."
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"agents": {
|
|
93
|
+
"type": "object",
|
|
94
|
+
"minProperties": 1,
|
|
95
|
+
"additionalProperties": false,
|
|
96
|
+
"properties": {
|
|
97
|
+
"claude-code": { "$ref": "#/definitions/agentConfig" },
|
|
98
|
+
"opencode": { "$ref": "#/definitions/agentConfig" },
|
|
99
|
+
"codex": { "$ref": "#/definitions/agentConfig" }
|
|
100
|
+
},
|
|
101
|
+
"description": "Sparse map of agent type → config. Only declared agents are available to repos."
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"definitions": {
|
|
105
|
+
"agentConfig": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"additionalProperties": false,
|
|
108
|
+
"required": ["command", "args", "concurrency", "promptTemplates"],
|
|
109
|
+
"properties": {
|
|
110
|
+
"command": {
|
|
111
|
+
"type": "string",
|
|
112
|
+
"minLength": 1,
|
|
113
|
+
"description": "Executable name or absolute path of the agent CLI."
|
|
114
|
+
},
|
|
115
|
+
"args": {
|
|
116
|
+
"type": "array",
|
|
117
|
+
"items": { "type": "string" },
|
|
118
|
+
"description": "Arguments passed before the rendered prompt. May contain a literal `{prompt}` placeholder which the adapter substitutes; if absent, the prompt is appended as the final arg.",
|
|
119
|
+
"default": []
|
|
120
|
+
},
|
|
121
|
+
"concurrency": {
|
|
122
|
+
"type": "object",
|
|
123
|
+
"additionalProperties": false,
|
|
124
|
+
"required": ["implement", "review"],
|
|
125
|
+
"properties": {
|
|
126
|
+
"implement": { "type": "integer", "minimum": 0, "maximum": 32, "default": 1 },
|
|
127
|
+
"review": { "type": "integer", "minimum": 0, "maximum": 32, "default": 2 }
|
|
128
|
+
},
|
|
129
|
+
"description": "Maximum simultaneous PTY sessions of this agent for each kind. Set 0 to disable a kind."
|
|
130
|
+
},
|
|
131
|
+
"promptTemplates": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"additionalProperties": false,
|
|
134
|
+
"required": ["implement", "review"],
|
|
135
|
+
"properties": {
|
|
136
|
+
"implement": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"minLength": 1,
|
|
139
|
+
"description": "Template rendered for implement tasks. Placeholders: {issueNumber}, {issueTitle}, {issueBody}, {repoSlug}, {baseBranch}, {branch}."
|
|
140
|
+
},
|
|
141
|
+
"review": {
|
|
142
|
+
"type": "string",
|
|
143
|
+
"minLength": 1,
|
|
144
|
+
"description": "Template rendered for review tasks. Placeholders: {issueNumber} (PR number), {issueTitle} (PR title), {issueBody} (PR body), {repoSlug}, {baseBranch}, {branch} (PR head ref), {prUrl}."
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { mkdirSync } from "node:fs";
|
|
6
|
+
import { tonoHome } from "../config/load.js";
|
|
7
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const SCHEMA_FILE = join(HERE, "schema.sql");
|
|
9
|
+
const CURRENT_VERSION = 4;
|
|
10
|
+
export function dbPath() {
|
|
11
|
+
return join(tonoHome(), "tono.db");
|
|
12
|
+
}
|
|
13
|
+
export function openDb(path = dbPath()) {
|
|
14
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
15
|
+
const db = new Database(path);
|
|
16
|
+
db.pragma("journal_mode = WAL");
|
|
17
|
+
db.pragma("foreign_keys = ON");
|
|
18
|
+
migrate(db);
|
|
19
|
+
return db;
|
|
20
|
+
}
|
|
21
|
+
function columnExists(db, table, column) {
|
|
22
|
+
const cols = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
23
|
+
return cols.some((c) => c.name === column);
|
|
24
|
+
}
|
|
25
|
+
function migrate(db) {
|
|
26
|
+
// schema.sql uses CREATE TABLE IF NOT EXISTS so this is a no-op on existing
|
|
27
|
+
// installs — we run the version-stepped migrations below to update them.
|
|
28
|
+
const sql = readFileSync(SCHEMA_FILE, "utf8");
|
|
29
|
+
db.exec(sql);
|
|
30
|
+
let row = db
|
|
31
|
+
.prepare("SELECT version FROM schema_version LIMIT 1")
|
|
32
|
+
.get();
|
|
33
|
+
if (!row) {
|
|
34
|
+
db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(CURRENT_VERSION);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (row.version < 2) {
|
|
38
|
+
db.exec(`
|
|
39
|
+
PRAGMA foreign_keys=OFF;
|
|
40
|
+
BEGIN TRANSACTION;
|
|
41
|
+
CREATE TABLE tasks_v2 (
|
|
42
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
43
|
+
repo_slug TEXT NOT NULL,
|
|
44
|
+
issue_number INTEGER NOT NULL,
|
|
45
|
+
issue_title TEXT NOT NULL,
|
|
46
|
+
issue_body TEXT NOT NULL DEFAULT '',
|
|
47
|
+
branch TEXT NOT NULL,
|
|
48
|
+
agent TEXT NOT NULL,
|
|
49
|
+
status TEXT NOT NULL CHECK (status IN ('queued','running','completed','pr_open','pr_closed','merged','cleaned','failed')),
|
|
50
|
+
pr_url TEXT,
|
|
51
|
+
exit_code INTEGER,
|
|
52
|
+
created_at TEXT NOT NULL,
|
|
53
|
+
started_at TEXT,
|
|
54
|
+
completed_at TEXT,
|
|
55
|
+
UNIQUE (repo_slug, issue_number, branch)
|
|
56
|
+
);
|
|
57
|
+
INSERT INTO tasks_v2 (id, repo_slug, issue_number, issue_title, issue_body, branch, agent, status, pr_url, exit_code, created_at, started_at, completed_at)
|
|
58
|
+
SELECT id, repo_slug, issue_number, issue_title, issue_body, branch, agent, status, pr_url, exit_code, created_at, started_at, completed_at FROM tasks;
|
|
59
|
+
DROP TABLE tasks;
|
|
60
|
+
ALTER TABLE tasks_v2 RENAME TO tasks;
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks (status);
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_created_at ON tasks (created_at);
|
|
63
|
+
COMMIT;
|
|
64
|
+
PRAGMA foreign_keys=ON;
|
|
65
|
+
`);
|
|
66
|
+
db.prepare("UPDATE schema_version SET version = ?").run(2);
|
|
67
|
+
row = { version: 2 };
|
|
68
|
+
}
|
|
69
|
+
if (row.version < 3) {
|
|
70
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN agent_session_id TEXT;`);
|
|
71
|
+
db.prepare("UPDATE schema_version SET version = ?").run(3);
|
|
72
|
+
row = { version: 3 };
|
|
73
|
+
}
|
|
74
|
+
if (row.version < 4) {
|
|
75
|
+
// v4: add `kind` column to tasks and issues_seen, both default 'implement'
|
|
76
|
+
// (preserving existing rows as implement). Widen UNIQUE on tasks to include
|
|
77
|
+
// kind. Widen PK on issues_seen to include kind. Add the agent+kind index.
|
|
78
|
+
if (!columnExists(db, "tasks", "kind")) {
|
|
79
|
+
db.exec(`
|
|
80
|
+
PRAGMA foreign_keys=OFF;
|
|
81
|
+
BEGIN TRANSACTION;
|
|
82
|
+
CREATE TABLE tasks_v4 (
|
|
83
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
84
|
+
kind TEXT NOT NULL DEFAULT 'implement' CHECK (kind IN ('implement','review')),
|
|
85
|
+
repo_slug TEXT NOT NULL,
|
|
86
|
+
issue_number INTEGER NOT NULL,
|
|
87
|
+
issue_title TEXT NOT NULL,
|
|
88
|
+
issue_body TEXT NOT NULL DEFAULT '',
|
|
89
|
+
branch TEXT NOT NULL,
|
|
90
|
+
agent TEXT NOT NULL,
|
|
91
|
+
agent_session_id TEXT,
|
|
92
|
+
status TEXT NOT NULL CHECK (status IN ('queued','running','completed','pr_open','pr_closed','merged','cleaned','failed')),
|
|
93
|
+
pr_url TEXT,
|
|
94
|
+
exit_code INTEGER,
|
|
95
|
+
created_at TEXT NOT NULL,
|
|
96
|
+
started_at TEXT,
|
|
97
|
+
completed_at TEXT,
|
|
98
|
+
UNIQUE (repo_slug, issue_number, branch, kind)
|
|
99
|
+
);
|
|
100
|
+
INSERT INTO tasks_v4 (id, kind, repo_slug, issue_number, issue_title, issue_body, branch, agent, agent_session_id, status, pr_url, exit_code, created_at, started_at, completed_at)
|
|
101
|
+
SELECT id, 'implement', repo_slug, issue_number, issue_title, issue_body, branch, agent, agent_session_id, status, pr_url, exit_code, created_at, started_at, completed_at FROM tasks;
|
|
102
|
+
DROP TABLE tasks;
|
|
103
|
+
ALTER TABLE tasks_v4 RENAME TO tasks;
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks (status);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_created_at ON tasks (created_at);
|
|
106
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_agent_kind ON tasks (agent, kind, status);
|
|
107
|
+
COMMIT;
|
|
108
|
+
PRAGMA foreign_keys=ON;
|
|
109
|
+
`);
|
|
110
|
+
}
|
|
111
|
+
if (!columnExists(db, "issues_seen", "kind")) {
|
|
112
|
+
db.exec(`
|
|
113
|
+
PRAGMA foreign_keys=OFF;
|
|
114
|
+
BEGIN TRANSACTION;
|
|
115
|
+
CREATE TABLE issues_seen_v4 (
|
|
116
|
+
repo_slug TEXT NOT NULL,
|
|
117
|
+
issue_number INTEGER NOT NULL,
|
|
118
|
+
trigger_label TEXT NOT NULL,
|
|
119
|
+
kind TEXT NOT NULL DEFAULT 'implement' CHECK (kind IN ('implement','review')),
|
|
120
|
+
first_seen_at TEXT NOT NULL,
|
|
121
|
+
updated_at TEXT NOT NULL,
|
|
122
|
+
PRIMARY KEY (repo_slug, issue_number, trigger_label, kind)
|
|
123
|
+
);
|
|
124
|
+
INSERT INTO issues_seen_v4 (repo_slug, issue_number, trigger_label, kind, first_seen_at, updated_at)
|
|
125
|
+
SELECT repo_slug, issue_number, trigger_label, 'implement', first_seen_at, updated_at FROM issues_seen;
|
|
126
|
+
DROP TABLE issues_seen;
|
|
127
|
+
ALTER TABLE issues_seen_v4 RENAME TO issues_seen;
|
|
128
|
+
COMMIT;
|
|
129
|
+
PRAGMA foreign_keys=ON;
|
|
130
|
+
`);
|
|
131
|
+
}
|
|
132
|
+
db.prepare("UPDATE schema_version SET version = ?").run(4);
|
|
133
|
+
row = { version: 4 };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/server/db/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
const ISO = (d = new Date()) => d.toISOString();
|
|
2
|
+
function rowToTask(row) {
|
|
3
|
+
return {
|
|
4
|
+
id: row.id,
|
|
5
|
+
kind: row.kind,
|
|
6
|
+
repoSlug: row.repo_slug,
|
|
7
|
+
issueNumber: row.issue_number,
|
|
8
|
+
issueTitle: row.issue_title,
|
|
9
|
+
issueBody: row.issue_body ?? "",
|
|
10
|
+
branch: row.branch,
|
|
11
|
+
agent: row.agent,
|
|
12
|
+
agentSessionId: row.agent_session_id ?? null,
|
|
13
|
+
status: row.status,
|
|
14
|
+
prUrl: row.pr_url,
|
|
15
|
+
exitCode: row.exit_code,
|
|
16
|
+
createdAt: row.created_at,
|
|
17
|
+
startedAt: row.started_at,
|
|
18
|
+
completedAt: row.completed_at,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export class Queries {
|
|
22
|
+
db;
|
|
23
|
+
constructor(db) {
|
|
24
|
+
this.db = db;
|
|
25
|
+
}
|
|
26
|
+
hasSeenIssue(repoSlug, issueNumber, label, kind) {
|
|
27
|
+
const row = this.db
|
|
28
|
+
.prepare("SELECT 1 FROM issues_seen WHERE repo_slug = ? AND issue_number = ? AND trigger_label = ? AND kind = ?")
|
|
29
|
+
.get(repoSlug, issueNumber, label, kind);
|
|
30
|
+
return !!row;
|
|
31
|
+
}
|
|
32
|
+
markIssueSeen(repoSlug, issueNumber, label, kind, updatedAt) {
|
|
33
|
+
const now = ISO();
|
|
34
|
+
this.db
|
|
35
|
+
.prepare(`INSERT INTO issues_seen (repo_slug, issue_number, trigger_label, kind, first_seen_at, updated_at)
|
|
36
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
37
|
+
ON CONFLICT(repo_slug, issue_number, trigger_label, kind) DO UPDATE SET updated_at = excluded.updated_at`)
|
|
38
|
+
.run(repoSlug, issueNumber, label, kind, now, updatedAt);
|
|
39
|
+
}
|
|
40
|
+
insertTask(input) {
|
|
41
|
+
const now = ISO();
|
|
42
|
+
const result = this.db
|
|
43
|
+
.prepare(`INSERT INTO tasks (kind, repo_slug, issue_number, issue_title, issue_body, branch, agent, status, pr_url, created_at)
|
|
44
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)`)
|
|
45
|
+
.run(input.kind, input.repoSlug, input.issueNumber, input.issueTitle, input.issueBody, input.branch, input.agent, input.prUrl ?? null, now);
|
|
46
|
+
return this.getTask(Number(result.lastInsertRowid));
|
|
47
|
+
}
|
|
48
|
+
getTask(id) {
|
|
49
|
+
const row = this.db.prepare("SELECT * FROM tasks WHERE id = ?").get(id);
|
|
50
|
+
return row ? rowToTask(row) : null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Look up the most recent task for an issue/PR number on a repo. With the
|
|
54
|
+
* addition of task kinds, callers should pass `kind` to disambiguate (a PR
|
|
55
|
+
* and an issue with the same number could both have tasks). Without `kind`,
|
|
56
|
+
* returns the most-recent task across both kinds.
|
|
57
|
+
*/
|
|
58
|
+
taskByIssue(repoSlug, issueNumber, kind) {
|
|
59
|
+
const sql = kind
|
|
60
|
+
? "SELECT * FROM tasks WHERE repo_slug = ? AND issue_number = ? AND kind = ? ORDER BY id DESC LIMIT 1"
|
|
61
|
+
: "SELECT * FROM tasks WHERE repo_slug = ? AND issue_number = ? ORDER BY id DESC LIMIT 1";
|
|
62
|
+
const params = kind ? [repoSlug, issueNumber, kind] : [repoSlug, issueNumber];
|
|
63
|
+
const row = this.db.prepare(sql).get(...params);
|
|
64
|
+
return row ? rowToTask(row) : null;
|
|
65
|
+
}
|
|
66
|
+
listByStatus(...statuses) {
|
|
67
|
+
if (statuses.length === 0)
|
|
68
|
+
return [];
|
|
69
|
+
const placeholders = statuses.map(() => "?").join(",");
|
|
70
|
+
const rows = this.db
|
|
71
|
+
.prepare(`SELECT * FROM tasks WHERE status IN (${placeholders}) ORDER BY created_at ASC`)
|
|
72
|
+
.all(...statuses);
|
|
73
|
+
return rows.map(rowToTask);
|
|
74
|
+
}
|
|
75
|
+
/** Queued tasks for a specific (agent, kind) partition, oldest first. */
|
|
76
|
+
listQueuedFor(agent, kind) {
|
|
77
|
+
const rows = this.db
|
|
78
|
+
.prepare("SELECT * FROM tasks WHERE status = 'queued' AND agent = ? AND kind = ? ORDER BY created_at ASC")
|
|
79
|
+
.all(agent, kind);
|
|
80
|
+
return rows.map(rowToTask);
|
|
81
|
+
}
|
|
82
|
+
listAll(limit = 100) {
|
|
83
|
+
return this.db
|
|
84
|
+
.prepare("SELECT * FROM tasks ORDER BY created_at DESC LIMIT ?")
|
|
85
|
+
.all(limit)
|
|
86
|
+
.map(rowToTask);
|
|
87
|
+
}
|
|
88
|
+
countByStatus(...statuses) {
|
|
89
|
+
if (statuses.length === 0)
|
|
90
|
+
return 0;
|
|
91
|
+
const placeholders = statuses.map(() => "?").join(",");
|
|
92
|
+
const row = this.db
|
|
93
|
+
.prepare(`SELECT COUNT(*) AS n FROM tasks WHERE status IN (${placeholders})`)
|
|
94
|
+
.get(...statuses);
|
|
95
|
+
return row.n;
|
|
96
|
+
}
|
|
97
|
+
/** Number of running tasks for a specific (agent, kind) partition. */
|
|
98
|
+
countRunningFor(agent, kind) {
|
|
99
|
+
const row = this.db
|
|
100
|
+
.prepare("SELECT COUNT(*) AS n FROM tasks WHERE status = 'running' AND agent = ? AND kind = ?")
|
|
101
|
+
.get(agent, kind);
|
|
102
|
+
return row.n;
|
|
103
|
+
}
|
|
104
|
+
setTaskStatus(id, status, extras = {}) {
|
|
105
|
+
const now = ISO();
|
|
106
|
+
const stmts = ["status = ?"];
|
|
107
|
+
const params = [status];
|
|
108
|
+
if (status === "running") {
|
|
109
|
+
stmts.push("started_at = COALESCE(started_at, ?)");
|
|
110
|
+
params.push(now);
|
|
111
|
+
}
|
|
112
|
+
if (status === "completed" ||
|
|
113
|
+
status === "failed" ||
|
|
114
|
+
status === "merged" ||
|
|
115
|
+
status === "pr_closed" ||
|
|
116
|
+
status === "cleaned") {
|
|
117
|
+
stmts.push("completed_at = ?");
|
|
118
|
+
params.push(now);
|
|
119
|
+
}
|
|
120
|
+
if ("exitCode" in extras) {
|
|
121
|
+
stmts.push("exit_code = ?");
|
|
122
|
+
params.push(extras.exitCode ?? null);
|
|
123
|
+
}
|
|
124
|
+
if ("prUrl" in extras) {
|
|
125
|
+
stmts.push("pr_url = ?");
|
|
126
|
+
params.push(extras.prUrl ?? null);
|
|
127
|
+
}
|
|
128
|
+
params.push(id);
|
|
129
|
+
this.db.prepare(`UPDATE tasks SET ${stmts.join(", ")} WHERE id = ?`).run(...params);
|
|
130
|
+
}
|
|
131
|
+
resetForRetry(id, opts = {}) {
|
|
132
|
+
const sessionClause = opts.clearSession ? ", agent_session_id = NULL" : "";
|
|
133
|
+
this.db
|
|
134
|
+
.prepare(`UPDATE tasks
|
|
135
|
+
SET status = 'queued',
|
|
136
|
+
exit_code = NULL,
|
|
137
|
+
pr_url = NULL,
|
|
138
|
+
started_at = NULL,
|
|
139
|
+
completed_at = NULL${sessionClause}
|
|
140
|
+
WHERE id = ?`)
|
|
141
|
+
.run(id);
|
|
142
|
+
}
|
|
143
|
+
setAgentSessionId(id, sessionId) {
|
|
144
|
+
this.db.prepare("UPDATE tasks SET agent_session_id = ? WHERE id = ?").run(sessionId, id);
|
|
145
|
+
}
|
|
146
|
+
insertSession(input) {
|
|
147
|
+
const now = ISO();
|
|
148
|
+
this.db
|
|
149
|
+
.prepare(`INSERT INTO sessions (id, task_id, pid, worktree_path, started_at) VALUES (?, ?, ?, ?, ?)`)
|
|
150
|
+
.run(input.id, input.taskId, input.pid, input.worktreePath, now);
|
|
151
|
+
}
|
|
152
|
+
endSession(id) {
|
|
153
|
+
this.db
|
|
154
|
+
.prepare(`UPDATE sessions SET ended_at = ? WHERE id = ? AND ended_at IS NULL`)
|
|
155
|
+
.run(ISO(), id);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/server/db/queries.ts"],"names":[],"mappings":"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"}
|