← 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;
}