From 0aa80c1d3262cc67646d63d1df8549a024bec4b3 Mon Sep 17 00:00:00 2001 From: OG T Date: Mon, 23 Mar 2026 12:01:20 +0800 Subject: [PATCH] fix(docker): embed mock types for Docker build compatibility Remove lewooogo-brain local dependency that breaks Docker context. Inline Proposal/Guardrails definitions in proposals.py mock. Phase 6.4i will address proper monorepo Docker packaging. Co-Authored-By: Claude Opus 4.5 --- apps/api/pyproject.toml | 7 ++++--- apps/api/src/routers/proposals.py | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/apps/api/pyproject.toml b/apps/api/pyproject.toml index 42b28e00..7fc56a8b 100644 --- a/apps/api/pyproject.toml +++ b/apps/api/pyproject.toml @@ -25,11 +25,12 @@ dependencies = [ "opentelemetry-instrumentation-httpx>=0.41b0", "opentelemetry-instrumentation-logging>=0.41b0", # Phase 6.4g: leWOOOgo Brain - 積木化決策引擎 - "lewooogo-brain", + # NOTE: Local package disabled for Docker build compatibility + # "lewooogo-brain", # 待 monorepo Docker 解法 (Phase 6.4i) ] -[tool.uv.sources] -lewooogo-brain = { path = "../../packages/lewooogo-brain", editable = true } +# [tool.uv.sources] +# lewooogo-brain = { path = "../../packages/lewooogo-brain", editable = true } [project.optional-dependencies] dev = [ diff --git a/apps/api/src/routers/proposals.py b/apps/api/src/routers/proposals.py index 1dc355ca..8ffd65bc 100644 --- a/apps/api/src/routers/proposals.py +++ b/apps/api/src/routers/proposals.py @@ -28,9 +28,30 @@ class ProposalResponse(BaseModel): rejection_reason: str | None = Field(default=None, description="若未通過防爆圈,顯示阻擋原因") def get_proposal_engine(): - """Phase 6.4g 暫時性 Mock DI,驗證路由暢通""" - from lewooogo_brain.interfaces.proposal_engine import Proposal, Guardrails + """ + Phase 6.4g 暫時性 Mock DI,驗證路由暢通 + NOTE: 完全內嵌,不依賴外部 lewooogo-brain 套件 (Docker 相容) + """ from uuid import uuid4 + from pydantic import BaseModel + + # 內嵌 Guardrails 定義 (Docker 相容) + class Guardrails(BaseModel): + require_dry_run: bool = True + allowed_namespace: list[str] = ["awoooi-prod"] + forbidden_commands: list[str] = ["rm -rf", "drop table", "kubectl delete ns"] + max_retries: int = 1 + timeout_sec: int = 60 + + # 內嵌 Proposal 定義 (Docker 相容) + class Proposal(BaseModel): + proposal_id: str + incident_id: str + action: str + description: str + risk_level: str + guardrails: dict + metadata: dict = {} class MockEngine: async def generate(self, incident_id: str) -> tuple[Proposal | None, str]: