* Build conversation context from OpenAI-format message history. * Skips system messages — Addie uses her own DB-sourced system prompt.
( messages: RawMessage[] )
| 173 | * Skips system messages — Addie uses her own DB-sourced system prompt. |
| 174 | */ |
| 175 | function buildThreadContext( |
| 176 | messages: RawMessage[] |
| 177 | ): { currentMessage: string; threadContext: Array<{ user: string; text: string }> } | null { |
| 178 | const chatMessages = messages |
| 179 | .filter((m) => m.role === "user" || m.role === "assistant") |
| 180 | .map((m) => ({ role: m.role, content: extractText(m.content) })); |
| 181 | |
| 182 | let lastUserIdx = -1; |
| 183 | for (let i = chatMessages.length - 1; i >= 0; i--) { |
| 184 | if (chatMessages[i].role === "user") { lastUserIdx = i; break; } |
| 185 | } |
| 186 | if (lastUserIdx === -1) return null; |
| 187 | |
| 188 | const currentMessage = chatMessages[lastUserIdx].content; |
| 189 | const history = chatMessages.slice(0, lastUserIdx); |
| 190 | |
| 191 | const threadContext = history.slice(-10).map((m) => ({ |
| 192 | user: m.role === "user" ? "User" : "Addie", |
| 193 | text: m.content, |
| 194 | })); |
| 195 | |
| 196 | return { currentMessage, threadContext }; |
| 197 | } |
| 198 | |
| 199 | /** |
| 200 | * Build user-scoped tools for a voice call, matching the web chat tool set. |
no test coverage detected