[2026-06-07] balda: deepseek provider, launchd, norma-local fork, CLAUDECODE fix

This commit is contained in:
Alexey Martemyanov
2026-06-07 23:12:39 +06:00
parent 64eaf6379e
commit 54b824ee93
+53 -21
View File
@@ -6,13 +6,26 @@
| Item | Value |
|------|-------|
| Binary | `~/.local/bin/balda` |
| Process | Native Mac process (PID changes on restart) |
| Binary | `~/Developer/balda/balda` (built from source) |
| Process | Managed by launchd (`com.normahq.balda`) |
| Log | `/private/tmp/balda.log` |
| Config | `~/Developer/balda/.config/balda/config.yaml` |
| State dir | `~/Developer/balda/.config/balda/` |
| Sessions | SQLite persistence |
| Provider | `claude_code_acp` (Claude Code ACP, model: claude-sonnet-4-6) |
| Provider | `deepseek` (openai type, model: `deepseek-chat`, via `https://api.deepseek.com/v1`) |
Balda is managed by launchd. Full restart (reloads plist env vars):
```bash
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.normahq.balda.plist
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.normahq.balda.plist
```
Quick restart (does NOT reload plist env vars — use bootout/bootstrap for env changes):
```bash
launchctl kickstart -k gui/$(id -u)/com.normahq.balda
```
## Zulip Webhook
@@ -80,28 +93,44 @@ canceled when the parent is — so the goroutine lives past the HTTP handler ret
**Solution:** Changed Balda's listen port from `8090` to `8091` in `config.yaml`.
### Pending
### Resolution
- [ ] Update Zulip webhook bot URL from `8090` to `8091`
- In Zulip admin: Settings → Bots → edit the outgoing webhook bot
- Or via `docker exec zulip-zulip-1 python manage.py ...`
- New URL: `http://host.docker.internal:8091/zulip/webhook`
Webhook bot URL updated in Zulip DB via `docker exec psql` on 2026-06-07:
`http://host.docker.internal:8090/zulip/webhook``http://host.docker.internal:8091/zulip/webhook`
---
## Starting / Restarting Balda
## DeepSeek Provider via norma-local Fork
Balda's `openai` provider type in norma hardcoded `api.openai.com`. To support
DeepSeek (or any OpenAI-compatible API), the norma source was forked locally:
- Fork path: `~/Developer/norma-local`
- Patched files:
- `pkg/runtime/hostedagent/openai.go` — added `openAIBaseURL()` reading `OPENAI_BASE_URL` env var
- `pkg/runtime/agentfactory/agentfactory.go` — removed MCP restriction for `openai` type
- Env var `OPENAI_BASE_URL=https://api.deepseek.com/v1` is set in the launchd plist
- go.mod `replace` directive (`normahq/norma v0.0.6 → ../norma-local`) is local only
(not committed to the PR branch — needs a separate norma upstream PR or fork)
To rebuild after patching norma:
```bash
# View logs
tail -f /private/tmp/balda.log
# Start (runs in background, logs to /private/tmp/balda.log)
~/.local/bin/balda serve >> /private/tmp/balda.log 2>&1 &
# Check if running
pgrep -l balda
cd ~/Developer/balda
go build -o balda ./cmd/balda/
```
---
## CLAUDECODE Environment Bug (Fixed 2026-06-07)
When launched from an Eagle terminal session, Balda inherited `CLAUDECODE=1`,
which caused the Claude Code CLI to refuse to start (it detected a nested invocation).
**Fix:** Use `launchctl bootout + bootstrap` to start Balda clean — launchd does
not inherit parent shell env vars.
---
## Config Snippet (key sections)
```yaml
@@ -111,14 +140,17 @@ balda:
runtime:
providers:
claude_code:
type: claude_code_acp
claude_code_acp:
model: claude-sonnet-4-6
deepseek:
type: openai
openai:
api_key: "<DeepSeek API key>"
model: deepseek-chat
zulip:
webhook:
enabled: true
listen: "0.0.0.0:8091"
path: /zulip/webhook
allowed_owners:
- amartemyanov@duckduckgo.com
```