リサーチ @full-self-browsing

Concierge.

エージェント対応ウェブアプリケーションのための安全なアクション層。

型付きかつ同意で制御されるアクションで、AI がウェブアプリを操作できる。ブラウザを乗っ取ることなく。

▽0.2.1TypeScript-firstESM only · Node >=22.12MIT
インストール

3つのパッケージ、ひとつのリリースセット

フレームワーク非依存の統合にはコアランタイムを入れ、続けて対応アダプターを追加します。すべてのアダプターが同じ物理コアを解決するよう、まとめてインストールし、まとめてアップグレードしてください。

コアランタイム
$ pnpm add @full-self-browsing/concierge zod
アダプター付き
$ pnpm add @full-self-browsing/concierge@^0.2 \ @full-self-browsing/concierge-react@^0.2 zod

バージョン 0.2.1 はランタイム契約 v2 上のサポート対象の公開プレビューです。ReactSvelte のパッケージルートはサーバー安全で、ランタイムバインディングは /client/client.svelte にあります。エッジデプロイは 0.2 のサポート対象外です。

Concierge である理由

ページ表面ではなく、動詞を公開する

汎用のブラウザ自動化は、ページ構造・セレクター・座標から意図を再構築します。Concierge は協調するアプリケーションが、その瞬間に AI が使ってよい正確な動詞を公開できるようにします。

汎用ブラウザ自動化
Concierge
セレクターや座標をクリックする
アプリケーション定義の動詞を呼ぶ
見えるインターフェースから意図を再構築する
型付きスキーマとライブの利用可否を受け取る
ページ全体の広い権限を引き継ぐ
現在のアクションカタログだけを見る
確認を真偽値として扱う
確認したペイロードと状態スナップショットに同意を結びつける
モデルのコールバックを信じてブラウザを動かす
ディスパッチの前に署名済みで再実行防止されたバッチを検証する

FSB は協調しないサイトを操作します。Concierge は協調するアプリケーション向けのアクション層です。両プロジェクトはエージェント閲覧スタックの異なる部分を扱います。

仕組み

宣言から構造化結果へ

01

アプリケーションは、説明・入力スキーマ・利用可否ルール・効果メタデータ・リダクション方針・ハンドラー付きの名前付きアクションを定義します。

02

Concierge は、アクティブなステージとその利用可能アクションを、インスタンスローカルなリビジョン付きの不変カタログスナップショットに解決します。

03

モデルはそのスナップショットが認めたツールだけを受け取ります。

04

Concierge は実行前に要求された各アクションを再検証し、同意とスケジューリングの規則を適用し、古い呼び出しや衝突する呼び出しを拒否します。

05

アプリケーションブリッジが承認済みのインターフェース操作を行い、構造化された結果を返します。

アプリケーション

アクション定義、ライブ状態、インターフェース操作、認証、サーバー認可。

Concierge

カタログの入場、検証、同意、スケジューリング、重複排除、ディスパッチ、ワークフロー。

モデル統合

ツール提示、モデル呼び出し、ツール相関、結果の受け渡し。

クイックスタート

アクションを宣言し、ひとつのカタログを解決する。

各アクションを名前付き定数として定義し、ステージに結び付け、現在のアプリケーション状態に対して原子的なカタログスナップショットをひとつ解決します。

  • ステージ、利用可否、ツール、リビジョンはまとめて解決される
  • リテラル値 true だけがアクションを認め、それ以外は閉じて失敗する
  • 解決済みカタログは深く凍結され、ランタイムをまたぐ権限にはならない
actions/open-project.ts
import { createBridge, createConcierge, defineAction, offPageResult } from "@full-self-browsing/concierge";
import { z } from "zod";

const projectBridge = createBridge<{
  actions: { openProject(id: string): void };
  snapshot: { activeProject(): string | null };
}>("project-ui");

const openProject = defineAction({
  name: "openProject",
  description: "Open one project in the application preview.",
  schema: z.object({ projectId: z.string().min(1).max(64) }).strict(),
  jsonSchema: {
    type: "object",
    properties: { projectId: { type: "string", minLength: 1, maxLength: 64 } },
    required: ["projectId"],
    additionalProperties: false,
  },
  redact: ({ projectId }) => ({ projectId }),
  effects: { readOnly: false, destructive: false, idempotent: true },
  handler: ({ args, bridge }) => {
    if (bridge === null) {
      return offPageResult("Project opening", "project interface");
    }
    bridge.actions.openProject(args.projectId);
    return { ok: true, message: `Opened project ${args.projectId}.` };
  },
});

const concierge = createConcierge({
  stages: [
    {
      id: "projects",
      match: (context) => context.pathname === "/projects",
      actions: [openProject],
      bridge: projectBridge,
    },
  ],
});

