Etihad multi-agent travel manager POC. Voice-first "desk" concept: a Manager agent (Opus) orchestrates specialist tools over a WebSocket, rendering proposal cards + back-office narration in an embedded React widget. Real agent, real socket, mock airline data (per ADR-008).
| Layer | Tech |
|---|---|
| Monorepo | Bun workspaces (apps/*, packages/*) |
| Contract | @tm/contract (zod schemas + inferred types) — aliased @contract |
| Server | Bun + Hono + Claude Agent SDK + bun:sqlite |
| Widget | React + Vite + Tailwind (prefix tm-) + Zustand + Framer Motion |
packages/contract/ # FE↔BE wire contract — zod only
apps/server/ # Bun.serve + Hono; WS upgrade; agent loop (later slices)
apps/widget/ # embedded widget; mount(el,cfg) / unmount()
bun install
bun run dev # boots server (:8787) + widget (:5173) in parallelbun run typecheck— typecheck all workspacesbun run build— build all workspaces
Slice 1 — scaffold (this commit): empty server + widget boot via
bun run dev. Contract, agent loop, cards, voice land in later slices. See
AiAssistantVault/Plans/etihad/build-issues.md for the 13-slice plan.
@contract is imported as @contract (tsconfig + Vite alias); the npm package
is named @tm/contract because a bare @contract scope is not a valid npm name.