@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,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite schema (§4, §12). WAL mode is enabled by the store for trivially
|
|
3
|
+
* correct write ordering. JSON-typed columns are stored as TEXT and parsed on
|
|
4
|
+
* read. The append-only audit log lives in JSONL, not here (§8.6).
|
|
5
|
+
*/
|
|
6
|
+
export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n name TEXT NOT NULL,\n repo_root TEXT NOT NULL UNIQUE,\n execution_mode TEXT NOT NULL,\n default_budget_usd REAL NOT NULL,\n default_concurrency INTEGER NOT NULL,\n auto_merge INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS goals (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n title TEXT NOT NULL,\n objective TEXT NOT NULL,\n success_criteria TEXT NOT NULL,\n constraints TEXT NOT NULL,\n out_of_scope TEXT NOT NULL,\n project_id TEXT,\n repo_root TEXT NOT NULL,\n status TEXT NOT NULL,\n external_ref TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_goals_project ON goals(project_id);\n\nCREATE TABLE IF NOT EXISTS scopes (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n goal_id TEXT NOT NULL REFERENCES goals(id),\n name TEXT NOT NULL,\n description TEXT NOT NULL,\n path_allowlist TEXT NOT NULL,\n path_denylist TEXT NOT NULL,\n allowed_tools TEXT NOT NULL,\n disallowed_tools TEXT NOT NULL,\n model_tier TEXT NOT NULL,\n environment TEXT NOT NULL,\n permission_mode TEXT NOT NULL,\n forbidden_actions TEXT NOT NULL,\n success_criteria TEXT NOT NULL,\n max_budget_usd REAL NOT NULL,\n status TEXT NOT NULL,\n depends_on TEXT NOT NULL,\n worktree_path TEXT,\n branch_name TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_scopes_goal ON scopes(goal_id);\n\nCREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n scope_id TEXT NOT NULL REFERENCES scopes(id),\n title TEXT NOT NULL,\n prompt TEXT NOT NULL,\n task_type TEXT NOT NULL,\n depends_on TEXT NOT NULL,\n status TEXT NOT NULL,\n priority INTEGER NOT NULL DEFAULT 0,\n attempt INTEGER NOT NULL,\n model_used TEXT,\n routing_reason TEXT,\n session_id TEXT,\n cost_usd REAL NOT NULL,\n result_summary TEXT,\n error TEXT,\n dirty INTEGER NOT NULL DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS idx_tasks_scope ON tasks(scope_id);\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n\nCREATE TABLE IF NOT EXISTS subagents (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n task_id TEXT NOT NULL REFERENCES tasks(id),\n session_id TEXT,\n model TEXT NOT NULL,\n pid INTEGER,\n state TEXT NOT NULL,\n started_at TEXT,\n ended_at TEXT,\n num_turns INTEGER NOT NULL,\n cost_usd REAL NOT NULL,\n last_tool_call TEXT,\n transcript_path TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_subagents_task ON subagents(task_id);\n\nCREATE TABLE IF NOT EXISTS runs (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n goal_id TEXT NOT NULL REFERENCES goals(id),\n state TEXT NOT NULL,\n budget_usd REAL NOT NULL,\n budget_spent_usd REAL NOT NULL,\n budget_state TEXT NOT NULL,\n concurrency_limit INTEGER NOT NULL,\n started_at TEXT,\n paused_at TEXT,\n finished_at TEXT,\n pause_reason TEXT,\n base_branch TEXT,\n auto_loop INTEGER NOT NULL DEFAULT 0,\n replan_cycle INTEGER NOT NULL DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS idx_runs_goal ON runs(goal_id);\n\nCREATE TABLE IF NOT EXISTS reports (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n run_id TEXT NOT NULL REFERENCES runs(id),\n trigger TEXT NOT NULL,\n content_md TEXT NOT NULL,\n path TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_reports_run ON reports(run_id);\n\nCREATE TABLE IF NOT EXISTS budget_ledger (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n run_id TEXT NOT NULL REFERENCES runs(id),\n task_id TEXT NOT NULL REFERENCES tasks(id),\n session_id TEXT,\n cost_usd REAL NOT NULL,\n num_turns INTEGER NOT NULL,\n model TEXT NOT NULL,\n tokens_in INTEGER NOT NULL,\n tokens_out INTEGER NOT NULL,\n cache_read INTEGER NOT NULL,\n cache_write INTEGER NOT NULL,\n recorded_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_ledger_run ON budget_ledger(run_id);\nCREATE INDEX IF NOT EXISTS idx_ledger_task ON budget_ledger(task_id);\n\nCREATE TABLE IF NOT EXISTS escalations (\n id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n run_id TEXT NOT NULL REFERENCES runs(id),\n task_id TEXT NOT NULL REFERENCES tasks(id),\n rule_id TEXT NOT NULL,\n tool_name TEXT NOT NULL,\n input_summary TEXT NOT NULL,\n stated_intent TEXT,\n status TEXT NOT NULL,\n action TEXT,\n message TEXT,\n resolved_at TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_escalations_run ON escalations(run_id);\nCREATE INDEX IF NOT EXISTS idx_escalations_status ON escalations(status);\n\n-- Bus events, persisted before fan-out for SSE Last-Event-ID replay (\u00A73, \u00A710).\nCREATE TABLE IF NOT EXISTS events (\n seq INTEGER PRIMARY KEY AUTOINCREMENT,\n ts TEXT NOT NULL,\n run_id TEXT,\n type TEXT NOT NULL,\n payload TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_events_run ON events(run_id);\n";
|
|
7
|
+
/**
|
|
8
|
+
* Columns added after the initial DDL (spec 002 §5, A1). `CREATE TABLE IF NOT
|
|
9
|
+
* EXISTS` skips existing tables, so a pre-002 database needs guarded ALTERs.
|
|
10
|
+
* Each is applied best-effort; "duplicate column" failures are expected.
|
|
11
|
+
*/
|
|
12
|
+
export declare const MIGRATION_COLUMNS: ReadonlyArray<{
|
|
13
|
+
table: string;
|
|
14
|
+
column: string;
|
|
15
|
+
ddl: string;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,UAAU,k5JA2KtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb,CAaA,CAAC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite schema (§4, §12). WAL mode is enabled by the store for trivially
|
|
3
|
+
* correct write ordering. JSON-typed columns are stored as TEXT and parsed on
|
|
4
|
+
* read. The append-only audit log lives in JSONL, not here (§8.6).
|
|
5
|
+
*/
|
|
6
|
+
export const SCHEMA_SQL = `
|
|
7
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
8
|
+
id TEXT PRIMARY KEY,
|
|
9
|
+
created_at TEXT NOT NULL,
|
|
10
|
+
updated_at TEXT NOT NULL,
|
|
11
|
+
name TEXT NOT NULL,
|
|
12
|
+
repo_root TEXT NOT NULL UNIQUE,
|
|
13
|
+
execution_mode TEXT NOT NULL,
|
|
14
|
+
default_budget_usd REAL NOT NULL,
|
|
15
|
+
default_concurrency INTEGER NOT NULL,
|
|
16
|
+
auto_merge INTEGER NOT NULL DEFAULT 0
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
CREATE TABLE IF NOT EXISTS goals (
|
|
20
|
+
id TEXT PRIMARY KEY,
|
|
21
|
+
created_at TEXT NOT NULL,
|
|
22
|
+
updated_at TEXT NOT NULL,
|
|
23
|
+
title TEXT NOT NULL,
|
|
24
|
+
objective TEXT NOT NULL,
|
|
25
|
+
success_criteria TEXT NOT NULL,
|
|
26
|
+
constraints TEXT NOT NULL,
|
|
27
|
+
out_of_scope TEXT NOT NULL,
|
|
28
|
+
project_id TEXT,
|
|
29
|
+
repo_root TEXT NOT NULL,
|
|
30
|
+
status TEXT NOT NULL,
|
|
31
|
+
external_ref TEXT
|
|
32
|
+
);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_goals_project ON goals(project_id);
|
|
34
|
+
|
|
35
|
+
CREATE TABLE IF NOT EXISTS scopes (
|
|
36
|
+
id TEXT PRIMARY KEY,
|
|
37
|
+
created_at TEXT NOT NULL,
|
|
38
|
+
updated_at TEXT NOT NULL,
|
|
39
|
+
goal_id TEXT NOT NULL REFERENCES goals(id),
|
|
40
|
+
name TEXT NOT NULL,
|
|
41
|
+
description TEXT NOT NULL,
|
|
42
|
+
path_allowlist TEXT NOT NULL,
|
|
43
|
+
path_denylist TEXT NOT NULL,
|
|
44
|
+
allowed_tools TEXT NOT NULL,
|
|
45
|
+
disallowed_tools TEXT NOT NULL,
|
|
46
|
+
model_tier TEXT NOT NULL,
|
|
47
|
+
environment TEXT NOT NULL,
|
|
48
|
+
permission_mode TEXT NOT NULL,
|
|
49
|
+
forbidden_actions TEXT NOT NULL,
|
|
50
|
+
success_criteria TEXT NOT NULL,
|
|
51
|
+
max_budget_usd REAL NOT NULL,
|
|
52
|
+
status TEXT NOT NULL,
|
|
53
|
+
depends_on TEXT NOT NULL,
|
|
54
|
+
worktree_path TEXT,
|
|
55
|
+
branch_name TEXT
|
|
56
|
+
);
|
|
57
|
+
CREATE INDEX IF NOT EXISTS idx_scopes_goal ON scopes(goal_id);
|
|
58
|
+
|
|
59
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
60
|
+
id TEXT PRIMARY KEY,
|
|
61
|
+
created_at TEXT NOT NULL,
|
|
62
|
+
updated_at TEXT NOT NULL,
|
|
63
|
+
scope_id TEXT NOT NULL REFERENCES scopes(id),
|
|
64
|
+
title TEXT NOT NULL,
|
|
65
|
+
prompt TEXT NOT NULL,
|
|
66
|
+
task_type TEXT NOT NULL,
|
|
67
|
+
depends_on TEXT NOT NULL,
|
|
68
|
+
status TEXT NOT NULL,
|
|
69
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
70
|
+
attempt INTEGER NOT NULL,
|
|
71
|
+
model_used TEXT,
|
|
72
|
+
routing_reason TEXT,
|
|
73
|
+
session_id TEXT,
|
|
74
|
+
cost_usd REAL NOT NULL,
|
|
75
|
+
result_summary TEXT,
|
|
76
|
+
error TEXT,
|
|
77
|
+
dirty INTEGER NOT NULL DEFAULT 0
|
|
78
|
+
);
|
|
79
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_scope ON tasks(scope_id);
|
|
80
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
81
|
+
|
|
82
|
+
CREATE TABLE IF NOT EXISTS subagents (
|
|
83
|
+
id TEXT PRIMARY KEY,
|
|
84
|
+
created_at TEXT NOT NULL,
|
|
85
|
+
updated_at TEXT NOT NULL,
|
|
86
|
+
task_id TEXT NOT NULL REFERENCES tasks(id),
|
|
87
|
+
session_id TEXT,
|
|
88
|
+
model TEXT NOT NULL,
|
|
89
|
+
pid INTEGER,
|
|
90
|
+
state TEXT NOT NULL,
|
|
91
|
+
started_at TEXT,
|
|
92
|
+
ended_at TEXT,
|
|
93
|
+
num_turns INTEGER NOT NULL,
|
|
94
|
+
cost_usd REAL NOT NULL,
|
|
95
|
+
last_tool_call TEXT,
|
|
96
|
+
transcript_path TEXT
|
|
97
|
+
);
|
|
98
|
+
CREATE INDEX IF NOT EXISTS idx_subagents_task ON subagents(task_id);
|
|
99
|
+
|
|
100
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
101
|
+
id TEXT PRIMARY KEY,
|
|
102
|
+
created_at TEXT NOT NULL,
|
|
103
|
+
updated_at TEXT NOT NULL,
|
|
104
|
+
goal_id TEXT NOT NULL REFERENCES goals(id),
|
|
105
|
+
state TEXT NOT NULL,
|
|
106
|
+
budget_usd REAL NOT NULL,
|
|
107
|
+
budget_spent_usd REAL NOT NULL,
|
|
108
|
+
budget_state TEXT NOT NULL,
|
|
109
|
+
concurrency_limit INTEGER NOT NULL,
|
|
110
|
+
started_at TEXT,
|
|
111
|
+
paused_at TEXT,
|
|
112
|
+
finished_at TEXT,
|
|
113
|
+
pause_reason TEXT,
|
|
114
|
+
base_branch TEXT,
|
|
115
|
+
auto_loop INTEGER NOT NULL DEFAULT 0,
|
|
116
|
+
replan_cycle INTEGER NOT NULL DEFAULT 0
|
|
117
|
+
);
|
|
118
|
+
CREATE INDEX IF NOT EXISTS idx_runs_goal ON runs(goal_id);
|
|
119
|
+
|
|
120
|
+
CREATE TABLE IF NOT EXISTS reports (
|
|
121
|
+
id TEXT PRIMARY KEY,
|
|
122
|
+
created_at TEXT NOT NULL,
|
|
123
|
+
updated_at TEXT NOT NULL,
|
|
124
|
+
run_id TEXT NOT NULL REFERENCES runs(id),
|
|
125
|
+
trigger TEXT NOT NULL,
|
|
126
|
+
content_md TEXT NOT NULL,
|
|
127
|
+
path TEXT
|
|
128
|
+
);
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_reports_run ON reports(run_id);
|
|
130
|
+
|
|
131
|
+
CREATE TABLE IF NOT EXISTS budget_ledger (
|
|
132
|
+
id TEXT PRIMARY KEY,
|
|
133
|
+
created_at TEXT NOT NULL,
|
|
134
|
+
updated_at TEXT NOT NULL,
|
|
135
|
+
run_id TEXT NOT NULL REFERENCES runs(id),
|
|
136
|
+
task_id TEXT NOT NULL REFERENCES tasks(id),
|
|
137
|
+
session_id TEXT,
|
|
138
|
+
cost_usd REAL NOT NULL,
|
|
139
|
+
num_turns INTEGER NOT NULL,
|
|
140
|
+
model TEXT NOT NULL,
|
|
141
|
+
tokens_in INTEGER NOT NULL,
|
|
142
|
+
tokens_out INTEGER NOT NULL,
|
|
143
|
+
cache_read INTEGER NOT NULL,
|
|
144
|
+
cache_write INTEGER NOT NULL,
|
|
145
|
+
recorded_at TEXT NOT NULL
|
|
146
|
+
);
|
|
147
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_run ON budget_ledger(run_id);
|
|
148
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_task ON budget_ledger(task_id);
|
|
149
|
+
|
|
150
|
+
CREATE TABLE IF NOT EXISTS escalations (
|
|
151
|
+
id TEXT PRIMARY KEY,
|
|
152
|
+
created_at TEXT NOT NULL,
|
|
153
|
+
updated_at TEXT NOT NULL,
|
|
154
|
+
run_id TEXT NOT NULL REFERENCES runs(id),
|
|
155
|
+
task_id TEXT NOT NULL REFERENCES tasks(id),
|
|
156
|
+
rule_id TEXT NOT NULL,
|
|
157
|
+
tool_name TEXT NOT NULL,
|
|
158
|
+
input_summary TEXT NOT NULL,
|
|
159
|
+
stated_intent TEXT,
|
|
160
|
+
status TEXT NOT NULL,
|
|
161
|
+
action TEXT,
|
|
162
|
+
message TEXT,
|
|
163
|
+
resolved_at TEXT
|
|
164
|
+
);
|
|
165
|
+
CREATE INDEX IF NOT EXISTS idx_escalations_run ON escalations(run_id);
|
|
166
|
+
CREATE INDEX IF NOT EXISTS idx_escalations_status ON escalations(status);
|
|
167
|
+
|
|
168
|
+
-- Bus events, persisted before fan-out for SSE Last-Event-ID replay (§3, §10).
|
|
169
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
170
|
+
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
171
|
+
ts TEXT NOT NULL,
|
|
172
|
+
run_id TEXT,
|
|
173
|
+
type TEXT NOT NULL,
|
|
174
|
+
payload TEXT NOT NULL
|
|
175
|
+
);
|
|
176
|
+
CREATE INDEX IF NOT EXISTS idx_events_run ON events(run_id);
|
|
177
|
+
`;
|
|
178
|
+
/**
|
|
179
|
+
* Columns added after the initial DDL (spec 002 §5, A1). `CREATE TABLE IF NOT
|
|
180
|
+
* EXISTS` skips existing tables, so a pre-002 database needs guarded ALTERs.
|
|
181
|
+
* Each is applied best-effort; "duplicate column" failures are expected.
|
|
182
|
+
*/
|
|
183
|
+
export const MIGRATION_COLUMNS = [
|
|
184
|
+
{ table: "goals", column: "project_id", ddl: "TEXT" },
|
|
185
|
+
{ table: "scopes", column: "worktree_path", ddl: "TEXT" },
|
|
186
|
+
{ table: "scopes", column: "branch_name", ddl: "TEXT" },
|
|
187
|
+
{ table: "runs", column: "base_branch", ddl: "TEXT" },
|
|
188
|
+
{ table: "runs", column: "auto_loop", ddl: "INTEGER NOT NULL DEFAULT 0" },
|
|
189
|
+
{
|
|
190
|
+
table: "projects",
|
|
191
|
+
column: "auto_merge",
|
|
192
|
+
ddl: "INTEGER NOT NULL DEFAULT 0",
|
|
193
|
+
},
|
|
194
|
+
{ table: "tasks", column: "priority", ddl: "INTEGER NOT NULL DEFAULT 0" },
|
|
195
|
+
{ table: "goals", column: "external_ref", ddl: "TEXT" },
|
|
196
|
+
];
|
|
197
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2KzB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAIzB;IACH,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE;IACrD,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE;IACzD,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE;IACvD,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE;IACrD,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,4BAA4B,EAAE;IACzE;QACE,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,YAAY;QACpB,GAAG,EAAE,4BAA4B;KAClC;IACD,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,4BAA4B,EAAE;IACzE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE;CACxD,CAAC"}
|
package/dist/system.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System factory (§3): wires the store, audit log, event bus, safety layer,
|
|
3
|
+
* budget tracker, worker manager, and orchestrator into one process. This is
|
|
4
|
+
* the single composition root used by the server and by tests.
|
|
5
|
+
*/
|
|
6
|
+
import type { OrchestratorConfig } from "@orc-brain/shared";
|
|
7
|
+
import { Store } from "./store/index.js";
|
|
8
|
+
import { AuditLog } from "./store/auditLog.js";
|
|
9
|
+
import { EventBus } from "./eventBus.js";
|
|
10
|
+
import { SafetyLayer } from "./safety/index.js";
|
|
11
|
+
import { BudgetTracker } from "./budgetTracker.js";
|
|
12
|
+
import { WorkerManager, type QueryFn } from "./workerManager.js";
|
|
13
|
+
import { Planner, type PlanQueryFn } from "./planner.js";
|
|
14
|
+
import { EscalationManager } from "./escalation.js";
|
|
15
|
+
import { ReportingEngine } from "./reporting.js";
|
|
16
|
+
import { Backpressure } from "./backpressure.js";
|
|
17
|
+
import { Orchestrator } from "./orchestrator.js";
|
|
18
|
+
import { GoalJudge, type CommandRunner } from "./goalJudge.js";
|
|
19
|
+
import { AutoLoop } from "./autoLoop.js";
|
|
20
|
+
import { WorktreeManager, type GitRunner } from "./worktrees.js";
|
|
21
|
+
import { SecretStore } from "./plugins/secrets.js";
|
|
22
|
+
import { PluginRegistry } from "./plugins/registry.js";
|
|
23
|
+
import type { OrcPluginModule } from "@orc-brain/shared";
|
|
24
|
+
/** The wired-together orchestrator system. */
|
|
25
|
+
export interface System {
|
|
26
|
+
store: Store;
|
|
27
|
+
bus: EventBus;
|
|
28
|
+
safety: SafetyLayer;
|
|
29
|
+
budget: BudgetTracker;
|
|
30
|
+
workers: WorkerManager;
|
|
31
|
+
planner: Planner;
|
|
32
|
+
escalation: EscalationManager;
|
|
33
|
+
reporting: ReportingEngine;
|
|
34
|
+
backpressure: Backpressure;
|
|
35
|
+
orchestrator: Orchestrator;
|
|
36
|
+
judge: GoalJudge;
|
|
37
|
+
autoLoop: AutoLoop;
|
|
38
|
+
worktrees: WorktreeManager;
|
|
39
|
+
audit: AuditLog;
|
|
40
|
+
config: OrchestratorConfig;
|
|
41
|
+
/** Plugin registry (spec 003 §R3). `plugins.ready` resolves after loading. */
|
|
42
|
+
plugins: PluginRegistry;
|
|
43
|
+
/** Plugin secret store (spec 003 §R5). */
|
|
44
|
+
secrets: SecretStore;
|
|
45
|
+
close(): void;
|
|
46
|
+
}
|
|
47
|
+
/** Options for {@link createSystem}. */
|
|
48
|
+
export interface CreateSystemOptions {
|
|
49
|
+
/** State directory (SQLite + audit + reports live here). Default `<cwd>/.orc`. */
|
|
50
|
+
stateDir?: string;
|
|
51
|
+
config?: OrchestratorConfig;
|
|
52
|
+
/** Injectable SDK entrypoint for workers (tests substitute a fake stream). */
|
|
53
|
+
queryFn?: QueryFn;
|
|
54
|
+
/** Injectable SDK entrypoint for the Planner (tests substitute a fake plan). */
|
|
55
|
+
planQueryFn?: PlanQueryFn;
|
|
56
|
+
/** Injectable SDK entrypoint for the goal judge (autonomous-loop.md §3.4). */
|
|
57
|
+
judgeQueryFn?: PlanQueryFn;
|
|
58
|
+
/** Injectable shell runner for the judge's deterministic pass (tests). */
|
|
59
|
+
commandRunner?: CommandRunner;
|
|
60
|
+
/** Injectable git runner for the worktree manager (spec 002 §R7, tests). */
|
|
61
|
+
gitRunner?: GitRunner;
|
|
62
|
+
/** Injectable plugin modules keyed by name (spec 003 §R3, tests). */
|
|
63
|
+
pluginModules?: Record<string, OrcPluginModule>;
|
|
64
|
+
/** Plugin declarations file. Default `<stateDir>/plugins.json` (spec 003 §R3). */
|
|
65
|
+
pluginsFile?: string;
|
|
66
|
+
}
|
|
67
|
+
/** Builds the full system and performs crash-recovery demotion on startup (§5). */
|
|
68
|
+
export declare function createSystem(opts?: CreateSystemOptions): System;
|
|
69
|
+
//# sourceMappingURL=system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../src/system.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAiB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,8CAA8C;AAC9C,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,QAAQ,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,8EAA8E;IAC9E,OAAO,EAAE,cAAc,CAAC;IACxB,0CAA0C;IAC1C,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAChD,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoBD,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,MAAM,CAsGnE"}
|
package/dist/system.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System factory (§3): wires the store, audit log, event bus, safety layer,
|
|
3
|
+
* budget tracker, worker manager, and orchestrator into one process. This is
|
|
4
|
+
* the single composition root used by the server and by tests.
|
|
5
|
+
*/
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { DEFAULT_CONFIG } from "./config.js";
|
|
8
|
+
import { Store } from "./store/index.js";
|
|
9
|
+
import { AuditLog, auditDirFor } from "./store/auditLog.js";
|
|
10
|
+
import { EventBus } from "./eventBus.js";
|
|
11
|
+
import { SafetyLayer } from "./safety/index.js";
|
|
12
|
+
import { BudgetTracker } from "./budgetTracker.js";
|
|
13
|
+
import { WorkerManager } from "./workerManager.js";
|
|
14
|
+
import { Planner } from "./planner.js";
|
|
15
|
+
import { EscalationManager } from "./escalation.js";
|
|
16
|
+
import { ReportingEngine, reportsDirFor } from "./reporting.js";
|
|
17
|
+
import { Backpressure } from "./backpressure.js";
|
|
18
|
+
import { Orchestrator } from "./orchestrator.js";
|
|
19
|
+
import { GoalJudge } from "./goalJudge.js";
|
|
20
|
+
import { AutoLoop } from "./autoLoop.js";
|
|
21
|
+
import { WorktreeManager } from "./worktrees.js";
|
|
22
|
+
import { SecretStore } from "./plugins/secrets.js";
|
|
23
|
+
import { PluginRegistry } from "./plugins/registry.js";
|
|
24
|
+
/**
|
|
25
|
+
* Applies the `ORC_FORCE_MODEL` environment override (§6 R-F) on top of the
|
|
26
|
+
* resolved config. An invalid value fails fast rather than silently routing.
|
|
27
|
+
*/
|
|
28
|
+
function withEnvOverrides(config) {
|
|
29
|
+
const forced = process.env.ORC_FORCE_MODEL;
|
|
30
|
+
if (!forced)
|
|
31
|
+
return config;
|
|
32
|
+
if (forced !== "haiku" && forced !== "sonnet" && forced !== "opus") {
|
|
33
|
+
throw new Error(`ORC_FORCE_MODEL must be haiku|sonnet|opus, got "${forced}"`);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
...config,
|
|
37
|
+
routing: { ...config.routing, force_model: forced },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Builds the full system and performs crash-recovery demotion on startup (§5). */
|
|
41
|
+
export function createSystem(opts = {}) {
|
|
42
|
+
const stateDir = opts.stateDir ?? join(process.cwd(), ".orc");
|
|
43
|
+
const config = withEnvOverrides(opts.config ?? DEFAULT_CONFIG);
|
|
44
|
+
const store = new Store(join(stateDir, "orc.db"));
|
|
45
|
+
const audit = new AuditLog(auditDirFor(stateDir));
|
|
46
|
+
const bus = new EventBus(store);
|
|
47
|
+
const escalation = new EscalationManager(store, bus, config);
|
|
48
|
+
const safety = new SafetyLayer(config, audit, escalation);
|
|
49
|
+
const budget = new BudgetTracker(store, bus, config.budget);
|
|
50
|
+
const workers = new WorkerManager(safety, bus, store, budget, opts.queryFn);
|
|
51
|
+
const planner = new Planner(config, opts.planQueryFn);
|
|
52
|
+
const reporting = new ReportingEngine(store, bus, config, reportsDirFor(stateDir));
|
|
53
|
+
const backpressure = new Backpressure(bus, config.limits);
|
|
54
|
+
const worktrees = new WorktreeManager(stateDir, opts.gitRunner);
|
|
55
|
+
const orchestrator = new Orchestrator({
|
|
56
|
+
store,
|
|
57
|
+
bus,
|
|
58
|
+
config,
|
|
59
|
+
safety,
|
|
60
|
+
workers,
|
|
61
|
+
budget,
|
|
62
|
+
audit,
|
|
63
|
+
planner,
|
|
64
|
+
escalation,
|
|
65
|
+
reporting,
|
|
66
|
+
backpressure,
|
|
67
|
+
worktrees,
|
|
68
|
+
});
|
|
69
|
+
// Autonomous outer loop (autonomous-loop.md §3): the judge evaluates goal
|
|
70
|
+
// satisfaction; the controller drives evaluate → replan-or-finish. Registered
|
|
71
|
+
// on the orchestrator so a quiesced run is handed off instead of finalized.
|
|
72
|
+
// Inert unless `config.autoLoop.enabled` (default false → unchanged behavior).
|
|
73
|
+
const judge = new GoalJudge(config, safety, audit, {
|
|
74
|
+
judgeQueryFn: opts.judgeQueryFn,
|
|
75
|
+
runCommand: opts.commandRunner,
|
|
76
|
+
});
|
|
77
|
+
const autoLoop = new AutoLoop({
|
|
78
|
+
store,
|
|
79
|
+
bus,
|
|
80
|
+
config,
|
|
81
|
+
planner,
|
|
82
|
+
judge,
|
|
83
|
+
orchestrator,
|
|
84
|
+
});
|
|
85
|
+
orchestrator.setAutoLoop(autoLoop);
|
|
86
|
+
// Plugin host (spec 003 §R3): declared plugins load asynchronously after
|
|
87
|
+
// boot (`plugins.ready`); a broken plugin surfaces as `status: "error"` and
|
|
88
|
+
// never blocks the orchestrator. Task imports funnel into the same feature
|
|
89
|
+
// flow as `POST /api/projects/:id/goals` (§R4).
|
|
90
|
+
const secrets = new SecretStore(stateDir);
|
|
91
|
+
const plugins = new PluginRegistry({
|
|
92
|
+
store,
|
|
93
|
+
bus,
|
|
94
|
+
audit,
|
|
95
|
+
secrets,
|
|
96
|
+
createFeatureGoal: (projectId, input) => {
|
|
97
|
+
const project = store.getProject(projectId);
|
|
98
|
+
if (!project)
|
|
99
|
+
throw new Error(`project ${projectId} not found`);
|
|
100
|
+
return orchestrator.createFeatureGoal(project, input);
|
|
101
|
+
},
|
|
102
|
+
pluginsFile: opts.pluginsFile ?? join(stateDir, "plugins.json"),
|
|
103
|
+
modules: opts.pluginModules,
|
|
104
|
+
});
|
|
105
|
+
// Crash recovery (§5): demote any Running/Pausing run to Paused; nothing
|
|
106
|
+
// auto-resumes without an operator command (Open Decision 8).
|
|
107
|
+
store.demoteActiveRunsOnStartup();
|
|
108
|
+
return {
|
|
109
|
+
store,
|
|
110
|
+
bus,
|
|
111
|
+
safety,
|
|
112
|
+
budget,
|
|
113
|
+
workers,
|
|
114
|
+
planner,
|
|
115
|
+
escalation,
|
|
116
|
+
reporting,
|
|
117
|
+
backpressure,
|
|
118
|
+
orchestrator,
|
|
119
|
+
judge,
|
|
120
|
+
autoLoop,
|
|
121
|
+
worktrees,
|
|
122
|
+
audit,
|
|
123
|
+
config,
|
|
124
|
+
plugins,
|
|
125
|
+
secrets,
|
|
126
|
+
close: () => {
|
|
127
|
+
plugins.closeAll(); // detach plugin bus listeners before the store closes
|
|
128
|
+
orchestrator.stop();
|
|
129
|
+
reporting.stopAll();
|
|
130
|
+
backpressure.stopAll();
|
|
131
|
+
store.close();
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../src/system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker manager (§3). One worker = one Agent SDK `query()` call = one child
|
|
3
|
+
* Claude Code CLI subprocess (the TS SDK bundles the binary). Each worker gets
|
|
4
|
+
* exactly the scope's config — cwd, allowed/disallowed tools, permission mode,
|
|
5
|
+
* model, maxTurns, maxBudgetUsd — plus the safety layer's hooks + canUseTool,
|
|
6
|
+
* which are constructor-injected and cannot be omitted.
|
|
7
|
+
*
|
|
8
|
+
* The Orchestrator does its own fan-out with independent top-level sessions per
|
|
9
|
+
* task (Open Decision 4, accepted): per-task model/permission/cwd control,
|
|
10
|
+
* per-task `session_id` for pause/resume, and per-task cost attribution.
|
|
11
|
+
*/
|
|
12
|
+
import type { Options, Query } from "@anthropic-ai/claude-agent-sdk";
|
|
13
|
+
import type { Environment, ModelName, ScopePermissionMode } from "@orc-brain/shared";
|
|
14
|
+
import type { SafetyLayer } from "./safety/index.js";
|
|
15
|
+
import type { EventBus } from "./eventBus.js";
|
|
16
|
+
import type { Store } from "./store/index.js";
|
|
17
|
+
import type { BudgetTracker } from "./budgetTracker.js";
|
|
18
|
+
/** Injectable SDK entrypoint, so tests can substitute a fake worker stream. */
|
|
19
|
+
export type QueryFn = (params: {
|
|
20
|
+
prompt: string;
|
|
21
|
+
options?: Options;
|
|
22
|
+
}) => Query;
|
|
23
|
+
/** Fully-specified unit of work handed to {@link WorkerManager.spawn}. */
|
|
24
|
+
export interface WorkerSpec {
|
|
25
|
+
run_id: string;
|
|
26
|
+
task_id: string;
|
|
27
|
+
cwd: string;
|
|
28
|
+
environment: Environment;
|
|
29
|
+
path_allowlist: string[];
|
|
30
|
+
path_denylist: string[];
|
|
31
|
+
allowed_tools: string[];
|
|
32
|
+
disallowed_tools: string[];
|
|
33
|
+
permission_mode: ScopePermissionMode;
|
|
34
|
+
model: ModelName;
|
|
35
|
+
max_turns: number;
|
|
36
|
+
max_budget_usd: number;
|
|
37
|
+
prompt: string;
|
|
38
|
+
/** Present for resume (§5): a prior session id to continue. */
|
|
39
|
+
resume_session_id?: string;
|
|
40
|
+
}
|
|
41
|
+
/** Terminal outcome of a worker. */
|
|
42
|
+
export interface WorkerResult {
|
|
43
|
+
session_id: string | null;
|
|
44
|
+
status: "done" | "failed";
|
|
45
|
+
cost_usd: number;
|
|
46
|
+
num_turns: number;
|
|
47
|
+
result_summary?: unknown;
|
|
48
|
+
error?: unknown;
|
|
49
|
+
}
|
|
50
|
+
/** Live handle to a running worker. */
|
|
51
|
+
export interface WorkerHandle {
|
|
52
|
+
task_id: string;
|
|
53
|
+
sessionId(): string | null;
|
|
54
|
+
interrupt(): Promise<void>;
|
|
55
|
+
done: Promise<WorkerResult>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Spawns and supervises workers. Constructed with a {@link SafetyLayer} that is
|
|
59
|
+
* a required argument — a worker cannot be built without one.
|
|
60
|
+
*/
|
|
61
|
+
export declare class WorkerManager {
|
|
62
|
+
private readonly safety;
|
|
63
|
+
private readonly bus;
|
|
64
|
+
private readonly store;
|
|
65
|
+
private readonly budget;
|
|
66
|
+
private readonly queryFn;
|
|
67
|
+
constructor(safety: SafetyLayer, bus: EventBus, store: Store, budget: BudgetTracker, queryFn?: QueryFn);
|
|
68
|
+
/** The safety layer gating all workers managed here. */
|
|
69
|
+
get safetyLayer(): SafetyLayer;
|
|
70
|
+
/**
|
|
71
|
+
* Spawns one worker for a task. Builds the SDK options from the spec, attaches
|
|
72
|
+
* the safety layer's hooks + canUseTool, strips provider credentials from the
|
|
73
|
+
* child env, and streams messages onto the bus. Returns a handle immediately;
|
|
74
|
+
* `handle.done` resolves when the session ends.
|
|
75
|
+
*/
|
|
76
|
+
spawn(spec: WorkerSpec): WorkerHandle;
|
|
77
|
+
/** Consumes the SDK message stream, projecting it onto the bus and store. */
|
|
78
|
+
private drain;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=workerManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerManager.d.ts","sourceRoot":"","sources":["../src/workerManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,KAAK,EAEN,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,+EAA+E;AAC/E,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KAAK,KAAK,CAAC;AAE/E,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,mBAAmB,CAAC;IACrC,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,oCAAoC;AACpC,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAC7B;AA2BD;;;GAGG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAGf,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,aAAa,EACtC,OAAO,CAAC,EAAE,OAAO;IAKnB,wDAAwD;IACxD,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY;IA+FrC,6EAA6E;YAC/D,KAAK;CAyJpB"}
|