( requestMessages: NormalizedMessage[], savedMessages: NormalizedMessage[], )
| 1291 | // Checks if requestMessages is a prefix of savedMessages, |
| 1292 | // and returns the index of the next assistant message if found. |
| 1293 | function findAssistantIndexAfterPrefix( |
| 1294 | requestMessages: NormalizedMessage[], |
| 1295 | savedMessages: NormalizedMessage[], |
| 1296 | ): number | undefined { |
| 1297 | const logFile = process.env.PROXY_DEBUG_LOG; |
| 1298 | const log = (msg: string) => { if (logFile) try { appendFileSync(logFile, msg + "\n"); } catch {} }; |
| 1299 | |
| 1300 | if (requestMessages.length >= savedMessages.length) { |
| 1301 | log(`prefix check failed: request.length=${requestMessages.length} >= saved.length=${savedMessages.length}`); |
| 1302 | return undefined; |
| 1303 | } |
| 1304 | |
| 1305 | for (let i = 0; i < requestMessages.length; i++) { |
| 1306 | const reqMsg = JSON.stringify(requestMessages[i]); |
| 1307 | const savedMsg = JSON.stringify(savedMessages[i]); |
| 1308 | if (reqMsg !== savedMsg) { |
| 1309 | log(`mismatch at index ${i}:`); |
| 1310 | log(` REQ: ${reqMsg.substring(0, 1000)}`); |
| 1311 | log(` SAVED: ${savedMsg.substring(0, 1000)}`); |
| 1312 | return undefined; |
| 1313 | } |
| 1314 | } |
| 1315 | |
| 1316 | // The next message after the prefix should be an assistant message |
| 1317 | const nextIndex = requestMessages.length; |
| 1318 | if ( |
| 1319 | nextIndex < savedMessages.length && |
| 1320 | savedMessages[nextIndex].role === "assistant" |
| 1321 | ) { |
| 1322 | log(`MATCH found at index ${nextIndex}`); |
| 1323 | return nextIndex; |
| 1324 | } |
| 1325 | |
| 1326 | log(`no assistant at nextIndex=${nextIndex}, saved.length=${savedMessages.length}`); |
| 1327 | return undefined; |
| 1328 | } |
| 1329 | |
| 1330 | function expandWorkDir( |
| 1331 | content: string | undefined, |
no test coverage detected
searching dependent graphs…