@schlessera/brain-ui-server 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/agent/backend.d.ts +31 -10
- package/dist/agent/backend.d.ts.map +1 -1
- package/dist/agent/backend.js +92 -28
- package/dist/agent/backend.js.map +1 -1
- package/dist/app.d.ts +9 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +80 -18
- package/dist/app.js.map +1 -1
- package/dist/config/env-core.d.ts +73 -0
- package/dist/config/env-core.d.ts.map +1 -0
- package/dist/config/env-core.js +62 -0
- package/dist/config/env-core.js.map +1 -0
- package/dist/config/env.d.ts +27 -5
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +90 -10
- package/dist/config/env.js.map +1 -1
- package/dist/cron/scheduler.d.ts +20 -0
- package/dist/cron/scheduler.d.ts.map +1 -1
- package/dist/cron/scheduler.js +43 -8
- package/dist/cron/scheduler.js.map +1 -1
- package/dist/db/client.d.ts +10 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +5 -14
- package/dist/db/client.js.map +1 -1
- package/dist/db/settings.d.ts +3 -2
- package/dist/db/settings.d.ts.map +1 -1
- package/dist/db/settings.js +8 -4
- package/dist/db/settings.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/auth.d.ts +8 -2
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +74 -10
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/passkeys.d.ts +10 -0
- package/dist/middleware/passkeys.d.ts.map +1 -1
- package/dist/middleware/passkeys.js +19 -3
- package/dist/middleware/passkeys.js.map +1 -1
- package/dist/observability/index.d.ts +73 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +74 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/loggers.d.ts +62 -0
- package/dist/observability/loggers.d.ts.map +1 -0
- package/dist/observability/loggers.js +109 -0
- package/dist/observability/loggers.js.map +1 -0
- package/dist/observability/meter.d.ts +39 -0
- package/dist/observability/meter.d.ts.map +1 -0
- package/dist/observability/meter.js +95 -0
- package/dist/observability/meter.js.map +1 -0
- package/dist/observability/types.d.ts +67 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +44 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/routes/brain.d.ts.map +1 -1
- package/dist/routes/brain.js +9 -1
- package/dist/routes/brain.js.map +1 -1
- package/dist/routes/files.d.ts +2 -0
- package/dist/routes/files.d.ts.map +1 -1
- package/dist/routes/files.js +7 -7
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/graph.d.ts +2 -0
- package/dist/routes/graph.d.ts.map +1 -1
- package/dist/routes/graph.js +7 -7
- package/dist/routes/graph.js.map +1 -1
- package/dist/routes/health.d.ts +7 -14
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +25 -6
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/models.d.ts +3 -0
- package/dist/routes/models.d.ts.map +1 -1
- package/dist/routes/models.js +5 -1
- package/dist/routes/models.js.map +1 -1
- package/dist/routes/render.d.ts +2 -1
- package/dist/routes/render.d.ts.map +1 -1
- package/dist/routes/render.js +2 -2
- package/dist/routes/render.js.map +1 -1
- package/dist/routes/share.d.ts +3 -0
- package/dist/routes/share.d.ts.map +1 -1
- package/dist/routes/share.js +5 -5
- package/dist/routes/share.js.map +1 -1
- package/dist/share/staging.d.ts +3 -2
- package/dist/share/staging.d.ts.map +1 -1
- package/dist/share/staging.js +12 -4
- package/dist/share/staging.js.map +1 -1
- package/dist/voice/keyterm-builder.d.ts +4 -1
- package/dist/voice/keyterm-builder.d.ts.map +1 -1
- package/dist/voice/keyterm-builder.js +15 -8
- package/dist/voice/keyterm-builder.js.map +1 -1
- package/dist/ws/bridge.d.ts.map +1 -1
- package/dist/ws/bridge.js +23 -3
- package/dist/ws/bridge.js.map +1 -1
- package/dist/ws/clients.d.ts +10 -3
- package/dist/ws/clients.d.ts.map +1 -1
- package/dist/ws/clients.js +16 -4
- package/dist/ws/clients.js.map +1 -1
- package/dist/ws/connection.d.ts +15 -0
- package/dist/ws/connection.d.ts.map +1 -1
- package/dist/ws/connection.js +66 -10
- package/dist/ws/connection.js.map +1 -1
- package/dist/ws/dispatch.d.ts +22 -1
- package/dist/ws/dispatch.d.ts.map +1 -1
- package/dist/ws/dispatch.js +36 -16
- package/dist/ws/dispatch.js.map +1 -1
- package/dist/ws/host.d.ts +73 -0
- package/dist/ws/host.d.ts.map +1 -1
- package/dist/ws/host.js +127 -1
- package/dist/ws/host.js.map +1 -1
- package/dist/ws/rate-limit.d.ts +58 -0
- package/dist/ws/rate-limit.d.ts.map +1 -0
- package/dist/ws/rate-limit.js +62 -0
- package/dist/ws/rate-limit.js.map +1 -0
- package/dist/ws/run-session.d.ts +3 -0
- package/dist/ws/run-session.d.ts.map +1 -1
- package/dist/ws/run-session.js +49 -9
- package/dist/ws/run-session.js.map +1 -1
- package/dist/ws/session-catalog.d.ts +2 -1
- package/dist/ws/session-catalog.d.ts.map +1 -1
- package/dist/ws/session-catalog.js +20 -3
- package/dist/ws/session-catalog.js.map +1 -1
- package/dist/ws/turns.d.ts +21 -0
- package/dist/ws/turns.d.ts.map +1 -1
- package/dist/ws/turns.js +11 -1
- package/dist/ws/turns.js.map +1 -1
- package/package.json +9 -6
- package/src/agent/backend.ts +131 -35
- package/src/app.ts +97 -18
- package/src/config/env-core.ts +93 -0
- package/src/config/env.ts +116 -15
- package/src/cron/scheduler.ts +61 -16
- package/src/db/client.ts +16 -5
- package/src/db/settings.ts +9 -4
- package/src/index.ts +43 -2
- package/src/middleware/auth.ts +80 -15
- package/src/middleware/passkeys.ts +29 -5
- package/src/observability/index.ts +150 -0
- package/src/observability/loggers.ts +174 -0
- package/src/observability/meter.ts +190 -0
- package/src/observability/types.ts +101 -0
- package/src/routes/brain.ts +10 -1
- package/src/routes/files.ts +9 -8
- package/src/routes/graph.ts +9 -8
- package/src/routes/health.ts +29 -6
- package/src/routes/models.ts +8 -5
- package/src/routes/render.ts +3 -2
- package/src/routes/share.ts +17 -10
- package/src/share/staging.ts +18 -4
- package/src/voice/keyterm-builder.ts +19 -10
- package/src/ws/bridge.ts +22 -6
- package/src/ws/clients.ts +24 -6
- package/src/ws/connection.ts +73 -13
- package/src/ws/dispatch.ts +47 -16
- package/src/ws/host.ts +164 -1
- package/src/ws/rate-limit.ts +86 -0
- package/src/ws/run-session.ts +57 -14
- package/src/ws/session-catalog.ts +21 -3
- package/src/ws/turns.ts +27 -3
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared core of every package's environment chokepoint — a SYNC-ENFORCED
|
|
3
|
+
* COPY, not a package.
|
|
4
|
+
*
|
|
5
|
+
* This file exists byte-identically as `src/config/env-core.ts` in every
|
|
6
|
+
* package that has an env chokepoint (`src/config/env.ts`), and the root test
|
|
7
|
+
* `tests/env-core-sync.test.ts` fails the build when any copy differs. To
|
|
8
|
+
* change it: edit ONE copy, copy the file verbatim into every package that
|
|
9
|
+
* has one (each `src/config/env-core.ts`), and rerun the sync test.
|
|
10
|
+
*
|
|
11
|
+
* Why a copy and not a `@schlessera/brain-env` package: the repo adds a seam
|
|
12
|
+
* only where a second implementation is plausible (docs/extending/README.md),
|
|
13
|
+
* and a new package for four fields and three small functions would churn the
|
|
14
|
+
* release manifest and every dependent's dependency list. Byte-equality
|
|
15
|
+
* enforced by a test gives the same single-source-of-truth guarantee without
|
|
16
|
+
* the edge. (`scripts/env-docs.ts` imports the canonical copy in
|
|
17
|
+
* `packages/core` directly — it is a root script, not published code.)
|
|
18
|
+
*
|
|
19
|
+
* What belongs here: the descriptor contract the env-docs generator and the
|
|
20
|
+
* env-parity gate consume, the dynamic-read escape hatch, and the boolean
|
|
21
|
+
* parsing helpers. What does NOT belong here: `resolveEnv` — each package's
|
|
22
|
+
* resolver reads its own variables into its own shape and stays in that
|
|
23
|
+
* package's `env.ts`.
|
|
24
|
+
*/
|
|
25
|
+
/** One environment variable a package reads. */
|
|
26
|
+
export interface EnvVarSpec {
|
|
27
|
+
/** Variable name as it appears in the environment. */
|
|
28
|
+
name: string;
|
|
29
|
+
/** What it controls. */
|
|
30
|
+
description: string;
|
|
31
|
+
/**
|
|
32
|
+
* Behaviour when the variable is unset. Omitted or null when there is no
|
|
33
|
+
* meaningful default to state.
|
|
34
|
+
*/
|
|
35
|
+
default?: string | null;
|
|
36
|
+
/**
|
|
37
|
+
* `true` when the package cannot do its job at all without it, `false`
|
|
38
|
+
* when optional; a string states the CONDITION under which it becomes
|
|
39
|
+
* required (e.g. "AUTH_MODE=password") — flattening that to a boolean
|
|
40
|
+
* would lose the only part a reader needs.
|
|
41
|
+
*/
|
|
42
|
+
required: boolean | string;
|
|
43
|
+
}
|
|
44
|
+
/** A family of reads whose variable NAME is data, not code. */
|
|
45
|
+
export interface DynamicEnvReadSpec {
|
|
46
|
+
/** Where the variable name comes from. */
|
|
47
|
+
source: string;
|
|
48
|
+
/** What the value is used for. */
|
|
49
|
+
description: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Call-time read of a single variable whose name is data (see the package's
|
|
53
|
+
* `DYNAMIC_ENV_READS`) or whose presence gates a feature. Never cache the
|
|
54
|
+
* result at module scope.
|
|
55
|
+
*/
|
|
56
|
+
export declare function readEnvVar(name: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* The one way a token-valued boolean environment variable is parsed.
|
|
59
|
+
*
|
|
60
|
+
* Truthy: 1 / true / on / yes. Falsy: 0 / false / off / no. Matching is
|
|
61
|
+
* case-insensitive after trimming. Unset, empty, or any unrecognised token
|
|
62
|
+
* returns `defaultValue` — a typo in a flag must never silently flip a
|
|
63
|
+
* behaviour; it falls back to the documented default instead.
|
|
64
|
+
*/
|
|
65
|
+
export declare function envFlag(value: string | undefined, defaultValue: boolean): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Presence-based boolean: set to ANY non-empty value means on. This is the
|
|
68
|
+
* `NO_COLOR` convention (https://no-color.org) — `NO_COLOR=0` still disables
|
|
69
|
+
* color — so it must NOT go through `envFlag`. Use only for variables whose
|
|
70
|
+
* documented contract is presence, not a token.
|
|
71
|
+
*/
|
|
72
|
+
export declare function envPresent(value: string | undefined): boolean;
|
|
73
|
+
//# sourceMappingURL=env-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-core.d.ts","sourceRoot":"","sources":["../../src/config/env-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;CAC5B;AAED,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAEpB;AAKD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAMjF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE7D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared core of every package's environment chokepoint — a SYNC-ENFORCED
|
|
3
|
+
* COPY, not a package.
|
|
4
|
+
*
|
|
5
|
+
* This file exists byte-identically as `src/config/env-core.ts` in every
|
|
6
|
+
* package that has an env chokepoint (`src/config/env.ts`), and the root test
|
|
7
|
+
* `tests/env-core-sync.test.ts` fails the build when any copy differs. To
|
|
8
|
+
* change it: edit ONE copy, copy the file verbatim into every package that
|
|
9
|
+
* has one (each `src/config/env-core.ts`), and rerun the sync test.
|
|
10
|
+
*
|
|
11
|
+
* Why a copy and not a `@schlessera/brain-env` package: the repo adds a seam
|
|
12
|
+
* only where a second implementation is plausible (docs/extending/README.md),
|
|
13
|
+
* and a new package for four fields and three small functions would churn the
|
|
14
|
+
* release manifest and every dependent's dependency list. Byte-equality
|
|
15
|
+
* enforced by a test gives the same single-source-of-truth guarantee without
|
|
16
|
+
* the edge. (`scripts/env-docs.ts` imports the canonical copy in
|
|
17
|
+
* `packages/core` directly — it is a root script, not published code.)
|
|
18
|
+
*
|
|
19
|
+
* What belongs here: the descriptor contract the env-docs generator and the
|
|
20
|
+
* env-parity gate consume, the dynamic-read escape hatch, and the boolean
|
|
21
|
+
* parsing helpers. What does NOT belong here: `resolveEnv` — each package's
|
|
22
|
+
* resolver reads its own variables into its own shape and stays in that
|
|
23
|
+
* package's `env.ts`.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Call-time read of a single variable whose name is data (see the package's
|
|
27
|
+
* `DYNAMIC_ENV_READS`) or whose presence gates a feature. Never cache the
|
|
28
|
+
* result at module scope.
|
|
29
|
+
*/
|
|
30
|
+
export function readEnvVar(name, env = process.env) {
|
|
31
|
+
return env[name];
|
|
32
|
+
}
|
|
33
|
+
const TRUTHY_TOKENS = ["1", "true", "on", "yes"];
|
|
34
|
+
const FALSY_TOKENS = ["0", "false", "off", "no"];
|
|
35
|
+
/**
|
|
36
|
+
* The one way a token-valued boolean environment variable is parsed.
|
|
37
|
+
*
|
|
38
|
+
* Truthy: 1 / true / on / yes. Falsy: 0 / false / off / no. Matching is
|
|
39
|
+
* case-insensitive after trimming. Unset, empty, or any unrecognised token
|
|
40
|
+
* returns `defaultValue` — a typo in a flag must never silently flip a
|
|
41
|
+
* behaviour; it falls back to the documented default instead.
|
|
42
|
+
*/
|
|
43
|
+
export function envFlag(value, defaultValue) {
|
|
44
|
+
if (value === undefined)
|
|
45
|
+
return defaultValue;
|
|
46
|
+
const token = value.trim().toLowerCase();
|
|
47
|
+
if (TRUTHY_TOKENS.includes(token))
|
|
48
|
+
return true;
|
|
49
|
+
if (FALSY_TOKENS.includes(token))
|
|
50
|
+
return false;
|
|
51
|
+
return defaultValue;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Presence-based boolean: set to ANY non-empty value means on. This is the
|
|
55
|
+
* `NO_COLOR` convention (https://no-color.org) — `NO_COLOR=0` still disables
|
|
56
|
+
* color — so it must NOT go through `envFlag`. Use only for variables whose
|
|
57
|
+
* documented contract is presence, not a token.
|
|
58
|
+
*/
|
|
59
|
+
export function envPresent(value) {
|
|
60
|
+
return value !== undefined && value !== "";
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=env-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-core.js","sourceRoot":"","sources":["../../src/config/env-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AA8BH;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,aAAa,GAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACpE,MAAM,YAAY,GAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,KAAyB,EAAE,YAAqB;IACtE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC;AAC7C,CAAC"}
|
package/dist/config/env.d.ts
CHANGED
|
@@ -12,17 +12,27 @@
|
|
|
12
12
|
* touches `process.env` itself. Tests vary configuration by passing their own
|
|
13
13
|
* env record to the resolver — no global mutation required.
|
|
14
14
|
*/
|
|
15
|
+
import { type Severity } from "../observability/types.js";
|
|
16
|
+
/**
|
|
17
|
+
* The shared descriptor contract (sync-enforced copy in ./env-core.ts),
|
|
18
|
+
* under the name this package has always exported. This package's entries
|
|
19
|
+
* use the `string` arm of `required` for conditionally-required variables
|
|
20
|
+
* (e.g. "AUTH_MODE=password") and `null` for "no default".
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* One environment variable the server reads.
|
|
24
|
+
*
|
|
25
|
+
* Deliberately LOCAL and narrower than env-core's EnvVarSpec: this is the
|
|
26
|
+
* package's published descriptor shape, and widening it to the shared
|
|
27
|
+
* union would be a breaking change for typed consumers of ENV_VARS.
|
|
28
|
+
*/
|
|
15
29
|
export interface EnvVarDescriptor {
|
|
16
|
-
/**
|
|
30
|
+
/** Variable name as it appears in the environment. */
|
|
17
31
|
name: string;
|
|
18
32
|
/** What it controls. */
|
|
19
33
|
description: string;
|
|
20
34
|
/** Human-readable default applied when unset, or null when there is none. */
|
|
21
35
|
default: string | null;
|
|
22
|
-
/**
|
|
23
|
-
* `false` when optional; otherwise a human-readable statement of the
|
|
24
|
-
* condition under which boot fails without it.
|
|
25
|
-
*/
|
|
26
36
|
required: false | string;
|
|
27
37
|
}
|
|
28
38
|
/**
|
|
@@ -57,6 +67,11 @@ export interface WebAuthnConfig {
|
|
|
57
67
|
export interface AgentConfig {
|
|
58
68
|
/** Trimmed, lowercased AGENT_BACKEND; null when unset (defaults to claude). */
|
|
59
69
|
backend: string | null;
|
|
70
|
+
/**
|
|
71
|
+
* Bash-confirmation regex sources; null means "use the backend's defaults".
|
|
72
|
+
* An empty array is a deliberate opt-out and is passed through as such.
|
|
73
|
+
*/
|
|
74
|
+
confirmBashPatterns: string[] | null;
|
|
60
75
|
claudeCodePath: string;
|
|
61
76
|
defaultModel: string;
|
|
62
77
|
/** Raw BRAIN_UI_CLAUDE_PROFILES JSON, parsed lazily by the registry. */
|
|
@@ -81,6 +96,13 @@ export interface ServerConfig {
|
|
|
81
96
|
sourceCommit: string;
|
|
82
97
|
allowedOrigins: string[];
|
|
83
98
|
maxConcurrentSessions: number;
|
|
99
|
+
/** Threshold for the console log consumer (BRAIN_UI_LOG_LEVEL). */
|
|
100
|
+
logLevel: Severity;
|
|
101
|
+
/** Inbound WebSocket frame metering, per connection. */
|
|
102
|
+
wsRate: {
|
|
103
|
+
ratePerSecond: number;
|
|
104
|
+
burst: number;
|
|
105
|
+
};
|
|
84
106
|
auth: AuthConfig;
|
|
85
107
|
webauthn: WebAuthnConfig;
|
|
86
108
|
agent: AgentConfig;
|
package/dist/config/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
package/dist/config/env.js
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* env record to the resolver — no global mutation required.
|
|
14
14
|
*/
|
|
15
15
|
import { join } from "path";
|
|
16
|
+
import { SEVERITIES } from "../observability/types.js";
|
|
17
|
+
import { envFlag } from "./env-core.js";
|
|
16
18
|
/**
|
|
17
19
|
* Every environment variable this package reads. Order groups by concern.
|
|
18
20
|
* The env-parity gate (G4) asserts this list equals the package's env
|
|
@@ -44,6 +46,40 @@ export const ENV_VARS = [
|
|
|
44
46
|
default: "(empty)",
|
|
45
47
|
required: false,
|
|
46
48
|
},
|
|
49
|
+
{
|
|
50
|
+
name: "BRAIN_UI_CONFIRM_BASH",
|
|
51
|
+
description: "JSON array of regex sources; a Bash command matching any of them raises " +
|
|
52
|
+
"a confirmation card before it runs. Unset uses the shipped defaults " +
|
|
53
|
+
"(brain archive, rm -r, git push --force, git reset --hard, git clean -f, " +
|
|
54
|
+
"git checkout -- ). An empty array [] disables the confirmation. Not a " +
|
|
55
|
+
"security boundary — an agent with Bash can reach the same effect another " +
|
|
56
|
+
"way; it stops a destructive command you did not intend, not one that is " +
|
|
57
|
+
"trying to get past you.",
|
|
58
|
+
default: "the shipped pattern set",
|
|
59
|
+
required: false,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "BRAIN_UI_WS_RATE",
|
|
63
|
+
description: "Sustained inbound WebSocket frames per second per connection. 0 " +
|
|
64
|
+
"disables metering entirely.",
|
|
65
|
+
default: "20",
|
|
66
|
+
required: false,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "BRAIN_UI_WS_BURST",
|
|
70
|
+
description: "Inbound WebSocket frames absorbable in one burst before the sustained " +
|
|
71
|
+
"rate applies. Opening the app legitimately fires several at once.",
|
|
72
|
+
default: "60",
|
|
73
|
+
required: false,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "BRAIN_UI_LOG_LEVEL",
|
|
77
|
+
description: "Minimum severity the console log consumer emits: TRACE, DEBUG, INFO, " +
|
|
78
|
+
"WARN, ERROR or FATAL. Case-insensitive; an unrecognised value falls " +
|
|
79
|
+
"back to the default rather than silencing the server.",
|
|
80
|
+
default: "INFO",
|
|
81
|
+
required: false,
|
|
82
|
+
},
|
|
47
83
|
{
|
|
48
84
|
name: "SOURCE_COMMIT",
|
|
49
85
|
description: "Git SHA reported by /api/status (baked at image build time).",
|
|
@@ -223,8 +259,49 @@ function list(raw) {
|
|
|
223
259
|
.map((s) => s.trim())
|
|
224
260
|
.filter(Boolean);
|
|
225
261
|
}
|
|
226
|
-
|
|
227
|
-
|
|
262
|
+
/**
|
|
263
|
+
* A log threshold, defaulting to INFO.
|
|
264
|
+
*
|
|
265
|
+
* An unrecognised value falls back rather than throwing: a typo in a log level
|
|
266
|
+
* must never be the reason a server refuses to boot, and silently emitting
|
|
267
|
+
* nothing would be worse than emitting too much.
|
|
268
|
+
*/
|
|
269
|
+
/** A non-negative number, falling back rather than throwing on nonsense. */
|
|
270
|
+
function positiveNumber(raw, fallback) {
|
|
271
|
+
if (raw === undefined || raw.trim() === "")
|
|
272
|
+
return fallback;
|
|
273
|
+
const n = Number(raw);
|
|
274
|
+
return Number.isFinite(n) && n >= 0 ? n : fallback;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Parse BRAIN_UI_CONFIRM_BASH into pattern sources.
|
|
278
|
+
*
|
|
279
|
+
* Unset or unparseable → null, meaning the backend's shipped defaults. An
|
|
280
|
+
* explicit `[]` is honoured as "no confirmation": disabling the seatbelt is a
|
|
281
|
+
* choice a deployment is allowed to make, and silently re-enabling it would be
|
|
282
|
+
* worse than obeying. Malformed JSON falls back to the defaults rather than
|
|
283
|
+
* throwing — a typo here must not stop the server booting, and the safe
|
|
284
|
+
* direction to fail is "more confirmation", not less.
|
|
285
|
+
*/
|
|
286
|
+
function parseConfirmBash(raw) {
|
|
287
|
+
const text = raw?.trim();
|
|
288
|
+
if (!text)
|
|
289
|
+
return null;
|
|
290
|
+
try {
|
|
291
|
+
const parsed = JSON.parse(text);
|
|
292
|
+
if (!Array.isArray(parsed))
|
|
293
|
+
return null;
|
|
294
|
+
return parsed.filter((p) => typeof p === "string");
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function parseSeverity(raw) {
|
|
301
|
+
const upper = raw?.trim().toUpperCase();
|
|
302
|
+
return SEVERITIES.includes(upper ?? "")
|
|
303
|
+
? upper
|
|
304
|
+
: "INFO";
|
|
228
305
|
}
|
|
229
306
|
const AUTH_MODES = ["password", "tailscale", "proxy", "none"];
|
|
230
307
|
/**
|
|
@@ -235,10 +312,7 @@ export function resolveServerConfig(env = process.env) {
|
|
|
235
312
|
const brainPath = env.BRAIN_PATH || join(env.HOME || "/root", "brain");
|
|
236
313
|
const rawAuthMode = env.AUTH_MODE?.trim().toLowerCase() || null;
|
|
237
314
|
const validMode = AUTH_MODES.find((mode) => mode === rawAuthMode) ?? null;
|
|
238
|
-
const
|
|
239
|
-
const modelDiscovery = rawDiscovery
|
|
240
|
-
? !(rawDiscovery === "0" || rawDiscovery === "off" || rawDiscovery === "false")
|
|
241
|
-
: env.NODE_ENV !== "test";
|
|
315
|
+
const modelDiscovery = envFlag(env.BRAIN_UI_MODEL_DISCOVERY, env.NODE_ENV !== "test");
|
|
242
316
|
const rawTtl = Number(env.BRAIN_UI_MODEL_TTL_HOURS);
|
|
243
317
|
const ttlHours = Number.isFinite(rawTtl) && rawTtl > 0 ? rawTtl : 24;
|
|
244
318
|
return {
|
|
@@ -253,11 +327,11 @@ export function resolveServerConfig(env = process.env) {
|
|
|
253
327
|
invalidMode: validMode ? null : rawAuthMode,
|
|
254
328
|
passwordHash: env.BRAIN_UI_PASSWORD_HASH || null,
|
|
255
329
|
cookieSecret: env.COOKIE_SECRET || null,
|
|
256
|
-
trustProxy:
|
|
330
|
+
trustProxy: envFlag(env.TRUST_PROXY, false),
|
|
257
331
|
trustProxyHops: Math.max(1, Number(env.TRUST_PROXY_HOPS) || 1),
|
|
258
332
|
proxyAuthHeader: (env.PROXY_AUTH_HEADER || "x-forwarded-user").toLowerCase(),
|
|
259
|
-
dangerouslyDisableAuth:
|
|
260
|
-
allowPassword:
|
|
333
|
+
dangerouslyDisableAuth: envFlag(env.BRAIN_UI_DANGEROUSLY_DISABLE_AUTH, false),
|
|
334
|
+
allowPassword: envFlag(env.BRAIN_UI_ALLOW_PASSWORD, false),
|
|
261
335
|
},
|
|
262
336
|
webauthn: {
|
|
263
337
|
rpName: env.WEBAUTHN_RP_NAME || "Brain UI",
|
|
@@ -265,16 +339,22 @@ export function resolveServerConfig(env = process.env) {
|
|
|
265
339
|
userId: env.WEBAUTHN_USER_ID || "brain-ui-owner",
|
|
266
340
|
rpId: env.WEBAUTHN_RP_ID || null,
|
|
267
341
|
origins: list(env.WEBAUTHN_ORIGINS),
|
|
268
|
-
allowLoopbackOrigin:
|
|
342
|
+
allowLoopbackOrigin: envFlag(env.BRAIN_UI_ALLOW_LOOPBACK_ORIGIN, false),
|
|
269
343
|
},
|
|
270
344
|
agent: {
|
|
271
345
|
backend: env.AGENT_BACKEND?.trim().toLowerCase() || null,
|
|
346
|
+
confirmBashPatterns: parseConfirmBash(env.BRAIN_UI_CONFIRM_BASH),
|
|
272
347
|
claudeCodePath: env.CLAUDE_CODE_PATH || "/usr/local/bin/claude",
|
|
273
348
|
defaultModel: env.BRAIN_UI_CLAUDE_DEFAULT_MODEL?.trim() || "claude-sonnet-4-6",
|
|
274
349
|
profilesJson: env.BRAIN_UI_CLAUDE_PROFILES?.trim() || null,
|
|
275
350
|
modelDiscovery,
|
|
276
351
|
modelTtlMs: ttlHours * 60 * 60 * 1000,
|
|
277
352
|
},
|
|
353
|
+
logLevel: parseSeverity(env.BRAIN_UI_LOG_LEVEL),
|
|
354
|
+
wsRate: {
|
|
355
|
+
ratePerSecond: positiveNumber(env.BRAIN_UI_WS_RATE, 20),
|
|
356
|
+
burst: positiveNumber(env.BRAIN_UI_WS_BURST, 60),
|
|
357
|
+
},
|
|
278
358
|
voice: {
|
|
279
359
|
provider: env.VOICE_PROVIDER?.trim().toLowerCase() || null,
|
|
280
360
|
deepgramApiKey: env.DEEPGRAM_API_KEY || null,
|
package/dist/config/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
package/dist/cron/scheduler.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite";
|
|
2
|
+
import type { Logger } from "@opentelemetry/api-logs";
|
|
2
3
|
import type { BrainClient } from "../brain/client.js";
|
|
3
4
|
export interface CronScheduler {
|
|
4
5
|
getCronStatus(): Array<{
|
|
@@ -10,8 +11,27 @@ export interface CronScheduler {
|
|
|
10
11
|
}>;
|
|
11
12
|
triggerJob(name: string): Promise<boolean>;
|
|
12
13
|
}
|
|
14
|
+
/** One in-flight job run being recorded into `cron_runs`. */
|
|
15
|
+
export interface CronRunRecord {
|
|
16
|
+
/** Mark the run finished: success without an argument, error with one. */
|
|
17
|
+
finish(error?: string): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Record a job run in the `cron_runs` history that `/api/status` serves
|
|
21
|
+
* (`cronJobs`, via {@link CronScheduler.getCronStatus}).
|
|
22
|
+
*
|
|
23
|
+
* The scheduler in this module only writes the table for its own manual
|
|
24
|
+
* triggers; in the shipped deployment the jobs are executed by the container
|
|
25
|
+
* crontab, whose runs were invisible to `/api/status`. An external scheduler's
|
|
26
|
+
* wrapper calls this before the job and `finish()` after, writing exactly the
|
|
27
|
+
* rows the in-process runner writes. A run whose process died before
|
|
28
|
+
* `finish()` stays in status "running" — itself a signal.
|
|
29
|
+
*/
|
|
30
|
+
export declare function recordCronRun(db: Database, jobName: string): CronRunRecord;
|
|
13
31
|
export declare function createCronScheduler(deps: {
|
|
14
32
|
db: Database;
|
|
15
33
|
brain: BrainClient;
|
|
34
|
+
/** Where run outcomes are reported; absent means silence. */
|
|
35
|
+
log?: Logger;
|
|
16
36
|
}): CronScheduler;
|
|
17
37
|
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/cron/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/cron/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQtD,MAAM,WAAW,aAAa;IAC5B,aAAa,IAAI,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5C;AAOD,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAqB1E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,aAAa,CAuEhB"}
|
package/dist/cron/scheduler.js
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record a job run in the `cron_runs` history that `/api/status` serves
|
|
3
|
+
* (`cronJobs`, via {@link CronScheduler.getCronStatus}).
|
|
4
|
+
*
|
|
5
|
+
* The scheduler in this module only writes the table for its own manual
|
|
6
|
+
* triggers; in the shipped deployment the jobs are executed by the container
|
|
7
|
+
* crontab, whose runs were invisible to `/api/status`. An external scheduler's
|
|
8
|
+
* wrapper calls this before the job and `finish()` after, writing exactly the
|
|
9
|
+
* rows the in-process runner writes. A run whose process died before
|
|
10
|
+
* `finish()` stays in status "running" — itself a signal.
|
|
11
|
+
*/
|
|
12
|
+
export function recordCronRun(db, jobName) {
|
|
13
|
+
const startedAt = Date.now();
|
|
14
|
+
db.prepare("INSERT INTO cron_runs (job_name, started_at, status) VALUES (?, ?, 'running')").run(jobName, startedAt);
|
|
15
|
+
return {
|
|
16
|
+
finish(error) {
|
|
17
|
+
const finishedAt = Date.now();
|
|
18
|
+
const durationMs = finishedAt - startedAt;
|
|
19
|
+
if (error === undefined) {
|
|
20
|
+
db.prepare("UPDATE cron_runs SET status = 'success', finished_at = ?, duration_ms = ? WHERE job_name = ? AND started_at = ?").run(finishedAt, durationMs, jobName, startedAt);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
db.prepare("UPDATE cron_runs SET status = 'error', finished_at = ?, duration_ms = ?, error_message = ? WHERE job_name = ? AND started_at = ?").run(finishedAt, durationMs, error, jobName, startedAt);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
1
28
|
export function createCronScheduler(deps) {
|
|
2
|
-
const { db, brain } = deps;
|
|
29
|
+
const { db, brain, log } = deps;
|
|
3
30
|
const jobs = [
|
|
4
31
|
{
|
|
5
32
|
name: "sync",
|
|
@@ -17,18 +44,26 @@ export function createCronScheduler(deps) {
|
|
|
17
44
|
];
|
|
18
45
|
async function runJob(job) {
|
|
19
46
|
const startedAt = Date.now();
|
|
20
|
-
|
|
47
|
+
// Same recorder the external-scheduler path uses, so the two can never
|
|
48
|
+
// drift in what a cron_runs row looks like.
|
|
49
|
+
const record = recordCronRun(db, job.name);
|
|
21
50
|
try {
|
|
22
51
|
await job.handler();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
52
|
+
record.finish();
|
|
53
|
+
log?.emit({
|
|
54
|
+
severityText: "INFO",
|
|
55
|
+
body: "job completed",
|
|
56
|
+
attributes: { job: job.name, "duration.ms": Date.now() - startedAt },
|
|
57
|
+
});
|
|
26
58
|
}
|
|
27
59
|
catch (err) {
|
|
28
|
-
const durationMs = Date.now() - startedAt;
|
|
29
60
|
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
-
|
|
31
|
-
|
|
61
|
+
record.finish(message);
|
|
62
|
+
log?.emit({
|
|
63
|
+
severityText: "ERROR",
|
|
64
|
+
body: "job failed",
|
|
65
|
+
attributes: { job: job.name, error: message },
|
|
66
|
+
});
|
|
32
67
|
}
|
|
33
68
|
}
|
|
34
69
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/cron/scheduler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/cron/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/db/client.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Database } from "bun:sqlite";
|
|
2
|
+
import type { Logger } from "@opentelemetry/api-logs";
|
|
2
3
|
/**
|
|
3
4
|
* The UI's OWN SQLite database (sessions, passkeys, settings, cron runs) —
|
|
4
5
|
* distinct from the brain database, which is opened read-only via
|
|
@@ -8,5 +9,13 @@ import { Database } from "bun:sqlite";
|
|
|
8
9
|
* it to every consumer, so two apps with different configuration can coexist
|
|
9
10
|
* in one process and a test gets an isolated database by construction.
|
|
10
11
|
*/
|
|
11
|
-
export
|
|
12
|
+
export interface CreateUiDbOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Where migration progress is reported. Optional so a test can open a
|
|
15
|
+
* database without wiring observability; absent means silence, never
|
|
16
|
+
* console output.
|
|
17
|
+
*/
|
|
18
|
+
log?: Logger;
|
|
19
|
+
}
|
|
20
|
+
export declare function createUiDb(dbPath: string, options?: CreateUiDbOptions): Database;
|
|
12
21
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/db/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,QAAQ,CAMpF"}
|