openapi: 3.1.0
info:
  title: AWOOOI API
  description: AWOOOI 智能運維平台 API - 由 leWOOOgo Engine 驅動
  version: 1.0.0
paths:
  /api/v1/health:
    get:
      tags:
      - Health
      summary: Get Health
      description: 'Full health check with real component probes


        Performs async health checks on all external dependencies:

        - PostgreSQL: Primary database

        - Redis: Cache layer

        - Ollama: Local LLM service

        - OpenClaw: AI Agent service

        - SigNoz: Observability platform


        Returns overall system status based on component health.'
      operationId: get_health_api_v1_health_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthResponse'
  /api/v1/health/ready:
    get:
      tags:
      - Health
      summary: Get Readiness
      description: 'K8s readinessProbe


        Returns 200 when the service is ready to accept traffic.

        Lightweight check - doesn''t probe external services.'
      operationId: get_readiness_api_v1_health_ready_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties:
                  type: string
                type: object
                title: Response Get Readiness Api V1 Health Ready Get
  /api/v1/health/live:
    get:
      tags:
      - Health
      summary: Get Liveness
      description: 'K8s livenessProbe


        Returns 200 when the service is alive.

        Used by K8s to determine if pod needs restart.'
      operationId: get_liveness_api_v1_health_live_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties:
                  type: string
                type: object
                title: Response Get Liveness Api V1 Health Live Get
  /api/v1/dashboard:
    get:
      tags:
      - Dashboard
      summary: Get Dashboard
      description: 'Get aggregated dashboard data


        Fetches status from all four hosts using asyncio.gather.

        Returns CPU/Memory metrics when MOCK_MODE is enabled.'
      operationId: get_dashboard_api_v1_dashboard_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DashboardResponse'
  /api/v1/dashboard/stream:
    get:
      tags:
      - Dashboard
      summary: Stream Dashboard
      description: "SSE real-time dashboard updates\n\nEnterprise-grade SSE implementation\
        \ with:\n- Automatic disconnect detection\n- Resource cleanup on disconnect\n\
        - Heartbeat mechanism (every 15s)\n- Backpressure handling\n\nClient Usage\
        \ (JavaScript):\n```javascript\nconst es = new EventSource('/api/v1/dashboard/stream');\n\
        es.addEventListener('host_update', (e) => {\n    const data = JSON.parse(e.data);\n\
        \    console.log('Host update:', data);\n});\nes.addEventListener('heartbeat',\
        \ (e) => {\n    console.log('Heartbeat received');\n});\nes.onerror = (e)\
        \ => {\n    console.log('Connection lost, reconnecting...');\n};\n```\n\n\
        Disconnect Detection:\n- When browser closes or navigates away\n- When network\
        \ connection is lost\n- When client calls es.close()\n\nThe server automatically\
        \ detects disconnection via:\n1. asyncio.CancelledError on generator exit\n\
        2. Heartbeat timeout detection\n3. Queue full backpressure"
      operationId: stream_dashboard_api_v1_dashboard_stream_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
  /api/v1/dashboard/hosts:
    get:
      tags:
      - Dashboard
      summary: Get Hosts
      description: 'Get four-host architecture status


        Returns the configured four-host IPs and their roles.'
      operationId: get_hosts_api_v1_dashboard_hosts_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Get Hosts Api V1 Dashboard Hosts Get
  /api/v1/dashboard/stream/clients:
    get:
      tags:
      - Dashboard
      summary: Get Stream Clients
      description: Get current SSE client count (debug endpoint)
      operationId: get_stream_clients_api_v1_dashboard_stream_clients_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Get Stream Clients Api V1 Dashboard Stream Clients
                  Get
  /api/v1/dashboard/snapshot:
    get:
      tags:
      - Dashboard
      summary: Get Dashboard Snapshot
      description: 'Full dashboard snapshot for SSE hydration


        Client workflow:

        1. Connect to /dashboard/stream (SSE)

        2. Immediately fetch /dashboard/snapshot

        3. Apply snapshot as initial state

        4. Process SSE events for incremental updates


        This ensures no alerts are missed during connection setup.'
      operationId: get_dashboard_snapshot_api_v1_dashboard_snapshot_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Get Dashboard Snapshot Api V1 Dashboard Snapshot Get
  /api/v1/approvals/k8s-test:
    get:
      tags:
      - HITL Approvals
      - HITL Approvals
      summary: 測試 K8s 連線
      description: 連接 K3s 叢集並列出所有 Namespace。用於驗證 kubeconfig 設定。
      operationId: test_k8s_connection_api_v1_approvals_k8s_test_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Test K8S Connection Api V1 Approvals K8S Test Get
  /api/v1/approvals/pending:
    get:
      tags:
      - HITL Approvals
      - HITL Approvals
      summary: 取得待簽核清單
      description: 獲取所有等待簽核的授權請求，供戰情室前端渲染。
      operationId: get_pending_approvals_api_v1_approvals_pending_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PendingApprovalsResponse'
  /api/v1/approvals:
    post:
      tags:
      - HITL Approvals
      - HITL Approvals
      summary: 建立授權請求
      description: 建立新的 HITL 授權請求。LOW 風險自動批准，MEDIUM/CRITICAL 需要簽核。
      operationId: create_approval_api_v1_approvals_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApprovalRequestCreate'
        required: true
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApprovalRequestResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/approvals/{approval_id}/sign:
    post:
      tags:
      - HITL Approvals
      - HITL Approvals
      summary: 簽核授權請求
      description: 提交簽核。當滿足所需簽核數時，狀態轉為 APPROVED 並觸發背景執行。
      operationId: sign_approval_api_v1_approvals__approval_id__sign_post
      parameters:
      - name: approval_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Approval Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SignRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/approvals/{approval_id}/reject:
    post:
      tags:
      - HITL Approvals
      - HITL Approvals
      summary: 拒絕授權請求
      description: 拒絕並終止授權請求。狀態轉為 REJECTED。
      operationId: reject_approval_api_v1_approvals__approval_id__reject_post
      parameters:
      - name: approval_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Approval Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApprovalRequestResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/ai/analyze-and-propose:
    post:
      tags:
      - AI Decision
      - AI Decision
      summary: AI 分析並自動立案
      description: 拉取當前監控數據，交給 OpenClaw 分析。若判定需要修復，自動建立 ApprovalRecord。
      operationId: analyze_and_propose_api_v1_ai_analyze_and_propose_post
      requestBody:
        content:
          application/json:
            schema:
              anyOf:
              - $ref: '#/components/schemas/OpenClawAnalysisRequest'
              - type: 'null'
              title: Request
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenClawAnalysisResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/ai/status:
    get:
      tags:
      - AI Decision
      - AI Decision
      summary: AI 服務狀態
      description: 檢查 OpenClaw AI 服務狀態與可用的 AI 提供者。
      operationId: get_ai_status_api_v1_ai_status_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Get Ai Status Api V1 Ai Status Get
  /api/v1/plugins:
    get:
      tags:
      - Plugins
      summary: List Plugins
      description: 列出所有已註冊 Plugin
      operationId: list_plugins_api_v1_plugins_get
      parameters:
      - name: category
        in: query
        required: false
        schema:
          anyOf:
          - enum:
            - INPUT
            - BRAIN
            - OUTPUT
            - ACTION
            - DATA
            - UI
            type: string
          - type: 'null'
          title: Category
      - name: enabled
        in: query
        required: false
        schema:
          anyOf:
          - type: boolean
          - type: 'null'
          title: Enabled
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Plugin'
                title: Response List Plugins Api V1 Plugins Get
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/plugins/{plugin_id}:
    get:
      tags:
      - Plugins
      summary: Get Plugin
      description: 取得 Plugin 詳情
      operationId: get_plugin_api_v1_plugins__plugin_id__get
      parameters:
      - name: plugin_id
        in: path
        required: true
        schema:
          type: string
          title: Plugin Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Plugin'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/plugins/{plugin_id}/health:
    get:
      tags:
      - Plugins
      summary: Get Plugin Health
      description: Plugin 健康檢查
      operationId: get_plugin_health_api_v1_plugins__plugin_id__health_get
      parameters:
      - name: plugin_id
        in: path
        required: true
        schema:
          type: string
          title: Plugin Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PluginHealth'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/pipelines:
    get:
      tags:
      - Pipelines
      summary: List Pipelines
      description: 列出工作流
      operationId: list_pipelines_api_v1_pipelines_get
      parameters:
      - name: status
        in: query
        required: false
        schema:
          anyOf:
          - enum:
            - draft
            - active
            - paused
            - archived
            type: string
          - type: 'null'
          title: Status
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PipelineList'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
      - Pipelines
      summary: Create Pipeline
      description: 建立工作流
      operationId: create_pipeline_api_v1_pipelines_post
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PipelineCreate'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pipeline'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/pipelines/{pipeline_id}:
    get:
      tags:
      - Pipelines
      summary: Get Pipeline
      description: 取得工作流詳情
      operationId: get_pipeline_api_v1_pipelines__pipeline_id__get
      parameters:
      - name: pipeline_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Pipeline Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pipeline'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
      - Pipelines
      summary: Delete Pipeline
      description: 刪除工作流
      operationId: delete_pipeline_api_v1_pipelines__pipeline_id__delete
      parameters:
      - name: pipeline_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Pipeline Id
      responses:
        '204':
          description: Successful Response
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/pipelines/{pipeline_id}/trigger:
    post:
      tags:
      - Pipelines
      summary: Trigger Pipeline
      description: 手動觸發工作流
      operationId: trigger_pipeline_api_v1_pipelines__pipeline_id__trigger_post
      parameters:
      - name: pipeline_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Pipeline Id
      responses:
        '202':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PipelineExecution'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/agent/chat:
    post:
      tags:
      - Agent
      summary: Chat With Agent
      description: 與 OpenClaw 對話
      operationId: chat_with_agent_api_v1_agent_chat_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChatRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/agent/chat/stream:
    post:
      tags:
      - Agent
      summary: Chat With Agent Stream
      description: 與 OpenClaw 對話 (SSE 串流)
      operationId: chat_with_agent_stream_api_v1_agent_chat_stream_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChatRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/agent/status:
    get:
      tags:
      - Agent
      summary: Get Agent Status
      description: OpenClaw 狀態
      operationId: get_agent_status_api_v1_agent_status_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentStatus'
  /api/v1/agent/thinking:
    get:
      tags:
      - Agent
      summary: Get Agent Thinking
      description: 'OpenClaw 思考軌跡 (SSE 串流)

        Phase 1.2: 真實串接 Ollama at 192.168.0.188:11434'
      operationId: get_agent_thinking_api_v1_agent_thinking_get
      parameters:
      - name: prompt
        in: query
        required: false
        schema:
          type: string
          description: 發送給 AI 的提示詞
          default: 你是 AWOOOI 智能運維助手。請簡短分析一下目前系統的健康狀態，用中文回答。
          title: Prompt
        description: 發送給 AI 的提示詞
      - name: model
        in: query
        required: false
        schema:
          type: string
          description: Ollama 模型名稱
          default: llama3.2:latest
          title: Model
        description: Ollama 模型名稱
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/notifications/channels:
    get:
      tags:
      - Notifications
      summary: List Notification Channels
      description: 列出通知頻道
      operationId: list_notification_channels_api_v1_notifications_channels_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/NotificationChannel'
                type: array
                title: Response List Notification Channels Api V1 Notifications Channels
                  Get
  /api/v1/notifications/send:
    post:
      tags:
      - Notifications
      summary: Send Notification
      description: 發送通知
      operationId: send_notification_api_v1_notifications_send_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NotificationRequest'
        required: true
      responses:
        '202':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotificationResult'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    AIRiskLevel:
      type: string
      enum:
      - low
      - medium
      - critical
      title: AIRiskLevel
      description: AI 風險評估等級
    AgentStatus:
      properties:
        status:
          type: string
          enum:
          - idle
          - thinking
          - executing
          - waiting_approval
          title: Status
        active_conversations:
          type: integer
          title: Active Conversations
        current_task:
          anyOf:
          - type: string
          - type: 'null'
          title: Current Task
        last_activity:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Last Activity
      type: object
      required:
      - status
      - active_conversations
      title: AgentStatus
    ApprovalRequestCreate:
      properties:
        action:
          type: string
          title: Action
          description: 執行動作描述
        description:
          type: string
          title: Description
          description: 詳細說明
        risk_level:
          $ref: '#/components/schemas/RiskLevel'
          description: 風險等級
        blast_radius:
          $ref: '#/components/schemas/BlastRadius'
        dry_run_checks:
          items:
            $ref: '#/components/schemas/DryRunCheck'
          type: array
          title: Dry Run Checks
        requested_by:
          type: string
          title: Requested By
          description: 請求發起者
        expires_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Expires At
          description: 到期時間
        metadata:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Metadata
          description: 額外元資料
      type: object
      required:
      - action
      - description
      - risk_level
      - requested_by
      title: ApprovalRequestCreate
      description: 建立授權請求 (API 輸入)
    ApprovalRequestResponse:
      properties:
        id:
          type: string
          title: Id
        action:
          type: string
          title: Action
        description:
          type: string
          title: Description
        status:
          $ref: '#/components/schemas/ApprovalStatus'
        risk_level:
          $ref: '#/components/schemas/RiskLevel'
        blast_radius:
          $ref: '#/components/schemas/BlastRadius'
        dry_run_checks:
          items:
            $ref: '#/components/schemas/DryRunCheck'
          type: array
          title: Dry Run Checks
        required_signatures:
          type: integer
          title: Required Signatures
        current_signatures:
          type: integer
          title: Current Signatures
        signatures:
          items:
            $ref: '#/components/schemas/Signature'
          type: array
          title: Signatures
        requested_by:
          type: string
          title: Requested By
        created_at:
          type: string
          format: date-time
          title: Created At
        expires_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Expires At
        resolved_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Resolved At
      type: object
      required:
      - id
      - action
      - description
      - status
      - risk_level
      - blast_radius
      - dry_run_checks
      - required_signatures
      - current_signatures
      - signatures
      - requested_by
      - created_at
      - expires_at
      - resolved_at
      title: ApprovalRequestResponse
      description: 授權請求 API 回應
    ApprovalStatus:
      type: string
      enum:
      - pending
      - approved
      - rejected
      - expired
      - execution_success
      - execution_failed
      title: ApprovalStatus
      description: "授權請求狀態機\n\nPENDING → APPROVED → EXECUTION_SUCCESS\n          \
        \        → EXECUTION_FAILED\nPENDING → REJECTED\nPENDING → EXPIRED"
    BlastRadius:
      properties:
        affected_pods:
          type: integer
          minimum: 0.0
          title: Affected Pods
          default: 0
        estimated_downtime:
          type: string
          title: Estimated Downtime
          default: '0'
        related_services:
          items:
            type: string
          type: array
          title: Related Services
        data_impact:
          $ref: '#/components/schemas/DataImpact'
          default: none
      type: object
      title: BlastRadius
      description: 爆炸半徑 - 影響範圍評估
    ChatRequest:
      properties:
        message:
          type: string
          title: Message
        conversation_id:
          anyOf:
          - type: string
            format: uuid
          - type: 'null'
          title: Conversation Id
        context:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Context
      type: object
      required:
      - message
      title: ChatRequest
    ChatResponse:
      properties:
        message:
          type: string
          title: Message
        conversation_id:
          type: string
          format: uuid
          title: Conversation Id
        actions:
          anyOf:
          - items:
              $ref: '#/components/schemas/src__routes__agent__SuggestedAction'
            type: array
          - type: 'null'
          title: Actions
        requires_approval:
          type: boolean
          title: Requires Approval
          default: false
        approval_id:
          anyOf:
          - type: string
            format: uuid
          - type: 'null'
          title: Approval Id
      type: object
      required:
      - message
      - conversation_id
      title: ChatResponse
    OpenClawAnalysisRequest:
      properties:
        force_refresh:
          type: boolean
          title: Force Refresh
          description: 強制重新抓取監控數據
          default: false
      type: object
      title: OpenClawAnalysisRequest
      description: 分析請求
    OpenClawAnalysisResponse:
      properties:
        success:
          type: boolean
          title: Success
        message:
          type: string
          title: Message
        decision:
          anyOf:
          - $ref: '#/components/schemas/OpenClawDecision'
          - type: 'null'
        approval_created:
          type: boolean
          title: Approval Created
          description: 是否已建立待簽核卡片
          default: false
        approval_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Approval Id
          description: 建立的 ApprovalRecord ID
        ai_provider:
          type: string
          title: Ai Provider
          description: 使用的 AI 提供者 (ollama/gemini/claude)
          default: unknown
        raw_llm_response:
          anyOf:
          - type: string
          - type: 'null'
          title: Raw Llm Response
          description: LLM 原始回應 (debug 用)
      type: object
      required:
      - success
      - message
      title: OpenClawAnalysisResponse
      description: 分析回應
    OpenClawDecision:
      properties:
        suggested_action:
          $ref: '#/components/schemas/src__models__ai__SuggestedAction'
          description: 建議執行的操作類型
        target_resource:
          type: string
          title: Target Resource
          description: 目標資源名稱 (e.g., 'harbor', 'grafana')
        namespace:
          type: string
          title: Namespace
          description: Kubernetes namespace
          default: default
        risk_level:
          $ref: '#/components/schemas/AIRiskLevel'
          description: 風險等級評估
        reasoning:
          type: string
          title: Reasoning
          description: 給人類主管看的分析理由 (繁體中文)
        deviation_analysis:
          type: string
          title: Deviation Analysis
          description: 基準線偏差分析 (例如：CPU 85% 超出基準線 45% 達 +4σ)
          default: ''
        confidence:
          type: number
          maximum: 1.0
          minimum: 0.0
          title: Confidence
          description: 決策信心度 (0-1)
          default: 0.8
        affected_services:
          items:
            type: string
          type: array
          title: Affected Services
          description: 可能受影響的相關服務
      type: object
      required:
      - suggested_action
      - target_resource
      - risk_level
      - reasoning
      title: OpenClawDecision
      description: 'OpenClaw AI 決策輸出 (強制結構化)


        LLM 必須輸出此格式的 JSON，否則視為解析失敗'
    ComponentHealth:
      properties:
        status:
          type: string
          enum:
          - up
          - down
          - degraded
          title: Status
        latency_ms:
          anyOf:
          - type: number
          - type: 'null'
          title: Latency Ms
        error:
          anyOf:
          - type: string
          - type: 'null'
          title: Error
      type: object
      required:
      - status
      title: ComponentHealth
      description: Individual component health status
    DashboardResponse:
      properties:
        timestamp:
          type: string
          format: date-time
          title: Timestamp
        environment:
          type: string
          title: Environment
        mock_mode:
          type: boolean
          title: Mock Mode
        overall_status:
          type: string
          title: Overall Status
        hosts:
          items:
            $ref: '#/components/schemas/HostStatusResponse'
          type: array
          title: Hosts
        alerts_count:
          type: integer
          title: Alerts Count
        pending_approvals:
          type: integer
          title: Pending Approvals
      type: object
      required:
      - timestamp
      - environment
      - mock_mode
      - overall_status
      - hosts
      - alerts_count
      - pending_approvals
      title: DashboardResponse
      description: Dashboard aggregated data
    DataImpact:
      type: string
      enum:
      - none
      - read_only
      - write
      - destructive
      title: DataImpact
      description: 資料影響類型
    DryRunCheck:
      properties:
        name:
          type: string
          title: Name
        passed:
          type: boolean
          title: Passed
        message:
          anyOf:
          - type: string
          - type: 'null'
          title: Message
      type: object
      required:
      - name
      - passed
      title: DryRunCheck
      description: Dry-Run 預演檢查結果
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    HealthResponse:
      properties:
        status:
          type: string
          enum:
          - healthy
          - degraded
          - unhealthy
          title: Status
        version:
          type: string
          title: Version
        environment:
          type: string
          title: Environment
        mock_mode:
          type: boolean
          title: Mock Mode
        timestamp:
          type: string
          format: date-time
          title: Timestamp
        components:
          additionalProperties:
            $ref: '#/components/schemas/ComponentHealth'
          type: object
          title: Components
      type: object
      required:
      - status
      - version
      - environment
      - mock_mode
      - timestamp
      - components
      title: HealthResponse
      description: Full health check response
    HostStatusResponse:
      properties:
        ip:
          type: string
          title: Ip
        name:
          type: string
          title: Name
        role:
          type: string
          title: Role
        status:
          type: string
          title: Status
        services:
          items:
            additionalProperties: true
            type: object
          type: array
          title: Services
        metrics:
          anyOf:
          - additionalProperties:
              type: number
            type: object
          - type: 'null'
          title: Metrics
      type: object
      required:
      - ip
      - name
      - role
      - status
      - services
      title: HostStatusResponse
      description: Host status for API response
    NotificationChannel:
      properties:
        id:
          type: string
          title: Id
        type:
          type: string
          enum:
          - telegram
          - slack
          - line
          - email
          - discord
          - webhook
          title: Type
        name:
          type: string
          title: Name
        enabled:
          type: boolean
          title: Enabled
      type: object
      required:
      - id
      - type
      - name
      - enabled
      title: NotificationChannel
    NotificationRequest:
      properties:
        channel_id:
          type: string
          title: Channel Id
        message:
          type: string
          title: Message
        template_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Template Id
        variables:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Variables
        priority:
          type: string
          enum:
          - low
          - normal
          - high
          - urgent
          title: Priority
          default: normal
      type: object
      required:
      - channel_id
      - message
      title: NotificationRequest
    NotificationResult:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        status:
          type: string
          enum:
          - queued
          - sent
          - failed
          title: Status
        sent_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Sent At
        error:
          anyOf:
          - type: string
          - type: 'null'
          title: Error
      type: object
      required:
      - id
      - status
      title: NotificationResult
    PendingApprovalsResponse:
      properties:
        count:
          type: integer
          title: Count
        approvals:
          items:
            $ref: '#/components/schemas/ApprovalRequestResponse'
          type: array
          title: Approvals
      type: object
      required:
      - count
      - approvals
      title: PendingApprovalsResponse
      description: 待簽核清單回應
    Pipeline:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        name:
          type: string
          title: Name
        description:
          anyOf:
          - type: string
          - type: 'null'
          title: Description
        status:
          type: string
          enum:
          - draft
          - active
          - paused
          - archived
          title: Status
        steps:
          items:
            $ref: '#/components/schemas/PipelineStep'
          type: array
          title: Steps
        created_at:
          type: string
          format: date-time
          title: Created At
        updated_at:
          type: string
          format: date-time
          title: Updated At
      type: object
      required:
      - id
      - name
      - status
      - steps
      - created_at
      - updated_at
      title: Pipeline
    PipelineCreate:
      properties:
        name:
          type: string
          title: Name
        description:
          anyOf:
          - type: string
          - type: 'null'
          title: Description
        steps:
          items:
            $ref: '#/components/schemas/PipelineStep'
          type: array
          title: Steps
      type: object
      required:
      - name
      - steps
      title: PipelineCreate
    PipelineExecution:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        pipeline_id:
          type: string
          format: uuid
          title: Pipeline Id
        status:
          type: string
          enum:
          - pending
          - running
          - completed
          - failed
          - cancelled
          title: Status
        started_at:
          type: string
          format: date-time
          title: Started At
        completed_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Completed At
      type: object
      required:
      - id
      - pipeline_id
      - status
      - started_at
      title: PipelineExecution
    PipelineList:
      properties:
        items:
          items:
            $ref: '#/components/schemas/Pipeline'
          type: array
          title: Items
        next_page_token:
          anyOf:
          - type: string
          - type: 'null'
          title: Next Page Token
      type: object
      required:
      - items
      title: PipelineList
    PipelineStep:
      properties:
        id:
          type: string
          title: Id
        plugin_id:
          type: string
          title: Plugin Id
        type:
          type: string
          enum:
          - INPUT
          - BRAIN
          - OUTPUT
          - ACTION
          - DATA
          - UI
          title: Type
        config:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Config
      type: object
      required:
      - id
      - plugin_id
      - type
      title: PipelineStep
    Plugin:
      properties:
        id:
          type: string
          title: Id
        name:
          type: string
          title: Name
        version:
          type: string
          title: Version
        category:
          type: string
          enum:
          - INPUT
          - BRAIN
          - OUTPUT
          - ACTION
          - DATA
          - UI
          title: Category
        enabled:
          type: boolean
          title: Enabled
        description:
          anyOf:
          - type: string
          - type: 'null'
          title: Description
      type: object
      required:
      - id
      - name
      - version
      - category
      - enabled
      title: Plugin
    PluginHealth:
      properties:
        plugin_id:
          type: string
          title: Plugin Id
        status:
          type: string
          enum:
          - healthy
          - unhealthy
          - unknown
          title: Status
        last_check:
          type: string
          format: date-time
          title: Last Check
        error:
          anyOf:
          - type: string
          - type: 'null'
          title: Error
      type: object
      required:
      - plugin_id
      - status
      - last_check
      title: PluginHealth
    RejectRequest:
      properties:
        rejector_id:
          type: string
          title: Rejector Id
          description: 退回者 ID
        rejector_name:
          type: string
          title: Rejector Name
          description: 退回者名稱
        reason:
          type: string
          title: Reason
          description: 退回原因
      type: object
      required:
      - rejector_id
      - rejector_name
      - reason
      title: RejectRequest
      description: 退回請求
    RiskLevel:
      type: string
      enum:
      - low
      - medium
      - critical
      title: RiskLevel
      description: '風險等級 - 決定所需簽核人數


        - LOW: 0 人，自動放行

        - MEDIUM: 需 1 人簽核

        - CRITICAL: 需 2 人 Multi-Sig 雙重簽核'
    SignRequest:
      properties:
        signer_id:
          type: string
          title: Signer Id
          description: 簽核者 ID
        signer_name:
          type: string
          title: Signer Name
          description: 簽核者名稱
        comment:
          anyOf:
          - type: string
          - type: 'null'
          title: Comment
          description: 簽核備註
      type: object
      required:
      - signer_id
      - signer_name
      title: SignRequest
      description: 簽核請求
    SignResponse:
      properties:
        success:
          type: boolean
          title: Success
        message:
          type: string
          title: Message
        approval:
          $ref: '#/components/schemas/ApprovalRequestResponse'
        execution_triggered:
          type: boolean
          title: Execution Triggered
          description: 是否觸發執行 (當簽核數滿足時)
          default: false
      type: object
      required:
      - success
      - message
      - approval
      title: SignResponse
      description: 簽核回應
    Signature:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        signer_id:
          type: string
          title: Signer Id
          description: 簽核者 ID
        signer_name:
          type: string
          title: Signer Name
          description: 簽核者名稱
        signed_at:
          type: string
          format: date-time
          title: Signed At
        comment:
          anyOf:
          - type: string
          - type: 'null'
          title: Comment
      type: object
      required:
      - signer_id
      - signer_name
      title: Signature
      description: 簽核記錄
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    src__models__ai__SuggestedAction:
      type: string
      enum:
      - RESTART_DEPLOYMENT
      - DELETE_POD
      - SCALE_DEPLOYMENT
      - NO_ACTION
      title: SuggestedAction
      description: 'AI 建議操作類型


        必須與 executor.OperationType 對應'
    src__routes__agent__SuggestedAction:
      properties:
        id:
          type: string
          title: Id
        label:
          type: string
          title: Label
        description:
          anyOf:
          - type: string
          - type: 'null'
          title: Description
        risk_level:
          type: string
          enum:
          - low
          - medium
          - high
          - critical
          title: Risk Level
      type: object
      required:
      - id
      - label
      - risk_level
      title: SuggestedAction

