pi-straw-boss 0.58.0 → 0.58.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/README.zh-TW.md +7 -5
- package/dist/gui/assets/answer-BUH02Bw3.js +1 -0
- package/dist/gui/assets/{ask-YLFOfyPL.js → ask-CCuRef5b.js} +1 -1
- package/dist/gui/assets/asks-DxUrf5ux.js +1 -0
- package/dist/gui/assets/chat-DSi3Ql53.js +2 -0
- package/dist/gui/assets/drawer-BDCllmUr.js +1 -0
- package/dist/gui/assets/index-Brm9t2JN.css +1 -0
- package/dist/gui/assets/index-ChNbuq3a.js +2 -0
- package/dist/gui/assets/layer-BK4GNN9N.js +1 -0
- package/dist/gui/assets/{lightbox-D-X8iJX-.js → lightbox-DbDsVulC.js} +1 -1
- package/dist/gui/assets/{link-BtJYO_kH.js → link-CjutfOQk.js} +1 -1
- package/dist/gui/assets/{linkdialogs-JxXE8c5p.js → linkdialogs-cBtfzZeF.js} +1 -1
- package/dist/gui/assets/{pair-CDu1AZdS.js → pair-BRjX33xh.js} +3 -3
- package/dist/gui/assets/{picker-BRc40HjN.js → picker-p7QeuQhH.js} +1 -1
- package/dist/gui/assets/registry-Dto8nD20.js +1 -0
- package/dist/gui/assets/{server-BoioQoSN.js → server-DiPkyx2u.js} +1 -1
- package/dist/gui/assets/sessionfacts-B26itOHA.js +1 -0
- package/dist/gui/assets/{settings-BjTSI7y8.js → settings-gri8PMci.js} +2 -2
- package/dist/gui/assets/{spawn-1QOqPxeT.js → spawn-hO-qDz8p.js} +1 -1
- package/dist/gui/assets/termcard-BVwtgkd6.js +6 -0
- package/dist/gui/assets/towerturns-C0Wg_fML.js +7 -0
- package/dist/gui/assets/{trust-7XUKlnNS.js → trust-CvxRS2eZ.js} +1 -1
- package/dist/gui/assets/unit_count-DOYsRwLG.js +1 -0
- package/dist/gui/assets/views-C_FMuCpf.js +2 -0
- package/dist/gui/assets/waitpanel-CjHSn3d1.js +1 -0
- package/dist/gui/assets/zenchunk-BQU5cp2L.js +2 -0
- package/dist/gui/assets/zenchunk-CwI8u-LK.css +1 -0
- package/dist/gui/index.html +2 -2
- package/dist/server/main.mjs +219 -63
- package/package.json +1 -1
- package/prompts/ally-run.md +3 -2
- package/prompts/head-run.md +3 -1
- package/prompts/tower-run.md +3 -2
- package/src/control.ts +7 -9
- package/src/cut.ts +117 -0
- package/src/headroutes.ts +26 -5
- package/src/memorycmd.ts +3 -3
- package/src/net.ts +1 -1
- package/src/opener.ts +17 -10
- package/src/restored.ts +77 -12
- package/src/server/allyroute.ts +64 -10
- package/src/server/runs.ts +8 -3
- package/src/server/runtools.ts +53 -10
- package/src/server/standing.ts +35 -3
- package/src/server/towermemory.ts +18 -7
- package/src/server/towers.ts +51 -21
- package/src/session.ts +1 -1
- package/src/tools.ts +2 -2
- package/dist/gui/assets/answer-Df5Xsumd.js +0 -7
- package/dist/gui/assets/chat-qWL8FgQ4.js +0 -2
- package/dist/gui/assets/drawer-Bw9Ifvof.js +0 -1
- package/dist/gui/assets/index-C5ao9YJA.js +0 -2
- package/dist/gui/assets/index-DTAQvxMk.css +0 -1
- package/dist/gui/assets/layer-fkM6TRNE.js +0 -1
- package/dist/gui/assets/sessionfacts-BVSrxWWq.js +0 -1
- package/dist/gui/assets/unit_count-DK_9HQJj.js +0 -1
- package/dist/gui/assets/views-Cuh01A5V.js +0 -2
- package/dist/gui/assets/waitpanel-DZzSM06_.js +0 -6
- package/dist/gui/assets/zenchunk-dFTpPJf3.js +0 -2
- package/dist/gui/assets/zenchunk-mcuxHiQU.css +0 -1
package/README.md
CHANGED
|
@@ -16,21 +16,23 @@ English | [繁體中文](https://github.com/wayne930242/pi-straw-boss/blob/main/
|
|
|
16
16
|
|
|
17
17
|
<p align="center"><img src="docs/gui-phone-map.png" width="220" alt="The map on a phone: the header's and each base's and tab's ⋯ menus, and a finished subagent with its Dismiss button"> <img src="docs/gui-phone-comms.png" width="220" alt="A unit's comms on a phone: the log takes the screen, with the queued messages, todos, and monitors folded above the composer, and the dossier behind Info"></p>
|
|
18
18
|
|
|
19
|
-
<p align="center"><sub>A unit's comms, a question you can answer from the browser, the Geek view, the settings page where each device picks its view, and the same page on a phone.</sub></p>
|
|
19
|
+
<p align="center"><sub>A unit's comms, a question you can answer from the browser, the Geek view, the settings page where each device picks its view, and the same page on a phone. A tower's wait for you is answered in place: **Handle** in its dialog (or on the tower's card) unfolds a box, and Enter tells the tower.</sub></p>
|
|
20
20
|
|
|
21
|
-
**Zen** is the third view, for the hours when you are answering the net rather than steering it. When something waits for you, the page shows that one thing alone: no map, no count of what else is queued. When you answer, cancel, or skip it (Maybe later), a breath of a pause follows, then the next. A dialog with several questions shows one at a time: the one you are on is open and clear, the others fold to one faded line (the question, and your answer once it has one), and a scroll or swipe, picking an answer, Tab, or a tap on a line moves on to the next. When nothing waits, a breathing circle and a short line on mindfulness or stillness, with whom it comes from (a Japanese source also has its original, small, below): every visit starts there. `[` or `]` steps to a session to keep you company, its live log and its composer, and the circle sits where the list wraps round; ⌘K's *Back to the breath* returns to it. No session, a tower included, is put there for you. One Esc cancels the question on the page, or skips the card when it cannot be cancelled; Esc twice (or the corner menu's last row) goes back to Standard. The corner menu also holds the language, the view, and the sound and volume, and the button beside it takes the page to full screen. An answer that leaves a terminal step (robot_hand's *Put it in my prompt* or a new Herdr pane) shows a small card in ink to finish it, which closes by itself when your Enter is taken or the pane closes; *Full terminal* on the card opens the whole terminal inside Zen, with *Back to Zen* in the top right corner. **Keys.** Enter or Space ends the breathing pause early (so does a tap); Esc answers or skips the card on the page, and a second Esc within 600 ms goes back to Standard (with the corner menu open, Esc only closes it; with text in a box, it only lets the box go). Inside a terminal the page does not take Esc: Shift+Esc lets the keyboard out of the terminal. **H** opens *Context* on a card, the unit's session log inside the card, read-only, and you can still answer while it is open; H or Esc closes it. `[` and `]` step the session beside you (the companion) through the sessions you can talk to. **⌘K** (Ctrl+K off a Mac) opens a command palette for the page's actions and the corner menu's choices. While nothing waits, a quiet line at the top says how many units work and how many are idle; it never counts what waits. Moving the pointer leaves faint ripples. **Sound** follows the settings page's Sound switch (off by default) and Volume: a soft singing-bowl tone when an item takes the screen, a wooden-fish knock when one is done, a lower bowl on an error; the corner menu's *Try the sounds* plays them. Set it as the default with `/boss gui view zen`, or pick it on a device's settings page. Music is yours: put audio files (mp3, m4a, ogg, wav, flac, and the like) in `~/.pi/agent/straw-boss-music/` and Zen shows a ♪ in the corner that plays them on a loop, with a ⌄ to choose the track (shown when there are two or more); with no files there is no ♪. The folder is read each time Zen shows, and tracks cross-fade into themselves so the loop has no gap. On a phone nothing plays before your first tap (♪ says *tap to play* until then, and again after the phone locks), the music pauses while the page is hidden, and the ringer switch mutes it. Motion stops under *reduce motion*, and the page follows the system's forced colours.
|
|
21
|
+
**Zen** is the third view, for the hours when you are answering the net rather than steering it. When something waits for you, the page shows that one thing alone: no map, no count of what else is queued. When you answer, cancel, or skip it (Maybe later), a breath of a pause follows, then the next. A wait a tower recorded on you (a question only you can settle) is a card of its own: **Handle** unfolds an answer box right on it, Enter or **Send** tells the tower in your words, and the card leaves with the knock; **Dismiss** drops the wait, and **Esc** folds the box with your draft kept. A dialog with several questions shows one at a time: the one you are on is open and clear, the others fold to one faded line (the question, and your answer once it has one), and a scroll or swipe, picking an answer, Tab, or a tap on a line moves on to the next. When nothing waits, a breathing circle and a short line on mindfulness or stillness, with whom it comes from (a Japanese source also has its original, small, below): every visit starts there. `[` or `]` steps to a session to keep you company, its live log and its composer, and the circle sits where the list wraps round; ⌘K's *Back to the breath* returns to it. No session, a tower included, is put there for you. One Esc cancels the question on the page, or skips the card when it cannot be cancelled; Esc twice (or the corner menu's last row) goes back to Standard. The corner menu also holds the language, the view, and the sound and volume, and the button beside it takes the page to full screen. An answer that leaves a terminal step (robot_hand's *Put it in my prompt* or a new Herdr pane) shows a small card in ink to finish it, which closes by itself when your Enter is taken or the pane closes; *Full terminal* on the card opens the whole terminal inside Zen, with *Back to Zen* in the top right corner. **Keys.** Enter or Space ends the breathing pause early (so does a tap); Esc answers or skips the card on the page, and a second Esc within 600 ms goes back to Standard (with the corner menu open, Esc only closes it; with text in a box, it only lets the box go). Inside a terminal the page does not take Esc: Shift+Esc lets the keyboard out of the terminal. **H** opens *Context* on a card, the unit's session log inside the card, read-only, and you can still answer while it is open; H or Esc closes it. `[` and `]` step the session beside you (the companion) through the sessions you can talk to. **⌘K** (Ctrl+K off a Mac) opens a command palette for the page's actions and the corner menu's choices. While nothing waits, a quiet line at the top says how many units work and how many are idle; it never counts what waits. Moving the pointer leaves faint ripples. **Sound** follows the settings page's Sound switch (off by default) and Volume: a soft singing-bowl tone when an item takes the screen, a wooden-fish knock when one is done, a lower bowl on an error; the corner menu's *Try the sounds* plays them. Set it as the default with `/boss gui view zen`, or pick it on a device's settings page. Music is yours: put audio files (mp3, m4a, ogg, wav, flac, and the like) in `~/.pi/agent/straw-boss-music/` and Zen shows a ♪ in the corner that plays them on a loop, with a ⌄ to choose the track (shown when there are two or more); with no files there is no ♪. The folder is read each time Zen shows, and tracks cross-fade into themselves so the loop has no gap. On a phone nothing plays before your first tap (♪ says *tap to play* until then, and again after the phone locks), the music pauses while the page is hidden, and the ringer switch mutes it. Motion stops under *reduce motion*, and the page follows the system's forced colours.
|
|
22
22
|
|
|
23
23
|
<p align="center"><img src="docs/gui-zen-item.png" width="49%" alt="The Zen view with one item: a robot_hand question from ops-main on an ink-dark page, its choices as lines of text, each with a dot, and Maybe later below"> <img src="docs/gui-zen-idle.png" width="49%" alt="The Zen view when nothing waits: a session stepped to with ], its live log and its composer"></p>
|
|
24
24
|
|
|
25
25
|
<p align="center"><img src="docs/gui-zen-alone.png" width="49%" alt="The Zen view with nothing waiting and no session to keep: a breathing circle and a line on mindfulness"> <img src="docs/gui-zen-menu.png" width="49%" alt="The Zen view's corner menu open over an item: language, view, sound and volume, and the way back to Standard"></p>
|
|
26
26
|
|
|
27
|
-
<p align="center"><img src="docs/gui-phone-zen-item.png" width="220" alt="The Zen view on a phone with one item: the question and its choices fill the screen"> <img src="docs/gui-phone-zen-idle.png" width="220" alt="The Zen view on a phone when nothing waits: a companion session's log and composer"> <img src="docs/gui-phone-zen-menu.png" width="220" alt="The Zen view's corner menu on a phone"></p>
|
|
27
|
+
<p align="center"><img src="docs/gui-phone-zen-item.png" width="220" alt="The Zen view on a phone with one item: the question and its choices fill the screen"> <img src="docs/gui-phone-zen-idle.png" width="220" alt="The Zen view on a phone when nothing waits: a companion session's log and composer"> <img src="docs/gui-phone-zen-menu.png" width="220" alt="The Zen view's corner menu on a phone"> <img src="docs/gui-phone-zen-wait.png" width="220" alt="The Zen view on a phone with a tower's wait: the question, the answer box with a reply typed, and Send, Dismiss, and Maybe later below"></p>
|
|
28
|
+
|
|
29
|
+
<p align="center"><img src="docs/gui-zen-wait.png" width="49%" alt="The Zen view with a tower's wait for you: the tower and its base as the title, the question, an answer box with a reply typed under a thin line, and Send, Dismiss, and Maybe later"> <img src="docs/gui-wait-answer.png" width="49%" alt="The Standard view's dialog for a tower's wait: the question, the answer box with a reply typed, Send, the link to the tower's comms, Later, and Dismiss"></p>
|
|
28
30
|
|
|
29
31
|
<p align="center"><img src="docs/gui-zen-history.png" width="49%" alt="The Zen view with an item's Context open: the unit's session log inside the card, above the question's choices, which stay answerable"> <img src="docs/gui-zen-palette.png" width="49%" alt="The Zen view's command palette (⌘K) open over the companion session, with the quiet strip of working and idle units above"></p>
|
|
30
32
|
|
|
31
33
|
<p align="center"><img src="docs/gui-zen-music.png" width="49%" alt="The Zen view with a music folder: the ♪ switch and the open track list in the corner"></p>
|
|
32
34
|
|
|
33
|
-
<p align="center"><sub>Zen: one item at a time, the companion session when nothing waits, a breathing circle when there is no session, the corner menu, the context, the command palette, the music, and the same on a phone.</sub></p>
|
|
35
|
+
<p align="center"><sub>Zen: one item at a time, the companion session when nothing waits, a breathing circle when there is no session, the corner menu, the context, the command palette, the music, a tower's wait answered on its card, and the same on a phone.</sub></p>
|
|
34
36
|
|
|
35
37
|
**The head tower** is the one tower that belongs to no project. You talk to it in one long conversation, on its own page in Standard or in a line under Zen's breathing circle, and it decides which workspace owns each instruction and hands it to that workspace's tower, opening the tower if there is none. It does no work itself and answers you in a line when a tower answers it. Zen shows its last lines fading as they age (hover to read them clear, **H** or a swipe up for the whole conversation), and the input stays a hairline until you click it or press Enter.
|
|
36
38
|
|
|
@@ -64,7 +66,7 @@ Run a few agents on the same project and they start stepping on each other: two
|
|
|
64
66
|
- **Broadcast** to a tab, a workspace, every tower (a workspace without one, through its mains or members), or every session.
|
|
65
67
|
- **Tidy tabs.** When a pi starts in a tab or quits out of it, the tab's panes are made equal again, so workers split off one by one don't leave a chain of halves.
|
|
66
68
|
- **Stranded subagents are asked to report.** A subagent that stays open after finishing, while the pi that launched it was restarted and no longer receives its result, is asked once over intercom to send its final report there ([how it works](docs/how-it-works.md#orphaned-subagents)).
|
|
67
|
-
- **Subagents a Herdr restart brought back as plain pi sessions are resumed.** A restart (`resume_agents_on_restore`) starts a plain `pi --session` in each subagent's pane, without what makes it a child, so its result never arrives. Straw Boss closes that restored pane and asks the launching session to resume the run with pi-herdr-agents' `subagent_resume`; a managed-worktree run keeps its pane and is reported instead ([how it works](docs/how-it-works.md#subagents-a-herdr-restore-brought-back-plain)).
|
|
69
|
+
- **Subagents a Herdr restart brought back as plain pi sessions are resumed.** A restart (`resume_agents_on_restore`) starts a plain `pi --session` in each subagent's pane, without what makes it a child, so its result never arrives. Straw Boss closes that restored pane and asks the launching session to resume the run with pi-herdr-agents' `subagent_resume`; a managed-worktree run keeps its pane and is reported instead; a child whose turn the restart cut off is told once to check the state and continue ([how it works](docs/how-it-works.md#subagents-a-herdr-restore-brought-back-plain)).
|
|
68
70
|
- **A net view in Herdr's sidebar.** An optional plugin turns the Agents list into the net, towers first and each subagent under its launcher, on by default and switched by one key.
|
|
69
71
|
- **A reaper for leftover worktree panes.** A second optional plugin closes the panes agents leave behind in worktree workspaces, removes the clean checkouts nothing holds, and keeps the workspaces you pin.
|
|
70
72
|
|
package/README.zh-TW.md
CHANGED
|
@@ -16,21 +16,23 @@
|
|
|
16
16
|
|
|
17
17
|
<p align="center"><img src="docs/gui-phone-map.png" width="220" alt="手機上的地圖:頂端、每座基地和每個分頁各有一個 ⋯ 選單,已完成的子智慧體有「Dismiss」按鈕"> <img src="docs/gui-phone-comms.png" width="220" alt="手機上的單位通訊畫面:對話紀錄佔滿畫面,排隊訊息、待辦和 Monitor 收合在輸入框上方,單位檔案在「Info」後面"></p>
|
|
18
18
|
|
|
19
|
-
<p align="center"><sub
|
|
19
|
+
<p align="center"><sub>單位的通訊畫面、可以直接在瀏覽器回答的問題、極客檢視、每個裝置自選檢視的設定頁,以及同一個頁面在手機上的樣子。塔台記在你身上的等待事項就在原處回覆:在它的對話框(或塔台卡片上)按「去處理」展開輸入框,按 Enter 就送給塔台。</sub></p>
|
|
20
20
|
|
|
21
|
-
**禪(Zen)**
|
|
21
|
+
**禪(Zen)** 是第三種檢視,給你在回應這張網、而不是指揮它的時候用。有東西在等你時,整個畫面只放那一件事:沒有地圖,也不顯示還排著幾件。你回答、取消或跳過(「晚點再說」)之後,會有一次呼吸般的停頓,再換下一件。塔台記在你身上的等待事項(只有你能決定的事)自己是一張卡片:按「去處理」會在卡片上直接展開輸入框,按 Enter 或「送出」把你的話交給塔台,卡片隨一聲木魚離開;「略過」把這則等待丟掉,Esc 把輸入框收起並保留草稿。一個對話框有好幾個問題時,一次只清楚地顯示一題:你正在回答的那題展開、清晰,其餘收成一行淡淡的字(題目,答了就接著你的答案),捲動或滑動、選好答案、按 Tab 或點一下那一行就移到下一題。沒有東西在等時,畫面是一個呼吸的圓圈和一句正念的話,每次進入禪都從這裡開始。用 `[` 或 `]` 可以挑一個 session 來陪,畫面會換成它的即時紀錄和輸入框;清單繞完一圈會回到呼吸圓圈,⌘K 裡的「回到呼吸」也能隨時回去。不會自動放一個 session(包括塔台)在那裡。按一次 Esc 會取消畫面上的問題,不能取消的卡片則是跳過;連按兩次 Esc(或選單最後一列)回到標準檢視。右上角的選單還有語言、檢視、音效與音量,旁邊的按鈕可以讓頁面全螢幕。回答之後留下終端機步驟的選項(robot_hand 的「放進我的 prompt」或新的 Herdr 窗格)會在禪裡面出現一張墨色的小卡片讓你完成它,你的 Enter 送出或窗格關閉時卡片自己消失;卡片上的「完整終端機」會在禪裡打開整個終端機,右上角有「回到禪」。**按鍵。** Enter 或空白鍵可以提早結束呼吸停頓(點一下畫面也行);Esc 回答或跳過畫面上的卡片,600 毫秒內再按一次 Esc 回到標準檢視(選單開著時 Esc 只關選單;輸入框裡有字時只是離開輸入框)。終端機在使用中時頁面不攔 Esc,Shift+Esc 可以讓鍵盤離開終端機。**H** 在卡片上展開「前情」,也就是這個 unit 的 session 紀錄,唯讀地顯示在卡片裡,展開時仍然可以回答;再按 H 或 Esc 收起。`[` 與 `]` 在你能對話的 session 之間切換身邊陪著的那一個。**⌘K**(不在 Mac 上是 Ctrl+K)打開指令面板,列出頁面的動作和右上角選單的選項。沒有東西在等時,頂端有一行淡淡的字說明幾個 unit 在工作、幾個閒著,不會數還在等的。滑鼠移動時會留下淡淡的漣漪。**音效**跟隨設定頁的「音效」開關(預設關)與音量:待辦出現時是一聲柔和的頌缽,完成時是一聲木魚,出錯時是低一點的缽聲;選單裡的「試聽音效」可以先聽。用 `/boss gui view zen` 把它設成預設,或在裝置的設定頁自己選。音樂由你自己放:把音檔(mp3、m4a、ogg、wav、flac 等)放進 `~/.pi/agent/straw-boss-music/`,禪的右上角就會出現 ♪,循環播放,旁邊的 ⌄ 可以選曲(有兩首以上才出現);資料夾裡沒有檔案就不會出現 ♪。每次顯示禪時都會重讀資料夾,曲子播完前會與自己交叉淡入淡出,所以循環沒有空檔。手機上要先點一下才會出聲(在那之前 ♪ 寫「點一下播放」,手機鎖屏之後也會再次這樣寫),頁面被藏起來時音樂暫停,靜音開關也會讓它靜音。「減少動態效果」開啟時畫面不動,系統的強制色彩模式也會被遵守。
|
|
22
22
|
|
|
23
23
|
<p align="center"><img src="docs/gui-zen-item.png" width="49%" alt="禪檢視裡的一件待辦:墨色畫面上是 ops-main 的 robot_hand 問題,選項是一行行前面有小圓點的字,下方有「晚點再說」"> <img src="docs/gui-zen-idle.png" width="49%" alt="沒有東西在等時的禪檢視:用 ] 挑來陪的 session,有它的即時紀錄和輸入框"></p>
|
|
24
24
|
|
|
25
25
|
<p align="center"><img src="docs/gui-zen-alone.png" width="49%" alt="沒有東西在等、也沒有 session 可陪的禪檢視:一個呼吸的圓圈和一句正念的話"> <img src="docs/gui-zen-menu.png" width="49%" alt="在待辦上打開右上角選單的禪檢視:語言、檢視、音效與音量,以及回到標準檢視"></p>
|
|
26
26
|
|
|
27
|
-
<p align="center"><img src="docs/gui-phone-zen-item.png" width="220" alt="手機上的禪檢視,一件待辦:問題和選項佔滿畫面"> <img src="docs/gui-phone-zen-idle.png" width="220" alt="沒有東西在等時,手機上的禪檢視:挑來陪的 session 的紀錄和輸入框"> <img src="docs/gui-phone-zen-menu.png" width="220" alt="手機上打開右上角選單的禪檢視"></p>
|
|
27
|
+
<p align="center"><img src="docs/gui-phone-zen-item.png" width="220" alt="手機上的禪檢視,一件待辦:問題和選項佔滿畫面"> <img src="docs/gui-phone-zen-idle.png" width="220" alt="沒有東西在等時,手機上的禪檢視:挑來陪的 session 的紀錄和輸入框"> <img src="docs/gui-phone-zen-menu.png" width="220" alt="手機上打開右上角選單的禪檢視"> <img src="docs/gui-phone-zen-wait.png" width="220" alt="手機上的禪檢視,塔台的一則等待:問題、打了一句回覆的輸入框,下方是送出、略過和晚點再說"></p>
|
|
28
|
+
|
|
29
|
+
<p align="center"><img src="docs/gui-zen-wait.png" width="49%" alt="禪檢視裡塔台的一則等待:塔台和基地名當標題、問題、細線下打了一句回覆的輸入框,以及送出、略過和晚點再說"> <img src="docs/gui-wait-answer.png" width="49%" alt="標準檢視裡塔台等待事項的對話框:問題、打了一句回覆的輸入框、送出、前往塔台通訊的連結、稍後和略過"></p>
|
|
28
30
|
|
|
29
31
|
<p align="center"><img src="docs/gui-zen-history.png" width="49%" alt="打開「前情」的禪檢視:卡片裡是這個 unit 的 session 紀錄,問題的選項仍然可以回答"> <img src="docs/gui-zen-palette.png" width="49%" alt="在陪伴的 session 上打開指令面板(⌘K)的禪檢視,頂端有工作中與閒著的 unit 數的淡淡一行"></p>
|
|
30
32
|
|
|
31
33
|
<p align="center"><img src="docs/gui-zen-music.png" width="49%" alt="有音樂資料夾時的禪檢視:右上角的 ♪ 開關與打開的曲目清單"></p>
|
|
32
34
|
|
|
33
|
-
<p align="center"><sub>禪:一次一件待辦、沒東西等時陪著的 session、沒有 session
|
|
35
|
+
<p align="center"><sub>禪:一次一件待辦、沒東西等時陪著的 session、沒有 session 時的呼吸圓圈、右上角選單、前情、指令面板、音樂、在卡片上回覆塔台的等待,以及同樣的畫面在手機上的樣子。</sub></p>
|
|
34
36
|
|
|
35
37
|
**主塔台(head tower)** 是唯一不屬於任何專案的塔台。你和它只有一場很長的對話:在標準檢視有它自己的一頁,在禪檢視則是呼吸圓圈下方的幾行字。它判斷每件事該由哪個工作區處理,轉給那個工作區的塔台,那個工作區還沒有塔台就先替它開一座。它自己不做事;塔台回覆之後,它再用一行話告訴你。禪檢視裡,它最近說的話會隨時間慢慢淡去(滑鼠移上去就看得清楚,按 **H** 或往上滑可以看全部對話),輸入框平時只是一條細線,點一下或按 Enter 才展開。
|
|
36
38
|
|
|
@@ -64,7 +66,7 @@
|
|
|
64
66
|
- **廣播**給一個分頁、一個工作區、所有塔台(沒有塔台的工作區改送主智慧體或成員),或所有 session。
|
|
65
67
|
- **分頁保持整齊。** pi 在分頁裡啟動或結束時,分頁裡的 pane 會重新平均分配,一個一個切出來的 worker 就不會留下一長串對半切的窄 pane。
|
|
66
68
|
- **斷線的子智慧體會被提醒回報。** 子智慧體做完後還開著,但開出它的 pi 已經重開、收不到它的結果時,它會收到一則 intercom,請它把最終報告送回去,只會送一次([運作方式](docs/how-it-works.md#orphaned-subagents))。
|
|
67
|
-
- **Herdr 重啟後被還原成一般 pi 的子智慧體會被接回來。** Herdr 重啟時(`resume_agents_on_restore`)會在每個子智慧體的 pane 裡重開一個普通的 `pi --session`,少了讓它成為子智慧體的設定,結果永遠送不回來。Straw Boss 會關掉那個被還原的 pane,並請開出它的 session 用 pi-herdr-agents 的 `subagent_resume` 重新接手;受管 worktree 的子智慧體則保留原 pane,只回報給開出它的 session
|
|
69
|
+
- **Herdr 重啟後被還原成一般 pi 的子智慧體會被接回來。** Herdr 重啟時(`resume_agents_on_restore`)會在每個子智慧體的 pane 裡重開一個普通的 `pi --session`,少了讓它成為子智慧體的設定,結果永遠送不回來。Straw Boss 會關掉那個被還原的 pane,並請開出它的 session 用 pi-herdr-agents 的 `subagent_resume` 重新接手;受管 worktree 的子智慧體則保留原 pane,只回報給開出它的 session;重啟時剛好被切斷回合的子智慧體會被告知一次,先確認現況再繼續([運作方式](docs/how-it-works.md#subagents-a-herdr-restore-brought-back-plain),英文)。
|
|
68
70
|
- **Herdr 側邊欄的網路檢視。** 一個選用的 plugin 會把 Agents 清單排成網的樣子:塔台在前,每個子智慧體排在開出它的人底下。預設開啟,按一個鍵就能切換。
|
|
69
71
|
- **清理閒置的 worktree pane。** 另一個選用的 plugin 會關掉智慧體在 worktree 工作區留下的 pane,移除乾淨且沒有東西在用的 checkout,並保留你釘選的工作區。
|
|
70
72
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-4tVxZq34.js";import{t}from"./ask-CCuRef5b.js";import{n}from"./post-CmicYl-f.js";var r=e({answerPost:()=>i,canAnswer:()=>o,mountAnswer:()=>s,trustPost:()=>a}),i=(e,t)=>t?.(e)??((t,r)=>n(e.startsWith(`grant:`)?`panes/${encodeURIComponent(e.slice(6))}/${t}`:`sessions/${encodeURIComponent(e)}/${t}`,r)),a=e=>e??(e=>n(`trust/answer`,e)),o=(e,...t)=>e===`waiting`&&t.every(Boolean),s=(e,{key:n,show:r,post:i,remote:a,accepted:o,label:s})=>t(e,i,a,{key:n,show:r},o,s);export{a,s as i,r as n,o as r,i as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./runtime-ZX6HkxDa.js";import{a as t,i as n,n as r,r as i,t as a}from"./sending-aEpvzoz2.js";import{Mt as o,ct as s,nn as c,t as l}from"./index-C5ao9YJA.js";var u=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`下方還有 ▾`:`More below ▾`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`可以複選。`:`It takes several choices.`),h=((t={},n={})=>(n.locale??e())===`zh-TW`?`已取消。`:`Cancelled.`),g=((t={},n={})=>(n.locale??e())===`zh-TW`?`選擇`:`Choices`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`複製指令`:`Copy command`),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註`:`Note`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註(選填)`:`Note (optional)`),S=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,C=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,te=((t,n={})=>(n.locale??e())===`zh-TW`?C(t):S(t)),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`選項`:`Options`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`你的答案`:`Your own answer`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`安全考量,遠端不支援輸入機密。請到執行 GUI 的那台電腦的終端機中回答。`:`For security, entering a secret is not supported remotely. Answer it in the terminal on the computer the GUI runs on.`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`機密內容只能在終端機輸入,這裡不接受。請到執行 GUI 的那台電腦的終端機中回答。`:`A secret is entered in the terminal only, not here. Answer it in the terminal on the computer the GUI runs on.`),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出答案`:`Send answer`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示終端機`:`Show terminal`),I=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),L=((t={},n={})=>(n.locale??e())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),z=((t={},n={})=>(n.locale??e())===`zh-TW`?`它在等待對話框。`:`It waits on a dialog.`),B={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1};function V(e,t,n,r,i){let{q:a}=n,o=r[a],s=B[e]??0,c=e===`ArrowUp`,l=c||e===`ArrowDown`,u=()=>({to:r.map((e,t)=>({q:(a+1+t)%r.length,part:`opt`})).find(e=>e.q!==a&&!i[e.q])??`send`});if(e===`Tab`){let e=r[a-1],i=n.part===`opt`?o.own||o.note:n.part===`own`&&o.note;return t?n.part===`opt`&&e?{to:{q:a-1,part:e.note?`note`:e.own?`own`:`opt`}}:void 0:i||a===r.length-1?void 0:{to:{q:a+1,part:`opt`}}}if(!t){if(n.part===`opt`){let t=n.o+s;if(s)return t>=0&&t<o.options?{to:{q:a,part:`opt`,o:t},...o.multiple?{}:{pick:t}}:{to:s>0&&o.own?{q:a,part:`own`}:n};if(e===`Enter`||e===` `&&!o.multiple)return{...u(),...o.multiple?{}:{pick:n.o}}}else if(n.part===`own`){if(e===`Enter`)return u();if(l)return{to:c?{q:a,part:`opt`,o:o.options-1}:{q:a,part:`note`}}}else if(c)return{to:{q:a,part:`own`}}}}function H(e,t,n){let r=e=>Math.max(0,e.opts.findIndex(e=>e.getAttribute(`aria-checked`)===`true`)),i=(e,t)=>e.opts.forEach((e,n)=>e.setAttribute(`tabindex`,n===t?`0`:`-1`)),a=e=>{for(let[n,r]of t.entries()){let t=r.opts.indexOf(e);if(t>=0)return{q:n,part:`opt`,o:t};if(e===r.own||e===r.note)return{q:n,part:e===r.own?`own`:`note`}}};t.forEach(e=>i(e,r(e)));let o=e=>{let n=a(e.target);n?.part===`opt`&&i(t[n.q],n.o)};e.addEventListener(`focusin`,o),e.addEventListener(`click`,o);let s=!1;return e.addEventListener(`keydown`,i=>{let o=a(i.target);if(!o||i.ctrlKey||i.altKey||i.metaKey||i.isComposing)return;let c=i.target;if(o.part!==`opt`&&(i.key===`ArrowUp`?c.selectionStart!==0:i.key===`ArrowDown`&&c.selectionEnd!==c.value.length))return;let l=V(i.key,i.shiftKey,o,t.map(e=>({options:e.opts.length,multiple:e.multiple,own:!!e.own,note:!!e.note})),t.map(e=>e.answered()));if(!l||(i.preventDefault(),i.repeat&&[`Enter`,` `].includes(i.key)))return;if(s=i.key===` `,l.pick!==void 0){let e=t[o.q].opts[l.pick];e.getAttribute(`aria-checked`)!==`true`&&e.click()}let u=l.to===`send`?void 0:t[l.to.q],d=l.to===`send`?n():l.to.part===`opt`?u.opts[l.to.o??r(u)]:l.to.part===`own`?u.own:u.note;d&&!d.disabled&&(e.dispatchEvent(new CustomEvent(`ask-reveal`,{detail:d})),d.focus())}),e.addEventListener(`keyup`,e=>s&&e.key===` `&&(s=!1,e.preventDefault())),()=>t[0]?.opts[r(t[0])]}var U=e=>e.multiple?m():e.freeform&&e.options.length?p():``,W=90,G=(e,t)=>s(`div`,{class:`ask-one`},e.header&&s(`b`,{class:`ask-head`},e.header),s(`p`,{class:`ask-q`,...e.question.length>W?{"data-long":``}:{}},e.question),e.context&&s(`div`,{class:`ask-ctx`},e.context),e.options.length>0&&s(`ol`,{class:`ask-opts`,"aria-label":w()},...e.options.map(e=>s(`li`,{class:`ask-opt`},s(`b`,null,e.title),e.description&&s(`small`,null,e.description)))),t&&U(e)&&s(`small`,{class:`ask-how`},U(e))),K=e=>e.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f\p{Cf}]/gu,`�`),q=e=>(e.select?.choices??[]).map((e,t)=>({...e,i:t})),J=(e,t,n)=>({...e.size?{choices:[...e].sort((e,t)=>e-t)}:{},...t.trim()?{text:t}:{},...n.trim()?{note:n}:{}}),Y=(e,t,n)=>({dialog:e.dialog,digest:e.digest,answerId:n,...t}),X=(e,t)=>({dialog:e.dialog,digest:e.digest,answerId:t,cancel:!0}),Z=(e,t)=>e.cancel===!0&&!(t&&e.select?.choices.every(e=>e.hereOnly)),Q={digest:O,"not-allowed":A,malformed:k};function ne(e,i=!1){let{outcome:a,reason:s,by:c}=e.body;return a===`accepted`?[`ok`,i?h():n()]:a===`stale`?[`error`,c===`local`?R():c===`cancel`?I():L()]:a===`rejected`?[`error`,(Object.hasOwn(Q,String(s))?Q[String(s)]:j)()]:a===`busy`?[`error`,t()]:a===`unknown`||e.status===504?[`error`,r(),!0]:[`error`,s??o({status:e.status})]}var re=e=>[`accepted`,`stale`,`busy`,`unknown`].includes(String(e.body.outcome))||e.status===504,$=e=>e.answer?`d\n${e.answer.dialog}\n${e.answer.digest}`:`c\n${e.callId}\n${e.why??``}`;function ie(e){if(e.dataset.cued)return;e.dataset.cued=`1`;let t=()=>{e.toggleAttribute(`data-more`,e.scrollHeight-e.scrollTop-e.clientHeight>4);for(let t of e.querySelectorAll(`.ask-acts`))t.dataset.cue=f()};for(let n of[`scroll`,`input`])e.addEventListener(n,t,{passive:!0});typeof ResizeObserver<`u`&&new ResizeObserver(t).observe(e),typeof MutationObserver<`u`&&new MutationObserver(t).observe(e,{childList:!0,subtree:!0,characterData:!0}),typeof requestAnimationFrame<`u`&&requestAnimationFrame(t)}function ae(e,t,n=location.hostname!==`127.0.0.1`,o,f,p=F){let m,h,S,C=!1,O=!1,k;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>h&&!h.el.contains(e.target)&&(h.lost=void 0));let A=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),j=()=>{if(!h)return;let e=document.activeElement;e&&e!==document.body&&e!==h.lost&&(h.lost=void 0),h.controls.forEach(e=>e.disabled=!C||O||h.done),h.send&&(h.send.disabled=!C||O||h.done||!h.pick()),e&&h.el.contains(e)&&e.disabled&&(h.lost=e);let t=h.lost;t&&!t.disabled&&h.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),h.lost=void 0)};async function I(e,n){[e.sending,O,e.spell]=[!0,!0,!1],j(),A(e.note,``,a());let c=await t(`answer`,n).catch(()=>void 0),u=s(`button`,{type:`button`,class:`cmp-link`},i());u.onclick=()=>void I(e,n);let[d,p,m]=c?ne(c,n.cancel===!0):[`error`,r(),!0];[e.done,e.sending,O,e.busy]=[!c||re(c),!1,!1,c?.body.outcome===`busy`],A(e.note,d,p,...m?[u]:[]);let h=c?.body.outcome===`accepted`?c.body.then:void 0,g=h&&l(h,{key:o?.key??``,command:e.copy,answerId:String(n.answerId??``)});g&&A(e.note,d,`${p} ${g}`),j(),e.note.scrollIntoView?.({block:`nearest`}),f&&c?.body.outcome===`accepted`&&setTimeout(()=>f(!!h&&!g),h&&!g?0:1200)}let L=(e,t,n,r,i)=>{let a=s(`button`,{type:`button`,class:`ask-opt`,role:e,"aria-checked":`false`},s(`b`,i?{"data-n":String(i)}:null,t),...n.filter(Boolean).map(e=>s(`small`,null,e)));return a.onclick=r,a};function R(e,t){let r,i=q(t).map(e=>L(`radio`,K(e.label),[e.note&&K(e.note)],()=>(r=e.i,i.forEach((n,r)=>n.setAttribute(`aria-checked`,String(q(t)[r].i===e.i))),j()),e.i+1)),a=t.select?.copy!==void 0&&s(`button`,{type:`button`,class:`cmp-link`},y());a&&(a.disabled=!navigator.clipboard,a.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>A(e.note,`ok`,v()),()=>A(e.note,`error`,_())));let o=i.filter((e,r)=>!(n&&q(t)[r].hereOnly));return i.forEach(e=>!o.includes(e)&&(e.disabled=!0)),e.pick=()=>r===void 0?void 0:{choice:r},e.first=H(e.el,[{opts:i,multiple:!1,answered:()=>r!==void 0}],()=>e.send),e.controls=o,[s(`pre`,{class:`ask-title`},K(t.select.title)),s(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":g()},...i),s(`div`,{class:`ask-acts`},e.send,e.cancel,a)]}function B(e,t){let n=t.questions.map(()=>({picks:new Set,text:s(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:D(),"aria-label":E()}),note:s(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:x(),"aria-label":b()})})),r=[],i=t.questions.map((t,i)=>{let a=n[i],o=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>L(o,e.title,[e.description,e.preview&&ee()],()=>{t.multiple||(a.picks.clear(),a.text.value=``),a.picks.has(n)?a.picks.delete(n):a.picks.add(n),c.forEach((e,t)=>e.setAttribute(`aria-checked`,String(a.picks.has(t)))),j()}));return a.text.oninput=()=>(t.multiple||(a.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),j()),e.controls.push(...c,a.text,a.note),r.push({opts:c,multiple:!!t.multiple,own:a.text,note:a.note,answered:()=>a.picks.size>0||a.text.value.trim()!==``}),s(`div`,{class:`ask-one`},t.header&&s(`b`,{class:`ask-head`},t.header),s(`p`,{class:`ask-q`,...t.question.length>W?{"data-long":``}:{}},t.question),s(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":w()},...c),a.text,a.note)});return e.pick=()=>n.every(e=>e.picks.size||e.text.value.trim())?{answers:n.map(e=>J(e.picks,e.text.value,e.note.value))}:void 0,e.first=H(e.el,r,()=>e.send),[...i,s(`div`,{class:`ask-acts`},e.send,e.cancel)]}function V(e){let t=e.asks??(e.ask?[e.ask]:[]),r=t.length>1,i=e.answer,a={copy:i?.select?.copy,key:$(e),el:s(`section`,{class:`ask`}),note:s(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};i&&((a.send=s(`button`,{type:`button`,class:`ask-send`},P())).onclick=()=>void(a.pick()&&I(a,Y(i,a.pick(),crypto.randomUUID()))));let l=e.tool===`secret_drop`;i&&!l&&Z(i,n)&&((a.cancel=s(`button`,{type:`button`,class:`ask-cancel`},c())).onclick=()=>void I(a,X(i,crypto.randomUUID())));let f=s(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${r?d():u()} ${r||!t[0]?``:U(t[0])}`.trim()),m=o&&e.tool!==`secret_drop`&&s(`button`,{type:`button`,class:`cmp-link`},p());m&&(m.onclick=o.show);let h=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[s(`p`,{class:`ask-why`},te({tool:e.tool}))]:[];return a.el.append(...h,...i&&!l?i.select?R(a,i):B(a,i):[...t.length?t.map(e=>G(e,r)):[s(`p`,{class:`ask-why`},l?n?M():N():e.why??z())],s(`div`,{class:`ask-acts`},l?s(`p`,{class:`ask-term`},u()):f,m)],a.note),a.cancel&&a.controls.push(a.cancel),a}let Q=(t,n)=>{let r=document.activeElement;h&&h!==n&&(h.focus=h.el.contains(r)?r:void 0),[m,h,S]=[t,n,n?.send?n:S],e.replaceChildren(...n?[n.el]:[]),n&&ie(n.el),j(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=h&&!h.done?h.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},cancel(){let e=h&&!h.done?h.cancel:void 0;return!!(e&&!e.disabled&&(e.click(),1))},sending:()=>O,update(e,t){C=t,e&&(k=void clearTimeout(k)),!e&&(h?.done||h?.sending)?k??=setTimeout(()=>(k=void 0,Q()),6e3):e?h&&($(e)===h.key||!e.answer&&(h.done||h.sending)&&e.callId===m?.callId)?((h.busy||h.sending)&&!e.answer?h.spell=!0:h.busy&&h.spell&&e.answer&&([h.done,h.busy]=[!1,!1],A(h.note,``,T())),m=e):Q(e,S?.key===$(e)&&!S.done?S:V(e)):Q(),j()}}}export{ae as t};
|
|
1
|
+
import{t as e}from"./runtime-ZX6HkxDa.js";import{a as t,i as n,n as r,r as i,t as a}from"./sending-aEpvzoz2.js";import{Nt as o,lt as s,rn as c,t as l}from"./index-ChNbuq3a.js";var u=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`下方還有 ▾`:`More below ▾`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`可以複選。`:`It takes several choices.`),h=((t={},n={})=>(n.locale??e())===`zh-TW`?`已取消。`:`Cancelled.`),g=((t={},n={})=>(n.locale??e())===`zh-TW`?`選擇`:`Choices`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`複製指令`:`Copy command`),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註`:`Note`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註(選填)`:`Note (optional)`),S=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,C=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,te=((t,n={})=>(n.locale??e())===`zh-TW`?C(t):S(t)),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`選項`:`Options`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`你的答案`:`Your own answer`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`安全考量,遠端不支援輸入機密。請到執行 GUI 的那台電腦的終端機中回答。`:`For security, entering a secret is not supported remotely. Answer it in the terminal on the computer the GUI runs on.`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`機密內容只能在終端機輸入,這裡不接受。請到執行 GUI 的那台電腦的終端機中回答。`:`A secret is entered in the terminal only, not here. Answer it in the terminal on the computer the GUI runs on.`),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出答案`:`Send answer`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示終端機`:`Show terminal`),I=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),L=((t={},n={})=>(n.locale??e())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),z=((t={},n={})=>(n.locale??e())===`zh-TW`?`它在等待對話框。`:`It waits on a dialog.`),B={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1};function V(e,t,n,r,i){let{q:a}=n,o=r[a],s=B[e]??0,c=e===`ArrowUp`,l=c||e===`ArrowDown`,u=()=>({to:r.map((e,t)=>({q:(a+1+t)%r.length,part:`opt`})).find(e=>e.q!==a&&!i[e.q])??`send`});if(e===`Tab`){let e=r[a-1],i=n.part===`opt`?o.own||o.note:n.part===`own`&&o.note;return t?n.part===`opt`&&e?{to:{q:a-1,part:e.note?`note`:e.own?`own`:`opt`}}:void 0:i||a===r.length-1?void 0:{to:{q:a+1,part:`opt`}}}if(!t){if(n.part===`opt`){let t=n.o+s;if(s)return t>=0&&t<o.options?{to:{q:a,part:`opt`,o:t},...o.multiple?{}:{pick:t}}:{to:s>0&&o.own?{q:a,part:`own`}:n};if(e===`Enter`||e===` `&&!o.multiple)return{...u(),...o.multiple?{}:{pick:n.o}}}else if(n.part===`own`){if(e===`Enter`)return u();if(l)return{to:c?{q:a,part:`opt`,o:o.options-1}:{q:a,part:`note`}}}else if(c)return{to:{q:a,part:`own`}}}}function H(e,t,n){let r=e=>Math.max(0,e.opts.findIndex(e=>e.getAttribute(`aria-checked`)===`true`)),i=(e,t)=>e.opts.forEach((e,n)=>e.setAttribute(`tabindex`,n===t?`0`:`-1`)),a=e=>{for(let[n,r]of t.entries()){let t=r.opts.indexOf(e);if(t>=0)return{q:n,part:`opt`,o:t};if(e===r.own||e===r.note)return{q:n,part:e===r.own?`own`:`note`}}};t.forEach(e=>i(e,r(e)));let o=e=>{let n=a(e.target);n?.part===`opt`&&i(t[n.q],n.o)};e.addEventListener(`focusin`,o),e.addEventListener(`click`,o);let s=!1;return e.addEventListener(`keydown`,i=>{let o=a(i.target);if(!o||i.ctrlKey||i.altKey||i.metaKey||i.isComposing)return;let c=i.target;if(o.part!==`opt`&&(i.key===`ArrowUp`?c.selectionStart!==0:i.key===`ArrowDown`&&c.selectionEnd!==c.value.length))return;let l=V(i.key,i.shiftKey,o,t.map(e=>({options:e.opts.length,multiple:e.multiple,own:!!e.own,note:!!e.note})),t.map(e=>e.answered()));if(!l||(i.preventDefault(),i.repeat&&[`Enter`,` `].includes(i.key)))return;if(s=i.key===` `,l.pick!==void 0){let e=t[o.q].opts[l.pick];e.getAttribute(`aria-checked`)!==`true`&&e.click()}let u=l.to===`send`?void 0:t[l.to.q],d=l.to===`send`?n():l.to.part===`opt`?u.opts[l.to.o??r(u)]:l.to.part===`own`?u.own:u.note;d&&!d.disabled&&(e.dispatchEvent(new CustomEvent(`ask-reveal`,{detail:d})),d.focus())}),e.addEventListener(`keyup`,e=>s&&e.key===` `&&(s=!1,e.preventDefault())),()=>t[0]?.opts[r(t[0])]}var U=e=>e.multiple?m():e.freeform&&e.options.length?p():``,W=90,G=(e,t)=>s(`div`,{class:`ask-one`},e.header&&s(`b`,{class:`ask-head`},e.header),s(`p`,{class:`ask-q`,...e.question.length>W?{"data-long":``}:{}},e.question),e.context&&s(`div`,{class:`ask-ctx`},e.context),e.options.length>0&&s(`ol`,{class:`ask-opts`,"aria-label":w()},...e.options.map(e=>s(`li`,{class:`ask-opt`},s(`b`,null,e.title),e.description&&s(`small`,null,e.description)))),t&&U(e)&&s(`small`,{class:`ask-how`},U(e))),K=e=>e.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f\p{Cf}]/gu,`�`),q=e=>(e.select?.choices??[]).map((e,t)=>({...e,i:t})),J=(e,t,n)=>({...e.size?{choices:[...e].sort((e,t)=>e-t)}:{},...t.trim()?{text:t}:{},...n.trim()?{note:n}:{}}),Y=(e,t,n)=>({dialog:e.dialog,digest:e.digest,answerId:n,...t}),X=(e,t)=>({dialog:e.dialog,digest:e.digest,answerId:t,cancel:!0}),Z=(e,t)=>e.cancel===!0&&!(t&&e.select?.choices.every(e=>e.hereOnly)),Q={digest:O,"not-allowed":A,malformed:k};function ne(e,i=!1){let{outcome:a,reason:s,by:c}=e.body;return a===`accepted`?[`ok`,i?h():n()]:a===`stale`?[`error`,c===`local`?R():c===`cancel`?I():L()]:a===`rejected`?[`error`,(Object.hasOwn(Q,String(s))?Q[String(s)]:j)()]:a===`busy`?[`error`,t()]:a===`unknown`||e.status===504?[`error`,r(),!0]:[`error`,s??o({status:e.status})]}var re=e=>[`accepted`,`stale`,`busy`,`unknown`].includes(String(e.body.outcome))||e.status===504,$=e=>e.answer?`d\n${e.answer.dialog}\n${e.answer.digest}`:`c\n${e.callId}\n${e.why??``}`;function ie(e){if(e.dataset.cued)return;e.dataset.cued=`1`;let t=()=>{e.toggleAttribute(`data-more`,e.scrollHeight-e.scrollTop-e.clientHeight>4);for(let t of e.querySelectorAll(`.ask-acts`))t.dataset.cue=f()};for(let n of[`scroll`,`input`])e.addEventListener(n,t,{passive:!0});typeof ResizeObserver<`u`&&new ResizeObserver(t).observe(e),typeof MutationObserver<`u`&&new MutationObserver(t).observe(e,{childList:!0,subtree:!0,characterData:!0}),typeof requestAnimationFrame<`u`&&requestAnimationFrame(t)}function ae(e,t,n=location.hostname!==`127.0.0.1`,o,f,p=F){let m,h,S,C=!1,O=!1,k;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>h&&!h.el.contains(e.target)&&(h.lost=void 0));let A=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),j=()=>{if(!h)return;let e=document.activeElement;e&&e!==document.body&&e!==h.lost&&(h.lost=void 0),h.controls.forEach(e=>e.disabled=!C||O||h.done),h.send&&(h.send.disabled=!C||O||h.done||!h.pick()),e&&h.el.contains(e)&&e.disabled&&(h.lost=e);let t=h.lost;t&&!t.disabled&&h.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),h.lost=void 0)};async function I(e,n){[e.sending,O,e.spell]=[!0,!0,!1],j(),A(e.note,``,a());let c=await t(`answer`,n).catch(()=>void 0),u=s(`button`,{type:`button`,class:`cmp-link`},i());u.onclick=()=>void I(e,n);let[d,p,m]=c?ne(c,n.cancel===!0):[`error`,r(),!0];[e.done,e.sending,O,e.busy]=[!c||re(c),!1,!1,c?.body.outcome===`busy`],A(e.note,d,p,...m?[u]:[]);let h=c?.body.outcome===`accepted`?c.body.then:void 0,g=h&&l(h,{key:o?.key??``,command:e.copy,answerId:String(n.answerId??``)});g&&A(e.note,d,`${p} ${g}`),j(),e.note.scrollIntoView?.({block:`nearest`}),f&&c?.body.outcome===`accepted`&&setTimeout(()=>f(!!h&&!g),h&&!g?0:1200)}let L=(e,t,n,r,i)=>{let a=s(`button`,{type:`button`,class:`ask-opt`,role:e,"aria-checked":`false`},s(`b`,i?{"data-n":String(i)}:null,t),...n.filter(Boolean).map(e=>s(`small`,null,e)));return a.onclick=r,a};function R(e,t){let r,i=q(t).map(e=>L(`radio`,K(e.label),[e.note&&K(e.note)],()=>(r=e.i,i.forEach((n,r)=>n.setAttribute(`aria-checked`,String(q(t)[r].i===e.i))),j()),e.i+1)),a=t.select?.copy!==void 0&&s(`button`,{type:`button`,class:`cmp-link`},y());a&&(a.disabled=!navigator.clipboard,a.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>A(e.note,`ok`,v()),()=>A(e.note,`error`,_())));let o=i.filter((e,r)=>!(n&&q(t)[r].hereOnly));return i.forEach(e=>!o.includes(e)&&(e.disabled=!0)),e.pick=()=>r===void 0?void 0:{choice:r},e.first=H(e.el,[{opts:i,multiple:!1,answered:()=>r!==void 0}],()=>e.send),e.controls=o,[s(`pre`,{class:`ask-title`},K(t.select.title)),s(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":g()},...i),s(`div`,{class:`ask-acts`},e.send,e.cancel,a)]}function B(e,t){let n=t.questions.map(()=>({picks:new Set,text:s(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:D(),"aria-label":E()}),note:s(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:x(),"aria-label":b()})})),r=[],i=t.questions.map((t,i)=>{let a=n[i],o=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>L(o,e.title,[e.description,e.preview&&ee()],()=>{t.multiple||(a.picks.clear(),a.text.value=``),a.picks.has(n)?a.picks.delete(n):a.picks.add(n),c.forEach((e,t)=>e.setAttribute(`aria-checked`,String(a.picks.has(t)))),j()}));return a.text.oninput=()=>(t.multiple||(a.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),j()),e.controls.push(...c,a.text,a.note),r.push({opts:c,multiple:!!t.multiple,own:a.text,note:a.note,answered:()=>a.picks.size>0||a.text.value.trim()!==``}),s(`div`,{class:`ask-one`},t.header&&s(`b`,{class:`ask-head`},t.header),s(`p`,{class:`ask-q`,...t.question.length>W?{"data-long":``}:{}},t.question),s(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":w()},...c),a.text,a.note)});return e.pick=()=>n.every(e=>e.picks.size||e.text.value.trim())?{answers:n.map(e=>J(e.picks,e.text.value,e.note.value))}:void 0,e.first=H(e.el,r,()=>e.send),[...i,s(`div`,{class:`ask-acts`},e.send,e.cancel)]}function V(e){let t=e.asks??(e.ask?[e.ask]:[]),r=t.length>1,i=e.answer,a={copy:i?.select?.copy,key:$(e),el:s(`section`,{class:`ask`}),note:s(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};i&&((a.send=s(`button`,{type:`button`,class:`ask-send`},P())).onclick=()=>void(a.pick()&&I(a,Y(i,a.pick(),crypto.randomUUID()))));let l=e.tool===`secret_drop`;i&&!l&&Z(i,n)&&((a.cancel=s(`button`,{type:`button`,class:`ask-cancel`},c())).onclick=()=>void I(a,X(i,crypto.randomUUID())));let f=s(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${r?d():u()} ${r||!t[0]?``:U(t[0])}`.trim()),m=o&&e.tool!==`secret_drop`&&s(`button`,{type:`button`,class:`cmp-link`},p());m&&(m.onclick=o.show);let h=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[s(`p`,{class:`ask-why`},te({tool:e.tool}))]:[];return a.el.append(...h,...i&&!l?i.select?R(a,i):B(a,i):[...t.length?t.map(e=>G(e,r)):[s(`p`,{class:`ask-why`},l?n?M():N():e.why??z())],s(`div`,{class:`ask-acts`},l?s(`p`,{class:`ask-term`},u()):f,m)],a.note),a.cancel&&a.controls.push(a.cancel),a}let Q=(t,n)=>{let r=document.activeElement;h&&h!==n&&(h.focus=h.el.contains(r)?r:void 0),[m,h,S]=[t,n,n?.send?n:S],e.replaceChildren(...n?[n.el]:[]),n&&ie(n.el),j(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=h&&!h.done?h.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},cancel(){let e=h&&!h.done?h.cancel:void 0;return!!(e&&!e.disabled&&(e.click(),1))},sending:()=>O,update(e,t){C=t,e&&(k=void clearTimeout(k)),!e&&(h?.done||h?.sending)?k??=setTimeout(()=>(k=void 0,Q()),6e3):e?h&&($(e)===h.key||!e.answer&&(h.done||h.sending)&&e.callId===m?.callId)?((h.busy||h.sending)&&!e.answer?h.spell=!0:h.busy&&h.spell&&e.answer&&([h.done,h.busy]=[!1,!1],A(h.note,``,T())),m=e):Q(e,S?.key===$(e)&&!S.done?S:V(e)):Q(),j()}}}export{ae as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-4tVxZq34.js";import{n as t}from"./post-CmicYl-f.js";import{J as n}from"./index-ChNbuq3a.js";var r=e({joined:()=>a,outcome:()=>i,waitActions:()=>o}),i=e=>{let t=e.body.outcome;return t===void 0?e.status===504?`unknown`:e.ok&&(e.body.accepted===!0||Array.isArray(e.body.entries))?`accepted`:`refused`:t===`accepted`?`accepted`:t===`unknown`?`unknown`:`refused`},a=e=>e.replace(/^([A-Z])(?=[a-z])/,e=>e.toLowerCase()),o=(e,r)=>({tell:t=>r(`input`,{text:t,as:`send`,answers:e.id}),dismiss:()=>t(`${n(e.ws)}/memory`,{op:`drop`,id:e.id}),goto:{view:`session`,ws:e.ws,key:e.tower}});export{o as i,a as n,i as r,r as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-Brm9t2JN.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./runtime-ZX6HkxDa.js";import{i as t,n,r,t as i}from"./towerturns-C0Wg_fML.js";import{n as a,t as o}from"./markdown-DvbY97ID.js";import{F as s,R as c,Zt as l,b as u,d,dt as ee,lt as f,w as p}from"./index-ChNbuq3a.js";var te=((t={},n={})=>(n.locale??e())===`zh-TW`?`可能已被當機的 run 處理過:動手前先確認。`:`A run that crashed may already have handled this: check before acting.`),ne=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),re=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),m=e=>`context compacted · ${e?.tokens} tokens summarized`,h=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,ie=((t,n={})=>(n.locale??e())===`zh-TW`?h(t):m(t)),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),g=e=>`exit ${e?.code}`,_=e=>`結束碼 ${e?.code}`,oe=((t,n={})=>(n.locale??e())===`zh-TW`?_(t):g(t)),se=e=>`New chapter · ${e?.date} · ${e?.why}`,v=e=>`新的一章・${e?.date}・${e?.why}`,ce=((t,n={})=>(n.locale??e())===`zh-TW`?v(t):se(t)),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`第一次對話`:`the first conversation`),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`你要求開新對話`:`you asked for a new conversation`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`上一章太長了`:`the last one grew too large`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`上一章無法接續`:`the last one could not be resumed`),C=e=>`Image ${e?.n}`,w=e=>`圖片 ${e?.n}`,le=((t,n={})=>(n.locale??e())===`zh-TW`?w(t):C(t)),ue=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),T=e=>`${e?.count} image(s)`,E=e=>`${e?.count} 張圖片`,de=((t,n={})=>(n.locale??e())===`zh-TW`?E(t):T(t)),fe=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),O=e=>`${e?.count} new`,k=e=>`${e?.count} 則新訊息`,A=((t,n={})=>(n.locale??e())===`zh-TW`?k(t):O(t)),pe=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),me=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),he=((t={},n={})=>(n.locale??e())===`zh-TW`?`細節`:`details`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),ge=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),M=e=>`answer from ${e?.from}`,N=e=>`${e?.from} 的回答`,_e=((t,n={})=>(n.locale??e())===`zh-TW`?N(t):M(t)),P=e=>`request from ${e?.from}`,F=e=>`${e?.from} 的請求`,ve=((t,n={})=>(n.locale??e())===`zh-TW`?F(t):P(t)),I=e=>`message from ${e?.from}`,ye=e=>`${e?.from} 的訊息`,be=((t,n={})=>(n.locale??e())===`zh-TW`?ye(t):I(t)),L=e=>`reply to your ask from ${e?.from}`,R=e=>`${e?.from} 回覆了你的詢問`,xe=((t,n={})=>(n.locale??e())===`zh-TW`?R(t):L(t)),z=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),Se=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),Ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`本機`:`this computer`),we=((t={},n={})=>(n.locale??e())===`zh-TW`?`隊友`:`teammate`),B=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),Te=((t={},n={})=>(n.locale??e())===`zh-TW`?`sb server 的通知`:`notice from the sb server`),H=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),U=((t={},n={})=>(n.locale??e())===`zh-TW`?`Straw Link 訊息`:`Straw Link message`),Ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`喚醒鬧鐘`:`wake-up call`),De=((t={},n={})=>(n.locale??e())===`zh-TW`?`塔台事件`:`tower event`),Oe=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),W=e=>`Open image ${e?.n}`,G=e=>`打開圖片 ${e?.n}`,ke=((t,n={})=>(n.locale??e())===`zh-TW`?G(t):W(t)),K=e=>`show all (${e?.size})`,q=e=>`顯示全部(${e?.size})`,Ae=((t,n={})=>(n.locale??e())===`zh-TW`?q(t):K(t)),je=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),J=e=>`◇ thought · ${e?.count} chars`,Y=e=>`◇ 思考 · ${e?.count} 字元`,Me=((t,n={})=>(n.locale??e())===`zh-TW`?Y(t):J(t)),Ne=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),Pe=((t={},n={})=>(n.locale??e())===`zh-TW`?`這座塔台正在待命。有訊息進來時,sb server 會喚醒它跑一個 run;你在這裡送出的第一則訊息就會啟動它。`:`This tower stands by. The sb server wakes it for a run when a message arrives; your first message here starts that run.`),Fe=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),Ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function Le(){let e=!0,t=0;return{get pinned(){return e},scrolled(n){e=n,n&&(t=0)},hold:()=>void(e=!1),arrived(n){return e||(t+=n),e},jump:()=>void(e=!0,t=0),button:n=>e&&!n?void 0:t&&!n?A({count:t}):D()}}async function Re(e,t,n,r){let i=()=>e.items.some(e=>e.id===n);for(;!i()&&e.before;)r(e.prepend(await t.older(e.before)));return i()?!0:(r(e.reset(await t.latest())),!1)}function ze(e=600){let t=[],n,r=!1,i=new Set,a=new Map,o=new Map,s=e=>e.forEach(e=>(i.delete(e.id),e.tools?.forEach(e=>(o.delete(e.id),a.delete(e.id)))));function c(e,t){let n=[];for(let r of e)i.has(r.id)||(i.add(r.id),r.kind===`result`&&r.callId?(a.set(r.callId,r),o.has(r.callId)&&t.add(o.get(r.callId))):(r.tools?.forEach(e=>o.set(e.id,r.id)),n.push(r)));return n}let l=e=>({rebuild:!1,added:[],touched:[],dropped:[],front:!1,...e});return{get items(){return t},get before(){return n},get detached(){return r},result:e=>a.get(e),reset(e){return[t,n,r]=[[],e.before,!1],i.clear(),a.clear(),o.clear(),t=c(e.items,new Set),l({rebuild:!0,added:t})},append(i){if(r)return l({});let a=new Set,o=c(i,a);t.push(...o);let u=t.length>e?t.splice(0,t.length-e):[];return s(u),u.length&&(n=t[0].id),l({added:o,touched:[...a],dropped:u.map(e=>e.id)})},prepend(i){let a=new Set,o=c(i.items,a);t.unshift(...o),n=i.before;let u=t.length>e?t.splice(e):[];return s(u),u.length&&(r=!0),l({added:o,touched:[...a],dropped:u.map(e=>e.id),front:!0})}}}var Be=(e,t)=>({first:y,new:b,size:x,unreadable:S})[e??``]?.()??t??``,Ve=e=>e.head?l():p(e.role),He=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,Ue=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,We={intercom_message:ge,subagent_result:V,subagent_ping:B,subagent_status:H,"pi-loop-monitor":Se,"memory-context":z,"doc-review":j,"straw-tower":De,"straw-link":U},X=e=>{let t=u(`<span class="ava"><svg><use/></svg></span>`);return t.querySelector(`use`).setAttribute(`href`,`#i-${d[e]??e}`),t};function Ge(e){let t=[],n=0;for(let r of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))t.push(e.slice(n,r.index),f(`a`,{href:r[0],rel:`noopener noreferrer`,target:`_blank`},r[0])),n=r.index+r[0].length;return[...t,e.slice(n)]}function Z(l,u,{who:d,link:p,docFor:m}){let h=ze(),g=new Map,_=new Set,se=()=>_.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>m?.(e))):e.shown&&_.delete(e)),v=f(`div`,{class:`chat-list`}),y=f(`div`,{class:`chat-top`}),b=f(`div`,{class:`chat-live`}),x=f(`div`,{class:`chat-end`}),S=f(`button`,{class:`chat-pill`,type:`button`,hidden:``}),C=f(`p`,{class:`chat-empty`},pe()),w=f(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":re()},y,v,b,x);l.replaceChildren(w,S);let T=Le(),E=!1,D=!1,O,k,A=0,j=!1,M,N=()=>j||M!==void 0,P=()=>(clearTimeout(M),M=setTimeout(()=>(M=void 0,T.pinned&&!h.detached&&I()),250)),F=(e=T.button(h.detached))=>(S.hidden=!e,S.textContent=e??``),I=()=>(T.jump(),k=void 0,w.scrollTop=w.scrollHeight,F());async function ye(e){E=!0;let t=await Re(h,u,e,e=>(G(e),Y(e))).finally(()=>E=!1),n=g.get(e);if(O===e){if(!t||!n)return I();T.hold(),k=n,n.scrollIntoView({block:`center`}),ee(n,`lit`),clearTimeout(A),A=window.setTimeout(()=>(k=void 0,n.classList.remove(`lit`)),2e3),F()}}let L=()=>O?void ye(O):I(),R=(e,t,n,r)=>{e.disabled=!0,u.entry(n).then(n=>{let i=n&&r(n);if(i===void 0)return void(e.textContent=Fe());t.textContent=i,e.remove()},()=>e.textContent=Fe())};function z(e,t=0){if(!t||!u.pic)return null;let n=Array.from({length:t},(t,n)=>u.pic(e,n));return f(`div`,{class:`pics`},...n.map((e,t)=>{let r=f(`img`,{src:e,alt:le({n:t+1}),loading:`lazy`,decoding:`async`}),i=f(`button`,{type:`button`,class:`pic`,"aria-label":ke({n:t+1})},r);return r.addEventListener(`error`,()=>i.replaceWith(f(`em`,{class:`pic-gone`},ue()))),i.addEventListener(`click`,()=>void s(async()=>{let{lightbox:e}=await import(`./lightbox-DbDsVulC.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(n,t))),i}))}function Se(e,t){let n=h.result(e.id),r=f(`pre`,{class:`out`},n?.text??``),i=f(`pre`,{class:`args`},e.args??``),a=e.cut?f(`button`,{class:`more`,type:`button`},je()):null;a?.addEventListener(`click`,()=>R(a,i,t,t=>(e=>e&&`${e.args??``}${e.cut?`\n${ae()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let o=n?.more?f(`button`,{class:`more`,type:`button`},Ae({size:Ue(n.bytes??0)})):null;o?.addEventListener(`click`,()=>R(o,r,n.id,e=>e.text));let s=e.name===`show_doc`&&m?f(`button`,{class:`more open`,type:`button`,hidden:``},Oe()):null;s?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>m?.(e)?.()))),s&&_.add({paths:e.summary.split(`, `),button:s}),s&&queueMicrotask(se);let c=f(`details`,{class:`act`},f(`summary`,{"data-mark":n?n.isError?`error`:`done`:`working`},f(`b`,{class:`badge`}),f(`code`,null,e.name),f(`span`,{class:`sum`},e.summary),s),i,a,n&&f(`div`,{class:`result`},n.images?f(`em`,null,de({count:n.images})):null,r,o)),l=n&&z(n.id,n.images);return l?[c,l]:[c]}let B=e=>f(`time`,null,He(e.at)),V=(e,t,n,r)=>f(`article`,{class:`tx you`},f(`header`,null,B(e),f(`b`,null,Ie()),X(`user`)),f(`div`,{class:`bubble`,title:r},n?f(`small`,{class:`boss-flag`},te()):null,...Ge(t),z(e.id,e.images))),H=(e,t,n,r={})=>f(`article`,{class:`tx sys`},f(`details`,{class:`notice`},f(`summary`,null,X(`comms`),f(`em`,null,fe()),...t,B(e)),r.crashed?f(`small`,{class:`boss-flag`},te()):null,f(`pre`,null,n),r.raw?f(`details`,{class:`notice-raw`},f(`summary`,null,he()),f(`pre`,{class:`raw`},r.raw)):null)),U=e=>{let n=t(e);return[ge(),` `,n.name&&p(n.name)||n.name,n.id?` (${n.id})`:``,` · `,Ce()]},De=e=>e.kind===`link`?[{ask:ve,reply:xe,answer:_e,message:be}[e.what]({from:e.from}),` · `,we()]:e.kind===`intercom`?U(e.from):[e.kind===`server`?Te():Ee()];function W(t){switch(t.kind){case`user`:{let e=d().service?r(t.text):void 0;if(e)return H(t,e.kind===`intercom`?U(e.from):[e.kind===`server`?Te():Ee()],t.text??``);let n=d().service?i(t.text):void 0;return V(t,n?n.body:t.text??``,n?.crashed,n?t.text??``:``)}case`assistant`:{let e=d(),n=f(`pre`,{class:`thought-text`}),r=t.thought?f(`button`,{class:`thought`,type:`button`},t.thought<0?Ne():Me({count:t.thought.toLocaleString()})):null;return t.thought&&t.thought>0&&r?.addEventListener(`click`,()=>R(r,n,t.id,e=>e.thoughtText)),f(`article`,{class:e.head?`tx in head`:`tx in`},X(e.head?`crown`:e.role),f(`div`,{class:`tx-body`},f(`header`,null,f(`b`,null,Ve(e)),t.model?f(`span`,null,t.model):null,B(t),t.stop?f(`span`,{class:`stop`,"data-mark":`error`},t.stop):null),r,n,t.text?f(`div`,{class:`md`},o(a(t.text))):null,t.error?f(`p`,{class:`fault`},t.error):null,...(t.tools??[]).flatMap(e=>Se(e,t.id))))}case`bash`:return f(`article`,{class:`tx sys`},f(`details`,{class:`act`},f(`summary`,{"data-mark":t.exit?`error`:`done`},f(`b`,{class:`badge`}),f(`code`,null,`shell`),f(`span`,{class:`sum`},`! ${t.command}`),t.exit?f(`span`,{class:`stop`,"data-mark":`error`},oe({code:t.exit})):null),t.text?f(`pre`,{class:`out`},t.text):null));case`notice`:{let e=n(t);return e?.kind===`boss`&&d().service?V(t,e.body,e.crashed,t.text??``):e&&e.kind!==`boss`?H(t,De(e),e.body,e.kind===`link`?{raw:e.raw}:{crashed:e.crashed}):H(t,[We[t.type??``]?.()??t.type??me(),` `,t.from&&p(t.from)||(t.from??``)],t.text??``)}case`divider`:return t.type===`chapter`?f(`article`,{class:`tx rule chapter`},f(`p`,null,ce({date:t.at?new Date(t.at).toLocaleDateString(e(),{year:`numeric`,month:`short`,day:`numeric`}):``,why:Be(t.code,t.text)}))):f(`article`,{class:`tx rule`},f(`details`,null,f(`summary`,null,t.type===`compaction`?ie({tokens:(t.tokens??0).toLocaleString()}):ne()),f(`pre`,null,t.text??``)));default:return f(`article`,{class:`tx note`},t.text??``,` `,B(t))}}function G(e){e.rebuild&&(g.clear(),v.replaceChildren());for(let t of e.dropped)g.get(t)?.remove(),g.delete(t);let t=e.added.map(e=>(g.set(e.id,W(e)),g.get(e.id)));e.front?v.prepend(...t):v.append(...t),D&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),C.remove();let n=d().service;C.textContent=n?.state===`standing`&&!n.run?Pe():pe(),h.items.length||v.append(C),y.hidden=!h.before,J()}let K=[],q=new Map;function J(){let e=new Set;for(let t of K){let n=Date.parse(t.startedAt),r=h.items.findIndex(e=>e.at!==void 0&&Date.parse(e.at)>=n);if(r===0&&h.before)continue;let i=r<0?``:h.items[r].id,a=JSON.stringify([i,c(t)]),o=q.get(t.id);if(e.add(t.id),o&&o.sig===a&&o.el.isConnected)continue;o?.el.remove();let s=c(t),l=f(`article`,{class:`tx rule conv-rule`},f(`div`,null,f(`b`,null,s.title),s.ended?f(`small`,null,s.ended):null));q.set(t.id,{el:l,sig:a});let u=i?g.get(i):void 0;u?u.before(l):v.append(l)}for(let[t,n]of q)e.has(t)||(n.el.remove(),q.delete(t))}let Y=e=>e.touched.forEach(e=>{let t=g.get(e),n=h.items.find(t=>t.id===e);if(t&&n){let r=W(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),g.set(e,r)}}),Z=async()=>{if(!E&&h.before&&D){E=!0;try{let e=w.scrollHeight,t=h.prepend(await u.older(h.before));G(t),Y(t),w.scrollTop+=w.scrollHeight-e}finally{E=!1}h.before&&w.clientHeight&&y.getBoundingClientRect().bottom>=w.getBoundingClientRect().top&&Z()}};S.addEventListener(`click`,()=>{O=void 0,h.detached?u.latest().then(e=>(G(h.reset(e)),I())):I()});let Q=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void Z(),{root:w}),new IntersectionObserver(e=>w.clientHeight&&(T.scrolled(e.at(-1).isIntersecting),F()),{root:w,rootMargin:`0px 0px 67px`})],$,Ke=()=>($??(Q[0].observe(y),Q[1].observe(x)),clearTimeout($),$=setTimeout(()=>($=void 0,Q.forEach(e=>e.disconnect())),600));w.addEventListener(`scroll`,()=>(Ke(),!j&&M!==void 0&&P()),{passive:!0}),w.addEventListener(`touchstart`,()=>(j=!0,clearTimeout(M),M=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])w.addEventListener(e,()=>(j=!1,P()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])w.addEventListener(e,()=>k=O=void 0,{passive:!0});let qe=new ResizeObserver(()=>N()?void 0:T.pinned&&!h.detached?w.scrollTop=w.scrollHeight:k?.scrollIntoView({block:`center`}));return qe.observe(v),qe.observe(w),{log:w,docs:se,runs(e){JSON.stringify(e)!==JSON.stringify(K)&&(K=e,J())},apply(e){if(e.reset)G(h.reset({items:e.items??[],before:e.before})),D=!0,L();else if(e.items?.length){let t=h.append(e.items);G(t),Y(t),T.arrived(t.added.length)&&!h.detached&&!N()?I():F()}},reveal(e){O=e,D&&L()},setLive(e,t){b.dataset.mark=t,b.lastChild?.textContent!==e&&b.replaceChildren(...e?[f(`b`,{class:`badge`}),f(`span`,null,e)]:[])}}}export{Z as mountChat,le as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./runtime-ZX6HkxDa.js";import{t}from"./open_main_title-Ccbha5pD.js";import{n,t as r}from"./unit_count-DOYsRwLG.js";import{C as i,D as a,E as o,M as s,N as c,Qt as l,St as u,T as d,Zt as f,b as p,h as m,i as h,j as g,lt as _,m as v,o as ee,p as y,v as b,w as x}from"./index-ChNbuq3a.js";var te=((t={},n={})=>(n.locale??e())===`zh-TW`?`關閉清單`:`Close the list`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`切換到其他單位`:`Switch to a unit`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`回到主地圖`:`Back to the map`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`所有單位`:`All units`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`指揮中`:`commanding`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`已結束`:`ended`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`錯誤`:`error`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`閒置`:`idle`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`無狀態`:`unknown`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`等待`:`waiting`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`工作中`:`working`),M=.4;function N(e,t,n){let[r,i]=[Math.abs(e),Math.abs(t)];return Math.max(r,i)<10?`wait`:r>=1.7*i&&(n?e<0:e>0)?`drag`:`pass`}var P=(e,t,n)=>Math.abs(n)>=.45?n>0:e>=t*M,F=(e,t)=>t||e.some(e=>e.editable||e.sink||e.scrollsX||[`input`,`textarea`,`select`].includes(e.tag));function I(e){let t=e,n=getComputedStyle(e).overflowX;return{tag:e.tagName.toLowerCase(),editable:t.isContentEditable,sink:e.matches(`.composer, .term-sink`),scrollsX:(n===`auto`||n===`scroll`)&&e.scrollWidth>e.clientWidth+1}}var ne=e=>{let t=[];for(let n=e;n;n=n.parentElement)t.push(I(n));return t},L={working:j,waiting:A,idle:O,done:E,error:D,unknown:k,commanding:T},R=(e,t,n)=>(t?E:L[e])({},n&&{locale:n}),z=(e,t)=>t.flatMap(t=>[t,...t.subs.map(e=>({...e,sub:!0}))].map(t=>({id:t.key,key:t.key,ws:e,name:t.name,role:t.role,mark:t.mark,note:t.note,ended:!!t.ended,sub:`sub`in t,control:!!t.control})));function B(e){return e.bases.flatMap(e=>{let t=[{id:`tower`,rows:e.tower?z(e.id,[{...e.tower,role:`tower`}]):[]},...e.tabs.map(t=>({id:t.id,label:u({label:t.label}),rows:z(e.id,t.units)})),{id:`outside`,label:n(),rows:z(e.id,e.outside)}].filter(e=>e.rows.length);return t.length?[{id:e.id,label:e.label,mark:e.mark,groups:t}]:[]})}var V=(e,t)=>e?.head?{mark:e.head.mark,word:e.head.state===`absent`?l({},t&&{locale:t}):R(e.head.mark,!1,t)}:void 0,H=e=>e.role===`main`&&e.mark===`idle`,U=e=>e.reduce((e,t)=>(t.sub?e.at(-1)?.subs.push(t):e.push({...t,subs:[]}),e),[]),W=()=>p(`<div class="unit"><div class="card"><a class="hit"></a>${y}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><b class="dstate"></b><span class="note"></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button></div><div class="subs"></div></div>`),G=()=>p(`<div class="unit tower-row"><div class="trow"><a class="tower-go">${y}<span class="meta"><span class="name"></span><span class="line"><em class="role"></em><b class="dstate"></b></span></span></a><button type="button" class="pair-btn tower-add"></button></div><div class="subs"></div></div>`),K=()=>p(`<section class="dbase"><h3><a></a><small></small></h3><div class="dgroups"></div></section>`),q=()=>p(`<div class="dgroup"><h4></h4><div class="drows"></div></div>`),J=()=>matchMedia(`(max-width: 640px)`).matches;function Y(e=()=>!1){let n=_(`div`,{class:`drawer-body`}),l=_(`button`,{type:`button`,class:`x`,"aria-label":te()},`×`),u=_(`a`,{class:`drawer-map`},C()),y=_(`button`,{type:`button`,class:`pair-btn`,"data-close":`dismiss-all`,hidden:``}),T=_(`div`,{class:`drawer-sweep`,hidden:``},y);v(u,{view:`map`});let E=p(`<a class="drawer-head"><svg viewBox="0 0 512 512" aria-hidden="true"><use href="#i-crown"/></svg><span class="name"></span><b class="dstate"></b></a>`);E.hidden=!0,v(E,{view:`head`});let D=_(`aside`,{class:`drawer`,"aria-label":S()},_(`header`,null,_(`b`,null,w()),l),E,n,_(`footer`,{class:`drawer-foot`},T,u)),O=_(`div`,{class:`drawer-veil`});document.body.append(O,D);let k,A,j=!1,M=!1,I=0,L=0,z,Y=()=>{let e=V(k);E.hidden=!e,e&&(i(E,e.mark),a(E,`.name`,f()),a(E,`.dstate`,e.word),E.classList.toggle(`current`,j),E.toggleAttribute(`data-news`,h(k?.head,ee())&&!j)),c(y,k??{bases:[]}),T.hidden=y.hidden;let s=(e,t)=>{v(e.querySelector(`.hit`),{view:`session`,ws:t.ws,key:t.key}),e.querySelector(`.hit`).setAttribute(`aria-label`,`${t.name}: ${R(t.mark,t.ended)}`),e.classList.toggle(`current`,t.key===A),e.toggleAttribute(`data-dismiss`,t.role===`subagent`&&t.ended),e.dataset.key=t.key,i(e,t.mark),b(e.querySelector(`.plate`),t.role,t.mark),a(e,`.name`,t.name),a(e,`.role`,x(t.role)),a(e,`.dstate`,R(t.mark,t.ended)),d(e,`.note`,t.note,t.mark,t.note?void 0:``);let n=e.querySelector(`:scope > .card > .quit-btn`);H(t)?g(n,t):n.hidden=!0,o(e.querySelector(`.subs`),t.subs??[],W,s)},l=(e,n)=>{let r=e.querySelector(`.tower-go`),c=e.querySelector(`.tower-add`),l=k?.bases.find(e=>e.id===n.ws);v(r,{view:`session`,ws:n.ws,key:n.key}),r.setAttribute(`aria-label`,`${n.name}: ${R(n.mark,n.ended)}`),e.classList.toggle(`current`,n.key===A),e.dataset.key=n.key,i(e,n.mark),b(r.querySelector(`.plate`),`tower`,n.mark),a(r,`.name`,n.name),a(r,`.role`,x(`tower`)),a(r,`.dstate`,R(n.mark,n.ended)),c.hidden=!l,l&&(m(c,l),c.setAttribute(`aria-label`,t({base:l.label}))),o(e.querySelector(`.subs`),n.subs,W,s)};o(n,B(k??{bases:[]}),K,(e,t)=>{i(e,t.mark),a(e,`h3 a`,t.label),v(e.querySelector(`h3 a`),{view:`workspace`,ws:t.id}),a(e,`small`,r({count:t.groups.reduce((e,t)=>e+t.rows.length,0)})),o(e.querySelector(`.dgroups`),t.groups,q,(e,t)=>{a(e,`h4`,t.label??``),e.querySelector(`h4`).toggleAttribute(`hidden`,!t.label),t.id===`tower`?o(e.querySelector(`.drows`),U(t.rows),G,l):o(e.querySelector(`.drows`),U(t.rows),W,s)})})},X=e=>{I=Math.max(0,Math.min(L,e)),D.style.setProperty(`--dx`,`${I}px`),O.style.opacity=String(L?I/L:0),O.style.pointerEvents=I>0?`auto`:`none`},Z=e=>{M=e,D.classList.toggle(`on`,e),D.inert=!e,document.documentElement.classList.remove(`drawer-drag`),X(e?L:0)},Q=()=>{L=D.offsetWidth,Y(),D.classList.add(`on`),document.documentElement.classList.add(`drawer-drag`)};D.inert=!0,document.addEventListener(`touchstart`,t=>{let n=t.target,r=D.contains(n)||n===O;if(z=void 0,!J()||e()||t.touches.length!==1||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(M?!r:F(ne(n),!!getSelection()?.toString())))return;let i=t.touches[0],a=M?n.closest(`.unit[data-dismiss] > .card`)??void 0:void 0;z={x0:i.clientX,y0:i.clientY,mode:`wait`,was:M,base:I,last:i.clientX,at:performance.now(),v:0,card:a}},{passive:!0}),document.addEventListener(`touchmove`,e=>{if(!z||z.mode===`pass`)return;let t=e.touches[0],n=t.clientX-z.x0,r=t.clientY-z.y0;if(z.mode===`wait`){let e=N(n,r,z.was);if(e===`wait`)return;if(e===`pass`&&z.card&&N(n,r,!1)===`drag`)z.mode=`card`,z.card.classList.add(`swiping`);else if(e===`pass`)return void(z.mode=`pass`);else z.mode=`drag`,Q()}e.preventDefault();let i=performance.now();if(z.v=(t.clientX-z.last)/Math.max(1,i-z.at),[z.last,z.at]=[t.clientX,i],z.mode!==`card`)return X(z.base+n);let a=Math.max(0,n);z.card.style.setProperty(`--sx`,`${a}px`),z.card.style.setProperty(`--so`,String(1-a/z.card.offsetWidth))},{passive:!1});let re=(e,t)=>{e.classList.remove(`swiping`),e.style.removeProperty(`--sx`),e.style.removeProperty(`--so`),t&&(e.classList.add(`gone`),s({key:e.parentElement.dataset.key}).then(t=>t||e.classList.remove(`gone`)))},$=e=>{let t=z;z=void 0,t?.mode===`drag`&&Z(P(I,L,t.v)),t?.mode===`card`&&re(t.card,e.type===`touchend`&&P(Math.max(0,t.last-t.x0),t.card.offsetWidth,t.v))};return document.addEventListener(`touchend`,$),document.addEventListener(`touchcancel`,$),O.addEventListener(`click`,()=>Z(!1)),D.addEventListener(`click`,e=>e.target.closest(`a[data-route], button[data-open], .x`)&&Z(!1)),document.addEventListener(`keydown`,e=>M&&e.key===`Escape`&&(e.preventDefault(),Z(!1)),!0),document.addEventListener(`sb-drawer`,()=>(M||Q(),Z(!M))),{net(e){k=e,M&&Y()},route(e){A=e.view===`session`?e.key:void 0,j=e.view===`head`||e.view===`session`&&e.ws===`@head`,u.toggleAttribute(`aria-current`,e.view===`map`),M&&Y()}}}export{Y as mountDrawer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg:#16161e;--bg-2:#1a1b26;--surface-0:#1f2335;--surface-1:#24283b;--raised:#1f2335;--sunken:#16161e;--well:#16161e8c;--panel:#1f2335eb;--plate:#1a1b26;--plate-hi:#292e42;--term-bg:#16161e;--term-fg:#c0caf5;--line-c:#737aa2;--line:#737aa242;--hi:#fff;--shadow:#08080d;--text:#c0caf5;--dim:#868dba;--ink:#16161e;--accent:#7dcfff;--accent-hi:#b4e4ff;--working:#7dcfff;--gold:#e0af68;--amber:#ff9e64;--ok:#9ece6a;--err:#f7768e;--err-soft:#ff9fb0;--violet:#bb9af7;--idle:#737aa2;--unknown:#545c7e;--paper-hi:#f6e6b8;--paper:#d8bd78;--paper-ink:#3b2a06;--paper-edge:#8a6f33;--aura-1:color-mix(in srgb, var(--accent) 7%, transparent);--aura-2:color-mix(in srgb, var(--violet) 8%, transparent);--grid:linear-gradient(color-mix(in srgb, var(--line-c) 5%, transparent) 1px, transparent 1px) 0 0 / 44px 44px, linear-gradient(90deg, color-mix(in srgb, var(--line-c) 5%, transparent) 1px, transparent 1px) 0 0 / 44px 44px;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--sans:ui-rounded, "Avenir Next", "Trebuchet MS", system-ui, -apple-system, "Segoe UI", sans-serif}*{box-sizing:border-box;margin:0}html{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;-webkit-font-smoothing:antialiased;scrollbar-color:color-mix(in srgb, var(--line-c) 45%, transparent) transparent}::selection{background:color-mix(in srgb, var(--accent) 28%, transparent)}body{min-height:100vh;color:var(--text);font:14px/1.4 var(--sans);background:radial-gradient(1100px 640px at 12% -10%, var(--aura-1), transparent 62%), radial-gradient(900px 600px at 98% 8%, var(--aura-2), transparent 60%), linear-gradient(var(--bg), var(--bg-2));background-attachment:fixed}svg{display:block}[data-mark=working]{--c:var(--working)}[data-mark=waiting]{--c:var(--amber)}[data-mark=idle]{--c:var(--idle)}[data-mark=done]{--c:var(--ok)}[data-mark=error]{--c:var(--err)}[data-mark=unknown]{--c:var(--unknown)}[data-mark=commanding]{--c:var(--violet)}[data-mark]{--c1:color-mix(in srgb, var(--c) 13%, transparent);--c4:color-mix(in srgb, var(--c) 45%, transparent)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.shell{max-width:2200px;margin:0 auto;padding:14px 20px 32px}.hud{border:1px solid var(--line);background:var(--panel);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:5;border-radius:16px;flex-wrap:wrap;align-items:center;gap:8px 12px;padding:8px 12px;display:flex;position:sticky;top:8px}.brand{align-items:center;gap:12px;margin-right:8px;display:flex}.logo{width:36px;height:36px;color:var(--accent);background:radial-gradient(circle at 30% 25%, color-mix(in srgb, var(--accent) 30%, transparent), color-mix(in srgb, var(--bg-2) 90%, transparent));border:1px solid var(--line);border-radius:11px;place-items:center;display:grid}.logo svg{width:24px;height:24px;filter:drop-shadow(0 0 5px color-mix(in srgb, var(--accent) 70%, transparent))}.brand h1{letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;font-size:17px}.brand p{color:var(--dim);font-size:12px}.stats{background:color-mix(in srgb, var(--hi) 4%, transparent);border:1px solid color-mix(in srgb, var(--hi) 6%, transparent);border-radius:13px;gap:2px;padding:2px;display:flex}.stats div,.tally div,.alerts{background:color-mix(in srgb, var(--hi) 4%, transparent);border:1px solid color-mix(in srgb, var(--hi) 6%, transparent);border-radius:12px;min-width:0;padding:4px 10px}.stats dt,.tally dt{color:var(--dim);letter-spacing:.08em;text-transform:uppercase;font-size:10px}.stats dd,.tally dd{font:600 17px/1.15 var(--mono);font-variant-numeric:tabular-nums}.stats div{background:0 0;border-color:#0000;border-radius:10px;min-width:4.5em;padding:3px 10px}.tally dd{font-size:20px}.stats [data-mark] dd,.tally [data-mark] dd,.count b{color:var(--c)}.pair-btn{white-space:nowrap;border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);letter-spacing:.08em;text-transform:uppercase;cursor:pointer;background:0 0;border-radius:12px;padding:6px 10px}.tog{align-items:center;gap:6px;display:inline-flex}.tog:before{content:"";background:var(--line);border-radius:50%;flex:none;width:7px;height:7px}.tog[data-state=on]{color:var(--text);border-color:color-mix(in srgb, var(--accent) 35%, var(--bg))}.tog[data-state=on]:before{background:var(--accent);box-shadow:0 0 6px var(--accent)}.tog[data-state=ask]:before{background:var(--gold)}.tog[data-state=blocked]:before{background:var(--err)}.tog[data-state=done]{color:var(--text)}.tog[data-state=done]:before{background:var(--ok);box-shadow:0 0 6px var(--ok)}.tog[data-state=error]{color:color-mix(in srgb, var(--err-soft) 45%, var(--hi))}.tog[data-state=error]:before{background:var(--err);box-shadow:0 0 6px var(--err)}.alert-row{align-items:center;gap:10px;min-width:0;display:flex}.done-btn{white-space:nowrap;flex:none}.prefs-btn{place-items:center;width:34px;height:34px;margin-left:auto;padding:0;text-decoration:none;display:grid}.prefs-btn svg{fill:currentColor;width:18px;height:18px}.zen-back{display:none}html[data-zen-away][data-view=standard] .zen-back:not([hidden]){display:inline-block}body[data-route=settings] .zen-back{display:none!important}html[data-view=zen],html[data-view=zen] body{color:#ebe3d3;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;overscroll-behavior:none;background:#14110e}html[data-view=zen] :is(.shell,.dock),#zen[hidden]{display:none}html[data-view=zen] #zen:empty:not([hidden]){place-items:center;display:grid;position:fixed;inset:0}html[data-view=zen] #zen:empty:not([hidden]):after{content:"";aspect-ratio:1;box-sizing:border-box;opacity:.55;background:radial-gradient(circle,#96887424,#0000 70%);border:1px solid #857a6b;border-radius:50%;width:min(48vmin,320px);animation:10s infinite zen-breath;transform:scale(.72)}[data-view=zen][data-calm] #zen:empty:not([hidden]):after{animation:none}@keyframes zen-breath{0%{opacity:.55;animation-timing-function:ease-in-out;transform:scale(.72)}40%{opacity:1;animation-timing-function:ease-in-out;transform:scale(1)}to{opacity:.55;transform:scale(.72)}}.prefs-btn:hover,.prefs-btn[aria-current]{color:var(--text)}body:has(#remind[data-state=blocked]) .prefs-btn{color:var(--err-soft)}.menu,.menu-pop{display:contents}.menu-btn{display:none}.hud-pop{border:1px solid var(--line);background:var(--raised);color:var(--text);font:13px/1.4 var(--sans);box-shadow:0 12px 32px color-mix(in srgb, var(--shadow) 60%, transparent);border-radius:14px;margin:0;padding:12px;position:fixed;inset:auto}.done-pop{width:min(340px,100vw - 16px)}.done-pop ul{gap:2px;max-height:50vh;margin:0 0 10px;padding:0;list-style:none;display:grid;overflow:auto}.done-go{color:inherit;border-radius:10px;align-items:center;gap:10px;padding:6px 8px;text-decoration:none;display:flex}.done-go:hover,.done-go:focus-visible{background:color-mix(in srgb, var(--hi) 6%, transparent)}.done-go .plate{--s:30px;flex:none}.done-go .badge{display:none}.done-go span{min-width:0;display:grid}.done-go .name{font-weight:600}.done-go .name,.done-go small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.done-go small{color:var(--dim)}#done-clear{width:100%}.view-pick{gap:6px;display:grid}.view-pick>span{color:var(--text);font-size:14px}.view-pick>div{gap:4px;display:flex}.view-pick button{text-align:center;text-transform:none;letter-spacing:0;flex:1 1 0;justify-content:center;padding-inline:4px}.view-pick>div{flex-wrap:wrap}.view-pick[data-following] button[data-choice=auto]{flex-basis:100%}.view-pick button[aria-pressed=true]{color:var(--text);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 22%, transparent);font-weight:700}.lang{text-transform:none}.lang option{background:var(--bg);color:var(--text)}.pair{text-align:center;color:var(--dim);justify-items:center;gap:12px;font-size:13px;display:grid}.pair-code{color:var(--text);font:600 22px var(--mono);letter-spacing:.12em;-webkit-user-select:all;user-select:all}.qr{shape-rendering:crispedges;border-radius:12px;width:min(100%,300px)}.devices{text-align:left;border-top:1px solid var(--line);gap:8px;width:100%;padding-top:12px;display:grid}.devices h4{font:600 12px var(--sans);letter-spacing:.08em;text-transform:uppercase;margin:0}.devices ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.devices li{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:2px 10px;display:grid}.devices li small{overflow-wrap:anywhere;grid-column:1/-1}.devices li b{color:var(--text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.devices-head{justify-content:space-between;align-items:center;gap:10px;display:flex}.server-facts{grid-template-columns:max-content minmax(0,1fr);gap:6px 16px;margin:0 0 12px;display:grid}.server-facts dt{color:var(--dim);letter-spacing:.08em;text-transform:uppercase;font-size:11px}.server-facts dd{overflow-wrap:anywhere;min-width:0;margin:0}:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=hidden],[type=color]),select){box-sizing:border-box;border:1px solid var(--line);background:var(--surface-0);color:var(--text);font:14px var(--sans);border-radius:8px;padding:6px 10px}:where(input,select):focus-visible{outline:2px solid var(--accent);outline-offset:1px}:where(input,select):disabled{opacity:.5}.devices-acts{flex-wrap:wrap;gap:8px;display:flex}.devices small,.devices .chat-empty{color:var(--dim)}.pair-tabs{flex-wrap:wrap;justify-content:center;gap:6px;display:flex}.pair-tabs .later.on,.pair-tabs .later[aria-selected=true]{color:var(--text);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 22%, transparent);font-weight:700}.pair .lan{text-align:left;justify-items:start;gap:10px;width:100%;display:grid}.lan p,.lan h4,.lan ul{margin:0}.lan h4{color:var(--text);font:600 13px var(--sans)}.lan>*,.lan-main,.lan-board,.lan-pair{min-width:0;max-width:100%}.lan-main,.lan-board,.lan-pair{justify-items:start;gap:10px;width:100%;display:grid}.lan button,.lan a.go{text-transform:none}#lan-wait{text-transform:none;letter-spacing:normal;white-space:normal;text-align:left;flex:100%}.alert-row:has(#lan-wait:not([hidden])){flex-wrap:wrap}.lan .go{--c:var(--accent);text-align:left;white-space:normal;border:0}.lan .pair-btn{white-space:normal;text-align:left;max-width:100%}.lan .qr{justify-self:center}.lan-pair{text-align:center;justify-items:center}.lan-pair .devices-acts{justify-content:center}.lan code{overflow-wrap:anywhere}.lan-risk{color:var(--gold)}.lan details{max-width:100%}.lan summary{cursor:pointer;color:var(--text)}.lan details p{margin-top:6px}.lan-board{border:1px solid var(--gold);background:color-mix(in srgb, var(--gold) 6%, transparent);border-radius:12px;padding:10px}.lan-board:not([hidden]){display:grid}.lan-rows{gap:8px;width:100%;padding:0;list-style:none;display:grid}.lan-rows li{color:var(--text);justify-content:space-between;align-items:center;gap:10px;display:flex}.lan-rows li>button{white-space:nowrap;flex:none}.lan-rows li span{overflow-wrap:anywhere;min-width:0}.lan-ask{gap:6px;width:100%;display:grid}.lan-ask label{color:var(--text)}.lan-ask-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.lan-number{border:1px solid var(--line);background:var(--sunken);width:7ch;color:var(--text);font:600 20px var(--mono);letter-spacing:.2em;text-align:center;border-radius:10px;padding:7px 10px}.lan-no{color:var(--err-soft)}.lan-no:empty{display:none}.lan-note{gap:4px;display:grid}.lan-note:empty{display:none}.lan-info{color:var(--gold)}.lan-news li{color:var(--dim)}.lan-news{gap:4px;padding:0;list-style:none;display:grid}.lan-news:empty{display:none}.lan-fp{letter-spacing:.04em;-webkit-user-select:all;user-select:all;font-size:15px}.lan-fps{gap:6px;padding-left:18px;display:grid}.lan-hint{color:var(--dim);font-size:12px}.lan hr{border:0;border-top:1px solid var(--line);width:100%;margin:2px 0}.lan{overflow-wrap:anywhere}.lan-fps,.lan,.lan-main,.lan-board,.lan-pair,.pair,.devices{grid-template-columns:minmax(0,1fr)}.spawn-btns{flex-wrap:wrap;gap:8px;margin:12px 0 4px;display:flex}.base>.spawn-btns{margin:-4px 0 12px}.tab h3>span:not(.menu),.squad h3>b{white-space:nowrap;text-overflow:ellipsis;flex:0 auto;min-width:0;overflow:hidden}.tab h3>button{flex:none}.tab h3>span:not(.menu){flex-grow:1}.tab-add{white-space:nowrap;border:1px solid var(--line);color:var(--dim);font:600 11px var(--sans);letter-spacing:.08em;cursor:pointer;background:0 0;border-radius:10px;flex:none;margin-left:auto;padding:2px 8px}.squad .tab-add{margin-left:0}.tab-add:hover,.new-base:hover{color:var(--accent);border-color:var(--accent)}.quit-btn{border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);cursor:pointer;background:0 0;border-radius:8px;flex:none;margin-left:6px;padding:2px 9px}.quit-btn:hover{color:var(--err-soft);border-color:color-mix(in srgb, var(--err-soft) 40%, transparent)}.base>header .menu-pop>.quit-btn{align-self:flex-start;margin-left:auto}@media (hover:hover) and (pointer:fine){:is(.card>.quit-btn,.tab h3 .menu-pop>.quit-btn,.base>header .menu-pop>.quit-btn,.tower-quit){opacity:0;transition:opacity .15s}:is(.card:hover,.card:focus-within)>.quit-btn,:is(.tab h3:hover,.tab h3:focus-within) .menu-pop>.quit-btn,:is(.base>header:hover,.base>header:focus-within) :is(.quit-btn,.tower-quit){opacity:1}}#stashed-list li{align-items:center;gap:8px;display:flex}#stashed-list span{overflow-wrap:anywhere;flex:1}.card>.quit-btn{margin-left:auto}.card>.quit-btn,.base>header .menu-pop>.quit-btn,.base>header .menu-btn,.tower-quit{z-index:2;position:relative}.tower-quit{margin:6px 0 0}.sheet{border:1px solid var(--line);background:var(--raised);max-width:min(420px,100vw - 32px);color:var(--text);font:14px/1.5 var(--sans);border-radius:16px;margin:auto;padding:18px 20px}.sheet::backdrop{background:color-mix(in srgb, var(--shadow) 60%, transparent)}.sheet p{margin:0 0 14px}.sheet-row{justify-content:flex-end;gap:10px;display:flex}.sheet .later{cursor:pointer;border-radius:10px;padding:6px 14px}.sheet-yes{background:var(--err-soft);color:var(--ink);font:600 13px var(--sans);cursor:pointer;border:0;border-radius:10px;padding:6px 14px}.modes{flex:none;gap:4px;display:flex}.modes button{white-space:nowrap;border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);cursor:pointer;background:0 0;border-radius:999px;padding:4px 14px}.modes button[aria-pressed=true]{border-color:var(--accent);color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent)}.term-root{min-height:0;padding:10px 16px 14px}.term-root .term-tile{height:100%}.pics{flex-wrap:wrap;align-items:flex-start;gap:6px;margin-top:8px;display:flex}.pic{border:1px solid var(--line);background:var(--plate);cursor:zoom-in;border-radius:8px;max-width:100%;padding:0;line-height:0;overflow:hidden}.pic img{max-width:240px;max-height:180px;display:block}.pic-gone{color:var(--dim);font-size:12px}.lightbox{background:color-mix(in srgb, var(--bg) 94%, transparent);border:0;width:100vw;max-width:none;height:100dvh;max-height:none;margin:0;padding:0;overflow:auto}.lightbox[open]{place-items:center;display:grid}.lightbox::backdrop{background:0 0}.lightbox img{object-fit:contain;cursor:zoom-in;max-width:94vw;max-height:88dvh}.lightbox.zoom[open]{place-items:start}.lightbox.zoom img{cursor:zoom-out;max-width:none;max-height:none}.lightbox button{border:1px solid var(--line);background:var(--panel);width:44px;height:44px;color:var(--text);border-radius:50%;place-items:center;font-size:26px;line-height:1;display:grid;position:fixed}.lb-close{top:14px;right:14px}.lb-prev,.lb-next{top:calc(50% - 22px)}.lb-prev{left:14px}.lb-next{right:14px}.lb-count{color:var(--dim);font:13px var(--mono);position:fixed;bottom:14px;left:50%;transform:translate(-50%)}.queue-list{justify-items:end;gap:4px;margin:0 16px 6px;display:grid}.queue-list p{border:1px dashed color-mix(in srgb, var(--accent) 45%, transparent);max-width:min(80%,640px);color:var(--dim);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:12px;margin:0;padding:6px 12px;font-size:14px;line-height:1.45}.queue-list p>span{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.queue-list p[role=button]{cursor:pointer}.queue-list p[role=button]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.queue-list p[data-open]>span{display:block;overflow:visible}.queue-list b{color:var(--accent);letter-spacing:.06em;margin-right:8px;font-size:11px;font-weight:600}.queue-act{color:var(--dim);flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:4px 10px;margin:0 16px 6px;font-size:12px;line-height:1.4;display:flex}.queue-act[hidden],.queue-bar,.in-term .queue-list,.in-term .queue-act,.in-term .queue-bar{display:none}.todos{border:1px solid var(--line);background:var(--panel);border-radius:12px;margin:0 16px;padding:6px 12px;font-size:13px}.todos summary{cursor:pointer;align-items:baseline;gap:10px;min-width:0;list-style:none;display:flex}.todos summary::-webkit-details-marker{display:none}.todos summary b{color:var(--violet);flex:none;font-weight:600}.todos summary span{min-width:0;color:var(--dim);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.todos summary:after{content:"▸";color:var(--dim);margin-left:auto}.todos[open] summary:after{content:"▾"}.todos ol{gap:3px;max-height:30vh;margin:6px 0 2px;padding:0;list-style:none;display:grid;overflow-y:auto}.todos li{font:13px/1.5 var(--sans);margin:0}.todos li:before{content:"○";width:1.4em;color:var(--dim);display:inline-block}.todos li.in_progress{color:var(--accent)}.todos li.in_progress:before{content:"◐"}.todos li.completed{color:var(--dim);text-decoration:line-through}.todos li.completed:before{content:"✓";color:var(--ok)}.in-term .todos,.in-term .monitors{display:none}.monitors{border:1px solid var(--line);background:var(--panel);border-radius:12px;margin:6px 16px 0;padding:6px 12px;font-size:13px}.monitors summary{cursor:pointer;align-items:baseline;gap:10px;min-width:0;list-style:none;display:flex}.monitors summary::-webkit-details-marker{display:none}.monitors summary b{color:var(--accent);flex:none;font-weight:600}.monitors[data-failed=true] summary b{color:var(--err)}.monitors summary span{min-width:0;color:var(--dim);font:12px var(--mono);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.monitors summary:after{content:"▸";color:var(--dim);margin-left:auto}.monitors[open] summary:after{content:"▾"}.monitors ul{gap:6px;max-height:30vh;margin:6px 0 2px;padding:0;list-style:none;display:grid;overflow-y:auto}.monitors li{text-indent:-1.4em;gap:1px;padding-left:1.4em;display:grid}.monitors li b{overflow-wrap:anywhere;font-weight:500}.monitors li b:before{content:"◐";text-indent:0;width:1.4em;color:var(--accent);display:inline-block}.monitors li.done b:before{content:"✓";color:var(--ok)}.monitors li.stopped b:before{content:"■";color:var(--dim)}.monitors li.error b:before,.monitors li.stale b:before{content:"!";color:var(--err)}.monitors li.error small,.monitors li.stale small{color:var(--err)}.monitors li small{color:var(--dim);text-indent:0}.monitors li code{color:var(--dim);font:12px var(--mono);text-indent:0;overflow-wrap:anywhere}.new-base{border:1px dashed var(--line);min-height:96px;color:var(--dim);font:600 14px var(--sans);letter-spacing:.08em;cursor:pointer;background:0 0;border-radius:18px}.spawn .go{--c:var(--accent);border:0}.spawn{color:var(--dim);gap:10px;font-size:13px;display:grid}.spawn-at{flex-wrap:wrap;align-items:center;gap:8px;margin:0;display:flex}.spawn-path{color:var(--text);overflow-wrap:anywhere}.spawn textarea,.spawn input{box-sizing:border-box;border:1px solid var(--line);width:100%;color:var(--text);font:14px var(--sans);background:0 0;border-radius:8px;padding:8px 10px}.picker{gap:8px;min-width:0;display:grid}.picker-bar{align-items:center;gap:6px;min-width:0;display:flex}.picker-bar .later{font:13px var(--sans);cursor:pointer;border-radius:8px;flex:none;padding:4px 10px}.picker-bar .later:disabled{opacity:.4;cursor:default}.picker-crumbs{scrollbar-width:none;white-space:nowrap;flex:1;align-items:center;min-width:0;display:flex;overflow-x:auto}.picker-crumbs::-webkit-scrollbar{display:none}.picker-crumbs button{text-overflow:ellipsis;max-width:14em;color:var(--dim);font:13px var(--sans);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;padding:3px 6px;overflow:hidden}.picker-crumbs button:hover{color:var(--text);background:color-mix(in srgb, var(--accent) 8%, transparent)}.picker-crumbs button+button:before{content:"›";color:var(--dim);margin-right:6px}.picker-crumbs button[aria-current=true]{color:var(--text);font-weight:600}.picker input{box-sizing:border-box}.picker-body{border:1px solid var(--line);border-radius:10px;grid-template-columns:minmax(90px,130px) minmax(0,1fr);min-width:0;height:min(40vh,280px);min-height:170px;display:grid;overflow:hidden}.picker-places{background:color-mix(in srgb, var(--bg) 40%, transparent);border-right:1px solid var(--line);flex-direction:column;gap:2px;padding:6px;display:flex;overflow-y:auto}.picker-places button{color:var(--text);font:13px var(--sans);text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:5px 8px;overflow:hidden}.picker-places button:hover{background:color-mix(in srgb, var(--accent) 10%, transparent)}.picker-places b{color:var(--dim);font:600 11px var(--sans);letter-spacing:.08em;text-transform:uppercase;margin:8px 8px 2px}.picker-cols{outline-offset:-2px;min-width:0;display:flex;overflow:auto hidden}@media (prefers-reduced-motion:no-preference){.picker-cols,.pcol{scroll-behavior:smooth}}.pcol{width:var(--pw,176px);border-right:1px solid var(--line);flex-direction:column;flex:none;gap:1px;padding:4px;display:flex;overflow-y:auto}.pcol:last-child{border-right:0}.pitem{width:100%;color:var(--text);font:13px var(--sans);text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;padding:5px 8px;display:block;overflow:hidden}.pitem:hover{background:color-mix(in srgb, var(--accent) 8%, transparent)}.pitem[aria-selected=true]{background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--accent-hi)}.pcol[data-focus=true] .pitem[aria-selected=true]{background:color-mix(in srgb, var(--accent) 32%, transparent)}.pitem[aria-selected=true]:after{content:"›";float:right;opacity:.7}.pempty{color:var(--dim);margin:6px 8px;font-size:12px}.spawn-name{color:var(--dim);gap:4px;font-size:12px;display:grid}@media (width<=640px){.picker-body{grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr);height:min(52vh,360px)}.picker-places{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;align-items:center;overflow:auto hidden}.picker-places b{display:none}.picker-places button{flex:none;max-width:10em}.pcol:not(:last-child){display:none}.pcol{border-right:0;flex:1;width:auto}.pitem{padding:10px 12px}}.deploy{border:1px solid var(--line);background:color-mix(in srgb, var(--accent) 5%, transparent);color:var(--text);border-radius:14px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px 12px;padding:14px 16px;display:grid}.deploy>*{grid-column:1/-1;margin:0}.deploy>.deploy-bar{grid-column:1}.deploy>.deploy-count{grid-column:2}.deploy-title{font:600 15px var(--sans);letter-spacing:.04em;overflow-wrap:anywhere;align-items:center;gap:8px;display:flex}.deploy-title svg{width:24px;height:24px;color:var(--gold);filter:drop-shadow(0 0 5px color-mix(in srgb, var(--gold) 60%, transparent));flex:none}.deploy-bar{border:1px solid var(--line);background:color-mix(in srgb, var(--bg) 70%, transparent);border-radius:4px;height:14px;position:relative;overflow:hidden}.deploy-bar:after{content:"";background:repeating-linear-gradient(90deg, transparent 0 calc(5% - 2px), var(--bg-2,var(--bg)) calc(5% - 2px) 5%);position:absolute;inset:0}.deploy-fill{height:100%;width:calc(var(--done,0) / var(--of,1) * 100%);background:linear-gradient(90deg, var(--accent), var(--accent-hi), var(--accent)) 0 0 / 200% 100%;transition:width .7s cubic-bezier(.2,.8,.2,1),background-color .4s;display:block}.deploy[data-state=running] .deploy-fill{animation:1.8s linear infinite deploy-sheen}.deploy-count{font:600 13px var(--mono);color:var(--accent)}.deploy-steps{gap:6px;padding:0;list-style:none;display:grid}.deploy-steps li{color:var(--dim);grid-template-columns:1.6em minmax(0,1fr) auto;align-items:baseline;display:grid}.deploy-steps .deploy-mark:before{content:"·"}.deploy-steps [data-state=done]{color:var(--text)}.deploy-steps [data-state=done] .deploy-mark{color:var(--ok)}.deploy-steps [data-state=done] .deploy-mark:before{content:"✔"}.deploy-steps [data-state=active]{color:var(--text);font-weight:600}.deploy-steps [data-state=active] .deploy-mark{color:var(--accent);animation:1s ease-in-out infinite deploy-pulse}.deploy-steps [data-state=active] .deploy-mark:before{content:"▶"}.deploy-steps [data-state=failed]{color:var(--err-soft);font-weight:600}.deploy-steps [data-state=failed] .deploy-mark{color:var(--err)}.deploy-steps [data-state=failed] .deploy-mark:before{content:"✖"}.deploy-time{font:12px var(--mono);color:var(--dim)}.deploy-steps [data-state=active] .deploy-time{color:var(--accent)}.deploy-note{overflow-wrap:anywhere;font-size:13px;line-height:1.5}.deploy-note:empty{display:none}.deploy[data-state=failed]{border-color:color-mix(in srgb, var(--err) 55%, var(--line));background:color-mix(in srgb, var(--err) 8%, transparent)}.deploy[data-state=failed] .deploy-note{color:var(--err-soft)}.deploy[data-state=failed] .deploy-fill{background:var(--err)}.deploy[data-state=ready]{border-color:color-mix(in srgb, var(--ok) 60%, var(--line));animation:1.1s ease-out deploy-ready}.deploy[data-state=ready] .deploy-fill{background:var(--ok)}.deploy[data-state=ready] .deploy-note{color:var(--ok);letter-spacing:.08em;font-weight:600;animation:.6s ease-out deploy-rise}.deploy[data-state=ready] .deploy-title svg{animation:.7s ease-out deploy-hop}.deploy .later{justify-self:start;display:none}.deploy[data-state=failed] .later{display:inline-block}@keyframes deploy-sheen{to{background-position:-200% 0}}@keyframes deploy-pulse{50%{opacity:.3;transform:translate(2px)}}@keyframes deploy-ready{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--ok) 55%, transparent)}to{box-shadow:0 0 0 18px #0000}}@keyframes deploy-rise{0%{opacity:0;transform:translateY(6px)}}@keyframes deploy-hop{40%{transform:translateY(-5px)scale(1.2)}}.link{color:var(--dim);text-transform:uppercase;letter-spacing:.08em;align-items:center;gap:8px;padding:0 4px;font-size:12px;display:flex}.link span{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.link i{background:var(--unknown);border-radius:50%;width:9px;height:9px}.link[data-state=live] i{background:var(--ok);animation:2.4s ease-in-out infinite blink}.link[data-state=live]{color:var(--ok)}.link[data-state=reconnecting] i,.link[data-state=connecting] i{background:var(--amber);animation:1s ease-in-out infinite blink}.link[data-state=offline] i,.link[data-state=replaced] i{background:var(--err)}.banner{background:color-mix(in srgb, var(--idle) 16%, transparent);color:var(--text);border-radius:14px;margin:14px 0 0;padding:10px 16px;font-size:13px}.banner b{font-family:var(--mono);font-weight:600}.connect{z-index:100;box-sizing:border-box;background:color-mix(in srgb, var(--bg) 92%, transparent);width:100%;max-width:none;height:100%;max-height:none;color:var(--text);touch-action:none;overscroll-behavior:contain;border:0;margin:0;padding:24px;position:fixed;inset:0}.connect[open]{place-items:center;display:grid}.connect::backdrop{background:0 0}.connect-card{border:1px solid var(--line);background:var(--panel);text-align:center;border-radius:16px;justify-items:center;gap:16px;max-width:min(420px,100%);padding:24px 28px;display:grid}.connect-card p{margin:0;font-size:15px;line-height:1.5}.connect-ring{box-sizing:border-box;border:3px solid var(--line);border-top-color:var(--accent);border-radius:50%;width:34px;height:34px;animation:1.1s linear infinite spin}.connect:is([data-state=offline],[data-state=replaced]) .connect-ring{border-color:var(--err);animation:none}.connect-retry{min-height:44px;padding-inline:18px}.connect-reload{visibility:hidden;box-sizing:border-box;text-transform:none;letter-spacing:0;white-space:normal;justify-content:center;align-items:center;min-width:44px;min-height:44px;padding-inline:18px;text-decoration:none;animation:0s linear 10s forwards connect-reveal;display:inline-flex}@keyframes connect-reveal{to{visibility:visible}}[data-view=geek] .connect-ring{border-style:dashed}[data-view=geek] .connect:is([data-state=offline],[data-state=replaced]) .connect-ring{border-style:solid}.stage{grid-template-columns:minmax(0,1fr);align-items:start;gap:20px;margin-top:12px;transition:opacity .4s;display:grid}.stage[data-view=session]{grid-template-columns:minmax(0,1fr) 300px}.stage:not([data-view=session])>.side{display:none}.stage[data-stale=true] .map,body[data-stale=true] .stats{opacity:.4}.stage[data-stale=true] *{animation-play-state:paused!important}.map{border:1px solid var(--line);background:var(--grid), var(--well);border-radius:18px;min-height:420px;padding:20px;transition:opacity .4s;position:relative}.links{pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.wire{fill:none;stroke:color-mix(in srgb, var(--accent) 30%, transparent);stroke-width:1.5px;stroke-dasharray:3 7;stroke-linecap:round}.packets{pointer-events:none;position:absolute;inset:0;overflow:hidden}.packet{background:var(--accent);opacity:0;will-change:transform;border-radius:50%;width:6px;height:6px;transition:opacity .4s;animation:none;position:absolute;top:-3px;left:-3px}.packet[data-live]{opacity:.9;animation-play-state:running}.bases{grid-template-columns:repeat(auto-fill,minmax(min(100%,330px),1fr));grid-auto-rows:2px;align-items:start;gap:0 20px;display:grid;position:relative}.base{border:1px solid var(--line);background:linear-gradient(180deg, var(--surface-1), var(--surface-0));box-shadow:0 18px 40px color-mix(in srgb, var(--shadow) 35%, transparent);border-radius:16px;padding:14px;position:relative}.base[data-mark=waiting]{box-shadow:0 18px 40px color-mix(in srgb, var(--shadow) 35%, transparent), inset 0 0 0 999px color-mix(in srgb, var(--amber) 4%, transparent)}.base>header{align-items:center;gap:12px;margin-bottom:10px;display:flex;position:relative}.title{justify-items:start;min-width:0;margin-right:auto;display:grid}.title h2{white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:17px;overflow:hidden}.title p{max-width:100%;color:var(--dim);white-space:nowrap;text-overflow:ellipsis;font-size:12px;overflow:hidden}.crown{letter-spacing:.12em;text-transform:uppercase;color:var(--gold);background:color-mix(in srgb, var(--gold) 12%, transparent);border-radius:999px;align-items:center;gap:5px;margin-bottom:3px;padding:2px 9px 2px 6px;font-size:10px;display:inline-flex}.crown svg{width:14px;height:14px}.tower{width:64px;height:64px;color:var(--c);flex:none;place-items:center;display:grid;position:relative}.tower:before{content:"";background:radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--c) 24%, var(--plate-hi)), var(--plate) 70%);border:1px solid color-mix(in srgb, var(--c) 45%, transparent);border-radius:50%;position:absolute;inset:0}.tower svg{width:38px;height:38px;filter:drop-shadow(0 0 5px color-mix(in srgb, var(--c) 55%, transparent));position:relative}.tower.ghost{opacity:.45}.tower.ghost:before{border-style:dashed}.sweep,.pulse{opacity:0;pointer-events:none;border-radius:50%;position:absolute;inset:0}.sweep{background:conic-gradient(from 0deg, transparent 0 70%, color-mix(in srgb, var(--c) 55%, transparent) 100%)}.pulse{border:2px solid var(--c)}.tower[data-mark=working] .sweep{opacity:1;animation:3.2s linear infinite spin}.tower[data-mark=waiting] .pulse{animation:1.5s ease-out infinite ping}.tower>.badge{--s:36px;position:absolute;bottom:-3px;right:-3px}.tabs{gap:10px;display:grid}.tab{background:color-mix(in srgb, var(--hi) 2%, transparent);border:1px solid color-mix(in srgb, var(--hi) 5%, transparent);border-radius:14px;padding:8px}.tab h3{color:var(--dim);letter-spacing:.12em;text-transform:uppercase;align-items:center;gap:8px;margin-bottom:8px;font-size:11px;font-weight:600;display:flex}.units,.subs{gap:8px;display:grid}.outposts{gap:8px;margin-top:12px;display:grid}.outposts:empty{display:none}.outposts:before{content:attr(data-label);color:var(--dim);letter-spacing:.12em;text-transform:uppercase;font-size:11px}.card{background:color-mix(in srgb, var(--hi) 4%, transparent);border:1px solid color-mix(in srgb, var(--hi) 6%, transparent);border-radius:12px;align-items:center;gap:10px;padding:8px 10px;transition:background-color .4s;display:flex;position:relative}@media (hover:hover) and (pointer:fine){.card{transition:background-color .4s,border-color .2s,transform .18s cubic-bezier(.2,.8,.2,1),box-shadow .18s}.card:hover{border-color:color-mix(in srgb, var(--c,var(--line-c)) 40%, transparent);box-shadow:0 6px 18px color-mix(in srgb, var(--shadow) 55%, transparent);transform:translateY(-1px)}.base{transition:border-color .25s}.base:hover{border-color:color-mix(in srgb, var(--line-c) 36%, transparent)}.pair-btn,.tab-add,.quit-btn,.modes button,.later,.cmp-alt{transition:color .15s,border-color .15s,background-color .15s,transform .12s}.pair-btn:hover:not(:disabled){color:var(--text);border-color:color-mix(in srgb, var(--line-c) 50%, transparent);background:color-mix(in srgb, var(--hi) 4%, transparent)}}:is(.pair-btn,.tab-add,.quit-btn,.go,.later,.cmp-send,.cmp-alt,.ask-send,.ask-cancel,.sheet-yes,.new-base,.modes button,.pitem,.d-doc,.thought,.more,.tab-btn):active:not(:disabled){transform:scale(.97)}.unit[data-mark=waiting]>.card{background:color-mix(in srgb, var(--amber) 11%, transparent)}.unit[data-mark=error]>.card{background:color-mix(in srgb, var(--err) 11%, transparent)}.unit[data-mark=working]>.card{background:color-mix(in srgb, var(--c) 7%, transparent)}.unit[data-mark=commanding]>.card,.token[data-mark=commanding]{background:color-mix(in srgb, var(--violet) 9%, transparent)}.plate{width:var(--s,40px);height:var(--s,40px);color:var(--c);background:radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--c) 26%, var(--plate-hi)), var(--plate) 72%);border-radius:50%;flex:none;place-items:center;transition:color .4s;display:grid;position:relative}.plate svg{width:calc(var(--s,40px) * .55);height:calc(var(--s,40px) * .55)}.ring,.plate:after{pointer-events:none;border-radius:50%;position:absolute;inset:-3px}.ring{opacity:0;background:conic-gradient(from 0deg, transparent 0 55%, var(--c));-webkit-mask:radial-gradient(farthest-side, transparent calc(100% - 3px), var(--shadow) calc(100% - 2px));mask:radial-gradient(farthest-side, transparent calc(100% - 3px), var(--shadow) calc(100% - 2px))}.plate[data-mark=working]>.ring{opacity:1;animation:1.1s linear infinite spin}.plate:after{content:"";border:2px solid var(--c);opacity:0}.plate[data-mark=waiting]:after{animation:1.5s ease-out infinite ping}.badge{width:clamp(16px, calc(var(--s,40px) * .3), 24px);height:clamp(16px, calc(var(--s,40px) * .3), 24px);font:700 10px/1 var(--mono);color:var(--ink);background:var(--c);border-radius:50%;flex:none;place-items:center;transition:background-color .4s;display:grid}.plate>.badge{position:absolute;bottom:-4px;right:-4px}[data-mark=waiting]>.badge:after{content:"?"}[data-mark=idle]>.badge:after{content:"z"}[data-mark=done]>.badge:after{content:"✓"}[data-mark=error]>.badge:after{content:"!"}[data-mark=unknown]>.badge:after{content:"·"}[data-mark=commanding]>.badge:after{content:"◈"}[data-mark=working]>.badge:after{content:"";border:2px solid var(--ink);border-right-color:#0000;border-radius:50%;width:8px;height:8px;animation:.8s linear infinite spin}[data-mark=waiting]>.badge{animation:1.2s ease-in-out infinite hop}.meta{min-width:0;display:grid}.name{white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.line{color:var(--dim);align-items:baseline;gap:8px;min-width:0;font-size:12px;display:flex}.role{white-space:nowrap;letter-spacing:.1em;text-transform:uppercase;color:color-mix(in srgb, var(--c) 70%, var(--dim));flex:none;font-size:10px;font-style:normal}.note{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}[data-monitoring]{color:var(--err);font-weight:600}.unit[data-mark=idle]>.card{opacity:.85}.subs{margin:6px 0 0 22px;padding-left:18px;position:relative}.subs:empty{display:none}.base>.tower-subs{margin:-8px 0 12px 22px}.base>.tower-notices:empty{display:none}.base>.tower-notices{gap:6px;min-width:0;margin:0 0 12px 22px;display:grid}.tower-notices .tnote{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;margin:0;font-size:.85em;display:flex}.tower-notices .tnote span{overflow-wrap:anywhere;flex:14em;min-width:0}.tower-notices .tnote.error span{color:var(--err-soft)}.tower-notices .tnote.warning span{color:var(--gold)}.tower-notices .tnote .tnote-fail{color:var(--err-soft);flex:100%;font-size:.95em}.tower-notices .tnote .tnote-fail:empty{display:none}.tower-notices .tnote button:disabled{opacity:.6;cursor:progress}.wait-panel{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;margin-top:8px;display:flex}.wait-text{overflow-wrap:anywhere;flex:100%;margin:0}.wait-panel .tnote-fail{color:var(--err-soft);flex:100%;font-size:.95em}.wait-panel .tnote-fail:empty,.wait-panel .pair-btn[hidden]{display:none}.dialog[data-wait] .go{border:1px solid var(--line);color:var(--text);background:0 0}.dialog[data-wait] .wait-go{background:var(--accent);color:var(--ink);border:0}.tower-notices .tnote .wait-panel{flex:100%;margin-top:0}.wait-form{flex:100%;gap:4px;min-width:0;margin:0;display:grid}.wait-form[hidden]{display:none}html:not([data-view=zen]) .wait-box{box-sizing:border-box;resize:none;border:1px solid var(--line);background:var(--sunken);width:100%;min-height:44px;color:var(--text);font:14px/1.4 var(--sans);border-radius:12px;padding:9px 12px}@supports (field-sizing:content){html:not([data-view=zen]) .wait-box{field-sizing:content;max-height:220px}}html:not([data-view=zen]) .wait-box:focus{border-color:color-mix(in srgb, var(--accent) 50%, transparent);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent);outline:none}.wait-note{color:var(--err-soft);margin:0;font-size:.95em}.wait-note:empty{display:none}.tower-notes{margin:0 16px 8px}.tower-notes:has(>.tower-notices:empty):not(:has(>.tower-memory:not([hidden]))):not(:has(>.tower-conv:not([hidden]))):not(:has(>.head-asks:not([hidden]))):not(:has(>.head-absent:not([hidden]))){display:none}.tower-notes .tower-notices{gap:6px;min-width:0;display:grid}.base:not(.ally)>header .title p{white-space:normal;flex-wrap:wrap;align-items:center;gap:2px 0;display:flex;overflow:visible}.title .tqueue{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);color:var(--accent);white-space:nowrap;border-radius:999px;margin-left:8px;padding:0 7px;font-size:11px}.title .tqueue:empty{display:none}.allies{flex-wrap:wrap;align-items:center;gap:4px 8px;margin-top:6px;font-size:.85em;display:flex}.allies[hidden]{display:none}.allies b{color:var(--dim);font-weight:600}.ally-chip{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);color:var(--accent);white-space:nowrap;border-radius:999px;padding:0 8px;font-size:11px;text-decoration:none}a.ally-chip:hover{background:color-mix(in srgb, var(--accent) 14%, transparent)}.zoom-in>.tower-notices:empty{display:none}.zoom-in>.tower-notices{gap:6px;min-width:0;margin:12px 0;display:grid}.term-hold{border:1px dashed var(--line);color:var(--dim);border-radius:12px;margin:16px;padding:14px 16px;line-height:1.5}.subs:before{content:"";background:repeating-linear-gradient(color-mix(in srgb, var(--line-c) 50%, transparent) 0 4px, transparent 4px 8px);width:1px;position:absolute;top:-4px;bottom:22px;left:3px}.subs>.unit>.card:before{content:"";background:repeating-linear-gradient(90deg, color-mix(in srgb, var(--line-c) 50%, transparent) 0 4px, transparent 4px 8px);width:15px;height:1px;position:absolute;top:50%;left:-15px}.subs>.unit{position:relative}.subs>.unit>.card:after{content:"";border:3px solid #0000;border-left:4px solid color-mix(in srgb, var(--line-c) 60%, transparent);pointer-events:none;position:absolute;top:calc(50% - 3px);left:-5px}.subs>.unit:is([data-mark=working],[data-mark=commanding])>.card:before{animation:.8s linear infinite flow-x}.subs:has(>.unit:is([data-mark=working],[data-mark=commanding])):before{animation:.8s linear infinite flow-y}@keyframes flow-x{to{background-position:8px 0}}@keyframes flow-y{to{background-position:0 8px}}.subs .plate{--s:30px}.subs .name{font-size:13px}.side{top:calc(var(--hud,64px) + 20px);gap:16px;display:grid;position:sticky}.panel{border:1px solid var(--line);background:var(--panel);border-radius:18px;padding:14px 16px}.panel h2{color:var(--dim);letter-spacing:.14em;text-transform:uppercase;margin-bottom:10px;font-size:11px}.timeline summary{cursor:pointer;align-items:baseline;gap:10px;min-width:0;list-style:none;display:flex}.timeline summary::-webkit-details-marker{display:none}.timeline summary:after{content:"▾";color:var(--dim);margin-left:8px;transition:transform .2s}.timeline:not([open]) summary:after{transform:rotate(-90deg)}.timeline h2{flex:none;margin:0}.tl-at{color:var(--dim);font:11px var(--mono);flex:none}.tl-last{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:12.5px;overflow:hidden}.tl-span{color:var(--dim);flex:none;margin-left:auto;font-size:11px}.tl-lanes{border-top:1px dashed var(--line);height:46px;margin-top:8px;position:relative}.tl-lanes:after{content:"";background:var(--accent);width:2px;box-shadow:0 0 8px color-mix(in srgb, var(--accent) 60%, transparent);border-radius:1px;position:absolute;top:0;bottom:0;right:0}.tl-mark{width:10px;height:10px;margin-left:-5px;position:absolute}.tl-mark:before{content:"";background:var(--c);border-radius:2px;position:absolute;inset:1px}.tl-mark:is([data-mark=waiting],[data-mark=error],[data-mark=commanding]):before{transform:rotate(45deg)}.tl-mark:is([data-mark=done],.joined,.left):before{border-radius:50%}.tl-mark.left:before{box-shadow:inset 0 0 0 1.5px var(--c);background:0 0}.tl-mark:hover:before,.tl-mark:focus-visible:before{box-shadow:0 0 0 3px color-mix(in srgb, var(--c) 35%, transparent)}.tl-mark:focus-visible{outline:none}.tl-mark:hover:after,.tl-mark:focus-visible:after{content:attr(aria-label);z-index:1;border:1px solid var(--line);background:var(--raised);color:var(--text);font:12px var(--sans);white-space:nowrap;box-shadow:0 6px 16px color-mix(in srgb, var(--shadow) 60%, transparent);border-radius:8px;padding:4px 8px;position:absolute;bottom:calc(100% + 8px);left:-6px}.tl-mark.end:hover:after,.tl-mark.end:focus-visible:after{left:auto;right:-6px}.tl-axis{color:var(--dim);font:10px var(--mono);justify-content:space-between;margin-top:4px;display:flex}.line .age{color:var(--dim);font:10.5px var(--mono);opacity:.85;flex:none}.line .age:empty{display:none}.line .age:before{content:"· "}.unit[data-mark=waiting]>.card .age,.title .age{color:var(--amber);opacity:1}.title .age{color:var(--dim)}.title .age:not(:empty):before{content:" · "}.todo{align-items:baseline;gap:6px;min-width:0;font-size:11.5px;display:flex}.todo b{color:var(--violet);font:600 10.5px var(--mono);flex:none}.todo span{white-space:nowrap;text-overflow:ellipsis;opacity:.85;min-width:0;overflow:hidden}.todo span:empty{display:none}.ticks{pointer-events:none;gap:3px;height:3px;display:flex;position:absolute;bottom:3px;left:52px;right:12px}.ticks:empty{display:none}.ticks i{background:var(--c);opacity:calc(.25 + .65 * var(--o,1));border-radius:1px;flex:0 0 6px}.card.ticked{padding-bottom:11px}.subs .ticks{left:44px}.minimap{z-index:4;box-sizing:content-box;border:1px solid var(--line);background:var(--panel);opacity:.65;cursor:pointer;border-radius:10px;padding:6px;transition:opacity .2s;position:fixed;bottom:20px;right:20px}.minimap:hover{opacity:1}body:has(.tile) .minimap{opacity:0;pointer-events:none}body:has(.tile-layer:not([hidden])) .minimap{opacity:0;pointer-events:none}.minimap.away{opacity:0;pointer-events:none}.mm-in{position:absolute;inset:6px}.mm-in i{background:color-mix(in srgb, var(--c) 35%, var(--surface-1));border-radius:2px;position:absolute}.mm-view{border:1px solid var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent);pointer-events:none;border-radius:3px;position:absolute;top:6px;left:4px;right:4px}.credit{color:var(--dim);padding:0 6px;font-size:11px}.bar{flex-wrap:wrap;align-items:center;gap:6px 16px;margin:12px 6px 0;display:flex}.bar-acts{align-items:center;gap:8px;display:flex}.bar-acts .pair-btn{border-radius:10px;padding:3px 9px;font-size:11px}.legend{color:var(--dim);flex-wrap:wrap;gap:4px 14px;margin:0 0 0 auto;padding:0;font-size:11px;list-style:none;display:flex}.legend li{align-items:center;gap:6px;display:flex}.legend .badge{width:13px;height:13px;font-size:8px}.foot{grid-template-columns:minmax(0,1fr);gap:10px;margin-top:14px;display:grid}.foot .credit{opacity:.75}.enter{animation:.5s cubic-bezier(.2,.9,.3,1.15) both pop}.leaving{pointer-events:none;animation:.35s ease-in both out}.flash>.card>.plate,.flash.tower{animation:.6s ease-out flash}.flash>.card{animation:.9s ease-out card-glow}.flash.flip>.card{animation-name:card-glow-b}.flash.flip>.card>.plate,.flash.flip.tower,.flash.flip.token>.plate{animation-name:flash-b}@keyframes spin{to{transform:rotate(360deg)}}@keyframes glow{0%,to{box-shadow:0 0 5px 0 var(--c4)}50%{box-shadow:0 0 16px 4px var(--c)}}.plate[data-mark=commanding]:before,.tower[data-mark=commanding]:after{content:"";pointer-events:none;border-radius:50%;animation:2.4s ease-in-out infinite glow;position:absolute;inset:-2px}.stats [data-mark=commanding][data-on],.comms-head[data-mark=commanding] .logo{border-color:var(--c4);animation:2.4s ease-in-out infinite glow}.comms-head[data-mark=commanding] .logo{color:var(--c)}.comms-head[data-mark=commanding] h2 span{color:var(--c);text-shadow:0 0 10px var(--c4)}@keyframes ping{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.7)}}@keyframes hop{50%{transform:translateY(-3px)}}@keyframes blink{50%{opacity:.35}}@keyframes pop{0%{opacity:0;transform:scale(.92)translateY(8px)}}@keyframes pop-b{0%{opacity:0;transform:scale(.92)translateY(8px)}}@keyframes out{to{opacity:0;transform:scale(.94)}}@keyframes out-b{to{opacity:0;transform:scale(.94)}}@keyframes flash{40%{transform:scale(1.12)}}@keyframes card-glow{30%{box-shadow:0 0 0 1px var(--c4), 0 0 18px 1px var(--c4)}}@keyframes card-glow-b{30%{box-shadow:0 0 0 1px var(--c4), 0 0 18px 1px var(--c4)}}@keyframes flash-b{40%{transform:scale(1.12)}}@keyframes slide{0%{opacity:0;transform:translate(10px)}}@keyframes slide-b{0%{opacity:0;transform:translate(10px)}}@keyframes zoom{0%{opacity:0;transform:scale(.45)}}@keyframes zoom-b{0%{opacity:0;transform:scale(.45)}}@keyframes come-in{0%{opacity:0;transform:translate(-14px)scale(.98)}}@keyframes go-out{0%{opacity:0;transform:translate(14px)scale(.98)}}.tx.fresh{animation:.32s cubic-bezier(.2,.8,.2,1) both come-in}.tx.you.fresh{animation-name:go-out}:is([data-calm],[data-view=geek]) :is(.link i,.sweep,.pulse,.ring,.badge,.term-typing,.connect-ring),:is([data-calm],[data-view=geek]) :is(.plate,.badge):after{animation:none!important}:is([data-calm],[data-view=geek]) .tower[data-mark=waiting] .pulse{opacity:.55}:is([data-calm],[data-view=geek]) .plate[data-mark=waiting]:after{opacity:.55;transform:scale(1.25)}:is([data-calm],[data-view=geek]) .packet{opacity:0;animation-play-state:paused!important}:is([data-calm],[data-view=geek]) .subs:before,:is([data-calm],[data-view=geek]) .subs>.unit>.card:before{animation:none!important}@media (prefers-reduced-motion:reduce),(hover:none) and (prefers-reduced-motion:reduce){.plate[data-mark=commanding]:before,.tower[data-mark=commanding]:after{box-shadow:0 0 12px 3px var(--c4)}.stats [data-mark=commanding][data-on],.comms-head[data-mark=commanding] .logo{box-shadow:0 0 12px 2px var(--c4)}}:is([data-calm],[data-view=geek]) :is(.plate,.tower)[data-mark=commanding]:before,:is([data-calm],[data-view=geek]) .tower[data-mark=commanding]:after{box-shadow:0 0 12px 3px var(--c4);animation:none!important}[hidden]{display:none!important}a{color:inherit}.crumbs,.tally dt,.comms-head small,.tx.you>header,.notice em,.rule summary,.dossier-in>.tag,.d-drones h4,.d-docs h4,.specs dt,.stop,.dialog .tag,.intel h4,.pending b{color:var(--dim);letter-spacing:.14em;text-transform:uppercase;font-size:11px;font-style:normal}.token .name,.drone .note,.count small,.sum,.where,.tile b{white-space:nowrap;text-overflow:ellipsis;max-width:100%;overflow:hidden}.md a,.bubble a,.notice a,.d-note a,.specs a,.crumbs a{color:var(--accent)}.crumbs{gap:10px;min-width:0;display:flex}.crumbs>*+:before{content:"›";opacity:.5;margin-right:10px}.crumbs>*{white-space:nowrap;text-overflow:ellipsis;letter-spacing:.06em;flex:0 auto;min-width:0;max-width:28ch;overflow:hidden}.crumbs>:last-child{flex:auto;max-width:none}.crumb-more{cursor:pointer;color:var(--accent);display:none}.crumbs a,.brand{text-decoration:none}.work{align-items:flex-start;gap:20px;min-width:0;display:flex;position:relative}.gauge{visibility:hidden;height:0;position:absolute;left:0;right:0}.view{flex:1 1 0;min-width:0}body[data-stale=true] .work{opacity:.45}.enter-zoom{transform-origin:var(--ox,50%) var(--oy,0);animation:.5s ease-out both zoom}.enter-slide,.dossier{animation:.4s ease-out both slide}.enter-back{animation:.4s ease-out both pop}.enter-zoom.flip{animation-name:zoom-b}.enter-slide.flip{animation-name:slide-b}.enter-back.flip{animation-name:pop-b}.hit,.enter-base:after{z-index:1;border-radius:inherit;position:absolute;inset:0}.enter-base:after{content:"";z-index:0}.hit:hover{box-shadow:inset 0 0 0 1px var(--c)}.enter-base{text-decoration:none}.base>header:hover h2{color:var(--accent)}.alerts{width:210px;color:inherit;font:inherit;text-align:left;cursor:pointer;align-items:center;gap:10px;display:flex;position:relative}.alerts:disabled{cursor:default;opacity:.6}.alerts:not(:disabled){border-color:var(--c4);background:var(--c1)}.faces{flex:none;padding-left:10px;display:flex}.faces .plate{--s:28px;box-shadow:0 0 0 2px var(--raised);margin-left:-10px}.faces .badge{display:none}.count{min-width:0;display:grid}.count b{font:600 18px/1.1 var(--mono)}.count small,.comms-head p,.cmp-note,.where,.queued,.d-line,.who p{color:var(--dim);font-size:12px}.token{border:1px solid #0000;border-radius:16px;justify-items:center;gap:3px;width:100%;padding:10px 8px 9px;text-decoration:none;display:grid;position:relative}a.token:hover{border-color:var(--c4)}.token[data-mark=waiting]{background:color-mix(in srgb, var(--amber) 11%, transparent)}.token[data-mark=error]{background:color-mix(in srgb, var(--err) 11%, transparent)}.token .plate{--s:64px;margin-bottom:4px}.token .name{font-weight:600}.token .line{justify-items:center;max-width:100%;display:grid}.drone{width:94px;padding:6px;font-size:12px}.drone .plate{--s:44px}.drone .role{display:none}.agent{letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--c4);color:var(--dim);border-radius:8px;margin-left:4px;padding:0 5px;font-size:9px;font-style:normal}.agent:empty,.drone .agent{display:none}.flash.token>.plate{animation:.6s ease-out flash}.zoom-in,.comms-in{border:1px solid var(--line);background:var(--grid), var(--well);border-radius:22px;position:relative}.zoom-in{min-height:420px;padding:24px}.zoom-in.void>:not(.lost){display:none}.lost,.chat-empty{color:var(--dim);text-align:center;padding:60px 0}.keep{align-items:center;gap:20px;padding:18px 22px;display:flex}.keep h2{font-size:24px}.tower.big{width:120px;height:120px}.tower.big svg{width:72px;height:72px}.tower.big>.badge{--s:96px;bottom:4px;right:4px}a.tower:hover:before{border-color:var(--c)}.tally{gap:10px;display:flex}.squads,.camps{grid-template-columns:repeat(auto-fit,minmax(min(100%,430px),1fr));align-items:start;gap:18px;margin-top:20px;display:grid}.squad{background:color-mix(in srgb, var(--surface-0) 78%, transparent);padding:14px 16px 18px}.squad[data-mark=waiting]{background:color-mix(in srgb, var(--amber) 7%, var(--surface-0))}.squad h3{align-items:center;gap:10px;margin-bottom:14px;display:flex}.squad h3 b,.crumbs b{color:var(--text)}.squad h3 small{margin-left:auto}.squad h3 svg{width:18px;height:18px}.flag{background:var(--c);width:10px;height:10px;box-shadow:0 0 8px var(--c);border-radius:2px;transform:rotate(45deg)}.formation{flex-wrap:wrap;align-items:flex-start;gap:16px 20px;display:flex}.col{justify-items:center;gap:8px;width:196px;display:grid}.say{background:var(--raised);width:100%;color:var(--dim);border-radius:12px;margin-top:4px;padding:7px 10px;font-size:12px;line-height:1.35}.say p{overflow-wrap:anywhere;max-height:4.05em;overflow:hidden}.drones{flex-wrap:wrap;justify-content:center;gap:8px;width:100%;padding-top:16px;display:flex;position:relative}.drones:empty{display:none}.tower-drones{justify-content:flex-start;margin-top:-8px;padding-left:35px}.drones.tower-drones:before{left:82px}.drones:before{content:"";background:repeating-linear-gradient(color-mix(in srgb, var(--line-c) 60%, transparent) 0 4px, transparent 4px 8px);width:1px;height:14px;position:absolute;top:0;left:50%}.camp .token{width:156px}[data-group=outside] .plate{filter:saturate(.3);outline:1px dashed color-mix(in srgb, var(--dim) 55%, transparent);outline-offset:4px}.comms-in{grid-template-columns:minmax(0,1fr)}.comms-in,.tile{height:calc(var(--vvh,100vh) - var(--hud,64px) - 64px);grid-template-rows:auto minmax(0,1fr) auto;min-height:380px;display:grid;overflow:hidden}.comms-head,.tile>header{background:var(--panel);align-items:center;gap:12px;padding:12px 18px;display:flex}.ava{width:30px;height:30px;color:var(--accent);background:radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--accent) 28%, transparent), var(--plate) 72%);border-radius:50%;flex:none;place-items:center;display:grid}.ava svg{width:58%;height:58%}.comms-head h2{font-size:16px}.chan{white-space:nowrap;flex:none;margin-left:auto}.head-id{flex:auto;min-width:0}.head-id h2,.head-id p{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.head-back{display:none}.modes+.chan{margin-left:12px}.head-main,.head-quit{margin-left:4px}.head-quit{letter-spacing:.08em;text-transform:uppercase;border-radius:12px;padding:6px 10px}.chat-root{min-height:0;display:grid;position:relative}.comms-in .ask{max-height:calc((var(--vvh,100vh) - var(--hud,64px) - 64px) * .55);overscroll-behavior:contain;overflow-y:auto}.chat-scroll{overflow-anchor:none;padding:12px 16px;font-size:15px;overflow-y:auto}.chat-list{gap:8px;max-width:1040px;margin-inline:auto;display:grid}.tx.in+.tx.in,.tx.you+.tx.you{margin-top:-4px}.tx.in+.tx.in>.ava,.tx.you+.tx.you .ava{visibility:hidden}.tx.in+.tx.in .tx-body>header b,.tx.you+.tx.you>header b{display:none}.chat-top{height:1px}.chat-end{height:1px;margin-top:-1px}.chat-live{max-width:1040px;color:var(--c);align-items:center;gap:10px;margin:14px auto 0;padding-left:44px;font-size:12px;display:flex}.chat-pill{--c:var(--accent);border:0;position:absolute;bottom:14px;left:50%;transform:translate(-50%)}.lit:after{content:"";background:color-mix(in srgb, var(--accent) 18%, transparent);border-radius:14px;animation:1s 1s forwards out;position:absolute;inset:0}.lit.flip:after{animation-name:out-b}.composer{border-top:1px solid var(--line);background:var(--panel);gap:8px;padding:12px 18px 14px;display:grid;position:relative}.cmp-row,.cmp-acts,.cmp-foot,.cmp-note{align-items:center;gap:8px;display:flex}.cmp-row{align-items:flex-end;gap:10px}.composer textarea{resize:none;border:1px solid var(--line);background:var(--sunken);min-width:0;color:var(--text);font:14px/1.4 var(--sans);border-radius:12px;flex:1;padding:9px 12px}@supports (field-sizing:content){.composer textarea{field-sizing:content;max-height:220px}.composer{grid-template-columns:minmax(0,1fr)}}.composer textarea:focus{border-color:color-mix(in srgb, var(--accent) 50%, transparent);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent);outline:none}.composer.ended{padding:12px 18px calc(12px + env(safe-area-inset-bottom))}.cmp-bar{text-align:center;color:var(--dim);margin:0;font-size:13px}.composer button:disabled{opacity:.45;cursor:default}.cmp-note{flex-wrap:wrap;flex:1;min-height:18px}.cmp-note[data-tone=error],.cmp-alt.cmp-stop{color:var(--err-soft)}.cmp-note[data-tone=ok]{color:var(--ok)}.cmp-note[data-tone=ask]{color:var(--gold)}.cmp-link{color:var(--accent);font:12px var(--sans);cursor:pointer;background:0 0;border:0;padding:0}.slash{z-index:5;border:1px solid var(--line);background:var(--surface-0);max-height:260px;box-shadow:0 8px 24px color-mix(in srgb, var(--shadow) 53%, transparent);border-radius:12px;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% - 6px);left:18px;right:18px;overflow-y:auto}.slash[hidden]{display:none}.slash li{cursor:pointer;border-radius:8px;align-items:baseline;gap:10px;padding:6px 10px;display:flex}.slash li[aria-selected=true]{background:color-mix(in srgb, var(--accent) 12%, transparent)}.slash b{color:var(--accent);font:600 13px var(--mono);white-space:nowrap}.slash span{min-width:0;color:var(--dim);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.cmp-yes{background:var(--gold);color:var(--ink);font:600 12px var(--sans);cursor:pointer;border:0;border-radius:8px;padding:3px 10px}.tx{content-visibility:auto;contain-intrinsic-size:auto 220px;min-width:0}.tx.you{contain-intrinsic-size:auto 76px}.tx.sys,.tx.rule{contain-intrinsic-size:auto 40px}.tx.note{contain-intrinsic-size:auto 24px}.tx time,.tx.note{color:var(--dim);font:11px var(--mono)}.tx.you{justify-items:end;gap:5px;display:grid}.tx.you>header{color:var(--gold);align-items:center;gap:8px;display:flex}.tx.you .ava{color:var(--gold)}.bubble{border:1px solid color-mix(in srgb, var(--gold) 22%, transparent);background:color-mix(in srgb, var(--gold) 8%, transparent);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:14px;max-width:80%;padding:7px 12px;line-height:1.5}.bubble .boss-flag{opacity:.7;display:block}.tx.in{grid-template-columns:30px minmax(0,1fr);align-items:start;gap:8px;display:grid}.tx-body{border:1px solid var(--line);background:var(--panel);border-radius:14px;gap:6px;padding:8px 12px;display:grid}.tx-body,.tx-body>*{min-width:0}.tx-body>header{color:var(--dim);font:11px var(--mono);align-items:baseline;gap:10px;display:flex}.tx-body>header b{color:var(--accent);font:600 13px var(--sans)}.stop,.dialog .tag{background:var(--c1);color:var(--c);border-radius:999px;padding:1px 8px;font-size:10px}.fault{color:var(--err-soft);font-size:13px}.thought,.more,.tab-btn{border:1px solid var(--line);color:var(--dim);font:11px var(--sans);cursor:pointer;background:0 0;border-radius:999px;justify-self:start;padding:2px 10px}.thought-text:empty{display:none}.thought-text,.out,.args,.notice pre,.rule pre{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--dim);font:13px/1.45 var(--mono)}.act,.notice{border:1px solid color-mix(in srgb, var(--hi) 7%, transparent);background:color-mix(in srgb, var(--hi) 3%, transparent);border-radius:10px}.act>summary,.notice>summary,.rule summary{cursor:pointer;align-items:center;gap:8px;min-width:0;padding:5px 10px;font-size:13.5px;list-style:none;display:flex}summary::-webkit-details-marker{display:none}.act code{color:var(--c);font:600 11px var(--mono);letter-spacing:.06em;text-transform:uppercase}.sum{min-width:0;color:var(--dim)}.act[open] .sum{white-space:normal}.open{flex:none;margin-left:auto}.act>pre,.result{margin:0 10px 8px}.result{gap:6px;display:grid}.tx.sys{padding-left:38px}.notice{border-color:color-mix(in srgb, var(--violet) 20%, transparent);background:color-mix(in srgb, var(--violet) 7%, transparent)}.notice .ava{width:22px;height:22px}.notice pre,.rule pre{padding:0 10px 8px}.notice>.boss-flag{opacity:.7;padding:0 10px 4px;display:block}.notice-raw{margin:0 10px 8px}.notice-raw>summary{color:var(--dim);cursor:pointer;font-size:12px}.notice-raw pre{padding:4px 0 0}.rule summary{justify-content:center}.rule summary:before,.rule summary:after{content:"";background:var(--line);flex:1;height:1px}.tx.note{text-align:center}.dossier-in{text-align:center;justify-items:center;gap:6px;display:grid;position:relative}.dossier-in>.tag{text-align:left;justify-self:stretch}.portrait{background:radial-gradient(var(--c1), transparent 70%);border-radius:50%;padding:8px}.portrait .plate{--s:96px}.dossier-in h3{overflow-wrap:anywhere;margin-top:4px;font-size:18px}.d-line,.who p{align-items:baseline;gap:8px;display:flex}.d-note{background:color-mix(in srgb, var(--amber) 12%, transparent);border-radius:10px;padding:8px 10px;font-size:12px}.specs{text-align:left;justify-self:stretch;gap:2px;margin-top:10px;display:grid}.specs div{background:color-mix(in srgb, var(--hi) 4%, transparent);grid-template-columns:76px minmax(0,1fr);gap:8px;padding:7px 10px;display:grid}.specs dt{font-size:10px}.specs dd{overflow-wrap:anywhere;font-size:12.5px}.d-drones,.d-squads{margin-top:8px}.d-squads{justify-self:stretch;gap:10px;display:grid}.d-squad{gap:6px;display:grid}.d-squad small{color:var(--dim)}.d-squad .formation{gap:6px}.d-x,.head-info{display:none}.d-drones .formation{justify-content:center;gap:6px}.md{overflow-wrap:anywhere;line-height:1.55}.md p,.md ul,.md ol,.md pre,.md table,.md blockquote{margin:0 0 8px}.md>:last-child{margin-bottom:0}.md :is(h1,h2,h3,h4,h5,h6){margin:12px 0 6px;font-size:16px}.md>:first-child{margin-top:0}.md h1{font-size:19px}.md ul,.md ol{padding-left:22px}.md li>p{margin:0}.md li.task{margin-left:-18px;list-style:none}.check{vertical-align:-2px;text-align:center;width:14px;height:14px;font:700 10px/12px var(--mono);border:1px solid;border-radius:4px;margin-right:7px;display:inline-block}.check[data-done=true]{background:var(--ok);color:var(--ink)}.md code{background:color-mix(in srgb, var(--hi) 8%, transparent);font:13.5px var(--mono);border-radius:5px;padding:1px 5px}.md pre{border:1px solid var(--line);background:var(--sunken);border-radius:10px;padding:10px 12px;overflow-x:auto}.md pre code{background:0 0;padding:0}.md blockquote{background:color-mix(in srgb, var(--hi) 4%, transparent);color:var(--dim);padding:6px 12px}.md table{border-collapse:collapse;display:block;overflow-x:auto}.md th,.md td{border:1px solid var(--line);padding:4px 10px}.tiles{flex:1 1 0;gap:20px;min-width:0;display:flex}.tile-tabs{display:none}.tile{min-width:0;top:calc(var(--hud,64px) + 20px);border:1px solid var(--line);background:var(--panel);border-radius:22px;flex:1 1 0;position:sticky}.tile>header svg{width:22px;height:22px;color:var(--gold)}.tile{grid-template-columns:minmax(0,1fr)}.tile>header b{flex:1;min-width:0}.tile-body{padding:16px 20px;overflow:auto}.tiles.tabbed{flex-direction:column;gap:8px}.tile:has(.spawn,.pair){height:auto;min-height:0;max-height:calc(var(--vvh,100vh) - var(--hud,64px) - 64px);align-self:flex-start}.spawn .chat-empty{text-align:left;padding:0}.spawn .chat-empty:empty{display:none}.tiles.tabbed .tile-tabs{gap:6px;display:flex}.tiles.tabbed .tile:not(.active){display:none}.tiles.tabbed .tile{flex:none}.tab-btn.active,.open{border-color:color-mix(in srgb, var(--gold) 40%, transparent);color:var(--gold)}.dock{z-index:20;top:calc(var(--hud,64px) + 24px);pointer-events:none;width:min(300px,100vw - 44px);display:grid;position:fixed;right:max(20px,50vw - 1080px)}.dialog,.tcard{pointer-events:auto;border:1px solid var(--c4);background:linear-gradient(var(--c1), var(--surface-0) 70%), var(--raised);box-shadow:0 24px 60px color-mix(in srgb, var(--shadow) 80%, transparent);transform-origin:top;border-radius:18px;grid-area:1/1;padding:14px 16px 16px;transition:transform .3s,opacity .3s;position:relative}.dialog:focus,.tcard:focus,.tcard h2:focus{outline:none}.dialog,.tcard{max-height:calc(100dvh - var(--hud,64px) - 44px);overscroll-behavior:contain;overflow-y:auto}.dialog>header,.tcard>header{align-items:center;gap:8px;min-width:0;margin-bottom:12px;display:flex}.where{min-width:0}.x{color:var(--dim);cursor:pointer;background:0 0;border:0;margin-left:auto;font-size:20px}.zoom{color:var(--dim);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 6px;font-size:17px}.zoom+.x{margin-left:0}.zoom:hover,.x:hover{color:var(--text)}.dock.wide{width:min(880px,100vw - 44px);top:72px;right:50%;transform:translate(50%)}.dock.wide .dialog{max-height:calc(100dvh - 96px)}.who{align-items:center;gap:14px;display:flex}.who .plate{--s:56px}.who h3{font-size:17px}.intel{background:color-mix(in srgb, var(--bg) 55%, transparent);border-radius:12px;margin-top:12px;padding:10px 12px}.intel h4{margin-bottom:4px}.said{overflow-wrap:anywhere;font-size:13px;line-height:1.45}.pending{color:var(--c);font:12px var(--mono);overflow-wrap:anywhere;margin-top:8px}.dialog footer{flex-wrap:wrap;align-items:center;gap:10px;margin-top:14px;display:flex}.ask{border:1px solid color-mix(in srgb, var(--amber) 35%, transparent);background:color-mix(in srgb, var(--amber) 6%, transparent);border-radius:14px;gap:8px;margin:10px 18px 0;padding:12px 14px;display:grid}.dialog .ask{margin:10px 0 0}.ask-one{gap:8px;display:grid}.ask-one+.ask-one{margin-top:8px}.ask-head{background:color-mix(in srgb, var(--amber) 14%, transparent);color:var(--gold);letter-spacing:.06em;text-transform:uppercase;border-radius:999px;justify-self:start;padding:1px 9px;font-size:11px}.ask-how{color:var(--dim);font-size:12px}.ask-q{white-space:pre-wrap;overflow-wrap:anywhere;font-weight:600}.ask-ctx,.ask-why{color:var(--dim);white-space:pre-wrap;overflow-wrap:anywhere;max-height:9em;font-size:13px;overflow:auto}.ask-opts{counter-reset:opt;gap:6px;max-height:16em;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.ask-opt{border:1px solid var(--line);background:var(--sunken);overflow-wrap:anywhere;counter-increment:opt;border-radius:10px;gap:2px;padding:7px 12px;font-size:13px;display:grid}.ask-opt b:before{content:counter(opt) ". ";color:var(--dim)}.ask-opt b[data-n]:before{content:attr(data-n) ". "}.ask-opt small{color:var(--dim);font-size:12px}.ask-acts{flex-wrap:wrap;align-items:center;gap:6px 14px;display:flex}.ask-acts>:last-child{margin-left:auto}.ask-term{color:var(--gold);font-size:12px}.ask button:disabled{opacity:.45;cursor:default}.ask-note:empty{display:none}.ask-note{color:var(--dim);flex-wrap:wrap;align-items:center;gap:4px 10px;font-size:12px;display:flex}.ask-note[data-tone=error]{color:var(--err-soft)}.ask-note[data-tone=ok]{color:var(--ok)}.ask-title{font:12.5px/1.45 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;max-height:12em;margin:0;overflow:auto}div.ask-opts{max-height:none;overflow:visible}button.ask-opt{text-align:left;color:var(--text);font:13px var(--sans);cursor:pointer}.ask-opt[aria-checked=true]{border-color:var(--amber);background:color-mix(in srgb, var(--amber) 12%, transparent)}.ask-own{resize:vertical;field-sizing:content;border:1px solid var(--line);background:var(--sunken);min-width:0;max-height:10em;color:var(--text);font:13px var(--sans);border-radius:10px;padding:7px 12px}.ask-memo{font-size:12px}.ask input:disabled,.ask textarea:disabled{opacity:.45}.ask-send{background:var(--amber);color:var(--ink);font:600 13px var(--sans);cursor:pointer;border:0;border-radius:10px;padding:7px 13px}.ask-cancel{border:1px solid var(--line);color:var(--text);font:600 13px var(--sans);cursor:pointer;background:0 0;border-radius:10px;padding:7px 13px}.trust h4{color:var(--dim);letter-spacing:.14em;text-transform:uppercase;margin:4px 0 0;font-size:11px;font-weight:400}.trust-found{gap:8px;max-height:14em;display:grid;overflow:auto}.trust-group b{font:12.5px var(--mono);overflow-wrap:anywhere}.trust-group small{color:var(--err-soft);display:block}.trust-group ul{font:12px/1.5 var(--mono);color:var(--dim);overflow-wrap:anywhere;margin:2px 0 0;padding:0 0 0 1.2em}.trust-more{font-family:var(--sans);margin-left:-1.2em;font-style:italic;list-style:none}.trust-folder{font:600 13px/1.4 var(--mono);overflow-wrap:anywhere;margin:0}.trust .ask-why{max-height:none;overflow:visible}.trust .ask-acts>:last-child{margin-left:0}@media (width<=600px){.deploy-trust .trust-found{max-height:7em}.deploy-trust .ask-why{font-size:12px}}.deploy-trust:empty{display:none}.deploy-trust .ask{margin:0}.go,.later,.chat-pill,.cmp-send,.cmp-alt{font:600 13px var(--sans);cursor:pointer;border-radius:10px;padding:7px 13px;text-decoration:none}.go,.chat-pill{background:var(--c);color:var(--ink)}a.go{justify-content:center;align-items:center;display:inline-flex}.cmp-send{background:var(--accent);color:var(--ink);border:0}.later,.cmp-alt{border:1px solid var(--line);color:var(--text);background:0 0}.queued{color:var(--dim);flex:1 0 100%;font-size:12px}.queued:empty{display:none}html.paused *,html.paused :before,html.paused :after{animation-play-state:paused!important}@media (width<=1100px){.stage[data-view]{grid-template-columns:1fr}.side{position:static}}@media (width<=1040px){.stats{display:none}}.term-tile{grid-template-rows:auto minmax(0,1fr) auto;gap:10px;height:100%;display:grid}.tile-body:has(.term-tile){padding:12px 14px;overflow:hidden}.term-bar{justify-content:space-between;align-items:center;gap:12px;font-size:12px;display:flex}.term-scroll{transition:border-color .2s,box-shadow .2s}.term-scroll.typing{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 18%, transparent)}.term-scroll.engage{animation:.6s ease-out term-engage}.term-scroll.blip{animation:.22s ease-out term-blip}.term-scroll.blip.flip{animation-name:term-blip-b}@keyframes term-engage{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 80%, transparent), 0 0 0 color-mix(in srgb, var(--accent) 0%, transparent)}60%{box-shadow:0 0 0 7px color-mix(in srgb, var(--accent) 0%, transparent), 0 0 34px color-mix(in srgb, var(--accent) 40%, transparent)}to{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 18%, transparent)}}@keyframes term-blip{0%{box-shadow:0 0 0 2px color-mix(in srgb, var(--accent-hi) 80%, transparent), 0 0 32px color-mix(in srgb, var(--accent) 53%, transparent)}to{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 18%, transparent)}}@keyframes term-blip-b{0%{box-shadow:0 0 0 2px color-mix(in srgb, var(--accent-hi) 80%, transparent), 0 0 32px color-mix(in srgb, var(--accent) 53%, transparent)}to{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 18%, transparent)}}.term-sink{opacity:0;resize:none;pointer-events:none;border:0;width:1px;height:18px;padding:0;font-size:16px;position:fixed;overflow:hidden}.term-typing{color:var(--accent);margin-left:auto;font-weight:600;animation:1.6s ease-in-out infinite term-note}@keyframes term-note{50%{opacity:.55;text-shadow:0 0 10px color-mix(in srgb, var(--accent) 60%, transparent)}}.term-state{color:var(--dim)}.term-state[data-tone=ok]{color:var(--ok)}.term-state[data-tone=error]{color:var(--err-soft)}.term-scroll{overscroll-behavior:contain;border:1px solid var(--line);background:var(--term-bg);border-radius:14px;padding:8px 10px;overflow:auto}@font-face{font-family:SB Nerd Symbols;src:local(SymbolsNFM),local(Symbols Nerd Font Mono),local(HackNFM-Regular),url(./SymbolsNerdFontMono-DkrHkSnn.woff2)format("woff2");unicode-range:U+E000-F8FF,U+F0000-FFFFD;font-display:swap}.term{width:max-content;min-width:100%;color:var(--term-fg);font:12px/1.3 var(--mono);white-space:pre;font-family:ui-monospace,SF Mono,Menlo,Consolas,SB Nerd Symbols,monospace;transition:opacity .2s}.term .tr{min-height:1.3em}.term.stale{opacity:.5}.term.hidden{display:none}.plate[data-docs]:before{content:attr(data-docs);z-index:1;background:linear-gradient(var(--paper-hi), var(--paper));min-width:10px;height:16px;color:var(--paper-ink);font:700 9px/16px var(--mono);text-align:center;box-shadow:0 0 0 2px var(--plate), 2px 2px 0 1px var(--paper-edge);border-radius:3px 6px;padding:0 3px;position:absolute;top:-5px;left:-5px}.d-docs{text-align:left;margin-top:12px}.d-docs h4{text-align:center;margin:0 0 6px}.d-doc-list{gap:6px;display:grid}.d-doc{border:1px solid color-mix(in srgb, var(--paper) 25%, transparent);background:color-mix(in srgb, var(--paper) 7%, transparent) no-repeat 9px 50% / 13px 16px linear-gradient(var(--paper-hi), var(--paper));width:100%;color:var(--text);font:13px var(--sans);text-align:left;cursor:pointer;border-radius:10px;gap:1px;padding:7px 10px 7px 30px;display:grid}.d-doc:hover{border-color:color-mix(in srgb, var(--paper) 67%, transparent)}.d-doc b{overflow-wrap:anywhere;font-weight:600}.d-doc small{color:var(--dim);font-size:11px}.d-docs-cut{color:var(--dim);margin:6px 0 0;font-size:12px}.doc-tile{grid-template-rows:auto minmax(0,1fr);gap:10px;height:100%;display:grid}.tile-body:has(.doc-tile){padding:12px 14px;overflow:hidden}.doc-bar{flex-wrap:wrap;justify-content:flex-start}.doc-why{min-width:0;color:var(--text);flex:160px}.doc-off{color:var(--gold);font-style:normal}.doc-acts{align-items:center;gap:14px;display:flex}.doc-acts>.cmp-link{align-items:center;display:inline-flex}.doc-frame{border:1px solid color-mix(in srgb, var(--paper) 33%, transparent);background:#fff;border-radius:12px;width:100%;height:100%;min-height:240px}.doc-text{border:1px solid color-mix(in srgb, var(--paper) 25%, transparent);background:var(--plate);border-radius:12px;padding:14px 18px;overflow:auto}.doc-pre{white-space:pre-wrap;font:12.5px/1.45 var(--mono);margin:0}.pad{gap:6px;display:grid}.pad-row{grid-template-columns:repeat(auto-fit,minmax(48px,1fr));gap:6px;display:grid}.pad-key{border:1px solid var(--line);background:var(--surface-0);min-height:34px;color:var(--text);font:600 12px var(--mono);cursor:pointer;border-bottom-width:3px;border-radius:9px;padding:4px 6px}.pad-key:active:not(:disabled){background:var(--raised);border-bottom-width:1px;transform:translateY(2px)}.pad-key:disabled{opacity:.35;cursor:default}.pad-key[data-key=enter]{color:var(--accent)}.pad-key[data-key=esc]{color:var(--gold)}.pad-key:is([data-key=up],[data-key=down],[data-key=left],[data-key=right],[data-key=backspace]){font-size:16px}.pad-digits summary{color:var(--dim);cursor:pointer;padding:2px 0;font-size:12px}.pad-note:empty{display:none}.pad-note{color:var(--dim);flex-wrap:wrap;align-items:center;gap:6px 12px;margin:0;font-size:12px;display:flex}.pad-note[data-tone=error]{color:var(--err-soft)}.pad-note[data-tone=ask]{border:1px solid color-mix(in srgb, var(--amber) 40%, transparent);background:color-mix(in srgb, var(--amber) 8%, transparent);color:var(--text);border-radius:10px;padding:8px 10px}.pad-ask-why{flex:14rem;min-width:0}.pad-ask-acts{flex:none;gap:8px;display:flex}.pad-yes,.pad-no,.tcard-mask,.tcard-go{box-sizing:border-box;border:1px solid var(--line);min-height:34px;font:600 12px var(--sans);cursor:pointer;border-radius:9px;padding:0 14px}.pad-yes{border-color:var(--amber);background:var(--amber);color:var(--ink)}.pad-no{color:var(--text);background:0 0}.dock>.dialog{z-index:1}.tcard{z-index:0;--c1:transparent;--c4:var(--line);gap:10px;animation:.25s both tcard-in;display:grid}@keyframes tcard-in{0%{opacity:0;transform:translateY(8px)}}.tcard-cmd,.tcard-tail{font:12px/1.45 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.tcard-cmd{background:var(--sunken);-webkit-user-select:text;user-select:text;border-radius:8px;max-height:6em;padding:6px 8px;overflow:auto}.tcard-cmd:before{content:"$ ";color:var(--dim)}.tcard-tail{color:var(--dim)}.tcard-tail:empty{display:none}.tcard.stale .tcard-tail{opacity:.5}.tcard-wait{margin:0;font-size:13px}.tcard-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.tcard-label{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.tcard-input{background:var(--sunken);min-width:0;min-height:34px;font:13px var(--mono);flex:8rem}.tcard-mask{color:var(--text);background:0 0}.tcard-go{border-color:var(--amber);background:var(--amber);color:var(--ink)}.tcard-mask[aria-pressed=true]{border-color:var(--amber)}:is(.tcard-go,.tcard-mask):disabled{opacity:.45;cursor:default}.tcard-full{justify-self:end}.c0{color:#414868}.cz{color:var(--term-bg)}.c1{color:#f7768e}.c2{color:#9ece6a}.c3{color:#e0af68}.c4{color:#7aa2f7}.c5{color:#bb9af7}.c6{color:#7dcfff}.c7{color:#a9b1d6}.c8{color:#545c7e}.c9{color:#ff899d}.c10{color:#9fe044}.c11{color:#faba4a}.c12{color:#8db0ff}.c13{color:#c7a9ff}.c14{color:#a4daff}.c15{color:#c0caf5}.k0{background:var(--term-bg)}.k1{background:#f7768e}.k2{background:#9ece6a}.k3{background:#e0af68}.k4{background:#7aa2f7}.k5{background:#bb9af7}.k6{background:#7dcfff}.k7,.kz{background:#a9b1d6}.k8{background:#545c7e}.k9{background:#ff899d}.k10{background:#9fe044}.k11{background:#faba4a}.k12{background:#8db0ff}.k13{background:#c7a9ff}.k14{background:#a4daff}.k15{background:#c0caf5}.tb{font-weight:700}.td{opacity:.6}.ti{font-style:italic}.tu{text-decoration:underline}.ts{text-decoration:line-through}.tu.ts{text-decoration:underline line-through}.drawer,.drawer-veil{display:none}.drawer{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;z-index:30;background:var(--surface-0);border-right:1px solid var(--line);width:min(86vw,360px);box-shadow:8px 0 30px color-mix(in srgb, var(--shadow) 50%, transparent);transform:translateX(calc(var(--dx,0px) - 100%));visibility:hidden;flex-direction:column;transition:transform .22s ease-out,visibility 0s .22s;display:flex;position:fixed;inset:0 auto 0 0}.drawer.on{visibility:visible;transition:transform .22s ease-out}.drawer-veil{z-index:29;background:color-mix(in srgb, var(--shadow) 60%, transparent);opacity:0;pointer-events:none;transition:opacity .22s;position:fixed;inset:0}.drawer-drag .drawer,.drawer-drag .drawer-veil{transition:none}.drawer>header{padding:max(12px, env(safe-area-inset-top)) 12px 8px max(14px, env(safe-area-inset-left));color:var(--dim);letter-spacing:.1em;text-transform:uppercase;justify-content:space-between;align-items:center;font-size:12px;display:flex}.drawer-body{overscroll-behavior:contain;min-height:0;padding:4px 10px 16px max(10px, env(safe-area-inset-left));flex:1;align-content:start;gap:12px;display:grid;overflow-y:auto}.drawer-foot{padding:8px 10px max(10px, env(safe-area-inset-bottom)) max(10px, env(safe-area-inset-left));border-top:1px solid var(--line);background:var(--surface-0);flex:none}.drawer-sweep{justify-content:flex-end;margin-bottom:8px;display:flex}.drawer-sweep[hidden]{display:none}.drawer-sweep .pair-btn{flex:1;min-height:36px}.drawer-sweep .pair-btn[hidden]{display:none}.drawer-map{border:1px solid var(--line);background:color-mix(in srgb, var(--hi) 4%, transparent);min-height:48px;color:var(--text);border-radius:12px;justify-content:center;align-items:center;padding:0 12px;font-size:14px;font-weight:600;text-decoration:none;display:flex}.drawer-map[aria-current]{color:var(--dim)}.dbase h3{justify-content:space-between;align-items:baseline;gap:8px;margin:0 0 6px;font-size:14px;display:flex}.dbase h3 a{color:var(--text);text-overflow:ellipsis;white-space:nowrap;text-decoration:none;overflow:hidden}.dbase h3 small,.dgroup h4{color:var(--dim);letter-spacing:.1em;text-transform:uppercase;font-size:11px}.dbase[data-mark=waiting] h3 a{color:var(--c)}.dgroups,.drows{gap:6px;display:grid}.dgroup h4{margin:4px 0 0;font-weight:600}.drawer .card{gap:8px;min-height:44px;padding:6px 8px}.drawer .plate{--s:28px}.drawer .subs{margin-left:16px;padding-left:12px}.drawer .trow{justify-content:space-between;align-items:center;gap:8px;display:flex}.drawer .tower-go{border:1px solid var(--line);min-width:0;min-height:44px;color:var(--c);border-radius:12px;flex:1;align-items:center;gap:8px;padding:0 8px;text-decoration:none;display:flex}.drawer .tower-go .meta{min-width:0;color:var(--text);display:grid}.drawer .tower-go .line{gap:6px;min-width:0;display:flex}.drawer .tower-row.current>.trow>.tower-go{border-color:var(--c4);background:var(--c1)}.drawer .tower-go .plate{--s:28px;flex:none}.drawer .tower-add{white-space:nowrap;flex:none;place-items:center;min-width:56px;min-height:44px;padding:0 12px;display:grid}.drawer .tower-add[hidden]{display:none}.drawer .quit-btn{min-height:44px}.drawer .quit-btn[hidden]{display:none}.drawer .line{gap:6px}.drawer .dstate{color:var(--c);flex:none;font-size:11px;font-weight:600}.drawer .unit.current>.card{background:var(--c1);border-color:var(--c4)}.drawer .unit.current>.card>.hit:after{content:"›";color:var(--c);font:700 20px/1 var(--sans);position:absolute;top:50%;right:12px;transform:translateY(-50%)}.drawer .unit[data-dismiss]>.card{transform:translateX(var(--sx,0px));opacity:var(--so,1);transition:transform .2s ease-out,opacity .2s}.drawer .unit>.card.swiping{transition:none}.drawer .unit>.card.gone{--sx:110%;--so:0}@media (width<=640px){.drawer{display:flex}.drawer-veil{display:block}}@media (width<=900px){.work{flex-direction:column;align-items:stretch}.view,.tiles{flex:none}.tile{position:static}.keep{flex-wrap:wrap}}@media (width<=640px){.shell{padding:max(8px, env(safe-area-inset-top)) max(8px, env(safe-area-inset-right)) calc(24px + env(safe-area-inset-bottom)) max(8px, env(safe-area-inset-left))}.hud{flex-wrap:wrap;gap:10px;padding:10px 12px;position:static}.brand p,.link span{display:none}.alert-row{flex:100%;order:3;min-width:0}.alert-row .alerts{flex:auto;width:auto;min-width:0}.done-btn{min-height:40px}.brand{flex:auto;min-width:0}.prefs-btn{width:40px;height:40px}.tl-span{display:none}.crumbs{gap:6px}.crumbs>*+:before{margin-right:6px}.crumbs>*{max-width:16ch}.crumbs:not(.open)>.mid{display:none}.crumbs:not(.open)>.crumb-more{flex:none;display:block}.crumbs.open{flex-wrap:wrap;row-gap:4px}.map,.zoom-in{padding:14px}.bases{column-gap:18px}.legend{display:none}.keep{gap:12px;padding:6px}.tower.big{width:84px;height:84px}.tower-drones{padding-left:1px}.drones.tower-drones:before{left:48px}.tally{flex-wrap:wrap}.col{width:100%}.dossier:not(.full){content-visibility:hidden}.comms-in,.dossier.full{left:0;right:0;top:var(--vvt,0px);height:var(--vvh,100dvh);background:var(--bg);position:fixed}.tiles:has(.tile){left:0;right:0;top:var(--vvt,0px);height:var(--vvh,100dvh);background:var(--bg);position:fixed}.comms-in{z-index:15;border:0;border-radius:0;grid-template-columns:minmax(0,1fr);min-height:0}#session-view.enter-slide,#session-view.enter-back{animation:none}#session-view.enter-slide>.comms-in{animation:.4s ease-out both slide}#session-view>.lost{inset:var(--vvt,0px) 0 auto;height:var(--vvh,100dvh);z-index:15;background:var(--bg);margin:0;position:fixed}.tiles:has(.tile){z-index:16;padding:8px;overflow-y:auto}.tile{height:calc(var(--vvh,100dvh) - 16px);border-radius:16px;min-height:300px}.dossier.full{z-index:17;overscroll-behavior:contain;padding:max(16px, env(safe-area-inset-top)) 16px calc(16px + env(safe-area-inset-bottom));border:0;border-radius:0;overflow-y:auto}.dossier.full .d-x{place-items:center;display:grid;position:absolute;top:0;right:0}.comms-head{padding:max(10px, env(safe-area-inset-top)) 12px 10px;grid-template-columns:auto minmax(0,1fr) auto auto auto;gap:8px 10px;display:grid}.comms-head .logo{display:none}.head-back{border:1px solid var(--line);width:40px;height:40px;color:var(--text);border-radius:12px;place-items:center;font-size:24px;text-decoration:none;display:grid}.head-info,.head-main:not([hidden]),.head-quit:not([hidden]){margin:0;padding:0 12px;display:block}.comms-head h2 small,.chan b{display:none}.modes+.chan{margin-left:0}.modes{border:1px solid var(--line);border-radius:12px;grid-area:2/1/auto/-1;padding:3px}.modes button{border:0;border-radius:9px;flex:1;min-height:40px;padding:0;font-size:14px}.modes button[aria-pressed=true]{background:color-mix(in srgb, var(--accent) 12%, transparent)}.chat-scroll{overscroll-behavior:contain;padding:12px}.chat-scroll:focus-visible{outline:none}.bubble{max-width:92%}.composer{padding:10px 12px calc(10px + env(safe-area-inset-bottom))}.cmp-foot:has(>.cmp-note:empty){display:none}.cmp-row{flex-wrap:wrap}.composer textarea{flex:100%;order:-1;min-height:64px}.cmp-acts{margin-left:auto}.dock,.dock.wide{width:calc(100vw - 20px);top:auto;right:10px}.dock{bottom:calc(10px + env(safe-area-inset-bottom))}.dock.wide{transform:none}.dialog .zoom{display:none}}@media (pointer:coarse){.composer textarea,.ask input,.ask textarea,.wait-box{font-size:16px}.composer button,.go,.later,.x,.chat-pill,.pair-btn,.alerts,.ask button,.term-bar button,.doc-acts>.cmp-link,.quit-btn,.d-doc{min-height:40px}}@media (width<=640px),(pointer:coarse){.pad-key,.pad-yes,.pad-no,.tcard-mask,.tcard-go,.tcard-input,.tcard .x,.tcard-full{min-height:44px}.pad-digits summary{padding:14px 0}.tcard-input{font-size:16px}}@media (width<=640px){.tcard{margin:0 -10px calc(-10px - env(safe-area-inset-bottom));padding-bottom:calc(14px + env(safe-area-inset-bottom));border-radius:18px 18px 0 0}.tcard h2{margin:0;font-size:13px}.brand{min-height:44px}.prefs-btn{width:44px;height:44px}.crumbs{align-items:center}.crumbs>*{padding-block:14px;line-height:16px}:is(.pair-btn,.alerts,.done-btn,.quit-btn,.later,.go,.x,.d-doc,.ask-send,.ask-cancel,.ask-opt,.sheet-yes,.cmp-yes,.chat-pill){min-height:44px}:is(.pair-btn,.quit-btn,.later,.go,.x,.tab-add,.ask-send,.ask-cancel,.sheet-yes,.cmp-yes){min-width:44px}.set-head .head-back{width:44px;min-height:44px}.lan summary{min-width:44px;padding-block:13px}.set-ctl input[type=range]{min-height:44px}.set-group{padding:12px}.set-row .lang{max-width:55%}.set-ctl{flex-wrap:wrap}.head-node:before{content:"";position:absolute;inset:-5px 0}.tab h3{min-height:44px}:is(.tab-add,.thought,.more,.tab-btn){isolation:isolate;background:0 0;border:0;min-height:44px;position:relative}:is(.tab-add,.thought,.more,.tab-btn):before{content:"";z-index:-1;border:1px solid var(--line);pointer-events:none;border-radius:999px;position:absolute;inset:11px 0}.tab-add:before{border-radius:10px}.tab-btn.active:before,.more.open:before{border-color:color-mix(in srgb, var(--gold) 40%, transparent)}:is(.act>summary,.notice>summary,.rule summary,.todos summary,.monitors summary,.timeline summary){box-sizing:border-box;align-items:center;min-height:44px;padding-block:0}.todos,.monitors{padding-block:0}:is(.todos ol,.monitors ul){margin:0 0 10px}.link-form summary{padding-block:13px}.queue-act{flex-wrap:nowrap;justify-content:flex-end;gap:10px}.queue-act button{flex:none;min-width:56px;min-height:44px}.trust .ask-acts{grid-template-columns:1fr 1fr;gap:8px;display:grid}.trust .ask-send{grid-column:1/-1}.tl-mark{pointer-events:none}.picker-body{height:clamp(180px,100dvh - 412px,360px)}.tile:has(.spawn,.pair){max-height:calc(var(--vvh,100dvh) - 16px)}.teams-tile{grid-template-columns:minmax(0,1fr)}.teams-tile b{white-space:normal;overflow-wrap:anywhere}.specs a,.d-squad a{padding-block:12px;line-height:20px;display:inline-block}.specs a{margin-block:-7px}.dbase h3{align-items:center}.dbase h3 a{padding-block:12px;line-height:20px}.cmp-link{align-items:center;padding-inline:8px;display:inline-flex}:is(.ask,.term-bar,.doc-acts,.composer) :is(button,.cmp-link){min-height:44px}.slash li{align-items:center;min-height:44px}:where(input:not([type=checkbox],[type=radio],[type=file],[type=hidden]),select,textarea){box-sizing:border-box;min-height:44px}.picker-crumbs button,.picker-places button,.pitem,.drawer-sweep .pair-btn{min-height:44px}.head-back{width:44px;min-width:44px;height:44px}.modes button{min-height:44px}:is(.head-info,.head-main:not([hidden]),.head-quit:not([hidden])){min-width:44px;min-height:44px}.composer textarea{min-height:56px}.cmp-row{gap:8px 10px}.comms-in .ask-acts{background:color-mix(in srgb, var(--amber) 6%, var(--bg));margin:0 -14px -12px;padding:8px 14px 12px;position:sticky;bottom:-12px}.composer :is(.cmp-alt,.cmp-send){min-height:48px}.composer .cmp-alt{min-width:48px}.composer .cmp-send{min-width:64px}}@media (prefers-reduced-motion:reduce){:not(.zen-hl),:before,:after{transition:none!important;animation:none!important}.connect-reload{animation:0s linear 10s forwards connect-reveal!important}}.base.ally{background:linear-gradient(180deg, color-mix(in srgb, var(--accent) 7%, transparent), transparent 42%), linear-gradient(180deg, var(--surface-1), var(--surface-0))}.base.ally .crown{color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent);text-transform:none;letter-spacing:.04em;display:inline-flex}.base.ally.offline{opacity:.55}.ally-tabs{gap:4px;margin:0;padding:0;list-style:none;display:grid}.ally-tab{border:1px solid var(--line);border-radius:10px;justify-content:space-between;gap:10px;padding:6px 10px;font-size:12px;display:flex}.ally-tab b{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ally-tab span{color:var(--dim);flex:none}.ally-units{gap:4px;margin:6px 0 0;padding:0;list-style:none;display:grid}.ally-units:empty{display:none}.ally-unit{border-left:2px solid var(--accent);grid-template-columns:1fr auto;gap:2px 10px;padding:6px 10px;font-size:12px;display:grid}.ally-unit b{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ally-unit span{color:var(--dim)}.ally-unit pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:6.5em;color:var(--dim);font:inherit;grid-column:1/-1;margin:0;overflow:auto}.ally-tab[data-state=working] span{color:var(--accent)}.ally-tab[data-state=blocked] span{color:var(--amber)}.link-pop{width:min(460px,100vw - 16px)}.link-pop ul{gap:8px;max-height:60vh;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.link-alert{border:1px solid var(--line);border-radius:10px;gap:6px;padding:8px 10px;font-size:13px;display:grid}.link-alert[data-level=error]{background:#f7768e1a}.link-alert[data-level=warning]{background:color-mix(in srgb, var(--amber) 9%, transparent)}.link-args{border:1px solid var(--line);white-space:pre-wrap;word-break:break-word;border-radius:8px;max-height:180px;margin:0;padding:8px;font-size:11px;overflow:auto}.link-alert[data-kind=notice]{grid-template-columns:1fr auto;align-items:start}.link-alert[data-kind=notice] span{overflow-wrap:anywhere;max-height:7em;overflow:auto}.link-note{color:var(--dim)}.link-note:empty,.link-dialog:empty{display:none}.link-alert .ask{background:0 0;border:0;margin:0;padding:0}.link-alert .ask-acts{background:var(--card);padding:6px 0 8px;position:sticky;bottom:-8px}.link-alert[data-kind=dialog]{--card:color-mix(in srgb, var(--amber) 9%, var(--raised));background:var(--card)}.link-alert[data-kind=dialog][data-level=info]{--card:var(--raised)}.link-alert[data-kind=dialog]:not([data-state=open]) .link-note{color:var(--text);font-size:13px}.link-alert[data-kind=dialog][data-state=done-here] .link-note{color:var(--ok)}.link-alert[data-kind=dialog][data-state=expired] .link-note{color:var(--gold)}.teams-tile{gap:14px;padding:4px 2px 12px;font-size:13px;display:grid}.teams-tile .go{--c:var(--accent);border:0}.teams-tile h3{font-size:15px}.teams-tile h4{margin:0 0 4px;font-size:13px}.link-status{min-height:1.2em;color:var(--amber);margin:0}.link-short{color:var(--dim);font-family:ui-monospace,monospace}.link-meta{color:var(--dim);overflow-wrap:anywhere;margin:2px 0 8px;font-size:12px}.link-team,.link-request,.link-invite,.link-form{border:1px solid var(--line);background:color-mix(in srgb, var(--surface-1) 70%, transparent);border-radius:12px;padding:10px 12px}.link-request{background:color-mix(in srgb, var(--amber) 9%, transparent)}.link-team[data-status=stopped]{background:#f7768e1a}.link-warn{border:1px solid var(--line);background:color-mix(in srgb, var(--amber) 10%, transparent);border-radius:8px;margin:6px 0;padding:6px 10px}.link-roster{border-collapse:collapse;width:100%;margin:6px 0 10px}.link-roster th{text-align:left;color:var(--dim);padding:2px 6px;font-size:11px;font-weight:500}.link-roster .nw{white-space:nowrap}.link-roster select{max-width:100%}.link-roster td{vertical-align:middle;overflow-wrap:anywhere;padding:5px 6px}.link-roster tr[data-online=false] td{color:var(--dim)}.link-roster em{color:var(--dim);margin-left:6px;font-size:11px;font-style:normal}.link-roster .link-dup{color:var(--amber)}.link-acts{flex-wrap:wrap;gap:6px;display:flex}.link-acts button{white-space:nowrap}.link-inline{gap:8px;margin-top:8px;display:flex}.link-inline input{flex:1;min-width:0}.link-words{gap:8px;margin:8px 0;display:grid}.link-set{letter-spacing:.02em;text-align:left;padding:10px 12px;font-size:15px}.link-bigwords{letter-spacing:.04em;overflow-wrap:anywhere;margin:8px 0;font-size:20px;font-weight:700}.link-invite{justify-items:start;gap:8px;display:grid}.link-invite .qr{border-radius:8px;width:min(240px,100%);height:auto}.link-invite textarea,.link-form textarea{width:100%;font-family:ui-monospace,monospace;font-size:11px}.link-invite[data-lapsed=true] .qr{opacity:.25}.link-count{font-variant-numeric:tabular-nums}.link-form{gap:8px;display:grid}.link-form summary{cursor:pointer;font-weight:600}.link-form label{color:var(--dim);gap:3px;display:grid}.link-scan video{border-radius:10px;width:min(320px,100%)}.link-open-invite{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.teams-tile [data-armed=true]{color:var(--amber)}@media (width<=640px){.link-roster thead{display:none}.link-roster tr{border-bottom:1px solid var(--line);grid-template-columns:1fr 1fr;gap:2px 8px;padding:6px 0;display:grid}}.tower-memory .tmem>summary{cursor:pointer;align-items:baseline;gap:8px;font-size:.85em;display:flex}.tower-memory .tmem-counts{opacity:.7}.tmem-body{gap:10px;min-width:0;margin-top:6px;font-size:.85em;display:grid}.tmem-body h4{margin:0 0 4px;font-size:1em}.tmem-body h4 small{opacity:.6;margin-left:6px}.tmem-body ul{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tmem-body li{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;display:flex}.tmem-body .tmem-text{overflow-wrap:anywhere;flex:14em;min-width:0}.tmem-body li small{opacity:.65}.tmem-ended .tmem-text{opacity:.6;text-decoration:line-through}.tmem-body input{flex:12em;min-width:0}.tmem-add{gap:6px;margin-top:4px;display:flex}.tmem-empty,.tmem-note{opacity:.7;margin:0}.tmem-body .tnote-fail{color:var(--err-soft)}.tmem-body .tnote-fail:empty{display:none}.tower-conv{border:1px solid var(--line);border-radius:10px;gap:4px;min-width:0;margin-bottom:6px;padding:8px 10px;font-size:.85em;display:grid}.tower-conv[hidden]{display:none}.tower-conv p{overflow-wrap:anywhere;min-width:0;margin:0}.tower-conv .conv-line>span{max-width:100%;display:inline-block}.tower-conv .conv-line b{color:var(--accent)}.tower-conv .conv-now,.tower-conv .conv-cap{opacity:.85}.tower-conv .conv-acts{flex-wrap:wrap;align-items:center;gap:6px 8px;display:flex}.tower-conv .conv-acts button:disabled{opacity:.6;cursor:progress}.tower-conv .conv-done{color:var(--dim)}.tower-conv .conv-done:empty,.tower-conv .tnote-fail:empty{display:none}.tower-conv .tnote-fail{color:var(--err-soft)}.tower-conv .conv-runs{flex-wrap:wrap;gap:4px 6px;display:flex}.tower-conv :is(.conv-facts,.conv-runs-bar){display:none}.tx.conv-rule{justify-content:center;padding:6px 0;display:flex}.tx.conv-rule>div{border-top:1px solid color-mix(in srgb, var(--accent) 40%, transparent);color:var(--accent);text-align:center;flex-wrap:wrap;justify-content:center;gap:2px 10px;padding:2px 12px;font-size:.8em;display:flex}.tx.conv-rule small{color:var(--dim)}.term-bar .term-kb{border:1px solid var(--line);background:var(--surface-0);border-radius:9px;padding:4px 12px;font-weight:600}.term-bar .term-kb[aria-pressed=true]{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 14%, var(--surface-0))}@media (width<=640px){.term-typing{display:none}.menu-btn{letter-spacing:0;place-items:center;width:44px;min-width:44px;height:44px;padding:0;font-size:22px;line-height:1;display:grid}.menu-pop:not(:popover-open){display:none}.menu-pop:popover-open{gap:6px;min-width:200px;max-width:calc(100vw - 16px);display:grid}.menu-pop :is(.pair-btn,.quit-btn){text-align:left;justify-content:flex-start;width:100%;margin:0;padding-inline:14px}.menu-pop .quit-btn{opacity:1;font-size:14px}.menu-pop:popover-open .quit-btn{color:var(--err-soft)}.hud{gap:6px 8px;padding:6px 8px 6px 10px}.bar-acts{gap:6px;display:grid}.bar-acts .pair-btn{justify-content:flex-start;width:100%}body[data-route=map] .crumbs{display:none}body[data-route=map] .bar{margin:0}.map{min-height:0;padding:8px}.base :is(.card>.quit-btn[data-close=unit],.tower-quit){display:none}.comms-head{padding-block:max(6px, env(safe-area-inset-top)) 6px;gap:6px 8px}.comms-head:not([data-tower]) .menu-btn{display:none}.comms-head:not([data-tower]) .menu-pop{display:contents}.modes{padding:1px}.tx.in{grid-template-columns:minmax(0,1fr)}.tx.in>.ava{display:none}.tx.sys,.chat-live{padding-left:0}.tower-notes,.queue-bar,.queue-list,.queue-act,.todos,.monitors{margin-inline:10px}.todos,.monitors{margin-top:2px}.composer{padding:6px 10px calc(6px + env(safe-area-inset-bottom))}.composer textarea{min-height:44px}.cmp-row{gap:6px 10px}.queue-bar:not([hidden]){margin-bottom:0;display:block}.queue-fold{border:1px dashed color-mix(in srgb, var(--accent) 45%, transparent);width:100%;min-height:44px;color:var(--accent);font:600 13px var(--sans);text-align:left;cursor:pointer;background:0 0;border-radius:12px;justify-content:space-between;align-items:center;padding:0 14px;display:flex}.queue-fold:after{content:"▸";color:var(--dim)}.queue-bar[data-open] .queue-fold:after{content:"▾"}.queue-bar:not([hidden]):not([data-open])~:is(.queue-list,.queue-act){display:none}.tower-conv{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:0 4px;margin-bottom:0;padding:0 0 0 12px}.tower-conv .conv-line{white-space:nowrap;text-overflow:ellipsis;grid-column:1;overflow:hidden}.tower-conv .conv-line>span{max-width:none;display:inline}.tower-conv .conv-line>:is(.conv-began,.conv-cap,.conv-sep){display:none}.tower-conv .conv-line:has(.conv-now) b:after{content:" ·";color:var(--dim)}.tower-conv .conv-runs-bar{display:block}.tower-conv .conv-facts{color:var(--dim);font-size:12px;display:block}.menu-pop .conv-acts{gap:6px;display:grid}.menu-pop .conv-runs{gap:6px;padding-top:2px}.menu-pop .ally-chip{box-sizing:border-box;align-items:center;min-height:44px;padding-inline:12px;display:inline-flex}.tower-conv .menu-btn{background:0 0;border:0;grid-area:1/2}.zoom-in{min-height:0;padding:8px}.tally{grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;width:100%;display:grid}.tally div{padding:4px 6px}.squads,.camps{gap:10px;margin-top:10px}.squad{padding:10px}.squad h3{margin-bottom:8px}.formation{gap:8px;display:grid}.col{justify-items:stretch;gap:4px;width:100%}.col>.token{text-align:left;grid-template-columns:auto minmax(0,1fr);place-items:center start;column-gap:12px;padding:6px 10px}.col>.token .plate{--s:44px;grid-row:span 2;margin:0}.col>.token :is(.name,.line){grid-column:2}.col>.token .line{flex-wrap:wrap;align-items:baseline;gap:0 8px;display:flex}.col .say{margin-top:0}.col .drones{justify-content:flex-start;padding-top:8px}.base .card:has(>.quit-btn:not([hidden])){flex-wrap:wrap;row-gap:2px}.base .card>.meta{flex:1 1 0;min-width:0}.base .card>.quit-btn:not([hidden]){flex:100%;margin:0}.base .card>.quit-btn:not([hidden])~.ticks{bottom:3px}.comms-in .ask-opts{max-height:none;overflow:visible}.comms-in .ask-ctx,.comms-in .ask-why{max-height:5em}.comms-in .ask-acts{z-index:1}.comms-in .ask[data-more] .ask-acts:before{content:attr(data-cue);text-align:center;color:var(--gold);white-space:nowrap;pointer-events:none;flex:100%;order:-1;padding:0;font-size:12px;line-height:18px}.comms-in .ask[data-more] .ask-acts:after{content:"";background:linear-gradient(transparent, color-mix(in srgb, var(--amber) 6%, var(--bg)));pointer-events:none;z-index:-1;height:24px;position:absolute;bottom:100%;left:0;right:0}.composer textarea::placeholder{font-size:13px}}@media (width<=380px){.composer textarea::placeholder{font-size:12px}.tower-conv .conv-line{-webkit-line-clamp:2;white-space:normal;-webkit-box-orient:vertical;padding-block:6px;display:-webkit-box}.composer:has(textarea:placeholder-shown:not(:focus)) .cmp-row{flex-wrap:nowrap;align-items:center}.composer:has(textarea:placeholder-shown:not(:focus)) textarea{flex:1 1 0;order:0;min-width:0}.composer:has(textarea:placeholder-shown:not(:focus)) .cmp-row>.cmp-alt{order:-1}.composer:has(textarea:placeholder-shown:not(:focus)) .cmp-acts{order:1;margin-left:0}.brand{flex:1 1 0}[data-view=geek] .brand h1{letter-spacing:.06em;font-size:15px}[data-view=geek] .brand{gap:8px}}.settings.view{grid-template-columns:minmax(0,1fr);align-content:start;gap:14px;width:100%;max-width:760px;margin-inline:auto;display:grid}.set-head{align-items:center;gap:12px;display:flex}.set-head h2{font:600 20px var(--sans);margin:0}.set-head .head-back{border:1px solid var(--line);width:40px;height:40px;color:var(--text);border-radius:12px;place-items:center;font-size:24px;text-decoration:none;display:grid}.set-group{border:1px solid var(--line);background:var(--panel);border-radius:18px;grid-template-columns:minmax(0,1fr);gap:4px;padding:14px 18px;font-size:13px;display:grid}.set-group h3{font:600 15px var(--sans);margin:0}details.set-group>summary{cursor:pointer;align-items:center;gap:10px;min-height:44px;list-style:none;display:flex}details.set-group>summary::-webkit-details-marker{display:none}details.set-group>summary:after{content:"▸";color:var(--dim);margin-left:auto}details.set-group[open]>summary:after{content:"▾"}details.set-group:not([open]){padding-block:6px}details.set-group[open]>summary{margin-bottom:8px}details.set-group[hidden]{display:none}.set-note{color:var(--dim);margin:0;font-size:12px}.set-note:empty{display:none}.set-row{justify-content:space-between;align-items:center;gap:12px;min-height:44px;display:flex}.set-row>:first-child{color:var(--text);font-size:14px}.set-row .tog{text-transform:none;letter-spacing:0;justify-content:flex-start;min-width:7em;font-size:13px}.set-sub{padding-left:14px}.set-sub>:first-child{color:var(--dim);font-size:13px}.set-ctl{flex:auto;justify-content:flex-end;align-items:center;gap:10px;min-width:0;display:flex}.set-ctl input[type=range]{min-width:0;max-width:220px;accent-color:var(--accent);flex:1}.set-ctl output{text-align:right;width:3ch;font:12px var(--mono);color:var(--dim)}.set-ctl .pair-btn{text-transform:none;letter-spacing:0}.set-row .lang{max-width:60%}.set-body .pair-btn{text-transform:none;letter-spacing:0}.set-body{min-width:0}.set-body .pair,.set-body .teams-tile{padding:0}.set-body .chat-empty{padding:6px 0}.set-body .chat-empty:empty{display:none}.set-row+.set-note{margin-top:-2px}body[data-route=settings] :is(.bar-acts,.crumbs){display:none}[data-view=geek]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#000;--bg-2:#000;--surface-0:#0d0d0d;--surface-1:#161616;--raised:#0d0d0d;--sunken:#000;--well:#000;--panel:#0d0d0d;--plate:#000;--plate-hi:#1f1f1f;--term-bg:#000;--term-fg:#f2f2f2;--line-c:#8a8a8a;--line:#8a8a8a;--hi:#fff;--shadow:#000;--text:#f2f2f2;--dim:#bdbdbd;--ink:#000;--accent:#5fd7ff;--accent-hi:#a8e8ff;--working:#5fd7ff;--gold:#ffd75f;--amber:#ffd75f;--ok:#87e087;--err:#ffa0a0;--err-soft:#ffb4b4;--violet:#d7afff;--idle:silver;--unknown:#bababa;--paper-hi:#f6e6b8;--paper:#d8bd78;--paper-ink:#3b2a06;--paper-edge:#8a6f33;--aura-1:transparent;--aura-2:transparent;--grid:none;--sans:var(--mono)}[data-view=geek] body{font-size:13px}[data-view=geek] [data-mark]{--c1:color-mix(in srgb, var(--c) 12%, transparent);--c4:var(--line)}[data-view=geek] *,[data-view=geek] :before,[data-view=geek] :after{scroll-behavior:auto!important;box-shadow:none!important;text-shadow:none!important;transition:none!important;animation:none!important}[data-view=geek] :is(.logo svg,.deploy-title svg,.tower svg){filter:none}[data-view=geek] .hud{-webkit-backdrop-filter:none;backdrop-filter:none}[data-view=geek] .card:hover,[data-view=geek] :is(.pair-btn,.tab-add,.quit-btn,.go,.later,.cmp-send,.cmp-alt,.ask-send,.ask-cancel,.sheet-yes,.new-base,.modes button,.pitem,.d-doc,.thought,.more,.tab-btn,.pad-key):active:not(:disabled){transform:none!important}[data-view=geek] .pad-key{border-bottom-width:1px}[data-view=geek] :where(:not(.token,.stats>div,.pulse)),[data-view=geek] :not(.plate,.tower):before,[data-view=geek] :not(.plate,.tower):after{border-color:var(--line)!important}[data-view=geek] .drawer .unit.current>.card{border-color:var(--text)!important}[data-view=geek] :is(.base,.base.ally,.dialog,.tcard,.squad,.squad[data-mark=waiting]){background:var(--surface-0)}[data-view=geek] :is(.plate,.logo,.ava){background:var(--plate)}[data-view=geek] :is(.plate,.ava){border:1px solid var(--line)}[data-view=geek] .comms-head[data-head]:not([data-mark=commanding]) .logo{border-color:var(--line)}[data-view=geek] .comms-head[data-head] .logo{background:var(--plate)}[data-view=geek] .comms-head[data-head] .logo svg{filter:none}[data-view=geek] .portrait{background:0 0}[data-view=geek] .deploy-fill{background:var(--accent)}[data-view=geek] .tower:before{border-color:var(--line)}[data-view=geek] :is(.unit[data-mark=idle]>.card,.tower.ghost,.base.ally.offline,.stage[data-stale=true] .map,body[data-stale=true] .stats,body[data-stale=true] .work),[data-view=geek] :is(.line .age,.todo span,.tower-conv .conv-now,.tower-conv .conv-cap,.bubble .boss-flag,.notice>.boss-flag,.tmem-empty,.tmem-note,.tmem-counts,.tmem-body li small,.tmem-body h4 small,.foot .credit,.tmem-ended .tmem-text){opacity:1}[data-view=geek] .link span{clip-path:none;width:auto;height:auto;display:inline;position:static;overflow:visible}[data-view=geek] [data-mark=working]{--tag:"[WORK]"}[data-view=geek] [data-mark=waiting]{--tag:"[WAIT?]"}[data-view=geek] [data-mark=commanding]{--tag:"[CMD◈]"}[data-view=geek] [data-mark=idle]{--tag:"[IDLE]"}[data-view=geek] [data-mark=done]{--tag:"[DONE✓]"}[data-view=geek] [data-mark=error]{--tag:"[ERR!]"}[data-view=geek] [data-mark=unknown]{--tag:"[UNKN]"}[data-view=geek] :is(.card,.token) .name:before{content:var(--tag);color:var(--c);margin-right:1ch;font-weight:400}[data-view=geek] .token .name:before{margin-right:0;display:block}[data-view=geek] .tog:before{display:none}[data-view=geek] .set-row .tog:before{content:"[";width:auto;height:auto;color:inherit;font:inherit;background:0 0;border-radius:0;display:inline}[data-view=geek] .set-row .tog:after{content:"]"}[data-view=geek] :is(.modes button[aria-pressed=true],.term-bar .term-kb[aria-pressed=true],.pair-tabs .later.on,.pair-tabs .later[aria-selected=true],.tab-btn.active,.view-pick button[aria-pressed=true],.pcol[data-focus=true] .pitem[aria-selected=true]){background:var(--text);color:var(--ink);font-weight:700}[data-view=geek] .pitem[aria-selected=true]{background:var(--surface-1);color:var(--text);font-weight:700}[data-view=geek] .ask-opt[aria-checked=true]{background:var(--text);color:var(--ink);font-weight:700}[data-view=geek] :is(.ask-opt[aria-checked=true] small){color:var(--ink)}[data-view=geek] .ask-head{background:0 0}[data-view=geek] ::selection{background:var(--text);color:var(--ink)}[data-view=geek] a.ally-chip:hover,[data-view=geek] .banner{background:var(--surface-1)}[data-view=geek] :is(.composer,.ask) button:disabled{opacity:1;color:var(--dim);border:1px dashed var(--line);cursor:not-allowed;background:0 0}[data-view=geek] .tl-mark:focus-visible{outline:2px solid var(--text);outline-offset:3px}@media (forced-colors:active){.connect-reload{color:linktext;border:1px solid linktext}.badge,.link i,.tog:before,.flag,.tl-mark:before{border:1px solid canvastext}.qr,.term-scroll{forced-color-adjust:none}.tcard{border:1px solid canvastext}.tcard-go{border:1px solid buttontext}.tcard-go:disabled,.tcard-mask:disabled{color:graytext;opacity:1;border-color:graytext}:is(.composer,.ask) button:disabled{opacity:1;color:graytext;border-color:graytext}:is(textarea,input)::placeholder{color:graytext;opacity:1}.subs:before,.subs>.unit>.card:before,.subs>.unit>.card:after,.drones:before,.links,.packets{display:none}}.head-btn{color:var(--gold);align-items:center;gap:6px;text-decoration:none;display:inline-flex;position:relative}.head-btn[hidden],.head-node[hidden],.drawer-head[hidden],.head-ask[hidden],.head-asks[hidden],.head-absent[hidden]{display:none}.head-btn svg{fill:currentColor;flex:none;width:14px;height:14px}.head-btn .dot{background:var(--gold);width:9px;height:9px;box-shadow:0 0 0 2px var(--surface-0);border-radius:50%;position:absolute;top:-3px;right:-3px}.head-btn .dot[hidden]{display:none}.head-btn[data-state=absent]{opacity:.7}.head-btn[aria-current=page]{background:color-mix(in srgb, var(--gold) 14%, transparent);border-color:color-mix(in srgb, var(--gold) 45%, var(--line))}.head-node{z-index:2;box-sizing:border-box;border:1px solid color-mix(in srgb, var(--gold) 40%, var(--line));background:linear-gradient(180deg, color-mix(in srgb, var(--gold) 12%, transparent), transparent 80%), linear-gradient(180deg, var(--surface-1), var(--surface-0));max-width:calc(100% - 16px);height:36px;color:var(--text);white-space:nowrap;box-shadow:0 6px 16px color-mix(in srgb, var(--shadow) 30%, transparent);border-radius:999px;align-items:center;gap:8px;padding:0 14px 0 3px;text-decoration:none;display:flex;position:absolute;top:0;left:50%;translate:-50% -25%}.map:has(>.head-node:not([hidden])){padding-top:36px}.head-node .tower{width:30px;height:30px}.head-node .tower svg{width:20px;height:20px}.head-node .tower>.badge{bottom:-4px;right:-4px}.head-node .crown{white-space:nowrap;letter-spacing:.14em;background:0 0;flex:none;margin:0;padding:0;font-size:11px}.head-node .crown svg{display:none}.head-node .tstate{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.head-node.absent{opacity:.55;box-shadow:none;border-style:dashed}.head-node:hover,.head-node:focus-visible{border-color:color-mix(in srgb, var(--gold) 70%, var(--line))}.head-asks{flex-wrap:wrap;gap:6px;margin:0 0 8px;display:flex}.head-ask{border:1px solid var(--line);color:var(--dim);white-space:nowrap;border-radius:999px;align-items:center;padding:2px 10px;font-size:12px;text-decoration:none;display:inline-flex}.head-ask[data-open=true]{color:var(--gold);border-color:color-mix(in srgb, var(--gold) 45%, var(--line));background:color-mix(in srgb, var(--gold) 10%, transparent)}a.head-ask:hover,a.head-ask:focus-visible{border-color:var(--accent);color:var(--text)}.head-absent{color:var(--dim);margin:0 0 8px;font-size:13px}.comms-head[data-head] .head-info{display:none!important}.comms-head[data-head] .head-menu{display:none}.head-node .tower svg,.tx.in.head .ava{color:var(--gold);fill:currentColor}.comms-head[data-head] .logo{color:var(--gold);background:radial-gradient(circle at 30% 25%, color-mix(in srgb, var(--gold) 30%, transparent), color-mix(in srgb, var(--bg-2) 90%, transparent))}.comms-head[data-head]:not([data-mark=commanding]) .logo{border-color:color-mix(in srgb, var(--gold) 45%, var(--line))}.comms-head[data-head] .logo svg{fill:currentColor;filter:drop-shadow(0 0 5px color-mix(in srgb, var(--gold) 70%, transparent))}.tx.rule.chapter p{color:var(--dim);letter-spacing:.08em;justify-content:center;align-items:center;gap:8px;margin:0;padding:5px 10px;font-size:11px;display:flex}.tx.rule.chapter p:before,.tx.rule.chapter p:after{content:"";background:var(--line);flex:1;height:1px}.drawer-head{min-height:48px;margin:4px 10px 8px max(10px, env(safe-area-inset-left));border:1px solid color-mix(in srgb, var(--gold) 35%, var(--line));color:var(--text);background:linear-gradient(180deg, color-mix(in srgb, var(--gold) 9%, transparent), transparent);border-radius:12px;flex:none;align-items:center;gap:10px;padding:0 12px;text-decoration:none;display:flex}.drawer-head[data-news] .name:after,.bar-more[data-news]:after{content:"";background:var(--gold);vertical-align:middle;border-radius:50%;width:9px;height:9px;margin-left:6px;display:inline-block}.bar-more[data-news]{position:relative}.bar-more[data-news]:after{margin:0;position:absolute;top:4px;right:4px}.drawer-head svg{width:18px;height:18px;fill:var(--gold);flex:none}.drawer-head .name{flex:1;min-width:0;font-size:14px}.drawer-head .dstate{color:var(--c);flex:none;font-size:11px;font-weight:600}.drawer-head.current{background:var(--c1);border-color:var(--c4)}[data-view=geek] :is(.head-node,.drawer-head){background:var(--surface-0);box-shadow:none}[data-view=geek] .head-btn[aria-current=page]{background:0 0}@media (width<=640px){.head-btn{min-height:44px}}@media (forced-colors:active){.head-btn .dot{background:highlight}.head-node.absent,.head-ask{border-color:canvastext}}
|