@orc-brain/server 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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Paulo Lima
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Local HTTP API + SSE server (§8, §10). REST for commands, SSE for the event
3
+ * stream; also serves the SPA. Binds `127.0.0.1` only (§2). This is a thin
4
+ * transport over the in-process {@link System} composition root.
5
+ */
6
+ import { type FastifyInstance } from "fastify";
7
+ import { type System } from "@orc-brain/core";
8
+ /** Options for {@link createServer}. */
9
+ export interface ServerOptions {
10
+ /** Pre-built system; one is created from `stateDir` when omitted. */
11
+ system?: System;
12
+ /** State directory for SQLite + audit + reports. */
13
+ stateDir?: string;
14
+ /** Path to the built UI (`packages/ui/dist`), served as the SPA when present. */
15
+ uiDist?: string;
16
+ logger?: boolean;
17
+ }
18
+ /** Builds the orc-brain HTTP server over an in-process orchestrator system. */
19
+ export declare function createServer(opts?: ServerOptions): FastifyInstance;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAQxD,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AAyCzB,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAkCD,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,IAAI,GAAE,aAAkB,GAAG,eAAe,CA2vBtE"}
package/dist/index.js ADDED
@@ -0,0 +1,757 @@
1
+ /**
2
+ * Local HTTP API + SSE server (§8, §10). REST for commands, SSE for the event
3
+ * stream; also serves the SPA. Binds `127.0.0.1` only (§2). This is a thin
4
+ * transport over the in-process {@link System} composition root.
5
+ */
6
+ import { appendFileSync, existsSync, readFileSync, statSync } from "node:fs";
7
+ import { basename, join, resolve } from "node:path";
8
+ import { homedir } from "node:os";
9
+ import { execFileSync } from "node:child_process";
10
+ import Fastify, {} from "fastify";
11
+ import cors from "@fastify/cors";
12
+ import fastifyStatic from "@fastify/static";
13
+ import { createSystem, registerSecretValue, registerStrippedEnvKeys, runDoctorSync, } from "@orc-brain/core";
14
+ /** Expands a leading `~` and resolves to an absolute path (spec 002 §R3). */
15
+ function resolveRepoRoot(input) {
16
+ const expanded = input === "~" || input.startsWith("~/")
17
+ ? join(homedir(), input.slice(1))
18
+ : input;
19
+ return resolve(expanded);
20
+ }
21
+ /** True when `dir` is inside a git repository (spec 002 §R3). */
22
+ function isGitRepo(dir) {
23
+ try {
24
+ execFileSync("git", ["rev-parse", "--git-dir"], {
25
+ cwd: dir,
26
+ stdio: ["ignore", "pipe", "ignore"],
27
+ });
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ /**
35
+ * Appends `.orc/` to the repo's `.gitignore` when one exists, so orc state
36
+ * written inside a registered repo is never committed. A repo without a
37
+ * `.gitignore` is left untouched — registration must not create files.
38
+ */
39
+ function ensureOrcIgnored(repoRoot) {
40
+ const gitignore = join(repoRoot, ".gitignore");
41
+ if (!existsSync(gitignore))
42
+ return;
43
+ const content = readFileSync(gitignore, "utf8");
44
+ const ignored = content
45
+ .split("\n")
46
+ .some((line) => /^\/?\.orc\/?$/.test(line.trim()));
47
+ if (ignored)
48
+ return;
49
+ const sep = content.length === 0 || content.endsWith("\n") ? "" : "\n";
50
+ appendFileSync(gitignore, `${sep}.orc/\n`);
51
+ }
52
+ /** Serializes a bus event as an SSE frame. */
53
+ function sseFrame(event) {
54
+ return `id: ${event.seq}\nevent: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`;
55
+ }
56
+ /**
57
+ * Caps a provider call so an unresponsive tracker yields a readable 502, not
58
+ * a hang (spec 003 §R7 — upstream timeout ≤ 15 s).
59
+ */
60
+ function withTimeout(promise, ms) {
61
+ return new Promise((resolve, reject) => {
62
+ const timer = setTimeout(() => reject(new Error(`provider timed out after ${ms / 1000}s`)), ms);
63
+ timer.unref?.();
64
+ promise.then((v) => {
65
+ clearTimeout(timer);
66
+ resolve(v);
67
+ }, (err) => {
68
+ clearTimeout(timer);
69
+ reject(err);
70
+ });
71
+ });
72
+ }
73
+ /** Timeout for outbound provider calls (spec 003 §R7). */
74
+ const PROVIDER_TIMEOUT_MS = 15_000;
75
+ /** Builds the orc-brain HTTP server over an in-process orchestrator system. */
76
+ export function createServer(opts = {}) {
77
+ const system = opts.system ?? createSystem({ stateDir: opts.stateDir });
78
+ const { store, orchestrator } = system;
79
+ const app = Fastify({ logger: opts.logger ?? true });
80
+ void app.register(cors, {
81
+ origin: /^http:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/,
82
+ });
83
+ app.get("/health", async () => ({ status: "ok" }));
84
+ app.get("/api/doctor", async () => {
85
+ const checks = runDoctorSync();
86
+ // Orphaned worktrees (spec 002 §R12): on disk but not referenced by any
87
+ // scope. Cleaned per project with `orc project gc <id>`.
88
+ const orphans = system.worktrees.listOrphans(new Set(store.listActiveWorktreePaths()));
89
+ checks.push({
90
+ name: "orphaned worktrees",
91
+ ok: orphans.length === 0,
92
+ detail: orphans.length
93
+ ? `${orphans.length} orphan(s): ${orphans.join(", ")}`
94
+ : "none",
95
+ });
96
+ return { checks };
97
+ });
98
+ // --- Projects (spec 002 §R3–§R5) ------------------------------------------
99
+ app.get("/api/projects", async () => ({ projects: store.listProjects() }));
100
+ app.post("/api/projects", async (req, reply) => {
101
+ const body = req.body;
102
+ if (!body.repo_root || typeof body.repo_root !== "string") {
103
+ return reply.code(400).send({ error: "repo_root required" });
104
+ }
105
+ const repoRoot = resolveRepoRoot(body.repo_root);
106
+ if (!existsSync(repoRoot) || !statSync(repoRoot).isDirectory()) {
107
+ return reply
108
+ .code(400)
109
+ .send({ error: `repo_root is not a directory: ${repoRoot}` });
110
+ }
111
+ // A project must be a git repo: the env classifier and worktrees need git.
112
+ if (!isGitRepo(repoRoot)) {
113
+ return reply
114
+ .code(400)
115
+ .send({ error: `repo_root is not a git repository: ${repoRoot}` });
116
+ }
117
+ if (body.execution_mode !== undefined &&
118
+ body.execution_mode !== "worktree" &&
119
+ body.execution_mode !== "in_repo") {
120
+ return reply
121
+ .code(400)
122
+ .send({ error: "execution_mode must be 'worktree' or 'in_repo'" });
123
+ }
124
+ if (store.getProjectByRepoRoot(repoRoot)) {
125
+ return reply
126
+ .code(409)
127
+ .send({ error: `project already registered for ${repoRoot}` });
128
+ }
129
+ ensureOrcIgnored(repoRoot);
130
+ const project = store.createProject({
131
+ name: body.name?.trim() || basename(repoRoot),
132
+ repo_root: repoRoot,
133
+ auto_merge: body.auto_merge === true,
134
+ execution_mode: (body.execution_mode ??
135
+ "in_repo"),
136
+ default_budget_usd: typeof body.default_budget_usd === "number" &&
137
+ body.default_budget_usd > 0
138
+ ? body.default_budget_usd
139
+ : 10,
140
+ default_concurrency: typeof body.default_concurrency === "number" &&
141
+ body.default_concurrency >= 1
142
+ ? Math.floor(body.default_concurrency)
143
+ : system.config.concurrency_limit,
144
+ });
145
+ return { project };
146
+ });
147
+ app.get("/api/projects/:id", async (req, reply) => {
148
+ const { id } = req.params;
149
+ const project = store.getProject(id);
150
+ if (!project)
151
+ return reply.code(404).send({ error: "project not found" });
152
+ const goals = store.listGoals().filter((g) => g.project_id === id);
153
+ return { project, goals };
154
+ });
155
+ app.patch("/api/projects/:id", async (req, reply) => {
156
+ const { id } = req.params;
157
+ const project = store.getProject(id);
158
+ if (!project)
159
+ return reply.code(404).send({ error: "project not found" });
160
+ const body = req.body;
161
+ if (body.repo_root !== undefined) {
162
+ return reply.code(400).send({
163
+ error: "repo_root cannot be changed; delete and re-add the project",
164
+ });
165
+ }
166
+ if (body.execution_mode !== undefined &&
167
+ body.execution_mode !== "worktree" &&
168
+ body.execution_mode !== "in_repo") {
169
+ return reply
170
+ .code(400)
171
+ .send({ error: "execution_mode must be 'worktree' or 'in_repo'" });
172
+ }
173
+ store.updateProject(id, {
174
+ ...(body.name?.trim() ? { name: body.name.trim() } : {}),
175
+ ...(body.execution_mode
176
+ ? { execution_mode: body.execution_mode }
177
+ : {}),
178
+ ...(typeof body.default_budget_usd === "number" &&
179
+ body.default_budget_usd > 0
180
+ ? { default_budget_usd: body.default_budget_usd }
181
+ : {}),
182
+ ...(typeof body.default_concurrency === "number" &&
183
+ body.default_concurrency >= 1
184
+ ? { default_concurrency: Math.floor(body.default_concurrency) }
185
+ : {}),
186
+ ...(typeof body.auto_merge === "boolean"
187
+ ? { auto_merge: body.auto_merge }
188
+ : {}),
189
+ });
190
+ return { project: store.getProject(id) };
191
+ });
192
+ app.delete("/api/projects/:id", async (req, reply) => {
193
+ const { id } = req.params;
194
+ const project = store.getProject(id);
195
+ if (!project)
196
+ return reply.code(404).send({ error: "project not found" });
197
+ const active = store.getActiveRunForRepo(project.repo_root);
198
+ if (active) {
199
+ return reply.code(409).send({
200
+ error: `run ${active.id} is still active for this project; stop it first`,
201
+ });
202
+ }
203
+ store.deleteProject(id);
204
+ return { ok: true };
205
+ });
206
+ // Orphaned-worktree cleanup for one project (spec 002 §R12). Removes
207
+ // worktree directories no scope references; never deletes unmerged
208
+ // branches. With `prune_merged: true` (v2) it also deletes `orc/*`
209
+ // branches fully merged into the current checkout (`git branch -d` only).
210
+ app.post("/api/projects/:id/gc", async (req, reply) => {
211
+ const { id } = req.params;
212
+ const project = store.getProject(id);
213
+ if (!project)
214
+ return reply.code(404).send({ error: "project not found" });
215
+ const body = (req.body ?? {});
216
+ const live = new Set(store.listActiveWorktreePaths());
217
+ const removed = [];
218
+ for (const orphan of system.worktrees.listOrphans(live)) {
219
+ // Only touch orphans belonging to this project's runs; directories whose
220
+ // run is unknown (deleted state) are treated as this project's on match.
221
+ const runId = basename(join(orphan, ".."));
222
+ const run = store.getRun(runId);
223
+ const goal = run ? store.getGoal(run.goal_id) : null;
224
+ if (goal && goal.project_id !== id)
225
+ continue;
226
+ system.worktrees.removeOrphan(orphan, project.repo_root);
227
+ removed.push(orphan);
228
+ }
229
+ const pruned_branches = body.prune_merged
230
+ ? system.worktrees.pruneMergedBranches(project.repo_root, "HEAD")
231
+ : [];
232
+ return { removed, pruned_branches };
233
+ });
234
+ // Feature-request flow (spec 002 §R4): one objective in, planning kicks off
235
+ // immediately; the goal surfaces as `awaiting_approval` when the plan lands.
236
+ app.post("/api/projects/:id/goals", async (req, reply) => {
237
+ const { id } = req.params;
238
+ const project = store.getProject(id);
239
+ if (!project)
240
+ return reply.code(404).send({ error: "project not found" });
241
+ const body = req.body;
242
+ const objective = body.objective?.trim();
243
+ if (!objective) {
244
+ return reply.code(400).send({ error: "objective required" });
245
+ }
246
+ // Shared feature-flow entrypoint (spec 003 §R4): plugin imports use the
247
+ // same code path, so the two cannot drift. Planning is fire-and-forget.
248
+ const goal = orchestrator.createFeatureGoal(project, {
249
+ objective,
250
+ title: body.title,
251
+ });
252
+ return reply.code(202).send({ goal });
253
+ });
254
+ // --- Goals / scopes / tasks ---------------------------------------------
255
+ app.get("/api/goals", async () => ({ goals: store.listGoals() }));
256
+ app.post("/api/goals", async (req) => {
257
+ const body = req.body;
258
+ return { goal: orchestrator.createGoal(body) };
259
+ });
260
+ app.get("/api/goals/:id", async (req, reply) => {
261
+ const { id } = req.params;
262
+ const goal = store.getGoal(id);
263
+ if (!goal)
264
+ return reply.code(404).send({ error: "goal not found" });
265
+ return {
266
+ goal,
267
+ scopes: store.listScopesByGoal(id),
268
+ tasks: store.listTasksByGoal(id),
269
+ };
270
+ });
271
+ app.post("/api/goals/:id/scopes", async (req) => {
272
+ const { id } = req.params;
273
+ const body = req.body;
274
+ return { scope: orchestrator.createScope({ ...body, goal_id: id }) };
275
+ });
276
+ app.post("/api/scopes/:id/tasks", async (req) => {
277
+ const { id } = req.params;
278
+ const body = req.body;
279
+ return { task: orchestrator.createTask({ ...body, scope_id: id }) };
280
+ });
281
+ app.post("/api/scopes/:id/approve", async (req) => {
282
+ const { id } = req.params;
283
+ orchestrator.approveScope(id);
284
+ return { ok: true };
285
+ });
286
+ // Run the Planner (§3): produces proposed scopes + pending tasks to approve.
287
+ app.post("/api/goals/:id/plan", async (req, reply) => {
288
+ const { id } = req.params;
289
+ if (!store.getGoal(id)) {
290
+ return reply.code(404).send({ error: "goal not found" });
291
+ }
292
+ try {
293
+ const { scopes, tasks } = await orchestrator.planGoal(id);
294
+ return { scopes, tasks };
295
+ }
296
+ catch (err) {
297
+ return reply.code(422).send({
298
+ error: err instanceof Error ? err.message : String(err),
299
+ });
300
+ }
301
+ });
302
+ // Replace an edited plan (`orc plan edit`): re-validate + re-materialize.
303
+ app.put("/api/goals/:id/plan", async (req, reply) => {
304
+ const { id } = req.params;
305
+ if (!store.getGoal(id)) {
306
+ return reply.code(404).send({ error: "goal not found" });
307
+ }
308
+ try {
309
+ const { scopes, tasks } = orchestrator.replacePlan(id, req.body);
310
+ return { scopes, tasks };
311
+ }
312
+ catch (err) {
313
+ return reply.code(422).send({
314
+ error: err instanceof Error ? err.message : String(err),
315
+ });
316
+ }
317
+ });
318
+ // Cancel a proposed plan (`orc plan cancel`): drops proposed scopes/tasks
319
+ // and returns the goal to draft so it can be re-planned.
320
+ app.delete("/api/goals/:id/plan", async (req, reply) => {
321
+ const { id } = req.params;
322
+ if (!store.getGoal(id)) {
323
+ return reply.code(404).send({ error: "goal not found" });
324
+ }
325
+ orchestrator.cancelPlan(id);
326
+ return { ok: true, goal: store.getGoal(id) };
327
+ });
328
+ // Approve every proposed scope of a goal at once (`orc approve <goal-id>`).
329
+ // With `start_run: true` (spec 002 §R5) the approval is the single human
330
+ // gate: a run starts immediately with the project's defaults, unattended.
331
+ app.post("/api/goals/:id/approve", async (req, reply) => {
332
+ const { id } = req.params;
333
+ const goal = store.getGoal(id);
334
+ if (!goal) {
335
+ return reply.code(404).send({ error: "goal not found" });
336
+ }
337
+ const body = (req.body ?? {});
338
+ const approved = orchestrator.approveGoal(id).map((s) => s.id);
339
+ if (!body.start_run)
340
+ return { approved };
341
+ const project = goal.project_id ? store.getProject(goal.project_id) : null;
342
+ if (!project) {
343
+ return reply.code(400).send({
344
+ error: "start_run requires a goal that belongs to a project",
345
+ approved,
346
+ });
347
+ }
348
+ try {
349
+ const run = orchestrator.startRun(id, {
350
+ budget_usd: project.default_budget_usd,
351
+ concurrency_limit: project.default_concurrency,
352
+ auto_loop: true,
353
+ });
354
+ system.autoLoop.setMode(run.id, "unattended");
355
+ return { approved, run };
356
+ }
357
+ catch (err) {
358
+ return reply.code(409).send({
359
+ error: err instanceof Error ? err.message : String(err),
360
+ approved,
361
+ });
362
+ }
363
+ });
364
+ // --- Runs ----------------------------------------------------------------
365
+ app.get("/api/runs", async () => ({ runs: store.listRuns() }));
366
+ app.post("/api/runs", async (req, reply) => {
367
+ const body = req.body;
368
+ if (!body.goal_id || typeof body.budget_usd !== "number") {
369
+ return reply.code(400).send({ error: "goal_id and budget_usd required" });
370
+ }
371
+ try {
372
+ return { run: orchestrator.startRun(body.goal_id, body) };
373
+ }
374
+ catch (err) {
375
+ // A concurrent run on the same repo (§13.11) is a conflict, not a 500.
376
+ return reply.code(409).send({
377
+ error: err instanceof Error ? err.message : String(err),
378
+ });
379
+ }
380
+ });
381
+ app.get("/api/runs/:id/status", async (req, reply) => {
382
+ const { id } = req.params;
383
+ const run = store.getRun(id);
384
+ if (!run)
385
+ return reply.code(404).send({ error: "run not found" });
386
+ const goal = store.getGoal(run.goal_id);
387
+ return {
388
+ run,
389
+ goal,
390
+ scopes: goal ? store.listScopesByGoal(goal.id) : [],
391
+ tasks: goal ? store.listTasksByGoal(goal.id) : [],
392
+ task_counts: goal ? store.countTasksByStatus(goal.id) : {},
393
+ in_flight: orchestrator.inFlight,
394
+ spent_usd: store.sumCostForRun(id),
395
+ open_escalations: store.listOpenEscalations(id).length,
396
+ backpressure: {
397
+ engaged: system.backpressure.isDispatchBlocked(),
398
+ resets_at: system.backpressure.globalResetsAt() ?? null,
399
+ quarantined: system.backpressure.quarantinedModels(),
400
+ },
401
+ };
402
+ });
403
+ app.get("/api/runs/:id/tasks", async (req) => {
404
+ const { id } = req.params;
405
+ const { state } = req.query;
406
+ const run = store.getRun(id);
407
+ if (!run)
408
+ return { tasks: [] };
409
+ let tasks = store.listTasksByGoal(run.goal_id);
410
+ if (state)
411
+ tasks = tasks.filter((t) => t.status === state);
412
+ return { tasks };
413
+ });
414
+ // Budget adjustment (§9 `orc budget set`). Thresholds stay config-level.
415
+ app.post("/api/runs/:id/budget", async (req, reply) => {
416
+ const { id } = req.params;
417
+ const run = store.getRun(id);
418
+ if (!run)
419
+ return reply.code(404).send({ error: "run not found" });
420
+ const body = req.body;
421
+ if (typeof body.usd === "number" && body.usd > 0) {
422
+ store.updateRun(id, { budget_usd: body.usd });
423
+ system.budget.refresh(id); // recompute budget_state against the new ceiling
424
+ }
425
+ return { run: store.getRun(id) };
426
+ });
427
+ // Autonomous-loop mode toggle (autonomous-loop.md §3.5, G6). `supervised`
428
+ // keeps the human approval gate for re-planned scopes; `unattended` auto-
429
+ // approves them (still bound by the safety layer, budget, and escalations).
430
+ app.post("/api/runs/:id/mode", async (req, reply) => {
431
+ const { id } = req.params;
432
+ if (!store.getRun(id))
433
+ return reply.code(404).send({ error: "run not found" });
434
+ const body = req.body;
435
+ if (body.mode !== "supervised" && body.mode !== "unattended") {
436
+ return reply
437
+ .code(400)
438
+ .send({ error: "mode must be 'supervised' or 'unattended'" });
439
+ }
440
+ system.autoLoop.setMode(id, body.mode);
441
+ return { run_id: id, mode: body.mode };
442
+ });
443
+ // --- Reports (§11) -------------------------------------------------------
444
+ app.get("/api/runs/:id/reports", async (req) => {
445
+ const { id } = req.params;
446
+ return { reports: store.listReports(id) };
447
+ });
448
+ app.post("/api/runs/:id/reports", async (req, reply) => {
449
+ const { id } = req.params;
450
+ if (!store.getRun(id))
451
+ return reply.code(404).send({ error: "run not found" });
452
+ return { report: system.reporting.generate(id, "manual") };
453
+ });
454
+ app.get("/api/reports/:id", async (req, reply) => {
455
+ const { id } = req.params;
456
+ const report = store.getReport(id);
457
+ if (!report)
458
+ return reply.code(404).send({ error: "report not found" });
459
+ return { report };
460
+ });
461
+ // --- Escalations / blocked queue (§8.5) ----------------------------------
462
+ app.get("/api/blocked", async (req) => {
463
+ const { run_id } = req.query;
464
+ return { escalations: store.listOpenEscalations(run_id) };
465
+ });
466
+ app.post("/api/escalations/:id/resolve", async (req, reply) => {
467
+ const { id } = req.params;
468
+ const esc = store.getEscalation(id);
469
+ if (!esc)
470
+ return reply.code(404).send({ error: "escalation not found" });
471
+ const body = req.body;
472
+ if (body.action !== "deny_instruct" &&
473
+ body.action !== "approve_once" &&
474
+ body.action !== "skip_task") {
475
+ return reply.code(400).send({ error: "invalid action" });
476
+ }
477
+ orchestrator.resolveEscalation(id, body.action, body.message);
478
+ return { ok: true };
479
+ });
480
+ app.post("/api/runs/:id/pause", async (req) => {
481
+ const { id } = req.params;
482
+ await orchestrator.pause(id);
483
+ return { ok: true };
484
+ });
485
+ app.post("/api/runs/:id/resume", async (req, reply) => {
486
+ const { id } = req.params;
487
+ if (!store.getRun(id)) {
488
+ return reply.code(404).send({ error: "run not found" });
489
+ }
490
+ orchestrator.resume(id);
491
+ return { ok: true };
492
+ });
493
+ app.post("/api/panic", async () => {
494
+ const runs = store
495
+ .listRuns()
496
+ .filter((r) => r.state === "running" || r.state === "pausing");
497
+ await Promise.allSettled(runs.map((r) => orchestrator.panic(r.id)));
498
+ return { ok: true, aborted: runs.map((r) => r.id) };
499
+ });
500
+ // Wipes the orc database (`orc purge`). Refused while any run is active or
501
+ // workers are in flight — they would settle into deleted rows.
502
+ app.post("/api/purge", async (req, reply) => {
503
+ const active = store
504
+ .listRuns()
505
+ .filter((r) => r.state === "running" || r.state === "pausing");
506
+ if (active.length > 0 || orchestrator.inFlight > 0) {
507
+ return reply.code(409).send({
508
+ error: `cannot purge: ${active.length} active run(s), ` +
509
+ `${orchestrator.inFlight} worker(s) in flight — pause or panic first`,
510
+ });
511
+ }
512
+ const body = (req.body ?? {});
513
+ const deleted = store.purge({ keep_projects: body.keep_projects === true });
514
+ return { deleted };
515
+ });
516
+ // --- Kanban board (spec 002 §R17) -----------------------------------------
517
+ // Cards for every task of project goals whose run is non-terminal, plus the
518
+ // most recent terminal run per project so finished work stays visible.
519
+ app.get("/api/board", async (req) => {
520
+ const { project_id } = req.query;
521
+ const projects = store
522
+ .listProjects()
523
+ .filter((p) => !project_id || p.id === project_id);
524
+ const goals = store.listGoals();
525
+ const projectOfGoal = new Map(goals.filter((g) => g.project_id).map((g) => [g.id, g.project_id]));
526
+ const runs = store.listRuns(); // newest first
527
+ const terminal = (s) => s === "done" || s === "failed";
528
+ // Allowed runs per spec: all non-terminal + newest terminal per project.
529
+ const allowedRuns = new Set();
530
+ const seenTerminalOfProject = new Set();
531
+ for (const r of runs) {
532
+ const pid = projectOfGoal.get(r.goal_id);
533
+ if (!pid)
534
+ continue;
535
+ if (!terminal(r.state)) {
536
+ allowedRuns.add(r.id);
537
+ }
538
+ else if (!seenTerminalOfProject.has(pid)) {
539
+ seenTerminalOfProject.add(pid);
540
+ allowedRuns.add(r.id);
541
+ }
542
+ }
543
+ // Newest allowed run per goal carries the card's run association.
544
+ const runOfGoal = new Map();
545
+ for (const r of runs) {
546
+ if (!allowedRuns.has(r.id))
547
+ continue;
548
+ if (!runOfGoal.has(r.goal_id))
549
+ runOfGoal.set(r.goal_id, r.id);
550
+ }
551
+ const cards = store
552
+ .listBoardCards(project_id)
553
+ .filter((c) => runOfGoal.has(c.goal_id))
554
+ .map((c) => ({ ...c, run_id: runOfGoal.get(c.goal_id) }));
555
+ return { projects, cards };
556
+ });
557
+ // --- Tasks ---------------------------------------------------------------
558
+ // Kanban reprioritization (spec 002 v2): higher priority dispatches first.
559
+ // Only meaningful for tasks that have not started; others are refused.
560
+ app.post("/api/tasks/:id/priority", async (req, reply) => {
561
+ const { id } = req.params;
562
+ const task = store.getTask(id);
563
+ if (!task)
564
+ return reply.code(404).send({ error: "task not found" });
565
+ const body = req.body;
566
+ if (typeof body.priority !== "number" || !Number.isFinite(body.priority)) {
567
+ return reply.code(400).send({ error: "priority (number) required" });
568
+ }
569
+ if (task.status !== "pending" && task.status !== "queued") {
570
+ return reply
571
+ .code(409)
572
+ .send({ error: `task is ${task.status}; only pending/queued reorder` });
573
+ }
574
+ store.setTaskPriority(id, Math.trunc(body.priority));
575
+ // A running run picks the new order up on its next tick; kick it now.
576
+ const scope = store.getScope(task.scope_id);
577
+ const run = scope ? store.getActiveRunForGoal(scope.goal_id) : null;
578
+ if (run?.state === "running")
579
+ void orchestrator.tick(run.id);
580
+ return { task: store.getTask(id) };
581
+ });
582
+ app.get("/api/tasks/:id", async (req, reply) => {
583
+ const { id } = req.params;
584
+ const task = store.getTask(id);
585
+ if (!task)
586
+ return reply.code(404).send({ error: "task not found" });
587
+ return { task, subagents: store.listSubagentsByTask(id) };
588
+ });
589
+ // --- Plugins & task providers (spec 003 §R7, §R8) -------------------------
590
+ app.get("/api/plugins", async () => {
591
+ await system.plugins.ready;
592
+ return { plugins: system.plugins.list() };
593
+ });
594
+ // Plugin secret set/unset (spec 003 §R8): value arrives in the body (never
595
+ // argv), localhost-only like everything else. Newly set values are
596
+ // registered for redaction/stripping immediately — no restart needed.
597
+ app.post("/api/plugins/:name/secrets", async (req, reply) => {
598
+ await system.plugins.ready;
599
+ const { name } = req.params;
600
+ if (!system.plugins.has(name)) {
601
+ return reply.code(404).send({ error: `unknown plugin "${name}"` });
602
+ }
603
+ const body = req.body;
604
+ if (!body.key || typeof body.value !== "string" || !body.value) {
605
+ return reply.code(400).send({ error: "key and value required" });
606
+ }
607
+ try {
608
+ system.secrets.set(body.key, body.value);
609
+ }
610
+ catch (err) {
611
+ return reply.code(400).send({
612
+ error: err instanceof Error ? err.message : String(err),
613
+ });
614
+ }
615
+ registerStrippedEnvKeys([body.key]);
616
+ registerSecretValue(body.value);
617
+ return { ok: true, keys: system.secrets.listKeys() };
618
+ });
619
+ app.delete("/api/plugins/:name/secrets/:key", async (req, reply) => {
620
+ await system.plugins.ready;
621
+ const { name, key } = req.params;
622
+ if (!system.plugins.has(name)) {
623
+ return reply.code(404).send({ error: `unknown plugin "${name}"` });
624
+ }
625
+ try {
626
+ system.secrets.unset(key);
627
+ }
628
+ catch (err) {
629
+ return reply.code(400).send({
630
+ error: err instanceof Error ? err.message : String(err),
631
+ });
632
+ }
633
+ return { ok: true, keys: system.secrets.listKeys() };
634
+ });
635
+ app.get("/api/providers", async () => {
636
+ await system.plugins.ready;
637
+ return { providers: system.plugins.listTaskProviders() };
638
+ });
639
+ app.get("/api/providers/:name/tasks", async (req, reply) => {
640
+ await system.plugins.ready;
641
+ const { name } = req.params;
642
+ const provider = system.plugins.getTaskProvider(name);
643
+ if (!provider) {
644
+ return reply.code(404).send({ error: `unknown provider "${name}"` });
645
+ }
646
+ const q = req.query;
647
+ const query = {
648
+ ...(q.search ? { search: q.search } : {}),
649
+ ...(q.assigned_to_me === "true" ? { assigned_to_me: true } : {}),
650
+ ...(q.state ? { state: q.state } : {}),
651
+ ...(q.team ? { team: q.team } : {}),
652
+ ...(q.limit && Number.isFinite(Number(q.limit))
653
+ ? { limit: Number(q.limit) }
654
+ : {}),
655
+ };
656
+ try {
657
+ const tasks = await withTimeout(provider.listTasks(query), PROVIDER_TIMEOUT_MS);
658
+ return { tasks };
659
+ }
660
+ catch (err) {
661
+ // Upstream failure (bad token, outage, timeout) is a 502, never a hang.
662
+ return reply.code(502).send({
663
+ error: err instanceof Error ? err.message : String(err),
664
+ });
665
+ }
666
+ });
667
+ // Import an external task as a goal (spec 003 §R7): resolves the task,
668
+ // guards against duplicate imports, and funnels into the feature flow.
669
+ app.post("/api/providers/:name/import", async (req, reply) => {
670
+ await system.plugins.ready;
671
+ const { name } = req.params;
672
+ const provider = system.plugins.getTaskProvider(name);
673
+ if (!provider) {
674
+ return reply.code(404).send({ error: `unknown provider "${name}"` });
675
+ }
676
+ const body = req.body;
677
+ if (!body.external_id || !body.project_id) {
678
+ return reply
679
+ .code(400)
680
+ .send({ error: "external_id and project_id required" });
681
+ }
682
+ const project = store.getProject(body.project_id);
683
+ if (!project)
684
+ return reply.code(404).send({ error: "project not found" });
685
+ let task;
686
+ try {
687
+ task = await withTimeout(provider.getTask(body.external_id), PROVIDER_TIMEOUT_MS);
688
+ }
689
+ catch (err) {
690
+ return reply.code(502).send({
691
+ error: err instanceof Error ? err.message : String(err),
692
+ });
693
+ }
694
+ if (!task) {
695
+ return reply
696
+ .code(404)
697
+ .send({ error: `task "${body.external_id}" not found in ${name}` });
698
+ }
699
+ const existing = store.findActiveGoalByExternalRef(task.provider, task.id);
700
+ if (existing) {
701
+ return reply.code(409).send({
702
+ error: `task ${task.identifier} is already imported as goal ${existing.id} (${existing.status})`,
703
+ goal: existing,
704
+ });
705
+ }
706
+ const goal = await system.plugins.importTask(name, task, project.id);
707
+ return reply.code(202).send({ goal });
708
+ });
709
+ // --- SSE event stream (§10) ---------------------------------------------
710
+ app.get("/api/events", (req, reply) => {
711
+ const q = req.query;
712
+ const lastId = Number(req.headers["last-event-id"] ?? q.lastEventId ?? 0);
713
+ reply.raw.writeHead(200, {
714
+ "Content-Type": "text/event-stream",
715
+ "Cache-Control": "no-cache, no-transform",
716
+ Connection: "keep-alive",
717
+ "X-Accel-Buffering": "no",
718
+ });
719
+ reply.hijack();
720
+ // Replay anything the client missed since Last-Event-ID (§10 resume).
721
+ for (const e of store.listEventsSince(lastId, q.run_id)) {
722
+ reply.raw.write(sseFrame(e));
723
+ }
724
+ const unsubscribe = system.bus.subscribe((e) => {
725
+ if (q.run_id && e.run_id !== q.run_id)
726
+ return;
727
+ reply.raw.write(sseFrame(e));
728
+ });
729
+ const heartbeat = setInterval(() => reply.raw.write(": ping\n\n"), 15_000);
730
+ req.raw.on("close", () => {
731
+ clearInterval(heartbeat);
732
+ unsubscribe();
733
+ });
734
+ });
735
+ // --- Audit tail ----------------------------------------------------------
736
+ app.get("/api/audit/:runId", async (req) => {
737
+ const { runId } = req.params;
738
+ const path = system.audit.filePathFor(runId);
739
+ if (!existsSync(path))
740
+ return { events: [] };
741
+ const lines = readFileSync(path, "utf8").trim().split("\n").filter(Boolean);
742
+ return { events: lines.map((l) => JSON.parse(l)) };
743
+ });
744
+ // --- SPA static hosting --------------------------------------------------
745
+ const uiDist = opts.uiDist ?? join(process.cwd(), "packages/ui/dist");
746
+ if (existsSync(join(uiDist, "index.html"))) {
747
+ void app.register(fastifyStatic, { root: uiDist });
748
+ app.setNotFoundHandler((req, reply) => {
749
+ if (req.url.startsWith("/api") || req.url.startsWith("/health")) {
750
+ return reply.code(404).send({ error: "not found" });
751
+ }
752
+ return reply.sendFile("index.html");
753
+ });
754
+ }
755
+ return app;
756
+ }
757
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ /** Dev/prod entrypoint: boots the Fastify server and listens on 127.0.0.1 (§2). */
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,mFAAmF"}
package/dist/main.js ADDED
@@ -0,0 +1,11 @@
1
+ /** Dev/prod entrypoint: boots the Fastify server and listens on 127.0.0.1 (§2). */
2
+ import { createServer } from "./index.js";
3
+ const app = createServer({ stateDir: process.env.ORC_STATE_DIR });
4
+ const port = Number(process.env.PORT ?? 4173);
5
+ // Localhost binding is the access control (§2) — never expose beyond loopback.
6
+ const host = process.env.HOST ?? "127.0.0.1";
7
+ app.listen({ port, host }).catch((err) => {
8
+ app.log.error(err);
9
+ process.exit(1);
10
+ });
11
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;AAClE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAC9C,+EAA+E;AAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;AAE7C,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACvC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@orc-brain/server",
3
+ "version": "1.0.0",
4
+ "description": "Fastify REST + SSE server for orc-brain, serving the API and the web UI.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Paulo Lima",
8
+ "homepage": "https://github.com/anplabs/orc-brain#readme",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/anplabs/orc-brain.git",
12
+ "directory": "packages/server"
13
+ },
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "engines": {
23
+ "node": ">=22"
24
+ },
25
+ "dependencies": {
26
+ "@fastify/cors": "^11.2.0",
27
+ "@fastify/static": "^9.1.3",
28
+ "fastify": "^5.2.1",
29
+ "@orc-brain/core": "1.0.0",
30
+ "@orc-brain/shared": "1.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^22.10.7",
34
+ "tsx": "^4.19.2"
35
+ },
36
+ "scripts": {
37
+ "build": "tsc -p tsconfig.json",
38
+ "dev": "tsx watch src/main.ts",
39
+ "start": "node dist/main.js",
40
+ "clean": "rm -rf dist"
41
+ }
42
+ }