feat(session): add Ctrl+N new-session shortcut
This commit is contained in:
@@ -135,6 +135,29 @@ describe("App command progress and errors", () => {
|
|||||||
expect(status).toHaveTextContent("Ready for your next prompt");
|
expect(status).toHaveTextContent("Ready for your next prompt");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("starts a session in selected directory with Ctrl+N", async () => {
|
||||||
|
mocks.invoke.mockImplementation((command: string) => {
|
||||||
|
if (command === "create_session_runtime")
|
||||||
|
return Promise.resolve({ runtime: { runtimeId: "runtime-new" } });
|
||||||
|
return Promise.resolve(uiState);
|
||||||
|
});
|
||||||
|
render(<App />);
|
||||||
|
const event = new KeyboardEvent("keydown", {
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: true,
|
||||||
|
ctrlKey: true,
|
||||||
|
key: "n",
|
||||||
|
});
|
||||||
|
window.dispatchEvent(event);
|
||||||
|
|
||||||
|
expect(event.defaultPrevented).toBe(true);
|
||||||
|
await waitFor(() =>
|
||||||
|
expect(mocks.invoke).toHaveBeenCalledWith("create_session_runtime", {
|
||||||
|
worktreePath: "/repo",
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it("loads categorized snapshot selectors and derives providers from choices", async () => {
|
it("loads categorized snapshot selectors and derives providers from choices", async () => {
|
||||||
const user = userEvent.setup();
|
const user = userEvent.setup();
|
||||||
const loaded: UiState = {
|
const loaded: UiState = {
|
||||||
|
|||||||
+20
-4
@@ -320,10 +320,7 @@ export default function App() {
|
|||||||
followUpProvider: followUpModel?.provider ?? "",
|
followUpProvider: followUpModel?.provider ?? "",
|
||||||
followUpModel: followUpModel?.modelId ?? "",
|
followUpModel: followUpModel?.modelId ?? "",
|
||||||
defaultThinkingLevel: selectedQuickModel
|
defaultThinkingLevel: selectedQuickModel
|
||||||
? reconcileThinkingLevel(
|
? reconcileThinkingLevel(selectedQuickModel, current.defaultThinkingLevel)
|
||||||
selectedQuickModel,
|
|
||||||
current.defaultThinkingLevel,
|
|
||||||
)
|
|
||||||
: current.defaultThinkingLevel,
|
: current.defaultThinkingLevel,
|
||||||
};
|
};
|
||||||
if (
|
if (
|
||||||
@@ -890,6 +887,25 @@ export default function App() {
|
|||||||
entry.kind === "opening" ||
|
entry.kind === "opening" ||
|
||||||
entry.kind === "listing"),
|
entry.kind === "listing"),
|
||||||
);
|
);
|
||||||
|
useEffect(() => {
|
||||||
|
const onKeyDown = (event: KeyboardEvent) => {
|
||||||
|
if (
|
||||||
|
event.defaultPrevented ||
|
||||||
|
event.repeat ||
|
||||||
|
!event.ctrlKey ||
|
||||||
|
event.metaKey ||
|
||||||
|
event.altKey ||
|
||||||
|
event.key.toLowerCase() !== "n" ||
|
||||||
|
sessionTabsBusy
|
||||||
|
)
|
||||||
|
return;
|
||||||
|
event.preventDefault();
|
||||||
|
void createRuntime();
|
||||||
|
};
|
||||||
|
window.addEventListener("keydown", onKeyDown);
|
||||||
|
return () => window.removeEventListener("keydown", onKeyDown);
|
||||||
|
}, [createRuntime, sessionTabsBusy]);
|
||||||
|
|
||||||
const closingRuntimeIds = new Set(
|
const closingRuntimeIds = new Set(
|
||||||
activeOperations
|
activeOperations
|
||||||
.filter((entry) => entry.kind === "closing" && entry.runtimeId)
|
.filter((entry) => entry.kind === "closing" && entry.runtimeId)
|
||||||
|
|||||||
Reference in New Issue
Block a user