@schlessera/brain-ui-server 0.15.0 → 0.16.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 +3 -0
- package/dist/agent/backend.d.ts.map +1 -1
- package/dist/agent/backend.js +6 -2
- 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 +37 -6
- package/dist/app.js.map +1 -1
- package/dist/config/env.d.ts +8 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +48 -0
- package/dist/config/env.js.map +1 -1
- package/dist/cron/scheduler.d.ts +3 -0
- package/dist/cron/scheduler.d.ts.map +1 -1
- package/dist/cron/scheduler.js +11 -3
- 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 +2 -1
- package/dist/db/settings.d.ts.map +1 -1
- package/dist/db/settings.js +6 -2
- package/dist/db/settings.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/auth.d.ts +3 -2
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +28 -9
- 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 +3 -0
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +3 -0
- 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 +3 -3
- 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 +13 -6
- package/dist/voice/keyterm-builder.js.map +1 -1
- package/dist/ws/bridge.d.ts.map +1 -1
- package/dist/ws/bridge.js +6 -1
- package/dist/ws/bridge.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 +55 -8
- 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 +33 -15
- package/dist/ws/dispatch.js.map +1 -1
- package/dist/ws/host.d.ts +37 -0
- package/dist/ws/host.d.ts.map +1 -1
- package/dist/ws/host.js +37 -0
- 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 +23 -5
- package/dist/ws/run-session.js.map +1 -1
- package/dist/ws/turns.d.ts +13 -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 +5 -3
- package/src/agent/backend.ts +8 -6
- package/src/app.ts +46 -6
- package/src/config/env.ts +57 -0
- package/src/cron/scheduler.ts +14 -3
- package/src/db/client.ts +16 -5
- package/src/db/settings.ts +7 -2
- package/src/index.ts +37 -2
- package/src/middleware/auth.ts +30 -14
- 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 +7 -0
- package/src/routes/models.ts +8 -5
- package/src/routes/render.ts +3 -2
- package/src/routes/share.ts +6 -3
- package/src/share/staging.ts +18 -4
- package/src/voice/keyterm-builder.ts +17 -8
- package/src/ws/bridge.ts +5 -1
- package/src/ws/connection.ts +63 -12
- package/src/ws/dispatch.ts +44 -15
- package/src/ws/host.ts +54 -0
- package/src/ws/rate-limit.ts +86 -0
- package/src/ws/run-session.ts +26 -7
- package/src/ws/turns.ts +19 -3
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { bodyToString, flattenAttributes, severityRank, } from "./types.js";
|
|
2
|
+
const defaultWriter = (severity, line) => {
|
|
3
|
+
if (severity === "ERROR" || severity === "FATAL")
|
|
4
|
+
console.error(line);
|
|
5
|
+
else if (severity === "WARN")
|
|
6
|
+
console.warn(line);
|
|
7
|
+
else
|
|
8
|
+
console.log(line);
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Formats to the `[scope] message key=value` shape this repo already logs in,
|
|
12
|
+
* so adopting structured emission does not churn every existing log line's
|
|
13
|
+
* appearance at the same time.
|
|
14
|
+
*/
|
|
15
|
+
function formatLine(record) {
|
|
16
|
+
const attrs = Object.entries(record.attributes)
|
|
17
|
+
.filter(([, v]) => v !== undefined)
|
|
18
|
+
.map(([k, v]) => `${k}=${String(v)}`);
|
|
19
|
+
return `[${record.scope}] ${record.body}${attrs.length ? ` ${attrs.join(" ")}` : ""}`;
|
|
20
|
+
}
|
|
21
|
+
function toCaptured(scope, record) {
|
|
22
|
+
return {
|
|
23
|
+
scope,
|
|
24
|
+
severity: (record.severityText ?? "INFO"),
|
|
25
|
+
body: bodyToString(record.body),
|
|
26
|
+
attributes: flattenAttributes(record.attributes),
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** The production consumer: severity-filtered lines on stdout/stderr. */
|
|
31
|
+
export function createConsoleLoggerProvider(options = {}) {
|
|
32
|
+
const threshold = severityRank(options.minSeverity ?? "INFO");
|
|
33
|
+
const write = options.write ?? defaultWriter;
|
|
34
|
+
return {
|
|
35
|
+
getLogger(name) {
|
|
36
|
+
return {
|
|
37
|
+
emit(record) {
|
|
38
|
+
if (severityRank(record.severityText) < threshold)
|
|
39
|
+
return;
|
|
40
|
+
const captured = toCaptured(name, record);
|
|
41
|
+
write(captured.severity, formatLine(captured));
|
|
42
|
+
},
|
|
43
|
+
enabled(opts) {
|
|
44
|
+
void opts;
|
|
45
|
+
return true;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function matches(record, query) {
|
|
52
|
+
if (query.scope !== undefined && record.scope !== query.scope)
|
|
53
|
+
return false;
|
|
54
|
+
if (query.severity !== undefined && record.severity !== query.severity)
|
|
55
|
+
return false;
|
|
56
|
+
if (query.minSeverity !== undefined && severityRank(record.severity) < severityRank(query.minSeverity)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (query.body !== undefined && !record.body.includes(query.body))
|
|
60
|
+
return false;
|
|
61
|
+
for (const [key, value] of Object.entries(query.attributes ?? {})) {
|
|
62
|
+
if (record.attributes[key] !== value)
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The consumer a test installs. Because it implements the same interface the
|
|
69
|
+
* production consumer does, a test asserts against the real emission path —
|
|
70
|
+
* the instrumentation under test cannot tell the difference.
|
|
71
|
+
*/
|
|
72
|
+
export function createRecordingLoggerProvider(options = {}) {
|
|
73
|
+
const limit = options.limit ?? 1000;
|
|
74
|
+
const captured = [];
|
|
75
|
+
return {
|
|
76
|
+
getLogger(name) {
|
|
77
|
+
return {
|
|
78
|
+
emit(record) {
|
|
79
|
+
captured.push(toCaptured(name, record));
|
|
80
|
+
if (captured.length > limit)
|
|
81
|
+
captured.splice(0, captured.length - limit);
|
|
82
|
+
},
|
|
83
|
+
enabled() {
|
|
84
|
+
return true;
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
records: () => [...captured],
|
|
89
|
+
find: (query = {}) => captured.filter((r) => matches(r, query)),
|
|
90
|
+
count: (query = {}) => captured.reduce((n, r) => n + (matches(r, query) ? 1 : 0), 0),
|
|
91
|
+
clear: () => {
|
|
92
|
+
captured.length = 0;
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** A consumer that discards everything — the default when nothing is installed. */
|
|
97
|
+
export function createSilentLoggerProvider() {
|
|
98
|
+
return {
|
|
99
|
+
getLogger() {
|
|
100
|
+
return {
|
|
101
|
+
emit() { },
|
|
102
|
+
enabled() {
|
|
103
|
+
return false;
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=loggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loggers.js","sourceRoot":"","sources":["../../src/observability/loggers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An in-process `MeterProvider` — the counters behind `/api/status`, and the
|
|
3
|
+
* assertion surface for tests.
|
|
4
|
+
*
|
|
5
|
+
* One implementation serves both on purpose. A test double that is a different
|
|
6
|
+
* implementation from the production one only proves the double works; this
|
|
7
|
+
* way, the thing a test asserts against is the thing that actually counts in
|
|
8
|
+
* production.
|
|
9
|
+
*
|
|
10
|
+
* It is NOT `@opentelemetry/sdk-metrics`. The producing side is the standard
|
|
11
|
+
* API, so instrumentation is portable and a real SDK can replace this without
|
|
12
|
+
* touching a single `counter.add()` call — but the consuming side is ours,
|
|
13
|
+
* which is what keeps the dependency surface to one stable package.
|
|
14
|
+
*
|
|
15
|
+
* Synchronous instruments (counter, up-down counter, histogram, gauge) record.
|
|
16
|
+
* The observable/async instruments satisfy the interface and do nothing: they
|
|
17
|
+
* require a collection cycle to be meaningful, and nothing here runs one. A
|
|
18
|
+
* caller reaching for one is a signal to bring in a real SDK, not to grow this.
|
|
19
|
+
*/
|
|
20
|
+
import type { Attributes, MeterProvider } from "@opentelemetry/api";
|
|
21
|
+
import { type MetricSnapshot } from "./types.js";
|
|
22
|
+
/** Read side of the recorded metrics. */
|
|
23
|
+
export interface MetricsReader {
|
|
24
|
+
/** Every recorded series, sorted by name then attribute key. */
|
|
25
|
+
snapshot(): MetricSnapshot;
|
|
26
|
+
/** One series' value, or undefined when nothing recorded it. */
|
|
27
|
+
value(name: string, attributes?: Attributes): number | undefined;
|
|
28
|
+
/** Summed across every attribute combination of an instrument. */
|
|
29
|
+
total(name: string): number;
|
|
30
|
+
reset(): void;
|
|
31
|
+
}
|
|
32
|
+
export interface InMemoryMeterProvider extends MeterProvider, MetricsReader {
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A provider whose meters all write into one recorder, so a snapshot spans
|
|
36
|
+
* every instrumentation scope in the process.
|
|
37
|
+
*/
|
|
38
|
+
export declare function createInMemoryMeterProvider(): InMemoryMeterProvider;
|
|
39
|
+
//# sourceMappingURL=meter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meter.d.ts","sourceRoot":"","sources":["../../src/observability/meter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EACV,UAAU,EAOV,aAAa,EAOd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,QAAQ,IAAI,cAAc,CAAC;IAC3B,gEAAgE;IAChE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;IACjE,kEAAkE;IAClE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,KAAK,IAAI,IAAI,CAAC;CACf;AAuHD,MAAM,WAAW,qBAAsB,SAAQ,aAAa,EAAE,aAAa;CAAG;AAE9E;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,qBAAqB,CAYnE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { flattenAttributes, seriesKey, } from "./types.js";
|
|
2
|
+
class Recorder {
|
|
3
|
+
series = new Map();
|
|
4
|
+
record(name, kind, value, attributes) {
|
|
5
|
+
const key = seriesKey(name, attributes);
|
|
6
|
+
const existing = this.series.get(key);
|
|
7
|
+
if (existing) {
|
|
8
|
+
// A gauge is a level, not an accumulation.
|
|
9
|
+
existing.value = kind === "gauge" ? value : existing.value + value;
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
this.series.set(key, { key, name, kind, value, attributes: flattenAttributes(attributes) });
|
|
13
|
+
}
|
|
14
|
+
snapshot() {
|
|
15
|
+
return [...this.series.values()]
|
|
16
|
+
.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0))
|
|
17
|
+
.map(({ name, attributes, value, kind }) => ({ name, attributes, value, kind }));
|
|
18
|
+
}
|
|
19
|
+
value(name, attributes) {
|
|
20
|
+
return this.series.get(seriesKey(name, attributes))?.value;
|
|
21
|
+
}
|
|
22
|
+
total(name) {
|
|
23
|
+
let sum = 0;
|
|
24
|
+
for (const s of this.series.values())
|
|
25
|
+
if (s.name === name)
|
|
26
|
+
sum += s.value;
|
|
27
|
+
return sum;
|
|
28
|
+
}
|
|
29
|
+
reset() {
|
|
30
|
+
this.series.clear();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Instruments that do nothing, for the async half of the Meter interface. */
|
|
34
|
+
function noopObservable() {
|
|
35
|
+
return {
|
|
36
|
+
addCallback() { },
|
|
37
|
+
removeCallback() { },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
class InMemoryMeter {
|
|
41
|
+
recorder;
|
|
42
|
+
constructor(recorder) {
|
|
43
|
+
this.recorder = recorder;
|
|
44
|
+
}
|
|
45
|
+
createCounter(name, _options) {
|
|
46
|
+
return {
|
|
47
|
+
add: (value, attributes) => this.recorder.record(name, "counter", value, attributes),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
createUpDownCounter(name, _options) {
|
|
51
|
+
return {
|
|
52
|
+
add: (value, attributes) => this.recorder.record(name, "updowncounter", value, attributes),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
createHistogram(name, _options) {
|
|
56
|
+
return {
|
|
57
|
+
// Count of observations, not the distribution: a real SDK owns buckets.
|
|
58
|
+
record: (_value, attributes) => this.recorder.record(name, "histogram", 1, attributes),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
createGauge(name, _options) {
|
|
62
|
+
return {
|
|
63
|
+
record: (value, attributes) => this.recorder.record(name, "gauge", value, attributes),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
createObservableGauge() {
|
|
67
|
+
return noopObservable();
|
|
68
|
+
}
|
|
69
|
+
createObservableCounter() {
|
|
70
|
+
return noopObservable();
|
|
71
|
+
}
|
|
72
|
+
createObservableUpDownCounter() {
|
|
73
|
+
return noopObservable();
|
|
74
|
+
}
|
|
75
|
+
addBatchObservableCallback(_callback, _observables) { }
|
|
76
|
+
removeBatchObservableCallback(_callback, _observables) { }
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A provider whose meters all write into one recorder, so a snapshot spans
|
|
80
|
+
* every instrumentation scope in the process.
|
|
81
|
+
*/
|
|
82
|
+
export function createInMemoryMeterProvider() {
|
|
83
|
+
const recorder = new Recorder();
|
|
84
|
+
const meter = new InMemoryMeter(recorder);
|
|
85
|
+
return {
|
|
86
|
+
getMeter(_name, _version, _options) {
|
|
87
|
+
return meter;
|
|
88
|
+
},
|
|
89
|
+
snapshot: () => recorder.snapshot(),
|
|
90
|
+
value: (name, attributes) => recorder.value(name, attributes),
|
|
91
|
+
total: (name) => recorder.total(name),
|
|
92
|
+
reset: () => recorder.reset(),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=meter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meter.js","sourceRoot":"","sources":["../../src/observability/meter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shapes the observability consumers expose for inspection.
|
|
3
|
+
*
|
|
4
|
+
* These exist so that "what did the server report?" is answerable as DATA — by
|
|
5
|
+
* a test, by `/api/status`, by a future exporter — rather than by scraping
|
|
6
|
+
* stdout. Every consumer in this directory implements a standard OpenTelemetry
|
|
7
|
+
* provider interface, so swapping one for another is an argument change and
|
|
8
|
+
* never a change to instrumentation.
|
|
9
|
+
*/
|
|
10
|
+
import type { Attributes } from "@opentelemetry/api";
|
|
11
|
+
import type { LogRecord } from "@opentelemetry/api-logs";
|
|
12
|
+
/**
|
|
13
|
+
* Attributes as this package retains them.
|
|
14
|
+
*
|
|
15
|
+
* Log attributes upstream are `AnyValue` — nested maps, arrays, null. Metric
|
|
16
|
+
* attributes are narrower. Both are normalized to scalars on capture so one
|
|
17
|
+
* query shape works over either, `/api/status` stays JSON-safe, and a
|
|
18
|
+
* formatted line never prints `[object Object]`.
|
|
19
|
+
*/
|
|
20
|
+
export type FlatAttributes = Record<string, string | number | boolean>;
|
|
21
|
+
/** Coerce either attribute flavour to scalars, dropping empty values. */
|
|
22
|
+
export declare function flattenAttributes(attributes: unknown): FlatAttributes;
|
|
23
|
+
/** Severities this codebase uses, ordered. Anything below the configured
|
|
24
|
+
* threshold is dropped by the console consumer before it is formatted. */
|
|
25
|
+
export declare const SEVERITIES: readonly ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"];
|
|
26
|
+
export type Severity = (typeof SEVERITIES)[number];
|
|
27
|
+
export declare function severityRank(severity: string | undefined): number;
|
|
28
|
+
/** One emitted record, with the scope that produced it. */
|
|
29
|
+
export interface CapturedLog {
|
|
30
|
+
/** Instrumentation scope — the `[ws]` / `[auth]` prefix this repo already uses. */
|
|
31
|
+
scope: string;
|
|
32
|
+
severity: Severity;
|
|
33
|
+
body: string;
|
|
34
|
+
attributes: FlatAttributes;
|
|
35
|
+
/** Wall clock at emit, in ms. */
|
|
36
|
+
timestamp: number;
|
|
37
|
+
}
|
|
38
|
+
/** A query over captured logs. Every field is an AND, every field optional. */
|
|
39
|
+
export interface LogQuery {
|
|
40
|
+
scope?: string;
|
|
41
|
+
severity?: Severity;
|
|
42
|
+
/** Minimum severity, inclusive. */
|
|
43
|
+
minSeverity?: Severity;
|
|
44
|
+
/** Substring match against the body. */
|
|
45
|
+
body?: string;
|
|
46
|
+
/** Every listed attribute must be present and equal. */
|
|
47
|
+
attributes?: FlatAttributes;
|
|
48
|
+
}
|
|
49
|
+
/** One counter/histogram series: an instrument plus one attribute combination. */
|
|
50
|
+
export interface MetricPoint {
|
|
51
|
+
name: string;
|
|
52
|
+
/** The attribute set that identifies this series. */
|
|
53
|
+
attributes: FlatAttributes;
|
|
54
|
+
/** Sum for counters, count of observations for histograms. */
|
|
55
|
+
value: number;
|
|
56
|
+
kind: "counter" | "updowncounter" | "histogram" | "gauge";
|
|
57
|
+
}
|
|
58
|
+
/** Serializable metric state, for `/api/status` and for assertions. */
|
|
59
|
+
export type MetricSnapshot = MetricPoint[];
|
|
60
|
+
/**
|
|
61
|
+
* Stable key for a series. Attributes are sorted, so two calls with the same
|
|
62
|
+
* attributes in a different literal order land on the same series.
|
|
63
|
+
*/
|
|
64
|
+
export declare function seriesKey(name: string, attributes: Attributes | undefined): string;
|
|
65
|
+
/** Convert a `LogRecord` body — typed as unknown-ish upstream — to a string. */
|
|
66
|
+
export declare function bodyToString(body: LogRecord["body"]): string;
|
|
67
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/observability/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAEvE,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,OAAO,GAAG,cAAc,CAYrE;AAED;2EAC2E;AAC3E,eAAO,MAAM,UAAU,+DAAgE,CAAC;AACxF,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGjE;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,mCAAmC;IACnC,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,UAAU,EAAE,cAAc,CAAC;IAC3B,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,GAAG,eAAe,GAAG,WAAW,GAAG,OAAO,CAAC;CAC3D;AAED,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG,WAAW,EAAE,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAMlF;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAI5D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Coerce either attribute flavour to scalars, dropping empty values. */
|
|
2
|
+
export function flattenAttributes(attributes) {
|
|
3
|
+
const flat = {};
|
|
4
|
+
if (!attributes || typeof attributes !== "object")
|
|
5
|
+
return flat;
|
|
6
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
7
|
+
if (value === undefined || value === null)
|
|
8
|
+
continue;
|
|
9
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
10
|
+
flat[key] = value;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
flat[key] = JSON.stringify(value);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return flat;
|
|
17
|
+
}
|
|
18
|
+
/** Severities this codebase uses, ordered. Anything below the configured
|
|
19
|
+
* threshold is dropped by the console consumer before it is formatted. */
|
|
20
|
+
export const SEVERITIES = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"];
|
|
21
|
+
export function severityRank(severity) {
|
|
22
|
+
const index = SEVERITIES.indexOf((severity ?? "INFO"));
|
|
23
|
+
return index === -1 ? SEVERITIES.indexOf("INFO") : index;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Stable key for a series. Attributes are sorted, so two calls with the same
|
|
27
|
+
* attributes in a different literal order land on the same series.
|
|
28
|
+
*/
|
|
29
|
+
export function seriesKey(name, attributes) {
|
|
30
|
+
const entries = Object.entries(attributes ?? {})
|
|
31
|
+
.filter(([, v]) => v !== undefined)
|
|
32
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
33
|
+
.map(([k, v]) => `${k}=${String(v)}`);
|
|
34
|
+
return entries.length ? `${name}|${entries.join(",")}` : name;
|
|
35
|
+
}
|
|
36
|
+
/** Convert a `LogRecord` body — typed as unknown-ish upstream — to a string. */
|
|
37
|
+
export function bodyToString(body) {
|
|
38
|
+
if (typeof body === "string")
|
|
39
|
+
return body;
|
|
40
|
+
if (body === undefined || body === null)
|
|
41
|
+
return "";
|
|
42
|
+
return typeof body === "object" ? JSON.stringify(body) : String(body);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/observability/types.ts"],"names":[],"mappings":"AAsBA,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,UAAmB;IACnD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAqC,CAAC,EAAE,CAAC;QACjF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACzF,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;2EAC2E;AAC3E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAGxF,MAAM,UAAU,YAAY,CAAC,QAA4B;IACvD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAa,CAAC,CAAC;IACnE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,CAAC;AAsCD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,UAAkC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;SAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACnD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/routes/brain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAIrC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAqBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/routes/brain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAIrC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAqBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAqR7D"}
|
package/dist/routes/brain.js
CHANGED
|
@@ -89,6 +89,14 @@ export function createBrainRoutes(deps) {
|
|
|
89
89
|
stderr: "pipe",
|
|
90
90
|
env: subprocessEnv({ NO_COLOR: "1" }),
|
|
91
91
|
});
|
|
92
|
+
// Start draining stderr NOW, not after the process exits.
|
|
93
|
+
//
|
|
94
|
+
// The stdout loop below can run for minutes. Meanwhile stderr fills an
|
|
95
|
+
// OS pipe buffer that nothing is reading — and once it is full the
|
|
96
|
+
// child blocks on write, never exits, and `await proc.exited` never
|
|
97
|
+
// resolves. A chatty run deadlocked the request; a quiet one looked
|
|
98
|
+
// fine, which is why this survived.
|
|
99
|
+
const stderrText = new Response(proc.stderr).text();
|
|
92
100
|
const reader = proc.stdout.getReader();
|
|
93
101
|
const decoder = new TextDecoder();
|
|
94
102
|
let buffer = "";
|
|
@@ -110,7 +118,7 @@ export function createBrainRoutes(deps) {
|
|
|
110
118
|
}
|
|
111
119
|
catch { }
|
|
112
120
|
const exitCode = await proc.exited;
|
|
113
|
-
const stderr = await
|
|
121
|
+
const stderr = await stderrText;
|
|
114
122
|
if (stderr.trim()) {
|
|
115
123
|
for (const line of stderr.split("\n")) {
|
|
116
124
|
if (line.trim())
|
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/dist/routes/files.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA4B5B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA4B5B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyEjF"}
|
package/dist/routes/files.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { listDirectory, readFileContent, resolveAncestors, resolveForRaw, buildWikilinkMap, NotFoundError, PathEscapeError, TooLargeError, } from "../files/walker.js";
|
|
3
3
|
const WIKILINK_TTL_MS = 30_000;
|
|
4
|
-
function errorResponse(err) {
|
|
4
|
+
function errorResponse(err, log) {
|
|
5
5
|
if (err instanceof PathEscapeError) {
|
|
6
6
|
return { body: { error: "invalid_path" }, status: 400 };
|
|
7
7
|
}
|
|
@@ -11,11 +11,11 @@ function errorResponse(err) {
|
|
|
11
11
|
if (err instanceof TooLargeError) {
|
|
12
12
|
return { body: { error: "file_too_large", size: err.size }, status: 413 };
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
log?.emit({ severityText: "ERROR", body: "file request failed", attributes: { error: err instanceof Error ? err.message : String(err) } });
|
|
15
15
|
return { body: { error: err instanceof Error ? err.message : "internal_error" }, status: 500 };
|
|
16
16
|
}
|
|
17
17
|
export function createFilesRoutes(deps) {
|
|
18
|
-
const { brainRoot } = deps;
|
|
18
|
+
const { brainRoot, log } = deps;
|
|
19
19
|
let wikilinkCache = null;
|
|
20
20
|
return new Hono()
|
|
21
21
|
.get("/files/tree", async (c) => {
|
|
@@ -25,7 +25,7 @@ export function createFilesRoutes(deps) {
|
|
|
25
25
|
return c.json({ path, entries });
|
|
26
26
|
}
|
|
27
27
|
catch (err) {
|
|
28
|
-
const { body, status } = errorResponse(err);
|
|
28
|
+
const { body, status } = errorResponse(err, log);
|
|
29
29
|
return c.json(body, status);
|
|
30
30
|
}
|
|
31
31
|
})
|
|
@@ -54,7 +54,7 @@ export function createFilesRoutes(deps) {
|
|
|
54
54
|
return c.json({ path, ...result });
|
|
55
55
|
}
|
|
56
56
|
catch (err) {
|
|
57
|
-
const { body, status } = errorResponse(err);
|
|
57
|
+
const { body, status } = errorResponse(err, log);
|
|
58
58
|
return c.json(body, status);
|
|
59
59
|
}
|
|
60
60
|
})
|
|
@@ -67,7 +67,7 @@ export function createFilesRoutes(deps) {
|
|
|
67
67
|
return c.json({ path, ...result });
|
|
68
68
|
}
|
|
69
69
|
catch (err) {
|
|
70
|
-
const { body, status } = errorResponse(err);
|
|
70
|
+
const { body, status } = errorResponse(err, log);
|
|
71
71
|
return c.json(body, status);
|
|
72
72
|
}
|
|
73
73
|
})
|
|
@@ -86,7 +86,7 @@ export function createFilesRoutes(deps) {
|
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
88
|
catch (err) {
|
|
89
|
-
const { body, status } = errorResponse(err);
|
|
89
|
+
const { body, status } = errorResponse(err, log);
|
|
90
90
|
return c.json(body, status);
|
|
91
91
|
}
|
|
92
92
|
});
|
package/dist/routes/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/graph.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/routes/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAmD5B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA+
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/routes/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAmD5B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA+DjF"}
|
package/dist/routes/graph.js
CHANGED
|
@@ -6,14 +6,14 @@ import { DEFAULT_STALE_DAYS, GraphNotFoundError, GraphUnavailableError, MAX_DISC
|
|
|
6
6
|
* subgraph endpoints instead refuse with 503 rather than returning an empty
|
|
7
7
|
* graph that would read as "your repo has no links".
|
|
8
8
|
*/
|
|
9
|
-
function errorResponse(err) {
|
|
9
|
+
function errorResponse(err, log) {
|
|
10
10
|
if (err instanceof GraphUnavailableError) {
|
|
11
11
|
return { body: { error: "graph_unavailable", reason: err.reason }, status: 503 };
|
|
12
12
|
}
|
|
13
13
|
if (err instanceof GraphNotFoundError) {
|
|
14
14
|
return { body: { error: "not_found" }, status: 404 };
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
log?.emit({ severityText: "ERROR", body: "graph request failed", attributes: { error: err instanceof Error ? err.message : String(err) } });
|
|
17
17
|
return { body: { error: err instanceof Error ? err.message : "internal_error" }, status: 500 };
|
|
18
18
|
}
|
|
19
19
|
/** Returns null when the parameter is present but not an integer in range. */
|
|
@@ -34,7 +34,7 @@ function invalid(param) {
|
|
|
34
34
|
return { error: "invalid_param", param };
|
|
35
35
|
}
|
|
36
36
|
export function createGraphRoutes(deps) {
|
|
37
|
-
const { brainRoot } = deps;
|
|
37
|
+
const { brainRoot, log } = deps;
|
|
38
38
|
return new Hono()
|
|
39
39
|
.get("/graph/meta", (c) => c.json(getGraphMeta({ brainPath: brainRoot })))
|
|
40
40
|
.get("/graph/clusters", (c) => {
|
|
@@ -49,7 +49,7 @@ export function createGraphRoutes(deps) {
|
|
|
49
49
|
return c.json(getClusters({ brainPath: brainRoot, community, includeIsolates: c.req.query("isolates") === "1" }));
|
|
50
50
|
}
|
|
51
51
|
catch (err) {
|
|
52
|
-
const { body, status } = errorResponse(err);
|
|
52
|
+
const { body, status } = errorResponse(err, log);
|
|
53
53
|
return c.json(body, status);
|
|
54
54
|
}
|
|
55
55
|
})
|
|
@@ -67,7 +67,7 @@ export function createGraphRoutes(deps) {
|
|
|
67
67
|
return c.json(getNeighborhood({ brainPath: brainRoot, center, depth, direction }));
|
|
68
68
|
}
|
|
69
69
|
catch (err) {
|
|
70
|
-
const { body, status } = errorResponse(err);
|
|
70
|
+
const { body, status } = errorResponse(err, log);
|
|
71
71
|
return c.json(body, status);
|
|
72
72
|
}
|
|
73
73
|
})
|
|
@@ -83,7 +83,7 @@ export function createGraphRoutes(deps) {
|
|
|
83
83
|
return c.json(getDiscovery({ brainPath: brainRoot, root, direction, maxDepth }));
|
|
84
84
|
}
|
|
85
85
|
catch (err) {
|
|
86
|
-
const { body, status } = errorResponse(err);
|
|
86
|
+
const { body, status } = errorResponse(err, log);
|
|
87
87
|
return c.json(body, status);
|
|
88
88
|
}
|
|
89
89
|
})
|
|
@@ -95,7 +95,7 @@ export function createGraphRoutes(deps) {
|
|
|
95
95
|
return c.json(getMaintenance({ brainPath: brainRoot, staleDays }));
|
|
96
96
|
}
|
|
97
97
|
catch (err) {
|
|
98
|
-
const { body, status } = errorResponse(err);
|
|
98
|
+
const { body, status } = errorResponse(err, log);
|
|
99
99
|
return c.json(body, status);
|
|
100
100
|
}
|
|
101
101
|
});
|