Spracherkennung für: .ts vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]
import { resolveDefaultAgentId } from "../../agents/agent-scope.js";
import { getHealthSnapshot, type HealthSummary } from "../../commands/health.js";
import { STATE_DIR, createConfigIO, loadConfig } from "../../config/config.js";
import { resolveMainSessionKey } from "../../config/sessions.js";
import { listSystemPresence } from "../../infra/system-presence.js";
import { getUpdateAvailable } from "../../infra/update-startup.js";
import { normalizeMainKey } from "../../routing/session-key.js";
import { resolveGatewayAuth } from "../auth.js";
import type { Snapshot } from "../protocol/index.js";
let presenceVersion = 1;
let healthVersion = 1;
let healthCache: HealthSummary | null = null;
let healthRefresh: Promise<HealthSummary> | null = null;
let broadcastHealthUpdate: ((snap: HealthSummary) => void) | null = null;
export function buildGatewaySnapshot(opts?: { includeSensitive?: boolean }): Snapshot {
const cfg = loadConfig();
const defaultAgentId = resolveDefaultAgentId(cfg);
const mainKey = normalizeMainKey(cfg.session?.mainKey);
const mainSessionKey = resolveMainSessionKey(cfg);
const scope = cfg.session?.scope ?? "per-sender";
const presence = listSystemPresence();
const uptimeMs = Math.round(process.uptime() * 1000);
const updateAvailable = getUpdateAvailable() ?? undefined;
// Health is async; caller should await getHealthSnapshot and replace later if needed.
const emptyHealth: unknown = {};
const snapshot: Snapshot = {
presence,
health: emptyHealth,
stateVersion: { presence: presenceVersion, health: healthVersion },
uptimeMs,
sessionDefaults: {
defaultAgentId,
mainKey,
mainSessionKey,
scope,
},
updateAvailable,
};
if (opts?.includeSensitive === true) {
const auth = resolveGatewayAuth({ authConfig: cfg.gateway?.auth, env: process.env });
// Surface resolved paths only to admin callers that already have broader gateway access.
snapshot.configPath = createConfigIO().configPath;
snapshot.stateDir = STATE_DIR;
snapshot.authMode = auth.mode;
}
return snapshot;
}
export function getHealthCache(): HealthSummary | null {
return healthCache;
}
export function getHealthVersion(): number {
return healthVersion;
}
export function incrementPresenceVersion(): number {
presenceVersion += 1;
return presenceVersion;
}
export function getPresenceVersion(): number {
return presenceVersion;
}
export function setBroadcastHealthUpdate(fn: ((snap: HealthSummary) => void) | null) {
broadcastHealthUpdate = fn;
}
export async function refreshGatewayHealthSnapshot(opts?: { probe?: boolean }) {
if (!healthRefresh) {
healthRefresh = (async () => {
const snap = await getHealthSnapshot({ probe: opts?.probe });
healthCache = snap;
healthVersion += 1;
if (broadcastHealthUpdate) {
broadcastHealthUpdate(snap);
}
return snap;
})().finally(() => {
healthRefresh = null;
});
}
return healthRefresh;
}
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet am 2026-04-27)
¤
*© Formatika GbR, Deutschland