fix(interactive-subagents): avoid Orca polling fan-out
This commit is contained in:
@@ -1,6 +1,14 @@
|
||||
import { describe, it, before, after, beforeEach } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import { mkdtempSync, writeFileSync, readFileSync, mkdirSync, rmSync, existsSync } from "node:fs";
|
||||
import {
|
||||
chmodSync,
|
||||
existsSync,
|
||||
mkdirSync,
|
||||
mkdtempSync,
|
||||
readFileSync,
|
||||
rmSync,
|
||||
writeFileSync,
|
||||
} from "node:fs";
|
||||
import { join } from "node:path";
|
||||
import { tmpdir } from "node:os";
|
||||
import { fileURLToPath } from "node:url";
|
||||
@@ -32,11 +40,13 @@ import {
|
||||
|
||||
import {
|
||||
__pollForExitTest__,
|
||||
pollForExit,
|
||||
selectMuxBackend,
|
||||
shellEscape,
|
||||
} from "../pi-extension/subagents/surface.ts";
|
||||
import { parseCreatedPane, parseCreatedTab } from "../pi-extension/subagents/herdr.ts";
|
||||
import {
|
||||
__orcaTest__,
|
||||
parseCreatedSplit,
|
||||
parseCreatedTerminal,
|
||||
parseReadTail,
|
||||
@@ -1812,6 +1822,60 @@ describe("subagent-done.ts", () => {
|
||||
describe("surface exit signals", () => {
|
||||
const { interpretExitSidecar, readCompletionFile } = __pollForExitTest__;
|
||||
|
||||
it("does not poll the terminal while waiting for a filesystem completion signal", async () => {
|
||||
const dir = createTestDir();
|
||||
const completionFile = join(dir, "child.exit-code");
|
||||
let surfaceReads = 0;
|
||||
|
||||
try {
|
||||
const result = await pollForExit(
|
||||
"unused-surface",
|
||||
new AbortController().signal,
|
||||
{
|
||||
interval: 1,
|
||||
completionFile,
|
||||
onTick() {
|
||||
writeFileSync(completionFile, "7\n");
|
||||
},
|
||||
},
|
||||
async () => {
|
||||
surfaceReads += 1;
|
||||
return "__SUBAGENT_DONE_0__";
|
||||
},
|
||||
);
|
||||
|
||||
assert.deepEqual(result, { reason: "sentinel", exitCode: 7 });
|
||||
assert.equal(surfaceReads, 0);
|
||||
} finally {
|
||||
rmSync(dir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
it("bounds an asynchronous Orca screen read and kills its CLI process", async () => {
|
||||
const dir = createTestDir();
|
||||
const pidFile = join(dir, "reader.pid");
|
||||
const cli = join(dir, "fake-orca");
|
||||
writeFileSync(
|
||||
cli,
|
||||
`#!/usr/bin/env node\nrequire("node:fs").writeFileSync(${JSON.stringify(pidFile)}, String(process.pid));\nsetInterval(() => {}, 1000);\n`,
|
||||
);
|
||||
chmodSync(cli, 0o755);
|
||||
|
||||
try {
|
||||
await assert.rejects(__orcaTest__.readScreenWithCli(cli, "unused-surface", 5, 500));
|
||||
const pid = Number.parseInt(readFileSync(pidFile, "utf8"), 10);
|
||||
let running = true;
|
||||
try {
|
||||
process.kill(pid, 0);
|
||||
} catch {
|
||||
running = false;
|
||||
}
|
||||
assert.equal(running, false);
|
||||
} finally {
|
||||
rmSync(dir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
it("reads and removes a shell completion file", () => {
|
||||
withTempDir((dir) => {
|
||||
const completionFile = join(dir, "child.exit-code");
|
||||
|
||||
Reference in New Issue
Block a user