solid-imager にプラグインシステムを導入する。サーバーサイドの拡張ポイント(job handler / イベントフック / サービス差し替え / storage・import provider)と、プラグイン独自の oRPC API ルート公開を可能にする。
plugins/<id>/ # プラグイン置き場(デフォルト、設定で変更可)
plugin.json # マニフェスト: id, version, entry, capabilities
index.ts # definePlugin({...}) を default export
packages/core/src/domain/plugins/schemas.ts # マニフェスト/寄稿の Zod スキーマ (SDD)
packages/plugin-sdk/ # 新パッケージ(依存は core + @orpc/contract 型のみ)
apps/server/src/infrastructure/plugins/ # PluginManager / Context / Registry
概要
solid-imager にプラグインシステムを導入する。サーバーサイドの拡張ポイント(job handler / イベントフック / サービス差し替え / storage・import provider)と、プラグイン独自の oRPC API ルート公開を可能にする。
方針(決定済み)
capabilities宣言は将来用にスキーマだけ確保)現状の継ぎ目(seam)調査結果
processJobが string の if/else 鎖 (apps/server/src/infrastructure/services/job-dispatch-service.ts:36-79)。Job.typeは自由文字列ServiceRegistryは手書きの register/get 17スロット +bootstrap.tsが composition rootMediaSourceDriverIF あり、factory が switch (infrastructure/storage/factory.ts:21-31)。s3/sftp宣言のみIAiClient単一スロット (core/domain/interfaces/ai-client.ts)RealtimeEventBusの subscribe は完全オープンMediaProcessingService.registerAndProcess(application ポート) に集約appContract/appRouterは静的オブジェクト (contract/index.ts:45-64)設計
パッケージ構成
プラグインが寄稿できるもの(
definePluginのフィールド)jobHandlers{ [jobType]: handler }+ プール種別hooksonMediaRegistered/onImportCompleted/onJobEvent等RealtimeEventBussubscribe +DeferredActions拡張servicesIAiClient/IImageProcessor等の置き換えsourceDriversMediaSourceDriver実装(s3/sftp 等)importersregisterAndProcessへ委譲contract+routerocで定義)plugins.<pluginId>.*名前空間へ合成起動シーケンス
bootstrap.tsで設定(plugins.dir)からディレクトリをスキャンimport()でロード →activate(ctx)を呼ぶcontract寄稿を集約し、appContractとマージしてからimplement()→app-router.tsは静的部分 + プラグイン部分の合成に変更globalThis保持で HMR 耐性(既存パターン踏襲)プラグインに渡す
PluginContext(ファサード)logger(ILogger)config(plugins.<id>.*名前空間のみ)jobs.enqueueevents.publish(名前空間付き)storage(下記 KV テーブル)services(上級者用の生アクセス、ローカル信頼なので許可)DB(plugins ドメイン追加)
pluginsテーブル: UUID v4, id 一意, manifest jsonb, enabled, config jsonbplugin_storageテーブル: plugin_id + key の KV(プラグインごとのスキーマ変更を不要にする)実装ステップ
service-registry.tsトークンベース汎用化(既存型付き getter はラッパー維持)packages/core/src/domain/plugins/にマニフェストスキーマ、packages/plugin-sdk新規作成PluginManager+PluginContext+ bootstrap 組み込み + 設定スキーマapp-router.tsの動的合成対応 + OpenAPI 反映bun run check/bun run test割り切り・留意事項
AppContract型に含まれないため、Tauri/CLI の型付きクライアントからは直接呼べない(プラグイン SDK が独自の contract 型を輸出する形)。ローカル用途なら許容。