diff --git a/.changeset/fix-session-scope-toggle.md b/.changeset/fix-session-scope-toggle.md new file mode 100644 index 00000000000..38396df275e --- /dev/null +++ b/.changeset/fix-session-scope-toggle.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Show current-worktree sessions by default in the TUI sessions dialog and keep all/current scope toggling working when a scope has no sessions. diff --git a/.changeset/list-agent-manager-worktrees.md b/.changeset/list-agent-manager-worktrees.md new file mode 100644 index 00000000000..2e15a890ad3 --- /dev/null +++ b/.changeset/list-agent-manager-worktrees.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Show Agent Manager and other Git worktrees in the Kilo Console project view. diff --git a/.changeset/preserve-console-review-expansion.md b/.changeset/preserve-console-review-expansion.md new file mode 100644 index 00000000000..3b7f19283af --- /dev/null +++ b/.changeset/preserve-console-review-expansion.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Keep expanded Kilo Console file diffs open while resizing the context sidebar. diff --git a/.changeset/preserve-console-terminals.md b/.changeset/preserve-console-terminals.md new file mode 100644 index 00000000000..476e44608f8 --- /dev/null +++ b/.changeset/preserve-console-terminals.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Keep Kilo Console terminal sessions open when changing diff layout and other console preferences. diff --git a/flake.nix b/flake.nix index 56438ab332e..7383da725db 100644 --- a/flake.nix +++ b/flake.nix @@ -76,8 +76,11 @@ }; kilo-dev = pkgs.writeShellScriptBin "kilo-dev" '' - cd "$KILO_ROOT" - exec ${bun}/bin/bun dev "$@" + set -euo pipefail + + : "''${KILO_ROOT:?KILO_ROOT is not set. Enter the flake dev shell from the repo root.}" + export KILO_DEV_CWD="$PWD" + exec ${bun}/bin/bun --cwd "$KILO_ROOT/packages/opencode" --conditions=browser ./src/index.ts "$@" ''; kilo-install-bin = pkgs.writeShellScriptBin "kilo-install" '' diff --git a/packages/kilo-console/src/client.ts b/packages/kilo-console/src/client.ts index adca1648a7b..37b3822b2f6 100644 --- a/packages/kilo-console/src/client.ts +++ b/packages/kilo-console/src/client.ts @@ -29,6 +29,7 @@ import type { VcsInfo, Worktree, WorktreeDiffItem, + WorktreeListResponse, } from "@kilocode/sdk/v2/client" export type Scope = "global" | "project" @@ -54,7 +55,7 @@ export type ProjectConsoleSnapshot = { project: ProjectItem config: EffectiveConfig vcs: VcsInfo - worktrees: string[] + worktrees: WorktreeListResponse terminals: ProjectTerminalItem[] } @@ -447,7 +448,7 @@ export async function loadProjectConsole(input: ProjectConsoleQuery): Promise loadProjectTerminals({ url: input.url, dir }, dir)), + [query.dir, ...dirs.map((item) => item.directory)].map((dir) => loadProjectTerminals({ url: input.url, dir }, dir)), ) return { diff --git a/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx b/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx index f4ad90840d8..b4d9e09955b 100644 --- a/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx +++ b/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx @@ -58,6 +58,7 @@ type Context = { dir: string label: string kind: "local" | "worktree" + managed: boolean } type Editor = { kind: "create"; value: string } | { kind: "rename"; item: Context; value: string } @@ -135,6 +136,7 @@ function refreshEvent(event: ProjectConsoleEvent) { if (type.startsWith("permission.")) return true if (type.startsWith("question.")) return true if (type.startsWith("message.")) return true + if (type === "global.config.updated") return true return false } @@ -179,8 +181,14 @@ export function ProjectConsoleRoute() { const data = snap() if (!data) return [] return [ - { id: "local", dir: data.project.worktree, label: "Local", kind: "local" }, - ...data.worktrees.map((dir) => ({ id: dir, dir, label: title(dir), kind: "worktree" as const })), + { id: "local", dir: data.project.worktree, label: "Local", kind: "local", managed: false }, + ...data.worktrees.map((item) => ({ + id: item.directory, + dir: item.directory, + label: title(item.directory), + kind: "worktree" as const, + managed: item.managed, + })), ] }) const terminals = createMemo(() => { @@ -499,8 +507,12 @@ export function ProjectConsoleRoute() { setEditor({ kind: "rename", item, value: displayLabel(item) }) } + function canManage(item: Context | undefined) { + return item?.kind === "worktree" && item.managed + } + function removeWorktree(item: Context) { - if (!projectInput() || item.kind === "local") return + if (!projectInput() || !canManage(item)) return setPending({ kind: "delete", item }) } @@ -512,7 +524,7 @@ export function ProjectConsoleRoute() { function resetSelected() { const item = current() - if (!projectInput() || !item || item.kind === "local") return + if (!projectInput() || !canManage(item)) return setPending({ kind: "reset", item }) } @@ -653,11 +665,14 @@ export function ProjectConsoleRoute() { const base = query() const data = snap() if (!base || !data) return - const dirs = new Set([data.project.worktree, ...data.worktrees]) + const dirs = new Set([data.project.worktree, ...data.worktrees.map((item) => item.directory)]) const stop = subscribeProjectEvents({ url: base.url, dir: data.project.worktree }, (event) => { if (event.directory !== "global" && !dirs.has(event.directory)) return const id = eventSession(event) if (id && messageEvent(event)) markUnread(id) + // Terminal fitting emits pty.updated for every width change. Ignore those refreshes while + // dragging so the controlled review accordion keeps its expanded files mounted. + if (resize.pending && eventType(event) === "pty.updated") return if (refreshEvent(event)) scheduleRefetch() }) onCleanup(stop) @@ -765,19 +780,21 @@ export function ProjectConsoleRoute() { > - + + + @@ -913,7 +930,7 @@ export function ProjectConsoleRoute() { {current()?.dir ?? snap()?.project.worktree ?? project()} - +