feat: Global E2E tests, multi-agent fixes, SIP agent tracing

- 13 Global Hospital smoke tests (CC Agent + Supervisor)
- Auto-unlock agent session in test setup via maint API
- agent-status-toggle sends agentId from localStorage (was missing)
- maint-otp-modal injects agentId from localStorage into all calls
- SIP manager logs agent identity on connect/disconnect/state changes
- seed-data.ts: added CC agent + marketing users, idempotent member
  creation, cleanup phase before seeding
- .gitignore: exclude test-results/ and playwright-report/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-11 12:12:22 +05:30
parent f09250f3ef
commit cb4894ddc3
9 changed files with 247 additions and 8 deletions

View File

@@ -6,6 +6,7 @@ let sipClient: SIPClient | null = null;
let connected = false;
let outboundPending = false;
let outboundActive = false;
let activeAgentId: string | null = null;
type StateUpdater = {
setConnectionStatus: (status: ConnectionStatus) => void;
@@ -42,6 +43,16 @@ export function connectSip(config: SIPConfig): void {
sipClient.disconnect();
}
// Resolve agent identity for logging
try {
const agentCfg = JSON.parse(localStorage.getItem('helix_agent_config') ?? '{}');
activeAgentId = agentCfg.ozonetelAgentId ?? null;
const ext = config.uri?.match(/sip:(\d+)@/)?.[1] ?? 'unknown';
console.log(`[SIP] Connecting agent=${activeAgentId} ext=${ext} ws=${config.wsServer}`);
} catch {
console.log(`[SIP] Connecting uri=${config.uri}`);
}
connected = true;
stateUpdater?.setConnectionStatus('connecting');
@@ -62,7 +73,7 @@ export function connectSip(config: SIPConfig): void {
return;
}
console.log(`[SIP-MGR] State: ${state} | caller=${number ?? 'none'} | ucid=${ucid ?? 'none'} | outboundActive=${outboundActive}`);
console.log(`[SIP] ${activeAgentId} | state=${state} | caller=${number ?? 'none'} | ucid=${ucid ?? 'none'} | outbound=${outboundActive}`);
stateUpdater?.setCallState(state);
if (!outboundActive && number !== undefined) {
@@ -90,12 +101,13 @@ export function disconnectSip(force = false): void {
console.log('[SIP-MGR] Disconnect blocked — call in progress');
return;
}
console.log('[SIP-MGR] Disconnecting SIP' + (force ? ' (forced)' : ''));
console.log(`[SIP] Disconnecting agent=${activeAgentId}` + (force ? ' (forced)' : ''));
sipClient?.disconnect();
sipClient = null;
connected = false;
outboundPending = false;
outboundActive = false;
activeAgentId = null;
stateUpdater?.setConnectionStatus('disconnected');
stateUpdater?.setCallUcid(null);
}