Skip to content

Gateway

GatewayはTriggerfishの中央制御プレーンです — セッション、チャンネル、ツール、 イベント、エージェントプロセスを単一のWebSocketエンドポイントを通じて調整する 長時間実行されるローカルサービスです。Triggerfishで起こるすべてのことは Gatewayを通じて流れます。

アーキテクチャ

Gatewayアーキテクチャ: 左側のチャンネルが中央のGatewayを通じて右側のサービスに接続

Gatewayは設定可能なポート(デフォルト18789)でリッスンし、チャンネルアダプター、 CLIコマンド、コンパニオンアプリ、および内部サービスからの接続を受け付けます。 すべての通信はWebSocket上のJSON-RPCを使用します。

Gatewayサービス

GatewayはWebSocketとHTTPエンドポイントを通じて以下のサービスを提供します:

サービス説明セキュリティ統合
セッション作成、リスト表示、履歴取得、セッション間送信、バックグラウンドタスクの生成セッションごとのtaint追跡
チャンネルメッセージのルーティング、接続管理、失敗した配信のリトライ、大きなメッセージの分割すべての出力の分類チェック
Cron定期タスクのスケジューリングとTRIGGER.mdからのトリガーウェイクアップCronアクションはポリシーhookを通過
WebhookPOST /webhooks/:sourceId経由で外部サービスからのインバウンドイベントを受け付けインバウンドデータは取り込み時に分類
Rippleチャンネル全体のオンライン状態とタイピングインジケーターを追跡機密データは公開されない
設定再起動なしで設定をホットリロードエンタープライズでは管理者のみ
コントロールUIGatewayの健全性と管理のためのWebダッシュボードトークン認証
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が アタッチされている場合、インバウンドWebhookイベント用のPOST /webhooks/:sourceId ルートが利用可能になります。

サーバーインターフェース

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>接続チャンネルごとに1つ。チャンネルごとの独立したtaint。
バックグラウンドbg:<task_id>cronジョブと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
Skill承認リクエストapprovalHIGH
Cronジョブの失敗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はスケジューラーサービスをホストし、以下を管理します:

  • Cronティックループ: スケジュールされたタスクの定期評価
  • トリガーウェイクアップ: TRIGGER.mdで定義されたエージェントウェイクアップ
  • Webhook HTTPエンドポイント: インバウンドイベント用のPOST /webhooks/:sourceId
  • オーケストレーター分離: 各スケジュールタスクは独立したセッション状態を持つ 独自のOrchestratorFactoryで実行

Cronトリガーとwebhookトリガーのタスクは、新鮮なPUBLIC taintでバックグラウンド

セッションを生成します。既存のセッションのtaintを継承しないため、自律タスクは クリーンな分類状態で開始されます。 :::

健全性と診断

triggerfish patrolコマンドはGatewayに接続して診断ヘルスチェックを実行し、以下を 確認します:

  • Gatewayが実行中でレスポンシブ
  • 設定されたすべてのチャンネルが接続済み
  • ストレージがアクセス可能
  • スケジュールされたタスクが時間通りに実行されている
  • キューに未配信のクリティカル通知がスタックしていない