diff --git a/apps/server/src/cloud/pinnedRuntime.test.ts b/apps/server/src/cloud/pinnedRuntime.test.ts index 9d536f471e76..82230858891c 100644 --- a/apps/server/src/cloud/pinnedRuntime.test.ts +++ b/apps/server/src/cloud/pinnedRuntime.test.ts @@ -487,14 +487,15 @@ it.layer(NodeServices.layer)("prunePinnedRuntimes", (it) => { const path = yield* Path.Path; const { baseDir, versionsDir } = yield* setup(["1.0.0", "1.1.0"]); const entry = path.join(versionsDir, "1.0.0", "t3"); - yield* fs.copyFile("/bin/sleep", entry); + // Multicall coreutils (Ubuntu's uutils) refuse to run renamed, so copy Node instead. + yield* fs.copyFile(process.execPath, entry); yield* fs.chmod(entry, 0o755); const link = path.join(baseDir, "t3"); yield* fs.symlink(entry, link); // Its argv names only the link, as with `t3 serve` run from PATH. Removing the link after // spawning leaves the process's executable as the only reference. const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; - yield* spawner.spawn(ChildProcess.make(link, ["30"])); + yield* spawner.spawn(ChildProcess.make(link, ["-e", "setTimeout(() => {}, 30_000)"])); yield* fs.remove(link); const removed = yield* prunePinnedRuntimes({ baseDir, keep: ["2.0.0"] }).pipe( diff --git a/apps/server/src/provider/acp/AcpSessionRuntime.processTree.test.ts b/apps/server/src/provider/acp/AcpSessionRuntime.processTree.test.ts index 7ee010b6f76d..c71d414ccdfa 100644 --- a/apps/server/src/provider/acp/AcpSessionRuntime.processTree.test.ts +++ b/apps/server/src/provider/acp/AcpSessionRuntime.processTree.test.ts @@ -165,7 +165,7 @@ describe("terminatePosixOwnedProcessTree", () => { AcpSessionRuntime.resolveLinuxCgroupTargetCommand("grok", scratch, { PATH: undefined }), ).toBeUndefined(); expect( - AcpSessionRuntime.resolveLinuxCgroupTargetCommand("node", scratch, { PATH: undefined }), + AcpSessionRuntime.resolveLinuxCgroupTargetCommand("sh", scratch, { PATH: undefined }), ).toBeDefined(); expect( AcpSessionRuntime.resolveLinuxCgroupTargetCommand("grok", scratch, { diff --git a/apps/server/src/testUtils/managedServiceEnv.setup.ts b/apps/server/src/testUtils/managedServiceEnv.setup.ts new file mode 100644 index 000000000000..a6581817e14b --- /dev/null +++ b/apps/server/src/testUtils/managedServiceEnv.setup.ts @@ -0,0 +1,6 @@ +import { SERVICE_LAUNCHER_CONTEXT_ENV } from "../cloud/serviceProtocol.ts"; + +// Agents inside a managed T3 service inherit its home and launcher context; CI has neither. +for (const name of ["T3CODE_HOME", "T3_BOOT_SERVICE_UNIT", SERVICE_LAUNCHER_CONTEXT_ENV]) { + delete process.env[name]; +} diff --git a/apps/server/vite.config.ts b/apps/server/vite.config.ts index 5d36d0867c59..f68d1cc733c6 100644 --- a/apps/server/vite.config.ts +++ b/apps/server/vite.config.ts @@ -128,7 +128,10 @@ export default mergeConfig( // Parallel sqlite/git/worktree/orchestration tests introduce load-sensitive flakes. fileParallelism: false, sequence: { sequencer: WeightedShardSequencer }, - setupFiles: ["./src/testUtils/gitConfig.setup.ts"], + setupFiles: [ + "./src/testUtils/gitConfig.setup.ts", + "./src/testUtils/managedServiceEnv.setup.ts", + ], hookTimeout: 120_000, testTimeout: 120_000, },