From bd9175d986e8226f8c8648a85c0b2d2c21af2a1e Mon Sep 17 00:00:00 2001 From: h Date: Sat, 29 Aug 2026 20:36:23 +0200 Subject: [PATCH] feat(config,compose): t3code-mcp as dispatcher hands on mac and dell --- .env.example | 15 +++++++++------ config.py | 14 +++++++++++++- docker-compose.yml | 10 ++++++++++ t3code.toml | 17 +++++++++++++++++ 4 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 t3code.toml diff --git a/.env.example b/.env.example index 630a754..941f674 100644 --- a/.env.example +++ b/.env.example @@ -5,8 +5,9 @@ ### Compose ################################################################### -# Какие сервисы поднимать: db (postgres), gateway, obsidian (obsidian-headless) -COMPOSE_PROFILES=db,gateway,obsidian +# Какие сервисы поднимать: db (postgres), gateway, obsidian (obsidian-headless), +# t3 (t3code-mcp - руки диспетчера на маке и dell) +COMPOSE_PROFILES=db,gateway,obsidian,t3 # Ветка/тег beaver-gateway, из которого собирается образ шлюза GATEWAY_REF=main @@ -65,10 +66,12 @@ BEAVERGRAM_MCP= ### t3code (руки диспетчера, с S10) ########################################### -# `t3 serve --tailscale-serve --host ` на маке → адрес -T3_URL= -# `t3 auth session issue --token-only` -T3_TOKEN= +# t3code-mcp - сервис compose (профиль t3), машины и allowlist - ./t3code.toml. +# На каждой машине: `t3 auth session issue --token-only --ttl 365d --label beaver` +T3_MAC_TOKEN= +T3_DELL_TOKEN= +# Ветка/тег t3code-mcp, из которого собирается образ +T3CODE_MCP_REF=main ### Komodo (python_tool с перечисленными действиями, с S8) #################### diff --git a/config.py b/config.py index 8724577..64b9007 100644 --- a/config.py +++ b/config.py @@ -169,6 +169,16 @@ komodo_mcps = ( ) komodo_exposed = (ExposedMcp(name="komodo"),) if KOMODO else () +# §5: t3code-mcp - сосед по compose (профиль t3), машины и allowlist проектов +# в его t3code.toml; токены t3 живут в его env, gateway их не видит. +T3CODE_MCP = os.environ.get("T3CODE_MCP", "http://t3code-mcp:8000/mcp") +t3code_mcps = ( + [McpServer.http(name="t3code", url=T3CODE_MCP)] + if "t3" in os.environ.get("COMPOSE_PROFILES", "").split(",") + else [] +) +t3code_exposed = (ExposedMcp(name="t3code"),) if t3code_mcps else () + # Секреты MCP - только через env подпроцесса (mcp stdio даёт ему белый список # + это), никогда argv: процесс модели видит `ps` всего контейнера. mcps: list[McpServerT] = [ @@ -189,6 +199,7 @@ mcps: list[McpServerT] = [ McpServer.http(name="telegram", url=os.environ["BEAVERGRAM_MCP"]), *calendar_mcps, *komodo_mcps, + *t3code_mcps, ] # Руки глубокого (§4.4): firefly без delete_*, obsidian-fs не даётся - свои @@ -216,7 +227,8 @@ def dispatcher(name: str, model: str, effort: str | None = None) -> ClaudeAgent: gateway_tools=("read_conversation", "spawn", "say", "schedule"), options=ClaudeOptions(effort=effort, disallowed_tools=DISPATCHER_DISALLOWED), policy=VAULT_POLICY, - expose_mcps=CLAUDE_MCPS, + # §4.4: t3code - рука диспетчера (мастер, ветки), глубоким не даётся. + expose_mcps=(*CLAUDE_MCPS, *t3code_exposed), ) diff --git a/docker-compose.yml b/docker-compose.yml index 78388d4..e2bc69b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -90,6 +90,16 @@ services: done exec python -m beaver_gateway + t3code-mcp: + container_name: beaver-t3code-mcp + build: + context: https://git.kotikot.com/beaver/t3code-mcp.git#${T3CODE_MCP_REF:-main} + profiles: [t3] + <<: *restart + env_file: .env + volumes: + - ./t3code.toml:/config/t3code.toml:ro + volumes: postgres-data: vault: diff --git a/t3code.toml b/t3code.toml new file mode 100644 index 0000000..a3cf044 --- /dev/null +++ b/t3code.toml @@ -0,0 +1,17 @@ +# t3code-mcp (§5): машины с T3 Code и allowlist проектов на каждой. +# Токены - только в .env (T3_MAC_TOKEN, T3_DELL_TOKEN), сюда не писать. +# projects - fnmatch по названию проекта и по его workspace root. + +[machines.mac] +url = "http://mac:3773" +token_env = "T3_MAC_TOKEN" +projects = ["t3-smoke", "/Users/h/projects/openprise/beaver/*"] +model = "claudeAgent/claude-opus-5" +options = { effort = "high", contextWindow = "1m" } + +[machines.dell] +url = "http://dell:3773" +token_env = "T3_DELL_TOKEN" +projects = ["/root/projects", "/root/projects/*"] +model = "claudeAgent/claude-opus-5" +options = { effort = "high", contextWindow = "1m" }