← back to Dw Boardroom V2
src/types.ts
183 lines
// ═══════════════════════════════════════════════
// DW Boardroom V2 — Core Types
// ═══════════════════════════════════════════════
// Meeting phases — ported from boardroom meeting-engine.js
export const MEETING_PHASES = [
'caucus', 'call_to_order', 'old_business', 'current_business',
'new_business', 'breakout', 'minutes', 'adjournment'
] as const;
export type MeetingPhase = typeof MEETING_PHASES[number];
// Phase durations in seconds
export const PHASE_DURATIONS: Record<MeetingPhase, number> = {
caucus: 120,
call_to_order: 60,
old_business: 180,
current_business: 300,
new_business: 300,
breakout: 180,
minutes: 120,
adjournment: 60,
};
export const PHASE_LABELS: Record<MeetingPhase, string> = {
caucus: 'Caucus',
call_to_order: 'Call to Order',
old_business: 'Old Business',
current_business: 'Current Business',
new_business: 'New Business',
breakout: 'Breakout',
minutes: 'Minutes',
adjournment: 'Adjournment',
};
export type MeetingType = 'strategic' | 'initiative' | 'ops' | 'emergency';
export type MeetingStatus = 'scheduled' | 'in_progress' | 'completed' | 'halted' | 'crashed';
export type MessageType = 'dialogue' | 'phase' | 'system' | 'action' | 'decision';
export type DecisionType = 'A' | 'B' | 'C';
export type AgendaItemStatus = 'pending' | 'discussed' | 'resolved' | 'deferred';
// ─── Models ────────────────────────────────────
export interface Meeting {
id: string;
meeting_type: MeetingType;
phase: MeetingPhase;
status: MeetingStatus;
started_at: string | null;
ended_at: string | null;
summary: string | null;
attendees: string; // JSON array
action_items: string; // JSON array
created_at: string;
}
export interface MeetingMessage {
id: number;
meeting_id: string;
agent_id: string;
agent_name: string;
message: string;
message_type: MessageType;
phase: string | null;
created_at: string;
}
export interface AgendaItem {
id: number;
meeting_id: string;
topic: string;
recommendation: string | null;
decision_type: DecisionType;
owner: string | null;
position: number;
status: AgendaItemStatus;
created_at: string;
}
// ─── Agent System ──────────────────────────────
export interface Agent {
id: string;
name: string;
pm2: string;
port?: number;
color: string;
role: string;
dept: string;
hasApi: boolean;
subMgr?: string;
isNoteTaker?: boolean;
}
export interface Executive {
id: string;
name: string;
port: number;
color: string;
role: string;
avatar: string;
}
export interface DeptGroup {
emoji: string;
color: string;
leader: string;
exec: string;
label: string;
}
// ─── Voice ─────────────────────────────────────
export interface VoiceConfig {
tts_enabled: boolean;
tts_speed: number;
tts_volume: number;
auto_speak: boolean;
}
// ─── Governance Client Types ───────────────────
export interface GovDecision {
id: string;
topic: string;
decision_type: DecisionType;
recommendation: string | null;
owner: string;
status: string;
score: number | null;
created_at: string;
}
export interface GovDelegation {
id: string;
owner: string;
delegate: string;
autonomy_level: number;
status: string;
}
export interface GovEscalation {
id: number;
decision_id: string | null;
escalation_type: string;
hours_elapsed: number;
action_taken: string | null;
}
export interface GovStatus {
governance_mode: string;
active_meeting: any;
pending_decisions: number;
active_delegations: number;
active_escalations: number;
}
export interface GovDecisionStats {
total: number;
pending: number;
approved: number;
rejected: number;
deferred: number;
}
// ─── WebSocket Events ──────────────────────────
export type WSEventType =
| 'connected'
| 'meeting_started'
| 'meeting_phase'
| 'meeting_halted'
| 'meeting_completed'
| 'meeting_message'
| 'agent_speaking'
| 'agenda_updated'
| 'governance_event';
export interface WSEvent {
type: WSEventType;
payload: any;
timestamp: string;
}