@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/README.md
CHANGED
|
@@ -77,10 +77,14 @@ Every variable this package reads, and what happens when it is unset.
|
|
|
77
77
|
| `BRAIN_UI_ALLOW_PASSWORD` | Set "1" to keep password login enabled after a passkey exists for the RP (break-glass recovery). | 0 |
|
|
78
78
|
| `BRAIN_UI_CLAUDE_DEFAULT_MODEL` | Model the built-in default Claude profile is pinned to. | claude-sonnet-4-6 |
|
|
79
79
|
| `BRAIN_UI_CLAUDE_PROFILES` | JSON array of extra Anthropic-compatible inference profiles ({id,label,model?,baseUrl?,authTokenEnv?,apiKeyEnv?,modelAliases?}). | (none) |
|
|
80
|
+
| `BRAIN_UI_CONFIRM_BASH` | JSON array of regex sources; a Bash command matching any of them raises a confirmation card before it runs. Unset uses the shipped defaults (brain archive, rm -r, git push --force, git reset --hard, git clean -f, git checkout -- ). An empty array [] disables the confirmation. Not a security boundary — an agent with Bash can reach the same effect another way; it stops a destructive command you did not intend, not one that is trying to get past you. | the shipped pattern set |
|
|
80
81
|
| `BRAIN_UI_DANGEROUSLY_DISABLE_AUTH` | Set "1" to allow AUTH_MODE=none on a non-loopback host. Every network peer gets full agent access. | 0 |
|
|
82
|
+
| `BRAIN_UI_LOG_LEVEL` | Minimum severity the console log consumer emits: TRACE, DEBUG, INFO, WARN, ERROR or FATAL. Case-insensitive; an unrecognised value falls back to the default rather than silencing the server. | INFO |
|
|
81
83
|
| `BRAIN_UI_MODEL_DISCOVERY` | Model discovery against the Anthropic Models API; "0"/"off"/"false" disables. Defaults ON, except under a test runner (NODE_ENV=test) where it defaults OFF. | on (off under NODE_ENV=test) |
|
|
82
84
|
| `BRAIN_UI_MODEL_TTL_HOURS` | How long a model-discovery result stays fresh, in hours. | 24 |
|
|
83
85
|
| `BRAIN_UI_PASSWORD_HASH` | Bun.password argon2id hash of the shared password. | **required** — AUTH_MODE=password |
|
|
86
|
+
| `BRAIN_UI_WS_BURST` | Inbound WebSocket frames absorbable in one burst before the sustained rate applies. Opening the app legitimately fires several at once. | 60 |
|
|
87
|
+
| `BRAIN_UI_WS_RATE` | Sustained inbound WebSocket frames per second per connection. 0 disables metering entirely. | 20 |
|
|
84
88
|
| `CLAUDE_CODE_PATH` | Path to the Claude Code native binary handed to the Agent SDK. | /usr/local/bin/claude |
|
|
85
89
|
| `COOKIE_SECRET` | Secret signing the session cookie. | **required** — AUTH_MODE=password |
|
|
86
90
|
| `DB_PATH` | SQLite file for the UI's own database (sessions, passkeys, settings). | ./brain-ui.db |
|
package/dist/agent/backend.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Logger } from "@opentelemetry/api-logs";
|
|
1
2
|
import type { AgentConfig } from "../config/env.js";
|
|
2
3
|
import type { ProviderInfo } from "@schlessera/brain-ui-sdk";
|
|
3
4
|
import type { AgentBackend, BackendCapabilities } from "@schlessera/brain-ui-sdk/server";
|
|
@@ -8,7 +9,7 @@ import type { AgentBackend, BackendCapabilities } from "@schlessera/brain-ui-sdk
|
|
|
8
9
|
* tests install fakes by constructing a registry, not by mutating a module.
|
|
9
10
|
*
|
|
10
11
|
* BOTH backend packages are optional peers loaded lazily (the same
|
|
11
|
-
*
|
|
12
|
+
* dynamic-import path): a deployment installs the one its AGENT_BACKEND
|
|
12
13
|
* names, and the other never has to be present — at runtime AND at
|
|
13
14
|
* type-check time (see the structural mirrors below).
|
|
14
15
|
*
|
|
@@ -17,6 +18,12 @@ import type { AgentBackend, BackendCapabilities } from "@schlessera/brain-ui-sdk
|
|
|
17
18
|
* endpoints are declared via the BRAIN_UI_CLAUDE_PROFILES env var (documented in
|
|
18
19
|
* .env.example) rather than in code.
|
|
19
20
|
*/
|
|
21
|
+
/**
|
|
22
|
+
* Mirror of the backends' `BackendLogFn` — the minimal log seam a backend
|
|
23
|
+
* accepts. A callback rather than a Logger so the backend packages carry no
|
|
24
|
+
* telemetry dependency; {@link toBackendLog} adapts the registry's Logger.
|
|
25
|
+
*/
|
|
26
|
+
export type BackendLogFn = (level: "debug" | "info" | "warn" | "error", message: string, attrs?: Record<string, string | number | boolean>) => void;
|
|
20
27
|
/** Mirror of the Claude package's `InferenceProfileInput` (declarative shape). */
|
|
21
28
|
export interface ClaudeProfileInput {
|
|
22
29
|
id: string;
|
|
@@ -62,6 +69,8 @@ export interface ClaudeBackendModule {
|
|
|
62
69
|
brainPath: string;
|
|
63
70
|
claudeCodePath?: string;
|
|
64
71
|
profiles?: ClaudeProfile[] | (() => ClaudeProfile[]);
|
|
72
|
+
confirmBashPatterns?: readonly string[];
|
|
73
|
+
log?: BackendLogFn;
|
|
65
74
|
}) => AgentBackend;
|
|
66
75
|
createModelSource: (options: {
|
|
67
76
|
brainPath: string;
|
|
@@ -109,6 +118,12 @@ export interface BackendRegistryOptions {
|
|
|
109
118
|
* sessions pinned to it. Defaults to "nothing hidden".
|
|
110
119
|
*/
|
|
111
120
|
getHiddenModelIds?: () => string[];
|
|
121
|
+
/**
|
|
122
|
+
* Where the registry and its backends report. Adapted to the backends'
|
|
123
|
+
* minimal callback ({@link BackendLogFn}) before crossing the package
|
|
124
|
+
* boundary. Absent means silence.
|
|
125
|
+
*/
|
|
126
|
+
log?: Logger;
|
|
112
127
|
}
|
|
113
128
|
export interface BackendRegistry {
|
|
114
129
|
/** All configured backends, with the default backend first. */
|
|
@@ -145,18 +160,23 @@ export interface BackendRegistry {
|
|
|
145
160
|
invalidateProfiles(): void;
|
|
146
161
|
}
|
|
147
162
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
163
|
+
* Load an optional backend package, mapping ONLY "the backend package itself
|
|
164
|
+
* is not installed" to the actionable install hint. Everything else — the
|
|
165
|
+
* backend missing one of its OWN transitive deps, a syntax error, a throwing
|
|
166
|
+
* top-level — is a different failure whose original error IS the diagnostic,
|
|
167
|
+
* so it is rethrown untouched. The distinction rides on ERR_MODULE_NOT_FOUND
|
|
168
|
+
* naming the specifier it failed on: a transitive miss names the transitive
|
|
169
|
+
* dep, not the backend, and must not read as "backend not installed".
|
|
154
170
|
*
|
|
155
|
-
*
|
|
171
|
+
* `await import()` rather than `createRequire()(...)`: the backend packages
|
|
172
|
+
* are ESM, and a CJS require of them under plain Node dies with
|
|
173
|
+
* ERR_REQUIRE_ESM — which the old blanket catch then reported as "not
|
|
174
|
+
* installed" on a machine where the package was sitting right there.
|
|
156
175
|
*
|
|
157
|
-
* The `
|
|
158
|
-
* production callers pass nothing.
|
|
176
|
+
* The `importer` parameter exists for tests (simulating absent or broken
|
|
177
|
+
* packages); production callers pass nothing.
|
|
159
178
|
*/
|
|
179
|
+
export declare function loadBackendModule(key: "claude" | "pi", importer?: (specifier: string) => Promise<unknown>): Promise<unknown>;
|
|
160
180
|
export declare function assertBackendResolvable(agent: AgentConfig, resolve?: (specifier: string) => void): void;
|
|
161
181
|
export declare function createBackendRegistry(options: BackendRegistryOptions): BackendRegistry;
|
|
162
182
|
/**
|
|
@@ -167,5 +187,6 @@ export declare function createBackendRegistry(options: BackendRegistryOptions):
|
|
|
167
187
|
*/
|
|
168
188
|
export declare function createStaticBackendRegistry(backends: AgentBackend[], defaultBackendId?: string, options?: {
|
|
169
189
|
getHiddenModelIds?: () => string[];
|
|
190
|
+
log?: Logger;
|
|
170
191
|
}): BackendRegistry;
|
|
171
192
|
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/agent/backend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/agent/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/backend.js
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import { createRequire } from "module";
|
|
2
|
+
const LEVEL_SEVERITY = {
|
|
3
|
+
debug: "DEBUG",
|
|
4
|
+
info: "INFO",
|
|
5
|
+
warn: "WARN",
|
|
6
|
+
error: "ERROR",
|
|
7
|
+
};
|
|
8
|
+
function toBackendLog(log) {
|
|
9
|
+
return (level, message, attrs) => log.emit({
|
|
10
|
+
severityText: LEVEL_SEVERITY[level],
|
|
11
|
+
body: message,
|
|
12
|
+
...(attrs ? { attributes: attrs } : {}),
|
|
13
|
+
});
|
|
14
|
+
}
|
|
2
15
|
const PROFILE_MEMO_MS = 5_000;
|
|
3
16
|
function buildSnapshot(backends, defaultBackendId) {
|
|
4
17
|
if (backends.length === 0) {
|
|
@@ -43,6 +56,57 @@ function missingBackendError(primary) {
|
|
|
43
56
|
* The `resolve` parameter exists for tests (simulating an absent package);
|
|
44
57
|
* production callers pass nothing.
|
|
45
58
|
*/
|
|
59
|
+
/** The specifier an ERR_MODULE_NOT_FOUND failed on, or null for any other error. */
|
|
60
|
+
function moduleNotFoundSpecifier(error) {
|
|
61
|
+
if (typeof error !== "object" || error === null)
|
|
62
|
+
return null;
|
|
63
|
+
const { code, specifier, message } = error;
|
|
64
|
+
if (code !== "ERR_MODULE_NOT_FOUND" && code !== "MODULE_NOT_FOUND")
|
|
65
|
+
return null;
|
|
66
|
+
// Bun's ResolveMessage (not an Error instance) carries the failing
|
|
67
|
+
// specifier as a property; Node quotes it in the message instead.
|
|
68
|
+
if (typeof specifier === "string")
|
|
69
|
+
return specifier;
|
|
70
|
+
if (typeof message === "string") {
|
|
71
|
+
const quoted = /Cannot find (?:package|module) '([^']+)'/.exec(message);
|
|
72
|
+
if (quoted)
|
|
73
|
+
return quoted[1];
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Load an optional backend package, mapping ONLY "the backend package itself
|
|
79
|
+
* is not installed" to the actionable install hint. Everything else — the
|
|
80
|
+
* backend missing one of its OWN transitive deps, a syntax error, a throwing
|
|
81
|
+
* top-level — is a different failure whose original error IS the diagnostic,
|
|
82
|
+
* so it is rethrown untouched. The distinction rides on ERR_MODULE_NOT_FOUND
|
|
83
|
+
* naming the specifier it failed on: a transitive miss names the transitive
|
|
84
|
+
* dep, not the backend, and must not read as "backend not installed".
|
|
85
|
+
*
|
|
86
|
+
* `await import()` rather than `createRequire()(...)`: the backend packages
|
|
87
|
+
* are ESM, and a CJS require of them under plain Node dies with
|
|
88
|
+
* ERR_REQUIRE_ESM — which the old blanket catch then reported as "not
|
|
89
|
+
* installed" on a machine where the package was sitting right there.
|
|
90
|
+
*
|
|
91
|
+
* The `importer` parameter exists for tests (simulating absent or broken
|
|
92
|
+
* packages); production callers pass nothing.
|
|
93
|
+
*/
|
|
94
|
+
export async function loadBackendModule(
|
|
95
|
+
// "claude" | "pi" spelled out, NOT keyof typeof BACKEND_SPECIFIERS: the
|
|
96
|
+
// keyof form drags the table's literal string types — the backend
|
|
97
|
+
// specifiers — into the emitted .d.ts, which the declaration-surface gate
|
|
98
|
+
// rightly refuses.
|
|
99
|
+
key, importer = (specifier) => import(specifier)) {
|
|
100
|
+
const specifier = BACKEND_SPECIFIERS[key];
|
|
101
|
+
try {
|
|
102
|
+
return await importer(specifier);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (moduleNotFoundSpecifier(error) === specifier)
|
|
106
|
+
throw missingBackendError(key);
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
46
110
|
export function assertBackendResolvable(agent, resolve = (specifier) => {
|
|
47
111
|
createRequire(import.meta.url).resolve(specifier);
|
|
48
112
|
}) {
|
|
@@ -60,6 +124,7 @@ export function assertBackendResolvable(agent, resolve = (specifier) => {
|
|
|
60
124
|
export function createBackendRegistry(options) {
|
|
61
125
|
const { brainPath, agent } = options;
|
|
62
126
|
const getHidden = options.getHiddenModelIds ?? (() => []);
|
|
127
|
+
const backendLog = options.log ? toBackendLog(options.log) : undefined;
|
|
63
128
|
let cachedRegistry = null;
|
|
64
129
|
let modelSource = null;
|
|
65
130
|
/**
|
|
@@ -147,19 +212,12 @@ export function createBackendRegistry(options) {
|
|
|
147
212
|
/**
|
|
148
213
|
* NEITHER backend package is a hard dependency — a deployment installs the
|
|
149
214
|
* one its AGENT_BACKEND names (both, if it switches). Loaded lazily through
|
|
150
|
-
*
|
|
151
|
-
* one;
|
|
152
|
-
*
|
|
215
|
+
* {@link loadBackendModule} so the server still boots without the unused
|
|
216
|
+
* one; only "the package is absent" maps to the actionable install hint,
|
|
217
|
+
* any other load failure surfaces as itself.
|
|
153
218
|
*/
|
|
154
|
-
function buildClaudeBackend() {
|
|
155
|
-
const
|
|
156
|
-
let claude;
|
|
157
|
-
try {
|
|
158
|
-
claude = require("@schlessera/brain-backend-claude");
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
throw missingBackendError("claude");
|
|
162
|
-
}
|
|
219
|
+
async function buildClaudeBackend() {
|
|
220
|
+
const claude = (await loadBackendModule("claude"));
|
|
163
221
|
if (typeof claude.createClaudeBackend !== "function") {
|
|
164
222
|
throw new Error('"@schlessera/brain-backend-claude" does not export createClaudeBackend.');
|
|
165
223
|
}
|
|
@@ -174,32 +232,34 @@ export function createBackendRegistry(options) {
|
|
|
174
232
|
return claude.createClaudeBackend({
|
|
175
233
|
brainPath,
|
|
176
234
|
claudeCodePath: agent.claudeCodePath,
|
|
235
|
+
...(backendLog ? { log: backendLog } : {}),
|
|
236
|
+
// Omitted entirely when unconfigured, so the backend's own defaults
|
|
237
|
+
// apply; an explicit [] passes through and disables confirmation.
|
|
238
|
+
...(agent.confirmBashPatterns !== null
|
|
239
|
+
? { confirmBashPatterns: agent.confirmBashPatterns }
|
|
240
|
+
: {}),
|
|
177
241
|
// A function, not an array: discovery refreshes in the background and the
|
|
178
242
|
// new roster has to be visible without restarting the process.
|
|
179
243
|
profiles: () => mergeDiscovered(claude, declared, modelSource?.list() ?? []),
|
|
180
244
|
});
|
|
181
245
|
}
|
|
182
|
-
function buildPiBackend() {
|
|
183
|
-
const
|
|
184
|
-
let mod;
|
|
185
|
-
try {
|
|
186
|
-
mod = require("@schlessera/brain-backend-pi");
|
|
187
|
-
}
|
|
188
|
-
catch {
|
|
189
|
-
throw missingBackendError("pi");
|
|
190
|
-
}
|
|
246
|
+
async function buildPiBackend() {
|
|
247
|
+
const mod = (await loadBackendModule("pi"));
|
|
191
248
|
if (typeof mod.createPiBackend !== "function") {
|
|
192
249
|
throw new Error('"@schlessera/brain-backend-pi" does not export createPiBackend.');
|
|
193
250
|
}
|
|
194
|
-
return mod.createPiBackend({
|
|
251
|
+
return mod.createPiBackend({
|
|
252
|
+
brainPath,
|
|
253
|
+
...(backendLog ? { log: backendLog } : {}),
|
|
254
|
+
});
|
|
195
255
|
}
|
|
196
256
|
async function buildRegistry() {
|
|
197
257
|
const primary = agent.backend || "claude";
|
|
198
258
|
if (primary === "pi") {
|
|
199
|
-
const pi = buildPiBackend();
|
|
259
|
+
const pi = await buildPiBackend();
|
|
200
260
|
return buildSnapshot([pi], pi.id);
|
|
201
261
|
}
|
|
202
|
-
const backends = [buildClaudeBackend()];
|
|
262
|
+
const backends = [await buildClaudeBackend()];
|
|
203
263
|
// AGENT_BACKEND must name a configured backend. The in-process options are
|
|
204
264
|
// "claude" (default) and "pi" (handled above). An unrecognized value is a
|
|
205
265
|
// misconfiguration — fail loudly instead of silently coercing to claude and
|
|
@@ -217,7 +277,7 @@ export function createBackendRegistry(options) {
|
|
|
217
277
|
return makeRegistry(getRegistry, getHidden, async () => {
|
|
218
278
|
await getRegistry();
|
|
219
279
|
return modelSource;
|
|
220
|
-
});
|
|
280
|
+
}, options.log);
|
|
221
281
|
}
|
|
222
282
|
/**
|
|
223
283
|
* A registry over an explicit backend list — the seam tests (and embedders
|
|
@@ -227,10 +287,10 @@ export function createBackendRegistry(options) {
|
|
|
227
287
|
*/
|
|
228
288
|
export function createStaticBackendRegistry(backends, defaultBackendId = backends[0]?.id ?? "", options = {}) {
|
|
229
289
|
const snapshot = buildSnapshot(backends, defaultBackendId);
|
|
230
|
-
return makeRegistry(async () => snapshot, options.getHiddenModelIds ?? (() => []), async () => null);
|
|
290
|
+
return makeRegistry(async () => snapshot, options.getHiddenModelIds ?? (() => []), async () => null, options.log);
|
|
231
291
|
}
|
|
232
292
|
/** The accessor surface, shared by the config-driven and static registries. */
|
|
233
|
-
function makeRegistry(getRegistry, getHidden, getModelSource) {
|
|
293
|
+
function makeRegistry(getRegistry, getHidden, getModelSource, log) {
|
|
234
294
|
let profileSnapshot = null;
|
|
235
295
|
/** Recompute the profile roster (memoized), asserting cross-backend id uniqueness. */
|
|
236
296
|
async function getProfileSnapshot() {
|
|
@@ -260,7 +320,11 @@ function makeRegistry(getRegistry, getHidden, getModelSource) {
|
|
|
260
320
|
return new Set(getHidden());
|
|
261
321
|
}
|
|
262
322
|
catch (err) {
|
|
263
|
-
|
|
323
|
+
log?.emit({
|
|
324
|
+
severityText: "WARN",
|
|
325
|
+
body: "could not read hidden models; treating none as hidden",
|
|
326
|
+
attributes: { error: err instanceof Error ? err.message : String(err) },
|
|
327
|
+
});
|
|
264
328
|
return new Set();
|
|
265
329
|
}
|
|
266
330
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/agent/backend.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/agent/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/app.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { type AuthMode } from "./middleware/auth.js";
|
|
|
6
6
|
import { type BackendRegistry } from "./agent/backend.js";
|
|
7
7
|
import { WsHost } from "./ws/host.js";
|
|
8
8
|
import { websocket } from "./ws/connection.js";
|
|
9
|
+
import { type Observability } from "./observability/index.js";
|
|
9
10
|
export type { AppRenderer };
|
|
10
11
|
export interface CreateAppOptions {
|
|
11
12
|
/**
|
|
@@ -40,6 +41,12 @@ export interface CreateAppOptions {
|
|
|
40
41
|
turnTimeoutMs?: number;
|
|
41
42
|
/** Backend registry override (tests/embedders); default is built from config. */
|
|
42
43
|
registry?: BackendRegistry;
|
|
44
|
+
/**
|
|
45
|
+
* Where this app reports. Defaults to the console consumer; a test passes
|
|
46
|
+
* `createRecordingObservability()` and then asserts on what the server
|
|
47
|
+
* actually said, through the same emission path production uses.
|
|
48
|
+
*/
|
|
49
|
+
observability?: Observability;
|
|
43
50
|
}
|
|
44
51
|
/** What `createApp` hands back to the deployment shell. */
|
|
45
52
|
export interface BrainUiApp {
|
|
@@ -57,6 +64,8 @@ export interface BrainUiApp {
|
|
|
57
64
|
db: Database;
|
|
58
65
|
/** The WebSocket coordinator (turn state, clients, catalog, registry). */
|
|
59
66
|
wsHost: WsHost;
|
|
67
|
+
/** Where this app reports — resolved or injected. */
|
|
68
|
+
observability: Observability;
|
|
60
69
|
/** True while any session has a running turn. */
|
|
61
70
|
isTurnActive(): boolean;
|
|
62
71
|
/** Cancel every running turn (used on shutdown). Returns true if any was. */
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOzE,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAI1E,OAAO,EAML,KAAK,QAAQ,EAEd,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAmB,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEnF,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,sEAAsE;IACtE,MAAM,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,QAAQ,EAAE,QAAQ,CAAC;IACnB,kEAAkE;IAClE,EAAE,EAAE,QAAQ,CAAC;IACb,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,aAAa,EAAE,aAAa,CAAC;IAC7B,iDAAiD;IACjD,YAAY,IAAI,OAAO,CAAC;IACxB,6EAA6E;IAC7E,iBAAiB,IAAI,OAAO,CAAC;IAC7B,0DAA0D;IAC1D,KAAK,IAAI,IAAI,CAAC;CACf;AAqBD,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,UAAU,CAuOpE"}
|
package/dist/app.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
-
import { logger } from "hono/logger";
|
|
3
2
|
import { cors } from "hono/cors";
|
|
4
3
|
import { serveStatic } from "hono/bun";
|
|
5
4
|
import { join } from "path";
|
|
6
5
|
import { resolveServerConfig } from "./config/env.js";
|
|
7
|
-
import {
|
|
6
|
+
import { createHealthRoutes, createStatusRoutes } from "./routes/health.js";
|
|
8
7
|
import { createBrainRoutes } from "./routes/brain.js";
|
|
9
8
|
import { createSessionRoutes } from "./routes/sessions.js";
|
|
10
9
|
import { createVoiceRoutes } from "./routes/voice.js";
|
|
@@ -24,6 +23,7 @@ import { createCronScheduler } from "./cron/scheduler.js";
|
|
|
24
23
|
import { WsHost } from "./ws/host.js";
|
|
25
24
|
import { createWsUpgrade, websocket } from "./ws/connection.js";
|
|
26
25
|
import { createSessionCatalog } from "./ws/session-catalog.js";
|
|
26
|
+
import { createObservability } from "./observability/index.js";
|
|
27
27
|
// Cross-site WebSocket hijacking (CSWSH) defense. CORS does not apply to the WS
|
|
28
28
|
// handshake and browsers do not enforce same-origin on `new WebSocket()`, so
|
|
29
29
|
// rejecting a cross-site upgrade is entirely the server's job. A browser always
|
|
@@ -54,13 +54,17 @@ export function createApp(options = {}) {
|
|
|
54
54
|
// anonymous temporary database, and an explicit empty override must not
|
|
55
55
|
// silently fall back to the resolved path.
|
|
56
56
|
const config = options.dbPath !== undefined ? { ...resolved, dbPath: options.dbPath } : resolved;
|
|
57
|
+
// First thing built, because everything below may want to report — including
|
|
58
|
+
// the auth validation that can refuse to boot and the migration runner.
|
|
59
|
+
const observability = options.observability ?? createObservability({ minSeverity: config.logLevel });
|
|
57
60
|
const auth = { ...config.auth, host: config.host };
|
|
58
61
|
const app = new Hono();
|
|
59
|
-
const
|
|
62
|
+
const authLog = observability.logger("auth");
|
|
63
|
+
const authMode = resolveAuthMode(auth, authLog);
|
|
60
64
|
// Validate inside the factory, not the bin entry: every consumer of the app
|
|
61
65
|
// (a deployment bin, tests, another embedder) gets the same refuse-to-boot
|
|
62
66
|
// guarantee on an unsafe auth configuration.
|
|
63
|
-
assertAuthConfig(authMode, auth);
|
|
67
|
+
assertAuthConfig(authMode, auth, authLog);
|
|
64
68
|
assertPasskeyConfig(config.webauthn);
|
|
65
69
|
// A missing (or unrecognized) agent backend refuses to boot HERE, not on the
|
|
66
70
|
// first turn — otherwise /api/health reports healthy while every turn is
|
|
@@ -71,36 +75,68 @@ export function createApp(options = {}) {
|
|
|
71
75
|
// Per-instance state: the app's own database, the brain CLI wrapper, the
|
|
72
76
|
// backend registry, and the WebSocket host. No module-level singletons —
|
|
73
77
|
// two apps with different configuration coexist in one process.
|
|
74
|
-
const
|
|
78
|
+
const dbLog = observability.logger("db");
|
|
79
|
+
const db = createUiDb(config.dbPath, { log: dbLog });
|
|
75
80
|
const brain = createBrainClient({ brainPath: config.brainPath });
|
|
76
|
-
const cron = createCronScheduler({ db, brain });
|
|
81
|
+
const cron = createCronScheduler({ db, brain, log: observability.logger("cron") });
|
|
77
82
|
const registry = options.registry ??
|
|
78
83
|
createBackendRegistry({
|
|
79
84
|
brainPath: config.brainPath,
|
|
80
85
|
agent: config.agent,
|
|
81
|
-
getHiddenModelIds: () => getHiddenModelIds(db),
|
|
86
|
+
getHiddenModelIds: () => getHiddenModelIds(db, dbLog),
|
|
87
|
+
log: observability.logger("agent"),
|
|
82
88
|
});
|
|
83
89
|
const host = new WsHost({
|
|
84
90
|
registry,
|
|
85
|
-
|
|
91
|
+
observability,
|
|
92
|
+
catalog: createSessionCatalog(() => db, dbLog),
|
|
86
93
|
...(options.appName ? { appName: options.appName } : {}),
|
|
87
94
|
...(options.turnTimeoutMs ? { turnTimeoutMs: options.turnTimeoutMs } : {}),
|
|
88
95
|
maxConcurrentSessions: () => config.maxConcurrentSessions,
|
|
96
|
+
wsRate: config.wsRate,
|
|
89
97
|
});
|
|
90
98
|
const wsUpgrade = createWsUpgrade(host);
|
|
99
|
+
// One instrument for every way a login can fail — passkey ceremonies and
|
|
100
|
+
// password logins land in the same series, split by attributes.
|
|
101
|
+
const authFailures = observability.meter("auth").createCounter("auth.failures", {
|
|
102
|
+
description: "Failed authentication ceremonies, by reason",
|
|
103
|
+
});
|
|
91
104
|
const passkeyCtx = {
|
|
92
105
|
db,
|
|
93
106
|
webauthn: config.webauthn,
|
|
94
107
|
auth,
|
|
95
108
|
allowedOrigins: config.allowedOrigins,
|
|
109
|
+
log: observability.logger("passkeys"),
|
|
110
|
+
failures: authFailures,
|
|
96
111
|
};
|
|
97
112
|
const keyterms = {
|
|
98
113
|
brainPath: config.brainPath,
|
|
99
114
|
cacheDir: config.voice.cacheDir,
|
|
100
115
|
limit: config.voice.keytermLimit,
|
|
116
|
+
log: observability.logger("voice"),
|
|
101
117
|
};
|
|
102
|
-
//
|
|
103
|
-
|
|
118
|
+
// Request logging through the observability layer, so BRAIN_UI_LOG_LEVEL
|
|
119
|
+
// governs it like every other emission (hono's logger() wrote raw console
|
|
120
|
+
// lines no threshold or consumer swap could touch). Path only — never the
|
|
121
|
+
// query string or body. /api/health is skipped: the Docker healthcheck
|
|
122
|
+
// polls it and would drown everything else out.
|
|
123
|
+
const httpLog = observability.logger("http");
|
|
124
|
+
app.use("*", async (c, next) => {
|
|
125
|
+
if (c.req.path === "/api/health")
|
|
126
|
+
return next();
|
|
127
|
+
const startedAt = Date.now();
|
|
128
|
+
await next();
|
|
129
|
+
httpLog.emit({
|
|
130
|
+
severityText: "INFO",
|
|
131
|
+
body: "request",
|
|
132
|
+
attributes: {
|
|
133
|
+
method: c.req.method,
|
|
134
|
+
path: c.req.path,
|
|
135
|
+
status: c.res.status,
|
|
136
|
+
"duration.ms": Date.now() - startedAt,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
});
|
|
104
140
|
// CORS is only needed for a SPLIT topology where the client is served from a
|
|
105
141
|
// different origin than the API. ALLOWED_ORIGINS is a comma-separated
|
|
106
142
|
// allowlist; empty/unset means same-origin (the default), so the CORS
|
|
@@ -118,12 +154,14 @@ export function createApp(options = {}) {
|
|
|
118
154
|
// probe and the login/logout routes are reachable without a session.
|
|
119
155
|
// /api/status is intentionally NOT here — it leaks the git SHA, cron errors,
|
|
120
156
|
// and a session oracle, so it lives behind the guard below.
|
|
121
|
-
app.route("/api",
|
|
157
|
+
app.route("/api", createHealthRoutes({ db }));
|
|
122
158
|
// Not under /api, and not behind the guard: this is where a system share
|
|
123
159
|
// lands when no service worker was around to intercept it. See the route.
|
|
124
160
|
app.route("/", shareTargetFallbackRoutes);
|
|
125
161
|
app.route("/api", authRoutes(authMode, auth, {
|
|
126
162
|
passwordDisabled: (c) => passwordLoginDisabled(c, passkeyCtx),
|
|
163
|
+
log: authLog,
|
|
164
|
+
failures: authFailures,
|
|
127
165
|
}));
|
|
128
166
|
app.route("/api", passkeyPublicRoutes(authMode, passkeyCtx));
|
|
129
167
|
// Auth guard for every other /api/* route. The probe below is intentionally
|
|
@@ -138,16 +176,23 @@ export function createApp(options = {}) {
|
|
|
138
176
|
sourceCommit: config.sourceCommit,
|
|
139
177
|
getCronStatus: () => cron.getCronStatus(),
|
|
140
178
|
isTurnActive: () => host.coordinator.isTurnActive(),
|
|
179
|
+
// Undefined when the injected consumer cannot be read back (a real OTel
|
|
180
|
+
// SDK exports elsewhere), in which case the field is simply absent.
|
|
181
|
+
getMetrics: () => observability.metrics?.snapshot(),
|
|
141
182
|
}));
|
|
142
183
|
app.route("/api", createBrainRoutes({ brain, brainPath: config.brainPath, keyterms }));
|
|
143
184
|
app.route("/api", createSessionRoutes({ registry, db }));
|
|
144
185
|
app.route("/api", createVoiceRoutes({ voice: config.voice, keyterms }));
|
|
145
|
-
app.route("/api", createFilesRoutes({ brainRoot: config.brainPath }));
|
|
146
|
-
app.route("/api", createShareRoutes({
|
|
147
|
-
|
|
186
|
+
app.route("/api", createFilesRoutes({ brainRoot: config.brainPath, log: observability.logger("files") }));
|
|
187
|
+
app.route("/api", createShareRoutes({
|
|
188
|
+
brainRoot: config.brainPath,
|
|
189
|
+
allowedOrigins,
|
|
190
|
+
log: observability.logger("share"),
|
|
191
|
+
}));
|
|
192
|
+
app.route("/api", createRenderRoutes(options.renderer, observability.logger("render")));
|
|
148
193
|
app.route("/api", createProviderRoutes({ registry }));
|
|
149
|
-
app.route("/api", createModelRoutes({ registry, db }));
|
|
150
|
-
app.route("/api", createGraphRoutes({ brainRoot: config.brainPath }));
|
|
194
|
+
app.route("/api", createModelRoutes({ registry, db, log: observability.logger("models") }));
|
|
195
|
+
app.route("/api", createGraphRoutes({ brainRoot: config.brainPath, log: observability.logger("graph") }));
|
|
151
196
|
// WebSocket endpoint. Browsers can't set headers on the WS handshake, so the
|
|
152
197
|
// upgrade authenticates via the session cookie (or IP/proxy header) INSIDE
|
|
153
198
|
// the handler — no header-modifying middleware may sit on this route.
|
|
@@ -164,8 +209,24 @@ export function createApp(options = {}) {
|
|
|
164
209
|
if (options.staticRoot) {
|
|
165
210
|
const staticRoot = options.staticRoot;
|
|
166
211
|
app.use("/*", serveStatic({ root: staticRoot }));
|
|
167
|
-
// SPA fallback
|
|
168
|
-
|
|
212
|
+
// SPA fallback, served directly rather than through serveStatic({ path }).
|
|
213
|
+
//
|
|
214
|
+
// That helper resolves its path the same way it resolves `root` — against
|
|
215
|
+
// the process working directory — so `join(staticRoot, "index.html")`
|
|
216
|
+
// only lands correctly when `staticRoot` is itself cwd-relative. It is in
|
|
217
|
+
// the shipped layout, which is why this went unnoticed; an embedder
|
|
218
|
+
// passing an absolute directory, or a process that changed cwd, got a
|
|
219
|
+
// fallback that silently 404ed every deep link. Reading the file
|
|
220
|
+
// ourselves removes the ambiguity for both cases.
|
|
221
|
+
const indexPath = join(staticRoot, "index.html");
|
|
222
|
+
app.get("*", async (c) => {
|
|
223
|
+
const file = Bun.file(indexPath);
|
|
224
|
+
if (!(await file.exists()))
|
|
225
|
+
return c.notFound();
|
|
226
|
+
return new Response(file, {
|
|
227
|
+
headers: { "Content-Type": "text/html; charset=utf-8" },
|
|
228
|
+
});
|
|
229
|
+
});
|
|
169
230
|
}
|
|
170
231
|
return {
|
|
171
232
|
fetch: app.fetch,
|
|
@@ -174,6 +235,7 @@ export function createApp(options = {}) {
|
|
|
174
235
|
authMode,
|
|
175
236
|
db,
|
|
176
237
|
wsHost: host,
|
|
238
|
+
observability,
|
|
177
239
|
isTurnActive: () => host.coordinator.isTurnActive(),
|
|
178
240
|
cancelActiveTurns: () => host.coordinator.cancelAll("Server shutting down"),
|
|
179
241
|
close: () => {
|