@brainpilot/app 0.0.1

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.
Files changed (53) hide show
  1. package/dist/bin.d.ts +3 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +10 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/commands/down.d.ts +17 -0
  6. package/dist/commands/down.d.ts.map +1 -0
  7. package/dist/commands/down.js +33 -0
  8. package/dist/commands/down.js.map +1 -0
  9. package/dist/commands/init.d.ts +23 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +32 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/logs.d.ts +18 -0
  14. package/dist/commands/logs.d.ts.map +1 -0
  15. package/dist/commands/logs.js +78 -0
  16. package/dist/commands/logs.js.map +1 -0
  17. package/dist/commands/status.d.ts +26 -0
  18. package/dist/commands/status.d.ts.map +1 -0
  19. package/dist/commands/status.js +71 -0
  20. package/dist/commands/status.js.map +1 -0
  21. package/dist/commands/up.d.ts +61 -0
  22. package/dist/commands/up.d.ts.map +1 -0
  23. package/dist/commands/up.js +150 -0
  24. package/dist/commands/up.js.map +1 -0
  25. package/dist/index.d.ts +27 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +19 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/paths.d.ts +38 -0
  30. package/dist/paths.d.ts.map +1 -0
  31. package/dist/paths.js +51 -0
  32. package/dist/paths.js.map +1 -0
  33. package/dist/process-control.d.ts +33 -0
  34. package/dist/process-control.d.ts.map +1 -0
  35. package/dist/process-control.js +95 -0
  36. package/dist/process-control.js.map +1 -0
  37. package/dist/program.d.ts +30 -0
  38. package/dist/program.d.ts.map +1 -0
  39. package/dist/program.js +123 -0
  40. package/dist/program.js.map +1 -0
  41. package/dist/scaffold.d.ts +23 -0
  42. package/dist/scaffold.d.ts.map +1 -0
  43. package/dist/scaffold.js +110 -0
  44. package/dist/scaffold.js.map +1 -0
  45. package/dist/spawn-backend.d.ts +9 -0
  46. package/dist/spawn-backend.d.ts.map +1 -0
  47. package/dist/spawn-backend.js +48 -0
  48. package/dist/spawn-backend.js.map +1 -0
  49. package/dist/web-dist.d.ts +7 -0
  50. package/dist/web-dist.d.ts.map +1 -0
  51. package/dist/web-dist.js +23 -0
  52. package/dist/web-dist.js.map +1 -0
  53. package/package.json +33 -0
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * bin.ts — the `brainpilot` / `bnpt` executable entry. Thin: delegates to the
4
+ * commander program and maps thrown errors to a non-zero exit (§11A.4).
5
+ */
6
+ import { run } from "./program.js";
7
+ run(process.argv.slice(2)).catch(() => {
8
+ process.exitCode = 1;
9
+ });
10
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;IACpC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type ProcessControlDeps } from "../process-control.js";
2
+ export interface DownOptions {
3
+ dir?: string;
4
+ timeoutMs?: number;
5
+ }
6
+ export interface DownDeps extends ProcessControlDeps {
7
+ env?: Record<string, string | undefined>;
8
+ cwd?: string;
9
+ log?: (msg: string) => void;
10
+ }
11
+ export interface DownResult {
12
+ stopped: boolean;
13
+ pid: number | null;
14
+ forced: boolean;
15
+ }
16
+ export declare function down(options?: DownOptions, deps?: DownDeps): Promise<DownResult>;
17
+ //# sourceMappingURL=down.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAQA,OAAO,EAAmB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAS,SAAQ,kBAAkB;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,IAAI,CACxB,OAAO,GAAE,WAAgB,EACzB,IAAI,GAAE,QAAa,GAClB,OAAO,CAAC,UAAU,CAAC,CAuBrB"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * commands/down.ts — stop the detached backend (TS_PI_REFACTOR_DESIGN §11A.4).
3
+ * Reads `.runtime/backend.pid`, gracefully stops it (SIGTERM→SIGKILL). The
4
+ * backend's own LocalProcessOrchestrator stops the runtime child on shutdown,
5
+ * but we also clean up a stale runtime.pid if present.
6
+ */
7
+ import pc from "picocolors";
8
+ import { resolveDataDir, dataPaths } from "../paths.js";
9
+ import { stop, removePid } from "../process-control.js";
10
+ export async function down(options = {}, deps = {}) {
11
+ const log = deps.log ?? ((m) => console.log(m));
12
+ const dataDir = resolveDataDir({ dir: options.dir, env: deps.env, cwd: deps.cwd });
13
+ const p = dataPaths(dataDir);
14
+ const result = await stop(p.backendPid, {
15
+ timeoutMs: options.timeoutMs,
16
+ isAlive: deps.isAlive,
17
+ signal: deps.signal,
18
+ sleep: deps.sleep,
19
+ });
20
+ // Backend owns the runtime; clean any leftover runtime pid file regardless.
21
+ await removePid(p.runtimePid);
22
+ if (result.pid === null) {
23
+ log(pc.yellow("No running backend found (no pid file)."));
24
+ }
25
+ else if (result.forced) {
26
+ log(pc.yellow(`Backend (pid ${result.pid}) force-killed after timeout.`));
27
+ }
28
+ else {
29
+ log(pc.green(`Backend (pid ${result.pid}) stopped.`));
30
+ }
31
+ return result;
32
+ }
33
+ //# sourceMappingURL=down.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,SAAS,EAA2B,MAAM,uBAAuB,CAAC;AAmBjF,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,UAAuB,EAAE,EACzB,OAAiB,EAAE;IAEnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACnF,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAE7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IAEH,4EAA4E;IAC5E,MAAM,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAE9B,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAC5D,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,GAAG,+BAA+B,CAAC,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { writeLocalSettings } from "@brainpilot/backend-core";
2
+ export interface InitOptions {
3
+ dir?: string;
4
+ port?: number;
5
+ /** Optional API key to persist into bp_template/settings.json. */
6
+ apiKey?: string;
7
+ /** Optional model id to persist. */
8
+ model?: string;
9
+ }
10
+ export interface InitDeps {
11
+ env?: Record<string, string | undefined>;
12
+ cwd?: string;
13
+ log?: (msg: string) => void;
14
+ /** Injectable settings writer (defaults to backend-core writeLocalSettings). */
15
+ writeSettings?: typeof writeLocalSettings;
16
+ }
17
+ export interface InitResult {
18
+ dataDir: string;
19
+ created: string[];
20
+ keyPersisted: boolean;
21
+ }
22
+ export declare function init(options?: InitOptions, deps?: InitDeps): Promise<InitResult>;
23
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAI9D,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,kBAAkB,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,IAAI,CACxB,OAAO,GAAE,WAAgB,EACzB,IAAI,GAAE,QAAa,GAClB,OAAO,CAAC,UAAU,CAAC,CA8BrB"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * commands/init.ts — scaffold the launch dir + optionally persist a provider
3
+ * key, without starting anything (TS_PI_REFACTOR_DESIGN §11A.4).
4
+ */
5
+ import pc from "picocolors";
6
+ import { writeLocalSettings } from "@brainpilot/backend-core";
7
+ import { resolveDataDir } from "../paths.js";
8
+ import { scaffold } from "../scaffold.js";
9
+ export async function init(options = {}, deps = {}) {
10
+ const log = deps.log ?? ((m) => console.log(m));
11
+ const dataDir = resolveDataDir({ dir: options.dir, env: deps.env, cwd: deps.cwd });
12
+ const { created } = await scaffold(dataDir, { port: options.port });
13
+ log(created.length > 0
14
+ ? pc.green(`Initialized ${dataDir} (${created.length} files created).`)
15
+ : pc.dim(`${dataDir} already initialized — nothing to do.`));
16
+ let keyPersisted = false;
17
+ if (options.apiKey || options.model) {
18
+ const writeSettings = deps.writeSettings ?? writeLocalSettings;
19
+ await writeSettings(dataDir, {
20
+ ...(options.apiKey ? { apiKey: options.apiKey } : {}),
21
+ ...(options.model ? { model: options.model } : {}),
22
+ });
23
+ keyPersisted = Boolean(options.apiKey);
24
+ log(pc.green("Provider settings saved to bp_template/settings.json."));
25
+ }
26
+ else {
27
+ log(pc.dim("No --api-key given. Set ANTHROPIC_API_KEY in your env, " +
28
+ "or re-run `brainpilot init --api-key <key>`."));
29
+ }
30
+ return { dataDir, created, keyPersisted };
31
+ }
32
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAyB1C,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,UAAuB,EAAE,EACzB,OAAiB,EAAE;IAEnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,GAAG,CACD,OAAO,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,OAAO,KAAK,OAAO,CAAC,MAAM,kBAAkB,CAAC;QACvE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,uCAAuC,CAAC,CAC9D,CAAC;IAEF,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,kBAAkB,CAAC;QAC/D,MAAM,aAAa,CAAC,OAAO,EAAE;YAC3B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,GAAG,CACD,EAAE,CAAC,GAAG,CACJ,yDAAyD;YACvD,8CAA8C,CACjD,CACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface LogsOptions {
2
+ dir?: string;
3
+ /** Which log to read. Default `backend`. */
4
+ which?: "backend" | "runtime";
5
+ /** Number of trailing lines to print. Default 200. */
6
+ lines?: number;
7
+ /** Follow (`tail -f`). Default false. */
8
+ follow?: boolean;
9
+ }
10
+ export interface LogsDeps {
11
+ env?: Record<string, string | undefined>;
12
+ cwd?: string;
13
+ log?: (msg: string) => void;
14
+ }
15
+ /** Read the last `n` lines of a file; returns "" if the file is missing. */
16
+ export declare function tailFile(path: string, n: number): Promise<string>;
17
+ export declare function logs(options?: LogsOptions, deps?: LogsDeps): Promise<string>;
18
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,4EAA4E;AAC5E,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWvE;AAED,wBAAsB,IAAI,CACxB,OAAO,GAAE,WAAgB,EACzB,IAAI,GAAE,QAAa,GAClB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * commands/logs.ts — tail the backend/runtime logs under `.runtime/logs/`
3
+ * (TS_PI_REFACTOR_DESIGN §11A.4 / §11A.5).
4
+ */
5
+ import { readFile } from "node:fs/promises";
6
+ import { createReadStream } from "node:fs";
7
+ import { watch } from "node:fs";
8
+ import pc from "picocolors";
9
+ import { resolveDataDir, dataPaths } from "../paths.js";
10
+ /** Read the last `n` lines of a file; returns "" if the file is missing. */
11
+ export async function tailFile(path, n) {
12
+ let content;
13
+ try {
14
+ content = await readFile(path, "utf8");
15
+ }
16
+ catch {
17
+ return "";
18
+ }
19
+ const lines = content.split(/\r?\n/);
20
+ // Drop a trailing empty element from a final newline.
21
+ if (lines.length > 0 && lines[lines.length - 1] === "")
22
+ lines.pop();
23
+ return lines.slice(-n).join("\n");
24
+ }
25
+ export async function logs(options = {}, deps = {}) {
26
+ const log = deps.log ?? ((m) => console.log(m));
27
+ const dataDir = resolveDataDir({ dir: options.dir, env: deps.env, cwd: deps.cwd });
28
+ const p = dataPaths(dataDir);
29
+ const which = options.which ?? "backend";
30
+ const file = which === "runtime" ? p.runtimeLog : p.backendLog;
31
+ const lines = options.lines ?? 200;
32
+ const tail = await tailFile(file, lines);
33
+ if (tail === "") {
34
+ log(pc.yellow(`No ${which} log at ${file}.`));
35
+ }
36
+ else {
37
+ log(tail);
38
+ }
39
+ if (options.follow) {
40
+ await followFile(file, log);
41
+ }
42
+ return tail;
43
+ }
44
+ /** Follow a file, emitting appended bytes. Runs until the process exits. */
45
+ async function followFile(file, emit) {
46
+ let pos = (await safeSize(file)) ?? 0;
47
+ await new Promise(() => {
48
+ const watcher = watch(file, { persistent: true }, async () => {
49
+ const size = (await safeSize(file)) ?? pos;
50
+ if (size < pos)
51
+ pos = 0; // truncated/rotated
52
+ if (size > pos) {
53
+ const stream = createReadStream(file, { start: pos, end: size - 1, encoding: "utf8" });
54
+ let chunk = "";
55
+ for await (const part of stream)
56
+ chunk += part;
57
+ if (chunk)
58
+ emit(chunk.replace(/\n$/, ""));
59
+ pos = size;
60
+ }
61
+ });
62
+ // never resolves — Ctrl-C ends the process; ensure cleanup on signals.
63
+ process.once("SIGINT", () => {
64
+ watcher.close();
65
+ process.exit(0);
66
+ });
67
+ });
68
+ }
69
+ async function safeSize(file) {
70
+ try {
71
+ const { stat } = await import("node:fs/promises");
72
+ return (await stat(file)).size;
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type ProcessControlDeps } from "../process-control.js";
2
+ export interface StatusOptions {
3
+ dir?: string;
4
+ port?: number;
5
+ }
6
+ export interface StatusDeps extends ProcessControlDeps {
7
+ env?: Record<string, string | undefined>;
8
+ cwd?: string;
9
+ log?: (msg: string) => void;
10
+ /** Injectable fetch for health/metrics. Defaults to global fetch. */
11
+ fetchFn?: typeof fetch;
12
+ }
13
+ export interface StatusReport {
14
+ running: boolean;
15
+ pid: number | null;
16
+ backendPort: number;
17
+ runtimePort: number;
18
+ url: string;
19
+ healthy: boolean;
20
+ metrics?: {
21
+ activeSessions?: number;
22
+ runningAgents?: number;
23
+ };
24
+ }
25
+ export declare function status(options?: StatusOptions, deps?: StatusDeps): Promise<StatusReport>;
26
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGpF,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAW,SAAQ,kBAAkB;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,qEAAqE;IACrE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,wBAAsB,MAAM,CAC1B,OAAO,GAAE,aAAkB,EAC3B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,YAAY,CAAC,CA4DvB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * commands/status.ts — report process liveness + ports + health/metrics
3
+ * (TS_PI_REFACTOR_DESIGN §11A.4). Reads the backend pid file, probes
4
+ * GET /health and GET /metrics on the backend.
5
+ */
6
+ import pc from "picocolors";
7
+ import { resolveDataDir, dataPaths } from "../paths.js";
8
+ import { readPid, isRunning } from "../process-control.js";
9
+ import { DEFAULT_PORT } from "../scaffold.js";
10
+ export async function status(options = {}, deps = {}) {
11
+ const log = deps.log ?? ((m) => console.log(m));
12
+ const env = deps.env ?? process.env;
13
+ const fetchFn = deps.fetchFn ?? fetch;
14
+ const dataDir = resolveDataDir({ dir: options.dir, env, cwd: deps.cwd });
15
+ const p = dataPaths(dataDir);
16
+ const port = options.port ?? (Number(env.BP_PORT) || DEFAULT_PORT);
17
+ const host = "127.0.0.1";
18
+ const url = `http://${host}:${port}`;
19
+ const pid = await readPid(p.backendPid);
20
+ const running = await isRunning(p.backendPid, { isAlive: deps.isAlive });
21
+ let healthy = false;
22
+ let metrics;
23
+ if (running) {
24
+ try {
25
+ const h = await fetchFn(`${url}/api/health`);
26
+ healthy = h.ok;
27
+ }
28
+ catch {
29
+ healthy = false;
30
+ }
31
+ try {
32
+ const m = await fetchFn(`${url}/api/metrics`);
33
+ if (m.ok) {
34
+ const body = (await m.json());
35
+ metrics = {
36
+ activeSessions: numOrUndef(body.activeSessions),
37
+ runningAgents: numOrUndef(body.runningAgents),
38
+ };
39
+ }
40
+ }
41
+ catch {
42
+ // metrics optional
43
+ }
44
+ }
45
+ const report = {
46
+ running,
47
+ pid,
48
+ backendPort: port,
49
+ runtimePort: port + 1,
50
+ url,
51
+ healthy,
52
+ ...(metrics ? { metrics } : {}),
53
+ };
54
+ if (!running) {
55
+ log(pc.yellow("BrainPilot is not running."));
56
+ }
57
+ else {
58
+ log(pc.green(`BrainPilot running (pid ${pid}) at ${url}`));
59
+ log(` backend port: ${report.backendPort} runtime port: ${report.runtimePort}`);
60
+ log(` health: ${healthy ? pc.green("ok") : pc.red("unreachable")}`);
61
+ if (metrics) {
62
+ log(` sessions: ${metrics.activeSessions ?? "?"} ` +
63
+ `running agents: ${metrics.runningAgents ?? "?"}`);
64
+ }
65
+ }
66
+ return report;
67
+ }
68
+ function numOrUndef(v) {
69
+ return typeof v === "number" ? v : undefined;
70
+ }
71
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { StartServerOptions, RunningServer } from "@brainpilot/backend-core";
2
+ export interface UpOptions {
3
+ /** `--dir <path>` data root. */
4
+ dir?: string;
5
+ /** `--port <n>` backend port (runtime = port+1). */
6
+ port?: number;
7
+ /** `--foreground` run the backend in-process (default true for tests). */
8
+ foreground?: boolean;
9
+ /** `--no-open` to suppress the browser. */
10
+ open?: boolean;
11
+ }
12
+ /** Injectable collaborators (defaults wire to real implementations). */
13
+ export interface UpDeps {
14
+ env?: Record<string, string | undefined>;
15
+ cwd?: string;
16
+ /** Start the backend in-process. Defaults to backend-core `startServer`. */
17
+ startServer?: (opts: StartServerOptions) => Promise<RunningServer>;
18
+ /** Spawn a detached backend child. Required when `foreground` is false. */
19
+ spawnDetached?: (opts: ResolvedUpConfig) => Promise<number>;
20
+ /** Probe whether a TCP port is free. Defaults to a real net check. */
21
+ isPortFree?: (port: number, host: string) => Promise<boolean>;
22
+ /** Open a URL in the browser. Defaults to the OS launcher (open/start/xdg-open). */
23
+ openBrowser?: (url: string) => Promise<void>;
24
+ /** Resolve the web dist dir. Defaults to `resolveWebDist()`. */
25
+ webDist?: () => string | null;
26
+ log?: (msg: string) => void;
27
+ }
28
+ /** The fully-resolved config `up` computes before starting anything. */
29
+ export interface ResolvedUpConfig {
30
+ dataDir: string;
31
+ port: number;
32
+ runtimePort: number;
33
+ host: string;
34
+ webDist: string | null;
35
+ foreground: boolean;
36
+ open: boolean;
37
+ }
38
+ /** Build the StartServerOptions from resolved config — exposed for tests. */
39
+ export declare function buildStartServerOptions(cfg: ResolvedUpConfig): StartServerOptions;
40
+ export declare class ProviderKeyError extends Error {
41
+ readonly dataDir: string;
42
+ constructor(dataDir: string);
43
+ }
44
+ export declare class PortInUseError extends Error {
45
+ readonly port: number;
46
+ constructor(port: number);
47
+ }
48
+ export interface UpResult {
49
+ config: ResolvedUpConfig;
50
+ url: string;
51
+ /** Present only in foreground mode — the in-process server handle. */
52
+ server?: RunningServer;
53
+ /** Present only in detached mode — the backend child pid. */
54
+ pid?: number;
55
+ }
56
+ /**
57
+ * Run the `up` command. Returns once the backend is started (foreground: the
58
+ * server handle; detached: the child pid + pid file written).
59
+ */
60
+ export declare function up(options?: UpOptions, deps?: UpDeps): Promise<UpResult>;
61
+ //# sourceMappingURL=up.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAOlF,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wEAAwE;AACxE,MAAM,WAAW,MAAM;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACnE,2EAA2E;IAC3E,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,sEAAsE;IACtE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,oFAAoF;IACpF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,gBAAgB,GACpB,kBAAkB,CASpB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aACb,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;CAQ5C;AAED,qBAAa,cAAe,SAAQ,KAAK;aACX,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAQzC;AAYD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,EAAE,CACtB,OAAO,GAAE,SAAc,EACvB,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,QAAQ,CAAC,CA8DnB"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * commands/up.ts — the main command (TS_PI_REFACTOR_DESIGN §11A.4).
3
+ *
4
+ * Sequence:
5
+ * 1. resolve config (dir/port/env)
6
+ * 2. scaffold bp_template if absent (idempotent)
7
+ * 3. resolve provider key (env > bp_template/settings.json > config > .env);
8
+ * error with guidance if none
9
+ * 4. pre-check the backend + runtime ports are free
10
+ * 5. start the backend (foreground in-process, or detached child)
11
+ * — backend itself spawns the runtime via LocalProcessOrchestrator
12
+ * 6. print URL (+ optionally open browser)
13
+ *
14
+ * Everything external (startServer, port probing, browser open, child spawn)
15
+ * is injectable so tests drive it without a real server.
16
+ */
17
+ import { resolveProvider } from "@brainpilot/backend-core";
18
+ import pc from "picocolors";
19
+ import { resolveDataDir, dataPaths } from "../paths.js";
20
+ import { scaffold, isScaffolded, DEFAULT_PORT } from "../scaffold.js";
21
+ import { writePid } from "../process-control.js";
22
+ import { resolveWebDist } from "../web-dist.js";
23
+ /** Build the StartServerOptions from resolved config — exposed for tests. */
24
+ export function buildStartServerOptions(cfg) {
25
+ return {
26
+ port: cfg.port,
27
+ hostname: cfg.host,
28
+ dataDir: cfg.dataDir,
29
+ serveWeb: cfg.webDist !== null,
30
+ ...(cfg.webDist ? { webRoot: cfg.webDist } : {}),
31
+ // The backend creates a LocalProcessOrchestrator from env (BP_MODE=single).
32
+ };
33
+ }
34
+ export class ProviderKeyError extends Error {
35
+ dataDir;
36
+ constructor(dataDir) {
37
+ super("No provider API key found.\n" +
38
+ " Set ANTHROPIC_API_KEY in your environment, or run `brainpilot init`,\n" +
39
+ ` or add it to ${dataDir}/bp_template/settings.json or ${dataDir}/.env.`);
40
+ this.dataDir = dataDir;
41
+ this.name = "ProviderKeyError";
42
+ }
43
+ }
44
+ export class PortInUseError extends Error {
45
+ port;
46
+ constructor(port) {
47
+ super(`Port ${port} is already in use.\n` +
48
+ " Choose another with `brainpilot up --port <n>` " +
49
+ "(the runtime uses port+1).");
50
+ this.port = port;
51
+ this.name = "PortInUseError";
52
+ }
53
+ }
54
+ const realIsPortFree = async (port, host) => {
55
+ const net = await import("node:net");
56
+ return new Promise((resolve) => {
57
+ const srv = net.createServer();
58
+ srv.once("error", () => resolve(false));
59
+ srv.once("listening", () => srv.close(() => resolve(true)));
60
+ srv.listen(port, host);
61
+ });
62
+ };
63
+ /**
64
+ * Run the `up` command. Returns once the backend is started (foreground: the
65
+ * server handle; detached: the child pid + pid file written).
66
+ */
67
+ export async function up(options = {}, deps = {}) {
68
+ const env = deps.env ?? process.env;
69
+ const log = deps.log ?? ((m) => console.log(m));
70
+ const isPortFree = deps.isPortFree ?? realIsPortFree;
71
+ const webDistFn = deps.webDist ?? (() => resolveWebDist());
72
+ // 1. Resolve config.
73
+ const dataDir = resolveDataDir({ dir: options.dir, env, cwd: deps.cwd });
74
+ const port = options.port ?? (Number(env.BP_PORT) || DEFAULT_PORT);
75
+ const host = "127.0.0.1";
76
+ const foreground = options.foreground ?? false;
77
+ const open = options.open ?? true;
78
+ const cfg = {
79
+ dataDir,
80
+ port,
81
+ runtimePort: port + 1,
82
+ host,
83
+ webDist: webDistFn(),
84
+ foreground,
85
+ open,
86
+ };
87
+ // 2. Scaffold if absent (idempotent).
88
+ if (!(await isScaffolded(dataDir))) {
89
+ log(pc.dim(`Scaffolding ${dataDir} ...`));
90
+ await scaffold(dataDir, { port });
91
+ }
92
+ // 3. Resolve provider key.
93
+ const provider = await resolveProvider({ dataDir, env });
94
+ if (!provider.apiKey) {
95
+ throw new ProviderKeyError(dataDir);
96
+ }
97
+ // 4. Pre-check ports (backend + runtime, §11A.5).
98
+ for (const p of [cfg.port, cfg.runtimePort]) {
99
+ if (!(await isPortFree(p, host)))
100
+ throw new PortInUseError(p);
101
+ }
102
+ const url = `http://${host}:${cfg.port}`;
103
+ // 5. Start the backend.
104
+ if (foreground) {
105
+ const start = deps.startServer ?? (await defaultStartServer());
106
+ const server = await start(buildStartServerOptions(cfg));
107
+ log(pc.green(`BrainPilot backend running at ${pc.bold(url)}`));
108
+ if (open)
109
+ await maybeOpen(deps, url);
110
+ return { config: cfg, url, server };
111
+ }
112
+ // Detached.
113
+ if (!deps.spawnDetached) {
114
+ throw new Error("Detached `up` requires a spawnDetached hook (none provided).");
115
+ }
116
+ const pid = await deps.spawnDetached(cfg);
117
+ await writePid(dataPaths(dataDir).backendPid, pid);
118
+ log(pc.green(`BrainPilot backend started (pid ${pid}) at ${pc.bold(url)}`));
119
+ if (open)
120
+ await maybeOpen(deps, url);
121
+ return { config: cfg, url, pid };
122
+ }
123
+ async function maybeOpen(deps, url) {
124
+ const open = deps.openBrowser ?? defaultOpenBrowser;
125
+ try {
126
+ await open(url);
127
+ }
128
+ catch {
129
+ /* opening the browser is best-effort; never fail `up` over it */
130
+ }
131
+ }
132
+ /** Open a URL in the OS default browser using the platform launcher (no deps). */
133
+ const defaultOpenBrowser = async (url) => {
134
+ const { spawn } = await import("node:child_process");
135
+ const platform = process.platform;
136
+ const [cmd, args] = platform === "darwin"
137
+ ? ["open", [url]]
138
+ : platform === "win32"
139
+ ? ["cmd", ["/c", "start", "", url]]
140
+ : ["xdg-open", [url]];
141
+ const child = spawn(cmd, args, { stdio: "ignore", detached: true });
142
+ child.on("error", () => { }); // launcher missing (e.g. headless Linux) — ignore
143
+ child.unref();
144
+ };
145
+ /** Lazy import of backend-core startServer (keeps it out of the hot path/tests). */
146
+ async function defaultStartServer() {
147
+ const mod = await import("@brainpilot/backend-core");
148
+ return mod.startServer;
149
+ }
150
+ //# sourceMappingURL=up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @brainpilot/cli — Docker-free local one-click launch (§11A).
3
+ *
4
+ * Public surface: the command functions (for programmatic/test use) plus a
5
+ * `run(argv)` that drives the commander program.
6
+ */
7
+ export { up, buildStartServerOptions, ProviderKeyError, PortInUseError } from "./commands/up.js";
8
+ export type { UpOptions, UpDeps, UpResult, ResolvedUpConfig } from "./commands/up.js";
9
+ export { down } from "./commands/down.js";
10
+ export type { DownOptions, DownDeps, DownResult } from "./commands/down.js";
11
+ export { status } from "./commands/status.js";
12
+ export type { StatusOptions, StatusDeps, StatusReport } from "./commands/status.js";
13
+ export { init } from "./commands/init.js";
14
+ export type { InitOptions, InitDeps, InitResult } from "./commands/init.js";
15
+ export { logs, tailFile } from "./commands/logs.js";
16
+ export type { LogsOptions, LogsDeps } from "./commands/logs.js";
17
+ export { resolveDataDir, dataPaths, resolvePaths, DEFAULT_DATA_DIR_NAME, } from "./paths.js";
18
+ export type { DataPaths, ResolveDataDirOptions } from "./paths.js";
19
+ export { scaffold, isScaffolded, DEFAULT_PORT } from "./scaffold.js";
20
+ export type { ScaffoldOptions, ScaffoldResult } from "./scaffold.js";
21
+ export { writePid, readPid, removePid, isRunning, stop, } from "./process-control.js";
22
+ export type { ProcessControlDeps, StopResult } from "./process-control.js";
23
+ export { resolveWebDist } from "./web-dist.js";
24
+ export { spawnDetachedBackend, resolveBackendServerPath } from "./spawn-backend.js";
25
+ export { buildProgram, run } from "./program.js";
26
+ export declare const CLI_NAME = "@brainpilot/cli";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,EAAE,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjG,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EACL,cAAc,EACd,SAAS,EACT,YAAY,EACZ,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,IAAI,GACL,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEpF,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,QAAQ,oBAAoB,CAAC"}