Skip to content

Gateway

Gateway 是 Triggerfish 的中央控制平面——一個長期執行的本機服務,透過單一 WebSocket 端點協調工作階段、通道、工具、事件和代理程序。Triggerfish 中發生的一切都通過 Gateway。

架構

Gateway 架構:左側通道通過中央 Gateway 連接到右側服務

Gateway 監聽可配置的連接埠(預設 18789),接受來自通道適配器、CLI 指令、配套應用程式和內部服務的連接。所有通訊使用基於 WebSocket 的 JSON-RPC。

Gateway 服務

Gateway 透過其 WebSocket 和 HTTP 端點提供以下服務:

服務描述安全整合
工作階段建立、列出、擷取記錄、在工作階段間傳送、產生背景任務每個工作階段追蹤 taint
通道路由訊息、管理連接、重試失敗的傳遞、分割大型訊息所有輸出進行分類檢查
排程排程週期性任務和從 TRIGGER.md 觸發喚醒排程操作通過策略 hook
Webhook透過 POST /webhooks/:sourceId 接受外部服務的入站事件入站資料在接收時被分類
Ripple跨通道追蹤在線狀態和打字指示器不暴露敏感資料
設定無需重啟即可熱載入設定企業版僅限管理員
控制面板Gateway 健康狀況和管理的網頁儀表板權杖驗證
Tide Pool託管代理驅動的 A2UI 視覺工作區內容受輸出 hook 約束
通知具有優先順序路由的跨通道通知傳遞分類規則適用

WebSocket JSON-RPC 協定

客戶端通過 WebSocket 連接到 Gateway 並交換 JSON-RPC 2.0 訊息。每個訊息都是具有型別化參數和型別化回應的方法呼叫。

typescript
// 客戶端傳送:
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "sessions.list",
  "params": { "filter": "active" }
}

// Gateway 回應:
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    { "id": "sess_abc", "taint": "CONFIDENTIAL", "channel": "telegram" },
    { "id": "sess_def", "taint": "PUBLIC", "channel": "cli" }
  ]
}

Gateway 也為 webhook 接收提供 HTTP 端點。當附加 SchedulerService 時,POST /webhooks/:sourceId 路由可用於入站 webhook 事件。

伺服器介面

typescript
interface GatewayServerOptions {
  /** 監聽的連接埠。使用 0 表示隨機可用連接埠。 */
  readonly port?: number;
  /** 連接的驗證權杖。 */
  readonly authToken?: string;
  /** 可選的排程器服務,用於 webhook 端點。 */
  readonly schedulerService?: SchedulerService;
}

interface GatewayAddr {
  readonly port: number;
  readonly hostname: string;
}

interface GatewayServer {
  /** 啟動伺服器。回傳綁定的位址。 */
  start(): Promise<GatewayAddr>;
  /** 優雅地停止伺服器。 */
  stop(): Promise<void>;
}

驗證

Gateway 連接使用權杖驗證。權杖在設定時(triggerfish dive)生成並儲存在本機。

安全性 Gateway 預設綁定到 127.0.0.1,不暴露在網路上。遠端存取需要明確的隧道配置。永遠不要在沒有驗證的情況下將 Gateway WebSocket 暴露到公共網際網路。 :::

工作階段管理

Gateway 管理工作階段的完整生命週期。工作階段是對話狀態的基本單位,每個都有獨立的 taint 追蹤。

工作階段類型

類型鍵模式描述
主要main與擁有者的主要直接對話。跨重啟持久化。
通道channel:<type>:<id>每個連接的通道一個。每個通道獨立的 taint。
背景bg:<task_id>為排程任務和 webhook 觸發的任務產生。以 PUBLIC taint 開始。
代理agent:<agent_id>多代理路由的每代理工作階段。
群組group:<channel>:<group_id>群組聊天工作階段。

工作階段工具

代理通過以下工具與工作階段互動,全部透過 Gateway 路由:

工具描述Taint 影響
sessions_list列出帶有可選過濾器的活躍工作階段無 taint 變更
sessions_history擷取工作階段的對話記錄Taint 繼承自被引用的工作階段
sessions_send傳送訊息到另一個工作階段受降級寫入檢查約束
sessions_spawn建立背景任務工作階段新工作階段以 PUBLIC taint 開始
session_status檢查當前工作階段狀態、模型、費用無 taint 變更

透過 sessions_send 的跨工作階段通訊受與任何其他輸出相同的降級寫入規則約束。CONFIDENTIAL 工作階段無法將資料傳送到連接 PUBLIC 通道的工作階段。 :::

通道路由

Gateway 通過通道路由器在通道和工作階段之間路由訊息。路由器處理:

  • 分類閘控:每個出站訊息在傳遞前通過 PRE_OUTPUT
  • 帶退避的重試:失敗的傳遞通過 sendWithRetry() 以指數退避重試
  • 訊息分割:大型訊息被分割成平台適當的區塊(例如 Telegram 的 4096 字元限制)
  • 串流:回應串流到支援串流的通道
  • 連接管理connectAll()disconnectAll() 用於生命週期管理

通知服務

Gateway 整合了一流的通知服務,取代平台上臨時的「通知擁有者」模式。所有通知通過單一 NotificationService 流動。

typescript
interface NotificationService {
  notify(recipient: UserId, notification: Notification): Promise<void>;
  getPreferences(userId: UserId): Promise<NotificationPreference>;
  setPreferences(userId: UserId, prefs: NotificationPreference): Promise<void>;
  getPending(userId: UserId): Promise<Notification[]>;
}

優先順序路由

優先順序行為
CRITICAL繞過靜音時段,立即傳遞到所有已連接的通道
HIGH立即傳遞到偏好通道,離線時排隊
NORMAL傳遞到活躍工作階段,或排隊等下次工作階段開始
LOW排隊,在活躍工作階段期間批次傳遞

通知來源

來源類別預設優先順序
策略違規securityCRITICAL
威脅情報警報securityCRITICAL
技能審核請求approvalHIGH
排程任務失敗systemHIGH
系統健康警告systemHIGH
Webhook 事件觸發infoNORMAL
The Reef 更新可用infoLOW

通知通過 StorageProvider(命名空間:notifications:)持久化,並在重啟後存活。未傳遞的通知在下次 Gateway 啟動或工作階段連接時重試。

傳遞偏好

使用者按通道配置通知偏好:

yaml
notifications:
  preferred_channel: telegram
  quiet_hours:
    start: "22:00"
    end: "07:00"
    timezone: "America/Chicago"
  overrides:
    security: all_channels
    approval: preferred_channel
    info: active_session

排程器整合

Gateway 託管排程器服務,管理:

  • 排程任務迴圈:週期性評估排程任務
  • 觸發喚醒TRIGGER.md 中定義的代理喚醒
  • Webhook HTTP 端點:用於入站事件的 POST /webhooks/:sourceId
  • 協調器隔離:每個排程任務在自己的 OrchestratorFactory 中以隔離的工作階段狀態執行

排程觸發和 webhook 觸發的任務產生具有全新 PUBLIC taint 的背景工作階段。它們不繼承任何現有工作階段的 taint,確保自主任務以乾淨的分類狀態開始。 :::

健康與診斷

triggerfish patrol 指令連接到 Gateway 並執行診斷健康檢查,驗證:

  • Gateway 正在執行且有回應
  • 所有已配置的通道已連接
  • 儲存可存取
  • 排程任務按時執行
  • 沒有未傳遞的重要通知卡在佇列中