From 75c4c98613c7b32628f371f52d91b64e7e8643ef Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Thu, 18 Jun 2026 14:50:14 +0800 Subject: [PATCH] feat: run codex acp with launchd on macos --- .../vhosts/acp_server_codex/handlers/main.yml | 13 ++++++ roles/vhosts/acp_server_codex/tasks/macos.yml | 13 ++++++ .../acp_server_codex/templates/codex.plist.j2 | 41 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 roles/vhosts/acp_server_codex/tasks/macos.yml create mode 100644 roles/vhosts/acp_server_codex/templates/codex.plist.j2 diff --git a/roles/vhosts/acp_server_codex/handlers/main.yml b/roles/vhosts/acp_server_codex/handlers/main.yml index 4820a74..002ef51 100644 --- a/roles/vhosts/acp_server_codex/handlers/main.yml +++ b/roles/vhosts/acp_server_codex/handlers/main.yml @@ -3,8 +3,21 @@ ansible.builtin.service: name: caddy state: reloaded + when: ansible_os_family != 'Darwin' - name: Restart acp codex ansible.builtin.service: name: "{{ acp_codex_service_name }}" state: restarted + when: ansible_os_family != 'Darwin' + +- name: Restart acp codex on macOS + ansible.builtin.command: "launchctl stop plus.svc.xworkspace.acp.codex" + register: launchctl_stop + failed_when: false + changed_when: false + notify: Start acp codex on macOS + +- name: Start acp codex on macOS + ansible.builtin.command: "launchctl start plus.svc.xworkspace.acp.codex" + changed_when: false diff --git a/roles/vhosts/acp_server_codex/tasks/macos.yml b/roles/vhosts/acp_server_codex/tasks/macos.yml new file mode 100644 index 0000000..d14653e --- /dev/null +++ b/roles/vhosts/acp_server_codex/tasks/macos.yml @@ -0,0 +1,13 @@ +--- +- name: Create launchd plist template for Codex ACP + ansible.builtin.template: + src: codex.plist.j2 + dest: "{{ ansible_env.HOME }}/Library/LaunchAgents/plus.svc.xworkspace.acp.codex.plist" + mode: "0644" + notify: Restart acp codex on macOS + +- name: Reload launchd agent for Codex ACP + ansible.builtin.command: "launchctl load -w {{ ansible_env.HOME }}/Library/LaunchAgents/plus.svc.xworkspace.acp.codex.plist" + register: launchctl_result + changed_when: false + failed_when: launchctl_result.rc != 0 and 'already loaded' not in launchctl_result.stderr diff --git a/roles/vhosts/acp_server_codex/templates/codex.plist.j2 b/roles/vhosts/acp_server_codex/templates/codex.plist.j2 new file mode 100644 index 0000000..f3d1be9 --- /dev/null +++ b/roles/vhosts/acp_server_codex/templates/codex.plist.j2 @@ -0,0 +1,41 @@ + + + + + Label + plus.svc.xworkspace.acp.codex + ProgramArguments + + /bin/bash + -c + + export PATH="{{ acp_codex_path }}" + export LITELLM_MASTER_KEY="{{ acp_codex_auth_token }}" + {% for key, value in acp_codex_environment.items() %} + export {{ key }}="{{ value }}" + {% endfor %} + + exec "{{ acp_codex_bridge_binary_path }}" acp-server \ + --port {{ acp_codex_listen_port }} \ + --host {{ acp_codex_listen_host }} \ + --sub-command codex \ + --sub-command mcp-app-server + + + RunAtLoad + + KeepAlive + + WorkingDirectory + {{ acp_codex_workdir }} + StandardOutPath + {{ ansible_env.HOME }}/.local/state/xworkspace/acp.codex.log + StandardErrorPath + {{ ansible_env.HOME }}/.local/state/xworkspace/acp.codex.err.log + EnvironmentVariables + + HOME + {{ acp_codex_workdir }} + + +