Feat : Log recorder
Some checks failed
release / build (push) Successful in 29s
release / verify-windows (push) Failing after 1m0s

This commit is contained in:
jeanotx32
2026-08-11 22:34:45 +02:00
parent 03b1963150
commit 1dd3959f29
16 changed files with 631 additions and 53 deletions

View File

@@ -521,6 +521,54 @@ export function emptyStatus(): AgentStatus {
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
/**
* Nature d'un évènement journalisé.
*
* Le message reste du texte libre, destiné à être lu ; ce champ le classe, pour
* que l'historique d'une VM puisse être filtré et illustré sans avoir à faire
* de l'analyse de chaîne. Il est facultatif : un agent d'une version antérieure
* n'en envoie pas, et son entrée s'affiche simplement sans pictogramme.
*
* Le préfixe porte la catégorie — l'interface s'en sert pour ses filtres, donc
* un nouvel évènement doit réutiliser un préfixe existant quand c'est possible.
*/
export const AGENT_EVENTS = [
'agent.connected',
'agent.disconnected',
'agent.enrolled',
'agent.updated',
'obs.connected',
'obs.disconnected',
'record.started',
'record.stopped',
'record.paused',
'record.resumed',
'record.split',
'stream.started',
'stream.stopped',
'capture.started',
'capture.stopped',
'watch.started',
'watch.private',
'watch.public',
'watch.offline',
'watch.failed',
'fullscreen.restored',
'fullscreen.failed',
'browser.opened',
'browser.closed',
'preset.applied',
'preset.failed',
'config.changed',
'command.failed',
] as const;
export type AgentEvent = (typeof AGENT_EVENTS)[number];
export function isAgentEvent(value: unknown): value is AgentEvent {
return typeof value === 'string' && (AGENT_EVENTS as readonly string[]).includes(value);
}
export interface HelloMessage {
type: 'hello';
protocol: number;
@@ -550,6 +598,7 @@ export interface LogMessage {
level: LogLevel;
message: string;
ts: number;
event?: AgentEvent;
}
export interface PongMessage {
@@ -635,6 +684,8 @@ export interface LogEntry {
level: LogLevel;
message: string;
ts: number;
/** Absent sur les entrées anciennes et sur celles des agents non mis à jour. */
event: AgentEvent | null;
}
/**