86 lines
2.5 KiB
Nix
86 lines
2.5 KiB
Nix
|
|
{
|
|||
|
|
config,
|
|||
|
|
lib,
|
|||
|
|
inputs,
|
|||
|
|
pkgs,
|
|||
|
|
...
|
|||
|
|
}:
|
|||
|
|
with lib; let
|
|||
|
|
inherit (pkgs.stdenv.hostPlatform) system;
|
|||
|
|
cfg = config.home.dev.ai.opencode;
|
|||
|
|
defaultPackageCli = inputs.opencode.packages.${system}.opencode;
|
|||
|
|
defaultPackageDesktop = inputs.opencode.packages.${system}.desktop;
|
|||
|
|
corsList = domains: lists.remove "" (lists.forEach (strings.splitString "," domains) trim);
|
|||
|
|
in {
|
|||
|
|
options.home.dev.ai.opencode = {
|
|||
|
|
enable = mkEnableOption "Enables OpenCode";
|
|||
|
|
package = mkOption {
|
|||
|
|
type = types.package;
|
|||
|
|
default = defaultPackageCli;
|
|||
|
|
description = "The CLI package for OpenCode";
|
|||
|
|
};
|
|||
|
|
settings = mkOption {
|
|||
|
|
type = types.json;
|
|||
|
|
default = {};
|
|||
|
|
};
|
|||
|
|
tui = mkOption {
|
|||
|
|
type = types.json;
|
|||
|
|
default = {};
|
|||
|
|
};
|
|||
|
|
desktop = {
|
|||
|
|
enable = mkEnableOption "Enables the desktop app";
|
|||
|
|
package = mkOption {
|
|||
|
|
type = types.package;
|
|||
|
|
default = defaultPackageDesktop;
|
|||
|
|
description = "The desktop package for OpenCode";
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
web = {
|
|||
|
|
enable = mkEnableOption "Enables OpenCode web";
|
|||
|
|
extraArgs = mkOption {
|
|||
|
|
type = types.listOf types.str;
|
|||
|
|
default = [];
|
|||
|
|
example = [
|
|||
|
|
"--hostname"
|
|||
|
|
"0.0.0.0"
|
|||
|
|
];
|
|||
|
|
};
|
|||
|
|
cors = mkOption {
|
|||
|
|
type = types.nullOr (types.either types.str types.path);
|
|||
|
|
default = null;
|
|||
|
|
example = "opencode.example.com,code.example.com";
|
|||
|
|
description = ''
|
|||
|
|
Either a string containing the domain allowed to connect to OpenCode’s web instance, or a file containing the target value. The latter is useful when using secret management if you don’t want to publicize the hostname of your OpenCode instance.
|
|||
|
|
|
|||
|
|
If you want to use multiple domains, you can separate them with a comma.
|
|||
|
|
'';
|
|||
|
|
};
|
|||
|
|
mdns = {
|
|||
|
|
enable = mkEnableOption "Enables mDNS with OpenCode";
|
|||
|
|
hostname = mkOption {
|
|||
|
|
type = types.nullOr types.str;
|
|||
|
|
default = null;
|
|||
|
|
example = "opencode.local";
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
config.programs.opencode = mkIf cfg.enable {
|
|||
|
|
inherit (cfg) enable tui;
|
|||
|
|
enableMcpIntegration = true;
|
|||
|
|
extraPackages = with pkgs; [uv];
|
|||
|
|
settings =
|
|||
|
|
{
|
|||
|
|
server = mkIf cfg.web.mdns.enable {
|
|||
|
|
mdns = true;
|
|||
|
|
mdnsDomain = mkIf (cfg.web.mdns.hostname != null) cfg.web.mdns.hostname;
|
|||
|
|
cors = corsList cfg.web.cors;
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
// cfg.settings;
|
|||
|
|
web = {
|
|||
|
|
inherit (cfg.web) enable extraArgs;
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
}
|