組み込みブラウザ
VMark はドキュメントウィンドウの内部に本物の Web ブラウザをホストできます——Web ページが Markdown ドキュメントと並ぶ第一級のタブになります。これは正真正銘のネイティブ webview(macOS の WKWebView)であり、外部の Chrome ウィンドウでも埋め込みフレームでもありません。
実験的機能
組み込みブラウザは初期段階の機能で、このビルドでは macOS 専用です。Windows と Linux のサポートは後日提供されます——それらのプラットフォームでは、以下の設定はまったく表示されません。
ワークスペースレール
実験的な ワークスペースレール を有効にすると、ブラウザページはウィンドウグローバルになります:ウィンドウ内のすべてのワークスペースから到達可能なままで、単一のワークスペースのタブに紐付けられることはありません。
オフにする
ブラウザは macOS ではデフォルトでオンです。新しいブラウザタブはファイルメニュー(Alt + Mod + Shift + B)とコマンドパレットにあります——最初に何かを有効化する必要はありません。
オフにするには、設定 → 詳細設定 → macOS を開き、埋め込みブラウザをオフにします。これにより、開いているブラウザタブもすべて閉じられ、以下で説明する AI 自動化サーフェスも取り下げられます。
トグルのすぐ下に 2 つの AI 姿勢設定があり、ブラウザがオンのときにのみ表示されます。どちらも保守的な初期値で出荷され、ブラウザを有効にしても変わりません:
| 設定 | 初期値 | 意味 |
|---|---|---|
| AI ブラウザセッション | サンドボックス | AI が操作するページには、ログイン済みのセッションを共有するのではなく、分離されたセッションが割り当てられます |
| AI のループバックアクセスを許可 | オフ | AI による localhost / プライベートネットワークアドレスへの移動は拒否されます |
サイトの許可は設定にはありません——それらを所有するウィンドウの、ブラウザサイドバーにあります。
使い方
ブラウザタブはドキュメントと並んでエディタ領域に開きます——サイドバー、タブストリップ、ターミナル、ステータスバーはすべてそのままの位置に留まります。そのコントロールはページの上部に配置されます:macOS では、VMark がタイトルバーを自前で描画するため、ウィンドウのタイトルバーを共有します。システムがタイトルバーを描画する場合(Windows、Linux)は、他のすべてのデスクトップブラウザと同じように、ウィンドウ内のページの上部に配置されます。
| コントロール | 動作 |
|---|---|
| ‹ / › | 戻る/進む。行き先がないときはグレーアウトします |
| ⟳ / ✕ | 再読み込み、または進行中の読み込みを停止します |
| アドレスバー | オムニボックス:URL を入力するとそこへ移動し、それ以外を入力すると検索します |
| ☆ / ★ | このページをブックマークします |
アドレスバーはページを自動的に追跡します:サイトがリダイレクトしたり、リンクで別の場所へ移動したりすると、バーは実際に今いる場所を表示するよう更新されます。
サイドバーはタブに追従する
ブラウザタブがアクティブなとき、サイドバーには閲覧履歴とブックマークが表示されます。ドキュメントに戻ると、ファイルエクスプローラー、アウトライン、ファイル履歴が再び——自動的に——表示されます。同期を保つべき第 2 のモードは存在せず、それぞれの側が最後に開いていたものを記憶しているので、ブラウザタブをちらっと見ても、使っていたファイルツリーを失うことはありません。
履歴はウィンドウごとに管理され、そのセッションの間だけ存在します:ディスクに書き込まれることはありません。(それでも消去ボタンはあります——「終了すると消える」と「今すぐ消せる」は別物です。)再読み込みで重複エントリが追加されることはなく、リダイレクトするサイトは、途中のすべてのホップではなく、あなたが訪れようとしたページを記録します。
ブックマークは永続します。ブックマークした正確な URL の下に保存されます——同じページでも別のセクション(#install と #usage)は 2 つの別々のブックマークになり、VMark が URL のクエリパラメータを勝手に「整理」することはありません。書き換えられた URL では、見ていたものに戻れない可能性があるからです。
ページの周囲でウィンドウはニュートラルになる
VMark のテーマは意図的に色付けされています——Paper は暖かいグレー、Mint と Sepia はさらにそうです。それは書くには心地よいものの、他人の Web ページを囲むには不適切です:色付きのフレームは、その内側にあるすべての色の見え方をずらしてしまい、だからこそどの本物のブラウザも自身のクロームに色を付けません。
そのため、ブラウザタブにフォーカスがあるとき、周囲のウィンドウはプレーンなニュートラル——ライトテーマでは白、ダークテーマでは暗色——に切り替わり、ドキュメントに戻った瞬間に元に戻ります。あなたのテーマは変わりません。変わるのは Web ページを囲むものだけです。
**ターミナルも同じルールに従います。**ブラウザタブの横にターミナルを開いている場合、それはテーマの色のままではなく、対応するニュートラルを採用します。そうすることで、ウィンドウの 2 つの半分が、目に見える継ぎ目で出会うのではなく、互いに調和します。ダークテーマには白ではなく暗色のターミナルが与えられます——ターミナルの色は背景に合わせて調整されており、白を強制するとダークテーマの出力が読みにくくなってしまうからです。
ページがクラッシュした場合
ページの Web コンテンツプロセスが停止すると、そのタブは空白や凍結したビューの代わりに、「このページはクラッシュしました」というオーバーレイと再読み込みボタンを表示します。VMark は一時的なクラッシュに対しては数回自動的に再読み込みします。ページが読み込み時にクラッシュし続ける場合は、自動再読み込みを止めて、あなたが手動で再読み込みするのを待ちます。そのため、再読み込みのループにはまり込むことはありません。
どう作られているか(そしてなぜ設計からしてプライベートなのか)
VMark はプラットフォームの webview を自前で作成し、それをウィンドウのネイティブな子として追加します——アプリフレームワークに webview を要求することはありません。これはプライバシーにとって重要です:フレームワークが作成した webview は、すべてのページに内部メッセージングブリッジを注入し、あらゆるサイトにアプリへのチャネルを渡してしまいます。VMark はそのようなブリッジを持たない新規構築の webview を所有しているため、閲覧されたページは VMark へのチャネルを一切持ちません。ページは厳密に一方向で駆動されます(アプリはページを読み取って操作できますが、ページはアプリに手を伸ばせません)。
セッション(ログイン、Cookie)は、OS の webview 自身のデータストアにプロファイルごとに永続化されるので、各サイトへのログインは一度だけで済みます。VMark 自身は認証情報を一切保存しません。
AI でブラウザを操作する
MCP 経由で接続された AI アシスタントは、ブラウザタブを操作できます:
- 読み取り(Read) — ページの構造化されたアクセシビリティスナップショットを取得します(各インタラクティブ要素または構造要素を、ロール + アクセシブルネームとして、さらに
e5のような安定した ref ハンドルとともに返します)。 - 操作(Act) — ターゲットをクリックまたは入力します。事前の読み取りから得た正確な ref で指定するか、ARIA の ロール + アクセシブルネーム(例:「Learn more」という名前のリンクをクリック)で指定します。ref はすでに許可された操作に対してのみ受け付けられます。あなたの承認が必要なものはロール + 名前を使うので、プロンプトが読みやすい要素を提示できます。クリックは実際にヒットしたことを検証します:ターゲットをスクロールして表示範囲に入れ、視覚的にレンダリングされていることを要求し——折りたたまれたセクション内の重複ボタンはクリックされずにスキップされます——クリック地点をヒットテストするので、オーバーレイに覆われたターゲットはクリックし通されるのではなく「…に覆われている」として報告されます。AI には、単に試したということではなく、実際に何が起きたかが伝えられるので、間違ったものをこっそり操作して成功したと報告することはできません。
- スクロール(Scroll) — 要素を(ref で)表示範囲に入れるか、ピクセル量でスクロールします。操作クラス(クリックと同様に承認ゲート付き)。
- キー入力(Key) — キー押下(
Enter、Escape、Tab、矢印、オプションで Ctrl/Shift/Alt/Meta 付き)を、フォーカスされた要素または ref に送ります——例:フォームを送信する、ダイアログを閉じる。操作クラス。注意:キーとスクロールは合成された DOM イベントなので、実際のハードウェア入力しか信用しないサイトはそれらを無視することがあります。 - クエリ(Query) — アクセシビリティスナップショットでは名前を付けられない構造化された DOM 検出(テーブル、計算値、属性)を、CSS セレクタで行います。読み取りクラス。
- 抽出(Extract) — ページをリーダーモードの Markdown として取得します(タイトル、署名、記事本文、定型部分は除去)。AI が操作するのではなく読みたいページ向けです。サイトプラグインがオリジンごとに抽出を洗練します——組み込みの Wikipedia プラグインは wiki のクロームを名前で除去します——汎用リーダーがフォールバックです。ページはバイトを書き出すだけで、抽出は VMark 内で実行されます。読み取りクラス。
- スタイル(Style) — CSS 操作(ブロッキングオーバーレイの解除、ターゲットのハイライト)を、インラインスタイルの設定、クラスの切り替え、または
<style>ブロックの注入(セレクタ単位ではなくページ全体)で行います。操作クラスで、承認は正確なスタイリングに紐付きます——許可した後で別の CSS に差し替えることはできません。 - JS 実行(Execute JS) — 脱出ハッチ:構造化された動詞では表現できないもののためにスクリプトを実行します。これは分離されたコンテンツワールド(DOM + CSS、ページ自身の JavaScript には決して触れない)で実行され、呼び出しごとに承認され(決して記憶されません——これに対する「このサイトで許可」はありません)、その結果は信用できないものとして扱われます。承認プロンプトは正確なスクリプトを提示し、そのスクリプトこそが実行されます——AI があるスクリプトを承認させておいて別のものを実行させることはできません。クエリ/スタイルを優先し、それらでは不十分なときにのみこれに手を伸ばしてください。
- セッションの保存/読み込み(Session save / load) — タブの現在のセッションをハンドル(あなたが承認する名前)の下に保存し、後で復元することで、フローが最初からサインイン済みの状態で始まるようにします——AI があなたの Cookie やトークンを見ることは一切ありません。値は OS キーチェーン(保存時に暗号化)に保存され、AI が受け取るのはハンドルと件数サマリーだけです。保存と読み込みはどちらも呼び出しごとに承認され、あるハンドルへの承認を別のハンドルに流用することはできません。復元は、保存元と同じオリジンのページにのみ適用されます。これは参照による認証情報です:AI はセッションに名前を付け、VMark が秘密を保持します。
- コンソール(Console) — ページのキャプチャされた
console.*出力(log/warn/error…)を、さらにキャッチされなかったエラーと未処理の Promise リジェクションも読み取ります——これはページ自身のスクリプトが壊れたときに発する信号で、通常のconsoleログでは決して見えません——そのため AI は操作しているページをデバッグできます。読み取り専用で、出力は信用できないページデータとして扱われます。これは設計からしてプライベートという保証を守るために作られています:キャプチャはページ自身の DOM に書き込み、VMark はそこから読み取るので、アプリへ戻るメッセージングチャネルは一切開かれません。
セッションの保存/読み込み——スコープ
保存されたセッションは localStorage と Cookie をカバーし、どちらも保存時にページがコミットされていたオリジンにスコープされます。Cookie はネイティブの Cookie ストアを通じて読み取られ再生され、双方向でドメインにスコープされます——保存があなたの Cookie ジャー全体をコピーすることはなく、復元が無関係なサイトの下に Cookie を仕込むこともありません。
- 開く(Open) — AI 所有のタブを作成し、HTTP(S) の URL を読み込みます。
- 移動(Navigate) — AI 所有のタブをナビゲートし、そのナビゲーションチケットを待ちます。読み込まれたページが、要求されたコンテンツではなくゲート——ログインウォール、同意インタースティシャル、人間確認チャレンジ(reCAPTCHA/Turnstile)、レート制限通知——として読み取れる場合、結果はそう伝え、AI は回避しようとするのではなくあなたを巻き込むよう指示されます。検出は精度優先です:「$429」に言及する価格や「Cloudflare」と書かれたフッターでは作動しません。
- 待機(Wait) — 別の読み込みを開始せずに、特定のナビゲーションチケットを待ちます。
- 条件待機(Wait for) — 条件が満たされる(ref またはロール + 名前による要素、表示されているテキストの一部、あるいはタブの URL が特定の部分文字列を含むこと——最後のものはクリックが引き起こしたナビゲーションが着地したことを確認します)か、タイムアウトが経過するまでポーリングし、一致したかどうかを報告します。マルチステップのフローを——推測するのではなく、操作し、結果を待ち、読み取るという形で——決定論的にします。
- スクリーンショット(Screenshot) — ページの現在のレンダリングを JPEG 画像として取得するので、AI はアクセシビリティスナップショットが名前を付けないレイアウトやレンダリング状態を見ることができます。読み取りと同様に非破壊的です:AI 所有のタブでは許可され、人間のタブではあなたがアタッチしている間だけ許可されます。
- ワークフローの実行(Run a workflow) — 保存された短いステップのシーケンス(クリック/入力/移動/抽出。小さなテキスト文法で記述し、
sourceとして渡します)を、1 つの非同期実行として再生します:即座に実行 ID を返し、あなたがそのステータスをポーリングします。マルチステップの実行は単一のリクエストより長生きするからです。その中のすべてのステップは、手で発行したアクションとまったく同じように個別に承認ゲートされます——ワークフローはプロンプトを回避する手段ではありません——そして AI が決定論的に実行できないステップ(自由記述の「ゴール」、「確認」)は、手で処理してもらうために実行を一時停止します。再実行はすでに成功したステップをスキップするので、一時停止後の再実行が二重送信することはありません。実行は上限があり、タブごとに一度に 1 つで、キャンセルできます——キャンセルは常に許可され、あなた自身がブラウザを引き継ぐと実行は止まります。 - ワークフローの記録(Record a workflow) — 文法を手で書く代わりに、ワークフローを 記録 できます:あなたの承認のもとで(毎回あらためて確認され——記録は決して恒久的な権限ではありません)、VMark はあなたがタブ上で行う クリックとフィールドの編集 をキャプチャし、すぐに実行できるワークフローテキストを返します。これは 設計上、値を含みません:あなたが入力した内容は保存されません——各フィールドは再生時にあなたが入力する名前付きの
{input}になり、パスワードフィールドは手動のconfirm:ステップになり、URL はオリジンとパスだけに切り詰められます。記録されるのは、あなたが触れたコントロールがどれかであって、あなたが入力した内容ではありません。
AI ブラウザの姿勢は 設定 → 詳細設定 → 埋め込みブラウザ で構成します:
- サンドボックス(推奨)は、共有された非永続の AI webview ストアを 1 つ使います。他のサンドボックスタブとは Cookie を共有しますが、人間のタブとは共有しません。
- 共有プロファイルは人間の webview ストアを使い、そのオリジンに一致する
navigateの許可がない限り、各 AI ナビゲーションの前に移動先の承認を求めます。
AI が作成したタブは一時的で、再起動後に復元されません。その URL、モード、タイトル、世代、読み込み状態は session.get_state に現れます。認証情報は MCP レスポンスから伏せられます。
アクションは承認ゲート付きです:あなたが許可していない操作は実行されません——AI には承認が必要だと伝えられ、待機します。ファイルのアップロードは AI には決して許可されません(AI が選んだファイルアップロードはデータ流出の経路になり得ます)。それらは厳密に人間主導のままです。
アクションを承認する
AI が操作を要求すると、VMark はプロンプトを表示してページを一時停止します。ちょうど 3 つのこと——サイト、操作、要素(そのロールとアクセシブルネーム、例:button "Publish")——を伝えます:
- 1 回だけ許可 — その要素に対する、そのページ上での、まさにその 1 つの操作だけを許可します。即座に消費され、恒久的な許可にはなりません。
- このサイトで許可 — AI はその操作をそのサイトで、二度と確認せずに実行できます。他の操作や他のサイトに広がることはありません。
- 拒否 — 何も起きません。
Escapeを押しても、単にEnterを押しても拒否になります:プロンプトは意図的に拒否寄りに偏っています。
プロンプトが提示するのは操作の説明であって、ページの絵ではありません——そしてそれは意図的です。Web ページは自身のピクセルを制御するので、悪意あるページは「すべて削除」ボタンを「Publish」に見えるようスタイリングできてしまいます。VMark が提示するのは、セキュリティゲートが実際に強制するもの、すなわちページ自身の自己申告ではなく、ブラウザエンジンから取得したものです。
許可はページがナビゲートすると失効もします。プロンプトは特定のページ上の操作を記述します。あなたが決めている間にページが変わった場合、そのリクエストは、代わりに読み込まれたものに適用されるのではなく破棄されます。消費されていない「1 回だけ許可」も同じように破棄されます。
これはページ内のナビゲーションも含みます。ほとんどの最新サイトは、新しいページを一切読み込むことなくビューを移動します——アドレスは変わり、コンテンツは書き換えられますが、サイトを離れることはありません。ここではそれが重要です。なぜなら、あなたが承認した button "Publish" がその名前の下のボタンではなくなっているかもしれないのに、サイトとオリジンは同じままだからです。そこで VMark は、ページ内ナビゲーションを他のあらゆるものとまったく同じように扱います:許可は、単にページとともにではなく、それが付与されたビューとともに失効します。
とはいえ、重みを担うのは記述子そのものです。サイトはナビゲートすることなく、いつでも自身のコンテンツを書き換えることができ、どのブラウザエンジンもそれを報告しません。ですから「1 回だけ許可」が承認するのは、まさに 1 つの操作、そのロールとアクセシブルネームで識別される 1 つの要素、1 つのサイト上での操作だけであり——そして即座に消費されます。よく考えるべきは「このサイトで許可」のほうです:それはそのサイトでのその操作に対する恒久的な許可であり、それを付与するサイトは、あなたがそれを信頼するサイトなのです。
許可の確認と取り消し
設定 → 詳細設定 → サイトの許可に、あなたが許可したすべてのサイトと、それができることが一覧表示されます。取り消すとただちに撤回されます——そのサイトでの次の AI アクションは再び確認を求めます。
サイトの許可はメモリ上にのみ保持されます:決してディスクに書き込まれず、VMark を終了すると失効します。AI が再起動をまたいでサイトをクリックできる能力を保持し続けることは、見た目以上に大きな約束なので、VMark はそれをこっそり行いません。
AI が人間の作成したタブを対象にすると、VMark はまず、そのタブに AI アクセスをアタッチするかどうかを尋ねます。アタッチは現在のナビゲーション世代に紐付けられます。1 回だけ許可は、1 回の読み取りまたはアクションの成功後に消費されます。次のナビゲーションまで許可は、次のフルまたはページ内ナビゲーション、閉じる、無効化、または再起動で期限切れになります。
AI ナビゲーションは、ループバック、プライベート LAN、リンクローカル、メタデータ、不正な形式、およびサポートされていないスキームのターゲットを、デフォルトで拒否します。DNS リバインディングは依然として WebKit が所有する制限であり、VMark はそれを排除するとは主張しません。
共同運転:AI がブラウザを操作するのをターミナルから見守る
ブラウザはモードではなくペインです。そのおかげで、ある特定のワークフローが可能になります:ブラウザタブの横にターミナル(`Ctrl + ``)を開き、その中で AI エージェントを実行し、エージェントが作業するにつれてページが反応するのを見守ります。
ターミナルとブラウザは並んで配置されます——ブラウザは覆われるのではなく、場所を空けるためにリサイズします。そのため、エージェントがページを操作している間ずっとページが見え、エージェントが取るすべてのアクションは依然としてあなたの目の前を通らなければなりません(上記のアクションを承認するを参照)。
これが VMark における AI ブラウザ利用の意図された形です:エージェントが提案し、ページが見え、あなたが承認する。それは、あなたが見られないウィンドウの中でエージェントが作業することではありません。
**制御を取り戻すのはワンジェスチャーです。AI のワークフロー実行がタブを操作している間、そのクロームには「AIが操作中 — クリックして操作を引き継ぐ」**というインジケーターが表示されます。それをクリックする——あるいは単にあなた自身がページやそのアドレスバーを操作する——と、ただちにタブを取り戻し、実行を止めます。エージェントのターミナルで停止ボタンを探す必要はありません。ブラウザに触れることが停止ボタンです。
ページの読み込みに失敗したとき
オフラインのネットワーク、不正なホスト名、拒否された証明書、あるいは拒否された接続は、いずれもブラウザペインに何が問題だったかを示すメッセージと、再試行ボタンを表示します。以前のビルドは代わりに空白のペインを表示していて、それは単に遅いだけのページと見分けがつきませんでした。
現在の制限
- このビルドでは macOS のみ。
- JavaScript の
confirm()/prompt()ダイアログは今のところ抑制されます(alert()のみが表示されます)。ポップアップ(window.open)は新しいタブとして開かれるのではなくブロックされます。 - ダウンロード、印刷、リクエストごとのネットワークポリシーはまだ実装されていません。
これらは段階的に埋められています。上記のページは、今日動作するものを説明しています。