mirror of
https://github.com/stablyai/orca.git
synced 2026-10-13 16:02:49 +00:00
* fix: preserve Codex status on ambiguous Ctrl+C input * fix: confirm Codex turn cancellations from host rollout records * fix: keep ephemeral side hooks separate from the Codex main turn * perf: watch active Codex rollouts and skip unrelated records * fix: retain confirmed Codex cancellation across late relay events
43 lines
1.7 KiB
TypeScript
43 lines
1.7 KiB
TypeScript
import { appendFileSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
import { tmpdir } from 'node:os'
|
|
import { join } from 'node:path'
|
|
import { expect, it, vi } from 'vitest'
|
|
import {
|
|
createCodexSubagentTranscriptState,
|
|
reconcileCodexSubagentTranscript
|
|
} from './codex-subagent-transcript'
|
|
import type { CodexSubagentRoster } from './codex-subagent-roster'
|
|
|
|
it('skips decoding 1,000 message/token records and unchanged reads, but retains an abort', () => {
|
|
const directory = mkdtempSync(join(tmpdir(), 'codex-status-budget-'))
|
|
const path = join(directory, 'rollout.jsonl')
|
|
const state = createCodexSubagentTranscriptState()
|
|
const roster: CodexSubagentRoster = new Map()
|
|
writeFileSync(path, '')
|
|
reconcileCodexSubagentTranscript(state, roster, path)
|
|
const irrelevantRecords = Array.from({ length: 1_000 }, (_, i) =>
|
|
JSON.stringify({
|
|
type: 'event_msg',
|
|
payload: { type: i % 2 ? 'agent_message' : 'token_count', message: 'message' }
|
|
})
|
|
).join('\n')
|
|
appendFileSync(path, `${irrelevantRecords}\n`)
|
|
const parse = vi.spyOn(JSON, 'parse')
|
|
try {
|
|
expect(reconcileCodexSubagentTranscript(state, roster, path)).toBe(false)
|
|
expect(parse).not.toHaveBeenCalled()
|
|
appendFileSync(
|
|
path,
|
|
'{"type":"event_msg","payload":{"type":"turn_aborted","reason":"interrupted"}}\n'
|
|
)
|
|
expect(reconcileCodexSubagentTranscript(state, roster, path)).toBe(true)
|
|
expect(parse).toHaveBeenCalledOnce()
|
|
expect(state.rootTurn.interrupted).toBe(true)
|
|
expect(reconcileCodexSubagentTranscript(state, roster, path)).toBe(false)
|
|
expect(parse).toHaveBeenCalledOnce()
|
|
} finally {
|
|
parse.mockRestore()
|
|
rmSync(directory, { recursive: true, force: true })
|
|
}
|
|
})
|