ウェブアクセス
ドキュメント作成中
一部の内容はまだ不完全な場合があります。
ThinkTerm のマルチプレクサは、自分の端末をブラウザへ渡せます。手元のスマートフォンや、ThinkTerm の入っていないマシンから開くのは、ThinkTerm の入っているマシンですでに動いているセッションです。同じ Space、Project、Thread であって、その複製ではありません。
あなたが開くまで、何も待ち受けません。
有効にする
方法は 3 つあり、いずれも GUI 内蔵のマルチプレクサではなくマルチプレクササーバーを相手にします。
設定 › Web— スイッチ、受け付けているアドレス、これまでに渡したリンクの一覧。thinkterm cli web-server on— シェルからの同じ操作。--bind-addressで待ち受け先を選び、statusはどこで受け付けているかを報告し、offはポートを閉じてそこにいるブラウザを切ります。- 設定ファイルの
web_serversエントリ — サーバーの起動時に読まれるので、動くたびにポートが開きます。
前の 2 つは動作中のサーバーを変えるもので、効力はそのサーバーと同じだけ続きます。永続する形は設定エントリのほうです。設定を再読み込みしても、ウェブのポートが開いたり閉じたりすることはありません。
渡すものがあるためには、ローカル端末がバックグラウンドのセッションサーバーで動いている必要があります — その設定は リモート にあり、新しくインストールした場合は最初から有効です。それがない場合、設定 › Web は押しても何も起きないスイッチを見せる代わりに、そのことを伝えます。接続しているのがリモートドメインだけなら、その節が話しているのはそちらのマシンのポートで、この機械のものではありません。
リンクそのものが資格情報です
ブラウザはトークンによって入室し、そのトークンは URL の形で手渡されます。
thinkterm cli web-token mint --label phone --ttl 12hその URL を開いた人は、そのマシンであなたと同じものを持ちます。あなたの資格で動くシェルと、すべてのペインのスクロールバックです。パスワードで守られたページではなく、ssh の秘密鍵と同じ扱いをしてください。とりわけ、秘密鍵を貼らない場所には貼らないことです。
--ttlは30m、12h、7d、または秒数を取ります。指定しなければ、失効させるまで有効です。設定からコピーしたリンクは既定で 8 時間後に期限切れになり、選び直せば失効させるまでまでのばせます。web-token listは、サーバーが知っているトークンと、それぞれに何台のブラウザがつながっているかを示します。web-token revoke <id>、あるいは--allは、接続中のブラウザも含めて即座に切ります。--url-onlyは URL だけを出力します。スクリプト向けです。
接続したブラウザは、発行時に付けた名前で thinkterm cli list-clients に現れます。
トークンは URL の # より後ろの部分に入っています。ブラウザはこの部分をサーバーへ送ることも、Referer に載せることもありません。ページはトークンをそのブラウザタブ専用のセッションストレージへ移し、アドレスバーをトークンなしの形に書き換えるので、うっかりブックマークしたり、共有したり、スクリーンショットに写したりすることがありません。同じタブで再読み込みすればそのまま使えますが、新しいタブやアドレスだけで開いた場合はリンクがもう一度必要で、ページがそう伝えます。
そのポートに誰が届くか
既定では 127.0.0.1:8088 を待ち受けます — それが動いているマシンだけが届き、ほかは届きません。
他のデバイスから接続できる は、そのマシンが持つすべてのアドレスへ結び直します。信頼できるネットワークでだけオンにしてください。ブラウザが WebGPU を出すのはセキュアコンテキストに限られ、http://localhost はそれに当たりますが、ほかのホストへの素の http:// は当たりません。そのためループバック以外で待ち受けるには TLS が要り、自前の証明書がなければ ThinkTerm がマシンのホスト名と各アドレスを書いた自己署名証明書を作ります。ブラウザはその証明書について一度警告し、それからページを描きます。警告を受け入れる前に、ブラウザに表示される証明書の SHA-256 指紋を、設定 › Web に表示されるもの、または web-token mint の完全な出力に印字されるものと照らし合わせてください — --url-only はこれを出しません。一致しなければそこで止めてください。既定で有効な require_tls_off_loopback が、ループバック以外を平文で提供することを拒む仕組みです — そのように出したページは、そもそも WebGPU がなく何も表示できません。
同じネットワークや tailnet のスマートフォンには、設定 › Web の QR コードでリンクを渡すのが手早い方法です。インターネット越しの場合は、ポートを公開するのではなく ssh -L でループバックのポートを転送してください。
リバースプロキシの後ろで
リスナーは、自分自身のアドレスから来たページしか受け付けません。それ以外の名前で届いたページ — たとえばリバースプロキシ越しの https://terminal.example.com — は allowed_origins に載せておかないと接続を拒まれます。origin を 1 つでも載せるとこの既定は置き換わり、web-token mint が出力するリンクも載せた origin を指すようになります。
設定 › Web
| 行 | 働き |
|---|---|
ブラウザからのアクセスを許可 | セッションサーバーのポートを開閉します |
他のデバイスから接続できる | ループバックだけでなく、自前の証明書ですべてのアドレスを待ち受けます |
アクセスリンク › リンクをコピー | リンクを発行してコピーします |
リンクの有効期限 | 次にコピーするリンクの有効期間:1 時間、8 時間(既定)、1 日、7 日、失効させるまで |
スマートフォンで読み取る › コードを表示 | リンクを発行して QR コードで表示します |
発行済みのリンク | 有効なリンクすべて。それぞれに 失効 ボタンがあります |
すべてのリンク › すべて失効 | すべてのブラウザを一度に切ります |
発行済みの各リンクには、発行時に付けた名前、なければ最後に使ったデバイス、まだ誰も使っていなければ 未使用 が表示されます。その下に、いつ期限が切れるかと、何台のブラウザがそのリンクで接続しているかが出ます。失効 はそのリンク 1 本だけを終わらせ、それを使っているブラウザを切ります。ほかのリンクはそのまま使えます。
web_servers エントリ
web_servers の各エントリが 1 つのポートで、サーバーの起動時に読まれます。
config.web_servers = {
{
bind_address = '127.0.0.1:8088',
token_file = wezterm.home_dir .. '/.local/share/thinkterm/web-tokens.json',
},
}| フィールド | 既定 | 意味 |
|---|---|---|
bind_address | 127.0.0.1:8088 | 待ち受けるアドレスとポート |
pem_private_key | 未設定 | PEM の秘密鍵。pem_cert とあわせて設定すると、ポートは https と wss で提供します |
pem_cert | 未設定 | PEM の証明書 |
pem_ca | 未設定 | PEM の CA チェーン |
static_dir | インストールされたプログラムの隣 | ページのファイルの場所 |
token_file | 未設定 | 発行したトークンをダイジェストとして保存する場所 |
allowed_origins | リスナー自身のアドレス | 接続を開いてよい origin |
require_tls_off_loopback | true | ループバック以外のアドレスで TLS がなければ起動を拒みます |
token_file は見た目以上に重要です。 未設定だと、トークンはサーバーのメモリの中にしかありません。サーバーが再起動すると — マシンの再起動や、セッションを引き継げない更新のあとなど — すべてのリンクが使えなくなり、発行し直す必要があります。設定しておけば、リンクは再起動を越えて残ります。ファイルにはダイジェストだけが入り、トークンそのものは入らないので、その写しを手にしても誰も入れません。
static_dir は、インストール済みのもの以外のページ、たとえば開発ビルドを動かすためのものです。環境変数 THINKTERM_WEB_STATIC_DIR でも設定を変えずに同じことができ、両方あれば static_dir が優先されます。
ページにできること
ブラウザは同じワークスペースを描きます。Space / Project / Thread のツリー、タブ列、分割ペイン、検索パレット、そして右側のパネルです。Thread とペインの作成と終了もできます。
右側のパネルには、スニペット、Agents、そしてインストール済みのプラグインのパネルが並びます。スニペットとプラグインは、ブラウザが動いているマシンではなく、ページを提供したマシンのものです。あるサーバーに向けたブラウザに見えるのは、そのサーバーのスニペットとプラグインです。「実行」や「ペースト」は、押した時点でフォーカスのあったペインに届きます。Agents パネルは既定でオフで、タブ列の右端のボタンでオンにします。
Kitty グラフィックスプロトコルで送られた画像は、アニメーションも含めてページに描かれます。iTerm2 プロトコルで送られた PNG や JPEG の画像はまだ描かれません。
サイドバー
サイドバーはデスクトップと同じく、一度に 1 つの Space を表示します。上端にその名前、次に 新しいセッション、ピン留め の下にピン留めした Thread、そして ワークスペース の下に Project とその Thread が並びます。Space 名の横の … はほかの Space を一覧し、新しいスペース と、表示中の Space の名前変更・削除を提供します — 最後の 1 つは削除できません。
ページからは次のことができます。
- Space の作成、名前変更、切り替え、削除
ワークスペースを追加…にサーバー上のディレクトリ~/dirまたは/dirを入力して Project を追加。mainThread が付いてきます- Project はクリックで折りたたみ、名前のダブルクリックで名前変更、アーカイブ、復元、削除
- Thread の作成、ピン留めと解除、削除、名前のダブルクリックで名前変更、未読にする
- Thread を同じ Project の中で、Project を同じ Space の中でドラッグして並べ替える
アーカイブした Project は Space の一番下の アーカイブ済み(N) にまとめられ、クリックすると表示されます。Thread の行の削除ボタンとタブの閉じるボタンは、中のプログラムを終わらせるので、削除? や 閉じる? と表示してもう一度確認します。サーバー上でどの Thread にも属さないウィンドウは 他のウィンドウ に並ぶので、届かないものはありません。
サイドバーの幅は端をドラッグして変え、ブラウザが覚えます。タブ列の先頭のボタンで隠せます。ホバーでサイドバーを表示 がオンなら、ポインターを左端に置くと表示され、離れると戻ります。
メニュー
右クリックではデスクトップのメニューが出ます。ただしサーバーに対応する操作がないものは除かれます。
| 対象 | 項目 |
|---|---|
| ペイン | コピー、ペースト、右に分割、左に分割、下に分割、上に分割、フロントエンドのアクセス方式 › A · 共有(tmux 風) / B · 引き継ぎ(排他) |
| タブ | 左側のタブを閉じる、右側のタブを閉じる、他のタブを閉じる、右側に新しいターミナルタブ、ペインを拡大 |
| Thread | セッションをピン留め または セッションのピン留めを解除、セッション名を変更…、セッションを削除、未読にする |
| Project | プロジェクト名を変更…、新しいセッション、セッションを折りたたむ/展開、プロジェクトをアーカイブ…、プロジェクトを削除 |
| アーカイブ済みの Project | アーカイブを解除、完全に削除… › プロジェクトとセッションを削除 |
Project でペインが動いているとき、プロジェクトをアーカイブ… はいくつ閉じるかを示してから、アーカイブしてペインを閉じる で実行します。タブの名前変更、ウィンドウ間のタブの移動、ターミナルのリセットはデスクトップ専用です。それでもタブはタブ列に沿ってドラッグすれば並べ替えられ、ペインを別のペインの端へドラッグするとそこへ移ります。
どのペインにもバーがあり、左にそのペインのタブ、右にそのペインでの新しいタブ、下に分割、右に分割、拡大が並びます。
検索パレット
Mac では ⌘K、それ以外では Ctrl+K で検索パレットが開きます。ショートカットはページの設定で変えられます。次のセクションに分けて探します。
スレッドを検索— すべての Space の Threadタブとペイン— 表示中のウィンドウのものスペースを切り替え— Spaceコマンド—新しいセッション、新しいタブ、右に分割、下に分割、ペインを拡大、ペインを閉じる、ターミナルを引き継ぐ、デスクトップのフォーカスに追従、サイドバーを表示または非表示、設定、フォントを大きく、フォントを小さく、フォントサイズをリセット
何も入力していないときは、最近選んだものが先に並びます。矢印で移動し、Enter で実行、Esc で閉じます。サイドバー下端の虫眼鏡は、Thread だけに絞ったパレットを開きます。
端末を駆動するのは誰か
端末をどう共有するかはサーバーが決めます。ペインのメニューの フロントエンドのアクセス方式 サブメニューで切り替え、現在の方式にはチェックが付きます。この選択はサーバーが保持し、再起動後も残るので、このページだけでなく、そのサーバーに接続しているすべてのデバイスに及びます。
既定の B · 引き継ぎ(排他) では、1 つの端末を駆動するのは同時に 1 台です。デスクトップが持っている端末を開くと、その上にカードが重なります — ターミナルは別のデバイスで使用中です、クリックまたはスクロールで続行 — 端末は下に見えたままです。その中でのクリック、スクロール、キー入力のどれかで引き取れます。最初のキー入力は失われず、引き継ぎが済んでから入力されます。タブ列、ペインのバー、サイドバーのクリックで引き取ることはありません。Ctrl+Shift+T、またはパレットの ターミナルを引き継ぐ で、はっきりと引き取れます。これは リモート で説明したハンドオフと同じ仕組みで、ブラウザはそのリンクで識別される 1 台のデバイスとして数えられます — 同じリンクで開いた 2 つのタブは 1 回の順番を共有します。
A · 共有(tmux 風) には引き渡す相手がいません。接続中のすべてのクライアントが同じ端末を見て入力でき、タブに最後に触れたクライアントがその大きさを決めます。
ページがタブを持っている間、タブはブラウザのウィンドウの形に合わせられます。デスクトップが持っている間、ページはデスクトップの大きさと形を保ち、タブがウィンドウより大きければはみ出た部分を切ります。Ctrl+Shift+F でいつでもタブをこのウィンドウに合わせ直せます。
デスクトップのフォーカスに追従 はページを開いた時点でオンで、両者のフォーカスを 1 つに保ちます。デスクトップが別のペインに移るとページも一緒に移り、ページでペインをクリックするとデスクトップも動きます。もう一度実行すると追従をやめます。この状態は再読み込みをまたいで覚えられません。
クリップボード
マウスでテキストを選ぶと、離した時点でコピーされます。ダブルクリックで単語、トリプルクリックで行を選びます。プログラムがマウスを求めているときは、Shift を押したまま自分で選択できます。ペインのメニューにも コピー と ペースト があります。
プログラムは OSC 52 でクリップボードを設定できますが、ページが表示しているペインからに限られます。誰も見ていないペインが、このデバイスのクリップボードに書き込むことはできません。
キーボードショートカット
| キー | 動作 |
|---|---|
Cmd+C または Ctrl+Shift+C | 選択をコピー |
Cmd+V または Ctrl+Shift+V | ペースト |
Ctrl+Shift+Enter | 右に分割 |
Ctrl+Shift+\ | 下に分割 |
Ctrl+Shift+Z | ペインを拡大、または拡大を解除 |
Ctrl+Shift+F | タブをこのウィンドウに合わせる |
Ctrl+Shift+T | ターミナルを引き継ぐ |
Ctrl+Shift と矢印 | 隣のペインにフォーカス。デスクトップのフォーカスは動かしません |
Cmd+=、Cmd+-、Cmd+0 | フォーカス中のペインのフォントサイズ:大きく、小さく、リセット |
⌘K / Ctrl+K | 検索パレット。別のショートカットを選んでいなければ |
それ以外の Cmd の組み合わせはすべてブラウザに任され — 再読み込み、アドレスバー、タブ — 端末には届きません。残りのキーは Ctrl の組み合わせも含めてフォーカス中のペインに送られます。そのため Mac 以外では、既定のパレットのショートカットのせいで Ctrl+K が端末に届きません。プログラムに必要なら、設定で Ctrl+Shift+P を選んでください。インプットメソッドも使えます。変換中のキーはインプットメソッドが受け取り、候補ウィンドウは端末のカーソルについていきます。
スマートフォンでは
ポインターが指のとき、またはウィンドウの幅が 720 ピクセル未満のとき、ページはスマートフォン向けのレイアウトになります。先に、上で説明したとおり https でサーバーにつないでください。
- 端末が画面全体を使います。サイドバーと Agents パネルはその上に重なるドロワーになります。左端から内側へスワイプするとサイドバーが出てきて、左へスワイプし戻すと引っ込みます。ドロワーで Thread を選ぶとドロワーは閉じます。
- 下端のキーバーには
Esc、Tab、CtrlとAlt、4 つの矢印、Home、End、PgUp、PgDn、そして-/|~があります。CtrlとAltはスティッキーで、タップすると、キーバーかソフトキーボードから来る次のキーに効きます。矢印は押し続けると繰り返します。 - ソフトキーボードは、キーバーのキーボードボタンで呼んだときだけ出ます。端末をタップしても画面の半分が隠れることはありません。
- 指でドラッグするとスクロールし、はじくとそのままスクロールが続きます。2 本指でもスクロールでき、ピンチすると指の下にあるペインのフォントサイズが変わります。
- タップはクリックです。0.5 秒の長押しでペインのメニューが開きます。
- ペインが 1 つだけのタブにはペインのバーが出ません。分割して見分ける必要が出たときに現れます。
タッチではテキストを選択できません。スマートフォンでのドラッグは常にスクロールです。
ページ自身の設定
サイドバー下端の歯車で、ページ自身の設定が開きます。これはこのブラウザのもので、サーバーやアカウントのものではありません。
| セクション | 設定 | 選択肢 |
|---|---|---|
| 一般 | 言語 | システム設定に従う(ブラウザの言語)、または ThinkTerm の言語のいずれか |
| 一般 | スクロール | スムーズ(既定)は指やトラックパッドにピクセル単位で追従し、行単位 は 1 行ずつ動きます |
| 一般 | 検索ショートカット | ⌘K(既定)、⌘⇧P、Ctrl+Shift+P。Mac 以外では ⌘ は Ctrl を指します |
| 外観 | カラースキーム | デスクトップに従う(既定)はサーバーに設定されたスキームを使います。ほかに任意の組み込みスキーム |
| 外観 | テーマ | ダーク(既定)、ライト、システム設定に従う。端末の周りのページに効きます |
| 外観 | フォントサイズ | デスクトップに従う でこちらのセルをあちらと同じ大きさに、または サイズを固定 で 6 〜 72、0.5 ポイント刻み |
| サイドバーとプラグイン | ホバーでサイドバーを表示 | 既定でオン |
| サイドバーとプラグイン | サイドバーの幅をリセット | サイドバーを既定の幅に戻します |
| サイドバーとプラグイン | エージェントパネル、スニペット | 右側のパネルにそれらを出すかどうか |
| サイドバーとプラグイン | プラグインを再読み込み と各プラグイン | スイッチと、使われていないときにどれだけ動かし続けるか |
| 情報 | — | 使用中の言語、ページの取得元アドレス、ビルド |
カラースキーム を開くと、各スキームの色を添えた検索できる一覧が出ます。ポインターや矢印のある行を端末がプレビューし、Enter で確定、Esc で元に戻します。設定の上端の検索欄では、どのセクションの行でも探せます。
保存場所
ブラウザのローカルストレージです。あわせて、ページが最後に表示していた Space、パレットの最近の選択、サイドバーの幅、選んだカラースキームとその色も保存されるので、次の読み込みでは最初からそのスキームで描かれます。別のブラウザやプライベートウィンドウでは既定値から始まります。これらがサーバーへ送られることはありません。ストレージを禁止したブラウザでは、その読み込みの間だけ設定が保たれます。
URL による上書き
URL で、保存内容を変えずに 1 回の読み込みだけ一部の設定を上書きできます。
| パラメーター | 効果 |
|---|---|
?lang=de-DE | ページの言語 |
?theme=light | light、dark、system |
?font=14 | 固定のフォントサイズ。6 〜 72 |
?glyphfont= | ページ自身のフォントにない文字に使う CSS のフォントリスト。漢字をどの地域の字形で描くかもこれで決まります |
発行したリンクの # より前に置きます:https://example-host:8088/?theme=light#token=…。
接続が切れたとき
ページは自分で同じタブへ再接続します。まずすぐに 1 回、次に 1 秒後、以後は待ち時間を倍にしながら最長 15 秒まで試します。右下に、接続が切れて再接続中である旨の案内が出ます。6 回続けて失敗すると、リンクが期限切れか、サーバーが止まっているかもしれないと付け加えます — 接続が拒まれた理由はブラウザに知らされないので、ページから見ると、失効したリンク、期限切れのリンク、止まったサーバーは区別できません。
切れている間も画面の内容はそのまま残り、戻るとタブはサーバーに合わせて並べ直されます。ページがあきらめるのは、戻る先がないときだけです。つまりサーバーにペインがないときか、別のプロトコルバージョンで話しているときで、どちらなのかを伝えます。
ページにできないこと
- ファイルとノート — 今のところデスクトップ専用で、タブアイコンも同様です。
- Live Overview とリモートホスト — ブラウザには対応するものがなく、ボタンもありません。
- Thread の参照 — デスクトップ独自のもので、表示されません。SSH ホスト上の Project も表示されません。サーバーがそれを開けないためです。
- 通知とサウンド — ベルには何も入らず、音も鳴りません。
- リンク — 出力中のリンクはクリックできません。
- スクロールバック検索、コピーモード、クイックセレクト — パレットが探すのはワークスペースで、ペインの中の文字ではありません。
- タッチでの選択 — スマートフォンではドラッグはスクロールです。
- iTerm2 の画像 — iTerm2 プロトコルで送られた PNG や JPEG の画像はまだ描かれません。
- 右から左へ書く文字 — 四角で表示されます。ページは双方向テキストを並べ替えないので、正しい文字が誤った順に並ぶほうが気づきにくいからです。
- タブの名前変更、ウィンドウ間のタブの移動、ターミナルのリセット — サーバーに対応する操作がありません。
ページに同梱された 2 つのフォントにない文字 — CJK、ハングル、絵文字 — は、ブラウザが動いているデバイスにインストールされたフォントで描かれます。どこにもない文字は四角になります。WebGPU がなければ、ページは https か http://localhost で、WebGPU を有効にしたブラウザから開くよう促すメッセージだけを表示します。
関連
- リモート — ブラウザに応じるセッションサーバーと、ハンドオフの仕組み
- コマンドライン —
web-serverとweb-tokenの詳細 - プラグイン — ブラウザがサーバー側のマシンから表示するパネル
- Space、Project、Thread — ページが表示するワークスペース
- プライバシーとセキュリティ — ページが保存するもの、送るもの
- 設定 —
web_serversとリスナーの証明書の置き場所
