pi-straw-boss 0.57.1 → 0.58.1

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.
Files changed (110) hide show
  1. package/README.md +12 -2
  2. package/README.zh-TW.md +12 -2
  3. package/dist/gui/assets/{answer-B2xVIGxA.js → answer-DJ5VqXQ9.js} +1 -1
  4. package/dist/gui/assets/{ask-GnsZN-ZU.js → ask-C-Qv3UNu.js} +1 -1
  5. package/dist/gui/assets/chat-DE0P0X4q.js +2 -0
  6. package/dist/gui/assets/drawer-O2EFZMSx.js +1 -0
  7. package/dist/gui/assets/index-KmbJsZ0O.css +1 -0
  8. package/dist/gui/assets/index-u3qCp7xY.js +2 -0
  9. package/dist/gui/assets/layer-DEVOcu6v.js +1 -0
  10. package/dist/gui/assets/{lightbox-B_LOCdRi.js → lightbox-Cll4QKla.js} +1 -1
  11. package/dist/gui/assets/link-PXTIWfPZ.js +1 -0
  12. package/dist/gui/assets/linkdialogs-Mw88kshQ.js +1 -0
  13. package/dist/gui/assets/{pair-_0iZp_rL.js → pair-BtbdnwXB.js} +3 -3
  14. package/dist/gui/assets/{picker-BxEsplO6.js → picker-ZVarZnUq.js} +1 -1
  15. package/dist/gui/assets/{server-CfO0fbdV.js → server-XT8flHjx.js} +2 -2
  16. package/dist/gui/assets/sessionfacts-D7NcVHCZ.js +1 -0
  17. package/dist/gui/assets/{settings-BbLlLiNl.js → settings-6DQOXq2F.js} +2 -2
  18. package/dist/gui/assets/{spawn-Ctnm_ccF.js → spawn-C57KSJCm.js} +1 -1
  19. package/dist/gui/assets/{trust-rtDPq63p.js → trust-hd9LiKDq.js} +1 -1
  20. package/dist/gui/assets/{unit_count-C_IKdFh4.js → unit_count-CkqCcjIG.js} +1 -1
  21. package/dist/gui/assets/views-BjJ5STNo.js +2 -0
  22. package/dist/gui/assets/waitpanel--iFOFk8r.js +6 -0
  23. package/dist/gui/assets/zenchunk-JzaJwRKj.js +2 -0
  24. package/dist/gui/assets/zenchunk-bPo3TnS7.css +1 -0
  25. package/dist/gui/index.html +4 -2
  26. package/dist/server/{chunk-LJ3SPNF5.mjs → chunk-DST2WCCT.mjs} +83 -10
  27. package/dist/server/cli.mjs +8 -60
  28. package/dist/server/main.mjs +3597 -2777
  29. package/package.json +1 -1
  30. package/prompts/ally-run.md +3 -2
  31. package/prompts/head-run.md +11 -0
  32. package/prompts/tower-run.md +4 -3
  33. package/prompts/tower.md +1 -1
  34. package/src/boss.ts +8 -1
  35. package/src/control.ts +7 -0
  36. package/src/cut.ts +117 -0
  37. package/src/dashboard.ts +5 -3
  38. package/src/gui.ts +1 -1
  39. package/src/headcmd.ts +105 -0
  40. package/src/header.ts +10 -32
  41. package/src/headerfields.ts +50 -0
  42. package/src/headhistory.ts +46 -0
  43. package/src/headkey.ts +4 -0
  44. package/src/headroutes.ts +41 -0
  45. package/src/herdr.ts +21 -9
  46. package/src/items.ts +1 -1
  47. package/src/memorycmd.ts +3 -1
  48. package/src/net.ts +14 -13
  49. package/src/nethead.ts +42 -0
  50. package/src/opener.ts +17 -10
  51. package/src/order.ts +5 -5
  52. package/src/reach.ts +24 -21
  53. package/src/reachhead.ts +40 -0
  54. package/src/restored.ts +83 -15
  55. package/src/runallow.ts +11 -5
  56. package/src/runhead.ts +19 -0
  57. package/src/runmode.ts +24 -16
  58. package/src/server/allyroute.ts +64 -10
  59. package/src/server/bossconv.ts +6 -2
  60. package/src/server/client.ts +2 -2
  61. package/src/server/guihost.ts +4 -1
  62. package/src/server/head.ts +143 -0
  63. package/src/server/headasks.ts +86 -0
  64. package/src/server/headbrief.ts +91 -0
  65. package/src/server/headchapters.ts +78 -0
  66. package/src/server/headcmds.ts +20 -0
  67. package/src/server/headgate.ts +22 -0
  68. package/src/server/headnet.ts +60 -0
  69. package/src/server/headside.ts +108 -0
  70. package/src/server/headtools.ts +66 -0
  71. package/src/server/lineage.ts +2 -1
  72. package/src/server/main.ts +6 -2
  73. package/src/server/opentower.ts +2 -2
  74. package/src/server/record.ts +3 -0
  75. package/src/server/rungate.ts +3 -1
  76. package/src/server/runs.ts +65 -29
  77. package/src/server/runtools.ts +69 -11
  78. package/src/server/standing.ts +7 -5
  79. package/src/server/towerbrief.ts +4 -4
  80. package/src/server/towermemory.ts +10 -5
  81. package/src/server/towerpanel.ts +16 -6
  82. package/src/server/towerrunstore.ts +2 -0
  83. package/src/server/towers.ts +152 -55
  84. package/src/server/towerstore.ts +35 -15
  85. package/src/server/typegate.ts +9 -4
  86. package/src/session.ts +3 -4
  87. package/src/spawn.ts +2 -2
  88. package/src/stash.ts +2 -1
  89. package/src/state.ts +1 -3
  90. package/src/tools.ts +10 -5
  91. package/src/tower.ts +0 -2
  92. package/src/towerprompt/look.ts +4 -3
  93. package/src/towerprompt/messages.ts +4 -0
  94. package/src/towerprompt/prompt.ts +1 -1
  95. package/src/towerprompt/serversource.ts +1 -1
  96. package/src/towerprompt/source.ts +2 -0
  97. package/src/watch.ts +10 -9
  98. package/dist/gui/assets/chat-BjCnzH9C.js +0 -2
  99. package/dist/gui/assets/drawer-Db1FxK9v.js +0 -1
  100. package/dist/gui/assets/index-BeKhdUMk.css +0 -1
  101. package/dist/gui/assets/index-xkaqCr46.js +0 -2
  102. package/dist/gui/assets/layer-C0tYSonN.js +0 -1
  103. package/dist/gui/assets/link-Czdv2G24.js +0 -1
  104. package/dist/gui/assets/linkdialogs-DvpmFqpw.js +0 -1
  105. package/dist/gui/assets/sessionfacts-DEAEBK6-.js +0 -1
  106. package/dist/gui/assets/termcard-fFZrioKd.js +0 -6
  107. package/dist/gui/assets/views-46qJ0r7v.js +0 -2
  108. package/dist/gui/assets/zenchunk-CSJxIIPm.js +0 -2
  109. package/dist/gui/assets/zenchunk-wpsmgtPq.css +0 -1
  110. package/src/headwatch.ts +0 -31
