diff --git a/modules/profiles/personal.nix b/modules/profiles/personal.nix --- a/modules/profiles/personal.nix +++ b/modules/profiles/personal.nix @@ -41,7 +41,6 @@ printing ssh-stunnel upower - virtManager # keep-sorted end ]; diff --git a/modules/programs/tui/pi/settings.nix b/modules/programs/tui/pi/settings.nix --- a/modules/programs/tui/pi/settings.nix +++ b/modules/programs/tui/pi/settings.nix @@ -1,7 +1,9 @@ { flake.modules.homeManager.pi = { programs.pi.coding-agent.settings = { + clearOnStart = true; enableInstallTelemetry = false; + quietStartup = true; }; }; } diff --git a/modules/programs/tui/pi/extensions/atuin.nix b/modules/programs/tui/pi/extensions/atuin.nix --- a/modules/programs/tui/pi/extensions/atuin.nix +++ b/modules/programs/tui/pi/extensions/atuin.nix @@ -1,8 +1,42 @@ { - flake.modules.homeManager.pi = {lib, ...}: let + flake.modules.homeManager.pi = { + # keep-sorted start + lib, + pkgs, + # keep-sorted end + ... + }: let inherit (lib) mkOrder; + inherit (pkgs) fetchurl; + inherit (pkgs.stdenvNoCC) mkDerivation; + + piAtuin = mkDerivation { + pname = "pi-atuin"; + version = "0.1.8"; + + src = fetchurl { + url = "https://registry.npmjs.org/pi-atuin/-/pi-atuin-0.1.8.tgz"; + hash = "sha256-I5dKQATGcVn+O+2RUOCiJGx40V5lzZ1I0ljjdUYjMtw="; + }; + + postPatch = '' + substituteInPlace index.ts \ + --replace-fail \ + $'\t\tctx.ui.setEditorComponent((tui, theme, keybindings) => {\n\t\t\tconst editor = new CustomEditor(tui, theme, keybindings);' \ + $'\t\tconst previousEditor = ctx.ui.getEditorComponent();\n\t\tctx.ui.setEditorComponent((tui, theme, keybindings) => {\n\t\t\tconst editor = (previousEditor?.(tui, theme, keybindings) ?? new CustomEditor(tui, theme, keybindings)) as CustomEditor;\n\t\t\tconst previousShortcut = editor.onExtensionShortcut;' \ + --replace-fail \ + $'\t\t\t\treturn false;\n\t\t\t};' \ + $'\t\t\t\treturn previousShortcut?.(data) ?? false;\n\t\t\t};' + ''; + + installPhase = '' + runHook preInstall + cp -r . "$out" + runHook postInstall + ''; + }; in { - # Replace QOL's editor while retaining its other features. - programs.pi.coding-agent.extensions = mkOrder 1250 ["npm:pi-atuin@0.1.8"]; + # Layer history search over QOL's editor instead of replacing it. + programs.pi.coding-agent.extensions = mkOrder 1250 ["${piAtuin}/index.ts"]; }; } diff --git a/modules/programs/tui/pi/extensions/cache.nix b/modules/programs/tui/pi/extensions/cache.nix --- a/modules/programs/tui/pi/extensions/cache.nix +++ b/modules/programs/tui/pi/extensions/cache.nix @@ -1,6 +1,8 @@ { flake.modules.homeManager.pi = {pkgs, ...}: let - cacheStatusColor = pkgs.writeText "cache-status-color.ts" '' + inherit (pkgs) writeText; + + cacheStatusColor = writeText "cache-status-color.ts" '' import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; export default function (pi: ExtensionAPI): void { diff --git a/modules/programs/tui/pi/extensions/formatter.nix b/modules/programs/tui/pi/extensions/formatter.nix --- a/modules/programs/tui/pi/extensions/formatter.nix +++ b/modules/programs/tui/pi/extensions/formatter.nix @@ -13,8 +13,11 @@ getExe' # keep-sorted end ; + inherit (pkgs) writeText; + jsonFormat = pkgs.formats.json {}; - autoformatRenderer = pkgs.writeText "pi-autoformat-renderer.ts" '' + + autoformatRenderer = writeText "pi-autoformat-renderer.ts" '' import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { Text } from "@earendil-works/pi-tui"; diff --git a/modules/programs/tui/pi/extensions/qol.nix b/modules/programs/tui/pi/extensions/qol.nix --- a/modules/programs/tui/pi/extensions/qol.nix +++ b/modules/programs/tui/pi/extensions/qol.nix @@ -1,5 +1,11 @@ { - flake.modules.homeManager.pi = {lib, ...}: let + flake.modules.homeManager.pi = { + # keep-sorted start + lib, + pkgs, + # keep-sorted end + ... + }: let inherit (lib) # keep-sorted start @@ -7,6 +13,8 @@ isAttrs # keep-sorted end ; + inherit (pkgs) fetchurl; + inherit (pkgs.stdenvNoCC) mkDerivation; flattenSettings = prefix: concatMapAttrs (name: value: let @@ -18,12 +26,36 @@ if isAttrs value then flattenSettings key value else {${key} = value;}); + + piQol = mkDerivation { + pname = "pi-qol"; + version = "1.7.3"; + + src = fetchurl { + url = "https://registry.npmjs.org/@vanillagreen/pi-qol/-/pi-qol-1.7.3.tgz"; + hash = "sha256-6RMLDVk68LGQitELBcvDVAwUNob9eYyy+h8sdPjli+s="; + }; + + postPatch = '' + substituteInPlace extensions/qol.ts \ + --replace-fail \ + $'\tpi.on("message_update", (event, ctx) => {\n\t\tif (ctx.hasUI) requestRender();\n\t\tif (!updateThinkingTimerEnabled(ctx)) return;' \ + $'\tpi.on("message_update", (event, ctx) => {\n\t\tif (!updateThinkingTimerEnabled(ctx)) return;' + ''; + + installPhase = '' + runHook preInstall + cp -r . "$out" + runHook postInstall + ''; + }; in { programs.pi.coding-agent = { - extensions = ["npm:@vanillagreen/pi-qol@1.7.3"]; + extensions = ["${piQol}/extensions/qol.ts"]; settings.vstack.extensionManager.config."@vanillagreen/pi-qol" = flattenSettings "" { # keep-sorted start + compactPrompt = false; enableHandoffCommand = false; enableScheduleCommand = false; replaceFooter = false; @@ -38,6 +70,8 @@ sessionAutoRename.model = "openai-codex/gpt-5.6-luna"; statusline.enabled = false; + thinkingTimer.enabled = false; + workingIndicator.mode = "static"; }; }; }; diff --git a/modules/programs/tui/pi/extensions/rewind.nix b/modules/programs/tui/pi/extensions/rewind.nix --- a/modules/programs/tui/pi/extensions/rewind.nix +++ b/modules/programs/tui/pi/extensions/rewind.nix @@ -1,10 +1,13 @@ { flake.modules.homeManager.pi = {pkgs, ...}: let - piRewind = pkgs.stdenvNoCC.mkDerivation { + inherit (pkgs) fetchFromGitHub; + inherit (pkgs.stdenvNoCC) mkDerivation; + + piRewind = mkDerivation { pname = "pi-rewind"; version = "0.5.0"; - src = pkgs.fetchFromGitHub { + src = fetchFromGitHub { owner = "arpagon"; repo = "pi-rewind"; rev = "v0.5.0"; diff --git a/modules/programs/tui/pi/extensions/tool-renderer.nix b/modules/programs/tui/pi/extensions/tool-renderer.nix --- a/modules/programs/tui/pi/extensions/tool-renderer.nix +++ b/modules/programs/tui/pi/extensions/tool-renderer.nix @@ -7,12 +7,14 @@ ... }: let inherit (lib) mkAfter; + inherit (pkgs) fetchurl; + inherit (pkgs.stdenvNoCC) mkDerivation; - toolRenderer = pkgs.stdenvNoCC.mkDerivation { + toolRenderer = mkDerivation { pname = "pi-tool-renderer"; version = "1.6.3"; - src = pkgs.fetchurl { + src = fetchurl { url = "https://registry.npmjs.org/@vanillagreen/pi-tool-renderer/-/pi-tool-renderer-1.6.3.tgz"; hash = "sha256-WzZGoBZ9bh0F/gm/kh+F6UH+r2eGVbW01JVIwqAcfJo="; }; @@ -42,7 +44,7 @@ settings.vstack.extensionManager.config."@vanillagreen/pi-tool-renderer" = { # keep-sorted start - compactUserMessages = true; + compactUserMessages = false; pendingStatusAnimation = true; renderBashDiffs = true; renderGitDiffCommandDiffs = true; diff --git a/modules/programs/tui/pi/extensions/web.nix b/modules/programs/tui/pi/extensions/web.nix --- a/modules/programs/tui/pi/extensions/web.nix +++ b/modules/programs/tui/pi/extensions/web.nix @@ -1,12 +1,20 @@ { flake.modules.homeManager.pi = {pkgs, ...}: let + inherit + (pkgs) + # keep-sorted start + buildNpmPackage + fetchurl + # keep-sorted end + ; + jsonFormat = pkgs.formats.json {}; - webAccess = pkgs.buildNpmPackage { + webAccess = buildNpmPackage { pname = "pi-web-access"; version = "0.13.0"; - src = pkgs.fetchurl { + src = fetchurl { url = "https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.13.0.tgz"; hash = "sha256-GmPsueJdqj4Ny+fxlwMWRVnehe4bv1GeiBo0i5uAQAA="; };