@schlessera/brain-ui-server 0.16.0 → 0.18.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.
Files changed (90) hide show
  1. package/README.md +2 -0
  2. package/dist/agent/backend.d.ts +31 -10
  3. package/dist/agent/backend.d.ts.map +1 -1
  4. package/dist/agent/backend.js +86 -26
  5. package/dist/agent/backend.js.map +1 -1
  6. package/dist/app.d.ts.map +1 -1
  7. package/dist/app.js +51 -17
  8. package/dist/app.js.map +1 -1
  9. package/dist/config/env-core.d.ts +73 -0
  10. package/dist/config/env-core.d.ts.map +1 -0
  11. package/dist/config/env-core.js +62 -0
  12. package/dist/config/env-core.js.map +1 -0
  13. package/dist/config/env.d.ts +24 -5
  14. package/dist/config/env.d.ts.map +1 -1
  15. package/dist/config/env.js +55 -11
  16. package/dist/config/env.js.map +1 -1
  17. package/dist/cron/scheduler.d.ts +17 -0
  18. package/dist/cron/scheduler.d.ts.map +1 -1
  19. package/dist/cron/scheduler.js +33 -6
  20. package/dist/cron/scheduler.js.map +1 -1
  21. package/dist/db/settings.d.ts +1 -1
  22. package/dist/db/settings.d.ts.map +1 -1
  23. package/dist/db/settings.js +2 -2
  24. package/dist/db/settings.js.map +1 -1
  25. package/dist/index.d.ts +2 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +4 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/middleware/auth.d.ts +5 -0
  30. package/dist/middleware/auth.d.ts.map +1 -1
  31. package/dist/middleware/auth.js +46 -1
  32. package/dist/middleware/auth.js.map +1 -1
  33. package/dist/routes/health.d.ts +4 -14
  34. package/dist/routes/health.d.ts.map +1 -1
  35. package/dist/routes/health.js +22 -6
  36. package/dist/routes/health.js.map +1 -1
  37. package/dist/routes/share.d.ts.map +1 -1
  38. package/dist/routes/share.js +2 -2
  39. package/dist/routes/share.js.map +1 -1
  40. package/dist/voice/keyterm-builder.js +2 -2
  41. package/dist/voice/keyterm-builder.js.map +1 -1
  42. package/dist/ws/bridge.d.ts.map +1 -1
  43. package/dist/ws/bridge.js +36 -4
  44. package/dist/ws/bridge.js.map +1 -1
  45. package/dist/ws/clients.d.ts +10 -3
  46. package/dist/ws/clients.d.ts.map +1 -1
  47. package/dist/ws/clients.js +16 -4
  48. package/dist/ws/clients.js.map +1 -1
  49. package/dist/ws/connection.d.ts +1 -1
  50. package/dist/ws/connection.d.ts.map +1 -1
  51. package/dist/ws/connection.js +43 -6
  52. package/dist/ws/connection.js.map +1 -1
  53. package/dist/ws/dispatch.d.ts.map +1 -1
  54. package/dist/ws/dispatch.js +3 -1
  55. package/dist/ws/dispatch.js.map +1 -1
  56. package/dist/ws/host.d.ts +36 -0
  57. package/dist/ws/host.d.ts.map +1 -1
  58. package/dist/ws/host.js +93 -4
  59. package/dist/ws/host.js.map +1 -1
  60. package/dist/ws/run-session.d.ts.map +1 -1
  61. package/dist/ws/run-session.js +31 -5
  62. package/dist/ws/run-session.js.map +1 -1
  63. package/dist/ws/session-catalog.d.ts +2 -1
  64. package/dist/ws/session-catalog.d.ts.map +1 -1
  65. package/dist/ws/session-catalog.js +20 -3
  66. package/dist/ws/session-catalog.js.map +1 -1
  67. package/dist/ws/turns.d.ts +30 -2
  68. package/dist/ws/turns.d.ts.map +1 -1
  69. package/dist/ws/turns.js +13 -0
  70. package/dist/ws/turns.js.map +1 -1
  71. package/package.json +7 -6
  72. package/src/agent/backend.ts +123 -29
  73. package/src/app.ts +59 -17
  74. package/src/config/env-core.ts +93 -0
  75. package/src/config/env.ts +80 -17
  76. package/src/cron/scheduler.ts +48 -14
  77. package/src/db/settings.ts +2 -2
  78. package/src/index.ts +6 -0
  79. package/src/middleware/auth.ts +50 -1
  80. package/src/routes/health.ts +22 -6
  81. package/src/routes/share.ts +11 -7
  82. package/src/voice/keyterm-builder.ts +2 -2
  83. package/src/ws/bridge.ts +36 -7
  84. package/src/ws/clients.ts +24 -6
  85. package/src/ws/connection.ts +59 -6
  86. package/src/ws/dispatch.ts +3 -1
  87. package/src/ws/host.ts +115 -6
  88. package/src/ws/run-session.ts +36 -8
  89. package/src/ws/session-catalog.ts +21 -3
  90. package/src/ws/turns.ts +37 -1