package/README.md CHANGED
@@ -32,6 +32,14 @@ English | [繁體中文](https://github.com/wayne930242/pi-straw-boss/blob/main/
32
32
 
33
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>
34
34
 
35
+ **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
+
37
+ <p align="center"><img src="docs/gui-head.png" width="49%" alt="The head tower's page in the Standard view: a crowned header, the conversation with two forwards to the Harbor API and Lighthouse Web towers and one answer, the open and answered asks as chips, and the composer"> <img src="docs/gui-zen-head.png" width="49%" alt="The Zen view with the head tower: its last lines under the breathing circle, a note for the answer from the Lighthouse Web tower, and a hairline input that says Enter to talk to the head tower"></p>
38
+
39
+ <p align="center"><img src="docs/gui-zen-head-open.png" width="49%" alt="The Zen strip with the input open and a draft typed, the head tower's lines clear under the pointer"> <img src="docs/gui-phone-zen-head.png" width="220" alt="The Zen strip on a phone: two lines of the head tower's conversation, the Whole conversation link, and the folded input"></p>
40
+
41
+ <p align="center"><sub>The head tower: its page, the strip under Zen's circle, the open input, and the strip on a phone.</sub></p>
42
+
35
43
  ![Herdr with pi-straw-boss: the sidebar's net view of every workspace, tower, main agent, and subagent, beside a main agent at work](docs/herdr-window.png)
36
44
 
37
45
  <p align="center"><sub>Herdr with the net view in its sidebar.</sub></p>
@@ -47,14 +55,16 @@ Run a few agents on the same project and they start stepping on each other: two
47
55
  - **A tower per workspace.** It opens in its own tab, pinned first, when agents start to collide: a member dispatches a subagent (it promotes itself first), a workspace has two members while another workspace already has a tower, an agent promotes itself, or you type `/boss tower`. Mains and the tower go together: a tower that opens promotes each tab's earliest member, and a tower that quits turns every main back into a member (its subagents stay). It and coordinates the main agents and the other towers, and opens a tab with a main agent for work no session owns. You don't need to talk to it.
48
56
  - **A live dashboard** in the tower: who joined, and what they and their subagents are doing.
49
57
  - **Towers talk to each other.** A tower lists every workspace's tower (`tower_list`: who a message for it reaches, what its tabs work on) and writes to one or all of them (`tower_send`); a workspace without a tower is reached through its mains, else its members. Every `call_tower`, `boss_broadcast`, and `tower_send` message opens with a header the code writes: who sent it, in what role, to whom, and whether a reply is expected ([how](docs/how-it-works.md#talking-between-towers)).
58
+ - **A head tower of your own.** One tower that belongs to no project: you talk to it in the GUI (its page, or the line under Zen's circle) or with `/boss head`, it keeps one long conversation with you across runs, and it hands each instruction to the tower of the workspace that owns it (`tower_send`, opening that tower if needed) and tells you in a line when the tower answers. Its tools are the tower's lookup and forwarding tools and nothing else, and it listens only to you and to answers to its own forwards ([how](docs/how-it-works.md#the-head-tower)).
50
59
  - **A work board.** A main's board fills itself from its todo list and its name (`board_set` overrides it); allies see only an auto entry's name and progress (`<name> (3/5)`), never its task text; towers read every main's entry (`board_read`), on this computer and, with Straw Link, on teammates' computers, so a tower routes work knowing where each main stands ([how](docs/how-it-works.md#the-work-board)).
51
60
  - **A tower closes the mains it opened.** A main a tower opened for a request reports to the sender and to the tower, and the tower closes it (`boss_close_main`) when nothing is running in it ([how](docs/how-it-works.md#closing-an-opened-main)).
52
61
  - **A digest for the tower**: joins, subagent launches, and renames in its workspace since its last run, read into its next run once and cleared ([how](docs/how-it-works.md#the-towers-digest)).
53
62
  - **A browser view** of the whole net, `/boss gui`: every workspace as a base with its tower, agents, and subagents, animated and read-only. Click a base to zoom in, click a unit to read its chat as a live comms log; units that wait on you queue up as alerts, and Space opens the next one, F enlarges the top dialog, and Escape closes it (none of them while you type); a question is answered from the keyboard too: arrows choose, Tab walks a question's own-words box and note and then on to the next question, and Enter confirms and goes on. A switch in the header's settings (the gear) raises a system notification, and another plays a sound, when a unit waits on you, fails, or finishes; finished units wait in a list of their own, cleared one by one or all at once, and a finished subagent on the map is dismissed one by one or all at once (Dismiss finished, beside the location). A unit's comms show its background monitors, and one that fails or goes quiet raises a notice (a quiet entry under the header's Notices button; only a unit waiting on you raises the prominent alert); a unit that is idle while a subagent of it works, or while a monitor of it runs, shows as commanding with a glow, and one that only waits on a running monitor shows its note in red. On a desktop a unit's terminal takes your keyboard once you click into it. An answer that leaves its next step in a terminal (robot_hand's prompt and pane choices) shows a small card to finish it: the command, a pane's last rows, one line (hidden while a password is asked), and one button, with a link to the full terminal for ssh and vim. It reads in English or Traditional Chinese, following your browser, with a language menu in the header's settings. + New base, the last card on the map, opens a base in a folder you pick with one member and no tower. A base without a tower takes more members (+ Member on the base adds one in a new tab, on a squad beside that squad), and its tower opens by the rules above; a base with a tower takes new mains (+ Main, on the base or in the tower's comms), each in a tab of its own. In a session's composer, a file pasted, dropped, or picked with + (20 MB at most) is stored in a private temp folder and its path goes into the message. × closes a base, a squad, or (in its view) a unit after a confirmation: each agent quits pi as `/quit` would, then its pane, tab, or workspace closes; nothing closes if one of them refuses. Each opening form takes an optional first message; the folder is picked in Finder-style columns (with New folder, and the base named after the folder by default), staying inside your home folder and skipping hidden folders (on Windows also the ones with the Hidden or System attribute, such as AppData and the old profile links), and while the unit opens a deploy panel shows the real steps (create, start, join the net, deliver the first message) with each step's clock, and names the step and the reason when one fails. A pi that must confirm project trust before it starts (a folder with `.pi/` settings, extensions, skills, or MCP servers) asks in the GUI as an alert too, with the folder, what trusting would load, and Trust, Trust this time, or Don't trust (the terminal can answer as well, and the first answer counts; a paired phone may answer; the deploy panel of an opening shows it inline).
63
+ - **An unattended device**, a computer nobody sits at (a build box, a server), takes work from teammates' computers over Straw Link: it runs the sb server as the link holder, with no boot pi session, and a controller invites it from the GUI ([setup](docs/unattended-device.md), also [in Traditional Chinese](docs/unattended-device.zh-TW.md)).
54
64
  - **Broadcast** to a tab, a workspace, every tower (a workspace without one, through its mains or members), or every session.
55
65
  - **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.
56
66
  - **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)).
57
- - **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)).
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; 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)).
58
68
  - **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.
59
69
  - **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.
60
70
 
@@ -138,7 +148,7 @@ Subagents and sessions in Herdr worktree workspaces never join: the session that
138
148
  ## Net view in the sidebar
139
149
 
140
150
  An optional Herdr plugin in [`herdr-plugin/`](herdr-plugin) turns the sidebar's Agents list into a net view.
141
- It lists the head tower's workspace first, in each workspace the tower, then each tab's main agent and members, and every subagent right under the session that launched it, even in a worktree workspace.
151
+ It lists the head tower's workspace first (once the head tower exists), in each workspace the tower, then each tab's main agent and members, and every subagent right under the session that launched it, even in a worktree workspace.
142
152
  The view is on whenever the Herdr server starts, and one key switches it off and on again.
143
153
  pi-straw-boss writes the sort key (`sb_order`), a role label (`sb_mark`) and, on subagents, a tree branch (`sb_indent`) and the subagent's name (`sb_name`) the view and your sidebar rows can use.
144
154
  It needs Herdr 0.9.5 or newer and node.
package/README.zh-TW.md CHANGED
@@ -32,6 +32,14 @@
32
32
 
33
33
  <p align="center"><sub>禪:一次一件待辦、沒東西等時陪著的 session、沒有 session 時的呼吸圓圈、右上角選單、前情、指令面板、音樂,以及同樣的畫面在手機上的樣子。</sub></p>
34
34
 
35
+ **主塔台(head tower)** 是唯一不屬於任何專案的塔台。你和它只有一場很長的對話:在標準檢視有它自己的一頁,在禪檢視則是呼吸圓圈下方的幾行字。它判斷每件事該由哪個工作區處理,轉給那個工作區的塔台,那個工作區還沒有塔台就先替它開一座。它自己不做事;塔台回覆之後,它再用一行話告訴你。禪檢視裡,它最近說的話會隨時間慢慢淡去(滑鼠移上去就看得清楚,按 **H** 或往上滑可以看全部對話),輸入框平時只是一條細線,點一下或按 Enter 才展開。
36
+
37
+ <p align="center"><img src="docs/gui-head.png" width="49%" alt="標準檢視裡主塔台的頁面:標題有皇冠,對話裡有兩則轉給 Harbor API 和 Lighthouse Web 塔台的紀錄和一則回覆,進行中和已回覆的轉交以標籤列在下方,最下面是輸入框"> <img src="docs/gui-zen-head.png" width="49%" alt="禪檢視裡的主塔台:呼吸圓圈下方是它最近說的幾行字,其中有一行是 Lighthouse Web 塔台的回覆,再下面是一條細線的輸入框,寫著按 Enter 和主塔台說話"></p>
38
+
39
+ <p align="center"><img src="docs/gui-zen-head-open.png" width="49%" alt="輸入框展開、已打了一段草稿的禪檢視:主塔台的幾行字在滑鼠底下是清楚的"> <img src="docs/gui-phone-zen-head.png" width="220" alt="手機上的禪檢視:主塔台對話的兩行字、「全部對話」連結,和收起的輸入框"></p>
40
+
41
+ <p align="center"><sub>主塔台:它的頁面、禪檢視圓圈下方的幾行字、展開的輸入框,以及手機上的樣子。</sub></p>
42
+
35
43
  ![裝了 pi-straw-boss 的 Herdr:側邊欄的網路檢視列出每個工作區、塔台、主智慧體和子智慧體,旁邊是一個正在工作的主智慧體](docs/herdr-window.png)
36
44
 
37
45
  <p align="center"><sub>側邊欄開著網路檢視的 Herdr。</sub></p>
@@ -47,14 +55,16 @@
47
55
  - **每個工作區一座塔台。** 工作區出現第一個主智慧體時,塔台就在自己的分頁開起來,固定排在最前面。它負責協調各個主智慧體和其他塔台;沒有 session 負責的工作,它會開一個分頁、啟動新的主智慧體來處理。你不用跟它說話。
48
56
  - **即時儀表板**在塔台裡:誰加入了,他們和他們的子智慧體正在做什麼。
49
57
  - **塔台之間可以直接溝通。** 塔台能列出每個工作區的塔台(`tower_list`:訊息會送到誰、各分頁在做什麼),也能對其中一座或全部發訊息(`tower_send`);沒有塔台的工作區,訊息改送它的主智慧體,沒有主智慧體就送成員。`call_tower`、`boss_broadcast`、`tower_send` 的每則訊息開頭都有一行程式寫的標頭:誰送的、什麼角色、送給誰、要不要回覆([細節](docs/how-it-works.md#talking-between-towers),英文)。
58
+ - **你自己的主塔台。** 一座不屬於任何專案的塔台:你在 GUI(它自己的一頁,或禪檢視圓圈下方的幾行字)或用 `/boss head` 和它說話,它和你保持一場跨越多次執行的長對話,把每件事轉給該處理的工作區的塔台(用 `tower_send`,必要時先替那個工作區開一座塔台),塔台回覆之後用一行話告訴你。它只有查詢和轉交用的塔台工具,只聽你的話和對它自己轉交的回覆([細節](docs/how-it-works.md#the-head-tower),英文)。
50
59
  - **工作看板。** 主智慧體的看板由它的待辦清單和名稱自動填入(`board_set` 可覆寫);塔台讀每個主智慧體的項目(`board_read`),本機的,加上 Straw Link 團隊中隊友電腦上的,這樣塔台分派工作時知道各主智慧體做到哪([細節](docs/how-it-works.md#the-work-board))。
51
60
  - **塔台會關掉自己開的主智慧體。** 塔台替請求開出的主智慧體做完後,向發話者和那座塔台各回報一次;塔台確認裡面沒有東西在跑,就用 `boss_close_main` 把它關掉([細節](docs/how-it-works.md#closing-an-opened-main),英文)。
52
61
  - **給塔台的摘要**:自塔台上一輪以來,工作區裡有誰加入、啟動了哪些子智慧體、誰改了名字;塔台下一輪會讀進來一次,讀完就清掉([細節](docs/how-it-works.md#the-towers-digest))。
53
62
  - **瀏覽器畫面** `/boss gui` 看得到整張網:每個工作區是一座基地,裡面有塔台、智慧體和子智慧體,畫面會動,但只能看。點基地可以放大,點單位可以把它的對話當成即時通訊紀錄來讀;在等你回覆的單位會排成警示,按空白鍵開下一則,按 F 放大最上面的對話框,按 Esc 關掉它(打字時都不會觸發);回答問題也可以只用鍵盤:方向鍵選項目,Tab 依序走過每一題自己的答案框和備註、再換到下一題,Enter 確認並跳到下一題。頂端齒輪「設定」裡有兩個開關:單位在等你、出錯或完成時,一個會跳系統通知,一個會播音效;已完成的單位另外排在自己的清單裡,可以一個一個清,也可以一次全清;地圖上已結束的子智慧體也可以一個一個移除,或用位置列旁的「移除已完成」一次全移除。單位的通訊畫面也會列出它在背景跑的 Monitor,出錯或太久沒輸出的 Monitor 會列進標頭的「通知」(只有在等你回答的單位才會跳出醒目的警示,出錯和完成都只是安靜的通知);自己閒置、但它的子智慧體在工作或等待,或它的 Monitor 還在跑的單位,會顯示成帶光暈的「指揮中」;只在等 Monitor 跑完的單位,備註會用紅字顯示「監看中」。在桌面上點進單位的終端機,就能直接用鍵盤操作它。如果一個答案的下一步要在終端機進行(robot_hand 的「放進提示列」和開新 pane 的選項),畫面會出現一張小卡片讓你完成它:指令、窗格最後幾行、一行輸入(要輸入密碼時會自動遮住)和一個按鈕,另有連到完整終端機的連結,給 ssh 和 vim 這類程式用。畫面有英文和正體中文,預設跟隨瀏覽器語言,也可以從頂端「設定」裡的語言選單切換。地圖最後一張「+新基地」會在選定的資料夾開一座基地,裡面先有一位成員、沒有塔台。沒有塔台的基地只能加成員(基地上的「+成員」開在新分頁,小隊上的開在該小隊旁),等成員自己升格時才會開塔台;有塔台的基地只能加主智慧體(「+主智慧體」,各開在自己的分頁)。在 session 的輸入框貼上、拖進或用「+」選的檔案(最多 20 MB)會存到私有的暫存資料夾,路徑放進訊息。開啟表單都可以先填第一句指令;資料夾選擇只能在家目錄以下,也不會列出點開頭的資料夾。
63
+ - **無人值守裝置**是沒有人坐在前面的電腦(建置機、伺服器),透過 Straw Link 接隊友電腦送來的工作:它以 sb server 當連線持有者,沒有開機時啟動的 pi session,由控制端在 GUI 邀請它加入([設定方式](docs/unattended-device.zh-TW.md);[English](docs/unattended-device.md))。
54
64
  - **廣播**給一個分頁、一個工作區、所有塔台(沒有塔台的工作區改送主智慧體或成員),或所有 session。
55
65
  - **分頁保持整齊。** pi 在分頁裡啟動或結束時,分頁裡的 pane 會重新平均分配,一個一個切出來的 worker 就不會留下一長串對半切的窄 pane。
56
66
  - **斷線的子智慧體會被提醒回報。** 子智慧體做完後還開著,但開出它的 pi 已經重開、收不到它的結果時,它會收到一則 intercom,請它把最終報告送回去,只會送一次([運作方式](docs/how-it-works.md#orphaned-subagents))。
57
- - **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),英文)。
67
+ - **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),英文)。
58
68
  - **Herdr 側邊欄的網路檢視。** 一個選用的 plugin 會把 Agents 清單排成網的樣子:塔台在前,每個子智慧體排在開出它的人底下。預設開啟,按一個鍵就能切換。
59
69
  - **清理閒置的 worktree pane。** 另一個選用的 plugin 會關掉智慧體在 worktree 工作區留下的 pane,移除乾淨且沒有東西在用的 checkout,並保留你釘選的工作區。
60
70
 
@@ -134,7 +144,7 @@ pi install npm:pi-straw-boss
134
144
  ## 側邊欄的網路檢視
135
145
 
136
146
  [`herdr-plugin/`](herdr-plugin) 裡有一個選用的 Herdr plugin,會把側邊欄的 Agents 清單變成網路檢視。
137
- 它先列出首席塔台(head tower)所在的工作區;每個工作區裡先列塔台,再列各分頁的主智慧體和成員,每個子智慧體緊接在開出它的 session 底下,即使它在 worktree 工作區裡也一樣。
147
+ 它先列出主塔台(head tower)所在的工作區(主塔台存在時);每個工作區裡先列塔台,再列各分頁的主智慧體和成員,每個子智慧體緊接在開出它的 session 底下,即使它在 worktree 工作區裡也一樣。
138
148
  Herdr server 啟動時這個檢視就會打開,按一個鍵可以關掉,再按一次打開。
139
149
  pi-straw-boss 會寫入排序鍵(`sb_order`)、角色標記(`sb_mark`),子智慧體另外有樹狀分支(`sb_indent`)和它的名稱(`sb_name`),網路檢視和你自己的側邊欄列設定都可以用。
140
150
  需要 Herdr 0.9.5 以上和 node。
@@ -1,4 +1,4 @@
1
- import{t as e}from"./runtime-ZX6HkxDa.js";import{t}from"./ask-GnsZN-ZU.js";import{n}from"./post-CmicYl-f.js";import{j as r}from"./index-xkaqCr46.js";var i=((t={},n={})=>(n.locale??e())===`zh-TW`?`這些訊息在 sb server 的佇列裡,等塔台下一個 run 取走;run 啟動時就會被取走。`:`These messages wait in the sb server's queue for the tower's next run; they are taken when it runs.`),a=((t={},n={})=>(n.locale??e())===`zh-TW`?`塔台正在待命:沒有進行中的 run,所以沒有終端機。請在輸入框寫給它,那會喚醒它。`:`The tower is standing by: no run is live, so there is no terminal. Write to it in the composer; that wakes it.`),o=((t={},n={})=>(n.locale??e())===`zh-TW`?`塔台因反覆當機而暫停,沒有終端機。請重試,或在「通訊」裡寫給它。`:`The tower is held after repeated crashes, so it has no terminal. Retry it, or write to it in Comms.`),s=((t={},n={})=>(n.locale??e())===`zh-TW`?`塔台正在待命,沒有終端機。run 被喚醒時才會開一個;請在「通訊」裡寫給它來喚醒。`:`The tower is standing by, so it has no terminal. A run opens one when it wakes; write to it in Comms to wake it.`),c=`[the boss writes to you from the GUI or /boss tower; this is an instruction]`,l=`[possibly handled by a run that crashed: check before acting]`;function u(e){let t=(e??``).split(`
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{t}from"./ask-C-Qv3UNu.js";import{n}from"./post-CmicYl-f.js";import{I as r}from"./index-u3qCp7xY.js";var i=((t={},n={})=>(n.locale??e())===`zh-TW`?`這些訊息在 sb server 的佇列裡,等塔台下一個 run 取走;run 啟動時就會被取走。`:`These messages wait in the sb server's queue for the tower's next run; they are taken when it runs.`),a=((t={},n={})=>(n.locale??e())===`zh-TW`?`塔台正在待命:沒有進行中的 run,所以沒有終端機。請在輸入框寫給它,那會喚醒它。`:`The tower is standing by: no run is live, so there is no terminal. Write to it in the composer; that wakes it.`),o=((t={},n={})=>(n.locale??e())===`zh-TW`?`塔台因反覆當機而暫停,沒有終端機。請重試,或在「通訊」裡寫給它。`:`The tower is held after repeated crashes, so it has no terminal. Retry it, or write to it in Comms.`),s=((t={},n={})=>(n.locale??e())===`zh-TW`?`塔台正在待命,沒有終端機。run 被喚醒時才會開一個;請在「通訊」裡寫給它來喚醒。`:`The tower is standing by, so it has no terminal. A run opens one when it wakes; write to it in Comms to wake it.`),c=`[the boss writes to you from the GUI or /boss tower; this is an instruction]`,l=`[possibly handled by a run that crashed: check before acting]`;function u(e){let t=(e??``).split(`
2
2
  `,1)[0];if(t.startsWith(`[intercom from `)&&t.endsWith(`]`))return{kind:`intercom`,from:t.slice(15,-1)};if(t===`[notice from the sb server]`)return{kind:`server`};if(t===`[your wakeAfter follow-up is due]`)return{kind:`timer`}}function d(e){let t=(e??``).split(`
3
3
  `);if(t[0]!==`[the boss writes to you from the GUI or /boss tower; this is an instruction]`)return;let n=t[1]===l;return{body:t.slice(n?2:1).join(`
4
4
  `),crashed:n}}function f(e){let t=(e??``).trim(),n=/^(.*?)\s*\(([^()]*)\)$/.exec(t);return n?{name:n[1],...n[2]?{id:n[2]}:{}}:{name:t}}function p(e){let t=e??``;if(!t.startsWith(`[straw net `))return;let n={},r=11;for(;;){for(;t[r]===` `;)r++;if(t[r]===`]`)break;let e=t.indexOf(`=`,r);if(e<0||!/^[a-z]+$/.test(t.slice(r,e)))return;let i=t.slice(r,e),a;if(t[e+1]===`"`){if(a=t.indexOf(`"`,e+2),a<0)return;n[i]=t.slice(e+2,a++)}else{for(a=e+1;a<t.length&&t[a]!==` `&&t[a]!==`]`;)a++;n[i]=t.slice(e+1,a)}r=a}return{fields:n,raw:t.slice(0,r+1),body:t.slice(r+1).replace(/^ /,``)}}var m={intercom:e=>e.startsWith(`[intercom from `)&&e.endsWith(`]`),notice:e=>e===`[notice from the sb server]`,timer:e=>e===`[your wakeAfter follow-up is due]`};function h(e){let t=e.text??``,n=e=>{let n=t.split(`
@@ -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{Rt as o,Ut as s,t as c,vt as l}from"./index-xkaqCr46.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:o,by:s}=e.body;return a===`accepted`?[`ok`,i?h():n()]:a===`stale`?[`error`,s===`local`?R():s===`cancel`?I():L()]:a===`rejected`?[`error`,(Object.hasOwn(Q,String(o))?Q[String(o)]:j)()]:a===`busy`?[`error`,t()]:a===`unknown`||e.status===504?[`error`,r(),!0]:[`error`,o??l({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`,l,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 o=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]=o?ne(o,n.cancel===!0):[`error`,r(),!0];[e.done,e.sending,O,e.busy]=[!o||re(o),!1,!1,o?.body.outcome===`busy`],A(e.note,d,p,...m?[u]:[]);let h=o?.body.outcome===`accepted`?o.body.then:void 0,g=h&&c(h,{key:l?.key??``,command:e.copy,answerId:String(n.answerId??``)});g&&A(e.note,d,`${p} ${g}`),j(),e.note.scrollIntoView?.({block:`nearest`}),f&&o?.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 c=e.tool===`secret_drop`;i&&!c&&Z(i,n)&&((a.cancel=s(`button`,{type:`button`,class:`ask-cancel`},o())).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=l&&e.tool!==`secret_drop`&&s(`button`,{type:`button`,class:`cmp-link`},p());m&&(m.onclick=l.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&&!c?i.select?R(a,i):B(a,i):[...t.length?t.map(e=>G(e,r)):[s(`p`,{class:`ask-why`},c?n?M():N():e.why??z())],s(`div`,{class:`ask-acts`},c?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{Mt as o,ct as s,nn as c,t as l}from"./index-u3qCp7xY.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,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-KmbJsZ0O.css"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{n as t,t as n}from"./markdown-DvbY97ID.js";import{c as r,l as i,o as a,s as o}from"./answer-DJ5VqXQ9.js";import{L as s,N as c,Xt as l,b as u,ct as d,d as f,ut as ee,w as p}from"./index-u3qCp7xY.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-${f[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),d(`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:f,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=d(`div`,{class:`chat-list`}),y=d(`div`,{class:`chat-top`}),b=d(`div`,{class:`chat-live`}),x=d(`div`,{class:`chat-end`}),S=d(`button`,{class:`chat-pill`,type:`button`,hidden:``}),C=d(`p`,{class:`chat-empty`},pe()),w=d(`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 d(`div`,{class:`pics`},...n.map((e,t)=>{let r=d(`img`,{src:e,alt:le({n:t+1}),loading:`lazy`,decoding:`async`}),i=d(`button`,{type:`button`,class:`pic`,"aria-label":ke({n:t+1})},r);return r.addEventListener(`error`,()=>i.replaceWith(d(`em`,{class:`pic-gone`},ue()))),i.addEventListener(`click`,()=>void c(async()=>{let{lightbox:e}=await import(`./lightbox-Cll4QKla.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=d(`pre`,{class:`out`},n?.text??``),i=d(`pre`,{class:`args`},e.args??``),a=e.cut?d(`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?d(`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?d(`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=d(`details`,{class:`act`},d(`summary`,{"data-mark":n?n.isError?`error`:`done`:`working`},d(`b`,{class:`badge`}),d(`code`,null,e.name),d(`span`,{class:`sum`},e.summary),s),i,a,n&&d(`div`,{class:`result`},n.images?d(`em`,null,de({count:n.images})):null,r,o)),l=n&&z(n.id,n.images);return l?[c,l]:[c]}let B=e=>d(`time`,null,He(e.at)),V=(e,t,n,r)=>d(`article`,{class:`tx you`},d(`header`,null,B(e),d(`b`,null,Ie()),X(`user`)),d(`div`,{class:`bubble`,title:r},n?d(`small`,{class:`boss-flag`},te()):null,...Ge(t),z(e.id,e.images))),H=(e,t,n,r={})=>d(`article`,{class:`tx sys`},d(`details`,{class:`notice`},d(`summary`,null,X(`comms`),d(`em`,null,fe()),...t,B(e)),r.crashed?d(`small`,{class:`boss-flag`},te()):null,d(`pre`,null,n),r.raw?d(`details`,{class:`notice-raw`},d(`summary`,null,he()),d(`pre`,{class:`raw`},r.raw)):null)),U=e=>{let t=i(e);return[ge(),` `,t.name&&p(t.name)||t.name,t.id?` (${t.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(i){switch(i.kind){case`user`:{let e=f().service?r(i.text):void 0;if(e)return H(i,e.kind===`intercom`?U(e.from):[e.kind===`server`?Te():Ee()],i.text??``);let t=f().service?a(i.text):void 0;return V(i,t?t.body:i.text??``,t?.crashed,t?i.text??``:``)}case`assistant`:{let e=f(),r=d(`pre`,{class:`thought-text`}),a=i.thought?d(`button`,{class:`thought`,type:`button`},i.thought<0?Ne():Me({count:i.thought.toLocaleString()})):null;return i.thought&&i.thought>0&&a?.addEventListener(`click`,()=>R(a,r,i.id,e=>e.thoughtText)),d(`article`,{class:e.head?`tx in head`:`tx in`},X(e.head?`crown`:e.role),d(`div`,{class:`tx-body`},d(`header`,null,d(`b`,null,Ve(e)),i.model?d(`span`,null,i.model):null,B(i),i.stop?d(`span`,{class:`stop`,"data-mark":`error`},i.stop):null),a,r,i.text?d(`div`,{class:`md`},n(t(i.text))):null,i.error?d(`p`,{class:`fault`},i.error):null,...(i.tools??[]).flatMap(e=>Se(e,i.id))))}case`bash`:return d(`article`,{class:`tx sys`},d(`details`,{class:`act`},d(`summary`,{"data-mark":i.exit?`error`:`done`},d(`b`,{class:`badge`}),d(`code`,null,`shell`),d(`span`,{class:`sum`},`! ${i.command}`),i.exit?d(`span`,{class:`stop`,"data-mark":`error`},oe({code:i.exit})):null),i.text?d(`pre`,{class:`out`},i.text):null));case`notice`:{let e=o(i);return e?.kind===`boss`&&f().service?V(i,e.body,e.crashed,i.text??``):e&&e.kind!==`boss`?H(i,De(e),e.body,e.kind===`link`?{raw:e.raw}:{crashed:e.crashed}):H(i,[We[i.type??``]?.()??i.type??me(),` `,i.from&&p(i.from)||(i.from??``)],i.text??``)}case`divider`:return i.type===`chapter`?d(`article`,{class:`tx rule chapter`},d(`p`,null,ce({date:i.at?new Date(i.at).toLocaleDateString(e(),{year:`numeric`,month:`short`,day:`numeric`}):``,why:Be(i.code,i.text)}))):d(`article`,{class:`tx rule`},d(`details`,null,d(`summary`,null,i.type===`compaction`?ie({tokens:(i.tokens??0).toLocaleString()}):ne()),d(`pre`,null,i.text??``)));default:return d(`article`,{class:`tx note`},i.text??``,` `,B(i))}}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=f().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,s(t)]),o=q.get(t.id);if(e.add(t.id),o&&o.sig===a&&o.el.isConnected)continue;o?.el.remove();let c=s(t),l=d(`article`,{class:`tx rule conv-rule`},d(`div`,null,d(`b`,null,c.title),c.ended?d(`small`,null,c.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?[d(`b`,{class:`badge`}),d(`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-CkqCcjIG.js";import{A as i,C as a,D as o,E as s,M as c,T as l,Xt as ee,Zt as u,b as d,ct as f,h as p,i as m,j as h,m as g,o as _,p as v,v as y,w as b,xt as x}from"./index-u3qCp7xY.js";var S=((t={},n={})=>(n.locale??e())===`zh-TW`?`關閉清單`:`Close the list`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`切換到其他單位`:`Switch to a unit`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`回到主地圖`:`Back to the map`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`所有單位`:`All units`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`指揮中`:`commanding`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`已結束`:`ended`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`錯誤`:`error`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`閒置`:`idle`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`無狀態`:`unknown`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`等待`:`waiting`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`工作中`:`working`),N=.4;function P(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 F=(e,t,n)=>Math.abs(n)>=.45?n>0:e>=t*N,I=(e,t)=>t||e.some(e=>e.editable||e.sink||e.scrollsX||[`input`,`textarea`,`select`].includes(e.tag));function L(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 R=e=>{let t=[];for(let n=e;n;n=n.parentElement)t.push(L(n));return t},z={working:M,waiting:j,idle:k,done:D,error:O,unknown:A,commanding:E},B=(e,t,n)=>(t?D:z[e])({},n&&{locale:n}),V=(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 H(e){return e.bases.flatMap(e=>{let t=[{id:`tower`,rows:e.tower?V(e.id,[{...e.tower,role:`tower`}]):[]},...e.tabs.map(t=>({id:t.id,label:x({label:t.label}),rows:V(e.id,t.units)})),{id:`outside`,label:n(),rows:V(e.id,e.outside)}].filter(e=>e.rows.length);return t.length?[{id:e.id,label:e.label,mark:e.mark,groups:t}]:[]})}var U=(e,t)=>e?.head?{mark:e.head.mark,word:e.head.state===`absent`?u({},t&&{locale:t}):B(e.head.mark,!1,t)}:void 0,W=e=>e.role===`main`&&e.mark===`idle`,G=e=>e.reduce((e,t)=>(t.sub?e.at(-1)?.subs.push(t):e.push({...t,subs:[]}),e),[]),K=()=>d(`<div class="unit"><div class="card"><a class="hit"></a>${v}<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>`),q=()=>d(`<div class="unit tower-row"><div class="trow"><a class="tower-go">${v}<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>`),J=()=>d(`<section class="dbase"><h3><a></a><small></small></h3><div class="dgroups"></div></section>`),te=()=>d(`<div class="dgroup"><h4></h4><div class="drows"></div></div>`),ne=()=>matchMedia(`(max-width: 640px)`).matches;function Y(e=()=>!1){let n=f(`div`,{class:`drawer-body`}),u=f(`button`,{type:`button`,class:`x`,"aria-label":S()},`×`),v=f(`a`,{class:`drawer-map`},w()),x=f(`button`,{type:`button`,class:`pair-btn`,"data-close":`dismiss-all`,hidden:``}),E=f(`div`,{class:`drawer-sweep`,hidden:``},x);g(v,{view:`map`});let D=d(`<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>`);D.hidden=!0,g(D,{view:`head`});let O=f(`aside`,{class:`drawer`,"aria-label":C()},f(`header`,null,f(`b`,null,T()),u),D,n,f(`footer`,{class:`drawer-foot`},E,v)),k=f(`div`,{class:`drawer-veil`});document.body.append(k,O);let A,j,M=!1,N=!1,L=0,z=0,V,Y=()=>{let e=U(A);D.hidden=!e,e&&(a(D,e.mark),o(D,`.name`,ee()),o(D,`.dstate`,e.word),D.classList.toggle(`current`,M),D.toggleAttribute(`data-news`,m(A?.head,_())&&!M)),c(x,A??{bases:[]}),E.hidden=x.hidden;let u=(e,t)=>{g(e.querySelector(`.hit`),{view:`session`,ws:t.ws,key:t.key}),e.querySelector(`.hit`).setAttribute(`aria-label`,`${t.name}: ${B(t.mark,t.ended)}`),e.classList.toggle(`current`,t.key===j),e.toggleAttribute(`data-dismiss`,t.role===`subagent`&&t.ended),e.dataset.key=t.key,a(e,t.mark),y(e.querySelector(`.plate`),t.role,t.mark),o(e,`.name`,t.name),o(e,`.role`,b(t.role)),o(e,`.dstate`,B(t.mark,t.ended)),l(e,`.note`,t.note,t.mark,t.note?void 0:``);let n=e.querySelector(`:scope > .card > .quit-btn`);W(t)?i(n,t):n.hidden=!0,s(e.querySelector(`.subs`),t.subs??[],K,u)},d=(e,n)=>{let r=e.querySelector(`.tower-go`),i=e.querySelector(`.tower-add`),c=A?.bases.find(e=>e.id===n.ws);g(r,{view:`session`,ws:n.ws,key:n.key}),r.setAttribute(`aria-label`,`${n.name}: ${B(n.mark,n.ended)}`),e.classList.toggle(`current`,n.key===j),e.dataset.key=n.key,a(e,n.mark),y(r.querySelector(`.plate`),`tower`,n.mark),o(r,`.name`,n.name),o(r,`.role`,b(`tower`)),o(r,`.dstate`,B(n.mark,n.ended)),i.hidden=!c,c&&(p(i,c),i.setAttribute(`aria-label`,t({base:c.label}))),s(e.querySelector(`.subs`),n.subs,K,u)};s(n,H(A??{bases:[]}),J,(e,t)=>{a(e,t.mark),o(e,`h3 a`,t.label),g(e.querySelector(`h3 a`),{view:`workspace`,ws:t.id}),o(e,`small`,r({count:t.groups.reduce((e,t)=>e+t.rows.length,0)})),s(e.querySelector(`.dgroups`),t.groups,te,(e,t)=>{o(e,`h4`,t.label??``),e.querySelector(`h4`).toggleAttribute(`hidden`,!t.label),t.id===`tower`?s(e.querySelector(`.drows`),G(t.rows),q,d):s(e.querySelector(`.drows`),G(t.rows),K,u)})})},X=e=>{L=Math.max(0,Math.min(z,e)),O.style.setProperty(`--dx`,`${L}px`),k.style.opacity=String(z?L/z:0),k.style.pointerEvents=L>0?`auto`:`none`},Z=e=>{N=e,O.classList.toggle(`on`,e),O.inert=!e,document.documentElement.classList.remove(`drawer-drag`),X(e?z:0)},Q=()=>{z=O.offsetWidth,Y(),O.classList.add(`on`),document.documentElement.classList.add(`drawer-drag`)};O.inert=!0,document.addEventListener(`touchstart`,t=>{let n=t.target,r=O.contains(n)||n===k;if(V=void 0,!ne()||e()||t.touches.length!==1||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(N?!r:I(R(n),!!getSelection()?.toString())))return;let i=t.touches[0],a=N?n.closest(`.unit[data-dismiss] > .card`)??void 0:void 0;V={x0:i.clientX,y0:i.clientY,mode:`wait`,was:N,base:L,last:i.clientX,at:performance.now(),v:0,card:a}},{passive:!0}),document.addEventListener(`touchmove`,e=>{if(!V||V.mode===`pass`)return;let t=e.touches[0],n=t.clientX-V.x0,r=t.clientY-V.y0;if(V.mode===`wait`){let e=P(n,r,V.was);if(e===`wait`)return;if(e===`pass`&&V.card&&P(n,r,!1)===`drag`)V.mode=`card`,V.card.classList.add(`swiping`);else if(e===`pass`)return void(V.mode=`pass`);else V.mode=`drag`,Q()}e.preventDefault();let i=performance.now();if(V.v=(t.clientX-V.last)/Math.max(1,i-V.at),[V.last,V.at]=[t.clientX,i],V.mode!==`card`)return X(V.base+n);let a=Math.max(0,n);V.card.style.setProperty(`--sx`,`${a}px`),V.card.style.setProperty(`--so`,String(1-a/V.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`),h({key:e.parentElement.dataset.key}).then(t=>t||e.classList.remove(`gone`)))},$=e=>{let t=V;V=void 0,t?.mode===`drag`&&Z(F(L,z,t.v)),t?.mode===`card`&&re(t.card,e.type===`touchend`&&F(Math.max(0,t.last-t.x0),t.card.offsetWidth,t.v))};return document.addEventListener(`touchend`,$),document.addEventListener(`touchcancel`,$),k.addEventListener(`click`,()=>Z(!1)),O.addEventListener(`click`,e=>e.target.closest(`a[data-route], button[data-open], .x`)&&Z(!1)),document.addEventListener(`keydown`,e=>N&&e.key===`Escape`&&(e.preventDefault(),Z(!1)),!0),document.addEventListener(`sb-drawer`,()=>(N||Q(),Z(!N))),{net(e){A=e,N&&Y()},route(e){j=e.view===`session`?e.key:void 0,M=e.view===`head`||e.view===`session`&&e.ws===`@head`,v.toggleAttribute(`aria-current`,e.view===`map`),N&&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{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{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}}