feat(routing): add pi canary guardrails and backend audit telemetry

This commit is contained in:
William Valentin
2026-02-23 21:13:01 -08:00
parent ac61c9c3fb
commit a389cd659c
4 changed files with 224 additions and 13 deletions
+6
View File
@@ -23,6 +23,7 @@ import type {
UserActionEvent,
QueuePreemptEvent,
BackendRouteEvent,
BackendSuccessEvent,
BackendFallbackEvent,
CronTriggerEvent,
WebhookReceiveEvent,
@@ -215,6 +216,11 @@ export class AuditLogger {
this.write({ level: 'info', event_type: 'backend.route', event: event as unknown as Record<string, unknown> });
}
backendSuccess(event: BackendSuccessEvent): void {
if (!this.shouldLog('sessions', 'info')) {return;}
this.write({ level: 'info', event_type: 'backend.success', event: event as unknown as Record<string, unknown> });
}
backendFallback(event: BackendFallbackEvent): void {
if (!this.shouldLog('sessions', 'warn')) {return;}
this.write({ level: 'warn', event_type: 'backend.fallback', event: event as unknown as Record<string, unknown> });
+16 -5
View File
@@ -12,7 +12,7 @@ export type AuditEventType =
// Session lifecycle
| 'session.create' | 'session.message' | 'session.delete' | 'session.transfer' | 'session.compact' | 'session.checkpoint' | 'session.auto_compact' | 'user.action'
| 'queue.preempt'
| 'backend.route' | 'backend.fallback'
| 'backend.route' | 'backend.success' | 'backend.fallback'
// Automation - Cron
| 'cron.trigger' | 'cron.sent' | 'cron.add' | 'cron.remove'
// Automation - Webhook
@@ -236,17 +236,28 @@ export interface BackendRouteEvent {
session_id: string;
channel: string;
sender: string;
selected_backend: 'native' | 'claude_code' | 'opencode' | 'codex' | 'gemini';
source: 'agent_override' | 'default_external' | 'native';
selected_backend: 'native' | 'claude_code' | 'opencode' | 'codex' | 'gemini' | 'pi_embedded';
source: 'agent_override' | 'default_external' | 'native' | 'forced_native_guard';
guard_reason?: 'capability_query' | 'pi_no_tools_mode' | 'attachments_present';
}
export interface BackendSuccessEvent {
session_id: string;
channel: string;
sender: string;
backend: 'claude_code' | 'opencode' | 'codex' | 'gemini' | 'pi_embedded';
duration_ms: number;
response_length: number;
}
export interface BackendFallbackEvent {
session_id: string;
channel: string;
sender: string;
from_backend: 'claude_code' | 'opencode' | 'codex' | 'gemini';
to_backend: 'native' | 'claude_code' | 'opencode' | 'codex' | 'gemini';
from_backend: 'claude_code' | 'opencode' | 'codex' | 'gemini' | 'pi_embedded';
to_backend: 'native' | 'claude_code' | 'opencode' | 'codex' | 'gemini' | 'pi_embedded';
reason: string;
duration_ms?: number;
}
export interface CronTriggerEvent {