package/README.md CHANGED
@@ -77,11 +77,13 @@ 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 |
81
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 |
82
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) |
83
84
  | `BRAIN_UI_MODEL_TTL_HOURS` | How long a model-discovery result stays fresh, in hours. | 24 |
84
85
  | `BRAIN_UI_PASSWORD_HASH` | Bun.password argon2id hash of the shared password. | **required** — AUTH_MODE=password |
86
+ | `BRAIN_UI_TURN_TIMEOUT_MS` | Hard per-turn timeout in ms; the host aborts a turn that runs past it. Raise for agent-heavy research work (e.g. 1800000 for 30 minutes). | 600000 (10 minutes) |
85
87
  | `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 |
86
88
  | `BRAIN_UI_WS_RATE` | Sustained inbound WebSocket frames per second per connection. 0 disables metering entirely. | 20 |
87
89
  | `CLAUDE_CODE_PATH` | Path to the Claude Code native binary handed to the Agent SDK. | /usr/local/bin/claude |
@@ -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
- * `createRequire` path): a deployment installs the one its AGENT_BACKEND
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
- * Boot-time guard: the SELECTED backend's package must at least RESOLVE, so a
149
- * broken install refuses to start instead of reporting healthy and failing
150
- * every agent turn (the guarantee the old static import gave, restored without
151
- * giving up the lazy load `require.resolve` never executes the module, so
152
- * the Agent SDK still loads on first use only). Called by `createApp()` next
153
- * to the auth assertions; skipped when an explicit registry is injected.
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
- * An unrecognized AGENT_BACKEND fails here too, for the same reason.
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 `resolve` parameter exists for tests (simulating an absent package);
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":"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"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/agent/backend.ts"],"names":[],"mappings":"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"}
@@ -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
- * the same `createRequire` path so the server still boots without the unused
151
- * one; when the configured backend's package is absent, fail with an
152
- * actionable message.
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 require = createRequire(import.meta.url);
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 require = createRequire(import.meta.url);
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({ brainPath });
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,7 +287,7 @@ 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
293
  function makeRegistry(getRegistry, getHidden, getModelSource, log) {
@@ -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.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;AAK3C,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,CA+LpE"}
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,CA0OpE"}
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 { healthRoutes, createStatusRoutes } from "./routes/health.js";
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";
@@ -76,42 +75,71 @@ export function createApp(options = {}) {
76
75
  // Per-instance state: the app's own database, the brain CLI wrapper, the
77
76
  // backend registry, and the WebSocket host. No module-level singletons —
78
77
  // two apps with different configuration coexist in one process.
79
- const db = createUiDb(config.dbPath, { log: observability.logger("db") });
78
+ const dbLog = observability.logger("db");
79
+ const db = createUiDb(config.dbPath, { log: dbLog });
80
80
  const brain = createBrainClient({ brainPath: config.brainPath });
81
81
  const cron = createCronScheduler({ db, brain, log: observability.logger("cron") });
82
82
  const registry = options.registry ??
83
83
  createBackendRegistry({
84
84
  brainPath: config.brainPath,
85
85
  agent: config.agent,
86
- getHiddenModelIds: () => getHiddenModelIds(db),
86
+ getHiddenModelIds: () => getHiddenModelIds(db, dbLog),
87
+ log: observability.logger("agent"),
87
88
  });
88
89
  const host = new WsHost({
89
90
  registry,
90
91
  observability,
91
- catalog: createSessionCatalog(() => db),
92
+ catalog: createSessionCatalog(() => db, dbLog),
92
93
  ...(options.appName ? { appName: options.appName } : {}),
93
- ...(options.turnTimeoutMs ? { turnTimeoutMs: options.turnTimeoutMs } : {}),
94
+ // Explicit option wins; then the env-resolved config; then the host default.
95
+ ...(options.turnTimeoutMs ?? config.turnTimeoutMs
96
+ ? { turnTimeoutMs: (options.turnTimeoutMs ?? config.turnTimeoutMs) }
97
+ : {}),
94
98
  maxConcurrentSessions: () => config.maxConcurrentSessions,
95
99
  wsRate: config.wsRate,
96
100
  });
97
101
  const wsUpgrade = createWsUpgrade(host);
102
+ // One instrument for every way a login can fail — passkey ceremonies and
103
+ // password logins land in the same series, split by attributes.
104
+ const authFailures = observability.meter("auth").createCounter("auth.failures", {
105
+ description: "Failed authentication ceremonies, by reason",
106
+ });
98
107
  const passkeyCtx = {
99
108
  db,
100
109
  webauthn: config.webauthn,
101
110
  auth,
102
111
  allowedOrigins: config.allowedOrigins,
103
112
  log: observability.logger("passkeys"),
104
- failures: observability.meter("auth").createCounter("auth.failures", {
105
- description: "Failed authentication ceremonies, by reason",
106
- }),
113
+ failures: authFailures,
107
114
  };
108
115
  const keyterms = {
109
116
  brainPath: config.brainPath,
110
117
  cacheDir: config.voice.cacheDir,
111
118
  limit: config.voice.keytermLimit,
119
+ log: observability.logger("voice"),
112
120
  };
113
- // Middleware
114
- app.use("*", logger());
121
+ // Request logging through the observability layer, so BRAIN_UI_LOG_LEVEL
122
+ // governs it like every other emission (hono's logger() wrote raw console
123
+ // lines no threshold or consumer swap could touch). Path only — never the
124
+ // query string or body. /api/health is skipped: the Docker healthcheck
125
+ // polls it and would drown everything else out.
126
+ const httpLog = observability.logger("http");
127
+ app.use("*", async (c, next) => {
128
+ if (c.req.path === "/api/health")
129
+ return next();
130
+ const startedAt = Date.now();
131
+ await next();
132
+ httpLog.emit({
133
+ severityText: "INFO",
134
+ body: "request",
135
+ attributes: {
136
+ method: c.req.method,
137
+ path: c.req.path,
138
+ status: c.res.status,
139
+ "duration.ms": Date.now() - startedAt,
140
+ },
141
+ });
142
+ });
115
143
  // CORS is only needed for a SPLIT topology where the client is served from a
116
144
  // different origin than the API. ALLOWED_ORIGINS is a comma-separated
117
145
  // allowlist; empty/unset means same-origin (the default), so the CORS
@@ -129,12 +157,14 @@ export function createApp(options = {}) {
129
157
  // probe and the login/logout routes are reachable without a session.
130
158
  // /api/status is intentionally NOT here — it leaks the git SHA, cron errors,
131
159
  // and a session oracle, so it lives behind the guard below.
132
- app.route("/api", healthRoutes);
160
+ app.route("/api", createHealthRoutes({ db }));
133
161
  // Not under /api, and not behind the guard: this is where a system share
134
162
  // lands when no service worker was around to intercept it. See the route.
135
163
  app.route("/", shareTargetFallbackRoutes);
136
164
  app.route("/api", authRoutes(authMode, auth, {
137
165
  passwordDisabled: (c) => passwordLoginDisabled(c, passkeyCtx),
166
+ log: authLog,
167
+ failures: authFailures,
138
168
  }));
139
169
  app.route("/api", passkeyPublicRoutes(authMode, passkeyCtx));
140
170
  // Auth guard for every other /api/* route. The probe below is intentionally
@@ -156,12 +186,16 @@ export function createApp(options = {}) {
156
186
  app.route("/api", createBrainRoutes({ brain, brainPath: config.brainPath, keyterms }));
157
187
  app.route("/api", createSessionRoutes({ registry, db }));
158
188
  app.route("/api", createVoiceRoutes({ voice: config.voice, keyterms }));
159
- app.route("/api", createFilesRoutes({ brainRoot: config.brainPath }));
160
- app.route("/api", createShareRoutes({ brainRoot: config.brainPath, allowedOrigins }));
161
- app.route("/api", createRenderRoutes(options.renderer));
189
+ app.route("/api", createFilesRoutes({ brainRoot: config.brainPath, log: observability.logger("files") }));
190
+ app.route("/api", createShareRoutes({
191
+ brainRoot: config.brainPath,
192
+ allowedOrigins,
193
+ log: observability.logger("share"),
194
+ }));
195
+ app.route("/api", createRenderRoutes(options.renderer, observability.logger("render")));
162
196
  app.route("/api", createProviderRoutes({ registry }));
163
- app.route("/api", createModelRoutes({ registry, db }));
164
- app.route("/api", createGraphRoutes({ brainRoot: config.brainPath }));
197
+ app.route("/api", createModelRoutes({ registry, db, log: observability.logger("models") }));
198
+ app.route("/api", createGraphRoutes({ brainRoot: config.brainPath, log: observability.logger("graph") }));
165
199
  // WebSocket endpoint. Browsers can't set headers on the WS handshake, so the
166
200
  // upgrade authenticates via the session cookie (or IP/proxy header) INSIDE
167
201
  // the handler — no header-modifying middleware may sit on this route.
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
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"}