Add local CLI access via Unix-socket server

New CLIServerService listens on a Unix domain socket
(~/Library/Application Support/oAI/cli.sock) speaking a minimal
HTTP/1.1 subset, for one-shot non-streaming shell access to a single
fixed model — e.g. an `ai "prompt"` zsh function — without opening
the app window and without going through the tool-calling loop.

Configured in Settings > MCP > CLI Access (toggle, provider, model —
deliberately independent of the chat UI's active model). JSON
request/response envelope rather than raw text so new fields (model
override, streaming, tool support) can be added later without a
breaking wire-format change.

Verified live end-to-end against a real OpenRouter request, error
paths, and clean-shutdown socket cleanup. 10 new unit tests cover
the HTTP framing/parsing logic.
This commit is contained in:
2026-08-05 13:33:02 +02:00
parent 2adce758f1
commit 897bfdce10
6 changed files with 552 additions and 0 deletions
+4
View File
@@ -73,6 +73,9 @@ struct oAIApp: App {
// Start email handler on app launch
EmailHandlerService.shared.start()
// Start the local CLI server (Settings > Advanced > CLI Access) no-op if disabled
CLIServerService.shared.start()
// Start external MCP servers
Task { @MainActor in ExternalMCPManager.shared.startAll() }
@@ -106,6 +109,7 @@ struct oAIApp: App {
}
.onReceive(NotificationCenter.default.publisher(for: NSApplication.willTerminateNotification)) { _ in
Task { @MainActor in ExternalMCPManager.shared.stopAll() }
CLIServerService.shared.stop()
}
#endif
}