@orc-brain/core 1.0.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 -0
- package/dist/autoLoop.d.ts +70 -0
- package/dist/autoLoop.d.ts.map +1 -0
- package/dist/autoLoop.js +178 -0
- package/dist/autoLoop.js.map +1 -0
- package/dist/backpressure.d.ts +38 -0
- package/dist/backpressure.d.ts.map +1 -0
- package/dist/backpressure.js +103 -0
- package/dist/backpressure.js.map +1 -0
- package/dist/budgetTracker.d.ts +53 -0
- package/dist/budgetTracker.d.ts.map +1 -0
- package/dist/budgetTracker.js +93 -0
- package/dist/budgetTracker.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +107 -0
- package/dist/config.js.map +1 -0
- package/dist/escalation.d.ts +43 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +81 -0
- package/dist/escalation.js.map +1 -0
- package/dist/eventBus.d.ts +30 -0
- package/dist/eventBus.d.ts.map +1 -0
- package/dist/eventBus.js +42 -0
- package/dist/eventBus.js.map +1 -0
- package/dist/goalJudge.d.ts +92 -0
- package/dist/goalJudge.d.ts.map +1 -0
- package/dist/goalJudge.js +254 -0
- package/dist/goalJudge.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/modelRouter.d.ts +40 -0
- package/dist/modelRouter.d.ts.map +1 -0
- package/dist/modelRouter.js +114 -0
- package/dist/modelRouter.js.map +1 -0
- package/dist/orchestrator.d.ts +242 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +975 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/pacing.d.ts +34 -0
- package/dist/pacing.d.ts.map +1 -0
- package/dist/pacing.js +49 -0
- package/dist/pacing.js.map +1 -0
- package/dist/planValidation.d.ts +24 -0
- package/dist/planValidation.d.ts.map +1 -0
- package/dist/planValidation.js +134 -0
- package/dist/planValidation.js.map +1 -0
- package/dist/planner.d.ts +70 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +210 -0
- package/dist/planner.js.map +1 -0
- package/dist/plugins/host.d.ts +39 -0
- package/dist/plugins/host.d.ts.map +1 -0
- package/dist/plugins/host.js +109 -0
- package/dist/plugins/host.js.map +1 -0
- package/dist/plugins/registry.d.ts +71 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +269 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/secrets.d.ts +30 -0
- package/dist/plugins/secrets.d.ts.map +1 -0
- package/dist/plugins/secrets.js +99 -0
- package/dist/plugins/secrets.js.map +1 -0
- package/dist/preflight.d.ts +38 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +108 -0
- package/dist/preflight.js.map +1 -0
- package/dist/reporting.d.ts +41 -0
- package/dist/reporting.d.ts.map +1 -0
- package/dist/reporting.js +229 -0
- package/dist/reporting.js.map +1 -0
- package/dist/safety/denyRules.d.ts +57 -0
- package/dist/safety/denyRules.d.ts.map +1 -0
- package/dist/safety/denyRules.js +498 -0
- package/dist/safety/denyRules.js.map +1 -0
- package/dist/safety/envClassifier.d.ts +45 -0
- package/dist/safety/envClassifier.d.ts.map +1 -0
- package/dist/safety/envClassifier.js +99 -0
- package/dist/safety/envClassifier.js.map +1 -0
- package/dist/safety/index.d.ts +83 -0
- package/dist/safety/index.d.ts.map +1 -0
- package/dist/safety/index.js +184 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/safety/limitSignals.d.ts +36 -0
- package/dist/safety/limitSignals.d.ts.map +1 -0
- package/dist/safety/limitSignals.js +79 -0
- package/dist/safety/limitSignals.js.map +1 -0
- package/dist/safety/paths.d.ts +32 -0
- package/dist/safety/paths.d.ts.map +1 -0
- package/dist/safety/paths.js +102 -0
- package/dist/safety/paths.js.map +1 -0
- package/dist/safety/redact.d.ts +17 -0
- package/dist/safety/redact.d.ts.map +1 -0
- package/dist/safety/redact.js +85 -0
- package/dist/safety/redact.js.map +1 -0
- package/dist/spawnEnv.d.ts +18 -0
- package/dist/spawnEnv.d.ts.map +1 -0
- package/dist/spawnEnv.js +43 -0
- package/dist/spawnEnv.js.map +1 -0
- package/dist/store/auditLog.d.ts +28 -0
- package/dist/store/auditLog.d.ts.map +1 -0
- package/dist/store/auditLog.js +48 -0
- package/dist/store/auditLog.js.map +1 -0
- package/dist/store/index.d.ts +140 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +648 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/schema.d.ts +17 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +197 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/system.d.ts +69 -0
- package/dist/system.d.ts.map +1 -0
- package/dist/system.js +135 -0
- package/dist/system.js.map +1 -0
- package/dist/workerManager.d.ts +80 -0
- package/dist/workerManager.d.ts.map +1 -0
- package/dist/workerManager.js +280 -0
- package/dist/workerManager.js.map +1 -0
- package/dist/worktrees.d.ts +74 -0
- package/dist/worktrees.d.ts.map +1 -0
- package/dist/worktrees.js +210 -0
- package/dist/worktrees.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State store (§4, §12): better-sqlite3 (WAL) for entities, indexes, and
|
|
3
|
+
* resumable state, plus bus-event persistence for SSE replay. Synchronous
|
|
4
|
+
* writes give trivially correct event ordering. The append-only JSONL audit
|
|
5
|
+
* log is separate ({@link ./auditLog.ts}).
|
|
6
|
+
*/
|
|
7
|
+
import Database from "better-sqlite3";
|
|
8
|
+
import { ulid } from "ulid";
|
|
9
|
+
import { dirname } from "node:path";
|
|
10
|
+
import { mkdirSync } from "node:fs";
|
|
11
|
+
import { MIGRATION_COLUMNS, SCHEMA_SQL } from "./schema.js";
|
|
12
|
+
const JSON_FIELDS = {
|
|
13
|
+
goals: ["success_criteria", "constraints", "out_of_scope", "external_ref"],
|
|
14
|
+
scopes: [
|
|
15
|
+
"path_allowlist",
|
|
16
|
+
"path_denylist",
|
|
17
|
+
"allowed_tools",
|
|
18
|
+
"disallowed_tools",
|
|
19
|
+
"forbidden_actions",
|
|
20
|
+
"success_criteria",
|
|
21
|
+
"depends_on",
|
|
22
|
+
],
|
|
23
|
+
tasks: ["depends_on", "result_summary", "error"],
|
|
24
|
+
subagents: ["last_tool_call"],
|
|
25
|
+
};
|
|
26
|
+
function nowIso() {
|
|
27
|
+
return new Date().toISOString();
|
|
28
|
+
}
|
|
29
|
+
/** Serializes JSON columns of an entity into a flat row for SQLite. */
|
|
30
|
+
function serialize(obj, jsonFields) {
|
|
31
|
+
const out = { ...obj };
|
|
32
|
+
for (const f of jsonFields) {
|
|
33
|
+
if (f in out)
|
|
34
|
+
out[f] = JSON.stringify(out[f] ?? null);
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
/** Parses JSON columns of a row back into an entity. */
|
|
39
|
+
function deserialize(row, jsonFields) {
|
|
40
|
+
if (!row)
|
|
41
|
+
return null;
|
|
42
|
+
const out = { ...row };
|
|
43
|
+
for (const f of jsonFields) {
|
|
44
|
+
if (typeof out[f] === "string")
|
|
45
|
+
out[f] = JSON.parse(out[f]);
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/** The persistent state store. */
|
|
50
|
+
export class Store {
|
|
51
|
+
db;
|
|
52
|
+
/** Whether the store is initialized and ready for reads/writes. */
|
|
53
|
+
ready;
|
|
54
|
+
constructor(dbPath) {
|
|
55
|
+
if (dbPath !== ":memory:")
|
|
56
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
57
|
+
this.db = new Database(dbPath);
|
|
58
|
+
this.db.pragma("journal_mode = WAL");
|
|
59
|
+
this.db.pragma("foreign_keys = ON");
|
|
60
|
+
this.db.exec(SCHEMA_SQL);
|
|
61
|
+
// Guarded ALTERs for pre-002 databases (spec 002 §5, A1): CREATE TABLE IF
|
|
62
|
+
// NOT EXISTS skips existing tables, so late columns are added here.
|
|
63
|
+
for (const m of MIGRATION_COLUMNS) {
|
|
64
|
+
try {
|
|
65
|
+
this.db.exec(`ALTER TABLE ${m.table} ADD COLUMN ${m.column} ${m.ddl}`);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Column already exists — expected on every start after the first.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this.ready = true;
|
|
72
|
+
}
|
|
73
|
+
close() {
|
|
74
|
+
this.db.close();
|
|
75
|
+
}
|
|
76
|
+
// --- Projects (spec 002 §R1) ---------------------------------------------
|
|
77
|
+
createProject(input) {
|
|
78
|
+
const project = {
|
|
79
|
+
id: ulid(),
|
|
80
|
+
created_at: nowIso(),
|
|
81
|
+
updated_at: nowIso(),
|
|
82
|
+
auto_merge: input.auto_merge ?? false,
|
|
83
|
+
...input,
|
|
84
|
+
};
|
|
85
|
+
const row = { ...project };
|
|
86
|
+
row.auto_merge = project.auto_merge ? 1 : 0; // SQLite cannot bind booleans.
|
|
87
|
+
this.db
|
|
88
|
+
.prepare(`INSERT INTO projects (id, created_at, updated_at, name, repo_root,
|
|
89
|
+
execution_mode, default_budget_usd, default_concurrency, auto_merge)
|
|
90
|
+
VALUES (@id, @created_at, @updated_at, @name, @repo_root,
|
|
91
|
+
@execution_mode, @default_budget_usd, @default_concurrency, @auto_merge)`)
|
|
92
|
+
.run(row);
|
|
93
|
+
return project;
|
|
94
|
+
}
|
|
95
|
+
/** Deserializes a project row, coercing the integer `auto_merge` to boolean. */
|
|
96
|
+
rowToProject(row) {
|
|
97
|
+
if (!row)
|
|
98
|
+
return null;
|
|
99
|
+
const project = { ...row };
|
|
100
|
+
project.auto_merge = !!row.auto_merge;
|
|
101
|
+
return project;
|
|
102
|
+
}
|
|
103
|
+
getProject(id) {
|
|
104
|
+
return this.rowToProject(this.db.prepare("SELECT * FROM projects WHERE id = ?").get(id));
|
|
105
|
+
}
|
|
106
|
+
getProjectByRepoRoot(repoRoot) {
|
|
107
|
+
return this.rowToProject(this.db
|
|
108
|
+
.prepare("SELECT * FROM projects WHERE repo_root = ?")
|
|
109
|
+
.get(repoRoot));
|
|
110
|
+
}
|
|
111
|
+
listProjects() {
|
|
112
|
+
return this.db
|
|
113
|
+
.prepare("SELECT * FROM projects ORDER BY created_at DESC")
|
|
114
|
+
.all().map((r) => this.rowToProject(r));
|
|
115
|
+
}
|
|
116
|
+
updateProject(id, patch) {
|
|
117
|
+
const current = this.getProject(id);
|
|
118
|
+
if (!current)
|
|
119
|
+
throw new Error(`updateProject: project ${id} not found`);
|
|
120
|
+
const merged = { ...current, ...patch, updated_at: nowIso() };
|
|
121
|
+
const row = { ...merged };
|
|
122
|
+
row.auto_merge = merged.auto_merge ? 1 : 0; // SQLite cannot bind booleans.
|
|
123
|
+
this.db
|
|
124
|
+
.prepare(`UPDATE projects SET updated_at=@updated_at, name=@name,
|
|
125
|
+
execution_mode=@execution_mode, default_budget_usd=@default_budget_usd,
|
|
126
|
+
default_concurrency=@default_concurrency, auto_merge=@auto_merge
|
|
127
|
+
WHERE id=@id`)
|
|
128
|
+
.run(row);
|
|
129
|
+
}
|
|
130
|
+
deleteProject(id) {
|
|
131
|
+
this.db.prepare("DELETE FROM projects WHERE id = ?").run(id);
|
|
132
|
+
}
|
|
133
|
+
// --- Goals ---------------------------------------------------------------
|
|
134
|
+
createGoal(input) {
|
|
135
|
+
const goal = {
|
|
136
|
+
id: ulid(),
|
|
137
|
+
created_at: nowIso(),
|
|
138
|
+
updated_at: nowIso(),
|
|
139
|
+
status: input.status ?? "draft",
|
|
140
|
+
project_id: input.project_id ?? null,
|
|
141
|
+
external_ref: input.external_ref ?? null,
|
|
142
|
+
...input,
|
|
143
|
+
};
|
|
144
|
+
this.db
|
|
145
|
+
.prepare(`INSERT INTO goals (id, created_at, updated_at, title, objective,
|
|
146
|
+
success_criteria, constraints, out_of_scope, project_id, repo_root,
|
|
147
|
+
status, external_ref)
|
|
148
|
+
VALUES (@id, @created_at, @updated_at, @title, @objective,
|
|
149
|
+
@success_criteria, @constraints, @out_of_scope, @project_id, @repo_root,
|
|
150
|
+
@status, @external_ref)`)
|
|
151
|
+
.run(serialize(goal, JSON_FIELDS.goals));
|
|
152
|
+
return goal;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* A non-terminal goal already imported from the same external task — the
|
|
156
|
+
* duplicate-import guard (spec 003 §R7). Terminal goals don't block a
|
|
157
|
+
* re-import.
|
|
158
|
+
*/
|
|
159
|
+
findActiveGoalByExternalRef(provider, externalId) {
|
|
160
|
+
return deserialize(this.db
|
|
161
|
+
.prepare(`SELECT * FROM goals
|
|
162
|
+
WHERE json_extract(external_ref, '$.provider') = ?
|
|
163
|
+
AND json_extract(external_ref, '$.id') = ?
|
|
164
|
+
AND status NOT IN ('done', 'abandoned')
|
|
165
|
+
ORDER BY created_at DESC LIMIT 1`)
|
|
166
|
+
.get(provider, externalId), JSON_FIELDS.goals);
|
|
167
|
+
}
|
|
168
|
+
getGoal(id) {
|
|
169
|
+
return deserialize(this.db.prepare("SELECT * FROM goals WHERE id = ?").get(id), JSON_FIELDS.goals);
|
|
170
|
+
}
|
|
171
|
+
listGoals() {
|
|
172
|
+
return this.db
|
|
173
|
+
.prepare("SELECT * FROM goals ORDER BY created_at DESC")
|
|
174
|
+
.all().map((r) => deserialize(r, JSON_FIELDS.goals));
|
|
175
|
+
}
|
|
176
|
+
updateGoalStatus(id, status) {
|
|
177
|
+
this.db
|
|
178
|
+
.prepare("UPDATE goals SET status = ?, updated_at = ? WHERE id = ?")
|
|
179
|
+
.run(status, nowIso(), id);
|
|
180
|
+
}
|
|
181
|
+
// --- Scopes --------------------------------------------------------------
|
|
182
|
+
createScope(input) {
|
|
183
|
+
const scope = {
|
|
184
|
+
id: ulid(),
|
|
185
|
+
created_at: nowIso(),
|
|
186
|
+
updated_at: nowIso(),
|
|
187
|
+
status: input.status ?? "proposed",
|
|
188
|
+
worktree_path: input.worktree_path ?? null,
|
|
189
|
+
branch_name: input.branch_name ?? null,
|
|
190
|
+
...input,
|
|
191
|
+
};
|
|
192
|
+
this.db
|
|
193
|
+
.prepare(`INSERT INTO scopes (id, created_at, updated_at, goal_id, name, description,
|
|
194
|
+
path_allowlist, path_denylist, allowed_tools, disallowed_tools, model_tier,
|
|
195
|
+
environment, permission_mode, forbidden_actions, success_criteria,
|
|
196
|
+
max_budget_usd, status, depends_on, worktree_path, branch_name)
|
|
197
|
+
VALUES (@id, @created_at, @updated_at, @goal_id, @name, @description,
|
|
198
|
+
@path_allowlist, @path_denylist, @allowed_tools, @disallowed_tools, @model_tier,
|
|
199
|
+
@environment, @permission_mode, @forbidden_actions, @success_criteria,
|
|
200
|
+
@max_budget_usd, @status, @depends_on, @worktree_path, @branch_name)`)
|
|
201
|
+
.run(serialize(scope, JSON_FIELDS.scopes));
|
|
202
|
+
return scope;
|
|
203
|
+
}
|
|
204
|
+
getScope(id) {
|
|
205
|
+
return deserialize(this.db.prepare("SELECT * FROM scopes WHERE id = ?").get(id), JSON_FIELDS.scopes);
|
|
206
|
+
}
|
|
207
|
+
listScopesByGoal(goalId) {
|
|
208
|
+
return this.db
|
|
209
|
+
.prepare("SELECT * FROM scopes WHERE goal_id = ? ORDER BY created_at")
|
|
210
|
+
.all(goalId).map((r) => deserialize(r, JSON_FIELDS.scopes));
|
|
211
|
+
}
|
|
212
|
+
updateScopeStatus(id, status) {
|
|
213
|
+
this.db
|
|
214
|
+
.prepare("UPDATE scopes SET status = ?, updated_at = ? WHERE id = ?")
|
|
215
|
+
.run(status, nowIso(), id);
|
|
216
|
+
}
|
|
217
|
+
/** Records/clears a scope's worktree binding (spec 002 §R8). */
|
|
218
|
+
setScopeWorktree(id, worktreePath, branchName) {
|
|
219
|
+
this.db
|
|
220
|
+
.prepare("UPDATE scopes SET worktree_path = ?, branch_name = ?, updated_at = ? WHERE id = ?")
|
|
221
|
+
.run(worktreePath, branchName, nowIso(), id);
|
|
222
|
+
}
|
|
223
|
+
/** Rewrites a scope's `depends_on` edges (used when materializing a plan). */
|
|
224
|
+
setScopeDependsOn(id, dependsOn) {
|
|
225
|
+
this.db
|
|
226
|
+
.prepare("UPDATE scopes SET depends_on = ?, updated_at = ? WHERE id = ?")
|
|
227
|
+
.run(JSON.stringify(dependsOn), nowIso(), id);
|
|
228
|
+
}
|
|
229
|
+
listProposedScopesByGoal(goalId) {
|
|
230
|
+
return this.listScopesByGoal(goalId).filter((s) => s.status === "proposed");
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* One row per task of every project goal, joined for the kanban board
|
|
234
|
+
* (spec 002 §R17). One SQL join — the server adds run association on top.
|
|
235
|
+
*/
|
|
236
|
+
listBoardCards(projectId) {
|
|
237
|
+
return this.db
|
|
238
|
+
.prepare(`SELECT t.id AS task_id, t.title AS title, t.status AS status,
|
|
239
|
+
t.model_used AS model_used, t.priority AS priority,
|
|
240
|
+
t.attempt AS attempt, t.cost_usd AS cost_usd,
|
|
241
|
+
s.name AS scope_name, g.id AS goal_id, g.title AS goal_title,
|
|
242
|
+
p.id AS project_id, p.name AS project_name
|
|
243
|
+
FROM tasks t
|
|
244
|
+
JOIN scopes s ON t.scope_id = s.id
|
|
245
|
+
JOIN goals g ON s.goal_id = g.id
|
|
246
|
+
JOIN projects p ON g.project_id = p.id
|
|
247
|
+
WHERE (@pid IS NULL OR p.id = @pid)
|
|
248
|
+
ORDER BY t.priority DESC, t.created_at`)
|
|
249
|
+
.all({ pid: projectId ?? null });
|
|
250
|
+
}
|
|
251
|
+
/** Worktree paths still referenced by a scope — the non-orphans (spec 002 §R12). */
|
|
252
|
+
listActiveWorktreePaths() {
|
|
253
|
+
return this.db
|
|
254
|
+
.prepare("SELECT worktree_path FROM scopes WHERE worktree_path IS NOT NULL")
|
|
255
|
+
.all().map((r) => r.worktree_path);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Deletes every `proposed` scope of a goal and its tasks (used by `orc plan
|
|
259
|
+
* edit` to re-materialize an edited plan). Only proposed scopes are touched,
|
|
260
|
+
* so an approved/running plan is never disturbed.
|
|
261
|
+
*/
|
|
262
|
+
deleteProposedPlan(goalId) {
|
|
263
|
+
const proposed = this.listProposedScopesByGoal(goalId);
|
|
264
|
+
const delTasks = this.db.prepare("DELETE FROM tasks WHERE scope_id = ?");
|
|
265
|
+
const delScope = this.db.prepare("DELETE FROM scopes WHERE id = ?");
|
|
266
|
+
const tx = this.db.transaction((scopeIds) => {
|
|
267
|
+
for (const id of scopeIds) {
|
|
268
|
+
delTasks.run(id);
|
|
269
|
+
delScope.run(id);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
tx(proposed.map((s) => s.id));
|
|
273
|
+
}
|
|
274
|
+
// --- Tasks ---------------------------------------------------------------
|
|
275
|
+
createTask(input) {
|
|
276
|
+
const task = {
|
|
277
|
+
id: ulid(),
|
|
278
|
+
created_at: nowIso(),
|
|
279
|
+
updated_at: nowIso(),
|
|
280
|
+
status: "pending",
|
|
281
|
+
priority: input.priority ?? 0,
|
|
282
|
+
attempt: 0,
|
|
283
|
+
model_used: null,
|
|
284
|
+
routing_reason: null,
|
|
285
|
+
session_id: null,
|
|
286
|
+
cost_usd: 0,
|
|
287
|
+
result_summary: null,
|
|
288
|
+
error: null,
|
|
289
|
+
dirty: false,
|
|
290
|
+
...input,
|
|
291
|
+
};
|
|
292
|
+
const row = serialize(task, JSON_FIELDS.tasks);
|
|
293
|
+
row.dirty = task.dirty ? 1 : 0; // SQLite cannot bind booleans.
|
|
294
|
+
this.db
|
|
295
|
+
.prepare(`INSERT INTO tasks (id, created_at, updated_at, scope_id, title, prompt,
|
|
296
|
+
task_type, depends_on, status, priority, attempt, model_used, routing_reason,
|
|
297
|
+
session_id, cost_usd, result_summary, error, dirty)
|
|
298
|
+
VALUES (@id, @created_at, @updated_at, @scope_id, @title, @prompt,
|
|
299
|
+
@task_type, @depends_on, @status, @priority, @attempt, @model_used, @routing_reason,
|
|
300
|
+
@session_id, @cost_usd, @result_summary, @error, @dirty)`)
|
|
301
|
+
.run(row);
|
|
302
|
+
return task;
|
|
303
|
+
}
|
|
304
|
+
/** Deserializes a task row, coercing the integer `dirty` column to boolean. */
|
|
305
|
+
rowToTask(row) {
|
|
306
|
+
const t = deserialize(row, JSON_FIELDS.tasks);
|
|
307
|
+
if (t)
|
|
308
|
+
t.dirty = !!row.dirty;
|
|
309
|
+
return t;
|
|
310
|
+
}
|
|
311
|
+
getTask(id) {
|
|
312
|
+
return this.rowToTask(this.db.prepare("SELECT * FROM tasks WHERE id = ?").get(id));
|
|
313
|
+
}
|
|
314
|
+
listTasksByScope(scopeId) {
|
|
315
|
+
return this.db
|
|
316
|
+
.prepare("SELECT * FROM tasks WHERE scope_id = ? ORDER BY priority DESC, created_at")
|
|
317
|
+
.all(scopeId).map((r) => this.rowToTask(r));
|
|
318
|
+
}
|
|
319
|
+
// Priority-first ordering feeds the dispatch loop directly (spec 002 v2):
|
|
320
|
+
// the kanban drag persists `priority` and the next tick honors it.
|
|
321
|
+
listTasksByGoal(goalId) {
|
|
322
|
+
return this.db
|
|
323
|
+
.prepare(`SELECT t.* FROM tasks t JOIN scopes s ON t.scope_id = s.id
|
|
324
|
+
WHERE s.goal_id = ? ORDER BY t.priority DESC, t.created_at`)
|
|
325
|
+
.all(goalId).map((r) => this.rowToTask(r));
|
|
326
|
+
}
|
|
327
|
+
/** Persists a kanban reprioritization (spec 002 v2). */
|
|
328
|
+
setTaskPriority(id, priority) {
|
|
329
|
+
this.db
|
|
330
|
+
.prepare("UPDATE tasks SET priority = ?, updated_at = ? WHERE id = ?")
|
|
331
|
+
.run(priority, nowIso(), id);
|
|
332
|
+
}
|
|
333
|
+
/** Partial task update. `result_summary`/`error` are JSON-serialized. */
|
|
334
|
+
updateTask(id, patch) {
|
|
335
|
+
const current = this.getTask(id);
|
|
336
|
+
if (!current)
|
|
337
|
+
throw new Error(`updateTask: task ${id} not found`);
|
|
338
|
+
const merged = { ...current, ...patch, updated_at: nowIso() };
|
|
339
|
+
const row = serialize(merged, JSON_FIELDS.tasks);
|
|
340
|
+
row.dirty = merged.dirty ? 1 : 0; // SQLite cannot bind booleans.
|
|
341
|
+
this.db
|
|
342
|
+
.prepare(`UPDATE tasks SET updated_at=@updated_at, status=@status, priority=@priority, attempt=@attempt,
|
|
343
|
+
model_used=@model_used, routing_reason=@routing_reason, session_id=@session_id,
|
|
344
|
+
cost_usd=@cost_usd, result_summary=@result_summary, error=@error,
|
|
345
|
+
dirty=@dirty WHERE id=@id`)
|
|
346
|
+
.run(row);
|
|
347
|
+
}
|
|
348
|
+
/** Rewrites a task's `depends_on` edges (used when materializing a plan). */
|
|
349
|
+
setTaskDependsOn(id, dependsOn) {
|
|
350
|
+
this.db
|
|
351
|
+
.prepare("UPDATE tasks SET depends_on = ?, updated_at = ? WHERE id = ?")
|
|
352
|
+
.run(JSON.stringify(dependsOn), nowIso(), id);
|
|
353
|
+
}
|
|
354
|
+
countTasksByStatus(goalId) {
|
|
355
|
+
const rows = this.db
|
|
356
|
+
.prepare(`SELECT t.status AS status, COUNT(*) AS n FROM tasks t
|
|
357
|
+
JOIN scopes s ON t.scope_id = s.id WHERE s.goal_id = ? GROUP BY t.status`)
|
|
358
|
+
.all(goalId);
|
|
359
|
+
const out = {};
|
|
360
|
+
for (const r of rows)
|
|
361
|
+
out[r.status] = r.n;
|
|
362
|
+
return out;
|
|
363
|
+
}
|
|
364
|
+
// --- Runs ----------------------------------------------------------------
|
|
365
|
+
createRun(input) {
|
|
366
|
+
const run = {
|
|
367
|
+
id: ulid(),
|
|
368
|
+
created_at: nowIso(),
|
|
369
|
+
updated_at: nowIso(),
|
|
370
|
+
goal_id: input.goal_id,
|
|
371
|
+
state: "running",
|
|
372
|
+
budget_usd: input.budget_usd,
|
|
373
|
+
budget_spent_usd: 0,
|
|
374
|
+
budget_state: "ok",
|
|
375
|
+
concurrency_limit: input.concurrency_limit,
|
|
376
|
+
started_at: nowIso(),
|
|
377
|
+
paused_at: null,
|
|
378
|
+
finished_at: null,
|
|
379
|
+
pause_reason: null,
|
|
380
|
+
base_branch: input.base_branch ?? null,
|
|
381
|
+
auto_loop: input.auto_loop ?? false,
|
|
382
|
+
replan_cycle: 0,
|
|
383
|
+
};
|
|
384
|
+
const row = { ...run };
|
|
385
|
+
row.auto_loop = run.auto_loop ? 1 : 0; // SQLite cannot bind booleans.
|
|
386
|
+
this.db
|
|
387
|
+
.prepare(`INSERT INTO runs (id, created_at, updated_at, goal_id, state, budget_usd,
|
|
388
|
+
budget_spent_usd, budget_state, concurrency_limit, started_at, paused_at,
|
|
389
|
+
finished_at, pause_reason, base_branch, auto_loop, replan_cycle)
|
|
390
|
+
VALUES (@id, @created_at, @updated_at, @goal_id, @state, @budget_usd,
|
|
391
|
+
@budget_spent_usd, @budget_state, @concurrency_limit, @started_at, @paused_at,
|
|
392
|
+
@finished_at, @pause_reason, @base_branch, @auto_loop, @replan_cycle)`)
|
|
393
|
+
.run(row);
|
|
394
|
+
return run;
|
|
395
|
+
}
|
|
396
|
+
/** Deserializes a run row, coercing the integer `auto_loop` column to boolean. */
|
|
397
|
+
rowToRun(row) {
|
|
398
|
+
if (!row)
|
|
399
|
+
return null;
|
|
400
|
+
const run = { ...row };
|
|
401
|
+
run.auto_loop = !!row.auto_loop;
|
|
402
|
+
return run;
|
|
403
|
+
}
|
|
404
|
+
getRun(id) {
|
|
405
|
+
return this.rowToRun(this.db.prepare("SELECT * FROM runs WHERE id = ?").get(id));
|
|
406
|
+
}
|
|
407
|
+
getActiveRunForGoal(goalId) {
|
|
408
|
+
return this.rowToRun(this.db
|
|
409
|
+
.prepare(`SELECT * FROM runs WHERE goal_id = ? AND state IN
|
|
410
|
+
('running','pausing','paused','awaiting_approval','planning','draft')
|
|
411
|
+
ORDER BY created_at DESC LIMIT 1`)
|
|
412
|
+
.get(goalId));
|
|
413
|
+
}
|
|
414
|
+
listRuns() {
|
|
415
|
+
return this.db
|
|
416
|
+
.prepare("SELECT * FROM runs ORDER BY created_at DESC")
|
|
417
|
+
.all().map((r) => this.rowToRun(r));
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Returns an active run touching the same `repo_root` (§13.11): two runs on
|
|
421
|
+
* one repo would race. `excludeRunId` skips the run being started.
|
|
422
|
+
*/
|
|
423
|
+
getActiveRunForRepo(repoRoot, excludeRunId) {
|
|
424
|
+
const rows = this.db
|
|
425
|
+
.prepare(`SELECT r.* FROM runs r JOIN goals g ON r.goal_id = g.id
|
|
426
|
+
WHERE g.repo_root = ? AND r.state IN ('running','pausing','paused')
|
|
427
|
+
ORDER BY r.created_at DESC`)
|
|
428
|
+
.all(repoRoot).map((r) => this.rowToRun(r));
|
|
429
|
+
return rows.find((r) => r.id !== excludeRunId) ?? null;
|
|
430
|
+
}
|
|
431
|
+
updateRun(id, patch) {
|
|
432
|
+
const current = this.getRun(id);
|
|
433
|
+
if (!current)
|
|
434
|
+
throw new Error(`updateRun: run ${id} not found`);
|
|
435
|
+
const merged = { ...current, ...patch, updated_at: nowIso() };
|
|
436
|
+
const row = { ...merged };
|
|
437
|
+
row.auto_loop = merged.auto_loop ? 1 : 0; // SQLite cannot bind booleans.
|
|
438
|
+
this.db
|
|
439
|
+
.prepare(`UPDATE runs SET updated_at=@updated_at, state=@state, budget_usd=@budget_usd,
|
|
440
|
+
budget_spent_usd=@budget_spent_usd, budget_state=@budget_state,
|
|
441
|
+
concurrency_limit=@concurrency_limit, started_at=@started_at, paused_at=@paused_at,
|
|
442
|
+
finished_at=@finished_at, pause_reason=@pause_reason, base_branch=@base_branch,
|
|
443
|
+
auto_loop=@auto_loop, replan_cycle=@replan_cycle
|
|
444
|
+
WHERE id=@id`)
|
|
445
|
+
.run(row);
|
|
446
|
+
}
|
|
447
|
+
/** Demotes any Running/Pausing run to Paused on startup (§5 crash recovery). */
|
|
448
|
+
demoteActiveRunsOnStartup() {
|
|
449
|
+
const active = this.db
|
|
450
|
+
.prepare("SELECT * FROM runs WHERE state IN ('running','pausing')")
|
|
451
|
+
.all();
|
|
452
|
+
for (const r of active) {
|
|
453
|
+
this.updateRun(r.id, {
|
|
454
|
+
state: "paused",
|
|
455
|
+
paused_at: nowIso(),
|
|
456
|
+
pause_reason: "demoted after orchestrator restart (§5)",
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
return active;
|
|
460
|
+
}
|
|
461
|
+
// --- Subagents -----------------------------------------------------------
|
|
462
|
+
upsertSubagent(rec) {
|
|
463
|
+
this.db
|
|
464
|
+
.prepare(`INSERT INTO subagents (id, created_at, updated_at, task_id, session_id, model,
|
|
465
|
+
pid, state, started_at, ended_at, num_turns, cost_usd, last_tool_call, transcript_path)
|
|
466
|
+
VALUES (@id, @created_at, @updated_at, @task_id, @session_id, @model,
|
|
467
|
+
@pid, @state, @started_at, @ended_at, @num_turns, @cost_usd, @last_tool_call, @transcript_path)
|
|
468
|
+
ON CONFLICT(id) DO UPDATE SET updated_at=excluded.updated_at, session_id=excluded.session_id,
|
|
469
|
+
pid=excluded.pid, state=excluded.state, started_at=excluded.started_at,
|
|
470
|
+
ended_at=excluded.ended_at, num_turns=excluded.num_turns, cost_usd=excluded.cost_usd,
|
|
471
|
+
last_tool_call=excluded.last_tool_call, transcript_path=excluded.transcript_path`)
|
|
472
|
+
.run(serialize(rec, JSON_FIELDS.subagents));
|
|
473
|
+
}
|
|
474
|
+
listSubagentsByTask(taskId) {
|
|
475
|
+
return this.db
|
|
476
|
+
.prepare("SELECT * FROM subagents WHERE task_id = ? ORDER BY created_at")
|
|
477
|
+
.all(taskId).map((r) => deserialize(r, JSON_FIELDS.subagents));
|
|
478
|
+
}
|
|
479
|
+
// --- Budget ledger -------------------------------------------------------
|
|
480
|
+
insertLedgerEntry(input) {
|
|
481
|
+
const entry = {
|
|
482
|
+
id: ulid(),
|
|
483
|
+
created_at: nowIso(),
|
|
484
|
+
updated_at: nowIso(),
|
|
485
|
+
...input,
|
|
486
|
+
};
|
|
487
|
+
this.db
|
|
488
|
+
.prepare(`INSERT INTO budget_ledger (id, created_at, updated_at, run_id, task_id, session_id,
|
|
489
|
+
cost_usd, num_turns, model, tokens_in, tokens_out, cache_read, cache_write, recorded_at)
|
|
490
|
+
VALUES (@id, @created_at, @updated_at, @run_id, @task_id, @session_id,
|
|
491
|
+
@cost_usd, @num_turns, @model, @tokens_in, @tokens_out, @cache_read, @cache_write, @recorded_at)`)
|
|
492
|
+
.run(entry);
|
|
493
|
+
return entry;
|
|
494
|
+
}
|
|
495
|
+
sumCostForRun(runId) {
|
|
496
|
+
const row = this.db
|
|
497
|
+
.prepare("SELECT COALESCE(SUM(cost_usd), 0) AS total FROM budget_ledger WHERE run_id = ?")
|
|
498
|
+
.get(runId);
|
|
499
|
+
return row.total;
|
|
500
|
+
}
|
|
501
|
+
sumCostForTask(taskId) {
|
|
502
|
+
const row = this.db
|
|
503
|
+
.prepare("SELECT COALESCE(SUM(cost_usd), 0) AS total FROM budget_ledger WHERE task_id = ?")
|
|
504
|
+
.get(taskId);
|
|
505
|
+
return row.total;
|
|
506
|
+
}
|
|
507
|
+
// --- Reports -------------------------------------------------------------
|
|
508
|
+
insertReport(input) {
|
|
509
|
+
const report = {
|
|
510
|
+
id: ulid(),
|
|
511
|
+
created_at: nowIso(),
|
|
512
|
+
updated_at: nowIso(),
|
|
513
|
+
...input,
|
|
514
|
+
};
|
|
515
|
+
this.db
|
|
516
|
+
.prepare(`INSERT INTO reports (id, created_at, updated_at, run_id, trigger, content_md, path)
|
|
517
|
+
VALUES (@id, @created_at, @updated_at, @run_id, @trigger, @content_md, @path)`)
|
|
518
|
+
.run(report);
|
|
519
|
+
return report;
|
|
520
|
+
}
|
|
521
|
+
listReports(runId) {
|
|
522
|
+
return this.db
|
|
523
|
+
.prepare("SELECT * FROM reports WHERE run_id = ? ORDER BY created_at DESC")
|
|
524
|
+
.all(runId);
|
|
525
|
+
}
|
|
526
|
+
getReport(id) {
|
|
527
|
+
return (this.db
|
|
528
|
+
.prepare("SELECT * FROM reports WHERE id = ?")
|
|
529
|
+
.get(id) ?? null);
|
|
530
|
+
}
|
|
531
|
+
latestReport(runId) {
|
|
532
|
+
return (this.db
|
|
533
|
+
.prepare("SELECT * FROM reports WHERE run_id = ? ORDER BY created_at DESC LIMIT 1")
|
|
534
|
+
.get(runId) ?? null);
|
|
535
|
+
}
|
|
536
|
+
// --- Escalations (§8.5) --------------------------------------------------
|
|
537
|
+
insertEscalation(input) {
|
|
538
|
+
const esc = {
|
|
539
|
+
id: ulid(),
|
|
540
|
+
created_at: nowIso(),
|
|
541
|
+
updated_at: nowIso(),
|
|
542
|
+
status: "open",
|
|
543
|
+
action: null,
|
|
544
|
+
message: null,
|
|
545
|
+
resolved_at: null,
|
|
546
|
+
...input,
|
|
547
|
+
};
|
|
548
|
+
this.db
|
|
549
|
+
.prepare(`INSERT INTO escalations (id, created_at, updated_at, run_id, task_id, rule_id,
|
|
550
|
+
tool_name, input_summary, stated_intent, status, action, message, resolved_at)
|
|
551
|
+
VALUES (@id, @created_at, @updated_at, @run_id, @task_id, @rule_id,
|
|
552
|
+
@tool_name, @input_summary, @stated_intent, @status, @action, @message, @resolved_at)`)
|
|
553
|
+
.run(esc);
|
|
554
|
+
return esc;
|
|
555
|
+
}
|
|
556
|
+
getEscalation(id) {
|
|
557
|
+
return (this.db
|
|
558
|
+
.prepare("SELECT * FROM escalations WHERE id = ?")
|
|
559
|
+
.get(id) ?? null);
|
|
560
|
+
}
|
|
561
|
+
listOpenEscalations(runId) {
|
|
562
|
+
return (runId
|
|
563
|
+
? this.db
|
|
564
|
+
.prepare("SELECT * FROM escalations WHERE status = 'open' AND run_id = ? ORDER BY created_at")
|
|
565
|
+
.all(runId)
|
|
566
|
+
: this.db
|
|
567
|
+
.prepare("SELECT * FROM escalations WHERE status = 'open' ORDER BY created_at")
|
|
568
|
+
.all());
|
|
569
|
+
}
|
|
570
|
+
resolveEscalation(id, action, message) {
|
|
571
|
+
this.db
|
|
572
|
+
.prepare(`UPDATE escalations SET status='resolved', action=?, message=?, resolved_at=?,
|
|
573
|
+
updated_at=? WHERE id=?`)
|
|
574
|
+
.run(action, message, nowIso(), nowIso(), id);
|
|
575
|
+
}
|
|
576
|
+
// --- Events (SSE replay) -------------------------------------------------
|
|
577
|
+
/** Persists a bus event before fan-out and returns its assigned `seq` (§3). */
|
|
578
|
+
appendEvent(event) {
|
|
579
|
+
const info = this.db
|
|
580
|
+
.prepare("INSERT INTO events (ts, run_id, type, payload) VALUES (?, ?, ?, ?)")
|
|
581
|
+
.run(event.ts, event.run_id, event.type, JSON.stringify(event.payload));
|
|
582
|
+
return Number(info.lastInsertRowid);
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Dispatch events recorded for a run — the durable base of the per-run task
|
|
586
|
+
* ceiling (spec 002 §R15). Counts every attempt, including retries.
|
|
587
|
+
*/
|
|
588
|
+
countDispatchesForRun(runId) {
|
|
589
|
+
const row = this.db
|
|
590
|
+
.prepare("SELECT COUNT(*) AS n FROM events WHERE run_id = ? AND type = 'dispatch'")
|
|
591
|
+
.get(runId);
|
|
592
|
+
return row.n;
|
|
593
|
+
}
|
|
594
|
+
// --- Purge (§9 `orc purge`) ------------------------------------------------
|
|
595
|
+
/**
|
|
596
|
+
* Wipes the whole database — goals, scopes, tasks, runs, subagents, ledger,
|
|
597
|
+
* reports, escalations, and the persisted event log — in one transaction,
|
|
598
|
+
* child tables first so foreign keys hold. With `keep_projects` the project
|
|
599
|
+
* registry survives; everything else always goes. Returns rows deleted per
|
|
600
|
+
* table. The caller must ensure no run is active (workers would settle into
|
|
601
|
+
* deleted rows).
|
|
602
|
+
*/
|
|
603
|
+
purge(opts = {}) {
|
|
604
|
+
const tables = [
|
|
605
|
+
"events",
|
|
606
|
+
"budget_ledger",
|
|
607
|
+
"subagents",
|
|
608
|
+
"escalations",
|
|
609
|
+
"reports",
|
|
610
|
+
"tasks",
|
|
611
|
+
"runs",
|
|
612
|
+
"scopes",
|
|
613
|
+
"goals",
|
|
614
|
+
...(opts.keep_projects ? [] : ["projects"]),
|
|
615
|
+
];
|
|
616
|
+
const deleted = {};
|
|
617
|
+
const tx = this.db.transaction(() => {
|
|
618
|
+
for (const table of tables) {
|
|
619
|
+
deleted[table] = this.db.prepare(`DELETE FROM ${table}`).run().changes;
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
tx();
|
|
623
|
+
return deleted;
|
|
624
|
+
}
|
|
625
|
+
/** Returns persisted events with `seq` greater than `afterSeq` for SSE replay. */
|
|
626
|
+
listEventsSince(afterSeq, runId) {
|
|
627
|
+
const rows = (runId
|
|
628
|
+
? this.db
|
|
629
|
+
.prepare("SELECT * FROM events WHERE seq > ? AND run_id = ? ORDER BY seq")
|
|
630
|
+
.all(afterSeq, runId)
|
|
631
|
+
: this.db
|
|
632
|
+
.prepare("SELECT * FROM events WHERE seq > ? ORDER BY seq")
|
|
633
|
+
.all(afterSeq));
|
|
634
|
+
return rows.map((r) => ({
|
|
635
|
+
seq: r.seq,
|
|
636
|
+
ts: r.ts,
|
|
637
|
+
run_id: r.run_id ?? null,
|
|
638
|
+
type: r.type,
|
|
639
|
+
payload: JSON.parse(r.payload),
|
|
640
|
+
}));
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
/** Constructs the state store at `dbPath` (§4). */
|
|
644
|
+
export function createStore(dbPath) {
|
|
645
|
+
return new Store(dbPath);
|
|
646
|
+
}
|
|
647
|
+
export { AuditLog, NullAuditLog, auditDirFor } from "./auditLog.js";
|
|
648
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"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"}
|