mirror of
https://github.com/stablyai/orca.git
synced 2026-09-21 16:02:20 +00:00
130 lines
5.4 KiB
JavaScript
130 lines
5.4 KiB
JavaScript
// Run with Bun and a read-only OMP checkout path as the first argument.
|
|
import assert from 'node:assert/strict'
|
|
import { mkdtemp, mkdir, writeFile, rm } from 'node:fs/promises'
|
|
import { createServer } from 'node:http'
|
|
import { tmpdir } from 'node:os'
|
|
import { join, resolve } from 'node:path'
|
|
import { pathToFileURL } from 'node:url'
|
|
import { getPiAgentStatusExtensionSource } from '../../src/main/pi/agent-status-extension-source.ts'
|
|
import {
|
|
extractAgentProviderSession,
|
|
getAgentResumeArgv
|
|
} from '../../src/shared/agent-session-resume.ts'
|
|
import { readNativeChatTranscript } from '../../src/main/native-chat/transcript-reader.ts'
|
|
|
|
const reference = process.argv[2]
|
|
assert.ok(reference, 'Pass the read-only oh-my-pi source checkout path')
|
|
const scratch = await mkdtemp(join(tmpdir(), 'orca-omp-transcript-'))
|
|
process.env.HOME = join(scratch, 'home')
|
|
process.env.USERPROFILE = process.env.HOME
|
|
process.env.OMP_CODING_AGENT_DIR = join(scratch, 'agent')
|
|
await mkdir(process.env.HOME, { recursive: true })
|
|
const source = (path) =>
|
|
pathToFileURL(join(resolve(reference), 'packages/coding-agent/src', path)).href
|
|
const { loadExtensions } = await import(source('extensibility/extensions/loader.ts'))
|
|
const { EventBus } = await import(source('utils/event-bus.ts'))
|
|
const { SessionManager } = await import(source('session/session-manager.ts'))
|
|
const posts = []
|
|
const server = createServer(async (request, response) => {
|
|
let body = ''
|
|
for await (const chunk of request) {
|
|
body += chunk
|
|
}
|
|
posts.push(JSON.parse(body).payload)
|
|
response.writeHead(200).end()
|
|
})
|
|
await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve))
|
|
const managers = []
|
|
const transcripts = []
|
|
try {
|
|
process.env.ORCA_AGENT_HOOK_PORT = String(server.address().port)
|
|
process.env.ORCA_AGENT_HOOK_TOKEN = 'test-token'
|
|
delete process.env.ORCA_AGENT_HOOK_ENDPOINT
|
|
delete process.env.ORCA_PI_STATUS_OWNED
|
|
process.title = 'omp'
|
|
for (const kind of ['omp', 'pi']) {
|
|
process.env.ORCA_PANE_KEY = `transcript-${kind}`
|
|
process.env.ORCA_AGENT_LAUNCH_TOKEN = `transcript-${kind}`
|
|
const extensionPath = join(scratch, `${kind}-agent-status.ts`)
|
|
await writeFile(extensionPath, getPiAgentStatusExtensionSource(kind))
|
|
const load = async () => {
|
|
const result = await loadExtensions([extensionPath], scratch, new EventBus())
|
|
assert.deepEqual(result.errors, [])
|
|
return result.extensions[0]
|
|
}
|
|
const root = SessionManager.create(scratch, join(scratch, `${kind}-custom-sessions`))
|
|
const child = SessionManager.create(scratch, join(scratch, `${kind}-child-sessions`))
|
|
managers.push(root, child)
|
|
const emit = async (extension, type, manager) => {
|
|
for (const handler of extension.handlers.get(type) ?? []) {
|
|
await handler({ type }, { sessionManager: manager, hasUI: false })
|
|
}
|
|
await new Promise((resolve) => setTimeout(resolve, 60))
|
|
}
|
|
const extension = await load()
|
|
const childExtension = await load()
|
|
await emit(extension, 'session_start', root)
|
|
for (const phase of ['initial', 'new']) {
|
|
if (phase === 'new') {
|
|
await root.newSession()
|
|
}
|
|
await child.newSession({ parentSession: root.getSessionFile() })
|
|
const beforeChildFirst = posts.length
|
|
await emit(childExtension, 'agent_start', child)
|
|
assert.equal(posts.length, beforeChildFirst)
|
|
assert.equal(root.isSessionOnDisk(), false)
|
|
await emit(extension, 'agent_start', root)
|
|
const session = extractAgentProviderSession('omp', posts.at(-1))
|
|
assert.equal(session.transcriptPath, root.getSessionFile())
|
|
assert.deepEqual(getAgentResumeArgv('omp', session), [
|
|
'omp',
|
|
'--resume',
|
|
root.getSessionFile()
|
|
])
|
|
const options = {
|
|
transcriptPath: session.transcriptPath,
|
|
ompSessionsDir: join(scratch, 'unused')
|
|
}
|
|
assert.equal((await readNativeChatTranscript('omp', session.id, options)).notFound, true)
|
|
root.appendMessage({
|
|
role: 'user',
|
|
content: `Transcript proof ${kind} ${phase}`,
|
|
timestamp: Date.now()
|
|
})
|
|
await root.ensureOnDisk()
|
|
await root.flush()
|
|
const transcript = await readNativeChatTranscript('omp', session.id, options)
|
|
assert.ok('messages' in transcript, JSON.stringify(transcript))
|
|
assert.equal(transcript.messages.length, 1)
|
|
assert.ok(JSON.stringify(transcript.messages).includes(`Transcript proof ${kind} ${phase}`))
|
|
transcripts.push({ kind, phase, sessionId: session.id, messages: transcript.messages })
|
|
const beforeChild = posts.length
|
|
await emit(childExtension, 'session_start', child)
|
|
await emit(childExtension, 'agent_start', child)
|
|
await emit(childExtension, 'agent_end', child)
|
|
assert.equal(posts.length, beforeChild)
|
|
}
|
|
}
|
|
if (process.argv[3]) {
|
|
await writeFile(resolve(process.argv[3]), `${JSON.stringify({ transcripts }, null, 2)}\n`)
|
|
}
|
|
console.log(
|
|
JSON.stringify({
|
|
platform: process.platform,
|
|
producers: ['omp', 'pi'],
|
|
reports: posts.length,
|
|
proof:
|
|
'Actual OMP loader and persistent SessionManager, custom directory, lazy creation, new-session switch, HTTP metadata, Orca transcript reader, child suppression',
|
|
modelCalls: 0,
|
|
rendered: false
|
|
})
|
|
)
|
|
} finally {
|
|
for (const manager of managers) {
|
|
await manager.close()
|
|
}
|
|
server.closeAllConnections()
|
|
await new Promise((resolve) => server.close(resolve))
|
|
await rm(scratch, { recursive: true, force: true })
|
|
}
|