Files
orca/tests/tools/pi-owner-runtime-smoke.mjs
Neil 4b241c1d03 refactor: group Pi provider modules by owner (#41162)
* refactor: group Pi provider modules by owner

* test(pty): retain public provider early-exit coverage
2026-11-11 08:51:39 -08:00

128 lines
5.1 KiB
JavaScript

// Run: node tests/tools/pi-owner-runtime-smoke.mjs /path/to/pi-coding-agent
import assert from 'node:assert/strict'
import { once } from 'node:events'
import { mkdtemp, writeFile, rm } from 'node:fs/promises'
import { createServer } from 'node:http'
import { createRequire } from 'node:module'
import { tmpdir } from 'node:os'
import { join, resolve } from 'node:path'
import { pathToFileURL } from 'node:url'
import { build } from 'esbuild'
import { runProcess } from '@orca/process-host'
const piRoot = resolve(process.argv[2] || '')
assert.ok(process.argv[2], 'Pass an installed pi-coding-agent package directory')
const scratch = await mkdtemp(join(tmpdir(), 'orca-pi-owner-'))
const received = []
const server = createServer(async (request, response) => {
let body = ''
for await (const chunk of request) {
body += chunk
}
received.push(JSON.parse(body))
response.end('{}')
})
try {
const bundle = join(scratch, 'orca.cjs')
await build({
stdin: {
contents:
"export { getPiAgentStatusExtensionSource } from './src/main/pi/managed-extensions/agent-status/agent-status-extension-source';",
resolveDir: process.cwd()
},
bundle: true,
platform: 'node',
format: 'cjs',
outfile: bundle,
packages: 'external'
})
const { getPiAgentStatusExtensionSource } = createRequire(import.meta.url)(bundle)
server.listen(0, '127.0.0.1')
await once(server, 'listening')
const dead = await runProcess({
program: process.execPath,
args: ['-e', 'console.log(process.pid)']
})
assert.equal(dead.code, 0)
const deadPid = Number(dead.stdout.trim())
assert.throws(() => process.kill(deadPid, 0), { code: 'ESRCH' })
const worker = join(scratch, 'worker.mjs')
const moduleUrl = (file) => JSON.stringify(pathToFileURL(join(piRoot, file)).href)
await writeFile(
worker,
`
import assert from 'node:assert/strict'
import { loadExtensions } from ${moduleUrl('dist/core/extensions/loader.js')}
import { ExtensionRunner } from ${moduleUrl('dist/core/extensions/runner.js')}
import { SessionManager } from ${moduleUrl('dist/core/session-manager.js')}
const loaded = await loadExtensions([process.argv[2]], process.cwd())
assert.deepEqual(loaded.errors, [])
const runner = new ExtensionRunner(loaded.extensions, loaded.runtime, process.cwd(), SessionManager.inMemory(process.cwd()), undefined)
const errors = []
runner.onError(error => errors.push(error))
await runner.emit({ type: 'agent_start' })
await new Promise(resolve => setTimeout(resolve, 250))
assert.deepEqual(errors, [])
console.log(JSON.stringify({pid: process.pid, owner: process.env[process.argv[3]], handlers: loaded.extensions[0].handlers.size}))
`
)
const results = []
for (const kind of ['pi', 'omp', 'prime-agent']) {
const ownerKey =
kind === 'prime-agent' ? 'ORCA_PRIME_AGENT_STATUS_OWNED' : 'ORCA_PI_STATUS_OWNED'
for (const scenario of ['baseline-dead', 'fixed-dead', 'fixed-live']) {
let source = getPiAgentStatusExtensionSource(kind)
if (scenario === 'baseline-dead') {
const guard = 'if (ownerPid && ownerPid !== selfPid && isStatusOwnerAlive(ownerPid)) return'
assert.ok(
source.includes(guard),
'Baseline mutation must replace the actual ownership guard'
)
source = source.replace(guard, 'if (ownerPid && ownerPid !== selfPid) return')
}
const extension = join(scratch, `${kind}-${scenario}.ts`)
await writeFile(extension, source)
const before = received.length
const owner = scenario === 'fixed-live' ? process.pid : deadPid
const child = await runProcess({
program: process.execPath,
args: [worker, extension, ownerKey],
cwd: scratch,
env: {
...process.env,
ORCA_BACKGROUND_LAUNCH: '1',
ORCA_PANE_KEY: 'owner-proof',
ORCA_AGENT_HOOK_PORT: String(server.address().port),
ORCA_AGENT_HOOK_TOKEN: 'isolated-proof-token',
ORCA_AGENT_HOOK_ENV: 'proof',
ORCA_AGENT_HOOK_ENDPOINT: '',
ORCA_PI_STATUS_OWNED: '',
ORCA_PRIME_AGENT_STATUS_OWNED: '',
PRIME_AGENT_INTERNAL_DAEMON_WORKER: kind === 'prime-agent' ? '1' : '',
[ownerKey]: String(owner)
},
timeoutMs: 15000
})
assert.equal(child.code, 0, child.stderr)
const observation = JSON.parse(child.stdout.trim().split('\n').at(-1))
const shouldReport = scenario === 'fixed-dead'
assert.equal(
received.length - before,
shouldReport ? 1 : 0,
`${kind}/${scenario}: HTTP delivery`
)
assert.equal(observation.owner, String(shouldReport ? observation.pid : owner))
assert.equal(observation.handlers > 0, shouldReport)
if (shouldReport) {
assert.equal(received.at(-1).payload.hook_event_name, 'agent_start')
}
results.push({ kind, scenario, posts: received.length - before, ...observation })
}
}
console.log(JSON.stringify({ platform: process.platform, results }, null, 2))
} finally {
server.closeAllConnections()
server.close()
await rm(scratch, { recursive: true, force: true })
}