/**
* 中継(relay)とトークンのストアの出来事をログへ写す(指示書AY 段階10)。
*
* ★relay・tokens は logger を import しない★(tokens は proxy から、relay は時計を注入してテストする)ので、
* 受け口だけを `globalThis` に登録しておき、ルートがここを呼んでつなぐ。何度呼んでもよい。
* ★載せるのは件数・バイト数・固定の理由だけ★(ファイル名・file_id・トークン・制御盤の message は載せない。D12)。
*/
import { logEvent } from "@/lib/logger";
import type { SettingsStoreCorruptLogEvent } from "@/lib/logger/events";
import { setRelayEventSink, type RelayEvent } from "@/lib/ds-agent/relay";
import { setAgentTokenStoreWarnHandler } from "@/lib/ds-agent/tokens";
/** 制御盤から来た code を載せるときの長さの上限(段階10) */
export const AGENT_CODE_LOG_MAX_LENGTH = 64;
export function truncateAgentCode(code: string): string {
return code.slice(0, AGENT_CODE_LOG_MAX_LENGTH);
}
function logRelayEvent(e: RelayEvent): void {
switch (e.event) {
case "ds_agent.connected":
case "ds_agent.disconnected":
logEvent("info", e);
return;
case "ds_logs.export_completed":
logEvent("info", e);
return;
case "ds_logs.export_failed":
logEvent("warn", e.agent_code === undefined ? e : { ...e, agent_code: truncateAgentCode(e.agent_code) });
return;
}
}
export function ensureDsAgentLogging(): void {
if (globalThis.__dwatchDsAgentRelayEventSink !== logRelayEvent) setRelayEventSink(logRelayEvent);
if (globalThis.__dwatchAgentTokenStoreWarn === undefined) {
setAgentTokenStoreWarnHandler((info) => {
const event: SettingsStoreCorruptLogEvent = {
event: "settings.store_corrupt",
file_path: info.filePath,
backup_path: info.backupPath,
reason: info.reason,
};
logEvent("warn", event);
});
}
}