feat(config,compose): t3code-mcp as dispatcher hands on mac and dell

This commit is contained in:
hh
2026-08-29 20:36:23 +02:00
parent fc0fef734e
commit bd9175d986
4 changed files with 49 additions and 7 deletions
+9 -6
View File
@@ -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 <tailnet-ip>` на маке → адрес
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) ####################
+13 -1
View File
@@ -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),
)
+10
View File
@@ -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:
+17
View File
@@ -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" }