chat: rename the pi chat transport + model list to chat (Stage 4b/1)

Pure rename, no behavior change. Moves the misnamed "pi" chat harness into the
chat namespace:

- api/pi/{websocket,session-manager,types,logger,list-models} → api/chat/
- merge api/pi/rest.ts into api/chat/chat.ts (/pi/models → /chat/models,
  /pi/stt → /chat/stt); drop the piRestRouter mount
- PiEvent → ChatEvent, piWebsocket → chatWebsocket, listPiModels → listChatModels
- WS route /api/pi/chat/ws → /api/chat/ws, provider tag 'pi' → 'chat'
- frontend: useChat/useAudioRecording URLs, usePiModels→useModels /
  useVisiblePiModels→useVisibleModels / useEnabledPiModels→useEnabledModels,
  'PI_MODELS' query key → 'CHAT_MODELS', attachments provider 'pi-mono' → 'chat'

The /pi-mono provider/harness settings router is renamed separately (next commit).
Note: the WS route change requires the mobile app to point at /api/chat/ws.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-24 15:47:40 +00:00
co-authored by Claude Opus 4.8
parent 70555c8d71
commit 49df1c0b0c
31 changed files with 119 additions and 129 deletions
+6 -6
View File
@@ -6,12 +6,12 @@
* system init, and result messages.
*/
import type { PiEvent, MessageCost } from '../../api/pi/types';
import type { ChatEvent, MessageCost } from '../../api/chat/types';
type SessionCallback = (sessionId: string) => void;
type StreamParserCallbacks = {
onEvent: (event: PiEvent) => void;
onEvent: (event: ChatEvent) => void;
onSessionId: SessionCallback;
};
@@ -20,14 +20,14 @@ type ParseState = {
gotResult: boolean;
};
function flushTextBuffer(state: ParseState, onEvent: (event: PiEvent) => void): void {
function flushTextBuffer(state: ParseState, onEvent: (event: ChatEvent) => void): void {
if (state.textBuffer) {
onEvent({ type: 'text', text: state.textBuffer });
state.textBuffer = '';
}
}
function handleStreamEvent(msg: Record<string, unknown>, state: ParseState, onEvent: (event: PiEvent) => void): void {
function handleStreamEvent(msg: Record<string, unknown>, state: ParseState, onEvent: (event: ChatEvent) => void): void {
const event = msg.event as Record<string, unknown> | undefined;
if (event?.type === 'content_block_delta') {
const delta = event.delta as Record<string, unknown> | undefined;
@@ -38,7 +38,7 @@ function handleStreamEvent(msg: Record<string, unknown>, state: ParseState, onEv
}
}
function handleAssistant(msg: Record<string, unknown>, state: ParseState, onEvent: (event: PiEvent) => void): void {
function handleAssistant(msg: Record<string, unknown>, state: ParseState, onEvent: (event: ChatEvent) => void): void {
const message = msg.message as Record<string, unknown> | undefined;
const content = message?.content as Array<Record<string, unknown>> | undefined;
if (!Array.isArray(content)) return;
@@ -59,7 +59,7 @@ function handleAssistant(msg: Record<string, unknown>, state: ParseState, onEven
}
}
function handleUser(msg: Record<string, unknown>, onEvent: (event: PiEvent) => void): void {
function handleUser(msg: Record<string, unknown>, onEvent: (event: ChatEvent) => void): void {
const message = msg.message as Record<string, unknown> | undefined;
const content = message?.content as Array<Record<string, unknown>> | undefined;
if (!Array.isArray(content)) return;