@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
|
@@ -4,17 +4,17 @@ import {
|
|
|
4
4
|
buildSystemPrompt,
|
|
5
5
|
createDefaultMiddlewarePipeline,
|
|
6
6
|
runAgentLoop
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-HKRUCBMI.js";
|
|
8
8
|
import "./chunk-HUR6VPUJ.js";
|
|
9
9
|
import "./chunk-352O4VPK.js";
|
|
10
10
|
import "./chunk-ONBVQCTW.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-2AXI2OPK.js";
|
|
12
12
|
import "./chunk-TCFNCUKS.js";
|
|
13
13
|
import "./chunk-5EIUWLBS.js";
|
|
14
14
|
import "./chunk-WJSNOAGF.js";
|
|
15
15
|
import "./chunk-VHDE7O6Y.js";
|
|
16
16
|
import "./chunk-SBZAH54M.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-6WGHIUWX.js";
|
|
18
18
|
import "./chunk-QT7UUIL2.js";
|
|
19
19
|
import "./chunk-DW32AG7H.js";
|
|
20
20
|
import "./chunk-NHSYDOEK.js";
|
|
@@ -26,7 +26,7 @@ import "./chunk-AP3CWGS7.js";
|
|
|
26
26
|
import "./chunk-N3KOFRHK.js";
|
|
27
27
|
import "./chunk-RPHOZX72.js";
|
|
28
28
|
import "./chunk-BX6MV3E5.js";
|
|
29
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-DJ7WG6GZ.js";
|
|
30
30
|
import {
|
|
31
31
|
createLogger
|
|
32
32
|
} from "./chunk-KE4QKEOM.js";
|
|
@@ -37,13 +37,39 @@ import "./chunk-PLDDJCW6.js";
|
|
|
37
37
|
import {
|
|
38
38
|
createServer
|
|
39
39
|
} from "http";
|
|
40
|
-
import { randomUUID } from "crypto";
|
|
40
|
+
import { randomBytes, randomUUID, timingSafeEqual } from "crypto";
|
|
41
|
+
import {
|
|
42
|
+
writeFileSync,
|
|
43
|
+
unlinkSync,
|
|
44
|
+
mkdirSync,
|
|
45
|
+
existsSync,
|
|
46
|
+
chmodSync
|
|
47
|
+
} from "fs";
|
|
48
|
+
import { homedir } from "os";
|
|
49
|
+
import { join } from "path";
|
|
41
50
|
var log = createLogger("server");
|
|
42
51
|
var BrainstormServer = class _BrainstormServer {
|
|
43
52
|
server = null;
|
|
44
53
|
deps;
|
|
45
54
|
opts;
|
|
46
55
|
conversationManager = null;
|
|
56
|
+
/**
|
|
57
|
+
* Dev-mode auth token. Generated at server start when `jwtSecret` is
|
|
58
|
+
* empty AND the bind is loopback. Written to ~/.brainstorm/server-token
|
|
59
|
+
* with 0600 perms so only the SAME-UID process can read it; required
|
|
60
|
+
* on every /api/* request (Authorization: Bearer <token>).
|
|
61
|
+
*
|
|
62
|
+
* v16 Attacker (PR #325 round) finding: previously, dev mode let ANY
|
|
63
|
+
* local process — possibly a different user or a sandboxed plugin —
|
|
64
|
+
* hit /api/v1/changesets/:id/approve, /api/v1/memory, /api/v1/tools/
|
|
65
|
+
* execute, /api/v1/chat with no auth. The dev token binds the
|
|
66
|
+
* trust scope to "processes that can read this file" = same uid.
|
|
67
|
+
*
|
|
68
|
+
* Cleared on stop(). Production users with BRAINSTORM_JWT_SECRET set
|
|
69
|
+
* never see this — it's strictly dev mode.
|
|
70
|
+
*/
|
|
71
|
+
devToken = null;
|
|
72
|
+
devTokenPath = null;
|
|
47
73
|
constructor(deps, opts) {
|
|
48
74
|
this.deps = deps;
|
|
49
75
|
this.opts = {
|
|
@@ -61,6 +87,32 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
61
87
|
);
|
|
62
88
|
}
|
|
63
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Per-session loopback auth token. Written to disk with 0600 perms so
|
|
92
|
+
* only same-uid processes can read it. Required on /api/* in dev mode.
|
|
93
|
+
*/
|
|
94
|
+
initDevToken() {
|
|
95
|
+
const dir = join(
|
|
96
|
+
process.env.BRAINSTORM_HOME ?? join(homedir(), ".brainstorm")
|
|
97
|
+
);
|
|
98
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
99
|
+
const tokenPath = join(dir, "server-token");
|
|
100
|
+
const token = randomBytes(32).toString("hex");
|
|
101
|
+
writeFileSync(tokenPath, token, { mode: 384 });
|
|
102
|
+
chmodSync(tokenPath, 384);
|
|
103
|
+
this.devToken = token;
|
|
104
|
+
this.devTokenPath = tokenPath;
|
|
105
|
+
}
|
|
106
|
+
/** Constant-time check of supplied Bearer against the dev token. */
|
|
107
|
+
verifyDevToken(authHeader) {
|
|
108
|
+
if (!this.devToken || !authHeader) return false;
|
|
109
|
+
const m = /^Bearer\s+(.+)$/i.exec(authHeader.trim());
|
|
110
|
+
if (!m) return false;
|
|
111
|
+
const supplied = Buffer.from(m[1], "utf8");
|
|
112
|
+
const expected = Buffer.from(this.devToken, "utf8");
|
|
113
|
+
if (supplied.length !== expected.length) return false;
|
|
114
|
+
return timingSafeEqual(supplied, expected);
|
|
115
|
+
}
|
|
64
116
|
/** Start the HTTP server. Returns a promise that resolves when listening. */
|
|
65
117
|
async start() {
|
|
66
118
|
const { port, host } = this.opts;
|
|
@@ -72,7 +124,11 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
72
124
|
);
|
|
73
125
|
process.exit(1);
|
|
74
126
|
} else {
|
|
75
|
-
|
|
127
|
+
this.initDevToken();
|
|
128
|
+
log.info(
|
|
129
|
+
{ tokenPath: this.devTokenPath },
|
|
130
|
+
"Running in dev mode (loopback only). Wrote per-session token to file \u2014 same-uid processes can read it for client auth."
|
|
131
|
+
);
|
|
76
132
|
}
|
|
77
133
|
}
|
|
78
134
|
this.server = createServer((req, res) => {
|
|
@@ -93,6 +149,15 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
93
149
|
}
|
|
94
150
|
/** Stop the server gracefully. */
|
|
95
151
|
async stop() {
|
|
152
|
+
if (this.devTokenPath && existsSync(this.devTokenPath)) {
|
|
153
|
+
try {
|
|
154
|
+
unlinkSync(this.devTokenPath);
|
|
155
|
+
} catch (err) {
|
|
156
|
+
log.warn({ err }, "Failed to delete dev token on shutdown");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
this.devToken = null;
|
|
160
|
+
this.devTokenPath = null;
|
|
96
161
|
return new Promise((resolve) => {
|
|
97
162
|
if (!this.server) return resolve();
|
|
98
163
|
this.server.close(() => {
|
|
@@ -134,6 +199,14 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
134
199
|
401,
|
|
135
200
|
"Authentication required \u2014 set SUPABASE_JWT_SECRET"
|
|
136
201
|
);
|
|
202
|
+
} else {
|
|
203
|
+
if (!this.verifyDevToken(req.headers.authorization)) {
|
|
204
|
+
return this.errorResponse(
|
|
205
|
+
res,
|
|
206
|
+
401,
|
|
207
|
+
`Dev-mode token required. Read it from ${this.devTokenPath ?? "~/.brainstorm/server-token"} and send as 'Authorization: Bearer <token>'.`
|
|
208
|
+
);
|
|
209
|
+
}
|
|
137
210
|
}
|
|
138
211
|
}
|
|
139
212
|
if (path === "/api/v1/products" && method === "GET")
|
|
@@ -282,18 +355,18 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
282
355
|
}
|
|
283
356
|
// ── ChangeSets ────────────────────────────────────────────────────
|
|
284
357
|
async handleChangesets(res) {
|
|
285
|
-
const { listChangeSets } = await import("./dist-
|
|
358
|
+
const { listChangeSets } = await import("./dist-XFJ337R7.js");
|
|
286
359
|
this.json(res, 200, this.envelope(listChangeSets()));
|
|
287
360
|
}
|
|
288
361
|
async handleChangesetApprove(id, req, res) {
|
|
289
|
-
const { approveChangeSet } = await import("./dist-
|
|
362
|
+
const { approveChangeSet } = await import("./dist-XFJ337R7.js");
|
|
290
363
|
const authPayload = req._authPayload;
|
|
291
364
|
const approver = authPayload?.email ?? authPayload?.sub ?? "user";
|
|
292
365
|
const result = await approveChangeSet(id, approver);
|
|
293
366
|
this.json(res, result.success ? 200 : 400, this.envelope(result));
|
|
294
367
|
}
|
|
295
368
|
async handleChangesetReject(id, res) {
|
|
296
|
-
const { rejectChangeSet } = await import("./dist-
|
|
369
|
+
const { rejectChangeSet } = await import("./dist-XFJ337R7.js");
|
|
297
370
|
const result = rejectChangeSet(id);
|
|
298
371
|
this.json(res, result.success ? 200 : 400, this.envelope(result));
|
|
299
372
|
}
|
|
@@ -311,7 +384,7 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
311
384
|
}
|
|
312
385
|
}
|
|
313
386
|
async handleAuditChangesets(url, res) {
|
|
314
|
-
const { ChangeSetLogRepository } = await import("./dist-
|
|
387
|
+
const { ChangeSetLogRepository } = await import("./dist-S7FLVLXS.js");
|
|
315
388
|
const csLog = new ChangeSetLogRepository(this.deps.db);
|
|
316
389
|
const limit = this.safeInt(url.searchParams.get("limit"), 50);
|
|
317
390
|
const offset = this.safeInt(url.searchParams.get("offset"), 0);
|
|
@@ -330,7 +403,7 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
330
403
|
if (!masterSecret) {
|
|
331
404
|
return this.errorResponse(res, 503, "Platform secret not configured");
|
|
332
405
|
}
|
|
333
|
-
const { verifyEvent } = await import("./dist-
|
|
406
|
+
const { verifyEvent } = await import("./dist-XFJ337R7.js");
|
|
334
407
|
if (!verifyEvent(body, masterSecret)) {
|
|
335
408
|
return this.errorResponse(res, 401, "Invalid event signature");
|
|
336
409
|
}
|
|
@@ -602,7 +675,7 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
602
675
|
}
|
|
603
676
|
// ── Skills ───────────────────────────────────────────────────────
|
|
604
677
|
handleListSkills(res) {
|
|
605
|
-
import("./dist-
|
|
678
|
+
import("./dist-LCPM5BXN.js").then(({ loadSkills }) => {
|
|
606
679
|
try {
|
|
607
680
|
const skills = loadSkills(this.opts.projectPath);
|
|
608
681
|
const list = skills.map((s) => ({
|
|
@@ -633,7 +706,7 @@ var BrainstormServer = class _BrainstormServer {
|
|
|
633
706
|
async handleRedTeam(req, res) {
|
|
634
707
|
const body = await this.readBody(req);
|
|
635
708
|
try {
|
|
636
|
-
const { runRedTeamSimulation, createDefaultMiddlewarePipeline: createDefaultMiddlewarePipeline2 } = await import("./dist-
|
|
709
|
+
const { runRedTeamSimulation, createDefaultMiddlewarePipeline: createDefaultMiddlewarePipeline2 } = await import("./dist-LCPM5BXN.js");
|
|
637
710
|
const pipeline = createDefaultMiddlewarePipeline2(this.opts.projectPath);
|
|
638
711
|
const scorecard = runRedTeamSimulation(pipeline, {
|
|
639
712
|
generations: body.generations ?? 5,
|
|
@@ -698,7 +771,7 @@ ${memCtx}`;
|
|
|
698
771
|
}
|
|
699
772
|
// ── Auth ──────────────────────────────────────────────────────────
|
|
700
773
|
async checkAuth(req) {
|
|
701
|
-
const { verifyJWT, extractBearerToken } = await import("./dist-
|
|
774
|
+
const { verifyJWT, extractBearerToken } = await import("./dist-XFJ337R7.js");
|
|
702
775
|
const token = extractBearerToken(
|
|
703
776
|
req.headers.authorization
|
|
704
777
|
);
|
|
@@ -1019,4 +1092,4 @@ export {
|
|
|
1019
1092
|
BrainstormClient,
|
|
1020
1093
|
BrainstormServer
|
|
1021
1094
|
};
|
|
1022
|
-
//# sourceMappingURL=dist-
|
|
1095
|
+
//# sourceMappingURL=dist-ZPASHTYZ.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA;EACE;OAIK;AACP,SAAS,aAAa,YAAY,uBAAuB;AACzD;EACE;EACA;EACA;EACA;EACA;OACK;AACP,SAAS,eAAe;AACxB,SAAS,YAAY;AAwBrB,IAAM,MAAM,aAAa,QAAQ;AAc1B,IAAM,mBAAN,MAAM,kBAAiB;EACpB,SAAwB;EACxB;EACA;EACA,sBAAkD;;;;;;;;;;;;;;;;EAgBlD,WAA0B;EAC1B,eAA8B;EAEtC,YAAY,MAA0B,MAAsB;AAC1D,SAAK,OAAO;AACZ,SAAK,OAAO;MACV,MAAM,MAAM,QAAQ;MACpB,MAAM,MAAM,QAAQ;MACpB,MAAM,MAAM,QAAQ;MACpB,gBAAgB,MAAM,kBAAkB,CAAC;MACzC,WAAW,MAAM,aAAa;MAC9B,aAAa,MAAM,eAAe,QAAQ,IAAI;IAChD;AAEA,QAAI,KAAK,eAAe;AACtB,WAAK,sBAAsB,IAAI;QAC7B,KAAK;QACL,KAAK;MACP;IACF;EACF;;;;;EAMQ,eAAqB;AAC3B,UAAM,MAAM;MACV,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,GAAG,aAAa;IAC9D;AACA,QAAI,CAAC,WAAW,GAAG,EAAG,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACxD,UAAM,YAAY,KAAK,KAAK,cAAc;AAC1C,UAAM,QAAQ,YAAY,EAAE,EAAE,SAAS,KAAK;AAC5C,kBAAc,WAAW,OAAO,EAAE,MAAM,IAAM,CAAC;AAC/C,cAAU,WAAW,GAAK;AAC1B,SAAK,WAAW;AAChB,SAAK,eAAe;EACtB;;EAGQ,eAAe,YAAyC;AAC9D,QAAI,CAAC,KAAK,YAAY,CAAC,WAAY,QAAO;AAC1C,UAAM,IAAI,mBAAmB,KAAK,WAAW,KAAK,CAAC;AACnD,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,WAAW,OAAO,KAAK,EAAE,CAAC,GAAG,MAAM;AACzC,UAAM,WAAW,OAAO,KAAK,KAAK,UAAU,MAAM;AAClD,QAAI,SAAS,WAAW,SAAS,OAAQ,QAAO;AAChD,WAAO,gBAAgB,UAAU,QAAQ;EAC3C;;EAGA,MAAM,QAAkC;AACtC,UAAM,EAAE,MAAM,KAAK,IAAI,KAAK;AAM5B,QAAI,CAAC,KAAK,KAAK,WAAW;AACxB,UAAI,SAAS,eAAe,SAAS,eAAe,SAAS,OAAO;AAClE,YAAI;UACF,EAAE,MAAM,KAAK;UACb;QACF;AACA,gBAAQ,KAAK,CAAC;MAChB,OAAO;AAKL,aAAK,aAAa;AAClB,YAAI;UACF,EAAE,WAAW,KAAK,aAAa;UAC/B;QACF;MACF;IACF;AAEA,SAAK,SAAS,aAAa,CAAC,KAAK,QAAQ;AACvC,WAAK,cAAc,KAAK,GAAG,EAAE,MAAM,CAAC,QAAQ;AAC1C,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,cAAM,SAAU,KAAa,cAAc;AAC3C,YAAI,UAAU,IAAK,KAAI,MAAM,EAAE,IAAI,GAAG,yBAAyB;AAC/D,aAAK,cAAc,KAAK,QAAQ,GAAG;MACrC,CAAC;IACH,CAAC;AAED,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,OAAQ,OAAO,MAAM,MAAM,MAAM;AACpC,cAAM,MAAM,UAAU,IAAI,IAAI,IAAI;AAClC,YAAI,KAAK,EAAE,IAAI,GAAG,2BAA2B;AAC7C,gBAAQ,EAAE,IAAI,CAAC;MACjB,CAAC;IACH,CAAC;EACH;;EAGA,MAAM,OAAsB;AAG1B,QAAI,KAAK,gBAAgB,WAAW,KAAK,YAAY,GAAG;AACtD,UAAI;AACF,mBAAW,KAAK,YAAY;MAC9B,SAAS,KAAK;AACZ,YAAI,KAAK,EAAE,IAAI,GAAG,wCAAwC;MAC5D;IACF;AACA,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI,CAAC,KAAK,OAAQ,QAAO,QAAQ;AACjC,WAAK,OAAO,MAAM,MAAM;AACtB,YAAI,KAAK,2BAA2B;AACpC,aAAK,SAAS;AACd,gBAAQ;MACV,CAAC;IACH,CAAC;EACH;;EAGA,gBAA+B;AAC7B,WAAO,KAAK;EACd;;EAIA,MAAc,cACZ,KACA,KACe;AAId,QAAY,iBAAiB;AAE9B,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,UAAM,OAAO,IAAI;AACjB,UAAM,SAAS,IAAI,UAAU;AAG7B,QAAI,WAAW,aAAa,KAAK,KAAK,MAAM;AAC1C,UAAI,UAAU,KAAK,KAAK,YAAY,GAAG,CAAC;AACxC,UAAI,IAAI;AACR;IACF;AAGA,QAAI,SAAS,aAAa,WAAW,OAAO;AAC1C,aAAO,KAAK,aAAa,GAAG;IAC9B;AAGA,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,YAAM,aACJ,KAAK,KAAK,SAAS,eACnB,KAAK,KAAK,SAAS,eACnB,KAAK,KAAK,SAAS;AAErB,UAAI,KAAK,KAAK,WAAW;AACvB,cAAM,aAAa,MAAM,KAAK,UAAU,GAAG;AAC3C,YAAI,CAAC,WAAW,IAAI;AAClB,iBAAO,KAAK,cAAc,KAAK,KAAK,WAAW,KAAK;QACtD;AAEC,YAAY,eAAe,WAAW,KAClC,WAAmB,UACpB;MACN,WAAW,CAAC,YAAY;AAEtB,eAAO,KAAK;UACV;UACA;UACA;QACF;MACF,OAAO;AAKL,YAAI,CAAC,KAAK,eAAe,IAAI,QAAQ,aAAuB,GAAG;AAC7D,iBAAO,KAAK;YACV;YACA;YACA,yCAAyC,KAAK,gBAAgB,4BAA4B;UAC5F;QACF;MACF;IACF;AAGA,QAAI,SAAS,sBAAsB,WAAW;AAC5C,aAAO,KAAK,eAAe,GAAG;AAChC,QAAI,SAAS,mBAAmB,WAAW;AACzC,aAAO,KAAK,YAAY,GAAG;AAC7B,QAAI,SAAS,2BAA2B,WAAW;AACjD,aAAO,KAAK,kBAAkB,KAAK,GAAG;AACxC,QAAI,SAAS,wBAAwB,WAAW;AAC9C,aAAO,KAAK,iBAAiB,GAAG;AAElC,UAAM,eAAe,KAAK;MACxB;IACF;AACA,QAAI,gBAAgB,WAAW;AAC7B,aAAO,KAAK,uBAAuB,aAAa,CAAC,GAAG,KAAK,GAAG;AAE9D,UAAM,cAAc,KAAK,MAAM,0CAA0C;AACzE,QAAI,eAAe,WAAW;AAC5B,aAAO,KAAK,sBAAsB,YAAY,CAAC,GAAG,GAAG;AAEvD,QAAI,SAAS,mBAAmB,WAAW;AACzC,aAAO,KAAK,YAAY,KAAK,GAAG;AAClC,QAAI,SAAS,8BAA8B,WAAW;AACpD,aAAO,KAAK,sBAAsB,KAAK,GAAG;AAC5C,QAAI,SAAS,6BAA6B,WAAW;AACnD,aAAO,KAAK,qBAAqB,KAAK,GAAG;AAG3C,QAAI,SAAS,kBAAkB,WAAW;AACxC,aAAO,KAAK,WAAW,KAAK,GAAG;AACjC,QAAI,SAAS,yBAAyB,WAAW;AAC/C,aAAO,KAAK,iBAAiB,KAAK,GAAG;AAGvC,QAAI,SAAS,2BAA2B,WAAW;AACjD,aAAO,KAAK,wBAAwB,KAAK,GAAG;AAC9C,QAAI,SAAS,2BAA2B,WAAW;AACjD,aAAO,KAAK,yBAAyB,KAAK,GAAG;AAE/C,UAAM,YAAY,KAAK,MAAM,qCAAqC;AAClE,QAAI,aAAa,WAAW;AAC1B,aAAO,KAAK,sBAAsB,UAAU,CAAC,GAAG,GAAG;AACrD,QAAI,aAAa,WAAW;AAC1B,aAAO,KAAK,yBAAyB,UAAU,CAAC,GAAG,KAAK,GAAG;AAC7D,QAAI,aAAa,WAAW;AAC1B,aAAO,KAAK,yBAAyB,UAAU,CAAC,GAAG,GAAG;AAExD,UAAM,YAAY,KAAK,MAAM,2CAA2C;AACxE,QAAI,aAAa,WAAW;AAC1B,aAAO,KAAK,uBAAuB,UAAU,CAAC,GAAG,KAAK,GAAG;AAE3D,UAAM,eAAe,KAAK;MACxB;IACF;AACA,QAAI,gBAAgB,WAAW;AAC7B,aAAO,KAAK,cAAc,aAAa,CAAC,GAAG,KAAK,GAAG;AAErD,UAAM,gBAAgB,KAAK;MACzB;IACF;AACA,QAAI,iBAAiB,WAAW;AAC9B,aAAO,KAAK,2BAA2B,cAAc,CAAC,GAAG,GAAG;AAG9D,QAAI,SAAS,oBAAoB,WAAW;AAC1C,aAAO,KAAK,iBAAiB,GAAG;AAClC,QAAI,SAAS,oBAAoB,WAAW;AAC1C,aAAO,KAAK,mBAAmB,KAAK,GAAG;AACzC,UAAM,cAAc,KAAK,MAAM,8BAA8B;AAC7D,QAAI,eAAe,WAAW;AAC5B,aAAO,KAAK,mBAAmB,YAAY,CAAC,GAAG,KAAK,GAAG;AACzD,QAAI,eAAe,WAAW;AAC5B,aAAO,KAAK,mBAAmB,YAAY,CAAC,GAAG,GAAG;AACpD,QAAI,SAAS,0BAA0B,WAAW;AAChD,aAAO,KAAK,iBAAiB,GAAG;AAGlC,QAAI,SAAS,oBAAoB,WAAW;AAC1C,aAAO,KAAK,iBAAiB,GAAG;AAGlC,QAAI,SAAS,oBAAoB,WAAW;AAC1C,aAAO,KAAK,iBAAiB,GAAG;AAGlC,QAAI,SAAS,+BAA+B,WAAW;AACrD,aAAO,KAAK,cAAc,KAAK,GAAG;AAGpC,SAAK,cAAc,KAAK,KAAK,cAAc,MAAM,IAAI,IAAI,EAAE;EAC7D;;EAIQ,aAAa,KAA2B;AAC9C,QAAI,cAAc;AAClB,QAAI;AACF,YAAM,MAAM,KAAK,KAAK,GACnB;QACC;MACF,EACC,IAAI;AACP,oBAAc,KAAK,OAAO;IAC5B,QAAQ;IAER;AAEA,SAAK,KAAK,KAAK,KAAK;MAClB,QAAQ;MACR,SAAS,KAAK,KAAK,WAAW;MAC9B,gBAAgB,KAAK,MAAM,QAAQ,OAAO,CAAC;MAC3C,UAAU;QACR,WAAW,KAAK,KAAK,QAAQ,iBAAiB;QAC9C,OAAO,KAAK,KAAK,QAAQ;MAC3B;MACA,eAAe,EAAE,QAAQ,YAAY;IACvC,CAAC;EACH;;EAIQ,eAAe,KAA2B;AAChD,UAAM,WAAW,KAAK,KAAK,QAAQ,iBAAiB,IAAI,CAAC,SAAS;MAChE,SAAS,IAAI;MACb,cAAc,IAAI;MAClB,QAAQ;MACR,YAAY,IAAI;MAChB,YAAY,IAAI;MAChB,cAAc,IAAI;MAClB,eAAc,oBAAI,KAAK,GAAE,YAAY;IACvC,EAAE;AACF,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,QAAQ,CAAC;EAC7C;;EAIQ,YAAY,KAA2B;AAC7C,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,MAAM,UAAU,CAAC,CAAC;EAChE;;EAGA,OAAwB,2BAA2B,oBAAI,IAAI;IACzD;IACA;EACF,CAAC;EAED,MAAc,kBACZ,KACA,KACe;AACf,UAAM,OAAO,MAAM,KAAK,SAA6B,GAAG;AACxD,QAAI,CAAC,KAAK,MAAM;AACd,aAAO,KAAK,cAAc,KAAK,KAAK,sBAAsB;IAC5D;AAEA,UAAM,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI;AAC1C,QAAI,CAAC,MAAM;AACT,aAAO,KAAK,cAAc,KAAK,KAAK,SAAS,KAAK,IAAI,aAAa;IACrE;AAIA,QAAI,kBAAiB,yBAAyB,IAAI,KAAK,UAAU,GAAG;AAClE,aAAO,KAAK;QACV;QACA;QACA,SAAS,KAAK,IAAI,eAAe,KAAK,UAAU;MAClD;IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,UAAU,CAAC,CAAC;AACnD,WAAK;QACH;QACA;QACA,KAAK,SAAS;UACZ,MAAM,KAAK;UACX;UACA,cAAa,oBAAI,KAAK,GAAE,YAAY;QACtC,CAAC;MACH;IACF,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAK,cAAc,KAAK,KAAK,0BAA0B,GAAG,EAAE;IAC9D;EACF;;EAIA,MAAc,iBAAiB,KAAoC;AACjE,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,oBAAqB;AAC7D,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,eAAe,CAAC,CAAC;EACrD;EAEA,MAAc,uBACZ,IACA,KACA,KACe;AACf,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,oBAAqB;AAE/D,UAAM,cAAe,IAAY;AACjC,UAAM,WAAW,aAAa,SAAS,aAAa,OAAO;AAC3D,UAAM,SAAS,MAAM,iBAAiB,IAAI,QAAQ;AAClD,SAAK,KAAK,KAAK,OAAO,UAAU,MAAM,KAAK,KAAK,SAAS,MAAM,CAAC;EAClE;EAEA,MAAc,sBACZ,IACA,KACe;AACf,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,oBAAqB;AAC9D,UAAM,SAAS,gBAAgB,EAAE;AACjC,SAAK,KAAK,KAAK,OAAO,UAAU,MAAM,KAAK,KAAK,SAAS,MAAM,CAAC;EAClE;;EAIQ,YAAY,KAAU,KAA2B;AACvD,UAAM,QAAQ,KAAK,QAAQ,IAAI,aAAa,IAAI,OAAO,GAAG,EAAE;AAC5D,UAAM,SAAS,KAAK,QAAQ,IAAI,aAAa,IAAI,QAAQ,GAAG,CAAC;AAC7D,QAAI;AACF,YAAM,OAAO,KAAK,KAAK,GACpB;QACC;MACF,EACC,IAAI,OAAO,MAAM;AACpB,WAAK,KAAK,KAAK,KAAK,KAAK,SAAS,EAAE,SAAS,MAAM,OAAO,OAAO,CAAC,CAAC;IACrE,QAAQ;AACN,WAAK,KAAK,KAAK,KAAK,KAAK,SAAS,EAAE,SAAS,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC;IACnE;EACF;EAEA,MAAc,sBACZ,KACA,KACe;AACf,UAAM,EAAE,uBAAuB,IAAI,MAAM,OAAO,oBAAgB;AAChE,UAAM,QAAQ,IAAI,uBAAuB,KAAK,KAAK,EAAE;AACrD,UAAM,QAAQ,KAAK,QAAQ,IAAI,aAAa,IAAI,OAAO,GAAG,EAAE;AAC5D,UAAM,SAAS,KAAK,QAAQ,IAAI,aAAa,IAAI,QAAQ,GAAG,CAAC;AAC7D,UAAM,YAAY,IAAI,aAAa,IAAI,WAAW;AAClD,UAAM,UAAU,YACZ,MAAM,YAAY,WAAW,KAAK,IAClC,MAAM,OAAO,OAAO,MAAM;AAC9B,SAAK;MACH;MACA;MACA,KAAK,SAAS,EAAE,SAAS,OAAO,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC;IAChE;EACF;;EAIA,MAAc,qBACZ,KACA,KACe;AACf,UAAM,OAAO,MAAM,KAAK,SAAS,GAAG;AACpC,UAAM,eAAe,QAAQ,IAAI;AAEjC,QAAI,CAAC,cAAc;AACjB,aAAO,KAAK,cAAc,KAAK,KAAK,gCAAgC;IACtE;AAEA,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAqB;AAC1D,QAAI,CAAC,YAAY,MAAM,YAAY,GAAG;AACpC,aAAO,KAAK,cAAc,KAAK,KAAK,yBAAyB;IAC/D;AAEA,QAAI;MACF,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,SAAS,QAAQ,KAAK,UAAU;MACjE;IACF;AACA,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,EAAE,UAAU,MAAM,UAAU,KAAK,GAAG,CAAC,CAAC;EAC1E;;EAIA,MAAc,WACZ,KACA,KACe;AACf,UAAM,OAAO,MAAM,KAAK,SAAsB,GAAG;AACjD,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO,KAAK,cAAc,KAAK,KAAK,yBAAyB;IAC/D;AAEA,UAAM;MACJ;MACA;MACA;MACA;MACA;IACF,IAAI,KAAK,YAAY,IAAI;AAEzB,UAAM,WAAW,CAAC,EAAE,MAAM,QAAiB,SAAS,KAAK,QAAQ,CAAC;AAClE,QAAI,YAAY;AAChB,QAAI,YAAY;AAKhB,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,UAAU,MAAM,gBAAgB,MAAM;AAC5C,QAAI,GAAG,SAAS,OAAO;AAEvB,QAAI;AACF,uBAAiB,SAAS,aAAa,UAAU;QAC/C,QAAQ,KAAK,KAAK;QAClB,UAAU,KAAK,KAAK;QACpB,QAAQ,KAAK,KAAK;QAClB,aAAa,KAAK,KAAK;QACvB,OAAO,KAAK,KAAK;QACjB,WAAW,QAAQ;QACnB,aAAa,KAAK,KAAK;QACvB;QACA,gBAAgB;QAChB,iBAAiB,MAAM;QACvB,YAAY,gCAAgC,KAAK,KAAK,WAAW;QACjE;QACA,QAAQ,gBAAgB;MAC1B,CAAC,GAAG;AACF,YAAI,MAAM,SAAS,aAAc,cAAa,MAAM;AACpD,YAAI,MAAM,SAAS,OAAQ,aAAY,MAAM;MAC/C;IACF,UAAA;AACE,UAAI,IAAI,SAAS,OAAO;IAC1B;AAIA,SAAK;MACH;MACA;MACA,KAAK,SAAS;QACZ,UAAU;QACV,YAAY,QAAQ;QACpB,iBAAiB;QACjB,MAAM;MACR,CAAC;IACH;EACF;EAEA,MAAc,iBACZ,KACA,KACe;AACf,UAAM,OAAO,MAAM,KAAK,SAAsB,GAAG;AACjD,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO,KAAK,cAAc,KAAK,KAAK,yBAAyB;IAC/D;AAEA,QAAI,UAAU,KAAK;MACjB,gBAAgB;MAChB,iBAAiB;MACjB,YAAY;MACZ,GAAG,KAAK,YAAY,GAAG;IACzB,CAAC;AAED,UAAM;MACJ;MACA;MACA;MACA;MACA;IACF,IAAI,KAAK,YAAY,IAAI;AAGzB,QAAI;MACF,SAAS,KAAK,UAAU,EAAE,MAAM,WAAW,WAAW,QAAQ,IAAI,eAAe,CAAC,CAAC;;;IACrF;AAEA,UAAM,WAAW,CAAC,EAAE,MAAM,QAAiB,SAAS,KAAK,QAAQ,CAAC;AAMlE,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,UAAU,MAAM,gBAAgB,MAAM;AAC5C,QAAI,GAAG,SAAS,OAAO;AAEvB,QAAI;AACF,uBAAiB,SAAS,aAAa,UAAU;QAC/C,QAAQ,KAAK,KAAK;QAClB,UAAU,KAAK,KAAK;QACpB,QAAQ,KAAK,KAAK;QAClB,aAAa,KAAK,KAAK;QACvB,OAAO,KAAK,KAAK;QACjB,WAAW,QAAQ;QACnB,aAAa,KAAK,KAAK;QACvB;QACA,gBAAgB;QAChB,iBAAiB,MAAM;QACvB,YAAY,gCAAgC,KAAK,KAAK,WAAW;QACjE;QACA,QAAQ,gBAAgB;MAC1B,CAAC,GAAG;AACF,YAAI,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC;;CAAM;AAC9C,YAAI,MAAM,SAAS,UAAU,MAAM,SAAS,QAAS;MACvD;IACF,UAAA;AACE,UAAI,IAAI,SAAS,OAAO;IAC1B;AAEA,QAAI,CAAC,IAAI,eAAe;AACtB,UAAI,MAAM,kBAAkB;AAC5B,UAAI,IAAI;IACV;EACF;;EAIQ,wBAAwB,KAAU,KAA2B;AACnE,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,cAAc,IAAI,aAAa,IAAI,SAAS,KAAK;AACvD,UAAM,kBAAkB,IAAI,aAAa,IAAI,UAAU,MAAM;AAC7D,UAAM,QAAQ,KAAK,QAAQ,IAAI,aAAa,IAAI,OAAO,GAAG,EAAE;AAC5D,UAAM,QAAQ,KAAK,oBAAoB,KAAK,aAAa;MACvD;MACA;IACF,CAAC;AACD,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,KAAK,CAAC;EAC1C;EAEA,MAAc,yBACZ,KACA,KACe;AACf,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,OAAO,MAAM,KAAK,SAAoC,GAAG;AAC/D,UAAM,OAAO,KAAK,oBAAoB,OAAO,KAAK,KAAK,aAAa,IAAI;AACxE,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,IAAI,CAAC;EACzC;EAEQ,sBAAsB,IAAY,KAA2B;AACnE,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,OAAO,KAAK,oBAAoB,IAAI,EAAE;AAC5C,QAAI,CAAC,KAAM,QAAO,KAAK,cAAc,KAAK,KAAK,wBAAwB;AAEvE,UAAM,UAAU,KAAK,oBAAoB,WAAW,EAAE;AACtD,SAAK;MACH;MACA;MACA,KAAK,SAAS;QACZ,GAAG;QACH,WAAW,KAAK,oBAAoB,aAAa,EAAE;QACnD,eAAe,KAAK,oBAAoB,iBAAiB,EAAE;QAC3D,gBAAgB,SAAS,kBAAkB;MAC7C,CAAC;IACH;EACF;EAEA,MAAc,yBACZ,IACA,KACA,KACe;AACf,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,OAAO,MAAM,KAAK,SAAoC,GAAG;AAC/D,UAAM,OAAO,KAAK,oBAAoB,OAAO,IAAI,IAAI;AACrD,QAAI,CAAC,KAAM,QAAO,KAAK,cAAc,KAAK,KAAK,wBAAwB;AACvE,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,IAAI,CAAC;EACzC;EAEQ,yBAAyB,IAAY,KAA2B;AACtE,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,UAAU,KAAK,oBAAoB,OAAO,EAAE;AAClD,QAAI,CAAC,QAAS,QAAO,KAAK,cAAc,KAAK,KAAK,wBAAwB;AAC1E,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;EACtD;EAEA,MAAc,uBACZ,IACA,KACA,KACe;AACf,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,OAAO,MAAM,KAAK,SAA4B,GAAG;AACvD,UAAM,SAAS,KAAK,oBAAoB,KAAK,IAAI,KAAK,IAAI;AAC1D,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,KAAK,KAAK,wBAAwB;AACzE,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,MAAM,CAAC;EAC3C;EAEA,MAAc,cACZ,IACA,KACA,KACe;AACf,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,OAAO,MAAM,KAAK,SAAyB,GAAG;AACpD,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO,KAAK,cAAc,KAAK,KAAK,yBAAyB;IAC/D;AACA,UAAM,OAAO,KAAK,oBAAoB,QAAQ,IAAI,KAAK,OAAO;AAC9D,QAAI,CAAC,KAAM,QAAO,KAAK,cAAc,KAAK,KAAK,wBAAwB;AACvE,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,IAAI,CAAC;EACzC;EAEQ,2BAA2B,IAAY,KAA2B;AACxE,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,OAAO,KAAK,oBAAoB,IAAI,EAAE;AAC5C,QAAI,CAAC,KAAM,QAAO,KAAK,cAAc,KAAK,KAAK,wBAAwB;AACvE,UAAM,WAAW,KAAK,oBAAoB,YAAY,EAAE;AACxD,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,QAAQ,CAAC;EAC7C;;EAIQ,iBAAiB,KAA2B;AAClD,QAAI,CAAC,KAAK,KAAK,eAAe;AAC5B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,UAAU,KAAK,KAAK,cAAc,KAAK;AAC7C,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,OAAO,CAAC;EAC5C;EAEA,MAAc,mBACZ,KACA,KACe;AACf,QAAI,CAAC,KAAK,KAAK,eAAe;AAC5B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,OAAO,MAAM,KAAK,SAMrB,GAAG;AACN,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,SAAS;AAC/B,aAAO,KAAK,cAAc,KAAK,KAAK,2BAA2B;IACjE;AACA,UAAM,QAAQ,KAAK,KAAK,cAAc,KAAK;MACzC,MAAM,KAAK;MACX,aAAa,KAAK;MAClB,MAAO,KAAK,QAAgB;MAC5B,SAAS,KAAK;MACd,QAAS,KAAK,UAAkB;MAChC,YAAY;IACd,CAAC;AACD,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,KAAK,CAAC;EAC1C;EAEA,MAAc,mBACZ,IACA,KACA,KACe;AACf,QAAI,CAAC,KAAK,KAAK,eAAe;AAC5B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,UAAM,OAAO,MAAM,KAAK,SAGrB,GAAG;AACN,QAAI;AACF,UAAI,KAAK,SAAS,UAAU;AAC1B,aAAK,KAAK,cAAc,QAAQ,EAAE;MACpC,WAAW,KAAK,SAAS,cAAc;AACrC,aAAK,KAAK,cAAc,WAAW,EAAE;MACvC,WAAW,KAAK,SAAS,WAAW;AAClC,aAAK,KAAK,cAAc,OAAO,EAAE;MACnC;AACA,WAAK,KAAK,KAAK,KAAK,KAAK,SAAS,EAAE,SAAS,MAAM,GAAG,CAAC,CAAC;IAC1D,SAAS,KAAU;AACjB,WAAK,cAAc,KAAK,KAAK,IAAI,WAAW,iBAAiB;IAC/D;EACF;EAEQ,mBAAmB,IAAY,KAA2B;AAChE,QAAI,CAAC,KAAK,KAAK,eAAe;AAC5B,aAAO,KAAK,cAAc,KAAK,KAAK,+BAA+B;IACrE;AACA,QAAI;AACF,WAAK,KAAK,cAAc,OAAO,EAAE;AACjC,WAAK,KAAK,KAAK,KAAK,KAAK,SAAS,EAAE,SAAS,MAAM,GAAG,CAAC,CAAC;IAC1D,SAAS,KAAU;AACjB,WAAK,cAAc,KAAK,KAAK,IAAI,WAAW,iBAAiB;IAC/D;EACF;EAEQ,iBAAiB,KAA2B;AAGlD,SAAK;MACH;MACA;MACA,KAAK,SAAS;QACZ,QAAQ;QACR,SACE;MACJ,CAAC;IACH;EACF;;EAIQ,iBAAiB,KAA2B;AAClD,WAAO,oBAAkB,EAAE,KAAK,CAAC,EAAE,WAAW,MAAM;AAClD,UAAI;AACF,cAAM,SAAS,WAAW,KAAK,KAAK,WAAW;AAC/C,cAAM,OAAO,OAAO,IAAI,CAAC,OAAO;UAC9B,MAAM,EAAE;UACR,aAAa,EAAE,eAAe;UAC9B,QAAQ,EAAE,UAAU;UACpB,SAAS,EAAE,QAAQ,MAAM,GAAG,GAAG;QACjC,EAAE;AACF,aAAK,KAAK,KAAK,KAAK,KAAK,SAAS,IAAI,CAAC;MACzC,QAAQ;AACN,aAAK,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;MACvC;IACF,CAAC;EACH;;EAIQ,iBAAiB,KAA2B;AAClD,UAAM,SAAS,KAAK,KAAK,SAAS,OAAO,IAAI,CAAC,OAAO;MACnD,IAAI,EAAE;MACN,MAAM,EAAE;MACR,UAAU,EAAE;MACZ,QAAQ,EAAE;MACV,SAAS,EAAE;MACX,cAAc,EAAE;IAClB,EAAE;AACF,SAAK,KAAK,KAAK,KAAK,KAAK,SAAS,MAAM,CAAC;EAC3C;;EAIA,MAAc,cACZ,KACA,KACe;AACf,UAAM,OAAO,MAAM,KAAK,SAGrB,GAAG;AAEN,QAAI;AACF,YAAM,EAAE,sBAAsB,iCAAAA,iCAAgC,IAC5D,MAAM,OAAO,oBAAkB;AACjC,YAAM,WAAWA,iCAAgC,KAAK,KAAK,WAAW;AACtE,YAAM,YAAY,qBAAqB,UAAU;QAC/C,aAAa,KAAK,eAAe;QACjC,gBAAgB,KAAK,kBAAkB;MACzC,CAAC;AACD,WAAK,KAAK,KAAK,KAAK,KAAK,SAAS,SAAS,CAAC;IAC9C,SAAS,KAAU;AACjB,WAAK,cAAc,KAAK,KAAK,IAAI,WAAW,4BAA4B;IAC1E;EACF;;EAIQ,YAAY,MAMlB;AACA,UAAM,iBAAiB,IAAI,eAAe,KAAK,KAAK,EAAE;AACtD,UAAM,EAAE,QAAQ,WAAW,SAAS,IAAI;MACtC,KAAK,KAAK;IACZ;AACA,UAAM,eAAe,KAAK,KAAK,QAAQ,eAAe,QAAQ;AAC9D,QAAI,eAAe,YAAY;AAC/B,QAAI,mBAAmB,KAAK;AAE5B,QAAI;AACJ,QAAI,iBAAiB,KAAK;AAG1B,QAAI,kBAAkB,KAAK,qBAAqB;AAC9C,YAAM,MAAM,KAAK,oBAAoB,WAAW,cAAc;AAC9D,UAAI,KAAK;AAEP,cAAM,SACJ,KAAK,oBAAoB,iBAAiB,cAAc;AAC1D,YAAI,OAAQ,iBAAgB;;EAAO,MAAM;AAGzC,YAAI,IAAI,kBAAkB,CAAC,kBAAkB;AAC3C,6BAAmB,IAAI;QACzB;MACF;AAGA,YAAM,SAAS,KAAK,oBAAoB,aAAa,cAAc;AACnE,UAAI,QAAQ;AACV,kBAAU,OAAO;MACnB,OAAO;AACL,kBAAU,eAAe,MAAM,KAAK,KAAK,WAAW;MACtD;IACF,WAAW,KAAK,WAAW;AAEzB,YAAM,WAAW,eAAe,OAAO,KAAK,SAAS;AACrD,gBAAU,YAAY,eAAe,MAAM,KAAK,KAAK,WAAW;IAClE,OAAO;AAEL,gBAAU,eAAe,MAAM,KAAK,KAAK,WAAW;AAGpD,UAAI,KAAK,qBAAqB;AAC5B,cAAM,OAAO,KAAK,oBAAoB,OAAO,KAAK,KAAK,aAAa;UAClE,MAAM,KAAK,QAAQ,MAAM,GAAG,EAAE;QAChC,CAAC;AACD,yBAAiB,KAAK;AAEtB,cAAM,SAAS,KAAK,oBAAoB,aAAa,KAAK,EAAE;AAC5D,YAAI,QAAQ;AACV,oBAAU,OAAO;QACnB;MACF;IACF;AAEA,WAAO;MACL;MACA;MACA;MACA;MACA;IACF;EACF;;EAIA,MAAc,UAAU,KAMtB;AACA,UAAM,EAAE,WAAW,mBAAmB,IACpC,MAAM,OAAO,oBAAqB;AACpC,UAAM,QAAQ;MACZ,IAAI,QAAQ;IACd;AACA,QAAI,CAAC,MAAO,QAAO,EAAE,IAAI,OAAO,OAAO,+BAA+B;AAEtE,UAAM,OAAO,UAAU,OAAO,KAAK,KAAK,SAAS;AACjD,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,IAAI,OAAO,OAAO,KAAK,SAAS,wBAAwB;AAEnE,WAAO,EAAE,IAAI,MAAM,SAAS,KAAK,QAAQ;EAC3C;;EAIQ,KAAK,KAAqB,QAAgB,MAAqB;AACrE,UAAM,UAAU,KAAK,UAAU,IAAI;AACnC,UAAM,MAAO,IAAY;AACzB,QAAI,UAAU,QAAQ;MACpB,gBAAgB;MAChB,GAAG,KAAK,YAAY,GAAG;IACzB,CAAC;AACD,QAAI,IAAI,OAAO;EACjB;EAEQ,SAAY,MAAS;AAC3B,WAAO;MACL,IAAI;MACJ;MACA,YAAY,WAAW;MACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;IACpC;EACF;EAEQ,cACN,KACA,QACA,SACM;AACN,SAAK,KAAK,KAAK,QAAQ;MACrB,IAAI;MACJ,OAAO;MACP,YAAY,WAAW;MACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;IACpC,CAAC;EACH;EAEA,MAAc,SAAkB,KAAkC;AAChE,UAAM,iBAAiB,KAAK,OAAO;AACnC,UAAM,WAAW,OAAO,IAAI,QAAQ,gBAAgB,KAAK,CAAC;AAC1D,QAAI,OAAO,SAAS,QAAQ,KAAK,WAAW,gBAAgB;AAC1D,YAAM,OAAO,OAAO,IAAI,MAAM,wBAAwB,GAAG;QACvD,YAAY;MACd,CAAC;IACH;AACA,UAAM,SAAmB,CAAC;AAC1B,QAAI,WAAW;AACf,qBAAiB,SAAS,KAAK;AAC7B,YAAM,MAAM;AACZ,kBAAY,IAAI;AAChB,UAAI,WAAW,gBAAgB;AAC7B,YAAI,QAAQ;AACZ,cAAM,OAAO,OAAO,IAAI,MAAM,wBAAwB,GAAG;UACvD,YAAY;QACd,CAAC;MACH;AACA,aAAO,KAAK,GAAG;IACjB;AACA,UAAM,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO;AAClD,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;IACvB,QAAQ;AACN,YAAM,OAAO,OAAO,IAAI,MAAM,mBAAmB,GAAG,EAAE,YAAY,IAAI,CAAC;IACzE;EACF;;EAGQ,QAAQ,OAAsB,UAA0B;AAC9D,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,IAAI,SAAS,OAAO,EAAE;AAC5B,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;EAClC;;;;;;EAOQ,YAAY,KAA+C;AACjE,UAAM,SAAS,KAAK,qBAAqB,GAAG;AAC5C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,WAAO;MACL,+BAA+B;MAC/B,oCAAoC;MACpC,MAAM;MACN,gCAAgC;MAChC,gCAAgC;MAChC,0BAA0B;IAC5B;EACF;EAEQ,qBAAqB,KAAsC;AACjE,QAAI,CAAC,KAAK,KAAK,KAAM,QAAO;AAC5B,UAAM,SAAS,KAAK,QAAQ;AAC5B,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,WAAO,KAAK,KAAK,eAAe,SAAS,MAAM,IAAI,SAAS;EAC9D;AACF;ACrmCO,IAAM,mBAAN,MAAuB;EACpB;EACA;EACA;EAER,YAAY,MAAqB;AAC/B,SAAK,UAAU,KAAK,QAAQ,QAAQ,OAAO,EAAE;AAC7C,SAAK,QAAQ,KAAK,SAAS;AAC3B,SAAK,UAAU,KAAK,WAAW;EACjC;;EAIA,MAAM,SAAkC;AACtC,WAAO,KAAK,IAAI,SAAS;EAC3B;;;EAKA,MAAM,KAAK,SAA6C;AACtD,UAAM,WAAW,MAAM,KAAK;MAC1B;MACA;IACF;AACA,WAAO,SAAS;EAClB;;;;;EAMA,OAAO,WACL,SACyC;AACzC,UAAM,WAAW,MAAM,KAAK,SAAS,uBAAuB;MAC1D,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,MAAM,IAAI,EAAE;IACpE;AAEA,QAAI,CAAC,SAAS,KAAM,OAAM,IAAI,MAAM,iCAAiC;AAErE,UAAM,SAAS,SAAS,KAAK,UAAU;AACvC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AAEb,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,gBAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,cAAI,SAAS,SAAU;AAEvB,cAAI;AACF,kBAAM,KAAK,MAAM,IAAI;UACvB,QAAQ;UAER;QACF;MACF;IACF,UAAA;AACE,aAAO,YAAY;IACrB;EACF;;;EAKA,MAAM,YAAgC;AACpC,UAAM,WAAW,MAAM,KAAK,IAA4B,eAAe;AACvE,WAAO,SAAS;EAClB;;EAGA,MAAM,YAAY,SAA2D;AAC3E,UAAM,WAAW,MAAM,KAAK;MAC1B;MACA;IACF;AACA,WAAO,SAAS;EAClB;;EAIA,MAAM,eAAmC;AACvC,UAAM,WAAW,MAAM,KAAK,IAA4B,kBAAkB;AAC1E,WAAO,SAAS;EAClB;;EAIA,MAAM,iBAAqC;AACzC,UAAM,WACJ,MAAM,KAAK,IAA4B,oBAAoB;AAC7D,WAAO,SAAS;EAClB;EAEA,MAAM,iBAAiB,IAA8B;AACnD,UAAM,WAAW,MAAM,KAAK;MAC1B,sBAAsB,EAAE;MACxB,CAAC;IACH;AACA,WAAO,SAAS;EAClB;EAEA,MAAM,gBAAgB,IAA8B;AAClD,UAAM,WAAW,MAAM,KAAK;MAC1B,sBAAsB,EAAE;MACxB,CAAC;IACH;AACA,WAAO,SAAS;EAClB;;;EAKA,MAAM,kBAAkB,MAII;AAC1B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,QAAS,QAAO,IAAI,WAAW,KAAK,OAAO;AACrD,QAAI,MAAM,SAAU,QAAO,IAAI,YAAY,MAAM;AACjD,QAAI,MAAM,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACvD,UAAM,KAAK,OAAO,SAAS;AAC3B,UAAM,WAAW,MAAM,KAAK;MAC1B,wBAAwB,KAAK,IAAI,EAAE,KAAK,EAAE;IAC5C;AACA,WAAO,SAAS;EAClB;;EAGA,MAAM,mBACJ,SACuB;AACvB,UAAM,WAAW,MAAM,KAAK;MAC1B;MACA;IACF;AACA,WAAO,SAAS;EAClB;;EAGA,MAAM,gBACJ,IACsE;AACtE,UAAM,WAAW,MAAM,KAAK,IAE1B,yBAAyB,EAAE,EAAE;AAC/B,WAAO,SAAS;EAClB;;EAGA,MAAM,mBACJ,IACA,SACuB;AACvB,UAAM,WAAW,MAAM,KAAK;MAC1B,yBAAyB,EAAE;MAC3B,EAAE,QAAQ,SAAS,MAAM,KAAK,UAAU,OAAO,EAAE;IACnD;AACA,WAAO,SAAS;EAClB;;EAGA,MAAM,mBAAmB,IAA2B;AAClD,UAAM,KAAK,UAAU,yBAAyB,EAAE,IAAI;MAClD,QAAQ;IACV,CAAC;EACH;;EAGA,MAAM,iBAAiB,IAAY,MAAsC;AACvE,UAAM,WAAW,MAAM,KAAK;MAC1B,yBAAyB,EAAE;MAC3B,EAAE,KAAK;IACT;AACA,WAAO,SAAS;EAClB;;EAGA,MAAM,QAAQ,IAAY,SAAwC;AAChE,UAAM,WAAW,MAAM,KAAK;MAC1B,yBAAyB,EAAE;MAC3B,EAAE,QAAQ;IACZ;AACA,WAAO,SAAS;EAClB;;EAGA,MAAM,yBAAyB,IAAgC;AAC7D,UAAM,WAAW,MAAM,KAAK;MAC1B,yBAAyB,EAAE;IAC7B;AACA,WAAO,SAAS;EAClB;;;EAKA,MAAM,iBACJ,gBACA,SACA,MACuB;AACvB,WAAO,KAAK,KAAK;MACf;MACA;MACA,SAAS,MAAM;IACjB,CAAC;EACH;;EAGA,OAAO,uBACL,gBACA,SACA,MACyC;AACzC,WAAO,KAAK,WAAW;MACrB;MACA;MACA,SAAS,MAAM;IACjB,CAAC;EACH;;EAIA,MAAc,IAAa,MAA0B;AACnD,WAAO,KAAK,UAAU,MAAM,EAAE,QAAQ,MAAM,CAAC;EAC/C;EAEA,MAAc,KAAc,MAAc,MAA2B;AACnE,WAAO,KAAK,UAAU,MAAM;MAC1B,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC3B,CAAC;EACH;EAEA,MAAc,UACZ,MACA,MACY;AACZ,UAAM,WAAW,MAAM,KAAK,SAAS,MAAM,IAAI;AAC/C,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,WAAW,mBAAmB,SAAS,MAAM;AACjD,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,YAAI,OAAO,MAAO,YAAW,OAAO;MACtC,QAAQ;AACN,mBAAW,QAAQ;MACrB;AACA,YAAM,IAAI,MAAM,QAAQ;IAC1B;AAEA,WAAO,KAAK,MAAM,IAAI;EACxB;EAEA,MAAc,SAAS,MAAc,MAAsC;AACzE,UAAM,UAAkC;MACtC,gBAAgB;IAClB;AACA,QAAI,KAAK,OAAO;AACd,cAAQ,eAAe,IAAI,UAAU,KAAK,KAAK;IACjD;AAEA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAEjE,QAAI;AACF,aAAO,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;QAC3C,GAAG;QACH,SAAS,EAAE,GAAG,SAAS,GAAI,KAAK,QAAmC;QACnE,QAAQ,WAAW;MACrB,CAAC;IACH,UAAA;AACE,mBAAa,OAAO;IACtB;EACF;AACF;","names":["createDefaultMiddlewarePipeline"]}
|
|
@@ -84,9 +84,9 @@ async function startIPCHandler(ctx) {
|
|
|
84
84
|
let daemonController = null;
|
|
85
85
|
let pendingDispatches = 0;
|
|
86
86
|
let stdinClosed = false;
|
|
87
|
-
const coreModule = await import("./dist-
|
|
88
|
-
const dbModule = await import("./dist-
|
|
89
|
-
const routerModule = await import("./dist-
|
|
87
|
+
const coreModule = await import("./dist-NTQ7LFRW.js");
|
|
88
|
+
const dbModule = await import("./dist-RUBJT7FI.js");
|
|
89
|
+
const routerModule = await import("./dist-DCJYPRUZ.js");
|
|
90
90
|
const log = (msg) => process.stderr.write(`[ipc] ${msg}
|
|
91
91
|
`);
|
|
92
92
|
process.on("uncaughtException", (err) => {
|
|
@@ -549,7 +549,7 @@ ${skillBlock}`;
|
|
|
549
549
|
}
|
|
550
550
|
// ── Workflows ─────────────────────────────────────────────
|
|
551
551
|
case "workflow.presets": {
|
|
552
|
-
const { PRESET_WORKFLOWS } = await import("./dist-
|
|
552
|
+
const { PRESET_WORKFLOWS } = await import("./dist-QFVAD45U.js");
|
|
553
553
|
sendResult(
|
|
554
554
|
req.id,
|
|
555
555
|
PRESET_WORKFLOWS.map((w) => ({
|
|
@@ -563,7 +563,7 @@ ${skillBlock}`;
|
|
|
563
563
|
}
|
|
564
564
|
case "workflow.run": {
|
|
565
565
|
const { workflowId, request: userRequest } = WorkflowRunParams.parse(params);
|
|
566
|
-
const { runWorkflow, getPresetWorkflow } = await import("./dist-
|
|
566
|
+
const { runWorkflow, getPresetWorkflow } = await import("./dist-QFVAD45U.js");
|
|
567
567
|
const { AgentManager } = await import("./dist-BTDWMPQB.js");
|
|
568
568
|
const definition = getPresetWorkflow(workflowId);
|
|
569
569
|
if (!definition) {
|
|
@@ -624,4 +624,4 @@ ${skillBlock}`;
|
|
|
624
624
|
export {
|
|
625
625
|
startIPCHandler
|
|
626
626
|
};
|
|
627
|
-
//# sourceMappingURL=handler-
|
|
627
|
+
//# sourceMappingURL=handler-CPXQZBSW.js.map
|
|
@@ -81,9 +81,9 @@ async function startIPCHandler(ctx) {
|
|
|
81
81
|
let daemonController = null;
|
|
82
82
|
let pendingDispatches = 0;
|
|
83
83
|
let stdinClosed = false;
|
|
84
|
-
const coreModule = await import("./dist-
|
|
85
|
-
const dbModule = await import("./dist-
|
|
86
|
-
const routerModule = await import("./dist-
|
|
84
|
+
const coreModule = await import("./dist-LCPM5BXN.js");
|
|
85
|
+
const dbModule = await import("./dist-S7FLVLXS.js");
|
|
86
|
+
const routerModule = await import("./dist-DXQQF55Y.js");
|
|
87
87
|
const log = (msg) => process.stderr.write(`[ipc] ${msg}
|
|
88
88
|
`);
|
|
89
89
|
process.on("uncaughtException", (err) => {
|
|
@@ -546,7 +546,7 @@ ${skillBlock}`;
|
|
|
546
546
|
}
|
|
547
547
|
// ── Workflows ─────────────────────────────────────────────
|
|
548
548
|
case "workflow.presets": {
|
|
549
|
-
const { PRESET_WORKFLOWS } = await import("./dist-
|
|
549
|
+
const { PRESET_WORKFLOWS } = await import("./dist-UETKBS6A.js");
|
|
550
550
|
sendResult(
|
|
551
551
|
req.id,
|
|
552
552
|
PRESET_WORKFLOWS.map((w) => ({
|
|
@@ -560,7 +560,7 @@ ${skillBlock}`;
|
|
|
560
560
|
}
|
|
561
561
|
case "workflow.run": {
|
|
562
562
|
const { workflowId, request: userRequest } = WorkflowRunParams.parse(params);
|
|
563
|
-
const { runWorkflow, getPresetWorkflow } = await import("./dist-
|
|
563
|
+
const { runWorkflow, getPresetWorkflow } = await import("./dist-UETKBS6A.js");
|
|
564
564
|
const { AgentManager } = await import("./dist-P5GUBEO7.js");
|
|
565
565
|
const definition = getPresetWorkflow(workflowId);
|
|
566
566
|
if (!definition) {
|
|
@@ -621,4 +621,4 @@ ${skillBlock}`;
|
|
|
621
621
|
export {
|
|
622
622
|
startIPCHandler
|
|
623
623
|
};
|
|
624
|
-
//# sourceMappingURL=handler-
|
|
624
|
+
//# sourceMappingURL=handler-FIBSROM4.js.map
|