Files
twitter-lite/docs/research-runtime.md

3.2 KiB

Research runtime

Research uses Vercel AI SDK 7 streamText with ai-sdk-provider-codex-cli 2.3's app-server provider. The provider owns its local stdio child, thread resumption, protocol decoding, and abort handling. The app owns accepted requests, account-scoped tools, snapshots, and report validation. The separate WebSocket launcher is removed.

Tools

The provider does not register AI SDK tools as Codex dynamic tools. Existing research definitions and executors are exposed with createSdkMcpServer instead. Validation, connected-account scope, request budgets, evidence tracking, and read-only SNS behavior remain in agent-tools.server.ts. Provider execution is one agent turn; there is no second AI SDK tool loop replaying those calls. Only the registered research tools receive per-tool MCP approval overrides for non-interactive execution. Shell approvals and external MCP servers remain disabled. Failed or truncated Codex turns are treated as failures even when the provider emits a finish event without an error event. Resumed threads that already registered dynamic tools route their calls through onDynamicToolCall to the same validated executor.

Lifecycle and selection

The background runner is keyed by conversation ID. Acceptance saves the user message before starting the model. A request ID identifies a new conversation and deduplicates retries within the process. Overlapping turns of the same conversation are rejected, while different conversations can run independently.

The URL selects a conversation. GET status and SSE subscribe to that ID; selecting history never starts or cancels a turn. Reconnection sends the latest complete snapshot. Closing a browser or changing its URL only detaches a viewer. Only Stop, the execution timeout, or a server-side failure aborts generation. Authentication expiry or logout closes the viewer's stream.

SQLite retains messages, thread IDs, generated decks, and citations. It no longer stores a global active conversation pointer. Browser views cannot change another browser's selection. After a backend restart, unfinished conversations are marked interrupted and require an explicit follow-up. No turn is replayed automatically. Reports remain files under the configured report root.

Streaming presentation

The model stream uses smoothStream with 15 ms pacing and the supplied chunking pattern /[\u3040-\u309F\u30A0-\u30FF]|\S+\s+/. The trailing buffer flushes at the text-end event. The existing snapshot SSE remains the UI's reconnectable data channel; an HTTP request's lifetime never owns the model execution.

Streamdown displays partial Markdown and animates only the latest live answer. Completed messages render immediately. Reduced-motion preferences disable the animation. HTML is skipped, unsafe link protocols are rejected, images remain links, and retrieved post citations keep their deck navigation behavior. @shadcn/helpers/ai-sdk provides deterministic streaming fixtures for UI tests.

References: Codex provider, AI SDK smoothing, Streamdown animation, shadcn AI SDK helpers.