Files
awoooi/apps/api/migrations/awooop_phase6_ewoooc_onboarding_2026-05-04.sql
Your Name 8629ac709b
Some checks failed
run-migration / migrate (push) Failing after 59s
Code Review / ai-code-review (push) Successful in 1m8s
Type Sync Check / check-type-sync (push) Successful in 2m27s
feat(awooop): Phase 1-8 完整實作 — AwoooP Agent Platform 六平面架構
## 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>
2026-05-04 19:31:53 +08:00

94 lines
3.5 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- AwoooP Phase 6: EwoooC Tenant Onboarding
-- ADR-115Tenant Onboarding 模板)
-- 2026-05-04 ogt + Claude Sonnet 4.6
-- =============================================================================
-- 執行前提Phase 1 migrationawooop_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_projectsEwoooC 租戶)
-- ---------------------------------------------------------------------------
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 租戶 KMRLS 隔離)',
'["read"]'::jsonb,
'{"env": "any"}'::jsonb
) ON CONFLICT (project_id, tool_name) DO NOTHING;
COMMIT;