Skip to content

Commit ae4259c

Browse files
committed
fix: isolate explorer prompts and terminal pilot sessions
1 parent ca1c885 commit ae4259c

7 files changed

Lines changed: 954 additions & 146 deletions

File tree

packages/terminal-pilot/src/cli.test.ts

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
import { fileURLToPath } from "node:url";
22
import { beforeEach, describe, expect, it, vi } from "vitest";
33

4-
const { createTerminalPilotGroupMock, realpathMock, runCLIMock, terminalPilotGroupMock } =
5-
vi.hoisted(() => ({
6-
createTerminalPilotGroupMock: vi.fn(),
7-
realpathMock: vi.fn<(path: string) => Promise<string>>(),
8-
runCLIMock: vi.fn<() => Promise<void>>(),
9-
terminalPilotGroupMock: { name: "terminal-pilot" }
10-
}));
4+
const {
5+
createDaemonTerminalPilotRuntimeMock,
6+
createTerminalPilotGroupMock,
7+
daemonRuntimeMock,
8+
realpathMock,
9+
runCLIMock,
10+
runTerminalPilotDaemonMock,
11+
terminalPilotGroupMock
12+
} = vi.hoisted(() => ({
13+
createDaemonTerminalPilotRuntimeMock: vi.fn(),
14+
createTerminalPilotGroupMock: vi.fn(),
15+
daemonRuntimeMock: { kind: "daemon-runtime" },
16+
realpathMock: vi.fn<(path: string) => Promise<string>>(),
17+
runCLIMock: vi.fn<() => Promise<void>>(),
18+
runTerminalPilotDaemonMock: vi.fn<() => Promise<void>>(),
19+
terminalPilotGroupMock: { name: "terminal-pilot" }
20+
}));
1121

1222
const originalArgv = [...process.argv];
1323
const cliPath = fileURLToPath(new URL("./cli.ts", import.meta.url));
@@ -17,6 +27,9 @@ const cliOptions = {
1727
output: true,
1828
verbose: true,
1929
yes: true
30+
},
31+
services: {
32+
terminalPilotRuntime: daemonRuntimeMock
2033
}
2134
};
2235

@@ -32,6 +45,12 @@ vi.mock("./commands/index.js", () => ({
3245
createTerminalPilotGroup: createTerminalPilotGroupMock
3346
}));
3447

48+
vi.mock("./commands/daemon-runtime.js", () => ({
49+
createDaemonTerminalPilotRuntime: createDaemonTerminalPilotRuntimeMock,
50+
isTerminalPilotDaemonArgv: (argv: string[]) => argv[2] === "__daemon",
51+
runTerminalPilotDaemon: runTerminalPilotDaemonMock
52+
}));
53+
3554
describe("terminal-pilot CLI entry point", () => {
3655
beforeEach(async () => {
3756
const { resetTheme } = await import("toolcraft/design");
@@ -40,6 +59,8 @@ describe("terminal-pilot CLI entry point", () => {
4059
realpathMock.mockReset();
4160
realpathMock.mockImplementation(async (target) => target);
4261
createTerminalPilotGroupMock.mockReset().mockReturnValue(terminalPilotGroupMock);
62+
createDaemonTerminalPilotRuntimeMock.mockReset().mockReturnValue(daemonRuntimeMock);
63+
runTerminalPilotDaemonMock.mockReset().mockResolvedValue(undefined);
4364
runCLIMock.mockReset();
4465
runCLIMock.mockResolvedValue(undefined);
4566
vi.resetModules();
@@ -116,4 +137,13 @@ describe("terminal-pilot CLI entry point", () => {
116137
]);
117138
expect(process.argv).toEqual(originalArgv);
118139
});
140+
141+
it("runs the hidden daemon entry point without invoking toolcraft", async () => {
142+
const { main } = await import("./cli.js");
143+
144+
await main(["node", "terminal-pilot", "__daemon"]);
145+
146+
expect(runTerminalPilotDaemonMock).toHaveBeenCalledOnce();
147+
expect(runCLIMock).not.toHaveBeenCalled();
148+
});
119149
});

packages/terminal-pilot/src/cli.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ import { fileURLToPath } from "node:url";
55
import { runCLI } from "toolcraft/cli";
66
import { configureTheme } from "toolcraft/design";
77
import { createTerminalPilotGroup } from "./commands/index.js";
8+
import {
9+
createDaemonTerminalPilotRuntime,
10+
isTerminalPilotDaemonArgv,
11+
runTerminalPilotDaemon
12+
} from "./commands/daemon-runtime.js";
13+
import type { TerminalPilotRuntime } from "./commands/runtime.js";
814

915
configureTheme({ brand: "green", label: "Terminal Pilot" });
1016

@@ -19,12 +25,23 @@ function normalizeArgv(argv: string[]): string[] {
1925
return argv;
2026
}
2127

22-
export async function main(argv: string[] = process.argv): Promise<void> {
28+
export async function main(
29+
argv: string[] = process.argv,
30+
options: { terminalPilotRuntime?: TerminalPilotRuntime } = {}
31+
): Promise<void> {
32+
if (isTerminalPilotDaemonArgv(argv)) {
33+
await runTerminalPilotDaemon();
34+
return;
35+
}
36+
2337
const originalArgv = process.argv;
2438
process.argv = normalizeArgv(argv);
2539

2640
try {
2741
await runCLI(createTerminalPilotGroup(), {
42+
services: {
43+
terminalPilotRuntime: options.terminalPilotRuntime ?? createDaemonTerminalPilotRuntime()
44+
},
2845
controls: {
2946
debug: true,
3047
output: true,

0 commit comments

Comments
 (0)