typressAn editorial workshop.

プラグイン

プラグインも .tpkg 形式で配布されます。テーマと違うのは capabilities というメタ情報で、プラグインが要求する権限がインストール時に明示されることです。

capabilities

プラグインは manifest.json で要求する capability を宣言します。host はその capability に対応するブリッジオブジェクトのみを Cap'n Web 経由で渡します。宣言しなかった操作はブリッジに到達せず、そもそも存在しません。

  • posts:read / posts:write — 投稿の読み書き
  • hooks:register — typed hook イベントの購読
  • blocks:register — カスタムブロックの登録 (v1.1)
  • settings:read:own / settings:write:own — プラグイン名前空間の設定
  • http:fetch:allowlist — 指定ホストへの egress (manifest 内で allowlist 必須)

信頼済みキーのスコープ (ADR-002)

信頼済みキーには「この鍵が署名できるプラグイン id」「この鍵が許可できる capability」のスコープを設定できます。空配列だと全許可(後方互換)、明示するとそのキーは指定の範囲しか署名できません。1 つの鍵が漏洩しても、別 id のプラグインや別 capability への悪用が即座にはできない構造です。

実行モデル (ADR-001)

プラグインは host と同じプロセスではなく、Bun.spawn で別プロセスとして起動されます。OOM・crash・無限ループは子プロセス側で完結し、host は生き続けます。子は init 5 秒のタイムアウトの後、3 回連続で start に失敗すると自動的に enabled=0 にフリップされます (auto-quarantine)。境界の詳細はセキュリティを参照。

サンプル: examples/plugin-greeter

posts:read / posts:write を要求して、初回起動時にだけ welcome 投稿を 1 つ作成する idempotent なプラグインのリファレンス実装です。

bun tools/tpkg/src/main.ts pack examples/plugin-greeter
bun tools/tpkg/src/main.ts sign \
  examples/plugin-greeter/com.typress.greeter-0.1.0.tpkg \
  --key dev