const catalog = concierge.resolveCatalog({ pathname: "/projects" });

// → catalog.stage · catalog.revision · catalog.tools   one snapshot
パッケージ

コアランタイムとフレームワークバインディング

公開パッケージは固定のリリースセットをなし、ランタイム契約 v2 を共有します。

コア@full-self-browsing/concierge

カタログ、ディスパッチ、同意、ワークフロー、テレメトリ、輸送のためのフレームワーク非依存ランタイム。

React@full-self-browsing/concierge-react

React コンテキスト、ブリッジのライフサイクル、および ConciergeActivityOverlay を含む任意のアクティビティ表示。

Svelte@full-self-browsing/concierge-svelte

Svelte コンテキスト、ブリッジのライフサイクル、リアクティブなスナップショット正規化。

Node.js>=22.12.0
Module formatESM only
React · React DOM^18.2.0 || ^19.0.0
Svelte^5.0.0
AI SDK core^6.0.0 || ^7.0.0
Runtime contractv2 throughout 0.2.x
連携

ひとつのインスタンス、複数の入り口

同じ Concierge インスタンスとブリッジ登録を、適切なアダプター経由でマウントします。ゲッターベースの状態は、Concierge が検証または同意のためにスナップショットを取るまで生き続けます。

連携
ランタイム入口
指針
フレームワーク非依存
@full-self-browsing/concierge
コアランタイムを使い、アプリケーションブリッジを直接登録します。
React
/concierge-react/client
コアインスタンスを渡し、ブリッジを登録し、必要ならアクティビティオーバーレイを描画します。
Svelte
/concierge-svelte/client.svelte
Svelte のスナップショット正規化付きでコアインスタンスを渡し、初期化時にブリッジを登録します。
AI SDK 6 & 7
/concierge/ai-sdk
解決済みカタログをモデルツールに変換し、完了した呼び出しを相関させます。
署名付きサーバーブリッジ
/ai-sdk/server · /ai-sdk/browser
カタログダイジェストに結び付いた短命のブラウザバッチを発行・検証・ディスパッチします。

生の onToolCall 値は表示データにすぎません。アプリケーションを動かすことはありません。署名付きブリッジはエンベロープを検証し、再実行キーを消費し、ライブのブラウザカタログと比較したうえで、はじめてコアディスパッチに入ります。

ランタイムの保証

ランタイムが守るもの

Dispatch outcome

completed
nameopenProject
callIdcall_7f2c · index 0
catalogRevisionstage projects · fresh
consentbound · consumed once
dedupesession · response · callId
onDispatchredacted lifecycle
アクション入力は実行直前に再検証され、副作用のあるアクションはキャンセル可能なコミット窓を通ります。
完全に同じ再試行はひとつの Promise を共有し、重複排除窓の中で二度実行できません。アクション・入力・ターン・リビジョンが変わると identity_conflict を返します。
バッチは outputIndex 順に実行され、完了または終端の結果を明示的に返します。
複合アクションはコア所有の子ディスパッチ、クリーンアップ、遅延、境界付き系譜を使います。入れ子は 16 段、ルートワークフローあたり 256 ステップです。
0.10.2 を混ぜたインストールは、ブリッジ登録やディスパッチの前に失敗します。
セキュリティとプライバシー

認証システムではなく、最小権限の境界

セキュリティモデル

Concierge はユーザーを認証せず、クライアントの同意記録はサーバー認可ではありません。保護された効果を行うサーバーは、現在の主体を独自に認証し、現行ポリシーの下で正確なアクションとペイロードを認可し、再実行を拒み、効果を冪等またはトランザクションにする必要があります。

署名付き AI ブリッジは、特定のブラウザバッチを認める短命のサーバー決定を認証します。モデル出力を信頼できるものにはせず、XSS 脆弱性を直さず、クライアント状態をサーバー権限にもしません。

影響の大きい統合を出荷する前に SECURITY.md を読んでください

テレメトリ

マウントされた ReactSvelte ランタイムは、既定で匿名の利用推計を FSB の集計統計パイプラインに送ります。バニラ統合はブラウザ専用の /telemetry 入口でテレメトリを明示的にマウントし、状態とオプトアウトの APIs も提供します。

テレメトリはアクション名、引数、結果、スキーマ、ステージ、ページ URLsDOM 内容、アプリケーション名、アカウント識別子を送りません。ブラウザストレージが使えない場合、ディスパッチに影響せずテレメトリは停止します。

ペイロード、保持、消去については テレメトリのプライバシー契約を読んでください

AI にブラウザを渡さず、行動させる

TypeScript 優先、ESM のみ、MIT ライセンス。@full-self-browsingnpm スコープで公開。