## Phase 1-3: Control Plane + Contract System - awooop_phase1_control_plane_2026-05-04.sql: 12 張核心表 + RLS - awooop_phase1_batch1_rls_2026-05-04.sql: 全部 FORCE RLS + GRANT - packages/awooop-contracts/: 六合約 JSON Schema + golden fixtures - src/models/awooop_contracts.py: Pydantic v2 contract models(extra=forbid) - src/repositories/contract_repository.py: contract lifecycle(draft→published→active) - src/services/contract_service.py: HMAC publish sig + Redis multi-sig activate - src/services/schema_validator.py: LLM output validator(retry×3, E-SCHEMA-001) ## Phase 2: Tenant Isolation - awooop_phase2_budget_ledger_2026-05-04.sql: budget_ledger + RLS - src/services/budget_service.py: Token Budget Hard Kill 三層防線 - src/core/context.py: PROJECT_ID ContextVar(31 background loop 自動繼承) - src/db/base.py + models.py: project_id 欄位 + RLS set_config 注入 - src/hermes/nl_gateway.py: project_id Redis key 前綴(Phase A 雙寫) - src/services/anomaly_counter.py: per-project 改造(Phase A fallback) ## Phase 4: Platform Shell in Shadow Mode - awooop_phase4_run_state_2026-05-04.sql: run_state + step_journal + idempotency - src/services/run_state_machine.py: 8-state FSM + SKIP LOCKED + stale reaper - src/services/platform_runtime.py: UUID v7 + W3C trace_id + shadow_execute - src/services/audit_sink.py: PII/secret redaction 9 patterns - src/api/v1/platform/runs.py: POST/GET /v1/platform/runs(Router→Service 架構) - src/workers/platform_worker.py: SKIP LOCKED worker + heartbeat + reaper loop - src/main.py: platform router + lifespan worker start/stop ## Phase 5: MCP Gateway 五閘門 - awooop_phase5_mcp_gateway_2026-05-04.sql: 4 表 + RLS - src/plugins/mcp/gateway.py: McpGateway(Gate 1~5, E-MCP-GATE-001~009) - src/plugins/mcp/redaction_middleware.py: 雙層 redaction + 16K 截斷 - src/plugins/mcp/registry.py: __provider name mangling(ADR-116) - src/plugins/mcp/credential_resolver.py: k8s secret ref 解析 - tests/test_mcp_credential_isolation.py: 10 個迴歸測試(secret leak 防再現) ## Phase 6-8: EwoooC + Channel Hub + Approval Token - awooop_phase6_ewoooc_onboarding_2026-05-04.sql: ewoooc tenant + 4 read-only MCP tools - awooop_phase7_channel_hub_2026-05-04.sql: conversation_event + outbound_message - src/services/provider_proxy.py: ProviderProxy + PlatformEnvelope(ADR-115) - src/services/channel_hub.py: Telegram inbound mirror + Progressive Feedback(30s) - src/services/awooop_approval_token.py: HS256 + jti NX replay 防護 + suggest mode Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
94 lines
3.5 KiB
PL/PgSQL
94 lines
3.5 KiB
PL/PgSQL
-- =============================================================================
|
||
-- AwoooP Phase 6: EwoooC Tenant Onboarding
|
||
-- ADR-115(Tenant Onboarding 模板)
|
||
-- 2026-05-04 ogt + Claude Sonnet 4.6
|
||
-- =============================================================================
|
||
-- 執行前提:Phase 1 migration(awooop_phase1_control_plane_2026-05-04.sql)已執行
|
||
-- 說明:
|
||
-- EwoooC 是第二個接入 AwoooP 的租戶(awoooi 為第一個)
|
||
-- migration_mode = 'shadow' 啟動,進入 canary 前需通過 shadow run 驗證
|
||
-- budget_limit_usd = 50.0(初始限制,可調整)
|
||
-- 4 個 read-only MCP tools 預先在白名單中(不需 approval)
|
||
-- =============================================================================
|
||
|
||
BEGIN;
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- Step 1: INSERT awooop_projects(EwoooC 租戶)
|
||
-- ---------------------------------------------------------------------------
|
||
INSERT INTO awooop_projects (
|
||
project_id,
|
||
display_name,
|
||
migration_mode,
|
||
budget_limit_usd,
|
||
allowed_channels,
|
||
metadata
|
||
) VALUES (
|
||
'ewoooc',
|
||
'EwoooC Business Platform',
|
||
'shadow', -- Phase 6 啟動模式;通過驗證後升級為 canary
|
||
50.00, -- 初始 USD 預算上限
|
||
'["telegram","api"]'::jsonb,
|
||
'{
|
||
"onboarded_at": "2026-05-04",
|
||
"tier": "business",
|
||
"ollama_topology": "gcp_three_tier",
|
||
"note": "ADR-115 EwoooC 接入,共用 GCP Ollama 三層拓撲"
|
||
}'::jsonb
|
||
) ON CONFLICT (project_id) DO NOTHING;
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- Step 2: awooop_mcp_tool_registry — 4 個 read-only MCP tools
|
||
-- (ewoooc 初始只允許唯讀工具,write/admin 需另外建 grant)
|
||
-- ---------------------------------------------------------------------------
|
||
|
||
-- Tool 1: k8s_get — 查詢 k8s resource(唯讀)
|
||
INSERT INTO awooop_mcp_tool_registry (
|
||
project_id, tool_name, tool_type, description, allowed_scopes, environment_tags
|
||
) VALUES (
|
||
'ewoooc',
|
||
'k8s_get',
|
||
'builtin',
|
||
'kubectl get 唯讀查詢(pod/deployment/service 狀態)',
|
||
'["read"]'::jsonb,
|
||
'{"env": "any"}'::jsonb
|
||
) ON CONFLICT (project_id, tool_name) DO NOTHING;
|
||
|
||
-- Tool 2: signoz_query — 查詢 SigNoz metrics/traces(唯讀)
|
||
INSERT INTO awooop_mcp_tool_registry (
|
||
project_id, tool_name, tool_type, description, allowed_scopes, environment_tags
|
||
) VALUES (
|
||
'ewoooc',
|
||
'signoz_query',
|
||
'builtin',
|
||
'SigNoz metrics/traces 查詢(唯讀,無告警修改)',
|
||
'["read"]'::jsonb,
|
||
'{"env": "any"}'::jsonb
|
||
) ON CONFLICT (project_id, tool_name) DO NOTHING;
|
||
|
||
-- Tool 3: incident_read — 讀取 EwoooC incident 記錄(唯讀,RLS 隔離)
|
||
INSERT INTO awooop_mcp_tool_registry (
|
||
project_id, tool_name, tool_type, description, allowed_scopes, environment_tags
|
||
) VALUES (
|
||
'ewoooc',
|
||
'incident_read',
|
||
'builtin',
|
||
'Incident 查詢(僅限 ewoooc 租戶資料,RLS 強制隔離)',
|
||
'["read"]'::jsonb,
|
||
'{"env": "any"}'::jsonb
|
||
) ON CONFLICT (project_id, tool_name) DO NOTHING;
|
||
|
||
-- Tool 4: km_read — 讀取 Knowledge Management 條目(唯讀)
|
||
INSERT INTO awooop_mcp_tool_registry (
|
||
project_id, tool_name, tool_type, description, allowed_scopes, environment_tags
|
||
) VALUES (
|
||
'ewoooc',
|
||
'km_read',
|
||
'builtin',
|
||
'Knowledge Management 讀取(ewoooc 租戶 KM,RLS 隔離)',
|
||
'["read"]'::jsonb,
|
||
'{"env": "any"}'::jsonb
|
||
) ON CONFLICT (project_id, tool_name) DO NOTHING;
|
||
|
||
COMMIT;
|