feat(config,compose): t3code-mcp as dispatcher hands on mac and dell
This commit is contained in:
+9
-6
@@ -5,8 +5,9 @@
|
|||||||
|
|
||||||
### Compose ###################################################################
|
### Compose ###################################################################
|
||||||
|
|
||||||
# Какие сервисы поднимать: db (postgres), gateway, obsidian (obsidian-headless)
|
# Какие сервисы поднимать: db (postgres), gateway, obsidian (obsidian-headless),
|
||||||
COMPOSE_PROFILES=db,gateway,obsidian
|
# t3 (t3code-mcp - руки диспетчера на маке и dell)
|
||||||
|
COMPOSE_PROFILES=db,gateway,obsidian,t3
|
||||||
|
|
||||||
# Ветка/тег beaver-gateway, из которого собирается образ шлюза
|
# Ветка/тег beaver-gateway, из которого собирается образ шлюза
|
||||||
GATEWAY_REF=main
|
GATEWAY_REF=main
|
||||||
@@ -65,10 +66,12 @@ BEAVERGRAM_MCP=
|
|||||||
|
|
||||||
### t3code (руки диспетчера, с S10) ###########################################
|
### t3code (руки диспетчера, с S10) ###########################################
|
||||||
|
|
||||||
# `t3 serve --tailscale-serve --host <tailnet-ip>` на маке → адрес
|
# t3code-mcp - сервис compose (профиль t3), машины и allowlist - ./t3code.toml.
|
||||||
T3_URL=
|
# На каждой машине: `t3 auth session issue --token-only --ttl 365d --label beaver`
|
||||||
# `t3 auth session issue --token-only`
|
T3_MAC_TOKEN=
|
||||||
T3_TOKEN=
|
T3_DELL_TOKEN=
|
||||||
|
# Ветка/тег t3code-mcp, из которого собирается образ
|
||||||
|
T3CODE_MCP_REF=main
|
||||||
|
|
||||||
### Komodo (python_tool с перечисленными действиями, с S8) ####################
|
### Komodo (python_tool с перечисленными действиями, с S8) ####################
|
||||||
|
|
||||||
|
|||||||
@@ -169,6 +169,16 @@ komodo_mcps = (
|
|||||||
)
|
)
|
||||||
komodo_exposed = (ExposedMcp(name="komodo"),) if KOMODO else ()
|
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 даёт ему белый список
|
# Секреты MCP - только через env подпроцесса (mcp stdio даёт ему белый список
|
||||||
# + это), никогда argv: процесс модели видит `ps` всего контейнера.
|
# + это), никогда argv: процесс модели видит `ps` всего контейнера.
|
||||||
mcps: list[McpServerT] = [
|
mcps: list[McpServerT] = [
|
||||||
@@ -189,6 +199,7 @@ mcps: list[McpServerT] = [
|
|||||||
McpServer.http(name="telegram", url=os.environ["BEAVERGRAM_MCP"]),
|
McpServer.http(name="telegram", url=os.environ["BEAVERGRAM_MCP"]),
|
||||||
*calendar_mcps,
|
*calendar_mcps,
|
||||||
*komodo_mcps,
|
*komodo_mcps,
|
||||||
|
*t3code_mcps,
|
||||||
]
|
]
|
||||||
|
|
||||||
# Руки глубокого (§4.4): firefly без delete_*, obsidian-fs не даётся - свои
|
# Руки глубокого (§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"),
|
gateway_tools=("read_conversation", "spawn", "say", "schedule"),
|
||||||
options=ClaudeOptions(effort=effort, disallowed_tools=DISPATCHER_DISALLOWED),
|
options=ClaudeOptions(effort=effort, disallowed_tools=DISPATCHER_DISALLOWED),
|
||||||
policy=VAULT_POLICY,
|
policy=VAULT_POLICY,
|
||||||
expose_mcps=CLAUDE_MCPS,
|
# §4.4: t3code - рука диспетчера (мастер, ветки), глубоким не даётся.
|
||||||
|
expose_mcps=(*CLAUDE_MCPS, *t3code_exposed),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -90,6 +90,16 @@ services:
|
|||||||
done
|
done
|
||||||
exec python -m beaver_gateway
|
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:
|
volumes:
|
||||||
postgres-data:
|
postgres-data:
|
||||||
vault:
|
vault:
|
||||||
|
|||||||
+17
@@ -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" }
|
||||||
Reference in New Issue
Block a user