@brainst0rm/cli 0.14.1 → 0.14.3
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/dist/{App-DSD2B5RV.js → App-4GFCMEPX.js} +10 -10
- package/dist/{App-6WBAUX35.js → App-KTUPXXQM.js} +10 -10
- package/dist/{agent-D5GTWGPD.js → agent-EYT6BPVT.js} +2 -2
- package/dist/{agent-DOR4KPUH.js → agent-KTWFCMY5.js} +2 -2
- package/dist/brainstorm.js +56 -56
- package/dist/{chunk-RV3CJQGC.js → chunk-2AXI2OPK.js} +43 -7
- package/dist/chunk-2AXI2OPK.js.map +1 -0
- package/dist/{chunk-6G2HA63H.js → chunk-3AYD5ONW.js} +43 -7
- package/dist/chunk-3AYD5ONW.js.map +1 -0
- package/dist/{chunk-UPP3TOCP.js → chunk-3RH5MKZF.js} +5 -5
- package/dist/{chunk-GLWCTGWG.js → chunk-4NNXZFPX.js} +2 -2
- package/dist/{chunk-Z5QQ5OGV.js → chunk-52Q6CE4Y.js} +19 -2
- package/dist/chunk-52Q6CE4Y.js.map +1 -0
- package/dist/{chunk-FGYEICUI.js → chunk-6UFDBLUX.js} +36 -4
- package/dist/chunk-6UFDBLUX.js.map +1 -0
- package/dist/{chunk-NVA62I52.js → chunk-6WGHIUWX.js} +2 -2
- package/dist/{chunk-4LR7LQPG.js → chunk-CZILJ33T.js} +2 -2
- package/dist/{chunk-TLQVDPEQ.js → chunk-DJ7WG6GZ.js} +19 -2
- package/dist/chunk-DJ7WG6GZ.js.map +1 -0
- package/dist/{chunk-N7JKT44Y.js → chunk-GUHXB5DX.js} +2 -2
- package/dist/{chunk-SCGV333Z.js → chunk-HKRUCBMI.js} +4 -4
- package/dist/{chunk-PIT7VD46.js → chunk-N5V2PGPN.js} +4 -4
- package/dist/{chunk-GF5TKYDA.js → chunk-RVQOLZR6.js} +14 -14
- package/dist/{chunk-AH5SFL5J.js → chunk-RVXUVX5W.js} +14 -14
- package/dist/{chunk-4PCWPRRN.js → chunk-WRO5TVID.js} +5 -5
- package/dist/{chunk-ZYGUHAHM.js → chunk-Z5RDHTWQ.js} +36 -4
- package/dist/chunk-Z5RDHTWQ.js.map +1 -0
- package/dist/{dist-QUYR4VH7.js → dist-5NJP3JHL.js} +23 -3
- package/dist/{dist-QUYR4VH7.js.map → dist-5NJP3JHL.js.map} +1 -1
- package/dist/{dist-P6IZYZBM.js → dist-7AIEUUFF.js} +2 -2
- package/dist/{dist-RVTIEEXC.js → dist-DCJYPRUZ.js} +3 -3
- package/dist/{dist-PGQ4UIM4.js → dist-DXQQF55Y.js} +3 -3
- package/dist/{dist-JQXY4E6A.js → dist-KSUHKNET.js} +88 -15
- package/dist/dist-KSUHKNET.js.map +1 -0
- package/dist/{dist-TS5U3BDK.js → dist-LCPM5BXN.js} +5 -5
- package/dist/{dist-VB7CXEYB.js → dist-MKAADC4H.js} +5 -5
- package/dist/{dist-MKWOTCNR.js → dist-NQQPQGZU.js} +6 -6
- package/dist/{dist-VECPW2NV.js → dist-NTQ7LFRW.js} +5 -5
- package/dist/{dist-ESUVKHL4.js → dist-QFVAD45U.js} +6 -6
- package/dist/{dist-7IRVYQYG.js → dist-RUBJT7FI.js} +2 -2
- package/dist/{dist-P2J4GXPC.js → dist-S7FLVLXS.js} +2 -2
- package/dist/{dist-4JONNOLT.js → dist-U3G5HT5D.js} +6 -6
- package/dist/{dist-IUVHFJV2.js → dist-UETKBS6A.js} +6 -6
- package/dist/{dist-ODBEXWTS.js → dist-WLMQD6I5.js} +5 -5
- package/dist/{dist-GNYSGXLR.js → dist-XFJ337R7.js} +23 -3
- package/dist/{dist-GNYSGXLR.js.map → dist-XFJ337R7.js.map} +1 -1
- package/dist/{dist-T6BIJZSD.js → dist-Y5FZXOVL.js} +2 -2
- package/dist/{dist-2DSARR2V.js → dist-ZPASHTYZ.js} +88 -15
- package/dist/dist-ZPASHTYZ.js.map +1 -0
- package/dist/{handler-VOVQRV5B.js → handler-CPXQZBSW.js} +6 -6
- package/dist/{handler-MHEFUP32.js → handler-FIBSROM4.js} +6 -6
- package/dist/index.js +56 -56
- package/dist/{mcp-server-C732TVIQ.js → mcp-server-56FVMXTC.js} +2 -2
- package/dist/{mcp-server-JUYR37EX.js → mcp-server-XXUZDYW6.js} +2 -2
- package/dist/{roles-QTZ54BOF.js → roles-CJTZSFFW.js} +6 -6
- package/dist/{roles-LDNPU3NI.js → roles-MVBHE5QW.js} +6 -6
- package/dist/{slash-VYIMEVPU.js → slash-WFDKT67A.js} +8 -8
- package/dist/{slash-VAUFJQBQ.js → slash-Y3E5KBOJ.js} +8 -8
- package/package.json +28 -28
- package/dist/chunk-6G2HA63H.js.map +0 -1
- package/dist/chunk-FGYEICUI.js.map +0 -1
- package/dist/chunk-RV3CJQGC.js.map +0 -1
- package/dist/chunk-TLQVDPEQ.js.map +0 -1
- package/dist/chunk-Z5QQ5OGV.js.map +0 -1
- package/dist/chunk-ZYGUHAHM.js.map +0 -1
- package/dist/dist-2DSARR2V.js.map +0 -1
- package/dist/dist-JQXY4E6A.js.map +0 -1
- /package/dist/{App-DSD2B5RV.js.map → App-4GFCMEPX.js.map} +0 -0
- /package/dist/{App-6WBAUX35.js.map → App-KTUPXXQM.js.map} +0 -0
- /package/dist/{agent-D5GTWGPD.js.map → agent-EYT6BPVT.js.map} +0 -0
- /package/dist/{agent-DOR4KPUH.js.map → agent-KTWFCMY5.js.map} +0 -0
- /package/dist/{chunk-UPP3TOCP.js.map → chunk-3RH5MKZF.js.map} +0 -0
- /package/dist/{chunk-GLWCTGWG.js.map → chunk-4NNXZFPX.js.map} +0 -0
- /package/dist/{chunk-NVA62I52.js.map → chunk-6WGHIUWX.js.map} +0 -0
- /package/dist/{chunk-4LR7LQPG.js.map → chunk-CZILJ33T.js.map} +0 -0
- /package/dist/{chunk-N7JKT44Y.js.map → chunk-GUHXB5DX.js.map} +0 -0
- /package/dist/{chunk-SCGV333Z.js.map → chunk-HKRUCBMI.js.map} +0 -0
- /package/dist/{chunk-PIT7VD46.js.map → chunk-N5V2PGPN.js.map} +0 -0
- /package/dist/{chunk-GF5TKYDA.js.map → chunk-RVQOLZR6.js.map} +0 -0
- /package/dist/{chunk-AH5SFL5J.js.map → chunk-RVXUVX5W.js.map} +0 -0
- /package/dist/{chunk-4PCWPRRN.js.map → chunk-WRO5TVID.js.map} +0 -0
- /package/dist/{dist-4JONNOLT.js.map → dist-7AIEUUFF.js.map} +0 -0
- /package/dist/{dist-7IRVYQYG.js.map → dist-DCJYPRUZ.js.map} +0 -0
- /package/dist/{dist-ESUVKHL4.js.map → dist-DXQQF55Y.js.map} +0 -0
- /package/dist/{dist-IUVHFJV2.js.map → dist-LCPM5BXN.js.map} +0 -0
- /package/dist/{dist-VB7CXEYB.js.map → dist-MKAADC4H.js.map} +0 -0
- /package/dist/{dist-MKWOTCNR.js.map → dist-NQQPQGZU.js.map} +0 -0
- /package/dist/{dist-P2J4GXPC.js.map → dist-NTQ7LFRW.js.map} +0 -0
- /package/dist/{dist-P6IZYZBM.js.map → dist-QFVAD45U.js.map} +0 -0
- /package/dist/{dist-PGQ4UIM4.js.map → dist-RUBJT7FI.js.map} +0 -0
- /package/dist/{dist-RVTIEEXC.js.map → dist-S7FLVLXS.js.map} +0 -0
- /package/dist/{dist-T6BIJZSD.js.map → dist-U3G5HT5D.js.map} +0 -0
- /package/dist/{dist-TS5U3BDK.js.map → dist-UETKBS6A.js.map} +0 -0
- /package/dist/{dist-ODBEXWTS.js.map → dist-WLMQD6I5.js.map} +0 -0
- /package/dist/{dist-VECPW2NV.js.map → dist-Y5FZXOVL.js.map} +0 -0
- /package/dist/{handler-VOVQRV5B.js.map → handler-CPXQZBSW.js.map} +0 -0
- /package/dist/{handler-MHEFUP32.js.map → handler-FIBSROM4.js.map} +0 -0
- /package/dist/{mcp-server-C732TVIQ.js.map → mcp-server-56FVMXTC.js.map} +0 -0
- /package/dist/{mcp-server-JUYR37EX.js.map → mcp-server-XXUZDYW6.js.map} +0 -0
- /package/dist/{roles-LDNPU3NI.js.map → roles-CJTZSFFW.js.map} +0 -0
- /package/dist/{roles-QTZ54BOF.js.map → roles-MVBHE5QW.js.map} +0 -0
- /package/dist/{slash-VAUFJQBQ.js.map → slash-WFDKT67A.js.map} +0 -0
- /package/dist/{slash-VYIMEVPU.js.map → slash-Y3E5KBOJ.js.map} +0 -0
|
@@ -7,17 +7,17 @@ import {
|
|
|
7
7
|
buildSystemPrompt,
|
|
8
8
|
createDefaultMiddlewarePipeline,
|
|
9
9
|
runAgentLoop
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-N5V2PGPN.js";
|
|
11
11
|
import "./chunk-FRRVMDNL.js";
|
|
12
12
|
import "./chunk-CTEU5TQB.js";
|
|
13
13
|
import "./chunk-SSCKEV6Z.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-3AYD5ONW.js";
|
|
15
15
|
import "./chunk-2JGN7EGX.js";
|
|
16
16
|
import "./chunk-EEKSBGRM.js";
|
|
17
17
|
import "./chunk-WHP2HLMU.js";
|
|
18
18
|
import "./chunk-N43GBGXI.js";
|
|
19
19
|
import "./chunk-7B2QCIEV.js";
|
|
20
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-CZILJ33T.js";
|
|
21
21
|
import "./chunk-NLLWNPII.js";
|
|
22
22
|
import "./chunk-D7KQXJJ7.js";
|
|
23
23
|
import "./chunk-DT4D3D4I.js";
|
|
@@ -29,7 +29,7 @@ import "./chunk-EHQ4RKTP.js";
|
|
|
29
29
|
import "./chunk-5TPIVYD3.js";
|
|
30
30
|
import "./chunk-J6ELXZTM.js";
|
|
31
31
|
import "./chunk-XKTCRSDK.js";
|
|
32
|
-
import "./chunk-
|
|
32
|
+
import "./chunk-52Q6CE4Y.js";
|
|
33
33
|
import {
|
|
34
34
|
createLogger
|
|
35
35
|
} from "./chunk-E7XO6BH5.js";
|
|
@@ -40,13 +40,39 @@ import "./chunk-RBN7ACDW.js";
|
|
|
40
40
|
import {
|
|
41
41
|
createServer
|
|
42
42
|
} from "http";
|
|
43
|
-
import { randomUUID } from "crypto";
|
|
43
|
+
import { randomBytes, randomUUID, timingSafeEqual } from "crypto";
|
|
44
|
+
import {
|
|
45
|
+
writeFileSync,
|
|
46
|
+
unlinkSync,
|
|
47
|
+
mkdirSync,
|
|
48
|
+
existsSync,
|
|
49
|
+
chmodSync
|
|
50
|
+
} from "fs";
|
|
51
|
+
import { homedir } from "os";
|
|
52
|
+
import { join } from "path";
|
|
44
53
|
var log = createLogger("server");
|
|
45
54
|
var BrainstormServer = class _BrainstormServer {
|
|
46
55
|
server = null;
|
|
47
56
|
deps;
|
|
48
57
|
opts;
|
|
49
58
|
conversationManager = null;
|
|
59
|
+
/**
|
|
60
|
+
* Dev-mode auth token. Generated at server start when `jwtSecret` is
|
|
61
|
+
* empty AND the bind is loopback. Written to ~/.brainstorm/server-token
|
|
62
|
+
* with 0600 perms so only the SAME-UID process can read it; required
|
|
63
|
+
* on every /api/* request (Authorization: Bearer <token>).
|
|
64
|
+
*
|
|
65
|
+
* v16 Attacker (PR #325 round) finding: previously, dev mode let ANY
|
|
66
|
+
* local process — possibly a different user or a sandboxed plugin —
|
|
67
|
+
* hit /api/v1/changesets/:id/approve, /api/v1/memory, /api/v1/tools/
|
|
68
|
+
* execute, /api/v1/chat with no auth. The dev token binds the
|
|
69
|
+
* trust scope to "processes that can read this file" = same uid.
|
|
70
|
+
*
|
|
71
|
+
* Cleared on stop(). Production users with BRAINSTORM_JWT_SECRET set
|
|
72
|
+
* never see this — it's strictly dev mode.
|
|
73
|
+
*/
|
|
74
|
+
devToken = null;
|
|
75
|
+
devTokenPath = null;
|
|
50
76
|
constructor(deps, opts) {
|
|
51
77
|
this.deps = deps;
|
|
52
78
|
this.opts = {
|
|
@@ -64,6 +90,32 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
64
90
|
);
|
|
65
91
|
}
|
|
66
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Per-session loopback auth token. Written to disk with 0600 perms so
|
|
95
|
+
* only same-uid processes can read it. Required on /api/* in dev mode.
|
|
96
|
+
*/
|
|
97
|
+
initDevToken() {
|
|
98
|
+
const dir = join(
|
|
99
|
+
process.env.BRAINSTORM_HOME ?? join(homedir(), ".brainstorm")
|
|
100
|
+
);
|
|
101
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
102
|
+
const tokenPath = join(dir, "server-token");
|
|
103
|
+
const token = randomBytes(32).toString("hex");
|
|
104
|
+
writeFileSync(tokenPath, token, { mode: 384 });
|
|
105
|
+
chmodSync(tokenPath, 384);
|
|
106
|
+
this.devToken = token;
|
|
107
|
+
this.devTokenPath = tokenPath;
|
|
108
|
+
}
|
|
109
|
+
/** Constant-time check of supplied Bearer against the dev token. */
|
|
110
|
+
verifyDevToken(authHeader) {
|
|
111
|
+
if (!this.devToken || !authHeader) return false;
|
|
112
|
+
const m = /^Bearer\s+(.+)$/i.exec(authHeader.trim());
|
|
113
|
+
if (!m) return false;
|
|
114
|
+
const supplied = Buffer.from(m[1], "utf8");
|
|
115
|
+
const expected = Buffer.from(this.devToken, "utf8");
|
|
116
|
+
if (supplied.length !== expected.length) return false;
|
|
117
|
+
return timingSafeEqual(supplied, expected);
|
|
118
|
+
}
|
|
67
119
|
/** Start the HTTP server. Returns a promise that resolves when listening. */
|
|
68
120
|
async start() {
|
|
69
121
|
const { port, host } = this.opts;
|
|
@@ -75,7 +127,11 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
75
127
|
);
|
|
76
128
|
process.exit(1);
|
|
77
129
|
} else {
|
|
78
|
-
|
|
130
|
+
this.initDevToken();
|
|
131
|
+
log.info(
|
|
132
|
+
{ tokenPath: this.devTokenPath },
|
|
133
|
+
"Running in dev mode (loopback only). Wrote per-session token to file \u2014 same-uid processes can read it for client auth."
|
|
134
|
+
);
|
|
79
135
|
}
|
|
80
136
|
}
|
|
81
137
|
this.server = createServer((req, res) => {
|
|
@@ -96,6 +152,15 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
96
152
|
}
|
|
97
153
|
/** Stop the server gracefully. */
|
|
98
154
|
async stop() {
|
|
155
|
+
if (this.devTokenPath && existsSync(this.devTokenPath)) {
|
|
156
|
+
try {
|
|
157
|
+
unlinkSync(this.devTokenPath);
|
|
158
|
+
} catch (err) {
|
|
159
|
+
log.warn({ err }, "Failed to delete dev token on shutdown");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
this.devToken = null;
|
|
163
|
+
this.devTokenPath = null;
|
|
99
164
|
return new Promise((resolve) => {
|
|
100
165
|
if (!this.server) return resolve();
|
|
101
166
|
this.server.close(() => {
|
|
@@ -137,6 +202,14 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
137
202
|
401,
|
|
138
203
|
"Authentication required \u2014 set SUPABASE_JWT_SECRET"
|
|
139
204
|
);
|
|
205
|
+
} else {
|
|
206
|
+
if (!this.verifyDevToken(req.headers.authorization)) {
|
|
207
|
+
return this.errorResponse(
|
|
208
|
+
res,
|
|
209
|
+
401,
|
|
210
|
+
`Dev-mode token required. Read it from ${this.devTokenPath ?? "~/.brainstorm/server-token"} and send as 'Authorization: Bearer <token>'.`
|
|
211
|
+
);
|
|
212
|
+
}
|
|
140
213
|
}
|
|
141
214
|
}
|
|
142
215
|
if (path === "/api/v1/products" && method === "GET")
|
|
@@ -285,18 +358,18 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
285
358
|
}
|
|
286
359
|
// ── ChangeSets ────────────────────────────────────────────────────
|
|
287
360
|
async handleChangesets(res) {
|
|
288
|
-
const { listChangeSets } = await import("./dist-
|
|
361
|
+
const { listChangeSets } = await import("./dist-5NJP3JHL.js");
|
|
289
362
|
this.json(res, 200, this.envelope(listChangeSets()));
|
|
290
363
|
}
|
|
291
364
|
async handleChangesetApprove(id, req, res) {
|
|
292
|
-
const { approveChangeSet } = await import("./dist-
|
|
365
|
+
const { approveChangeSet } = await import("./dist-5NJP3JHL.js");
|
|
293
366
|
const authPayload = req._authPayload;
|
|
294
367
|
const approver = authPayload?.email ?? authPayload?.sub ?? "user";
|
|
295
368
|
const result = await approveChangeSet(id, approver);
|
|
296
369
|
this.json(res, result.success ? 200 : 400, this.envelope(result));
|
|
297
370
|
}
|
|
298
371
|
async handleChangesetReject(id, res) {
|
|
299
|
-
const { rejectChangeSet } = await import("./dist-
|
|
372
|
+
const { rejectChangeSet } = await import("./dist-5NJP3JHL.js");
|
|
300
373
|
const result = rejectChangeSet(id);
|
|
301
374
|
this.json(res, result.success ? 200 : 400, this.envelope(result));
|
|
302
375
|
}
|
|
@@ -314,7 +387,7 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
314
387
|
}
|
|
315
388
|
}
|
|
316
389
|
async handleAuditChangesets(url, res) {
|
|
317
|
-
const { ChangeSetLogRepository } = await import("./dist-
|
|
390
|
+
const { ChangeSetLogRepository } = await import("./dist-RUBJT7FI.js");
|
|
318
391
|
const csLog = new ChangeSetLogRepository(this.deps.db);
|
|
319
392
|
const limit = this.safeInt(url.searchParams.get("limit"), 50);
|
|
320
393
|
const offset = this.safeInt(url.searchParams.get("offset"), 0);
|
|
@@ -333,7 +406,7 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
333
406
|
if (!masterSecret) {
|
|
334
407
|
return this.errorResponse(res, 503, "Platform secret not configured");
|
|
335
408
|
}
|
|
336
|
-
const { verifyEvent } = await import("./dist-
|
|
409
|
+
const { verifyEvent } = await import("./dist-5NJP3JHL.js");
|
|
337
410
|
if (!verifyEvent(body, masterSecret)) {
|
|
338
411
|
return this.errorResponse(res, 401, "Invalid event signature");
|
|
339
412
|
}
|
|
@@ -605,7 +678,7 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
605
678
|
}
|
|
606
679
|
// ── Skills ───────────────────────────────────────────────────────
|
|
607
680
|
handleListSkills(res) {
|
|
608
|
-
import("./dist-
|
|
681
|
+
import("./dist-NTQ7LFRW.js").then(({ loadSkills }) => {
|
|
609
682
|
try {
|
|
610
683
|
const skills = loadSkills(this.opts.projectPath);
|
|
611
684
|
const list = skills.map((s) => ({
|
|
@@ -636,7 +709,7 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
636
709
|
async handleRedTeam(req, res) {
|
|
637
710
|
const body = await this.readBody(req);
|
|
638
711
|
try {
|
|
639
|
-
const { runRedTeamSimulation, createDefaultMiddlewarePipeline: createDefaultMiddlewarePipeline2 } = await import("./dist-
|
|
712
|
+
const { runRedTeamSimulation, createDefaultMiddlewarePipeline: createDefaultMiddlewarePipeline2 } = await import("./dist-NTQ7LFRW.js");
|
|
640
713
|
const pipeline = createDefaultMiddlewarePipeline2(this.opts.projectPath);
|
|
641
714
|
const scorecard = runRedTeamSimulation(pipeline, {
|
|
642
715
|
generations: body.generations ?? 5,
|
|
@@ -701,7 +774,7 @@ ${memCtx}`;
|
|
|
701
774
|
}
|
|
702
775
|
// ── Auth ──────────────────────────────────────────────────────────
|
|
703
776
|
async checkAuth(req) {
|
|
704
|
-
const { verifyJWT, extractBearerToken } = await import("./dist-
|
|
777
|
+
const { verifyJWT, extractBearerToken } = await import("./dist-5NJP3JHL.js");
|
|
705
778
|
const token = extractBearerToken(
|
|
706
779
|
req.headers.authorization
|
|
707
780
|
);
|
|
@@ -1022,4 +1095,4 @@ export {
|
|
|
1022
1095
|
BrainstormClient,
|
|
1023
1096
|
BrainstormServer
|
|
1024
1097
|
};
|
|
1025
|
-
//# sourceMappingURL=dist-
|
|
1098
|
+
//# sourceMappingURL=dist-KSUHKNET.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../server/src/server.ts","../../server/src/client.ts"],"sourcesContent":["/**\n * BrainstormServer — the agent runtime as an HTTP service.\n *\n * Decouples the agent loop from the CLI. The server owns:\n * - Tool registry and execution\n * - Model routing and cost tracking\n * - Session and conversation management\n * - Memory (shared across conversations)\n * - God Mode connectors\n *\n * Clients (CLI, MCP, web UI, other agents) connect via HTTP/SSE.\n *\n * Endpoints:\n * GET /health Health + stats\n * GET /api/v1/products Connected God Mode products\n * GET /api/v1/tools All available tools\n * POST /api/v1/tools/execute Execute a tool directly\n * GET /api/v1/changesets Pending ChangeSets\n * POST /api/v1/changesets/:id/approve Approve + execute\n * POST /api/v1/changesets/:id/reject Reject\n * GET /api/v1/audit Tool execution audit trail\n * GET /api/v1/audit/changesets God Mode changeset audit\n * POST /api/v1/platform/events Receive signed platform events\n * POST /api/v1/chat Non-streaming chat\n * POST /api/v1/chat/stream SSE streaming chat\n * GET /api/v1/conversations List conversations\n * POST /api/v1/conversations Create conversation\n * GET /api/v1/conversations/:id Get conversation\n * PATCH /api/v1/conversations/:id Update conversation\n * DELETE /api/v1/conversations/:id Delete conversation\n * POST /api/v1/conversations/:id/fork Fork conversation\n * POST /api/v1/conversations/:id/handoff Model handoff\n * GET /api/v1/conversations/:id/sessions List conversation sessions\n */\n\nimport {\n createServer,\n type Server,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { randomBytes, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport {\n writeFileSync,\n unlinkSync,\n mkdirSync,\n existsSync,\n chmodSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createLogger } from \"@brainst0rm/shared\";\nimport type { GodModeConnectionResult } from \"@brainst0rm/godmode\";\nimport type { ToolRegistry } from \"@brainst0rm/tools\";\nimport type { BrainstormRouter, CostTracker } from \"@brainst0rm/router\";\nimport type { ProviderRegistry } from \"@brainst0rm/providers\";\nimport type Database from \"better-sqlite3\";\nimport {\n runAgentLoop,\n buildSystemPrompt,\n SessionManager,\n createDefaultMiddlewarePipeline,\n ConversationManager,\n} from \"@brainst0rm/core\";\nimport type { MemoryManager } from \"@brainst0rm/core\";\nimport type {\n ServerOptions,\n ChatRequest,\n ToolExecuteRequest,\n CreateConversationRequest,\n UpdateConversationRequest,\n HandoffRequest,\n} from \"./types.js\";\n\nconst log = createLogger(\"server\");\n\nexport interface ServerDependencies {\n db: Database.Database;\n config: any;\n registry: ProviderRegistry;\n router: BrainstormRouter;\n costTracker: CostTracker;\n tools: ToolRegistry;\n godmode: GodModeConnectionResult;\n memoryManager?: MemoryManager;\n version?: string;\n}\n\nexport class BrainstormServer {\n private server: Server | null = null;\n private deps: ServerDependencies;\n private opts: Required<ServerOptions>;\n private conversationManager: ConversationManager | null = null;\n /**\n * Dev-mode auth token. Generated at server start when `jwtSecret` is\n * empty AND the bind is loopback. Written to ~/.brainstorm/server-token\n * with 0600 perms so only the SAME-UID process can read it; required\n * on every /api/* request (Authorization: Bearer <token>).\n *\n * v16 Attacker (PR #325 round) finding: previously, dev mode let ANY\n * local process — possibly a different user or a sandboxed plugin —\n * hit /api/v1/changesets/:id/approve, /api/v1/memory, /api/v1/tools/\n * execute, /api/v1/chat with no auth. The dev token binds the\n * trust scope to \"processes that can read this file\" = same uid.\n *\n * Cleared on stop(). Production users with BRAINSTORM_JWT_SECRET set\n * never see this — it's strictly dev mode.\n */\n private devToken: string | null = null;\n private devTokenPath: string | null = null;\n\n constructor(deps: ServerDependencies, opts?: ServerOptions) {\n this.deps = deps;\n this.opts = {\n port: opts?.port ?? 8000,\n host: opts?.host ?? \"127.0.0.1\",\n cors: opts?.cors ?? false,\n allowedOrigins: opts?.allowedOrigins ?? [],\n jwtSecret: opts?.jwtSecret ?? \"\",\n projectPath: opts?.projectPath ?? process.cwd(),\n };\n\n if (deps.memoryManager) {\n this.conversationManager = new ConversationManager(\n deps.db,\n deps.memoryManager,\n );\n }\n }\n\n /**\n * Per-session loopback auth token. Written to disk with 0600 perms so\n * only same-uid processes can read it. Required on /api/* in dev mode.\n */\n private initDevToken(): void {\n const dir = join(\n process.env.BRAINSTORM_HOME ?? join(homedir(), \".brainstorm\"),\n );\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n const tokenPath = join(dir, \"server-token\");\n const token = randomBytes(32).toString(\"hex\");\n writeFileSync(tokenPath, token, { mode: 0o600 });\n chmodSync(tokenPath, 0o600);\n this.devToken = token;\n this.devTokenPath = tokenPath;\n }\n\n /** Constant-time check of supplied Bearer against the dev token. */\n private verifyDevToken(authHeader: string | undefined): boolean {\n if (!this.devToken || !authHeader) return false;\n const m = /^Bearer\\s+(.+)$/i.exec(authHeader.trim());\n if (!m) return false;\n const supplied = Buffer.from(m[1], \"utf8\");\n const expected = Buffer.from(this.devToken, \"utf8\");\n if (supplied.length !== expected.length) return false;\n return timingSafeEqual(supplied, expected);\n }\n\n /** Start the HTTP server. Returns a promise that resolves when listening. */\n async start(): Promise<{ url: string }> {\n const { port, host } = this.opts;\n\n // Security: refuse to start without auth on non-loopback interface.\n // POST /api/v1/god-mode/execute runs arbitrary operations on managed\n // infrastructure — exposing it without JWT auth is a critical\n // security violation.\n if (!this.opts.jwtSecret) {\n if (host !== \"127.0.0.1\" && host !== \"localhost\" && host !== \"::1\") {\n log.fatal(\n { host, port },\n \"REFUSING TO START — jwtSecret required for non-loopback bind. Set BRAINSTORM_JWT_SECRET or bind to 127.0.0.1.\",\n );\n process.exit(1);\n } else {\n // Loopback dev mode: still require a bearer token so a different\n // local user (or a sandboxed plugin under a different uid) can't\n // hit /api/*. Generate, write 0600, require on every /api/*\n // request via the existing auth gate.\n this.initDevToken();\n log.info(\n { tokenPath: this.devTokenPath },\n \"Running in dev mode (loopback only). Wrote per-session token to file — same-uid processes can read it for client auth.\",\n );\n }\n }\n\n this.server = createServer((req, res) => {\n this.handleRequest(req, res).catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n const status = (err as any)?.statusCode ?? 500;\n if (status >= 500) log.error({ err }, \"Unhandled request error\");\n this.errorResponse(res, status, msg);\n });\n });\n\n return new Promise((resolve) => {\n this.server!.listen(port, host, () => {\n const url = `http://${host}:${port}`;\n log.info({ url }, \"Brainstorm server started\");\n resolve({ url });\n });\n });\n }\n\n /** Stop the server gracefully. */\n async stop(): Promise<void> {\n // Delete the dev-mode token file on shutdown so a captured token\n // from a prior session can't be re-used against a new server.\n if (this.devTokenPath && existsSync(this.devTokenPath)) {\n try {\n unlinkSync(this.devTokenPath);\n } catch (err) {\n log.warn({ err }, \"Failed to delete dev token on shutdown\");\n }\n }\n this.devToken = null;\n this.devTokenPath = null;\n return new Promise((resolve) => {\n if (!this.server) return resolve();\n this.server.close(() => {\n log.info(\"Brainstorm server stopped\");\n this.server = null;\n resolve();\n });\n });\n }\n\n /** Get the underlying Node HTTP server (for testing or custom middleware). */\n getHttpServer(): Server | null {\n return this.server;\n }\n\n // ── Request Router ────────────────────────────────────────────────\n\n private async handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n // Stash the request on the response so helpers (json, corsHeaders,\n // errorResponse) can resolve the Origin without every call site having\n // to thread req through.\n (res as any)._brainstormReq = req;\n\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host}`);\n const path = url.pathname;\n const method = req.method ?? \"GET\";\n\n // CORS preflight\n if (method === \"OPTIONS\" && this.opts.cors) {\n res.writeHead(204, this.corsHeaders(req));\n res.end();\n return;\n }\n\n // Health (no auth)\n if (path === \"/health\" && method === \"GET\") {\n return this.handleHealth(res);\n }\n\n // Auth gate for /api/* routes\n if (path.startsWith(\"/api/\")) {\n const isLoopback =\n this.opts.host === \"127.0.0.1\" ||\n this.opts.host === \"localhost\" ||\n this.opts.host === \"::1\";\n\n if (this.opts.jwtSecret) {\n const authResult = await this.checkAuth(req);\n if (!authResult.ok) {\n return this.errorResponse(res, 401, authResult.error);\n }\n // Store authenticated identity for downstream handlers\n (req as any)._authPayload = authResult.ok\n ? (authResult as any).payload\n : undefined;\n } else if (!isLoopback) {\n // Refuse unauthenticated access on non-loopback interfaces\n return this.errorResponse(\n res,\n 401,\n \"Authentication required — set SUPABASE_JWT_SECRET\",\n );\n } else {\n // Dev mode (loopback, no jwtSecret): require the per-session\n // bearer token. Closes the v16 Attacker confused-deputy: a\n // sandboxed plugin or different-uid local process can no longer\n // hit /api/* just because it has loopback access.\n if (!this.verifyDevToken(req.headers.authorization as string)) {\n return this.errorResponse(\n res,\n 401,\n `Dev-mode token required. Read it from ${this.devTokenPath ?? \"~/.brainstorm/server-token\"} and send as 'Authorization: Bearer <token>'.`,\n );\n }\n }\n }\n\n // ── God Mode routes ───────────────────────────────────────────\n if (path === \"/api/v1/products\" && method === \"GET\")\n return this.handleProducts(res);\n if (path === \"/api/v1/tools\" && method === \"GET\")\n return this.handleTools(res);\n if (path === \"/api/v1/tools/execute\" && method === \"POST\")\n return this.handleToolExecute(req, res);\n if (path === \"/api/v1/changesets\" && method === \"GET\")\n return this.handleChangesets(res);\n\n const approveMatch = path.match(\n /^\\/api\\/v1\\/changesets\\/([^/]+)\\/approve$/,\n );\n if (approveMatch && method === \"POST\")\n return this.handleChangesetApprove(approveMatch[1], req, res);\n\n const rejectMatch = path.match(/^\\/api\\/v1\\/changesets\\/([^/]+)\\/reject$/);\n if (rejectMatch && method === \"POST\")\n return this.handleChangesetReject(rejectMatch[1], res);\n\n if (path === \"/api/v1/audit\" && method === \"GET\")\n return this.handleAudit(url, res);\n if (path === \"/api/v1/audit/changesets\" && method === \"GET\")\n return this.handleAuditChangesets(url, res);\n if (path === \"/api/v1/platform/events\" && method === \"POST\")\n return this.handlePlatformEvents(req, res);\n\n // ── Chat routes ───────────────────────────────────────────────\n if (path === \"/api/v1/chat\" && method === \"POST\")\n return this.handleChat(req, res);\n if (path === \"/api/v1/chat/stream\" && method === \"POST\")\n return this.handleChatStream(req, res);\n\n // ── Conversation routes ───────────────────────────────────────\n if (path === \"/api/v1/conversations\" && method === \"GET\")\n return this.handleListConversations(url, res);\n if (path === \"/api/v1/conversations\" && method === \"POST\")\n return this.handleCreateConversation(req, res);\n\n const convMatch = path.match(/^\\/api\\/v1\\/conversations\\/([^/]+)$/);\n if (convMatch && method === \"GET\")\n return this.handleGetConversation(convMatch[1], res);\n if (convMatch && method === \"PATCH\")\n return this.handleUpdateConversation(convMatch[1], req, res);\n if (convMatch && method === \"DELETE\")\n return this.handleDeleteConversation(convMatch[1], res);\n\n const forkMatch = path.match(/^\\/api\\/v1\\/conversations\\/([^/]+)\\/fork$/);\n if (forkMatch && method === \"POST\")\n return this.handleForkConversation(forkMatch[1], req, res);\n\n const handoffMatch = path.match(\n /^\\/api\\/v1\\/conversations\\/([^/]+)\\/handoff$/,\n );\n if (handoffMatch && method === \"POST\")\n return this.handleHandoff(handoffMatch[1], req, res);\n\n const sessionsMatch = path.match(\n /^\\/api\\/v1\\/conversations\\/([^/]+)\\/sessions$/,\n );\n if (sessionsMatch && method === \"GET\")\n return this.handleConversationSessions(sessionsMatch[1], res);\n\n // ── Memory routes ──────────────────────────────────────────────\n if (path === \"/api/v1/memory\" && method === \"GET\")\n return this.handleListMemory(res);\n if (path === \"/api/v1/memory\" && method === \"POST\")\n return this.handleCreateMemory(req, res);\n const memoryMatch = path.match(/^\\/api\\/v1\\/memory\\/([^/]+)$/);\n if (memoryMatch && method === \"PATCH\")\n return this.handleUpdateMemory(memoryMatch[1], req, res);\n if (memoryMatch && method === \"DELETE\")\n return this.handleDeleteMemory(memoryMatch[1], res);\n if (path === \"/api/v1/memory/dream\" && method === \"POST\")\n return this.handleDreamCycle(res);\n\n // ── Skills routes ────────────────────────────────────────────\n if (path === \"/api/v1/skills\" && method === \"GET\")\n return this.handleListSkills(res);\n\n // ── Models route ─────────────────────────────────────────────\n if (path === \"/api/v1/models\" && method === \"GET\")\n return this.handleListModels(res);\n\n // ── Security route ───────────────────────────────────────────\n if (path === \"/api/v1/security/red-team\" && method === \"POST\")\n return this.handleRedTeam(req, res);\n\n // 404\n this.errorResponse(res, 404, `Not found: ${method} ${path}`);\n }\n\n // ── Health ────────────────────────────────────────────────────────\n\n private handleHealth(res: ServerResponse): void {\n let activeConvs = 0;\n try {\n const row = this.deps.db\n .prepare(\n \"SELECT COUNT(*) as cnt FROM conversations WHERE is_archived = 0\",\n )\n .get() as any;\n activeConvs = row?.cnt ?? 0;\n } catch {\n // conversations table may not exist yet\n }\n\n this.json(res, 200, {\n status: \"healthy\",\n version: this.deps.version ?? \"0.13.0\",\n uptime_seconds: Math.floor(process.uptime()),\n god_mode: {\n connected: this.deps.godmode.connectedSystems.length,\n tools: this.deps.godmode.totalTools,\n },\n conversations: { active: activeConvs },\n });\n }\n\n // ── Products ──────────────────────────────────────────────────────\n\n private handleProducts(res: ServerResponse): void {\n const products = this.deps.godmode.connectedSystems.map((sys) => ({\n product: sys.name,\n display_name: sys.displayName,\n status: \"healthy\" as const,\n latency_ms: sys.latencyMs,\n tool_count: sys.toolCount,\n capabilities: sys.capabilities,\n last_checked: new Date().toISOString(),\n }));\n this.json(res, 200, this.envelope(products));\n }\n\n // ── Tools ─────────────────────────────────────────────────────────\n\n private handleTools(res: ServerResponse): void {\n this.json(res, 200, this.envelope(this.deps.tools.listTools()));\n }\n\n /** Tools that require explicit confirmation cannot be called via REST API. */\n private static readonly BLOCKED_TOOL_PERMISSIONS = new Set([\n \"confirm\",\n \"deny\",\n ]);\n\n private async handleToolExecute(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const body = await this.readBody<ToolExecuteRequest>(req);\n if (!body.tool) {\n return this.errorResponse(res, 400, \"Missing 'tool' field\");\n }\n\n const tool = this.deps.tools.get(body.tool);\n if (!tool) {\n return this.errorResponse(res, 404, `Tool '${body.tool}' not found`);\n }\n\n // Enforce tool permission level — only \"auto\" tools can be called via API.\n // \"confirm\" tools (shell, file_write, git_commit) require interactive approval.\n if (BrainstormServer.BLOCKED_TOOL_PERMISSIONS.has(tool.permission)) {\n return this.errorResponse(\n res,\n 403,\n `Tool '${body.tool}' requires '${tool.permission}' permission — use the agent loop instead`,\n );\n }\n\n try {\n const result = await tool.execute(body.params ?? {});\n this.json(\n res,\n 200,\n this.envelope({\n tool: body.tool,\n result,\n executed_at: new Date().toISOString(),\n }),\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.errorResponse(res, 500, `Tool execution failed: ${msg}`);\n }\n }\n\n // ── ChangeSets ────────────────────────────────────────────────────\n\n private async handleChangesets(res: ServerResponse): Promise<void> {\n const { listChangeSets } = await import(\"@brainst0rm/godmode\");\n this.json(res, 200, this.envelope(listChangeSets()));\n }\n\n private async handleChangesetApprove(\n id: string,\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const { approveChangeSet } = await import(\"@brainst0rm/godmode\");\n // Use authenticated identity from JWT, fall back to \"user\" for dev mode\n const authPayload = (req as any)._authPayload;\n const approver = authPayload?.email ?? authPayload?.sub ?? \"user\";\n const result = await approveChangeSet(id, approver);\n this.json(res, result.success ? 200 : 400, this.envelope(result));\n }\n\n private async handleChangesetReject(\n id: string,\n res: ServerResponse,\n ): Promise<void> {\n const { rejectChangeSet } = await import(\"@brainst0rm/godmode\");\n const result = rejectChangeSet(id);\n this.json(res, result.success ? 200 : 400, this.envelope(result));\n }\n\n // ── Audit ─────────────────────────────────────────────────────────\n\n private handleAudit(url: URL, res: ServerResponse): void {\n const limit = this.safeInt(url.searchParams.get(\"limit\"), 50);\n const offset = this.safeInt(url.searchParams.get(\"offset\"), 0);\n try {\n const rows = this.deps.db\n .prepare(\n \"SELECT * FROM audit_log ORDER BY created_at DESC LIMIT ? OFFSET ?\",\n )\n .all(limit, offset);\n this.json(res, 200, this.envelope({ entries: rows, limit, offset }));\n } catch {\n this.json(res, 200, this.envelope({ entries: [], limit, offset }));\n }\n }\n\n private async handleAuditChangesets(\n url: URL,\n res: ServerResponse,\n ): Promise<void> {\n const { ChangeSetLogRepository } = await import(\"@brainst0rm/db\");\n const csLog = new ChangeSetLogRepository(this.deps.db);\n const limit = this.safeInt(url.searchParams.get(\"limit\"), 50);\n const offset = this.safeInt(url.searchParams.get(\"offset\"), 0);\n const connector = url.searchParams.get(\"connector\");\n const entries = connector\n ? csLog.byConnector(connector, limit)\n : csLog.recent(limit, offset);\n this.json(\n res,\n 200,\n this.envelope({ entries, total: csLog.count(), limit, offset }),\n );\n }\n\n // ── Platform Events ───────────────────────────────────────────────\n\n private async handlePlatformEvents(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const body = await this.readBody(req);\n const masterSecret = process.env.BRAINSTORM_PLATFORM_SECRET;\n\n if (!masterSecret) {\n return this.errorResponse(res, 503, \"Platform secret not configured\");\n }\n\n const { verifyEvent } = await import(\"@brainst0rm/godmode\");\n if (!verifyEvent(body, masterSecret)) {\n return this.errorResponse(res, 401, \"Invalid event signature\");\n }\n\n log.info(\n { type: body.type, product: body.product, tenant: body.tenant_id },\n \"Platform event received\",\n );\n this.json(res, 200, this.envelope({ received: true, event_id: body.id }));\n }\n\n // ── Chat ──────────────────────────────────────────────────────────\n\n private async handleChat(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const body = await this.readBody<ChatRequest>(req);\n if (!body.message) {\n return this.errorResponse(res, 400, \"Missing 'message' field\");\n }\n\n const {\n session,\n systemPrompt,\n segments,\n conversationId,\n preferredModelId,\n } = this.prepareChat(body);\n\n const messages = [{ role: \"user\" as const, content: body.message }];\n let finalText = \"\";\n let totalCost = 0;\n\n // Abort the agent loop if the HTTP client disconnects — otherwise the\n // server keeps consuming LLM tokens (billed to the session) for a\n // response nobody will ever read.\n const abortController = new AbortController();\n const onClose = () => abortController.abort();\n req.on(\"close\", onClose);\n\n try {\n for await (const event of runAgentLoop(messages, {\n config: this.deps.config,\n registry: this.deps.registry,\n router: this.deps.router,\n costTracker: this.deps.costTracker,\n tools: this.deps.tools,\n sessionId: session.id,\n projectPath: this.opts.projectPath,\n systemPrompt,\n systemSegments: segments,\n permissionCheck: () => \"allow\" as const,\n middleware: createDefaultMiddlewarePipeline(this.opts.projectPath),\n preferredModelId,\n signal: abortController.signal,\n })) {\n if (event.type === \"text-delta\") finalText += event.delta;\n if (event.type === \"done\") totalCost = event.totalCost;\n }\n } finally {\n req.off(\"close\", onClose);\n }\n\n // If the client already disconnected we can skip writing a response,\n // but it's cheap and harmless in case they reconnected over keepalive.\n this.json(\n res,\n 200,\n this.envelope({\n response: finalText,\n session_id: session.id,\n conversation_id: conversationId,\n cost: totalCost,\n }),\n );\n }\n\n private async handleChatStream(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const body = await this.readBody<ChatRequest>(req);\n if (!body.message) {\n return this.errorResponse(res, 400, \"Missing 'message' field\");\n }\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...this.corsHeaders(req),\n });\n\n const {\n session,\n systemPrompt,\n segments,\n conversationId,\n preferredModelId,\n } = this.prepareChat(body);\n\n // Send session info first\n res.write(\n `data: ${JSON.stringify({ type: \"session\", sessionId: session.id, conversationId })}\\n\\n`,\n );\n\n const messages = [{ role: \"user\" as const, content: body.message }];\n\n // Abort the agent loop if the SSE client disconnects. Without this, a\n // client that opens /chat/stream and drops the socket lets the server\n // keep pulling tokens from the LLM — billable work with no reader,\n // trivial cost-exhaustion vector for any connecting client.\n const abortController = new AbortController();\n const onClose = () => abortController.abort();\n req.on(\"close\", onClose);\n\n try {\n for await (const event of runAgentLoop(messages, {\n config: this.deps.config,\n registry: this.deps.registry,\n router: this.deps.router,\n costTracker: this.deps.costTracker,\n tools: this.deps.tools,\n sessionId: session.id,\n projectPath: this.opts.projectPath,\n systemPrompt,\n systemSegments: segments,\n permissionCheck: () => \"allow\" as const,\n middleware: createDefaultMiddlewarePipeline(this.opts.projectPath),\n preferredModelId,\n signal: abortController.signal,\n })) {\n res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n if (event.type === \"done\" || event.type === \"error\") break;\n }\n } finally {\n req.off(\"close\", onClose);\n }\n\n if (!res.writableEnded) {\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n }\n }\n\n // ── Conversations ─────────────────────────────────────────────────\n\n private handleListConversations(url: URL, res: ServerResponse): void {\n if (!this.conversationManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const projectPath = url.searchParams.get(\"project\") ?? undefined;\n const includeArchived = url.searchParams.get(\"archived\") === \"true\";\n const limit = this.safeInt(url.searchParams.get(\"limit\"), 50);\n const convs = this.conversationManager.list(projectPath, {\n includeArchived,\n limit,\n });\n this.json(res, 200, this.envelope(convs));\n }\n\n private async handleCreateConversation(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!this.conversationManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const body = await this.readBody<CreateConversationRequest>(req);\n const conv = this.conversationManager.create(this.opts.projectPath, body);\n this.json(res, 201, this.envelope(conv));\n }\n\n private handleGetConversation(id: string, res: ServerResponse): void {\n if (!this.conversationManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const conv = this.conversationManager.get(id);\n if (!conv) return this.errorResponse(res, 404, \"Conversation not found\");\n\n const context = this.conversationManager.getContext(id);\n this.json(\n res,\n 200,\n this.envelope({\n ...conv,\n totalCost: this.conversationManager.getTotalCost(id),\n totalMessages: this.conversationManager.getTotalMessages(id),\n effectiveModel: context?.effectiveModel ?? null,\n }),\n );\n }\n\n private async handleUpdateConversation(\n id: string,\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!this.conversationManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const body = await this.readBody<UpdateConversationRequest>(req);\n const conv = this.conversationManager.update(id, body);\n if (!conv) return this.errorResponse(res, 404, \"Conversation not found\");\n this.json(res, 200, this.envelope(conv));\n }\n\n private handleDeleteConversation(id: string, res: ServerResponse): void {\n if (!this.conversationManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const deleted = this.conversationManager.delete(id);\n if (!deleted) return this.errorResponse(res, 404, \"Conversation not found\");\n this.json(res, 200, this.envelope({ deleted: true }));\n }\n\n private async handleForkConversation(\n id: string,\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!this.conversationManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const body = await this.readBody<{ name?: string }>(req);\n const forked = this.conversationManager.fork(id, body.name);\n if (!forked) return this.errorResponse(res, 404, \"Conversation not found\");\n this.json(res, 201, this.envelope(forked));\n }\n\n private async handleHandoff(\n id: string,\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!this.conversationManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const body = await this.readBody<HandoffRequest>(req);\n if (!body.modelId) {\n return this.errorResponse(res, 400, \"Missing 'modelId' field\");\n }\n const conv = this.conversationManager.handoff(id, body.modelId);\n if (!conv) return this.errorResponse(res, 404, \"Conversation not found\");\n this.json(res, 200, this.envelope(conv));\n }\n\n private handleConversationSessions(id: string, res: ServerResponse): void {\n if (!this.conversationManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const conv = this.conversationManager.get(id);\n if (!conv) return this.errorResponse(res, 404, \"Conversation not found\");\n const sessions = this.conversationManager.getSessions(id);\n this.json(res, 200, this.envelope(sessions));\n }\n\n // ── Memory ────────────────────────────────────────────────────────\n\n private handleListMemory(res: ServerResponse): void {\n if (!this.deps.memoryManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const entries = this.deps.memoryManager.list();\n this.json(res, 200, this.envelope(entries));\n }\n\n private async handleCreateMemory(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!this.deps.memoryManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const body = await this.readBody<{\n name: string;\n content: string;\n type?: string;\n tier?: string;\n source?: string;\n }>(req);\n if (!body.name || !body.content) {\n return this.errorResponse(res, 400, \"name and content required\");\n }\n const entry = this.deps.memoryManager.save({\n name: body.name,\n description: body.name,\n type: (body.type as any) ?? \"project\",\n content: body.content,\n source: (body.source as any) ?? \"user_input\",\n trustScore: 1.0,\n });\n this.json(res, 201, this.envelope(entry));\n }\n\n private async handleUpdateMemory(\n id: string,\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!this.deps.memoryManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n const body = await this.readBody<{\n content?: string;\n tier?: string;\n }>(req);\n try {\n if (body.tier === \"system\") {\n this.deps.memoryManager.promote(id);\n } else if (body.tier === \"quarantine\") {\n this.deps.memoryManager.quarantine(id);\n } else if (body.tier === \"archive\") {\n this.deps.memoryManager.demote(id);\n }\n this.json(res, 200, this.envelope({ updated: true, id }));\n } catch (err: any) {\n this.errorResponse(res, 404, err.message ?? \"Entry not found\");\n }\n }\n\n private handleDeleteMemory(id: string, res: ServerResponse): void {\n if (!this.deps.memoryManager) {\n return this.errorResponse(res, 503, \"Memory manager not configured\");\n }\n try {\n this.deps.memoryManager.delete(id);\n this.json(res, 200, this.envelope({ deleted: true, id }));\n } catch (err: any) {\n this.errorResponse(res, 404, err.message ?? \"Entry not found\");\n }\n }\n\n private handleDreamCycle(res: ServerResponse): void {\n // Dream cycle requires infrastructure not available via HTTP\n // Return accepted status — the CLI or desktop app triggers it directly\n this.json(\n res,\n 202,\n this.envelope({\n status: \"dream_acknowledged\",\n message:\n \"Dream cycle must be triggered from the CLI or desktop app directly\",\n }),\n );\n }\n\n // ── Skills ───────────────────────────────────────────────────────\n\n private handleListSkills(res: ServerResponse): void {\n import(\"@brainst0rm/core\").then(({ loadSkills }) => {\n try {\n const skills = loadSkills(this.opts.projectPath);\n const list = skills.map((s) => ({\n name: s.name,\n description: s.description ?? \"\",\n source: s.source ?? \"builtin\",\n content: s.content.slice(0, 500),\n }));\n this.json(res, 200, this.envelope(list));\n } catch {\n this.json(res, 200, this.envelope([]));\n }\n });\n }\n\n // ── Models ───────────────────────────────────────────────────────\n\n private handleListModels(res: ServerResponse): void {\n const models = this.deps.registry.models.map((m) => ({\n id: m.id,\n name: m.name,\n provider: m.provider,\n status: m.status,\n pricing: m.pricing,\n capabilities: m.capabilities,\n }));\n this.json(res, 200, this.envelope(models));\n }\n\n // ── Security ─────────────────────────────────────────────────────\n\n private async handleRedTeam(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n const body = await this.readBody<{\n generations?: number;\n populationSize?: number;\n }>(req);\n\n try {\n const { runRedTeamSimulation, createDefaultMiddlewarePipeline } =\n await import(\"@brainst0rm/core\");\n const pipeline = createDefaultMiddlewarePipeline(this.opts.projectPath);\n const scorecard = runRedTeamSimulation(pipeline, {\n generations: body.generations ?? 5,\n populationSize: body.populationSize ?? 30,\n });\n this.json(res, 200, this.envelope(scorecard));\n } catch (err: any) {\n this.errorResponse(res, 500, err.message ?? \"Red team simulation failed\");\n }\n }\n\n // ── Chat Helpers ──────────────────────────────────────────────────\n\n private prepareChat(body: ChatRequest): {\n session: import(\"@brainst0rm/shared\").Session;\n systemPrompt: string;\n segments: import(\"@brainst0rm/core\").SystemPromptSegment[];\n conversationId?: string;\n preferredModelId?: string;\n } {\n const sessionManager = new SessionManager(this.deps.db);\n const { prompt: sysPrompt, segments } = buildSystemPrompt(\n this.opts.projectPath,\n );\n const gmPromptText = this.deps.godmode.promptSegment?.text ?? \"\";\n let systemPrompt = sysPrompt + gmPromptText;\n let preferredModelId = body.modelId;\n\n let session: import(\"@brainst0rm/shared\").Session;\n let conversationId = body.conversationId;\n\n // If conversation specified, use its context\n if (conversationId && this.conversationManager) {\n const ctx = this.conversationManager.getContext(conversationId);\n if (ctx) {\n // Inject conversation memory context\n const memCtx =\n this.conversationManager.getContextString(conversationId);\n if (memCtx) systemPrompt += `\\n\\n${memCtx}`;\n\n // Use conversation's model override if no explicit model requested\n if (ctx.effectiveModel && !preferredModelId) {\n preferredModelId = ctx.effectiveModel;\n }\n }\n\n // Start a new session within the conversation\n const result = this.conversationManager.startSession(conversationId);\n if (result) {\n session = result.session;\n } else {\n session = sessionManager.start(this.opts.projectPath);\n }\n } else if (body.sessionId) {\n // Resume existing session\n const existing = sessionManager.resume(body.sessionId);\n session = existing ?? sessionManager.start(this.opts.projectPath);\n } else {\n // New standalone session\n session = sessionManager.start(this.opts.projectPath);\n\n // Auto-create a conversation if memory manager is available\n if (this.conversationManager) {\n const conv = this.conversationManager.create(this.opts.projectPath, {\n name: body.message.slice(0, 60),\n });\n conversationId = conv.id;\n // Use the manager's startSession path (handles linkSession + touchLastMessage)\n const result = this.conversationManager.startSession(conv.id);\n if (result) {\n session = result.session;\n }\n }\n }\n\n return {\n session,\n systemPrompt,\n segments,\n conversationId,\n preferredModelId,\n };\n }\n\n // ── Auth ──────────────────────────────────────────────────────────\n\n private async checkAuth(req: IncomingMessage): Promise<\n | {\n ok: true;\n payload?: { sub?: string; email?: string; platform_role?: string };\n }\n | { ok: false; error: string }\n > {\n const { verifyJWT, extractBearerToken } =\n await import(\"@brainst0rm/godmode\");\n const token = extractBearerToken(\n req.headers.authorization as string | undefined,\n );\n if (!token) return { ok: false, error: \"Missing Authorization header\" };\n\n const auth = verifyJWT(token, this.opts.jwtSecret);\n if (!auth.authenticated)\n return { ok: false, error: auth.error ?? \"Authentication failed\" };\n\n return { ok: true, payload: auth.payload };\n }\n\n // ── HTTP Helpers ──────────────────────────────────────────────────\n\n private json(res: ServerResponse, status: number, body: unknown): void {\n const payload = JSON.stringify(body);\n const req = (res as any)._brainstormReq as IncomingMessage | undefined;\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n ...this.corsHeaders(req),\n });\n res.end(payload);\n }\n\n private envelope<T>(data: T) {\n return {\n ok: true as const,\n data,\n request_id: randomUUID(),\n timestamp: new Date().toISOString(),\n };\n }\n\n private errorResponse(\n res: ServerResponse,\n status: number,\n message: string,\n ): void {\n this.json(res, status, {\n ok: false,\n error: message,\n request_id: randomUUID(),\n timestamp: new Date().toISOString(),\n });\n }\n\n private async readBody<T = any>(req: IncomingMessage): Promise<T> {\n const MAX_BODY_BYTES = 10 * 1024 * 1024; // 10 MB hard cap\n const declared = Number(req.headers[\"content-length\"] ?? 0);\n if (Number.isFinite(declared) && declared > MAX_BODY_BYTES) {\n throw Object.assign(new Error(\"Request body too large\"), {\n statusCode: 413,\n });\n }\n const chunks: Buffer[] = [];\n let received = 0;\n for await (const chunk of req) {\n const buf = chunk as Buffer;\n received += buf.length;\n if (received > MAX_BODY_BYTES) {\n req.destroy();\n throw Object.assign(new Error(\"Request body too large\"), {\n statusCode: 413,\n });\n }\n chunks.push(buf);\n }\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n try {\n return JSON.parse(raw);\n } catch {\n throw Object.assign(new Error(\"Invalid JSON body\"), { statusCode: 400 });\n }\n }\n\n /** Parse an integer from a query param, falling back to a default on NaN. */\n private safeInt(value: string | null, fallback: number): number {\n if (!value) return fallback;\n const n = parseInt(value, 10);\n return Number.isFinite(n) ? n : fallback;\n }\n\n /**\n * Build CORS headers for a request. Only reflects the request Origin when\n * it appears in the configured allowlist. Emitting `*` on a credentialed\n * API would let any origin exfiltrate authenticated SSE responses.\n */\n private corsHeaders(req?: IncomingMessage): Record<string, string> {\n const origin = this.resolveAllowedOrigin(req);\n if (!origin) return {};\n return {\n \"Access-Control-Allow-Origin\": origin,\n \"Access-Control-Allow-Credentials\": \"true\",\n Vary: \"Origin\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PATCH, DELETE, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Authorization\",\n \"Access-Control-Max-Age\": \"86400\",\n };\n }\n\n private resolveAllowedOrigin(req?: IncomingMessage): string | null {\n if (!this.opts.cors) return null;\n const origin = req?.headers.origin;\n if (!origin || typeof origin !== \"string\") return null;\n return this.opts.allowedOrigins.includes(origin) ? origin : null;\n }\n}\n","/**\n * BrainstormClient — typed HTTP+SSE client for brainstorm server.\n *\n * Used by:\n * - CLI (`brainstorm chat` when connecting to a running server)\n * - Web UI\n * - Other agents (agent-to-agent communication)\n * - MCP bridges\n *\n * Supports both request/response and streaming (SSE) patterns.\n */\n\nimport type {\n ApiEnvelope,\n ChatRequest,\n ChatResponse,\n CreateConversationRequest,\n UpdateConversationRequest,\n HandoffRequest,\n HealthResponse,\n ToolExecuteRequest,\n ToolExecuteResponse,\n} from \"./types.js\";\nimport type { Conversation } from \"@brainst0rm/db\";\n\nexport interface ClientOptions {\n /** Base URL of the brainstorm server (e.g. \"http://localhost:8000\"). */\n baseUrl: string;\n /** JWT token for authenticated requests. */\n token?: string;\n /** Request timeout in ms. Default: 120000. */\n timeout?: number;\n}\n\nexport class BrainstormClient {\n private baseUrl: string;\n private token: string | null;\n private timeout: number;\n\n constructor(opts: ClientOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/$/, \"\");\n this.token = opts.token ?? null;\n this.timeout = opts.timeout ?? 120_000;\n }\n\n // ── Health ────────────────────────────────────────────────────────\n\n async health(): Promise<HealthResponse> {\n return this.get(\"/health\");\n }\n\n // ── Chat ──────────────────────────────────────────────────────────\n\n /** Send a chat message and get a complete response. */\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const envelope = await this.post<ApiEnvelope<ChatResponse>>(\n \"/api/v1/chat\",\n request,\n );\n return envelope.data;\n }\n\n /**\n * Send a chat message and stream events via SSE.\n * Yields parsed AgentEvent objects from the server.\n */\n async *chatStream(\n request: ChatRequest,\n ): AsyncGenerator<Record<string, unknown>> {\n const response = await this.fetchRaw(\"/api/v1/chat/stream\", {\n method: \"POST\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Chat stream failed (${response.status}): ${text}`);\n }\n\n if (!response.body) throw new Error(\"No response body for SSE stream\");\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") return;\n\n try {\n yield JSON.parse(data);\n } catch {\n // Skip malformed JSON lines\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // ── Tools ─────────────────────────────────────────────────────────\n\n /** List all available tools. */\n async listTools(): Promise<unknown[]> {\n const envelope = await this.get<ApiEnvelope<unknown[]>>(\"/api/v1/tools\");\n return envelope.data;\n }\n\n /** Execute a tool directly. */\n async executeTool(request: ToolExecuteRequest): Promise<ToolExecuteResponse> {\n const envelope = await this.post<ApiEnvelope<ToolExecuteResponse>>(\n \"/api/v1/tools/execute\",\n request,\n );\n return envelope.data;\n }\n\n // ── Products ──────────────────────────────────────────────────────\n\n async listProducts(): Promise<unknown[]> {\n const envelope = await this.get<ApiEnvelope<unknown[]>>(\"/api/v1/products\");\n return envelope.data;\n }\n\n // ── ChangeSets ────────────────────────────────────────────────────\n\n async listChangeSets(): Promise<unknown[]> {\n const envelope =\n await this.get<ApiEnvelope<unknown[]>>(\"/api/v1/changesets\");\n return envelope.data;\n }\n\n async approveChangeSet(id: string): Promise<unknown> {\n const envelope = await this.post<ApiEnvelope<unknown>>(\n `/api/v1/changesets/${id}/approve`,\n {},\n );\n return envelope.data;\n }\n\n async rejectChangeSet(id: string): Promise<unknown> {\n const envelope = await this.post<ApiEnvelope<unknown>>(\n `/api/v1/changesets/${id}/reject`,\n {},\n );\n return envelope.data;\n }\n\n // ── Conversations ─────────────────────────────────────────────────\n\n /** List conversations, optionally filtered by project. */\n async listConversations(opts?: {\n project?: string;\n archived?: boolean;\n limit?: number;\n }): Promise<Conversation[]> {\n const params = new URLSearchParams();\n if (opts?.project) params.set(\"project\", opts.project);\n if (opts?.archived) params.set(\"archived\", \"true\");\n if (opts?.limit) params.set(\"limit\", String(opts.limit));\n const qs = params.toString();\n const envelope = await this.get<ApiEnvelope<Conversation[]>>(\n `/api/v1/conversations${qs ? `?${qs}` : \"\"}`,\n );\n return envelope.data;\n }\n\n /** Create a new conversation. */\n async createConversation(\n request: CreateConversationRequest,\n ): Promise<Conversation> {\n const envelope = await this.post<ApiEnvelope<Conversation>>(\n \"/api/v1/conversations\",\n request,\n );\n return envelope.data;\n }\n\n /** Get a conversation by ID (includes cost/message totals). */\n async getConversation(\n id: string,\n ): Promise<Conversation & { totalCost: number; totalMessages: number }> {\n const envelope = await this.get<\n ApiEnvelope<Conversation & { totalCost: number; totalMessages: number }>\n >(`/api/v1/conversations/${id}`);\n return envelope.data;\n }\n\n /** Update a conversation. */\n async updateConversation(\n id: string,\n request: UpdateConversationRequest,\n ): Promise<Conversation> {\n const envelope = await this.fetchJson<ApiEnvelope<Conversation>>(\n `/api/v1/conversations/${id}`,\n { method: \"PATCH\", body: JSON.stringify(request) },\n );\n return envelope.data;\n }\n\n /** Delete a conversation. */\n async deleteConversation(id: string): Promise<void> {\n await this.fetchJson(`/api/v1/conversations/${id}`, {\n method: \"DELETE\",\n });\n }\n\n /** Fork a conversation. */\n async forkConversation(id: string, name?: string): Promise<Conversation> {\n const envelope = await this.post<ApiEnvelope<Conversation>>(\n `/api/v1/conversations/${id}/fork`,\n { name },\n );\n return envelope.data;\n }\n\n /** Handoff: switch a conversation to a different model. */\n async handoff(id: string, modelId: string): Promise<Conversation> {\n const envelope = await this.post<ApiEnvelope<Conversation>>(\n `/api/v1/conversations/${id}/handoff`,\n { modelId } satisfies HandoffRequest,\n );\n return envelope.data;\n }\n\n /** List sessions within a conversation. */\n async listConversationSessions(id: string): Promise<unknown[]> {\n const envelope = await this.get<ApiEnvelope<unknown[]>>(\n `/api/v1/conversations/${id}/sessions`,\n );\n return envelope.data;\n }\n\n // ── Chat within Conversation ──────────────────────────────────────\n\n /** Send a message within a conversation context. */\n async conversationChat(\n conversationId: string,\n message: string,\n opts?: { modelId?: string },\n ): Promise<ChatResponse> {\n return this.chat({\n message,\n conversationId,\n modelId: opts?.modelId,\n });\n }\n\n /** Stream a chat within a conversation. */\n async *conversationChatStream(\n conversationId: string,\n message: string,\n opts?: { modelId?: string },\n ): AsyncGenerator<Record<string, unknown>> {\n yield* this.chatStream({\n message,\n conversationId,\n modelId: opts?.modelId,\n });\n }\n\n // ── HTTP Layer ────────────────────────────────────────────────────\n\n private async get<T = any>(path: string): Promise<T> {\n return this.fetchJson(path, { method: \"GET\" });\n }\n\n private async post<T = any>(path: string, body: unknown): Promise<T> {\n return this.fetchJson(path, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n private async fetchJson<T = any>(\n path: string,\n init: RequestInit,\n ): Promise<T> {\n const response = await this.fetchRaw(path, init);\n const text = await response.text();\n\n if (!response.ok) {\n let errorMsg = `Request failed (${response.status})`;\n try {\n const parsed = JSON.parse(text);\n if (parsed.error) errorMsg = parsed.error;\n } catch {\n errorMsg = text || errorMsg;\n }\n throw new Error(errorMsg);\n }\n\n return JSON.parse(text);\n }\n\n private async fetchRaw(path: string, init: RequestInit): Promise<Response> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n return await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers: { ...headers, ...(init.headers as Record<string, string>) },\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n"],"mappings":"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","names":["createDefaultMiddlewarePipeline"]}
|
|
@@ -213,7 +213,7 @@ import {
|
|
|
213
213
|
validateToolContract,
|
|
214
214
|
wrapTaskWithSafetyPreamble,
|
|
215
215
|
writeStormFile
|
|
216
|
-
} from "./chunk-
|
|
216
|
+
} from "./chunk-HKRUCBMI.js";
|
|
217
217
|
import {
|
|
218
218
|
analyzeTrajectories,
|
|
219
219
|
loadRoutingIntelligence,
|
|
@@ -227,13 +227,13 @@ import {
|
|
|
227
227
|
trajectoryToSFTExamples
|
|
228
228
|
} from "./chunk-352O4VPK.js";
|
|
229
229
|
import "./chunk-ONBVQCTW.js";
|
|
230
|
-
import "./chunk-
|
|
230
|
+
import "./chunk-2AXI2OPK.js";
|
|
231
231
|
import "./chunk-TCFNCUKS.js";
|
|
232
232
|
import "./chunk-5EIUWLBS.js";
|
|
233
233
|
import "./chunk-WJSNOAGF.js";
|
|
234
234
|
import "./chunk-VHDE7O6Y.js";
|
|
235
235
|
import "./chunk-SBZAH54M.js";
|
|
236
|
-
import "./chunk-
|
|
236
|
+
import "./chunk-6WGHIUWX.js";
|
|
237
237
|
import "./chunk-QT7UUIL2.js";
|
|
238
238
|
import "./chunk-DW32AG7H.js";
|
|
239
239
|
import "./chunk-NHSYDOEK.js";
|
|
@@ -245,7 +245,7 @@ import "./chunk-AP3CWGS7.js";
|
|
|
245
245
|
import "./chunk-N3KOFRHK.js";
|
|
246
246
|
import "./chunk-RPHOZX72.js";
|
|
247
247
|
import "./chunk-BX6MV3E5.js";
|
|
248
|
-
import "./chunk-
|
|
248
|
+
import "./chunk-DJ7WG6GZ.js";
|
|
249
249
|
import "./chunk-KE4QKEOM.js";
|
|
250
250
|
import "./chunk-FYJECSUZ.js";
|
|
251
251
|
import "./chunk-PLDDJCW6.js";
|
|
@@ -473,4 +473,4 @@ export {
|
|
|
473
473
|
wrapTaskWithSafetyPreamble,
|
|
474
474
|
writeStormFile
|
|
475
475
|
};
|
|
476
|
-
//# sourceMappingURL=dist-
|
|
476
|
+
//# sourceMappingURL=dist-LCPM5BXN.js.map
|
|
@@ -12,17 +12,17 @@ import "./chunk-2NAD7GM6.js";
|
|
|
12
12
|
import "./chunk-XVKUVWWU.js";
|
|
13
13
|
import {
|
|
14
14
|
MemoryManager
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-N5V2PGPN.js";
|
|
16
16
|
import "./chunk-FRRVMDNL.js";
|
|
17
17
|
import "./chunk-CTEU5TQB.js";
|
|
18
18
|
import "./chunk-SSCKEV6Z.js";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-3AYD5ONW.js";
|
|
20
20
|
import "./chunk-2JGN7EGX.js";
|
|
21
21
|
import "./chunk-EEKSBGRM.js";
|
|
22
22
|
import "./chunk-WHP2HLMU.js";
|
|
23
23
|
import "./chunk-N43GBGXI.js";
|
|
24
24
|
import "./chunk-7B2QCIEV.js";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-CZILJ33T.js";
|
|
26
26
|
import "./chunk-NLLWNPII.js";
|
|
27
27
|
import "./chunk-D7KQXJJ7.js";
|
|
28
28
|
import "./chunk-DT4D3D4I.js";
|
|
@@ -34,7 +34,7 @@ import "./chunk-EHQ4RKTP.js";
|
|
|
34
34
|
import "./chunk-5TPIVYD3.js";
|
|
35
35
|
import "./chunk-J6ELXZTM.js";
|
|
36
36
|
import "./chunk-XKTCRSDK.js";
|
|
37
|
-
import "./chunk-
|
|
37
|
+
import "./chunk-52Q6CE4Y.js";
|
|
38
38
|
import {
|
|
39
39
|
createLogger
|
|
40
40
|
} from "./chunk-E7XO6BH5.js";
|
|
@@ -1841,4 +1841,4 @@ export {
|
|
|
1841
1841
|
runStaticAnalysis,
|
|
1842
1842
|
runVerification
|
|
1843
1843
|
};
|
|
1844
|
-
//# sourceMappingURL=dist-
|
|
1844
|
+
//# sourceMappingURL=dist-MKAADC4H.js.map
|
|
@@ -25,24 +25,24 @@ import {
|
|
|
25
25
|
scorePatch,
|
|
26
26
|
scoreProbe,
|
|
27
27
|
verifyTypeScriptCompiles
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-WRO5TVID.js";
|
|
29
29
|
import {
|
|
30
30
|
exportCapabilityScores,
|
|
31
31
|
getCapabilityScores,
|
|
32
32
|
loadAllCapabilityScores
|
|
33
33
|
} from "./chunk-JAM2AWOA.js";
|
|
34
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-N5V2PGPN.js";
|
|
35
35
|
import "./chunk-FRRVMDNL.js";
|
|
36
36
|
import "./chunk-CTEU5TQB.js";
|
|
37
37
|
import "./chunk-SSCKEV6Z.js";
|
|
38
|
-
import "./chunk-
|
|
38
|
+
import "./chunk-3AYD5ONW.js";
|
|
39
39
|
import "./chunk-2JGN7EGX.js";
|
|
40
40
|
import "./chunk-EEKSBGRM.js";
|
|
41
41
|
import "./chunk-WHP2HLMU.js";
|
|
42
42
|
import "./chunk-N43GBGXI.js";
|
|
43
43
|
import "./chunk-7B2QCIEV.js";
|
|
44
44
|
import "./chunk-5OQEC3FY.js";
|
|
45
|
-
import "./chunk-
|
|
45
|
+
import "./chunk-CZILJ33T.js";
|
|
46
46
|
import "./chunk-NLLWNPII.js";
|
|
47
47
|
import "./chunk-D7KQXJJ7.js";
|
|
48
48
|
import "./chunk-DT4D3D4I.js";
|
|
@@ -54,7 +54,7 @@ import "./chunk-EHQ4RKTP.js";
|
|
|
54
54
|
import "./chunk-5TPIVYD3.js";
|
|
55
55
|
import "./chunk-J6ELXZTM.js";
|
|
56
56
|
import "./chunk-XKTCRSDK.js";
|
|
57
|
-
import "./chunk-
|
|
57
|
+
import "./chunk-52Q6CE4Y.js";
|
|
58
58
|
import "./chunk-E7XO6BH5.js";
|
|
59
59
|
import "./chunk-SQAR52C3.js";
|
|
60
60
|
import "./chunk-RBN7ACDW.js";
|
|
@@ -86,4 +86,4 @@ export {
|
|
|
86
86
|
scoreProbe,
|
|
87
87
|
verifyTypeScriptCompiles
|
|
88
88
|
};
|
|
89
|
-
//# sourceMappingURL=dist-
|
|
89
|
+
//# sourceMappingURL=dist-NQQPQGZU.js.map
|
|
@@ -216,7 +216,7 @@ import {
|
|
|
216
216
|
validateToolContract,
|
|
217
217
|
wrapTaskWithSafetyPreamble,
|
|
218
218
|
writeStormFile
|
|
219
|
-
} from "./chunk-
|
|
219
|
+
} from "./chunk-N5V2PGPN.js";
|
|
220
220
|
import {
|
|
221
221
|
analyzeTrajectories,
|
|
222
222
|
loadRoutingIntelligence,
|
|
@@ -230,13 +230,13 @@ import {
|
|
|
230
230
|
trajectoryToSFTExamples
|
|
231
231
|
} from "./chunk-CTEU5TQB.js";
|
|
232
232
|
import "./chunk-SSCKEV6Z.js";
|
|
233
|
-
import "./chunk-
|
|
233
|
+
import "./chunk-3AYD5ONW.js";
|
|
234
234
|
import "./chunk-2JGN7EGX.js";
|
|
235
235
|
import "./chunk-EEKSBGRM.js";
|
|
236
236
|
import "./chunk-WHP2HLMU.js";
|
|
237
237
|
import "./chunk-N43GBGXI.js";
|
|
238
238
|
import "./chunk-7B2QCIEV.js";
|
|
239
|
-
import "./chunk-
|
|
239
|
+
import "./chunk-CZILJ33T.js";
|
|
240
240
|
import "./chunk-NLLWNPII.js";
|
|
241
241
|
import "./chunk-D7KQXJJ7.js";
|
|
242
242
|
import "./chunk-DT4D3D4I.js";
|
|
@@ -248,7 +248,7 @@ import "./chunk-EHQ4RKTP.js";
|
|
|
248
248
|
import "./chunk-5TPIVYD3.js";
|
|
249
249
|
import "./chunk-J6ELXZTM.js";
|
|
250
250
|
import "./chunk-XKTCRSDK.js";
|
|
251
|
-
import "./chunk-
|
|
251
|
+
import "./chunk-52Q6CE4Y.js";
|
|
252
252
|
import "./chunk-E7XO6BH5.js";
|
|
253
253
|
import "./chunk-SQAR52C3.js";
|
|
254
254
|
import "./chunk-RBN7ACDW.js";
|
|
@@ -476,4 +476,4 @@ export {
|
|
|
476
476
|
wrapTaskWithSafetyPreamble,
|
|
477
477
|
writeStormFile
|
|
478
478
|
};
|
|
479
|
-
//# sourceMappingURL=dist-
|
|
479
|
+
//# sourceMappingURL=dist-NTQ7LFRW.js.map
|
|
@@ -24,19 +24,19 @@ import {
|
|
|
24
24
|
validateGateCommand,
|
|
25
25
|
writeArtifact,
|
|
26
26
|
writeManifest
|
|
27
|
-
} from "./chunk-
|
|
28
|
-
import "./chunk-
|
|
27
|
+
} from "./chunk-Z5RDHTWQ.js";
|
|
28
|
+
import "./chunk-N5V2PGPN.js";
|
|
29
29
|
import "./chunk-FRRVMDNL.js";
|
|
30
30
|
import "./chunk-CTEU5TQB.js";
|
|
31
31
|
import "./chunk-SSCKEV6Z.js";
|
|
32
32
|
import "./chunk-CTFDTJMG.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-3AYD5ONW.js";
|
|
34
34
|
import "./chunk-2JGN7EGX.js";
|
|
35
35
|
import "./chunk-EEKSBGRM.js";
|
|
36
36
|
import "./chunk-WHP2HLMU.js";
|
|
37
37
|
import "./chunk-N43GBGXI.js";
|
|
38
38
|
import "./chunk-7B2QCIEV.js";
|
|
39
|
-
import "./chunk-
|
|
39
|
+
import "./chunk-CZILJ33T.js";
|
|
40
40
|
import "./chunk-NLLWNPII.js";
|
|
41
41
|
import "./chunk-D7KQXJJ7.js";
|
|
42
42
|
import "./chunk-DT4D3D4I.js";
|
|
@@ -48,7 +48,7 @@ import "./chunk-EHQ4RKTP.js";
|
|
|
48
48
|
import "./chunk-5TPIVYD3.js";
|
|
49
49
|
import "./chunk-J6ELXZTM.js";
|
|
50
50
|
import "./chunk-XKTCRSDK.js";
|
|
51
|
-
import "./chunk-
|
|
51
|
+
import "./chunk-52Q6CE4Y.js";
|
|
52
52
|
import "./chunk-E7XO6BH5.js";
|
|
53
53
|
import "./chunk-SQAR52C3.js";
|
|
54
54
|
import "./chunk-RBN7ACDW.js";
|
|
@@ -76,4 +76,4 @@ export {
|
|
|
76
76
|
writeArtifact,
|
|
77
77
|
writeManifest
|
|
78
78
|
};
|
|
79
|
-
//# sourceMappingURL=dist-
|
|
79
|
+
//# sourceMappingURL=dist-QFVAD45U.js.map
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
getDb,
|
|
24
24
|
getTestDb,
|
|
25
25
|
wireRoutingAudit
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-52Q6CE4Y.js";
|
|
27
27
|
import "./chunk-E7XO6BH5.js";
|
|
28
28
|
import "./chunk-SQAR52C3.js";
|
|
29
29
|
import "./chunk-RBN7ACDW.js";
|
|
@@ -50,4 +50,4 @@ export {
|
|
|
50
50
|
getTestDb,
|
|
51
51
|
wireRoutingAudit
|
|
52
52
|
};
|
|
53
|
-
//# sourceMappingURL=dist-
|
|
53
|
+
//# sourceMappingURL=dist-RUBJT7FI.js.map
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
getDb,
|
|
21
21
|
getTestDb,
|
|
22
22
|
wireRoutingAudit
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-DJ7WG6GZ.js";
|
|
24
24
|
import "./chunk-KE4QKEOM.js";
|
|
25
25
|
import "./chunk-FYJECSUZ.js";
|
|
26
26
|
import "./chunk-PLDDJCW6.js";
|
|
@@ -47,4 +47,4 @@ export {
|
|
|
47
47
|
getTestDb,
|
|
48
48
|
wireRoutingAudit
|
|
49
49
|
};
|
|
50
|
-
//# sourceMappingURL=dist-
|
|
50
|
+
//# sourceMappingURL=dist-S7FLVLXS.js.map
|