main
  1{
  2  den,
  3  inputs,
  4  ...
  5}: {
  6  den.aspects.dev.agents.pi = {
  7    includes = [den.aspects.dev.agents];
  8
  9    persistHome = {config, ...}: {
 10      directories = [
 11        "${config.xdg.config.directory}/pi"
 12      ];
 13    };
 14
 15    cacheHome = {config, ...}: {
 16      directories = [
 17        "${config.xdg.data.directory}/pi"
 18      ];
 19    };
 20
 21    hjem = {
 22      pkgs,
 23      lib,
 24      config,
 25      ...
 26    }: let
 27      pi-coding-agent = pkgs.symlinkJoin {
 28        name = "pi-coding-agent";
 29        buildInputs = [pkgs.makeWrapper];
 30        paths = [pkgs.pi-coding-agent];
 31        postBuild = ''
 32          wrapProgram $out/bin/pi \
 33            --set PI_CODING_AGENT_DIR ${config.xdg.config.directory}/pi \
 34            --suffix PATH : ${lib.makeBinPath [pkgs.nodejs]} \
 35            --run 'export NPM_CONFIG_PREFIX="''${NPM_CONFIG_PREFIX:-''${XDG_DATA_HOME:-$HOME/.local/share}/pi/npm}"'
 36        '';
 37        meta.mainProgram = "pi";
 38      };
 39
 40      mkJailedAgent =
 41        (import ./_jail.nix {
 42          inherit pkgs;
 43          jail = inputs.jail-nix.lib.init pkgs;
 44        }).mkJailedAgent;
 45
 46      agent = mkJailedAgent {
 47        name = "pi";
 48        pkg = pi-coding-agent;
 49        configPaths = [
 50          "${config.xdg.config.directory}/pi"
 51          "${config.xdg.data.directory}/pi"
 52        ];
 53      };
 54    in {
 55      packages = [agent.jailed agent.unjailed];
 56
 57      xdg.config.files."pi/settings.json" = {
 58        type = "copy";
 59        permissions = "0600";
 60        generator = lib.generators.toJSON {};
 61        value = {
 62          sessionDir = "${config.xdg.data.directory}/pi/sessions";
 63          mcp = "./mcp.json";
 64          packages = [
 65            "npm:@gotgenes/pi-permission-system"
 66            "npm:@narumitw/pi-btw"
 67            "npm:@narumitw/pi-lsp"
 68            "npm:pi-mcp-adapter"
 69            "npm:pi-wakatime"
 70            "npm:pi-web-access"
 71          ];
 72
 73          collapseChangelog = true;
 74          enableInstallTelemetry = false;
 75
 76          showHardwareCursor = true;
 77          tuiMode = "fullscreen";
 78
 79          defaultProvider = "deepseek";
 80          defaultModel = "deepseek-v4-flash-vision-exp";
 81          defaultThinkingLevel = "max";
 82
 83          compaction.enabled = false;
 84        };
 85      };
 86
 87      xdg.config.files."pi/mcp.json" = {
 88        type = "copy";
 89        permissions = "0600";
 90        generator = lib.generators.toJSON {};
 91        value = {
 92          mcpServers = {
 93            deepwiki.url = "https://mcp.deepwiki.com/mcp";
 94          };
 95        };
 96      };
 97
 98      xdg.config.files."pi/extensions/pi-permission-system/config.json" = {
 99        type = "copy";
100        generator = lib.generators.toJSON {};
101        value = {
102          permission = {
103            "*" = "allow";
104            path = {
105              "*" = "allow";
106              "*.env" = "deny";
107              "*.env.*" = "deny";
108              "*.env.example" = "allow";
109            };
110            external_directory = {
111              "*" = "ask";
112              "/tmp/pi/*" = "allow";
113              "/nix/store/*" = "allow";
114            };
115            external_directory_read = {
116              "${config.xdg.user-dirs.directories.projects}/*" = "allow";
117            };
118            bash = {
119              "*" = "allow";
120              "rm -rf *" = "ask";
121              "sudo *" = "deny";
122            };
123          };
124        };
125      };
126
127      xdg.config.files."pi/skills" = {
128        source = "${config.xdg.config.directory}/agents/skills";
129      };
130
131      xdg.config.files."pi/AGENTS.md" = {
132        source = "${config.xdg.config.directory}/agents/AGENTS.md";
133      };
134    };
135  };
136
137  den.aspects.dev.agents.pi.themes = {
138    catppuccin = {
139      hjem = {pkgs, ...}: let
140        pi-coding-agent-catppuccin-theme = pkgs.fetchurl {
141          url = "https://github.com/otahontas/pi-coding-agent-catppuccin/raw/9a716a630c911a4d29d9520a8d5f87e3b8867f93/catppuccin-mocha.json";
142          hash = "sha256-RHWmb46RgoLmQjOKXDwB4JPHTQjfC2mqy2btMDewBZU=";
143        };
144      in {
145        xdg.config.files."pi/settings.json".value = {
146          theme = "catppuccin-mocha";
147        };
148
149        xdg.config.files."pi/themes/catppuccin-mocha.json" = {
150          source = pi-coding-agent-catppuccin-theme;
151        };
152      };
153    };
154  };
155}