diff --git a/modules/programs/opencode.nix b/modules/programs/opencode.nix index 62706508..fec747a1 100644 --- a/modules/programs/opencode.nix +++ b/modules/programs/opencode.nix @@ -14,6 +14,7 @@ let ; cfg = config.programs.opencode; + webCfg = cfg.web; jsonFormat = pkgs.formats.json { }; @@ -87,6 +88,35 @@ in ''; }; + web = { + enable = lib.mkEnableOption "opencode web service"; + + extraArgs = mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + example = [ + "--hostname" + "0.0.0.0" + "--port" + "4096" + "--mdns" + "--cors" + "https://example.com" + "--cors" + "http://localhost:3000" + "--print-logs" + "--log-level" + "DEBUG" + ]; + description = '' + Extra arguments to pass to the opencode web command. + + These arguments override the "server" options defined in the configuration file. + See for available options. + ''; + }; + }; + rules = lib.mkOption { type = lib.types.either lib.types.lines lib.types.path; default = ""; @@ -443,5 +473,43 @@ in ) ) cfg.themes ); + + systemd.user.services = mkIf webCfg.enable { + opencode-web = { + Unit = { + Description = "OpenCode Web Service"; + After = [ "network.target" ]; + }; + + Service = { + ExecStart = "${lib.getExe cfg.package} web ${lib.escapeShellArgs webCfg.extraArgs}"; + Restart = "always"; + RestartSec = 5; + }; + + Install = { + WantedBy = [ "default.target" ]; + }; + }; + }; + + launchd.agents = mkIf webCfg.enable { + opencode-web = { + enable = true; + config = { + ProgramArguments = [ + (lib.getExe cfg.package) + "web" + ] + ++ webCfg.extraArgs; + KeepAlive = { + Crashed = true; + SuccessfulExit = false; + }; + ProcessType = "Background"; + RunAtLoad = true; + }; + }; + }; }; } diff --git a/tests/modules/programs/opencode/default.nix b/tests/modules/programs/opencode/default.nix index cd88c35e..99193913 100644 --- a/tests/modules/programs/opencode/default.nix +++ b/tests/modules/programs/opencode/default.nix @@ -23,4 +23,5 @@ opencode-themes-bulk-directory = ./themes-bulk-directory.nix; opencode-mcp-integration = ./mcp-integration.nix; opencode-mcp-integration-with-override = ./mcp-integration-with-override.nix; + opencode-web-service = ./web-service.nix; } diff --git a/tests/modules/programs/opencode/web-service.nix b/tests/modules/programs/opencode/web-service.nix new file mode 100644 index 00000000..593cbb53 --- /dev/null +++ b/tests/modules/programs/opencode/web-service.nix @@ -0,0 +1,41 @@ +{ + pkgs, + ... +}: +{ + programs.opencode = { + enable = true; + + web = { + enable = true; + extraArgs = [ + "--hostname" + "0.0.0.0" + "--port" + "4096" + "--mdns" + "--cors" + "https://example.com" + "--cors" + "http://localhost:3000" + "--print-logs" + "--log-level" + "DEBUG" + ]; + }; + }; + + nmt.script = + if pkgs.stdenv.hostPlatform.isDarwin then + '' + serviceFile=LaunchAgents/org.nix-community.home.opencode-web.plist + assertFileExists "$serviceFile" + assertFileContent "$serviceFile" ${./web-service.plist} + '' + else + '' + serviceFile=home-files/.config/systemd/user/opencode-web.service + assertFileExists "$serviceFile" + assertFileContent "$serviceFile" ${./web-service.service} + ''; +} diff --git a/tests/modules/programs/opencode/web-service.plist b/tests/modules/programs/opencode/web-service.plist new file mode 100644 index 00000000..d7247b10 --- /dev/null +++ b/tests/modules/programs/opencode/web-service.plist @@ -0,0 +1,36 @@ + + + + + KeepAlive + + Crashed + + SuccessfulExit + + + Label + org.nix-community.home.opencode-web + ProcessType + Background + ProgramArguments + + @opencode@/bin/opencode + web + --hostname + 0.0.0.0 + --port + 4096 + --mdns + --cors + https://example.com + --cors + http://localhost:3000 + --print-logs + --log-level + DEBUG + + RunAtLoad + + + \ No newline at end of file diff --git a/tests/modules/programs/opencode/web-service.service b/tests/modules/programs/opencode/web-service.service new file mode 100644 index 00000000..9f62ef43 --- /dev/null +++ b/tests/modules/programs/opencode/web-service.service @@ -0,0 +1,11 @@ +[Install] +WantedBy=default.target + +[Service] +ExecStart=@opencode@/bin/opencode web --hostname 0.0.0.0 --port 4096 --mdns --cors https://example.com --cors http://localhost:3000 --print-logs --log-level DEBUG +Restart=always +RestartSec=5 + +[Unit] +After=network.target +Description=OpenCode Web Service