main
  1{
  2  den,
  3  inputs,
  4  ...
  5}: {
  6  den.aspects.dev.agents.opencode = {
  7    includes = [den.aspects.dev.agents];
  8
  9    persistHome = {config, ...}: {
 10      directories = [
 11        "${config.xdg.config.directory}/opencode"
 12      ];
 13    };
 14
 15    cacheHome = {config, ...}: {
 16      directories = [
 17        "${config.xdg.data.directory}/opencode"
 18        "${config.xdg.state.directory}/opencode"
 19      ];
 20    };
 21
 22    hjem = {
 23      config,
 24      pkgs,
 25      ...
 26    }: let
 27      mkJailedAgent =
 28        (import ./_jail.nix {
 29          inherit pkgs;
 30          jail = inputs.jail-nix.lib.init pkgs;
 31        }).mkJailedAgent;
 32
 33      agent = mkJailedAgent {
 34        name = "opencode";
 35        pkg = pkgs.opencode;
 36        configPaths = [
 37          "${config.xdg.config.directory}/opencode"
 38          "${config.xdg.data.directory}/opencode"
 39          "${config.xdg.state.directory}/opencode"
 40        ];
 41        env.OPENCODE_DISABLE_LSP_DOWNLOAD = "true";
 42      };
 43    in {
 44      packages = [agent.jailed agent.unjailed];
 45
 46      environment.sessionVariables = {
 47        OPENCODE_DISABLE_LSP_DOWNLOAD = "true";
 48      };
 49
 50      xdg.config.files."opencode/opencode.json" = {
 51        generator = (pkgs.formats.json {}).generate "opencode-config.json";
 52        value = {
 53          permission = {
 54            external_directory = {
 55              "/nix/store/**" = "allow";
 56            };
 57            edit = {
 58              "*" = "ask";
 59              "/nix/store/**" = "deny";
 60            };
 61            grep = {
 62              "/nix/store" = "deny";
 63            };
 64            webfetch = "ask";
 65          };
 66          mcp = {
 67            deepwiki = {
 68              type = "remote";
 69              url = "https://mcp.deepwiki.com/mcp";
 70            };
 71          };
 72          lsp = true;
 73          formatter = {
 74            alejandra = {
 75              command = ["alejandra" "$FILE"];
 76              extensions = [".nix"];
 77            };
 78          };
 79          plugin = [
 80            "opencode-wakatime"
 81            "@simonwjackson/opencode-direnv"
 82          ];
 83        };
 84      };
 85
 86      xdg.config.files."opencode/tui.json" = {
 87        generator = (pkgs.formats.json {}).generate "opencode-config-tui.json";
 88        value = {
 89        };
 90      };
 91
 92      xdg.config.files."opencode/skills" = {
 93        source = "${config.xdg.config.directory}/agents/skills";
 94      };
 95
 96      xdg.config.files."opencode/AGENTS.md" = {
 97        source = "${config.xdg.config.directory}/agents/AGENTS.md";
 98      };
 99    };
100  };
101
102  den.aspects.develop.opencode.themes = {
103    catppuccin = {
104      hjem.xdg.config.files."opencode/tui.json".value.theme = "catppuccin";
105    };
106  };
107}