@schlessera/brain-ui-server 0.32.0 → 0.33.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +2 -1
- package/dist/app.js.map +1 -1
- package/dist/bin/brain-ui-cron.d.ts +4 -0
- package/dist/bin/brain-ui-cron.d.ts.map +1 -0
- package/dist/bin/brain-ui-cron.js +140 -0
- package/dist/bin/brain-ui-cron.js.map +1 -0
- package/dist/brain/client.d.ts +9 -0
- package/dist/brain/client.d.ts.map +1 -1
- package/dist/brain/client.js +81 -4
- package/dist/brain/client.js.map +1 -1
- package/dist/config/env.d.ts +24 -5
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +44 -9
- package/dist/config/env.js.map +1 -1
- package/dist/cron/digest.d.ts +19 -0
- package/dist/cron/digest.d.ts.map +1 -0
- package/dist/cron/digest.js +26 -0
- package/dist/cron/digest.js.map +1 -0
- package/dist/cron/emit.d.ts +68 -0
- package/dist/cron/emit.d.ts.map +1 -0
- package/dist/cron/emit.js +171 -0
- package/dist/cron/emit.js.map +1 -0
- package/dist/cron/run-job.d.ts +48 -0
- package/dist/cron/run-job.d.ts.map +1 -0
- package/dist/cron/run-job.js +172 -0
- package/dist/cron/run-job.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/origin.d.ts.map +1 -1
- package/dist/middleware/origin.js +22 -1
- package/dist/middleware/origin.js.map +1 -1
- package/dist/routes/brain.js +2 -2
- package/dist/routes/brain.js.map +1 -1
- package/package.json +6 -3
- package/src/app.ts +2 -1
- package/src/bin/brain-ui-cron.ts +178 -0
- package/src/brain/client.ts +96 -4
- package/src/config/env.ts +87 -8
- package/src/cron/digest.ts +45 -0
- package/src/cron/emit.ts +262 -0
- package/src/cron/run-job.ts +254 -0
- package/src/index.ts +5 -1
- package/src/middleware/origin.ts +21 -1
- package/src/routes/brain.ts +2 -2
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute one container-cron job while recording its status and activity.
|
|
3
|
+
* Tracking is fail-open: database or activity failures never prevent the job
|
|
4
|
+
* from running, and the wrapper always returns the child's exit code.
|
|
5
|
+
*/
|
|
6
|
+
import { unlinkSync } from "fs";
|
|
7
|
+
import { ingestSpanSink } from "../activity/span-sink.js";
|
|
8
|
+
import { createActivityStore } from "../activity/store.js";
|
|
9
|
+
import { createUiDb } from "../db/client.js";
|
|
10
|
+
import { recordCronRun } from "./scheduler.js";
|
|
11
|
+
/** Tail of stderr retained for the cron_runs error row. */
|
|
12
|
+
export const STDERR_TAIL_CHARS = 2_000;
|
|
13
|
+
/** Tail of combined stdout/stderr retained as the job_output activity event. */
|
|
14
|
+
export const OUTPUT_TAIL_CHARS = 8_000;
|
|
15
|
+
/** Heartbeat cadence, comfortably inside the activity store's stale threshold. */
|
|
16
|
+
export const HEARTBEAT_MS = 30_000;
|
|
17
|
+
/** Child-visible path where span-sink JSONL may be appended. */
|
|
18
|
+
export const SPAN_SINK_ENV = "BRAIN_ACTIVITY_SPAN_SINK";
|
|
19
|
+
function messageOf(error) {
|
|
20
|
+
return error instanceof Error ? error.message : String(error);
|
|
21
|
+
}
|
|
22
|
+
function writeLine(sink, text) {
|
|
23
|
+
sink.write(`${text}\n`);
|
|
24
|
+
}
|
|
25
|
+
/** Forward a stream verbatim while exposing decoded chunks for tail capture. */
|
|
26
|
+
export async function teeStream(stream, sink, onText) {
|
|
27
|
+
const decoder = new TextDecoder();
|
|
28
|
+
for await (const chunk of stream) {
|
|
29
|
+
const text = decoder.decode(chunk, { stream: true });
|
|
30
|
+
sink.write(text);
|
|
31
|
+
onText(text);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Keep the last `cap` characters, never the head. */
|
|
35
|
+
export function appendTail(current, text, cap) {
|
|
36
|
+
return (current + text).slice(-cap);
|
|
37
|
+
}
|
|
38
|
+
async function startRecord(name, sinkPath, command, dbPath, stderr) {
|
|
39
|
+
try {
|
|
40
|
+
const db = createUiDb(dbPath);
|
|
41
|
+
const record = recordCronRun(db, name);
|
|
42
|
+
const store = createActivityStore(db, { writer: `cron:${process.pid}` });
|
|
43
|
+
const runId = `cron-${name}-${Date.now()}`;
|
|
44
|
+
const rootSpanId = `${runId}:root`;
|
|
45
|
+
store.startSpan({
|
|
46
|
+
spanId: rootSpanId,
|
|
47
|
+
runId,
|
|
48
|
+
name: `cron ${name}`,
|
|
49
|
+
kind: "cron",
|
|
50
|
+
origin: "cron",
|
|
51
|
+
jobName: name,
|
|
52
|
+
});
|
|
53
|
+
let sinkOffset = 0;
|
|
54
|
+
const ingest = () => {
|
|
55
|
+
try {
|
|
56
|
+
const result = ingestSpanSink(store, sinkPath, { runId, rootSpanId, jobName: name }, sinkOffset);
|
|
57
|
+
sinkOffset = result.offset;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Sink lines are best-effort enrichment.
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const heartbeat = setInterval(() => {
|
|
64
|
+
try {
|
|
65
|
+
store.heartbeat(rootSpanId);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Tracking remains fail-open after startup too.
|
|
69
|
+
}
|
|
70
|
+
ingest();
|
|
71
|
+
}, HEARTBEAT_MS);
|
|
72
|
+
return {
|
|
73
|
+
finish(error, output, exitCode) {
|
|
74
|
+
record.finish(error);
|
|
75
|
+
try {
|
|
76
|
+
ingest();
|
|
77
|
+
if (output) {
|
|
78
|
+
try {
|
|
79
|
+
store.appendEvent(rootSpanId, "job_output", output, undefined, OUTPUT_TAIL_CHARS);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Output capture is enrichment; never fail a run over it.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
store.endSpan(rootSpanId, {
|
|
86
|
+
outcome: error === undefined ? "success" : "error",
|
|
87
|
+
reason: error,
|
|
88
|
+
attrs: {
|
|
89
|
+
"cron.command": command.join(" "),
|
|
90
|
+
"cron.exit_code": exitCode,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
store.cascadeClose(runId, "cancelled", "job finished");
|
|
94
|
+
store.rollupRun(runId);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
writeLine(stderr, `[cron-run] failed to close activity span: ${messageOf(error)}`);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
clearInterval(heartbeat);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
close() {
|
|
104
|
+
clearInterval(heartbeat);
|
|
105
|
+
db.close();
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
writeLine(stderr, `[cron-run] tracking unavailable (job runs anyway): ${messageOf(error)}`);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Run a job as argv (never through a shell) and return its exact exit code. */
|
|
115
|
+
export async function runJob(options, dependencies = {}) {
|
|
116
|
+
const stdout = options.stdout ?? process.stdout;
|
|
117
|
+
const stderr = options.stderr ?? process.stderr;
|
|
118
|
+
const sinkPath = dependencies.sinkPath ??
|
|
119
|
+
`/tmp/brain-activity-sink-${process.pid}-${Date.now()}.jsonl`;
|
|
120
|
+
const beginRecord = dependencies.startRecord ?? startRecord;
|
|
121
|
+
const recorder = await beginRecord(options.jobName, sinkPath, options.command, options.dbPath, stderr);
|
|
122
|
+
let exitCode;
|
|
123
|
+
let errorMessage;
|
|
124
|
+
let outputTail = "";
|
|
125
|
+
try {
|
|
126
|
+
const spawn = dependencies.spawn ?? ((command, spawnOptions) => Bun.spawn(command, spawnOptions));
|
|
127
|
+
const proc = spawn(options.command, {
|
|
128
|
+
stdin: "inherit",
|
|
129
|
+
stdout: "pipe",
|
|
130
|
+
stderr: "pipe",
|
|
131
|
+
env: { ...options.childEnv, [SPAN_SINK_ENV]: sinkPath },
|
|
132
|
+
});
|
|
133
|
+
let stderrTail = "";
|
|
134
|
+
await Promise.all([
|
|
135
|
+
teeStream(proc.stdout, stdout, (text) => {
|
|
136
|
+
outputTail = appendTail(outputTail, text, OUTPUT_TAIL_CHARS);
|
|
137
|
+
}),
|
|
138
|
+
teeStream(proc.stderr, stderr, (text) => {
|
|
139
|
+
stderrTail = appendTail(stderrTail, text, STDERR_TAIL_CHARS);
|
|
140
|
+
outputTail = appendTail(outputTail, text, OUTPUT_TAIL_CHARS);
|
|
141
|
+
}),
|
|
142
|
+
]);
|
|
143
|
+
exitCode = await proc.exited;
|
|
144
|
+
if (exitCode !== 0) {
|
|
145
|
+
const cause = proc.signalCode ? `killed by ${proc.signalCode}` : `exit code ${exitCode}`;
|
|
146
|
+
const trimmedTail = stderrTail.trim();
|
|
147
|
+
errorMessage = trimmedTail ? `${cause}; stderr tail: ${trimmedTail}` : cause;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
exitCode = 127;
|
|
152
|
+
errorMessage = messageOf(error);
|
|
153
|
+
writeLine(stderr, `[cron-run] failed to start job command: ${errorMessage}`);
|
|
154
|
+
}
|
|
155
|
+
if (recorder) {
|
|
156
|
+
try {
|
|
157
|
+
recorder.finish(errorMessage, outputTail.trim(), exitCode);
|
|
158
|
+
recorder.close();
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
writeLine(stderr, `[cron-run] failed to record run outcome: ${messageOf(error)}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
(dependencies.removeSink ?? unlinkSync)(sinkPath);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Never emitted, or already gone.
|
|
169
|
+
}
|
|
170
|
+
return exitCode;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=run-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-job.js","sourceRoot":"","sources":["../../src/cron/run-job.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export { createWsUpgrade, createWsHandlers, websocket } from "./ws/connection.js
|
|
|
19
19
|
export { handleClientMessage, turnIdMatches, type ConnectionState, } from "./ws/dispatch.js";
|
|
20
20
|
export { resolveTurnTarget } from "./ws/routing.js";
|
|
21
21
|
export { createSessionCatalog, type SessionCatalog, } from "./ws/session-catalog.js";
|
|
22
|
-
export { createBrainClient, type BrainClient } from "./brain/client.js";
|
|
22
|
+
export { createBrainClient, MIN_BRAIN_CLI_VERSION, type BrainClient, } from "./brain/client.js";
|
|
23
23
|
export { recordCronRun, type CronRunRecord } from "./cron/scheduler.js";
|
|
24
24
|
export { createActivityStore, SPAN_OUTCOMES, type ActivityStore, type SpanRow, type SpanEventRow, type SpanOutcome, type SpanUsage, type ActivityChange, type RollupPricing, } from "./activity/store.js";
|
|
25
25
|
export { createActivityStream, type ActivityStream } from "./activity/stream.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI5C,OAAO,EACL,WAAW,EACX,WAAW,EACX,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI5C,OAAO,EACL,WAAW,EACX,WAAW,EACX,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKxE,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,UAAU,EACV,YAAY,EACZ,SAAS,GACV,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,aAAa,EACb,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,aAAa,EACb,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -29,7 +29,7 @@ export { resolveTurnTarget } from "./ws/routing.js";
|
|
|
29
29
|
export { createSessionCatalog, } from "./ws/session-catalog.js";
|
|
30
30
|
// Brain repo access (spawned CLI wrapper) — useful for embedders that add
|
|
31
31
|
// their own routes on top.
|
|
32
|
-
export { createBrainClient } from "./brain/client.js";
|
|
32
|
+
export { createBrainClient, MIN_BRAIN_CLI_VERSION, } from "./brain/client.js";
|
|
33
33
|
// Cron run history. Scheduling belongs to the deployment (container crontab);
|
|
34
34
|
// an external scheduler's wrapper records each run here so /api/status's
|
|
35
35
|
// `cronJobs` reflects what actually ran.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,SAAS,GAIV,MAAM,UAAU,CAAC;AAElB,6EAA6E;AAC7E,8EAA8E;AAC9E,OAAO,EACL,QAAQ,EACR,mBAAmB,GAOpB,MAAM,iBAAiB,CAAC;AAEzB,4EAA4E;AAC5E,+BAA+B;AAC/B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,GAK5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,eAAe,GAGhB,MAAM,sBAAsB,CAAC;AAE9B,gEAAgE;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,uEAAuE;AACvE,qBAAqB;AACrB,OAAO,EACL,WAAW,EACX,WAAW,EACX,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,+CAA+C;AAC/C,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EACL,mBAAmB,EACnB,aAAa,GAEd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,oBAAoB,GAErB,MAAM,yBAAyB,CAAC;AAEjC,0EAA0E;AAC1E,2BAA2B;AAC3B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,SAAS,GAIV,MAAM,UAAU,CAAC;AAElB,6EAA6E;AAC7E,8EAA8E;AAC9E,OAAO,EACL,QAAQ,EACR,mBAAmB,GAOpB,MAAM,iBAAiB,CAAC;AAEzB,4EAA4E;AAC5E,+BAA+B;AAC/B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,GAK5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,eAAe,GAGhB,MAAM,sBAAsB,CAAC;AAE9B,gEAAgE;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,uEAAuE;AACvE,qBAAqB;AACrB,OAAO,EACL,WAAW,EACX,WAAW,EACX,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,+CAA+C;AAC/C,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EACL,mBAAmB,EACnB,aAAa,GAEd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,oBAAoB,GAErB,MAAM,yBAAyB,CAAC;AAEjC,0EAA0E;AAC1E,2BAA2B;AAC3B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,mBAAmB,CAAC;AAE3B,8EAA8E;AAC9E,yEAAyE;AACzE,yCAAyC;AACzC,OAAO,EAAE,aAAa,EAAsB,MAAM,qBAAqB,CAAC;AAExE,0EAA0E;AAC1E,6EAA6E;AAC7E,oCAAoC;AACpC,OAAO,EACL,mBAAmB,EACnB,aAAa,GAQd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAuB,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAE9B,0EAA0E;AAC1E,6DAA6D;AAC7D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,4EAA4E;AAC5E,4EAA4E;AAC5E,yCAAyC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,4EAA4E;AAC5E,+EAA+E;AAC/E,2EAA2E;AAC3E,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,UAAU,EACV,YAAY,EACZ,SAAS,GACV,MAAM,0BAA0B,CAAC;AAiBlC,wEAAwE;AACxE,OAAO,EACL,aAAa,EACb,UAAU,GAEX,MAAM,4BAA4B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../src/middleware/origin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../src/middleware/origin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAgDvD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,OAAO,EACV,cAAc,EAAE,SAAS,MAAM,EAAE,EACjC,UAAU,UAAQ,GACjB,OAAO,CAqBT;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,cAAc,EAAE,SAAS,MAAM,EAAE,EACjC,UAAU,UAAQ,EAClB,eAAe,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACnE,iBAAiB,CAcnB;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,IAAI,iBAAiB,CAQ/C"}
|
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The scheme a browser would put in an `Origin` header for a connection this
|
|
3
|
+
* proxy describes.
|
|
4
|
+
*
|
|
5
|
+
* A browser's Origin is always http/https — never ws/wss, even for a
|
|
6
|
+
* WebSocket. Reverse proxies do not agree on that: several report the
|
|
7
|
+
* *connection* scheme in `X-Forwarded-Proto` and send `ws` / `wss` on an
|
|
8
|
+
* upgrade while sending `https` on ordinary requests. Comparing that verbatim
|
|
9
|
+
* builds an expected origin of `wss://host`, which no browser can ever match,
|
|
10
|
+
* so every WebSocket handshake that falls back to the Origin comparison is
|
|
11
|
+
* refused while HTTP keeps working. Browsers that send `Sec-Fetch-Site` on the
|
|
12
|
+
* handshake never reach this path, which is what made it look like a
|
|
13
|
+
* client-specific failure.
|
|
14
|
+
*/
|
|
15
|
+
function webOriginProtocol(forwarded) {
|
|
16
|
+
if (forwarded === "wss")
|
|
17
|
+
return "https:";
|
|
18
|
+
if (forwarded === "ws")
|
|
19
|
+
return "http:";
|
|
20
|
+
return `${forwarded}:`;
|
|
21
|
+
}
|
|
1
22
|
/**
|
|
2
23
|
* Compare the browser's Origin with the request's externally visible origin.
|
|
3
24
|
*
|
|
@@ -14,7 +35,7 @@ function originMatchesRequest(c, origin, trustProxy) {
|
|
|
14
35
|
return parsedOrigin.host === host;
|
|
15
36
|
const forwarded = c.req.header("x-forwarded-proto")?.split(",", 1)[0]?.trim();
|
|
16
37
|
const protocol = forwarded
|
|
17
|
-
?
|
|
38
|
+
? webOriginProtocol(forwarded.toLowerCase())
|
|
18
39
|
: new URL(c.req.url).protocol;
|
|
19
40
|
return parsedOrigin.origin === new URL(`${protocol}//${host}`).origin;
|
|
20
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/middleware/origin.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,CAAU,EACV,MAAc,EACd,UAAmB;IAEnB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU;QAAE,OAAO,YAAY,CAAC,IAAI,KAAK,IAAI,CAAC;IAEnD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAAG,SAAS;QACxB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/middleware/origin.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/brain.js
CHANGED
|
@@ -89,7 +89,7 @@ export function createBrainRoutes(deps) {
|
|
|
89
89
|
cwd: brainPath,
|
|
90
90
|
stdout: "pipe",
|
|
91
91
|
stderr: "pipe",
|
|
92
|
-
env: subprocessEnv({ NO_COLOR: "1" }),
|
|
92
|
+
env: subprocessEnv("brainCli", { NO_COLOR: "1" }),
|
|
93
93
|
});
|
|
94
94
|
// Start draining stderr NOW, not after the process exits.
|
|
95
95
|
//
|
|
@@ -186,7 +186,7 @@ export function createBrainRoutes(deps) {
|
|
|
186
186
|
cwd: brainPath,
|
|
187
187
|
stdout: "pipe",
|
|
188
188
|
stderr: "pipe",
|
|
189
|
-
env: subprocessEnv({ NO_COLOR: "1" }),
|
|
189
|
+
env: subprocessEnv("brainCli", { NO_COLOR: "1" }),
|
|
190
190
|
});
|
|
191
191
|
const reader = proc.stdout.getReader();
|
|
192
192
|
const decoder = new TextDecoder();
|
package/dist/routes/brain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/routes/brain.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/routes/brain.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schlessera/brain-ui-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.1",
|
|
4
4
|
"description": "brain-kit chat-UI server: Hono app factory, WebSocket turn coordinator, auth (password/passkeys/tailscale/proxy), session catalog, and brain/files/voice routes",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
},
|
|
28
28
|
"sideEffects": false,
|
|
29
29
|
"type": "module",
|
|
30
|
+
"bin": {
|
|
31
|
+
"brain-ui-cron": "./dist/bin/brain-ui-cron.js"
|
|
32
|
+
},
|
|
30
33
|
"exports": {
|
|
31
34
|
".": {
|
|
32
35
|
"bun": "./src/index.ts",
|
|
@@ -51,8 +54,8 @@
|
|
|
51
54
|
"dependencies": {
|
|
52
55
|
"@opentelemetry/api": "^1.9.1",
|
|
53
56
|
"@opentelemetry/api-logs": "0.221.0",
|
|
54
|
-
"@schlessera/brain-render-template": "0.
|
|
55
|
-
"@schlessera/brain-ui-sdk": "0.
|
|
57
|
+
"@schlessera/brain-render-template": "0.33.1",
|
|
58
|
+
"@schlessera/brain-ui-sdk": "0.33.1",
|
|
56
59
|
"@simplewebauthn/server": "^13.3.2",
|
|
57
60
|
"fflate": "^0.8.2",
|
|
58
61
|
"gray-matter": "^4.0.3",
|
package/src/app.ts
CHANGED
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
createBackendRegistry,
|
|
54
54
|
type BackendRegistry,
|
|
55
55
|
} from "./agent/backend.js";
|
|
56
|
-
import { createBrainClient } from "./brain/client.js";
|
|
56
|
+
import { createBrainClient, probeBrainCliVersion } from "./brain/client.js";
|
|
57
57
|
import { createCronScheduler } from "./cron/scheduler.js";
|
|
58
58
|
import { WsHost } from "./ws/host.js";
|
|
59
59
|
import { createWsUpgrade, websocket } from "./ws/connection.js";
|
|
@@ -177,6 +177,7 @@ export function createApp(options: CreateAppOptions = {}): BrainUiApp {
|
|
|
177
177
|
// Per-instance state: the app's own database, the brain CLI wrapper, the
|
|
178
178
|
// backend registry, and the WebSocket host. No module-level singletons —
|
|
179
179
|
// two apps with different configuration coexist in one process.
|
|
180
|
+
probeBrainCliVersion(config.brainPath, observability.logger("brain"));
|
|
180
181
|
const dbLog = observability.logger("db");
|
|
181
182
|
const db = createUiDb(config.dbPath, { log: dbLog });
|
|
182
183
|
const brain = createBrainClient({ brainPath: config.brainPath });
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/** Thin argv dispatcher for the ui-server's container cron jobs. */
|
|
3
|
+
|
|
4
|
+
import { statSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
|
|
7
|
+
import { resolveCronConfig } from "../config/env.js";
|
|
8
|
+
import { runDigest } from "../cron/digest.js";
|
|
9
|
+
import {
|
|
10
|
+
emitCrontab,
|
|
11
|
+
emitEnvironment,
|
|
12
|
+
type BrainModuleListPayload,
|
|
13
|
+
} from "../cron/emit.js";
|
|
14
|
+
import { runJob } from "../cron/run-job.js";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The bash this replaced tested `[ -f … ]`, which is true only for a regular
|
|
18
|
+
* file (following symlinks). `existsSync` would also accept a directory, and a
|
|
19
|
+
* directory at that path would put a root cron line in the crontab that the
|
|
20
|
+
* shell has always skipped.
|
|
21
|
+
*/
|
|
22
|
+
function isRegularFile(path: string): boolean {
|
|
23
|
+
try {
|
|
24
|
+
return statSync(path).isFile();
|
|
25
|
+
} catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const USAGE = `usage: brain-ui-cron run [--subprocess-env-extra <names>] <job-name> -- <command...>
|
|
31
|
+
brain-ui-cron digest
|
|
32
|
+
brain-ui-cron crontab [--wrapper-command <command>] [--digest-command <command>] [--path-line <line>] [--user <user>]
|
|
33
|
+
brain-ui-cron environment`;
|
|
34
|
+
|
|
35
|
+
const DEFAULT_WRAPPER_COMMAND = "bun /opt/brain-ui/server/scripts/cron-run.ts";
|
|
36
|
+
const DEFAULT_DIGEST_COMMAND = "bun /opt/brain-ui/server/scripts/brain-digest.ts";
|
|
37
|
+
const DEFAULT_PATH_LINE =
|
|
38
|
+
"PATH=/root/.local/bin:/root/.bun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
|
|
39
|
+
const DEFAULT_USER = "root";
|
|
40
|
+
|
|
41
|
+
function usage(): never {
|
|
42
|
+
process.stderr.write(`${USAGE}\n`);
|
|
43
|
+
process.exit(2);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function crontabOptions(args: string[]): {
|
|
47
|
+
wrapperCommand: string;
|
|
48
|
+
digestCommand: string;
|
|
49
|
+
pathLine: string;
|
|
50
|
+
user: string;
|
|
51
|
+
} {
|
|
52
|
+
const values = new Map<string, string>();
|
|
53
|
+
const accepted = new Set([
|
|
54
|
+
"--wrapper-command",
|
|
55
|
+
"--digest-command",
|
|
56
|
+
"--path-line",
|
|
57
|
+
"--user",
|
|
58
|
+
]);
|
|
59
|
+
for (let i = 0; i < args.length; i += 2) {
|
|
60
|
+
const flag = args[i];
|
|
61
|
+
const value = args[i + 1];
|
|
62
|
+
if (!accepted.has(flag) || value === undefined || value === "" || value.startsWith("--")) {
|
|
63
|
+
usage();
|
|
64
|
+
}
|
|
65
|
+
values.set(flag, value);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
wrapperCommand: values.get("--wrapper-command") ?? DEFAULT_WRAPPER_COMMAND,
|
|
69
|
+
digestCommand: values.get("--digest-command") ?? DEFAULT_DIGEST_COMMAND,
|
|
70
|
+
pathLine: values.get("--path-line") ?? DEFAULT_PATH_LINE,
|
|
71
|
+
user: values.get("--user") ?? DEFAULT_USER,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function runOptions(args: string[]): {
|
|
76
|
+
jobName: string;
|
|
77
|
+
command: string[];
|
|
78
|
+
subprocessEnvExtraNames: string[];
|
|
79
|
+
} {
|
|
80
|
+
let remaining = args;
|
|
81
|
+
let subprocessEnvExtraNames: string[] = [];
|
|
82
|
+
if (remaining[0] === "--subprocess-env-extra") {
|
|
83
|
+
const value = remaining[1];
|
|
84
|
+
if (value === undefined || value === "") usage();
|
|
85
|
+
subprocessEnvExtraNames = value.split(",");
|
|
86
|
+
remaining = remaining.slice(2);
|
|
87
|
+
}
|
|
88
|
+
const [jobName, separator, ...command] = remaining;
|
|
89
|
+
if (!jobName || separator !== "--" || command.length === 0) usage();
|
|
90
|
+
return { jobName, command, subprocessEnvExtraNames };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function readModuleList(
|
|
94
|
+
brainPath: string,
|
|
95
|
+
env: Record<string, string | undefined>
|
|
96
|
+
): Promise<BrainModuleListPayload | null> {
|
|
97
|
+
try {
|
|
98
|
+
const proc = Bun.spawn(["brain", "module", "list", "--json"], {
|
|
99
|
+
cwd: brainPath,
|
|
100
|
+
env,
|
|
101
|
+
stdout: "pipe",
|
|
102
|
+
stderr: "ignore",
|
|
103
|
+
});
|
|
104
|
+
const [exitCode, stdout] = await Promise.all([
|
|
105
|
+
proc.exited,
|
|
106
|
+
new Response(proc.stdout).text(),
|
|
107
|
+
]);
|
|
108
|
+
if (exitCode !== 0 || stdout.trim() === "") return null;
|
|
109
|
+
const parsed: unknown = JSON.parse(stdout);
|
|
110
|
+
if (
|
|
111
|
+
!parsed ||
|
|
112
|
+
typeof parsed !== "object" ||
|
|
113
|
+
!Array.isArray((parsed as Partial<BrainModuleListPayload>).enabled) ||
|
|
114
|
+
!Array.isArray((parsed as Partial<BrainModuleListPayload>).available)
|
|
115
|
+
) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return parsed as BrainModuleListPayload;
|
|
119
|
+
} catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const [subcommand, ...args] = process.argv.slice(2);
|
|
125
|
+
|
|
126
|
+
if (subcommand === "run") {
|
|
127
|
+
const { jobName, command, subprocessEnvExtraNames } = runOptions(args);
|
|
128
|
+
const config = resolveCronConfig(undefined, subprocessEnvExtraNames);
|
|
129
|
+
process.exit(
|
|
130
|
+
await runJob({
|
|
131
|
+
jobName,
|
|
132
|
+
command,
|
|
133
|
+
dbPath: config.dbPath,
|
|
134
|
+
childEnv: config.childEnv,
|
|
135
|
+
})
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (subcommand === "digest" && args.length === 0) {
|
|
140
|
+
const config = resolveCronConfig();
|
|
141
|
+
process.exit(runDigest({ dbPath: config.dbPath }));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (subcommand === "crontab") {
|
|
145
|
+
const config = resolveCronConfig();
|
|
146
|
+
const options = crontabOptions(args);
|
|
147
|
+
const modules = await readModuleList(
|
|
148
|
+
config.brainPath,
|
|
149
|
+
config.moduleDiscoveryEnv
|
|
150
|
+
);
|
|
151
|
+
process.stdout.write(
|
|
152
|
+
emitCrontab({
|
|
153
|
+
...options,
|
|
154
|
+
modules,
|
|
155
|
+
subprocessEnvExtraNames: config.subprocessEnvExtraNames,
|
|
156
|
+
legacyScraperPresent: isRegularFile(
|
|
157
|
+
join(config.brainPath, "scripts", "jobs", "scrape-all.ts")
|
|
158
|
+
),
|
|
159
|
+
})
|
|
160
|
+
);
|
|
161
|
+
process.exit(0);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (subcommand === "environment" && args.length === 0) {
|
|
165
|
+
const config = resolveCronConfig();
|
|
166
|
+
try {
|
|
167
|
+
process.stdout.write(
|
|
168
|
+
emitEnvironment(config.childEnv, config.subprocessEnvExtraNames)
|
|
169
|
+
);
|
|
170
|
+
process.exit(0);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
173
|
+
process.stderr.write(`[brain-ui-cron] ${message}\n`);
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
usage();
|