2026-03-23 17:07:50 +00:00
|
|
|
## Local dev stack for sunbeam code iteration.
|
|
|
|
|
## Run: docker compose -f docker-compose.dev.yaml up
|
|
|
|
|
## Sol gRPC on localhost:50051, Matrix on localhost:8008
|
|
|
|
|
|
|
|
|
|
services:
|
|
|
|
|
opensearch:
|
|
|
|
|
image: opensearchproject/opensearch:3
|
|
|
|
|
environment:
|
|
|
|
|
- discovery.type=single-node
|
|
|
|
|
- OPENSEARCH_JAVA_OPTS=-Xms1536m -Xmx1536m
|
|
|
|
|
- DISABLE_SECURITY_PLUGIN=true
|
|
|
|
|
- plugins.ml_commons.only_run_on_ml_node=false
|
|
|
|
|
- plugins.ml_commons.native_memory_threshold=90
|
|
|
|
|
- plugins.ml_commons.model_access_control_enabled=false
|
|
|
|
|
- plugins.ml_commons.allow_registering_model_via_url=true
|
|
|
|
|
ports:
|
|
|
|
|
- "9200:9200"
|
|
|
|
|
volumes:
|
|
|
|
|
- opensearch-data:/usr/share/opensearch/data
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "curl -sf http://localhost:9200/_cluster/health || exit 1"]
|
|
|
|
|
interval: 10s
|
|
|
|
|
timeout: 5s
|
|
|
|
|
retries: 10
|
|
|
|
|
|
|
|
|
|
tuwunel:
|
|
|
|
|
image: jevolk/tuwunel:main
|
|
|
|
|
environment:
|
|
|
|
|
- CONDUWUIT_SERVER_NAME=sunbeam.local
|
|
|
|
|
- CONDUWUIT_DATABASE_PATH=/data
|
|
|
|
|
- CONDUWUIT_PORT=8008
|
|
|
|
|
- CONDUWUIT_ADDRESS=0.0.0.0
|
|
|
|
|
- CONDUWUIT_ALLOW_REGISTRATION=true
|
|
|
|
|
- CONDUWUIT_ALLOW_GUEST_REGISTRATION=true
|
|
|
|
|
- CONDUWUIT_YES_I_AM_VERY_VERY_SURE_I_WANT_AN_OPEN_REGISTRATION_SERVER_PRONE_TO_ABUSE=true
|
|
|
|
|
- CONDUWUIT_LOG=info
|
|
|
|
|
ports:
|
|
|
|
|
- "8008:8008"
|
|
|
|
|
volumes:
|
|
|
|
|
- tuwunel-data:/data
|
|
|
|
|
|
|
|
|
|
searxng:
|
|
|
|
|
image: searxng/searxng:latest
|
|
|
|
|
environment:
|
|
|
|
|
- SEARXNG_SECRET=dev-secret-key
|
|
|
|
|
ports:
|
|
|
|
|
- "8888:8080"
|
|
|
|
|
volumes:
|
|
|
|
|
- ./dev/searxng-settings.yml:/etc/searxng/settings.yml:ro
|
|
|
|
|
|
refactor: remove legacy responder + agent_ux, add Gitea integration tests
Legacy removal:
- DELETE src/brain/responder.rs (900 lines) — replaced by orchestrator
- DELETE src/agent_ux.rs (184 lines) — UX moved to transport bridges
- EXTRACT chat_blocking() to src/brain/chat.rs (standalone utility)
- sync.rs: uses ConversationRegistry directly (no responder)
- main.rs: holds ToolRegistry + Personality directly (no Responder wrapper)
- research.rs: progress updates via tracing (no AgentProgress)
Gitea integration testing:
- docker-compose: added Gitea service with healthcheck
- bootstrap-gitea.sh: creates admin, org, mirrors 6 real repos from
src.sunbeam.pt (sol, cli, proxy, storybook, admin-ui, mistralai-client-rs)
- PAT provisioning for SDK testing without Vault
- code_index/gitea.rs: fixed directory listing (direct API calls instead
of SDK's single-object parser), proper base64 file decoding
New integration tests:
- Gitea: list_repos, get_repo, get_file, directory listing, code indexing
- Web search: SearXNG query with result verification
- Conversation registry: lifecycle + send_message round-trip
- Evaluator: rule matching (DM, own message)
- gRPC bridge: event filtering, tool call mapping, thinking→status
2026-03-24 11:45:43 +00:00
|
|
|
gitea:
|
|
|
|
|
image: gitea/gitea:1.22
|
|
|
|
|
environment:
|
|
|
|
|
- GITEA__database__DB_TYPE=sqlite3
|
|
|
|
|
- GITEA__server__ROOT_URL=http://localhost:3000
|
|
|
|
|
- GITEA__server__HTTP_PORT=3000
|
|
|
|
|
- GITEA__service__DISABLE_REGISTRATION=false
|
|
|
|
|
- GITEA__service__REQUIRE_SIGNIN_VIEW=false
|
|
|
|
|
- GITEA__security__INSTALL_LOCK=true
|
|
|
|
|
- GITEA__api__ENABLE_SWAGGER=false
|
|
|
|
|
ports:
|
|
|
|
|
- "3000:3000"
|
|
|
|
|
volumes:
|
|
|
|
|
- gitea-data:/data
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "curl -sf http://localhost:3000/api/v1/version || exit 1"]
|
|
|
|
|
interval: 10s
|
|
|
|
|
timeout: 5s
|
|
|
|
|
retries: 10
|
|
|
|
|
|
feat: integration test suite — 416 tests, 61% coverage
Add OpenBao and Kratos to docker-compose dev stack with bootstrap
seeding. Full integration tests hitting real services:
- Vault SDK: KV read/write/delete, re-auth on bad token, new_with_token
constructor for dev mode
- Kratos SDK: list/get/create/disable/enable users, session listing
- Token store: PAT lifecycle with OpenBao backing, expiry handling
- Identity tools: full tool dispatch through Kratos admin API
- Gitea SDK: resolve_username, ensure_token (PAT auto-provisioning),
list/get repos, issues, comments, branches, file content
- Devtools: tool dispatch for all gitea_* tools against live Gitea
- Archive indexer: batch flush, periodic flush task, edit/redact/reaction
updates against OpenSearch
- Memory store: set/query/get_recent with user scoping in OpenSearch
- Room history: context retrieval by timestamp and event_id, access
control enforcement
- Search archive: keyword search with room/sender filters, room scoping
- Code search: language filter, repo filter, branch scoping
- Breadcrumbs: symbol retrieval, empty index handling, token budget
- Bridge: full event lifecycle mapping, request ID filtering
- Evaluator: DM/mention/silence short-circuits, LLM evaluation path,
reply-to-human suppression
- Agent registry: list/get_id, prompt reuse, prompt-change recreation
- Conversations: token tracking, multi-turn context recall, room
isolation
Bug fixes caught by tests:
- AgentRegistry in-memory cache skipped hash comparison on prompt change
- KratosClient::set_state sent bare PUT without traits (400 error)
- find_code_session returns None on NULL conversation_id
2026-03-24 14:34:03 +00:00
|
|
|
openbao:
|
|
|
|
|
image: quay.io/openbao/openbao:2.5.1
|
|
|
|
|
cap_add:
|
|
|
|
|
- IPC_LOCK
|
|
|
|
|
environment:
|
|
|
|
|
- BAO_DEV_ROOT_TOKEN_ID=dev-root-token
|
|
|
|
|
- BAO_DEV_LISTEN_ADDRESS=0.0.0.0:8200
|
|
|
|
|
ports:
|
|
|
|
|
- "8200:8200"
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD", "bao", "status", "-address=http://127.0.0.1:8200"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 10
|
|
|
|
|
|
|
|
|
|
kratos-migrate:
|
|
|
|
|
image: oryd/kratos:v1.3.1
|
|
|
|
|
command: migrate sql -e --yes
|
|
|
|
|
environment:
|
|
|
|
|
- DSN=sqlite:///var/lib/sqlite/kratos.db?_fk=true&mode=rwc
|
|
|
|
|
volumes:
|
|
|
|
|
- ./dev/kratos.yml:/etc/kratos/kratos.yml:ro
|
|
|
|
|
- ./dev/identity.schema.json:/etc/kratos/identity.schema.json:ro
|
|
|
|
|
- kratos-data:/var/lib/sqlite
|
|
|
|
|
|
|
|
|
|
kratos:
|
|
|
|
|
image: oryd/kratos:v1.3.1
|
|
|
|
|
command: serve -c /etc/kratos/kratos.yml --dev --watch-courier
|
|
|
|
|
depends_on:
|
|
|
|
|
kratos-migrate:
|
|
|
|
|
condition: service_completed_successfully
|
|
|
|
|
ports:
|
|
|
|
|
- "4433:4433" # public
|
|
|
|
|
- "4434:4434" # admin
|
|
|
|
|
volumes:
|
|
|
|
|
- ./dev/kratos.yml:/etc/kratos/kratos.yml:ro
|
|
|
|
|
- ./dev/identity.schema.json:/etc/kratos/identity.schema.json:ro
|
|
|
|
|
- kratos-data:/var/lib/sqlite
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "wget -qO- http://localhost:4434/admin/health/ready || exit 1"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 10
|
|
|
|
|
|
2026-03-23 17:07:50 +00:00
|
|
|
volumes:
|
|
|
|
|
opensearch-data:
|
|
|
|
|
tuwunel-data:
|
refactor: remove legacy responder + agent_ux, add Gitea integration tests
Legacy removal:
- DELETE src/brain/responder.rs (900 lines) — replaced by orchestrator
- DELETE src/agent_ux.rs (184 lines) — UX moved to transport bridges
- EXTRACT chat_blocking() to src/brain/chat.rs (standalone utility)
- sync.rs: uses ConversationRegistry directly (no responder)
- main.rs: holds ToolRegistry + Personality directly (no Responder wrapper)
- research.rs: progress updates via tracing (no AgentProgress)
Gitea integration testing:
- docker-compose: added Gitea service with healthcheck
- bootstrap-gitea.sh: creates admin, org, mirrors 6 real repos from
src.sunbeam.pt (sol, cli, proxy, storybook, admin-ui, mistralai-client-rs)
- PAT provisioning for SDK testing without Vault
- code_index/gitea.rs: fixed directory listing (direct API calls instead
of SDK's single-object parser), proper base64 file decoding
New integration tests:
- Gitea: list_repos, get_repo, get_file, directory listing, code indexing
- Web search: SearXNG query with result verification
- Conversation registry: lifecycle + send_message round-trip
- Evaluator: rule matching (DM, own message)
- gRPC bridge: event filtering, tool call mapping, thinking→status
2026-03-24 11:45:43 +00:00
|
|
|
gitea-data:
|
feat: integration test suite — 416 tests, 61% coverage
Add OpenBao and Kratos to docker-compose dev stack with bootstrap
seeding. Full integration tests hitting real services:
- Vault SDK: KV read/write/delete, re-auth on bad token, new_with_token
constructor for dev mode
- Kratos SDK: list/get/create/disable/enable users, session listing
- Token store: PAT lifecycle with OpenBao backing, expiry handling
- Identity tools: full tool dispatch through Kratos admin API
- Gitea SDK: resolve_username, ensure_token (PAT auto-provisioning),
list/get repos, issues, comments, branches, file content
- Devtools: tool dispatch for all gitea_* tools against live Gitea
- Archive indexer: batch flush, periodic flush task, edit/redact/reaction
updates against OpenSearch
- Memory store: set/query/get_recent with user scoping in OpenSearch
- Room history: context retrieval by timestamp and event_id, access
control enforcement
- Search archive: keyword search with room/sender filters, room scoping
- Code search: language filter, repo filter, branch scoping
- Breadcrumbs: symbol retrieval, empty index handling, token budget
- Bridge: full event lifecycle mapping, request ID filtering
- Evaluator: DM/mention/silence short-circuits, LLM evaluation path,
reply-to-human suppression
- Agent registry: list/get_id, prompt reuse, prompt-change recreation
- Conversations: token tracking, multi-turn context recall, room
isolation
Bug fixes caught by tests:
- AgentRegistry in-memory cache skipped hash comparison on prompt change
- KratosClient::set_state sent bare PUT without traits (400 error)
- find_code_session returns None on NULL conversation_id
2026-03-24 14:34:03 +00:00
|
|
|
kratos-data:
|