( agentDir: string, taskId: string, offset: number, maxBytes: number, )
| 119 | * Mirrors agent-core's `readTaskOutputBytes` so large logs page identically. |
| 120 | */ |
| 121 | export async function readTaskOutput( |
| 122 | agentDir: string, |
| 123 | taskId: string, |
| 124 | offset: number, |
| 125 | maxBytes: number, |
| 126 | ): Promise<TaskOutputWindow> { |
| 127 | const start = Math.max(0, Math.trunc(offset)); |
| 128 | const limit = Math.max(0, Math.trunc(maxBytes)); |
| 129 | let handle; |
| 130 | try { |
| 131 | handle = await open(taskOutputFile(agentDir, taskId), 'r'); |
| 132 | } catch { |
| 133 | return { offset: start, nextOffset: start, size: 0, content: '', eof: true }; |
| 134 | } |
| 135 | try { |
| 136 | const size = (await handle.stat()).size; |
| 137 | if (limit === 0 || start >= size) { |
| 138 | return { offset: start, nextOffset: start, size, content: '', eof: start >= size }; |
| 139 | } |
| 140 | const length = Math.min(limit, size - start); |
| 141 | const buffer = Buffer.allocUnsafe(length); |
| 142 | const { bytesRead } = await handle.read(buffer, 0, length, start); |
| 143 | const content = buffer.toString('utf-8', 0, bytesRead); |
| 144 | const nextOffset = start + bytesRead; |
| 145 | return { offset: start, nextOffset, size, content, eof: nextOffset >= size }; |
| 146 | } catch { |
| 147 | return { offset: start, nextOffset: start, size: 0, content: '', eof: true }; |
| 148 | } finally { |
| 149 | await handle.close(); |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | // ── normalization (ported from agent-core/agent/background/persist.ts) ─────── |
| 154 |
no test coverage detected