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}