
<p align="center"> <br> <img src="https://raw.githubusercontent.com/notasithlord/peerd/HEAD/docs/store/assets/peerd-wordmark.svg" alt="peerd" width="240" height="48"> <br> <br> </p> [](https://github.com/NotASithLord/peerd/actions/workflows/package-and-release.yml) [](packaging/check-tscheck.ts) [](tests) [](scripts/cdp/run-inbrowser-tests.mjs) [](scripts/firefox/run-runtime-tests.mjs) [](scripts/cdp/run-e2e-verify.mjs) [](docs/security/RED-TEAM-RESULTS.md) [](CONTRIBUTING.md) [](extension/vendor/vendor.lock.json) [](packaging/check-action-pins.ts) [](LICENSE) [](#install) [](SECURITY.md) # 初のWebネイティブAIエージェントハーネス peerdは、ブラウザのプリミティブ(Workers、オリジン、サンドボックス、OPFS、WASM/WASI、WebRTC、WebAuthn、WebExtensions)の上に直接構築された、初の汎用エージェントランタイムです。タブ、サインイン済みセッション、Webアプリ、ローカルコンピュートとともに、ChromeとFirefoxの内部で完全に動作します。 **エージェントプラットフォームがブラウザをハーネスに取り込もうとしている一方で、peerdはハーネスをブラウザに取り込みます。** 実際の推論には、サポートされているホスト型モデルプロバイダー、localhostを使ったローカルモデル、またはローカルWebGPUモデルの予備的サポート(WebNNも注視しています)を選択できます。 peerdアカウント、ホスト型ブラウザ、ツールサーバーへの接続は不要です。現在の ビルドはpeerdに製品テレメトリを送信しません。 [インストール](#install) · [peerd.ai](https://peerd.ai) · [アーキテクチャ](#architecture) · [セキュリティ](https://github.com/notasithlord/peerd/blob/main/SECURITY.md) ## 機能 - **普段使っているブラウザで動作します。** エージェントはタブ、Webアプリ、サインイン済みセッション、ページコンテンツを読み取り、操作できます。 - **再利用可能なサイトクライアントを構築します。** Webアクターはサイトを一度学習し、そのクライアントを後のタスクで再利用できます。 - **ブラウザの境界内でコードを実行します。** スクリプト、封印されたJavaScript Notebook、コンパイル済みWASIツール、ブラウザApps、Linux WebVMにより、エージェントはホストOSにアクセスすることなくローカルコンピューティングを利用できます。 - **別々のアクターに委任します。** 各ページとコンピューティング環境には、その環境にスコープされたツールを持つ独自のキーレスアクターが割り当てられます。 - **有用なコンテキストを保持します。** セッション、メモリ、スキル、ゴール、レビュー、チェックポイントは拡張機能内に保存されます。 - **選択したモデルを使用します。** 利用可能なプロバイダーの一覧は[`registry.js`](https://github.com/notasithlord/peerd/blob/main/extension/peerd-provider/registry.js)で定義されており、BYOKクラウドアダプターやキーレスのローカルオプションが含まれます。 - **ブラウザを直接接続します。** プレビュービルドでは、署名付きID、ブラウザ間ディスカバリ、dwapps、WebRTC経由のエージェント間通信が追加されます。ストアパッケージではこれらは完全に削除されます。 ## なぜブラウザなのか ローカルエージェントはコンピュータ全体にアクセスできます。リモートエージェントは他人の環境に存在します。ブラウザはその代替です。30年以上にわたって強化されてきたセキュリティ境界の内側にあるローカル機能です。 peerdはこれらの境界を利用します。ページ作業は、そのタブや環境専用のツールのみを持つ別々のアクターに委任されます。認証情報、ネットワークルール、確認、監査は拡張機能側に留まります。その多層防御設計は、安全でないコンテンツが最終的にフィルターを通過することを前提としています。 ## ブラウザサポート peerdはChromiumとFirefoxをサポートします。Firefoxではアクターを専用ワーカーで実行し、JavaScriptコンピューティングには可視のNotebookを使用します。Chromeのオフスクリーンドキュメントホストを必要とする機能は、使用前にFirefoxのコントロールとモデルツールから削除されます。Firefoxのプレビュービルドでは、Firefoxにメッシュホストが実装されるまでdwebは省略されます。 AppsとWebVMはChromeで動作します。Appsには周囲のネットワークアクセスがありません。リモートリソース、フェッチ、WebRTC、フォーム、外部ドキュメントへのナビゲーションはブロックされます。外部HTTPおよびHTTPSリンクにはユーザーの確認が必要です。 具体的なブラウザ機能のギャップ、その上流のイシュー、各ガードを削除するために必要なテストは[`docs/BROWSER-COMPATIBILITY.md`](https://github.com/notasithlord/peerd/blob/main/docs/BROWSER-COMPATIBILITY.md)で追跡されています。 現在の動作についてはコードが信頼できる情報源です。まず[`CLAUDE.md`](https://github.com/notasithlord/peerd/blob/main/CLAUDE.md)から始め、次に`extension/`配下の関連モジュールを読んでください。 ## セキュリティモデル peerdはブラウザの分離、ツール公開の最小化、サービスワーカーのポリシーゲート、明示的な外向き通信制御を使用します。メインエージェントは環境作業をキーレスアクターに委任します。ChromeとFirefoxでは、非オーケストレーターのエージェントループは別々の専用ワーカーヒープで実行されます。ブラウザがその境界を証明できない場合、アクターリクエストは実行されず、対象に対して何の作業も行いません。 ネットワークの動作は操作によって異なります。モデル呼び出し、Web読み取り、ランタイムアセットの読み込み、サンドボックストラフィック、プレビューdwebトラフィックは、それぞれ異なるスコープ付きパスとポリシーを使用します。現在の境界と既知の制限については、[`SECURITY.md`](https://github.com/notasithlord/peerd/blob/main/SECURITY.md)と[`脅威モデル`](https://github.com/notasithlord/peerd/blob/main/docs/security/THREAT-MODEL.md)を参照してください。 ## インストール ### ソースからChromeへ 1. リポジトリをクローンします。 2. `chrome://extensions`を開きます。 3. デベロッパーモードを有効にします。 4. **パッケージ化されていない拡張機能を読み込む**を選択し、`extension/`ディレクトリを指定します。 ソース変更後は`chrome://extensions`から拡張機能を再読み込みしてください。 ### ソースからFirefoxへ FirefoxにはFirefox専用のパッケージが必要です。チェックインされているChrome開発用マニフェストを読み込まないでください。`manifests/`配下のチャネルパッチで宣言されている最小バージョン以上のFirefoxを使用してください。この下限は、ブラウザツールが使用するドキュメントバインド型スクリプティングサポートに追従しています。 ```sh bun run package -- --channel=preview --browser=firefox --no-sign ``` `about:debugging#/runtime/this-firefox` を開き、**Load Temporary Add-on** を選択して、`artifacts/peerd-preview-firefox.xpi` を選びます。一時アドオンは Firefox の再起動後に再度読み込む必要があります。ブラウザとチャネルの変換はパッケージングスクリプトで定義されています。 ### リリースパッケージ 最新の成果物については [GitHub Releases](https://github.com/NotASithLord/peerd/releases) を参照してください。ストアビルドとプレビュービルドは異なります。ストアビルドには dweb が含まれません。プレビュービルドには dweb が含まれ、追加の自動化機能が有効になる場合があります。各ブラウザとチャネルについてはパッケージングコードが正式な基準です。 ## 初回実行 1. ブラウザのツールバーから peerd を開きます。 2. ローカルボルトを作成してロックを解除します。パスフレーズによるロック解除は常に利用可能です。パスキーによるロック解除は、ブラウザとデバイスにおける WebAuthn PRF のサポートに依存します。 3. 短いプロファイルのオンボーディングを完了します。 4. 設定を開き、プロバイダーキーを追加するか、サポートされているローカルプロバイダーを選択します。 5. モデルを選択してチャットを開始します。 ボルトの暗号化境界で保護されるのは、ボルトのシークレットと保護されたセキュリティレコードのみです。その他のローカル拡張機能の状態は、セキュリティドキュメントに記載されているストレージルールに従います。 ## アーキテクチャ この拡張機能には 5 つの主要モジュールがあります。各モジュールは `index.js` を通じてパブリック API を公開します。 | モジュール | 役割 | |---|---| | [`peerd-provider`](https://github.com/notasithlord/peerd/blob/main/extension/peerd-provider) | モデルアダプターとレスポンスのフォーマット | | [`peerd-egress`](https://github.com/notasithlord/peerd/blob/main/extension/peerd-egress) | ボルト、ネットワークポリシー、デナイリスト、監査 | | [`peerd-engine`](https://github.com/notasithlord/peerd/blob/main/extension/peerd-engine) | WebVM、Notebook、App、ヘッドレス実行 | | [`peerd-runtime`](https://github.com/notasithlord/peerd/blob/main/extension/peerd-runtime) | エージェントループ、アクター、ツール、セッション、メモリ、権限 | | [`peerd-distributed`](https://github.com/notasithlord/peerd/blob/main/extension/peerd-distributed) | プレビュー専用のピアツーピアネットワークと dwapps | 拡張機能のシャーシは `background/`、`offscreen/`、`sidepanel/`、`engine-tabs/`、`permissions/`、`shared/`、および関連するサポートディレクトリにあります。ホストの配置とコールドワーカーのルールは [`docs/EXTENSION-HOSTS.md`](https://github.com/notasithlord/peerd/blob/main/docs/EXTENSION-HOSTS.md) に記載されています。 ## 開発 ソース拡張機能は ES モジュールを使用したバニラ JavaScript であり、アンパックで読み込むと直接実行されます。開発用のバンドラー、トランスパイラー、ウォッチャー、生成されたランタイムツリーはありません。リリースパッケージングでは、使い捨てのステージングコピー上でのみ Bun を使用し、静的サービスワーカーおよび Chrome オフスクリーンのコールドグラフ内の作成済みモジュールから空白やコメントを除去します。モジュール境界、バインディング名、遅延インポート、およびすべてのベンダー提供バイトは保持されます。読みやすい診断用成果物が有用な場合は、`bun run package -- ...` に `--no-minify` を渡してください。 ```sh bun install bun run gen:dev bun test ./tests bun scripts/cdp/run-inbrowser-tests.mjs bun run typecheck bun run lint bun run e2e:verify bun run preflight ``` テストサーフェスは3つあります: - 純粋なロジック向けのBunテスト。 - 拡張機能とブラウザ統合向けのブラウザ内テスト。これらはChrome上でヘッドレスに、またシャード化されてGecko上でインストール済みのFirefox Storeパッケージに対して実行されます。各レーンは登録されたすべてのテストを実行しますが、一部のテストはライブのサービスワーカーが応答する場合にのみ登録されるため、合計数はわずかに異なります。 - 完全なフロー向けのライブChrome E2Eおよび視覚的検証。 これらに加えて、[`tests/red-team/`](https://github.com/notasithlord/peerd/blob/main/tests/red-team)のレッドチームスイートが、脅威モデルの各敵対者を実際の防御コードに対して駆動し、すべての敵対的プローブがブロックされたかどうかを記録します。そのマトリクスは[`docs/security/RED-TEAM-RESULTS.md`](https://github.com/notasithlord/peerd/blob/main/docs/security/RED-TEAM-RESULTS.md)にあります。 各レーンは自身のカウントを上記のバッジとして公開します。[`badges/`](https://github.com/notasithlord/peerd/blob/main/badges)配下のバッジJSONは、そのレーンを実行したCIジョブによって生成され、その後diffされるため、このページのカウントは常に誰かが入力した数値ではなく、実際に発生した実行からの証拠です。`bun run gen:badge:functional`、`bun run gen:badge:red-team`、`bun run gen:badge:inbrowser`、`bun run gen:badge:gecko`(Firefoxとgeckodriverが必要)、または`bun run gen:badge:e2e`で再生成し、結果をコミットしてください。`bun run check:badges`はブラウザを起動せずにエンドポイントが正しい形式であることを検証します。 UIの変更については、`bun run e2e:verify`を実行し、`scripts/cdp/artifacts/result.json`を確認し、生成されたスクリーンショットを確認してください。 生成されたファイルは手動で編集してはいけません。特に、`extension/manifest.json`と`extension/shared/channel-config.js`はマニフェストおよびパッケージングのソースから生成されます。CIはそれらのドリフトをチェックします。 コードを変更する前に[`CONTRIBUTING.md`](https://github.com/notasithlord/peerd/blob/main/CONTRIBUTING.md)をお読みください。 ## ドキュメント - [`CLAUDE.md`](https://github.com/notasithlord/peerd/blob/main/CLAUDE.md): プロジェクト構造、規約、現在の状況 - [`SECURITY.md`](https://github.com/notasithlord/peerd/blob/main/SECURITY.md): セキュリティポリシーと報告 - [`docs/security/THREAT-MODEL.md`](https://github.com/notasithlord/peerd/blob/main/docs/security/THREAT-MODEL.md): 信頼境界と残存リスク - [`docs/security/LIFECYCLE-CONTRACT.md`](https://github.com/notasithlord/peerd/blob/main/docs/security/LIFECYCLE-CONTRACT.md): 中断時の動作と復旧の制限 - [`docs/security/RED-TEAM-RESULTS.md`](https://github.com/notasithlord/peerd/blob/main/docs/security/RED-TEAM-RESULTS.md): レッドチームのカバレッジ - [`docs/APP-ACTORS.md`](https://github.com/notasithlord/peerd/blob/main/docs/APP-ACTORS.md): マニフェストで定義されたAppアクター、ライブセマンティックアダプター、タブ内コパイロットUX - [`docs/DWAPP-BUNDLE.md`](https://github.com/notasithlord/peerd/blob/main/docs/DWAPP-BUNDLE.md): 圧縮されたdwappトランスポート、デコードされた作業ツリー、バイナリアセット - [`docs/store/`](https://github.com/notasithlord/peerd/blob/main/docs/store): ストアパッケージング、権限、プライバシー、レビュアー向けノート - [`scripts/cdp/states.mjs`](https://github.com/notasithlord/peerd/blob/main/scripts/cdp/states.mjs): E2Eおよび視覚的状態 ## 依存関係とライセンス 出荷される拡張機能にはnpmランタイム依存関係はありません。`package.json`は何も宣言しておらず、パッケージングは`node_modules`のパスをステージングされた成果物に解決することは決してないため、開発ツールのツリーがインストール済みブラウザに到達することはできません。サードパーティのランタイムコードは代わりに`extension/vendor/`配下にベンダリングされています。そのソース、バージョン、ライセンスは隣接する`SOURCE.txt`ファイルに記載されており、ベンダリングされたすべてのバイトは[`extension/vendor/vendor.lock.json`](https://github.com/notasithlord/peerd/blob/main/extension/vendor/vendor.lock.json)でSHA-256によって固定され、`bun run check:vendor`がCIとプリフライトで検証します。 さらに2つのサプライチェーン上の立場が上記の独自のバッジを持ち、どちらも`bun run gen:dev`で再生成され、CIでドリフトチェックされます。すべてのサードパーティGitHub Actionは完全なコミットSHAで実行され、[`check:actions`](https://github.com/notasithlord/peerd/blob/main/packaging/check-action-pins.ts)によってゲートされます。メジャータグは発行者が移動できる可変参照であり、それはこのチェックアウトを保持するジョブ、およびリリースワークフローでは署名シークレットに対して任意のコードを意味するからです。新たに解決された依存関係は、ロックに入る前に[`bunfig.toml`](https://github.com/notasithlord/peerd/blob/main/bunfig.toml)の`minimumReleaseAge`で設定された隔離期間を待ち、インストール時のマルウェアスキャンも併せて行われます。 peerdは[Apache License 2.0](https://github.com/notasithlord/peerd/blob/main/LICENSE)の下でライセンスされています。ベンダリングされたコンポーネントはそれぞれ独自のライセンスを保持します。CheerpXはLeaning Technologiesが提供するプロプライエタリなランタイムであり、peerdのApacheライセンスの対象外です。