mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-03-20 21:37:25 +00:00
- Add provider adapter layer (server/providers/) with registry pattern
- Claude, Cursor, Codex, Gemini adapters normalize native formats to NormalizedMessage
- Shared types.js defines ProviderAdapter interface and message kinds
- Registry enables polymorphic provider lookup
- Add unified REST endpoint: GET /api/sessions/:id/messages?provider=...
- Replaces four provider-specific message endpoints with one
- Delegates to provider adapters via registry
- Add frontend session-keyed store (useSessionStore)
- Per-session Map with serverMessages/realtimeMessages/merged
- Dedup by ID, stale threshold for re-fetch, background session accumulation
- No localStorage for messages — backend JSONL is source of truth
- Add normalizedToChatMessages converter (useChatMessages)
- Converts NormalizedMessage[] to existing ChatMessage[] UI format
- Wire unified store into ChatInterface, useChatSessionState, useChatRealtimeHandlers
- Session switch uses store cache for instant render
- Background WebSocket messages routed to correct session slot
30 lines
716 B
JavaScript
30 lines
716 B
JavaScript
/**
|
|
* Shared provider utilities.
|
|
*
|
|
* @module providers/utils
|
|
*/
|
|
|
|
/**
|
|
* Prefixes that indicate internal/system content which should be hidden from the UI.
|
|
* @type {readonly string[]}
|
|
*/
|
|
export const INTERNAL_CONTENT_PREFIXES = Object.freeze([
|
|
'<command-name>',
|
|
'<command-message>',
|
|
'<command-args>',
|
|
'<local-command-stdout>',
|
|
'<system-reminder>',
|
|
'Caveat:',
|
|
'This session is being continued from a previous',
|
|
'[Request interrupted',
|
|
]);
|
|
|
|
/**
|
|
* Check if user text content is internal/system that should be skipped.
|
|
* @param {string} content
|
|
* @returns {boolean}
|
|
*/
|
|
export function isInternalContent(content) {
|
|
return INTERNAL_CONTENT_PREFIXES.some(prefix => content.startsWith(prefix));
|
|
}
|