The core data-handling logic has been successfully migrated to TypeScript and refactored into modular files. This directly addresses the reasoning persistence bug and improves overall code quality.
frontend/types.ts
(392 lines)
messageToUIMessage
, createDefaultSessionTree
Session
, Message
, Branch
, SessionTree
, UIMessage
, AppState
, etc.frontend/core/db.ts
(NEW - 175 lines)
frontend/core/sessions.ts
(NEW - 470 lines)
loadSessions
, loadSession
, saveSession
(critical for reasoning persistence)createNewChat
, selectChat
, deleteChat
, duplicateChat
frontend/core/folders.ts
(NEW - 93 lines)
frontend/core/messages.ts
(NEW - 284 lines)
ensureChatExistsForEdits
, persistMessageAtIndex
deleteMessage
, deleteMessagesBelow
rerunFromUser
, rerunAssistant
with branching supportfrontend/core/import-export.ts
(NEW - 337 lines)
exportAllData
, importDataReplace
, importDataAppend
frontend/core/index.ts
(NEW - 54 lines)
frontend/core/jobManager.ts
(172 lines)
.js
frontend/core/branchManager.ts
(559 lines)
frontend/experimental/streaming.ts
(432 lines)
deno.json
"@/types": "./frontend/types.ts"
Updated Imports
frontend/chatterApp.js
- Uses './core/index.ts'
frontend/dataIO.js
- Uses './core/index.ts'
frontend/core/chatCore.js
(1310 lines) → Replaced by modular TypeScript filesfrontend/core/jobManager.js
→ Converted to jobManager.ts
The bug was caused by inconsistent data handling across multiple files. Now:
types.ts
saveSession
explicitly handles reasoning
field with proper null checksstreaming.ts
updates state.messages[idx].reasoning
during streamingloadSession
populates state.messageReasoningMap
from session treefrontend/
├── types.ts (392 lines) - Central type definitions
├── core/
│ ├── index.ts (54 lines) - Central export
│ ├── db.ts (175 lines) - Database init
│ ├── sessions.ts (470 lines) - Session operations
│ ├── folders.ts (93 lines) - Folder management
│ ├── messages.ts (284 lines) - Message operations
│ ├── import-export.ts (337 lines) - Data I/O
│ ├── jobManager.ts (172 lines) - Job streaming
│ └── branchManager.ts (559 lines) - Branching logic
├── experimental/
│ └── streaming.ts (432 lines) - Streaming logic
└── ...
Convert chatterApp.js
to TypeScript (1890 lines - large task)
Convert other utility files
apiClient.js
, chatterLib.js
, i18n.js
, etc.Add unit tests
frontend/core/index.ts