| 1 | import assert from 'node:assert/strict'; |
| 2 | import {applyStreamEvent, createMappingState} from './lineMapping.js'; |
| 3 | import type {MappingState, WorkspaceLine} from './types.js'; |
| 4 | |
| 5 | let lines: WorkspaceLine[] = []; |
| 6 | let state: MappingState = createMappingState(); |
| 7 | |
| 8 | lines = [...lines, {kind: 'user', text: 'start'}]; |
| 9 | assert.deepEqual(lines[0], {kind: 'user', text: 'start'}); |
| 10 | |
| 11 | ({lines, state} = applyStreamEvent(lines, state, {type: 'token', delta: 'hello'})); |
| 12 | ({lines, state} = applyStreamEvent(lines, state, {type: 'token', delta: ' world'})); |
| 13 | assert.equal(lines.length, 2); |
| 14 | assert.deepEqual(lines[1], {kind: 'assistant', text: 'hello world'}); |
| 15 | |
| 16 | ({lines, state} = applyStreamEvent(lines, state, {type: 'tool_start', tool: {name: 'vimax_narrative_planning'}})); |
| 17 | ({lines, state} = applyStreamEvent(lines, state, {type: 'tool_progress', tool: {name: 'vimax_narrative_planning'}, progress: {stage: 'running', message: 'planning'}})); |
| 18 | ({lines, state} = applyStreamEvent(lines, state, {type: 'tool_result', tool_result: {name: 'vimax_narrative_planning', ok: true}})); |
| 19 | assert.equal(lines.at(-3)?.kind, 'tool'); |
| 20 | assert.equal(lines.at(-2)?.kind, 'tool'); |
| 21 | assert.deepEqual(lines.at(-1), {kind: 'tool', status: 'done', text: 'tool vimax_narrative_planning done'}); |
| 22 | |
| 23 | ({lines, state} = applyStreamEvent(lines, state, {type: 'tool_result', tool_result: {name: 'vimax_narrative_planning', ok: false, content: 'Developing story failed: Request timed out.'}})); |
| 24 | assert.deepEqual(lines.at(-1), {kind: 'tool', status: 'error', text: 'tool vimax_narrative_planning error: Developing story failed: Request timed out.'}); |
| 25 | |
| 26 | ({lines, state} = applyStreamEvent(lines, state, {type: 'terminal', stream: 'stdout', line: 'render log'})); |
| 27 | assert.deepEqual(lines.at(-1), {kind: 'terminal', text: '[stdout]: render log'}); |
| 28 | |
| 29 | const lengthBeforeInternalEvents = lines.length; |
| 30 | ({lines, state} = applyStreamEvent(lines, state, {type: 'turn', turn_id: 'turn-1'})); |
| 31 | ({lines, state} = applyStreamEvent(lines, state, {type: 'status', phase: 'sampling_assistant', message: 'Sampling assistant'})); |
| 32 | ({lines, state} = applyStreamEvent(lines, state, {type: 'session', session: {active_session_id: 's1', session: {session_id: 's1', stage: 'narrative_planned', working_dir: '.working_dir/s1'}}})); |
| 33 | assert.equal(lines.length, lengthBeforeInternalEvents); |
| 34 | |
| 35 | ({lines, state} = applyStreamEvent(lines, state, {type: 'error', message: 'bad'})); |
| 36 | assert.deepEqual(lines.at(-1), {kind: 'error', text: 'bad'}); |
| 37 | |
| 38 | ({lines, state} = applyStreamEvent(lines, state, {type: 'done', assistant: 'hello world'})); |
| 39 | assert.equal(state.assistantStreaming, false); |
| 40 | |
| 41 | console.log('lineMapping tests passed'); |
| 42 |