@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 +21 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +757 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +11 -0
- package/dist/main.js.map +1 -0
- package/package.json +42 -0
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.
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
package/dist/main.js.map
ADDED
|
@@ -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
|
+
}
|