(event: OpencodeHookEvent)
| 319 | const toolExecutionQueues = new Map<string, string[]>(); |
| 320 | |
| 321 | const handleHookEvent = (event: OpencodeHookEvent) => { |
| 322 | const payload = event.payload; |
| 323 | const eventType = event.event; |
| 324 | const payloadRecord = isObject(payload) ? payload as Record<string, unknown> : null; |
| 325 | const sessionId = event.sessionId |
| 326 | || extractSessionId(payload) |
| 327 | || (payloadRecord ? extractSessionId(payloadRecord.info) : null); |
| 328 | if (sessionId) { |
| 329 | session.onSessionFound(sessionId); |
| 330 | storageScanner?.onNewSession(sessionId); |
| 331 | } |
| 332 | |
| 333 | if (eventType === 'session.created' || eventType === 'session.updated') { |
| 334 | if (payloadRecord) { |
| 335 | const info = isObject(payloadRecord.info) ? payloadRecord.info as Record<string, unknown> : payloadRecord; |
| 336 | const sessionIdValue = extractSessionId(info) || getString(info.id); |
| 337 | if (sessionIdValue) { |
| 338 | session.onSessionFound(sessionIdValue); |
| 339 | storageScanner?.onNewSession(sessionIdValue); |
| 340 | } |
| 341 | } |
| 342 | return; |
| 343 | } |
| 344 | |
| 345 | if (eventType === 'message.updated') { |
| 346 | const message = unwrapMessage(payload); |
| 347 | if (!message) { |
| 348 | return; |
| 349 | } |
| 350 | const messageId = getString(message.id) || getString(message.messageId); |
| 351 | const role = getString(message.role); |
| 352 | if (messageId && role) { |
| 353 | messageRoles.set(messageId, role); |
| 354 | } |
| 355 | return; |
| 356 | } |
| 357 | |
| 358 | if (eventType === 'message.part.updated') { |
| 359 | const part = unwrapPart(payload); |
| 360 | if (!part) { |
| 361 | return; |
| 362 | } |
| 363 | const partType = getString(part.type); |
| 364 | const partId = getString(part.id); |
| 365 | const messageId = getString(part.messageID) |
| 366 | || getString(part.messageId) |
| 367 | || (payloadRecord ? getString(payloadRecord.messageID) || getString(payloadRecord.messageId) : null); |
| 368 | const delta = getTextDelta(payloadRecord); |
| 369 | |
| 370 | if (partType === 'text') { |
| 371 | if (partId && sentTextParts.has(partId)) { |
| 372 | return; |
| 373 | } |
| 374 | const role = (messageId && messageRoles.get(messageId)) ?? 'assistant'; |
| 375 | const key = partId ?? messageId; |
| 376 | const bufferValue = key ? textBuffers.get(key) ?? '' : ''; |
| 377 | const textFromPart = getString(part.text); |
| 378 | const nextBuffer = delta ? bufferValue + delta : bufferValue; |
nothing calls this directly
no test coverage detected