メインコンテンツまでスキップ

Channelシステム概要

ChannelシステムはElftiaのマルチプラットフォーム向けメッセージ受信レイヤーです。Discord、Telegram、Slackなど外部プラットフォームからのメッセージをAgentの処理パイプラインへルーティングし、返信を元のプラットフォームへ送り返す役割を担います。

アーキテクチャ概要

graph TB
subgraph External Platforms
D[Discord]
T[Telegram]
S[Slack]
O[Other Platforms...]
end

subgraph Channel Plugin Layer
PL[ChannelPluginLoader<br/>Plugin Discovery & Loading]
PR[ChannelPluginRegistry<br/>Instance Management & Event Dispatch]
end

subgraph Message Pipeline
MR[ChannelMessageRouter<br/>Security Pipeline + Trigger Matching]
end

subgraph Security Pipeline
RL[RateLimiter]
IS[InputSanitizer]
PG[PromptGuardian]
UP[UserPermissionService]
CG[ChannelPermissionGate]
end

subgraph Agent Layer
MB[ChannelMagiBridge<br/>Message Format Conversion]
MS[MagiService<br/>Agent Processing]
end

D & T & S & O --> PR
PL --> PR
PR -->|message event| MR
MR --> RL --> IS --> PG --> UP --> CG
MR -->|routeToAgent event| MB
MB --> MS
MS -->|response| MB
MB -->|sendResponse| MR
MR -->|sendMessage| PR
PR --> D & T & S & O

主要ファイル一覧

ファイルパス責務
ChannelPluginLoaderdesktop/app/main/services/capabilities/integrations/channel/ChannelPluginLoader.tsプラグインの探索・検証・ロード(2ディレクトリ対応)
ChannelPluginRegistrydesktop/app/main/services/capabilities/integrations/channel/ChannelPluginRegistry.tsプラグインファクトリとChannelインスタンスのライフサイクル管理
ChannelMessageRouterdesktop/app/main/services/capabilities/integrations/channel/ChannelMessageRouter.tsセキュリティパイプライン、トリガーマッチング、メッセージバッファリング、レスポンス分割
ChannelMagiBridgedesktop/app/main/services/agent-core/magi/ChannelMagiBridge.tsChannelメッセージ → MagiIncomingMessage への変換
ChannelMarketplaceServicedesktop/app/main/services/capabilities/integrations/channel/ChannelMarketplaceService.tsCDNマニフェスト取得、プラグインのダウンロードとインストール
ChannelPluginRouterdesktop/app/main/services/routers/ChannelPluginRouter.tsIPCルーティング(フロントエンド ↔ バックエンド)
channel-sdkpackages/channel-sdk/src/プラグイン開発SDK(型定義・インターフェース)
channel-typesdesktop/app/shared/contracts/channel-types.tsChannel統一型定義
channel-sdk (re-export)desktop/app/shared/contracts/channel-sdk.tsSDK型の再エクスポート + ユーティリティ関数のインライン定義
security-typesdesktop/app/shared/contracts/security-types.tsユーザーロールと権限の型定義
RateLimiterdesktop/app/main/services/platform/security/RateLimiter.tsスライディングウィンドウ方式のレート制限
InputSanitizerdesktop/app/main/services/platform/security/InputSanitizer.ts不可視文字の除去
PromptGuardiandesktop/app/main/services/platform/security/PromptGuardian.tsAIによるプロンプトインジェクション検出
UserPermissionServicedesktop/app/main/services/platform/security/UserPermissionService.tsロールベースのアクセス制御
ChannelPermissionGatedesktop/app/main/services/platform/security/ChannelPermissionGate.ts機密操作の確認メカニズム

プラグインライフサイクル

stateDiagram-v2
[*] --> Discovered: ChannelPluginLoader.discover()
Discovered --> Registered: ChannelPluginRegistry.registerPlugin()
Registered --> InstanceCreated: createInstance(id, config)
InstanceCreated --> Connecting: connectInstance(id)
Connecting --> Connected: plugin.connect() success
Connecting --> Error: plugin.connect() failure
Connected --> Disconnected: disconnectInstance(id)
Error --> Connecting: Retry connection
Disconnected --> Connecting: Reconnect
InstanceCreated --> Removed: removeInstance(id)
Disconnected --> Removed: removeInstance(id)
Connected --> Removed: removeInstance(id)
Removed --> [*]

起動フロー

  1. ChannelPluginLoader が2つのディレクトリ(バンドル済み + Marketplace)をスキャンし、すべての elftia-channel.json マニフェストを探索する
  2. 検出された各プラグインに対して loader.load() を呼び出し、モジュールをロードしてファクトリ関数を取得する
  3. registry.registerPlugin(manifest, factory, dir) を呼び出してRegistryに登録する
  4. データベースから保存済みのChannelインスタンス設定を読み込む
  5. 各インスタンスに対して registry.createInstance(id, config) を呼び出す
  6. enabled && autoConnect のインスタンスに対して registry.connectAll() を呼び出す
  7. ChannelMagiBridge.start()routeToAgent イベントのリッスンを開始する

接続管理

  • connectInstance(id)plugin.connect(credentials, options) を呼び出す。状態遷移: disconnected → connecting → connected | error
  • disconnectInstance(id)plugin.disconnect() を呼び出す。状態遷移: connected → disconnected
  • connectAll() — フォールトトレランスのため Promise.allSettled を使用し、すべての enabled インスタンスを並行接続する
  • disconnectAll() — 接続中のすべてのインスタンスを並行切断する

IPCチャンネル

フロントエンドの操作はすべて ChannelPluginRouter のIPCチャンネルを通じて実装されています。

IPCチャンネル方向説明
channelPlugin:listInstancesrenderer → mainすべてのChannelインスタンスの一覧を取得する
channelPlugin:createInstancerenderer → main新しいインスタンスを作成する(認証情報は暗号化して保存)
channelPlugin:updateInstancerenderer → mainインスタンス設定を更新する
channelPlugin:deleteInstancerenderer → mainインスタンスと関連ストレージを削除する
channelPlugin:connectrenderer → main指定したインスタンスに接続する
channelPlugin:disconnectrenderer → main指定したインスタンスを切断する
channelPlugin:testConnectionrenderer → main認証情報の有効性を確認する
channelPlugin:getMarketplacerenderer → mainMarketplaceのプラグインリストを取得する
channelPlugin:downloadPluginrenderer → mainCDNからプラグインをダウンロード・インストールする
channelPlugin:removePluginrenderer → mainプラグインをアンインストールする
channelPlugin:updateTriggerrenderer → mainトリガールールを更新する
channelPlugin:statusChangemain → rendererインスタンスのステータス変更通知
channelPlugin:downloadProgressmain → rendererプラグインダウンロードの進捗通知

データ永続化

Channelインスタンス

インスタンスの設定は magi_channels テーブルに保存され、ChannelPluginRouterchannelsUpsert / channelsUpdate / channelsDelete 操作で管理されます。

プラグインのK-Vストレージ

各プラグインインスタンスは、プラットフォーム固有の状態データのために独立したキーバリューストレージ(ChannelStorageDb インターフェース)を持ちます。内部実装はSQLiteテーブルにインメモリキャッシュレイヤーを組み合わせたものです。

メッセージアクティビティログ

送受信メッセージはJSONL形式でファイルシステムに記録されます。

{channelDataDir}/{channelId}/conversations/{chatDir}/{YYYY-MM-DD}.jsonl

書き込みにはバッファリングメカニズム(2秒ごとにフラッシュ)を使用し、ディスクI/Oを抑えています。

次のステップ