🤖 AI Streaming Simulator Cheat Sheet
🌐 Domain: wiki.comi.loca.zone | 🎯 Purpose: Live AI streaming & multi-agent diff simulation inside CodeMirror.
🏗️ Architecture
[Keymap: Mod-K] ──> (Effect: startAiSession)
│
▼
[aiStreamField] ──(State updates)──> [aiStreamPlugin]
│ │ (renders)
▼ ▼
[Multi-Agent Simulator] ───────────────> [AIBlockWidget] (UI/Diffs)
🧠 State Management: aiStreamField (StateField<AIState>)
interface AIState {
isActive: boolean;
activeAgent: 'Planner' | 'Coder' | 'Reviewer' | null;
streamContent: string;
diffs: Array<{ type: 'add' | 'remove' | 'unchanged'; text: string }>;
widgetPos: number | null;
}⚡ State Effects:
startAiSession(pos: number): Spawns widget.setAiStreamChunk(chunk: string): Appends streamed text.setAiAgentPhase(phase: 'Planner' | 'Coder' | 'Reviewer'): Swaps agent state.commitAiSession(): Writes changes to doc + closes widget.cancelAiSession(): Discards changes + closes widget.
🎨 Rendering: aiStreamPlugin & AIBlockWidget
aiStreamPlugin(ViewPlugin): Subscribes toaiStreamFieldupdates; injects/re-positions decoration widget atstate.widgetPos.AIBlockWidget(WidgetType):- Renders Copilot-style (
Mod+K) inline block. - Colors diffs dynamically (🟢 Green =
add| 🔴 Red =remove). - Displays real-time typing indicators per agent phase.
- Renders Copilot-style (
⚡ Execution Pipeline
- Trigger: User presses
Mod-K➡️ dispatchesstartAiSession. - Context Harvest: Resolves syntax node at cursor to build prompt context:
const contextNode = syntaxTree(view.state).resolveInner(pos); - Agent Simulation (
runSimulatedAi):- Phase 1: Planner 📋 (High-level plan stream).
- Phase 2: Coder 💻 (Streams code characters + diffs via recursive
setTimeoutloop). - Phase 3: Reviewer 🔍 (Validation step before automatic or manual commit).
💾 State & History Stores
📜 Global History (useAiHistoryStore - Zustand)
- Storage: LocalStorage (
comi-ai-history) viapersistmiddleware. - Schema (
AiHistoryEntry):{ id, timestamp, prompt, result, modelInfo }. - Actions:
addHistoryEntry(entry),clearHistory().
⚙️ Editor Config Store
- State:
showAiStream: boolean. - Actions:
toggleAiStream().
⚠️ Key Caveats & Overrides
- UI Clash Prevention: Render simulator stream output below the current line (prevents overlap with inline grey ghost text/Tab-completions).
- Vim Keymaps: Bindings configured to preempt standard default keymaps.