pi-straw-boss 0.45.0 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/README.zh-TW.md +5 -3
- package/dist/gui/assets/ask-CcSFgdLu.js +1 -0
- package/dist/gui/assets/chat-B0LA0PS7.js +2 -0
- package/dist/gui/assets/{drawer-xwDrm4Ic.js → drawer-Bf-VvXvz.js} +1 -1
- package/dist/gui/assets/index-CdNhDwzw.css +1 -0
- package/dist/gui/assets/index-jShEPou6.js +1 -0
- package/dist/gui/assets/layer-CfjjGGBx.js +3 -0
- package/dist/gui/assets/lightbox-iVlYCaj1.js +1 -0
- package/dist/gui/assets/{link-txZQw2rn.js → link-D6BSHU7X.js} +1 -1
- package/dist/gui/assets/{pair-CKNaA6Dw.js → pair-DIUnQzxd.js} +1 -1
- package/dist/gui/assets/picker-BX92P-En.js +1 -0
- package/dist/gui/assets/server-3HZ1jHKy.js +2 -0
- package/dist/gui/assets/{spawn-DNvhBds9.js → spawn-CSy62eQX.js} +1 -1
- package/dist/gui/assets/{trust-B4Mz7ezm.js → trust-C0Ke7S1q.js} +1 -1
- package/dist/gui/assets/unit_count-eYZk4NHE.js +1 -0
- package/dist/gui/assets/views-Dv5aloYQ.js +10 -0
- package/dist/gui/index.html +3 -2
- package/dist/server/{chunk-KDUVK2ET.mjs → chunk-J6MGDP7Q.mjs} +1175 -335
- package/dist/server/cli.mjs +59 -11
- package/dist/server/main.mjs +10413 -227
- package/package.json +3 -2
- package/prompts/tower-run.md +10 -0
- package/src/agent/config.ts +3 -3
- package/src/agent/kit.ts +2 -0
- package/src/boss.ts +19 -4
- package/src/bridge.ts +3 -5
- package/src/bridgewire.ts +10 -0
- package/src/control.ts +47 -4
- package/src/dashboard.ts +19 -5
- package/src/devices.ts +3 -3
- package/src/dialogs.ts +2 -1
- package/src/digest.ts +8 -0
- package/src/eventmarks.ts +3 -0
- package/src/guard.ts +15 -2
- package/src/gui.ts +62 -37
- package/src/handover.ts +41 -192
- package/src/header.ts +1 -1
- package/src/headwatch.ts +15 -5
- package/src/host.ts +54 -146
- package/src/index.ts +15 -10
- package/src/integration.ts +32 -0
- package/src/link/election.ts +1 -1
- package/src/link/guiport.ts +142 -0
- package/src/link/holder.ts +19 -9
- package/src/link/remotelist.ts +23 -0
- package/src/link/runtime.ts +65 -238
- package/src/link/service.ts +277 -0
- package/src/link/text.ts +5 -0
- package/src/membership.ts +2 -2
- package/src/net.ts +26 -8
- package/src/opener.ts +18 -1
- package/src/orphan.ts +1 -1
- package/src/pairing.ts +5 -5
- package/src/reach.ts +69 -10
- package/src/remote.ts +4 -2
- package/src/restored.ts +253 -0
- package/src/runmode.ts +314 -0
- package/src/server/cli.ts +71 -15
- package/src/server/client.ts +97 -40
- package/src/server/guihost.ts +346 -0
- package/src/server/main.ts +194 -17
- package/src/server/record.ts +108 -27
- package/src/server/rungate.ts +29 -0
- package/src/server/runs.ts +730 -0
- package/src/server/runtools.ts +129 -0
- package/src/server/testguard.ts +115 -0
- package/src/server/towerbrief.ts +114 -0
- package/src/server/towerclient.ts +70 -0
- package/src/server/towerruns.ts +21 -0
- package/src/server/towerrunstore.ts +121 -0
- package/src/server/towers.ts +607 -0
- package/src/server/towerseen.ts +100 -0
- package/src/server/towerstore.ts +264 -0
- package/src/server/version.ts +7 -1
- package/src/server/winprep.ts +242 -47
- package/src/server-look.ts +59 -13
- package/src/session.ts +20 -18
- package/src/stashing.ts +13 -13
- package/src/state.ts +8 -11
- package/src/tools.ts +2 -2
- package/src/tower.ts +24 -4
- package/src/trust/ask.ts +74 -21
- package/dist/gui/assets/ask-87CEae19.js +0 -1
- package/dist/gui/assets/chat-YJh7eBNK.js +0 -2
- package/dist/gui/assets/index-D9X5KUWx.css +0 -1
- package/dist/gui/assets/index-DXzYIOEk.js +0 -1
- package/dist/gui/assets/layer-BftPkkIR.js +0 -3
- package/dist/gui/assets/lightbox-E36JAY2U.js +0 -1
- package/dist/gui/assets/picker-lrLxTm02.js +0 -1
- package/dist/gui/assets/registry-Bx4Ukv2M.js +0 -1
- package/dist/gui/assets/unit_count-DTUtsZm9.js +0 -1
- package/dist/gui/assets/views-DYGKQ7zU.js +0 -7
package/README.md
CHANGED
|
@@ -38,6 +38,7 @@ Run a few agents on the same project and they start stepping on each other: two
|
|
|
38
38
|
- **Broadcast** to a tab, a workspace, every tower (a workspace without one, through its mains or members), or every session.
|
|
39
39
|
- **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.
|
|
40
40
|
- **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)).
|
|
41
|
+
- **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)).
|
|
41
42
|
- **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.
|
|
42
43
|
- **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.
|
|
43
44
|
|
|
@@ -50,6 +51,7 @@ pi install npm:pi-straw-boss
|
|
|
50
51
|
### Requirements
|
|
51
52
|
|
|
52
53
|
- pi running inside [Herdr](https://herdr.dev) 0.9.4 or newer.
|
|
54
|
+
- Herdr's pi integration (`herdr integration install pi`): without it Herdr does not name a pane's pi session, and the session cannot join the net; each session warns once, 20 s after its start, when it is missing.
|
|
53
55
|
- [pi-intercom](https://www.npmjs.com/package/pi-intercom) 0.18.1 or newer: the net's channels, messages, and the GUI's dialog relay run over it, and so does the sb server's connection (it checks the version at start and says so in `start-error.json` and `boss_server status` when pi-intercom is older or missing).
|
|
54
56
|
- Windows support is experimental: the extension reaches Herdr over its named pipe there, the sidebar plugin runs with the `node` on `PATH`, and the worktree reaper is macOS and Linux only ([what differs](docs/how-it-works.md#windows)).
|
|
55
57
|
|
|
@@ -76,7 +78,7 @@ Any extension's `select` and `confirm` (an `mp-infra` command review, say) can b
|
|
|
76
78
|
3. Type `/boss tower` to open the workspace's tower and watch its dashboard. It also opens by itself when agents start to collide.
|
|
77
79
|
4. Type `/boss gui` from any session to see the whole net in your browser.
|
|
78
80
|
|
|
79
|
-
The tower only routes and coordinates, so it can run a lighter model: set `towerModel` in `~/.pi/agent/straw-boss/config.json` ([how it works](docs/how-it-works.md#how-it-works)).
|
|
81
|
+
The tower only routes and coordinates, so it can run a lighter model: set `towerModel` in `~/.pi/agent/straw-boss/config.json` ([how it works](docs/how-it-works.md#how-it-works)). The experimental tower service of the sb server, with its local runs (a tower that wakes for the events it gets and ends with a handoff note, and `/boss tower <prompt>` to write to it), is off unless `towerRuns.enabled` is `true` there ([how it works](docs/how-it-works.md#the-tower-service-b4-off-by-default)).
|
|
80
82
|
|
|
81
83
|
## Tools and commands
|
|
82
84
|
|
|
@@ -96,13 +98,13 @@ The tower only routes and coordinates, so it can run a lighter model: set `tower
|
|
|
96
98
|
| `boss_rename` | Name this session with a short phrase for its current work; the net and the GUI show it, and a main agent's tab takes it as its label. Main agents call it when their work changes. |
|
|
97
99
|
| `/boss` | Take over as this tab's main agent. |
|
|
98
100
|
| `/boss status`, `/boss tower` | Show the status; open and focus the tower. |
|
|
99
|
-
| `/boss server`, `/boss server stop`, `/boss server restart [reason]` | Show the sb server and start it when it is down; stop it on purpose (after a confirm; nothing but a boss command starts it again); restart it (after a confirm) on the same port
|
|
101
|
+
| `/boss server`, `/boss server stop`, `/boss server restart [reason]` | Show the sb server and start it when it is down; stop it on purpose (after a confirm; nothing but a boss command starts it again); restart it (after a confirm) on the same port; the GUI then has a new token, so reopen it with `/boss gui`. See [The sb server](docs/how-it-works.md#the-sb-server). |
|
|
100
102
|
| `/boss close` | Quit this session and close its pane. |
|
|
101
103
|
| `/boss close all` | Quit this base's tower, mains, and members and close it with its shells, without stashing. It is checked first as a stash checks it; anything running that would be lost (a turn, a queued message, a dialog, a monitor, a subagent, a busy shell) closes nothing, and every reason is listed. Other bases are never touched. |
|
|
102
104
|
| Stash, Stashed, Pop on the page | A base's Stash puts it away under its label; the HUD's Stashed list opens each one again with Pop. A base's Quit is checked first, as `/boss close all` is. |
|
|
103
105
|
| `/boss stash [name]`, `/boss pop [name]` | Put this whole base away (its tower, mains, members, and idle shells) and close it; open it again later, every pi resumed from its own session file in its old role. A stash refuses, naming why, while anything a resume would lose is there: a running turn, a queued message, an open dialog, a running monitor, a subagent, or a busy shell. |
|
|
104
|
-
| `/boss gui`, `/boss gui stop` | Open the net in the browser (any session, joins nothing); stop its
|
|
105
|
-
| `/boss gui remote`, `/boss gui remote off` | Reach the GUI from your phone over your tailnet (`tailscale serve`, never Funnel): pair by QR code, and a phone stays paired (90 days from its last use,
|
|
106
|
+
| `/boss gui`, `/boss gui stop` | Open the net in the browser (any session, joins nothing); stop its GUI, from any session. The GUI is served by the sb server, one per machine, so it does not depend on which pi session runs: `/boss gui` starts the server when none runs and prints the URL, and a server that went down comes back when any pi session starts or looks (or from `cli.mjs up`). The URL carries a random token that lasts as long as the listener that drew it: a restart, an upgrade, a crash, or a `/boss gui stop` followed by `/boss gui` gives a new one (on the same port when it is free), the old one answers 403, and a page left open stops working, so reopen the GUI with `/boss gui`; a phone scans the QR code again. With `STRAW_BOSS_DESK=1` (a desk shell shows the page itself) it opens no browser and the page leaves out Phone and Stash. Only `/boss gui stop` keeps the GUI stopped, until the next `/boss gui` or `cli.mjs up`; `/boss stash` and `/boss close all` do not start a stopped GUI. The header's Server button (this computer's page only) shows the server's state, restarts it, and shows its log. Type into a session from its comms view, or work its terminal with the key pad under the terminal tile, or on a desktop by clicking into it and typing; answer a waiting `robot_hand` selector, `ask_user_question` questionnaire, or pi-code hook confirmation there or in its alert (so can any extension's `select` and `confirm`, also from a paired device; other dialogs show read-only, to answer in the terminal; `secret_drop` always takes its secret in the terminal, never on a page, local or over the tailnet, because pi-intercom identities are self-reported). Documents a session shows with [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 or newer open beside its comms: HTML in a sandboxed frame whose form answers the agent, text read-only. |
|
|
107
|
+
| `/boss gui remote`, `/boss gui remote off` | Reach the GUI from your phone over your tailnet (`tailscale serve`, never Funnel): pair by QR code, and a phone stays paired (90 days from its last use, `remote off` included) until you unpair it in the Phone tile or the GUI listener ends (a pairing belongs to the listener's token: every restart needs a new QR); remote access stays on across a restart or a new server until `remote off`, but the new server's GUI has a new token, so a phone scans the QR code again after a restart, and the old pairings are cleared (its cookie belongs to the old token's path; an installed home-screen app is removed and installed again); off removes only its own serve entry. The serve entry points at a second loopback listener of the sb server's GUI, so a request is remote because of the listener it arrived on, whatever headers it carries. The page installs as an app (Add to Home Screen, or Chrome's Install): install it after pairing in the browser, since iOS copies the browser's cookies into the app only once, at install; on iOS, an app that loses its pairing is deleted and installed again after pairing in Safari; on Android, an app installed from Chrome shares Chrome's pairing, so pair in Chrome and open the app again. |
|
|
106
108
|
|
|
107
109
|
Subagents and sessions in Herdr worktree workspaces never join: the session that launched them speaks for them. Outside Herdr the extension does nothing.
|
|
108
110
|
|
package/README.zh-TW.md
CHANGED
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
- **廣播**給一個分頁、一個工作區、所有塔台(沒有塔台的工作區改送主智慧體或成員),或所有 session。
|
|
39
39
|
- **分頁保持整齊。** pi 在分頁裡啟動或結束時,分頁裡的 pane 會重新平均分配,一個一個切出來的 worker 就不會留下一長串對半切的窄 pane。
|
|
40
40
|
- **斷線的子智慧體會被提醒回報。** 子智慧體做完後還開著,但開出它的 pi 已經重開、收不到它的結果時,它會收到一則 intercom,請它把最終報告送回去,只會送一次([運作方式](docs/how-it-works.md#orphaned-subagents))。
|
|
41
|
+
- **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),英文)。
|
|
41
42
|
- **Herdr 側邊欄的網路檢視。** 一個選用的 plugin 會把 Agents 清單排成網的樣子:塔台在前,每個子智慧體排在開出它的人底下。預設開啟,按一個鍵就能切換。
|
|
42
43
|
- **清理閒置的 worktree pane。** 另一個選用的 plugin 會關掉智慧體在 worktree 工作區留下的 pane,移除乾淨且沒有東西在用的 checkout,並保留你釘選的工作區。
|
|
43
44
|
|
|
@@ -50,7 +51,8 @@ pi install npm:pi-straw-boss
|
|
|
50
51
|
### 需求
|
|
51
52
|
|
|
52
53
|
- pi 要跑在 [Herdr](https://herdr.dev) 0.9.4 以上。
|
|
53
|
-
-
|
|
54
|
+
- Herdr 的 pi 整合(`herdr integration install pi`):沒有它,Herdr 不會替窗格標出 pi session,該 session 就無法加入網;每個 session 啟動 20 秒後若發現缺少,會警告一次。
|
|
55
|
+
- [pi-intercom](https://www.npmjs.com/package/pi-intercom) 0.18.1 以上:網的頻道、訊息,以及 GUI 轉送對話框,都是透過它,sb server 的連線也是;版本較舊或沒裝時,sb server 起不來(`start-error.json` 與 `boss_server status` 會說明)。
|
|
54
56
|
- Windows 支援是實驗性的:擴充套件在 Windows 上透過 Herdr 的 named pipe 連線,側邊欄 plugin 用 `PATH` 上的 `node` 執行,worktree reaper 則只支援 macOS 和 Linux([差異在哪](docs/how-it-works.md#windows),英文)。
|
|
55
57
|
|
|
56
58
|
### 支援的套件
|
|
@@ -98,8 +100,8 @@ pi install npm:pi-straw-boss
|
|
|
98
100
|
| `/boss close all` | 讓這個基地的塔台、主智慧體和成員結束,連同 shell 一起關掉,不存 stash。會先用 stash 的同一套檢查;有會遺失的東西(正在跑的回合、排隊中的訊息、對話框、Monitor、子智慧體、前景有程式的 shell)就什麼都不關,並列出所有原因。其他基地完全不碰。 |
|
|
99
101
|
| 網頁上的「收起」「已收起」「接回」 | 基地的「收起」以基地名稱收起它;上方的「已收起」列出收起的基地,按「接回」打開。基地的「關掉」會先檢查,和 `/boss close all` 一樣。 |
|
|
100
102
|
| `/boss stash [名稱]`、`/boss pop [名稱]` | 把整個基地(塔台、主智慧體、成員和閒置的 shell)收起來並關掉;之後再打開,每個 pi 都從自己的 session 檔接回原本的角色。只要有接回後會遺失的東西就拒絕並說明原因:正在跑的回合、排隊中的訊息、開著的對話框、執行中的 Monitor、子智慧體,或前景有程式在跑的 shell。 |
|
|
101
|
-
| `/boss gui`、`/boss gui stop` | 在瀏覽器開啟網(任何 session 都能開,不會加入任何東西);停止它的伺服器,在哪個 session
|
|
102
|
-
| `/boss gui remote`、`/boss gui remote off` | 透過你的 tailnet 用手機連 GUI(`tailscale serve`,絕不用 Funnel):掃 QR code
|
|
103
|
+
| `/boss gui`、`/boss gui stop` | 在瀏覽器開啟網(任何 session 都能開,不會加入任何東西);停止它的伺服器,在哪個 session 都可以。整台機器只跑一個伺服器,網址隨監聽器更換(見下):開它的 session `/reload` 之後會重開(網址裡的 token 會換新);跑它的 session 結束時(關掉 pane、離開 pi、當機),另一個還開著的 session 會在幾秒內重開它(網址裡的 token 會換新)(塔台優先;pi-straw-boss 版本比伺服器舊的 session 要等約六秒才接手,直到下一個較新的 session 再接回去);之後才啟動的 session 也會把停著的伺服器重開,即使所有 session 都離開過或機器重開機;版本較新的 session 會接手,但開著的頁面不會自動換成新版:它會顯示「這個網址已失效」,要用 `/boss gui` 重開。網址裡的 token 只在同一個監聽器存活期間有效:伺服器重啟、升級、當機後重開,或 `/boss gui stop` 之後再 `/boss gui`,都會換新的 token(埠號空著就沿用),舊網址回 403,開著的分頁會失效,要再用 `/boss gui` 開啟,手機要重新掃 QR code(舊的配對隨監聽器結束而清除)。設了 `STRAW_BOSS_DESK=1`(桌面殼自己顯示頁面)時,它不會開瀏覽器,頁面也不顯示 Phone 與 Stash。只有 `/boss gui stop` 會讓它維持停止,直到下一次 `/boss gui`;`/boss stash` 和 `/boss close all` 不會把停著的伺服器重開。可以在通訊畫面直接打字給某個 session,或用終端機畫面下方的按鍵面板操作它的終端機,在桌面上也可以點進終端機直接打字;在等回覆的 `robot_hand` 選單、`ask_user_question` 問卷或 pi-code 的 hook 確認,可以在那裡或它的警示裡作答(任何 extension 的 `select` 和 `confirm` 也可以,`confirm` 也可以從配對的裝置作答;其他對話框只能看,要回到終端機回答;`secret_drop` 的機密一律在終端機輸入,任何頁面(本機或 tailnet)都不接受,因為 pi-intercom 的身分是自己申報的,無法驗證)。session 用 [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 以上顯示的文件,會開在它的通訊畫面旁邊:HTML 放在沙箱框架裡,表單送出的答案會傳給智慧體;純文字只能讀。 |
|
|
104
|
+
| `/boss gui remote`、`/boss gui remote off` | 透過你的 tailnet 用手機連 GUI(`tailscale serve`,絕不用 Funnel):掃 QR code 配對,手機配對後的紀錄會保留(從最後一次使用起算 90 天,重啟與 `remote off` 都不影響),直到你在「手機」視窗解除配對;遠端存取在 stop、`/reload`、換新伺服器之後仍會保持開啟,直到 `remote off`;但伺服器重啟後 GUI 的 token 會換新,手機的 cookie 綁在舊 token 的路徑上,所以重啟後手機要重新掃 QR code(已安裝的主畫面 app 要刪掉再安裝一次);關閉時只移除它自己的 serve 設定。serve 指向 GUI 伺服器的第二個 loopback 監聽埠,請求算不算遠端取決於它進來的監聽埠,不看它帶什麼標頭。頁面可以安裝成 app(加入主畫面,或 Chrome 的「安裝」):請先在瀏覽器裡配對再安裝,因為 iOS 只在安裝那一刻把瀏覽器的 cookie 複製進 app;iOS 上 app 的配對失效時,要刪掉 app,在 Safari 重新配對後再安裝一次;Android 上從 Chrome 安裝的 app 與 Chrome 共用配對,在 Chrome 重新配對後再打開 app 即可。 |
|
|
103
105
|
|
|
104
106
|
子智慧體,以及在 Herdr worktree 工作區裡的 session,都不會加入網,由開出它們的 session 代表它們。不在 Herdr 裡時,這個擴充套件什麼都不做。
|
|
105
107
|
|
|
@@ -0,0 +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{A as o,U as s}from"./index-jShEPou6.js";var c=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),u=((t={},n={})=>(n.locale??e())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`可以複選。`:`It takes several choices.`),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`選擇`:`Choices`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),h=((t={},n={})=>(n.locale??e())===`zh-TW`?`複製指令`:`Copy command`),g=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註`:`Note`),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註(選填)`:`Note (optional)`),y=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,b=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,x=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`選項`:`Options`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`你的答案`:`Your own answer`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),A=((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.`),j=((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.`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出答案`:`Send answer`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示終端機`:`Show terminal`),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),I=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),L=((t={},n={})=>(n.locale??e())===`zh-TW`?`它在等待對話框。`:`It waits on a dialog.`),R={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1};function z(e,t,n,r,i){let{q:a}=n,o=r[a],s=R[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`)return t?n.part===`opt`&&a>0?{to:{q:a-1,part:`opt`}}:void 0:a<r.length-1?{to:{q:a+1,part:`opt`}}:void 0;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 B(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`,e=>{let i=a(e.target);if(!i||e.ctrlKey||e.altKey||e.metaKey||e.isComposing)return;let o=e.target;if(i.part!==`opt`&&(e.key===`ArrowUp`?o.selectionStart!==0:e.key===`ArrowDown`&&o.selectionEnd!==o.value.length))return;let c=z(e.key,e.shiftKey,i,t.map(e=>({options:e.opts.length,multiple:e.multiple,own:!!e.own})),t.map(e=>e.answered()));if(!c||(e.preventDefault(),e.repeat&&[`Enter`,` `].includes(e.key)))return;if(s=e.key===` `,c.pick!==void 0){let e=t[i.q].opts[c.pick];e.getAttribute(`aria-checked`)!==`true`&&e.click()}let l=c.to===`send`?void 0:t[c.to.q],u=c.to===`send`?n():c.to.part===`opt`?l.opts[c.to.o??r(l)]:c.to.part===`own`?l.own:l.note;u&&!u.disabled&&u.focus()}),e.addEventListener(`keyup`,e=>s&&e.key===` `&&(s=!1,e.preventDefault())),()=>t[0]?.opts[r(t[0])]}var V=e=>e.multiple?d():e.freeform&&e.options.length?u():``,H=(e,t)=>o(`div`,{class:`ask-one`},e.header&&o(`b`,{class:`ask-head`},e.header),o(`p`,{class:`ask-q`},e.question),e.context&&o(`div`,{class:`ask-ctx`},e.context),e.options.length>0&&o(`ol`,{class:`ask-opts`,"aria-label":S()},...e.options.map(e=>o(`li`,{class:`ask-opt`},o(`b`,null,e.title),e.description&&o(`small`,null,e.description)))),t&&V(e)&&o(`small`,{class:`ask-how`},V(e))),U=e=>e.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f\p{Cf}]/gu,`�`),W=e=>(e.select?.choices??[]).map((e,t)=>({...e,i:t})),G=(e,t,n)=>({...e.size?{choices:[...e].sort((e,t)=>e-t)}:{},...t.trim()?{text:t}:{},...n.trim()?{note:n}:{}}),K=(e,t,n)=>({dialog:e.dialog,digest:e.digest,answerId:n,...t}),q={digest:E,"not-allowed":O,malformed:D};function J(e){let{outcome:i,reason:a,by:o}=e.body;return i===`accepted`?[`ok`,n()]:i===`stale`?[`error`,o===`local`?I():o===`cancel`?P():F()]:i===`rejected`?[`error`,(Object.hasOwn(q,String(a))?q[String(a)]:k)()]:i===`busy`?[`error`,t()]:i===`unknown`||e.status===504?[`error`,r(),!0]:[`error`,a??s({status:e.status})]}var Y=e=>[`accepted`,`stale`,`busy`,`unknown`].includes(String(e.body.outcome))||e.status===504,X=e=>e.answer?`d\n${e.answer.dialog}\n${e.answer.digest}`:`c\n${e.callId}\n${e.why??``}`;function Z(e,t,n=location.hostname!==`127.0.0.1`,s,u){let d,y,b,E=!1,D=!1,O;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>y&&!y.el.contains(e.target)&&(y.lost=void 0));let k=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),P=()=>{if(!y)return;let e=document.activeElement;e&&e!==document.body&&e!==y.lost&&(y.lost=void 0),y.controls.forEach(e=>e.disabled=!E||D||y.done),y.send&&(y.send.disabled=!E||D||y.done||!y.pick()),e&&y.el.contains(e)&&e.disabled&&(y.lost=e);let t=y.lost;t&&!t.disabled&&y.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),y.lost=void 0)};async function F(e,n){[e.sending,D,e.spell]=[!0,!0,!1],P(),k(e.note,``,a());let s=await t(`answer`,n).catch(()=>void 0),c=o(`button`,{type:`button`,class:`cmp-link`},i());c.onclick=()=>void F(e,n);let[l,d,f]=s?J(s):[`error`,r(),!0];[e.done,e.sending,D,e.busy]=[!s||Y(s),!1,!1,s?.body.outcome===`busy`],k(e.note,l,d,...f?[c]:[]),P(),e.note.scrollIntoView?.({block:`nearest`}),u&&s?.body.outcome===`accepted`&&setTimeout(u,1200)}let I=(e,t,n,r,i)=>{let a=o(`button`,{type:`button`,class:`ask-opt`,role:e,"aria-checked":`false`},o(`b`,i?{"data-n":String(i)}:null,t),...n.filter(Boolean).map(e=>o(`small`,null,e)));return a.onclick=r,a};function R(e,t){let r,i=W(t).map(e=>I(`radio`,U(e.label),[e.note&&U(e.note)],()=>(r=e.i,i.forEach((n,r)=>n.setAttribute(`aria-checked`,String(W(t)[r].i===e.i))),P()),e.i+1)),a=t.select?.copy!==void 0&&o(`button`,{type:`button`,class:`cmp-link`},h());a&&(a.disabled=!navigator.clipboard,a.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>k(e.note,`ok`,m()),()=>k(e.note,`error`,p())));let s=i.filter((e,r)=>!(n&&W(t)[r].hereOnly));return i.forEach(e=>!s.includes(e)&&(e.disabled=!0)),e.pick=()=>r===void 0?void 0:{choice:r},e.first=B(e.el,[{opts:i,multiple:!1,answered:()=>r!==void 0}],()=>e.send),e.controls=s,[o(`pre`,{class:`ask-title`},U(t.select.title)),o(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":f()},...i),o(`div`,{class:`ask-acts`},e.send,a)]}function z(e,t){let n=t.questions.map(()=>({picks:new Set,text:o(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:T(),"aria-label":w()}),note:o(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:v(),"aria-label":_()})})),r=[],i=t.questions.map((t,i)=>{let a=n[i],s=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>I(s,e.title,[e.description,e.preview&&g()],()=>{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)))),P()}));return a.text.oninput=()=>(t.multiple||(a.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),P()),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()!==``}),o(`div`,{class:`ask-one`},t.header&&o(`b`,{class:`ask-head`},t.header),o(`p`,{class:`ask-q`},t.question),o(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":S()},...c),a.text,a.note)});return e.pick=()=>n.every(e=>e.picks.size||e.text.value.trim())?{answers:n.map(e=>G(e.picks,e.text.value,e.note.value))}:void 0,e.first=B(e.el,r,()=>e.send),[...i,o(`div`,{class:`ask-acts`},e.send)]}function q(e){let t=e.asks??(e.ask?[e.ask]:[]),r=t.length>1,i=e.answer,a={key:X(e),el:o(`section`,{class:`ask`}),note:o(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};i&&((a.send=o(`button`,{type:`button`,class:`ask-send`},M())).onclick=()=>void(a.pick()&&F(a,K(i,a.pick(),crypto.randomUUID()))));let u=e.tool===`secret_drop`,d=o(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${r?l():c()} ${r||!t[0]?``:V(t[0])}`.trim()),f=s&&e.tool!==`secret_drop`&&o(`button`,{type:`button`,class:`cmp-link`},N());f&&(f.onclick=s);let p=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[o(`p`,{class:`ask-why`},x({tool:e.tool}))]:[];return a.el.append(...p,...i&&!u?i.select?R(a,i):z(a,i):[...t.length?t.map(e=>H(e,r)):[o(`p`,{class:`ask-why`},u?n?A():j():e.why??L())],o(`div`,{class:`ask-acts`},u?o(`p`,{class:`ask-term`},c()):d,f)],a.note),a}let Z=(t,n)=>{let r=document.activeElement;y&&y!==n&&(y.focus=y.el.contains(r)?r:void 0),[d,y,b]=[t,n,n?.send?n:b],e.replaceChildren(...n?[n.el]:[]),P(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=y&&!y.done?y.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},update(e,t){E=t,e&&(O=void clearTimeout(O)),!e&&(y?.done||y?.sending)?O??=setTimeout(()=>(O=void 0,Z()),6e3):e?y&&(X(e)===y.key||!e.answer&&(y.done||y.sending)&&e.callId===d?.callId)?((y.busy||y.sending)&&!e.answer?y.spell=!0:y.busy&&y.spell&&e.answer&&([y.done,y.busy]=[!1,!1],k(y.note,``,C())),d=e):Z(e,b?.key===X(e)&&!b.done?b:q(e)):Z(),P()}}}export{Z as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-CdNhDwzw.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./runtime-ZX6HkxDa.js";import{A as t,M as n,S as r,d as i,n as a,p as o}from"./index-jShEPou6.js";import{i as s,n as c,r as l,t as u}from"./views-Dv5aloYQ.js";var ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`可能已被當機的 run 處理過:動手前先確認。`:`A run that crashed may already have handled this: check before acting.`),te=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),ne=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),d=e=>`context compacted · ${e?.tokens} tokens summarized`,f=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,re=((t,n={})=>(n.locale??e())===`zh-TW`?f(t):d(t)),ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,ae=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),h=e=>`Image ${e?.n}`,g=e=>`圖片 ${e?.n}`,_=((t,n={})=>(n.locale??e())===`zh-TW`?g(t):h(t)),oe=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),v=e=>`${e?.count} image(s)`,y=e=>`${e?.count} 張圖片`,se=((t,n={})=>(n.locale??e())===`zh-TW`?y(t):v(t)),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),S=e=>`${e?.count} new`,C=e=>`${e?.count} 則新訊息`,w=((t,n={})=>(n.locale??e())===`zh-TW`?C(t):S(t)),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`sb server 的通知`:`notice from the sb server`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`喚醒鬧鐘`:`wake-up call`),ue=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),P=e=>`Open image ${e?.n}`,F=e=>`打開圖片 ${e?.n}`,de=((t,n={})=>(n.locale??e())===`zh-TW`?F(t):P(t)),I=e=>`show all (${e?.size})`,L=e=>`顯示全部(${e?.size})`,fe=((t,n={})=>(n.locale??e())===`zh-TW`?L(t):I(t)),pe=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),R=e=>`◇ thought · ${e?.count} chars`,z=e=>`◇ 思考 · ${e?.count} 字元`,me=((t,n={})=>(n.locale??e())===`zh-TW`?z(t):R(t)),he=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),B=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),ge=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function V(){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?w({count:t}):x()}}async function _e(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 ve(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 ye=e=>o(e.role),be=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,xe=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,Se={intercom_message:D,subagent_result:j,subagent_ping:A,subagent_status:M,"pi-loop-monitor":k,"memory-context":O,"doc-review":E},H=e=>{let t=i(`<span class="ava"><svg><use/></svg></span>`);return t.querySelector(`use`).setAttribute(`href`,`#i-${a[e]??e}`),t};function Ce(e){let n=[],r=0;for(let i of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))n.push(e.slice(r,i.index),t(`a`,{href:i[0],rel:`noopener noreferrer`,target:`_blank`},i[0])),r=i.index+i[0].length;return[...n,e.slice(r)]}function U(e,i,{who:a,link:o,docFor:d}){let f=ve(),p=new Map,m=new Set,h=()=>m.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>d?.(e))):e.shown&&m.delete(e)),g=t(`div`,{class:`chat-list`}),v=t(`div`,{class:`chat-top`}),y=t(`div`,{class:`chat-live`}),x=t(`div`,{class:`chat-end`}),S=t(`button`,{class:`chat-pill`,type:`button`,hidden:``}),C=t(`p`,{class:`chat-empty`},T()),w=t(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":ne()},v,g,y,x);e.replaceChildren(w,S);let E=V(),O=!1,k=!1,A,j,M=0,P=!1,F,I=()=>P||F!==void 0,L=()=>(clearTimeout(F),F=setTimeout(()=>(F=void 0,E.pinned&&!f.detached&&z()),250)),R=(e=E.button(f.detached))=>(S.hidden=!e,S.textContent=e??``),z=()=>(E.jump(),j=void 0,w.scrollTop=w.scrollHeight,R());async function U(e){O=!0;let t=await _e(f,i,e,e=>(J(e),Y(e))).finally(()=>O=!1),r=p.get(e);if(A===e){if(!t||!r)return z();E.hold(),j=r,r.scrollIntoView({block:`center`}),n(r,`lit`),clearTimeout(M),M=window.setTimeout(()=>(j=void 0,r.classList.remove(`lit`)),2e3),R()}}let W=()=>A?void U(A):z(),G=(e,t,n,r)=>{e.disabled=!0,i.entry(n).then(n=>{let i=n&&r(n);if(i===void 0)return void(e.textContent=B());t.textContent=i,e.remove()},()=>e.textContent=B())};function K(e,n=0){if(!n||!i.pic)return null;let a=Array.from({length:n},(t,n)=>i.pic(e,n));return t(`div`,{class:`pics`},...a.map((e,n)=>{let i=t(`img`,{src:e,alt:_({n:n+1}),loading:`lazy`,decoding:`async`}),o=t(`button`,{type:`button`,class:`pic`,"aria-label":de({n:n+1})},i);return i.addEventListener(`error`,()=>o.replaceWith(t(`em`,{class:`pic-gone`},oe()))),o.addEventListener(`click`,()=>void r(async()=>{let{lightbox:e}=await import(`./lightbox-iVlYCaj1.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,n))),o}))}function we(e,n){let r=f.result(e.id),i=t(`pre`,{class:`out`},r?.text??``),a=t(`pre`,{class:`args`},e.args??``),o=e.cut?t(`button`,{class:`more`,type:`button`},pe()):null;o?.addEventListener(`click`,()=>G(o,a,n,t=>(e=>e&&`${e.args??``}${e.cut?`\n${ie()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=r?.more?t(`button`,{class:`more`,type:`button`},fe({size:xe(r.bytes??0)})):null;s?.addEventListener(`click`,()=>G(s,i,r.id,e=>e.text));let c=e.name===`show_doc`&&d?t(`button`,{class:`more open`,type:`button`,hidden:``},ue()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>d?.(e)?.()))),c&&m.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(h);let l=t(`details`,{class:`act`},t(`summary`,{"data-mark":r?r.isError?`error`:`done`:`working`},t(`b`,{class:`badge`}),t(`code`,null,e.name),t(`span`,{class:`sum`},e.summary),c),a,o,r&&t(`div`,{class:`result`},r.images?t(`em`,null,se({count:r.images})):null,i,s)),u=r&&K(r.id,r.images);return u?[l,u]:[l]}function q(e){let n=t(`time`,null,be(e.at));switch(e.kind){case`user`:{let r=a().service?c(e.text):void 0;if(r)return t(`article`,{class:`tx sys`},t(`details`,{class:`notice`},t(`summary`,null,H(`comms`),t(`em`,null,b()),r.kind===`intercom`?D():r.kind===`server`?le():N(),` `,r.kind===`intercom`?o(r.from.replace(/ \([^()]*\)$/,``))||r.from:``,n),t(`pre`,null,e.text??``)));let i=a().service?u(e.text):void 0;return t(`article`,{class:`tx you`},t(`header`,null,n,t(`b`,null,ge()),H(`user`)),t(`div`,{class:`bubble`,title:i?e.text??``:``},i?.crashed?t(`small`,{class:`boss-flag`},ee()):null,...Ce(i?i.body:e.text??``),K(e.id,e.images)))}case`assistant`:{let r=a(),i=t(`pre`,{class:`thought-text`}),o=e.thought?t(`button`,{class:`thought`,type:`button`},e.thought<0?he():me({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&o?.addEventListener(`click`,()=>G(o,i,e.id,e=>e.thoughtText)),t(`article`,{class:`tx in`},H(r.role),t(`div`,{class:`tx-body`},t(`header`,null,t(`b`,null,ye(r)),e.model?t(`span`,null,e.model):null,n,e.stop?t(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),o,i,e.text?t(`div`,{class:`md`},l(s(e.text))):null,e.error?t(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>we(t,e.id))))}case`bash`:return t(`article`,{class:`tx sys`},t(`details`,{class:`act`},t(`summary`,{"data-mark":e.exit?`error`:`done`},t(`b`,{class:`badge`}),t(`code`,null,`shell`),t(`span`,{class:`sum`},`! ${e.command}`),e.exit?t(`span`,{class:`stop`,"data-mark":`error`},ae({code:e.exit})):null),e.text?t(`pre`,{class:`out`},e.text):null));case`notice`:return t(`article`,{class:`tx sys`},t(`details`,{class:`notice`},t(`summary`,null,H(`comms`),t(`em`,null,b()),Se[e.type??``]?.()??e.type??ce(),` `,e.from&&o(e.from)||(e.from??``),n),t(`pre`,null,e.text??``)));case`divider`:return t(`article`,{class:`tx rule`},t(`details`,null,t(`summary`,null,e.type===`compaction`?re({tokens:(e.tokens??0).toLocaleString()}):te()),t(`pre`,null,e.text??``)));default:return t(`article`,{class:`tx note`},e.text??``,` `,n)}}function J(e){e.rebuild&&(p.clear(),g.replaceChildren());for(let t of e.dropped)p.get(t)?.remove(),p.delete(t);let t=e.added.map(e=>(p.set(e.id,q(e)),p.get(e.id)));e.front?g.prepend(...t):g.append(...t),k&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),C.remove(),f.items.length||g.append(C),v.hidden=!f.before}let Y=e=>e.touched.forEach(e=>{let t=p.get(e),n=f.items.find(t=>t.id===e);if(t&&n){let r=q(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),p.set(e,r)}}),X=async()=>{if(!O&&f.before&&k){O=!0;try{let e=w.scrollHeight,t=f.prepend(await i.older(f.before));J(t),Y(t),w.scrollTop+=w.scrollHeight-e}finally{O=!1}f.before&&w.clientHeight&&v.getBoundingClientRect().bottom>=w.getBoundingClientRect().top&&X()}};S.addEventListener(`click`,()=>{A=void 0,f.detached?i.latest().then(e=>(J(f.reset(e)),z())):z()});let Z=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void X(),{root:w}),new IntersectionObserver(e=>w.clientHeight&&(E.scrolled(e.at(-1).isIntersecting),R()),{root:w,rootMargin:`0px 0px 67px`})],Q,Te=()=>(Q??(Z[0].observe(v),Z[1].observe(x)),clearTimeout(Q),Q=setTimeout(()=>(Q=void 0,Z.forEach(e=>e.disconnect())),600));w.addEventListener(`scroll`,()=>(Te(),!P&&F!==void 0&&L()),{passive:!0}),w.addEventListener(`touchstart`,()=>(P=!0,clearTimeout(F),F=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])w.addEventListener(e,()=>(P=!1,L()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])w.addEventListener(e,()=>j=A=void 0,{passive:!0});let $=new ResizeObserver(()=>I()?void 0:E.pinned&&!f.detached?w.scrollTop=w.scrollHeight:j?.scrollIntoView({block:`center`}));return $.observe(g),$.observe(w),{log:w,docs:h,apply(e){if(e.reset)J(f.reset({items:e.items??[],before:e.before})),k=!0,W();else if(e.items?.length){let t=f.append(e.items);J(t),Y(t),E.arrived(t.added.length)&&!f.detached&&!I()?z():R()}},reveal(e){A=e,k&&W()},setLive(e,n){y.dataset.mark=n,y.lastChild?.textContent!==e&&y.replaceChildren(...e?[t(`b`,{class:`badge`}),t(`span`,null,e)]:[])}}}export{U as mountChat,_ as t};
|
|
@@ -1 +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-
|
|
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-eYZk4NHE.js";import{A as i,R as a,a as o,b as s,d as c,f as l,g as u,h as d,i as f,l as p,m,o as h,p as g,x as _,y as v}from"./index-jShEPou6.js";var y=((t={},n={})=>(n.locale??e())===`zh-TW`?`關閉清單`:`Close the list`),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`切換到其他單位`:`Switch to a unit`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`回到主地圖`:`Back to the map`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`所有單位`:`All units`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`指揮中`:`commanding`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`已結束`:`ended`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`錯誤`:`error`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`閒置`:`idle`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`無狀態`:`unknown`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`等待`:`waiting`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`工作中`:`working`),A=.4;function j(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 M=(e,t,n)=>Math.abs(n)>=.45?n>0:e>=t*A,N=(e,t)=>t||e.some(e=>e.editable||e.sink||e.scrollsX||[`input`,`textarea`,`select`].includes(e.tag));function P(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 F=e=>{let t=[];for(let n=e;n;n=n.parentElement)t.push(P(n));return t},I={working:k,waiting:O,idle:E,done:w,error:T,unknown:D,commanding:C},L=(e,t,n)=>(t?w:I[e])({},n&&{locale:n}),R=(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 z(e){return e.bases.flatMap(e=>{let t=[{id:`tower`,rows:e.tower?R(e.id,[{...e.tower,role:`tower`}]):[]},...e.tabs.map(t=>({id:t.id,label:a({label:t.label}),rows:R(e.id,t.units)})),{id:`outside`,label:n(),rows:R(e.id,e.outside)}].filter(e=>e.rows.length);return t.length?[{id:e.id,label:e.label,mark:e.mark,groups:t}]:[]})}var B=e=>e.role===`main`&&e.mark===`idle`,V=e=>e.reduce((e,t)=>(t.sub?e.at(-1)?.subs.push(t):e.push({...t,subs:[]}),e),[]),H=()=>c(`<div class="unit"><div class="card"><a class="hit"></a>${f}<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>`),U=()=>c(`<div class="unit tower-row"><div class="trow"><a class="tower-go">${f}</a><button type="button" class="pair-btn tower-add"></button></div><div class="subs"></div></div>`),W=()=>c(`<section class="dbase"><h3><a></a><small></small></h3><div class="dgroups"></div></section>`),G=()=>c(`<div class="dgroup"><h4></h4><div class="drows"></div></div>`),K=()=>matchMedia(`(max-width: 640px)`).matches;function q(){let e=i(`div`,{class:`drawer-body`}),n=i(`button`,{type:`button`,class:`x`,"aria-label":y()},`×`),a=i(`a`,{class:`drawer-map`},x()),c=i(`button`,{type:`button`,class:`pair-btn`,"data-close":`dismiss-all`,hidden:``}),f=i(`div`,{class:`drawer-top`,hidden:``},c);o(a,{view:`map`});let C=i(`aside`,{class:`drawer`,"aria-label":b()},i(`header`,null,i(`b`,null,S()),n),f,e,i(`footer`,{class:`drawer-foot`},a)),w=i(`div`,{class:`drawer-veil`});document.body.append(w,C);let T,E,D=!1,O=0,k=0,A,P=()=>{_(c,T??{bases:[]}),f.hidden=c.hidden;let n=(e,t)=>{o(e.querySelector(`.hit`),{view:`session`,ws:t.ws,key:t.key}),e.querySelector(`.hit`).setAttribute(`aria-label`,`${t.name}: ${L(t.mark,t.ended)}`),e.classList.toggle(`current`,t.key===E),e.toggleAttribute(`data-dismiss`,t.role===`subagent`&&t.ended),e.dataset.key=t.key,l(e,t.mark),p(e.querySelector(`.plate`),t.role,t.mark),u(e,`.name`,t.name),u(e,`.role`,g(t.role)),u(e,`.dstate`,L(t.mark,t.ended)),m(e,`.note`,t.note,t.mark,t.note?void 0:``);let r=e.querySelector(`:scope > .card > .quit-btn`);B(t)?v(r,t):r.hidden=!0,d(e.querySelector(`.subs`),t.subs??[],H,n)},i=(e,r)=>{let i=e.querySelector(`.tower-go`),a=e.querySelector(`.tower-add`),s=T?.bases.find(e=>e.id===r.ws);o(i,{view:`session`,ws:r.ws,key:r.key}),i.setAttribute(`aria-label`,`${r.name}: ${L(r.mark,r.ended)}`),e.classList.toggle(`current`,r.key===E),e.dataset.key=r.key,l(e,r.mark),p(i.querySelector(`.plate`),`tower`,r.mark),a.hidden=!s,s&&(h(a,s),a.textContent=`+`,a.setAttribute(`aria-label`,t({base:s.label}))),d(e.querySelector(`.subs`),r.subs,H,n)};d(e,z(T??{bases:[]}),W,(e,t)=>{l(e,t.mark),u(e,`h3 a`,t.label),o(e.querySelector(`h3 a`),{view:`workspace`,ws:t.id}),u(e,`small`,r({count:t.groups.reduce((e,t)=>e+t.rows.length,0)})),d(e.querySelector(`.dgroups`),t.groups,G,(e,t)=>{u(e,`h4`,t.label??``),e.querySelector(`h4`).toggleAttribute(`hidden`,!t.label),t.id===`tower`?d(e.querySelector(`.drows`),V(t.rows),U,i):d(e.querySelector(`.drows`),V(t.rows),H,n)})})},I=e=>{O=Math.max(0,Math.min(k,e)),C.style.setProperty(`--dx`,`${O}px`),w.style.opacity=String(k?O/k:0),w.style.pointerEvents=O>0?`auto`:`none`},R=e=>{D=e,C.classList.toggle(`on`,e),C.inert=!e,document.documentElement.classList.remove(`drawer-drag`),I(e?k:0)},q=()=>{k=C.offsetWidth,P(),C.classList.add(`on`),document.documentElement.classList.add(`drawer-drag`)};C.inert=!0,document.addEventListener(`touchstart`,e=>{let t=e.target,n=C.contains(t)||t===w;if(A=void 0,!K()||e.touches.length!==1||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(D?!n:N(F(t),!!getSelection()?.toString())))return;let r=e.touches[0],i=D?t.closest(`.unit[data-dismiss] > .card`)??void 0:void 0;A={x0:r.clientX,y0:r.clientY,mode:`wait`,was:D,base:O,last:r.clientX,at:performance.now(),v:0,card:i}},{passive:!0}),document.addEventListener(`touchmove`,e=>{if(!A||A.mode===`pass`)return;let t=e.touches[0],n=t.clientX-A.x0,r=t.clientY-A.y0;if(A.mode===`wait`){let e=j(n,r,A.was);if(e===`wait`)return;if(e===`pass`&&A.card&&j(n,r,!1)===`drag`)A.mode=`card`,A.card.classList.add(`swiping`);else if(e===`pass`)return void(A.mode=`pass`);else A.mode=`drag`,q()}e.preventDefault();let i=performance.now();if(A.v=(t.clientX-A.last)/Math.max(1,i-A.at),[A.last,A.at]=[t.clientX,i],A.mode!==`card`)return I(A.base+n);let a=Math.max(0,n);A.card.style.setProperty(`--sx`,`${a}px`),A.card.style.setProperty(`--so`,String(1-a/A.card.offsetWidth))},{passive:!1});let J=(e,t)=>{e.classList.remove(`swiping`),e.style.removeProperty(`--sx`),e.style.removeProperty(`--so`),t&&(e.classList.add(`gone`),s({key:e.parentElement.dataset.key}).then(t=>t||e.classList.remove(`gone`)))},Y=e=>{let t=A;A=void 0,t?.mode===`drag`&&R(M(O,k,t.v)),t?.mode===`card`&&J(t.card,e.type===`touchend`&&M(Math.max(0,t.last-t.x0),t.card.offsetWidth,t.v))};return document.addEventListener(`touchend`,Y),document.addEventListener(`touchcancel`,Y),w.addEventListener(`click`,()=>R(!1)),C.addEventListener(`click`,e=>e.target.closest(`a[data-route], button[data-open], .x`)&&R(!1)),document.addEventListener(`keydown`,e=>D&&e.key===`Escape`&&(e.preventDefault(),R(!1)),!0),document.addEventListener(`sb-drawer`,()=>(D||q(),R(!D))),{net(e){T=e,D&&P()},route(e){E=e.view===`session`?e.key:void 0,a.toggleAttribute(`aria-current`,e.view===`map`),D&&P()}}}export{q 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;display:grid}.prefs-btn svg{fill:currentColor;width:18px;height:18px}.prefs-btn:hover,.prefs-btn[aria-expanded=true]{color:var(--text)}.prefs-btn:has(+.prefs-pop #remind[data-state=blocked]){color:var(--err-soft)}.prefs-pop{width:210px}.prefs-pop:popover-open{gap:6px;display:grid}.prefs-pop>.pair-btn{text-align:left;justify-content:flex-start;width:100%}.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}.sound-pop{gap:12px;width:240px}.sound-pop:popover-open{display:grid}.sound-pop label{justify-content:space-between;align-items:center;gap:10px;display:flex}.sound-pop input[type=range]{min-width:0;accent-color:var(--accent);flex:1}.sound-pop input[type=checkbox]{width:18px;height:18px;accent-color:var(--accent)}.sound-pop output{text-align:right;width:3ch;font:12px var(--mono);color:var(--dim)}.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,#sound-try{width:100%}.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}.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{justify-content:space-between;align-items:center;gap:10px;display:flex}.devices li span{min-width:0;display:grid}.devices li b{color:var(--text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.devices-acts{flex-wrap:wrap;gap:8px;display:flex}.devices small,.devices .chat-empty{color:var(--dim)}.spawn-btns{flex-wrap:wrap;gap:8px;margin:12px 0 4px;display:flex}.base>.spawn-btns{margin:-4px 0 12px}.tab h3>span,.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{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>.quit-btn{align-self:flex-start;margin-left:auto}@media (hover:hover) and (pointer:fine){:is(.card>.quit-btn,.tab h3>.quit-btn,.base>header>.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)>.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>.quit-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]{display:none}.queue-act span{text-align:right;flex:0 auto;max-width:64ch}.in-term .queue-list,.in-term .queue-act{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}.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.head{background:linear-gradient(180deg, color-mix(in srgb, var(--gold) 10%, transparent), transparent 38%), linear-gradient(180deg, var(--surface-1), var(--surface-0))}.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}.base:not(.head) .crown{display:none}.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,.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}.tower-notes{margin:0 16px 8px}.tower-notes:has(>.tower-notices:empty){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}.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{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}[data-calm] :is(.link i,.sweep,.pulse,.ring,.badge,.term-typing),[data-calm] :is(.plate,.badge):after{animation:none!important}[data-calm] .tower[data-mark=waiting] .pulse{opacity:.55}[data-calm] .plate[data-mark=waiting]:after{opacity:.55;transform:scale(1.25)}[data-calm] .packet{opacity:0;animation-play-state:paused!important}[data-calm] .subs:before,[data-calm] .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)}}[data-calm] :is(.plate,.tower)[data-mark=commanding]:before,[data-calm] .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 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 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}.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{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{outline:none}.dialog{max-height:calc(100dvh - var(--hud,64px) - 44px);overscroll-behavior:contain;overflow-y:auto}.dialog>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}.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;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-yes{background:var(--amber);color:var(--ink);font:600 12px var(--sans);cursor:pointer;border:0;border-radius:9px;padding:5px 11px}.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-top{padding:0 10px 8px max(10px, env(safe-area-inset-left));justify-content:space-between;align-items:center;gap:8px;display:flex}.drawer-top[hidden]{display:none}.drawer-top{justify-content:flex-end}.drawer-top .pair-btn{min-height:36px}.drawer-top .pair-btn[hidden]{display:none}.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-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);width:56px;height:44px;color:var(--c);border-radius:12px;place-items:center;text-decoration:none;display:grid}.drawer .tower-row.current>.trow>.tower-go{border-color:var(--c4);background:var(--c1)}.drawer .tower-go .plate{--s:34px}.drawer .tower-add{letter-spacing:0;place-items:center;min-width:56px;min-height:44px;padding:0;font-size:22px;font-weight:400;line-height:1;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{border-color:var(--c4);box-shadow:inset 3px 0 var(--c), inset -3px 0 var(--c)}.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}.prefs-pop>*{min-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 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}.comms-head:has(.head-main:not([hidden])) .head-main{grid-area:2/1/auto/3;justify-self:start}.comms-head:has(.head-main:not([hidden])) .head-quit{grid-area:2/3/auto/-1;justify-self:end}.comms-head:has(.head-main:not([hidden])) .modes{grid-row:3}.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{min-height:44px}.pad-digits summary{padding:14px 0}}@media (width<=640px){.brand{min-height:44px}.prefs-btn{width:44px;height:44px}.prefs-pop>*{min-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-opt,.sheet-yes,.cmp-yes,.chat-pill){min-height:44px}:is(.pair-btn,.quit-btn,.later,.go,.x,.tab-add,.ask-send,.sheet-yes,.cmp-yes){min-width:44px}.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:12px}.queue-act{flex-wrap:nowrap;justify-content:space-between;gap:10px}.queue-act span{text-align:left;flex:1 1 0}.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}.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-top .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){*,:before,:after{transition:none!important;animation:none!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-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-note{color:var(--dim)}.teams-tile{gap:14px;padding:4px 2px 12px;font-size:13px;display:grid}.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}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DK3Fl9T5.js";import{i as t,n,r,t as i}from"./runtime-ZX6HkxDa.js";var a=e=>`${e?.n}d`,o=e=>`${e?.n} 天`,s=((e,t={})=>(t.locale??i())===`zh-TW`?o(e):a(e)),c=e=>`${e?.n}h`,l=e=>`${e?.n} 小時`,u=((e,t={})=>(t.locale??i())===`zh-TW`?l(e):c(e)),d=e=>`${e?.n}m`,f=e=>`${e?.n} 分`,p=((e,t={})=>(t.locale??i())===`zh-TW`?f(e):d(e)),m=e=>`${e?.n}s`,h=e=>`${e?.n} 秒`,g=((e,t={})=>(t.locale??i())===`zh-TW`?h(e):m(e)),ee=((e={},t={})=>(t.locale??i())===`zh-TW`?`警示`:`Alerts`),te=((e={},t={})=>(t.locale??i())===`zh-TW`?`所有基地`:`all bases`),ne=e=>`${e?.team} · teammate`,re=e=>`${e?.team} · 隊友`,ie=((e,t={})=>(t.locale??i())===`zh-TW`?re(e):ne(e)),ae=((e={},t={})=>(t.locale??i())===`zh-TW`?``:`.`),oe=((e={},t={})=>(t.locale??i())===`zh-TW`?`最後更新:`:`Last update`),se=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,ce=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,le=((e,t={})=>(t.locale??i())===`zh-TW`?ce(e):se(e)),ue=e=>`The server is up but cannot read the net: ${e?.problem}`,de=e=>`伺服器正常,但讀不到網:${e?.problem}`,fe=((e,t={})=>(t.locale??i())===`zh-TW`?de(e):ue(e)),pe=((e={},t={})=>(t.locale??i())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),me=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,he=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,ge=((e,t={})=>(t.locale??i())===`zh-TW`?he(e):me(e)),_e=((e={},t={})=>(t.locale??i())===`zh-TW`?`這個網址在這裡無法使用(sb server 可能重新啟動過,或連結已過期):在這台電腦請開啟 /boss gui;在手機請重新掃描新的 QR code。`:`This address does not work here (the sb server may have restarted, or the link expired): on this computer open /boss gui; on a phone scan a new QR code.`),ve=((e={},t={})=>(t.locale??i())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),ye=((e={},t={})=>(t.locale??i())===`zh-TW`?`取消`:`Cancel`),be=((e={},t={})=>(t.locale??i())===`zh-TW`?`關閉`:`Close`),xe=e=>`Quit base ${e?.name}`,Se=e=>`關掉基地 ${e?.name}`,Ce=((e,t={})=>(t.locale??i())===`zh-TW`?Se(e):xe(e)),we=e=>`Quit base ${e?.name}? Every agent in it and its tower quit. Nothing quits while anything running would be lost.`,Te=e=>`要關掉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。有會遺失的東西時什麼都不關。`,Ee=((e,t={})=>(t.locale??i())===`zh-TW`?Te(e):we(e)),De=e=>`Quit squad ${e?.name}`,Oe=e=>`關掉小隊 ${e?.name}`,ke=((e,t={})=>(t.locale??i())===`zh-TW`?Oe(e):De(e)),Ae=e=>`Quit squad ${e?.name}? Every agent in it quits.`,je=e=>`要關掉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,Me=((e,t={})=>(t.locale??i())===`zh-TW`?je(e):Ae(e)),Ne=e=>`Quit the tower ${e?.name}? The base's mains become members again.`,Pe=e=>`要關掉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Fe=((e,t={})=>(t.locale??i())===`zh-TW`?Pe(e):Ne(e)),Ie=e=>`Quit ${e?.name}`,Le=e=>`關掉 ${e?.name}`,Re=((e,t={})=>(t.locale??i())===`zh-TW`?Le(e):Ie(e)),ze=e=>`Quit ${e?.name}? It quits pi and its pane closes.`,Be=e=>`要關掉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Ve=((e,t={})=>(t.locale??i())===`zh-TW`?Be(e):ze(e)),He=e=>`control tower · ${e?.state}`,Ue=e=>`塔台 · ${e?.state}`,We=((e,t={})=>(t.locale??i())===`zh-TW`?Ue(e):He(e)),Ge=((e={},t={})=>(t.locale??i())===`zh-TW`?`圖示來自 game-icons.net(Lorc、Delapouite),CC BY 3.0。`:`Icons from game-icons.net by Lorc and Delapouite, CC BY 3.0.`),Ke=((e={},t={})=>(t.locale??i())===`zh-TW`?`移除`:`Dismiss`),qe=e=>`Dismiss finished (${e?.count})`,Je=e=>`移除已完成(${e?.count})`,Ye=((e,t={})=>(t.locale??i())===`zh-TW`?Je(e):qe(e)),Xe=e=>`Dismiss ${e?.name}`,Ze=e=>`從畫面移除 ${e?.name}`,Qe=((e,t={})=>(t.locale??i())===`zh-TW`?Ze(e):Xe(e)),$e=((e={},t={})=>(t.locale??i())===`zh-TW`?`文件`:`Documents`);function et(e,t,n,r){if(typeof t!=`string`||n!==void 0&&!r)return new e(t,n);let i=et;if(n!==void 0){let r=i.prototypeKeys??=new Set([`constructor`,`__defineGetter__`,`__defineSetter__`,`hasOwnProperty`,`__lookupGetter__`,`__lookupSetter__`,`isPrototypeOf`,`propertyIsEnumerable`,`toString`,`valueOf`,`__proto__`,`toLocaleString`]);if(Object.getOwnPropertyNames(Object.prototype).some(e=>!r.has(e)))return new e(t,n)}let a=[];for(let r of Object.keys(n??{}).sort()){let i=n[r];if(i!==void 0){if(i!==null&&![`string`,`number`,`boolean`].includes(typeof i)||typeof i==`number`&&!Number.isFinite(i))return new e(t,n);a.push([r,i])}}let o=JSON.stringify([t,a]),s=i.caches??=new WeakMap,c=s.get(e);if(c||(c=new Map,s.set(e,c)),c.has(o))return c.get(o);let l=new e(t,n);if(c.size>=256){let e=c.keys().next().value;e!==void 0&&c.delete(e)}return c.set(o,l),l}function _(e,t,n,r=!1){return et(Intl.PluralRules,e,n,r).select(Number(t)-Number(n?.offset??0))}var tt=((e={},t={})=>(t.locale??i())===`zh-TW`?`總塔台`:`head tower`),nt=((e={},t={})=>(t.locale??i())===`zh-TW`?`語言`:`Language`),rt=e=>`${e?.label} (${e?.short}) asks you to confirm a ${e?.tool} call from its tower`,it=e=>`${e?.label}(${e?.short})請你確認它塔台的一次 ${e?.tool} 呼叫`,at=((e,t={})=>(t.locale??i())===`zh-TW`?it(e):rt(e)),ot=e=>`Team ${e?.team} stopped: ${e?.reason}`,st=e=>`團隊 ${e?.team} 已停止:${e?.reason}`,ct=((e,t={})=>(t.locale??i())===`zh-TW`?st(e):ot(e)),lt=e=>{let t=_(`en`,e?.count,{},!0);return t===`one`?`${e?.count} message has waited more than 10 minutes for an idle tower in team ${e?.team}`:t===`other`?`${e?.count} messages have waited more than 10 minutes for an idle tower in team ${e?.team}`:`link_a_held`},ut=e=>`團隊 ${e?.team} 有 ${e?.count} 則訊息已等了超過 10 分鐘,塔台一直不閒`,dt=((e,t={})=>(t.locale??i())===`zh-TW`?ut(e):lt(e)),ft=e=>{let t=_(`en`,e?.count,{},!0);return t===`one`?`${e?.count} message waits in the inbox of team ${e?.team}: no tower is open on its project`:t===`other`?`${e?.count} messages wait in the inbox of team ${e?.team}: no tower is open on its project`:`link_a_inbox`},pt=e=>`團隊 ${e?.team} 的收件匣有 ${e?.count} 則訊息在等:專案上沒有開著的塔台`,mt=((e,t={})=>(t.locale??i())===`zh-TW`?pt(e):ft(e)),ht=e=>`${e?.label} (${e?.short}) asks to join team ${e?.team}`,gt=e=>`${e?.label}(${e?.short})要求加入團隊 ${e?.team}`,_t=((e,t={})=>(t.locale??i())===`zh-TW`?gt(e):ht(e)),vt=e=>`${e?.label} (${e?.short}), an unattended device, asks to join team ${e?.team}`,yt=e=>`${e?.label}(${e?.short})是無人值守的裝置,要求加入團隊 ${e?.team}`,bt=((e,t={})=>(t.locale??i())===`zh-TW`?yt(e):vt(e)),xt=e=>`${e?.label} (${e?.short}) shows another roster than this computer in team ${e?.team}; the relay may be showing different rosters`,St=e=>`團隊 ${e?.team} 中,${e?.label}(${e?.short})顯示的名冊和這台電腦不同;中繼站可能對不同人顯示不同名冊`,Ct=((e,t={})=>(t.locale??i())===`zh-TW`?St(e):xt(e)),wt=e=>{let t=_(`en`,e?.count,{},!0);return t===`one`?`${e?.count} Straw Link message waits in the inbox of team ${e?.team}; ally runs, which take it, come with the next step`:t===`other`?`${e?.count} Straw Link messages wait in the inbox of team ${e?.team}; ally runs, which take them, come with the next step`:`link_a_served`},Tt=e=>`團隊 ${e?.team} 的收件匣有 ${e?.count} 則 Straw Link 訊息在等:下一步會有 ally run 來接手`,Et=((e,t={})=>(t.locale??i())===`zh-TW`?Tt(e):wt(e)),Dt=e=>`The relay of team ${e?.team} has been unreachable for ${e?.minutes} minutes`,Ot=e=>`團隊 ${e?.team} 的中繼站已經 ${e?.minutes} 分鐘連不上`,kt=((e,t={})=>(t.locale??i())===`zh-TW`?Ot(e):Dt(e)),At=e=>`Link ${e?.count}`,jt=e=>`連線 ${e?.count}`,Mt=((e,t={})=>(t.locale??i())===`zh-TW`?jt(e):At(e)),Nt=((e={},t={})=>(t.locale??i())===`zh-TW`?`Straw Link 通知`:`Straw Link notices`),Pt=((e={},t={})=>(t.locale??i())===`zh-TW`?`允許`:`Allow`),Ft=((e={},t={})=>(t.locale??i())===`zh-TW`?`團隊`:`Teams`),It=((e={},t={})=>(t.locale??i())===`zh-TW`?`Straw Link:跨電腦的團隊`:`Straw Link: teams across computers`),Lt=((e={},t={})=>(t.locale??i())===`zh-TW`?`連線中`:`connecting`),Rt=((e={},t={})=>(t.locale??i())===`zh-TW`?`拒絕`:`Deny`),zt=((e={},t={})=>(t.locale??i())===`zh-TW`?`即時`:`live`),Bt=((e={},t={})=>(t.locale??i())===`zh-TW`?`尚未見到`:`not seen yet`),Vt=((e={},t={})=>(t.locale??i())===`zh-TW`?`離線`:`offline`),Ht=((e={},t={})=>(t.locale??i())===`zh-TW`?`在線`:`online`),Ut=((e={},t={})=>(t.locale??i())===`zh-TW`?`開啟團隊`:`Open Teams`),Wt=((e={},t={})=>(t.locale??i())===`zh-TW`?`重新連線中`:`reconnecting`),Gt=((e={},t={})=>(t.locale??i())===`zh-TW`?`查看`:`Review`),Kt=e=>`seen ${e?.ago} ago`,qt=e=>`${e?.ago}前見到`,Jt=((e,t={})=>(t.locale??i())===`zh-TW`?qt(e):Kt(e)),Yt=((e={},t={})=>(t.locale??i())===`zh-TW`?`正體中文`:`English`),Xt=((e={},t={})=>(t.locale??i())===`zh-TW`?`位置`:`Location`),Zt=e=>`${e?.name} is commanding`,Qt=e=>`${e?.name} 指揮中`,$t=((e,t={})=>(t.locale??i())===`zh-TW`?Qt(e):Zt(e)),en=e=>`${e?.name} finished`,tn=e=>`${e?.name} 已完成`,nn=((e,t={})=>(t.locale??i())===`zh-TW`?tn(e):en(e)),rn=e=>`${e?.name} hit an error`,an=e=>`${e?.name} 發生錯誤`,on=((e,t={})=>(t.locale??i())===`zh-TW`?an(e):rn(e)),sn=e=>`${e?.name} went idle`,cn=e=>`${e?.name} 轉為閒置`,ln=((e,t={})=>(t.locale??i())===`zh-TW`?cn(e):sn(e)),un=e=>`${e?.name} joined`,dn=e=>`${e?.name} 加入`,fn=((e,t={})=>(t.locale??i())===`zh-TW`?dn(e):un(e)),pn=e=>`${e?.name} left`,mn=e=>`${e?.name} 離開`,hn=((e,t={})=>(t.locale??i())===`zh-TW`?mn(e):pn(e)),gn=e=>`${e?.name} lost its status`,_n=e=>`${e?.name} 失去狀態`,vn=((e,t={})=>(t.locale??i())===`zh-TW`?_n(e):gn(e)),yn=e=>`${e?.name} is waiting on a question`,bn=e=>`${e?.name} 正在等待回答`,xn=((e,t={})=>(t.locale??i())===`zh-TW`?bn(e):yn(e)),Sn=e=>`${e?.name} started working`,Cn=e=>`${e?.name} 開始工作`,wn=((e,t={})=>(t.locale??i())===`zh-TW`?Cn(e):Sn(e)),Tn=((e={},t={})=>(t.locale??i())===`zh-TW`?`指揮中`:`commanding`),v=((e={},t={})=>(t.locale??i())===`zh-TW`?`已完成`:`finished`),En=((e={},t={})=>(t.locale??i())===`zh-TW`?`錯誤`:`error`),y=((e={},t={})=>(t.locale??i())===`zh-TW`?`閒置`:`idle`),Dn=((e={},t={})=>(t.locale??i())===`zh-TW`?`待命`:`standing by`),On=((e={},t={})=>(t.locale??i())===`zh-TW`?`無狀態`:`no status`),kn=((e={},t={})=>(t.locale??i())===`zh-TW`?`等待回答`:`waiting on a question`),An=((e={},t={})=>(t.locale??i())===`zh-TW`?`工作中`:`working`),jn=((e={},t={})=>(t.locale??i())===`zh-TW`?`地圖總覽`:`Overview of the map`),Mn=e=>`Monitor failed: ${e?.what}`,Nn=e=>`Monitor 出錯:${e?.what}`,Pn=((e,t={})=>(t.locale??i())===`zh-TW`?Nn(e):Mn(e)),Fn=e=>`Monitor went quiet and stopped: ${e?.what}`,In=e=>`Monitor 太久沒輸出,已停止:${e?.what}`,Ln=((e,t={})=>(t.locale??i())===`zh-TW`?In(e):Fn(e)),Rn=((e={},t={})=>(t.locale??i())===`zh-TW`?`從未`:`never`),zn=((e={},t={})=>(t.locale??i())===`zh-TW`?`+新基地`:`+ New base`),Bn=((e={},t={})=>(t.locale??i())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),Vn=((e={},t={})=>(t.locale??i())===`zh-TW`?`無警示`:`no alerts`),b=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),Hn=((e={},t={})=>(t.locale??i())===`zh-TW`?`尚無塔台`:`no tower yet`),Un=((e={},t={})=>(t.locale??i())===`zh-TW`?`監看中`:`Watching a monitor`),Wn=((e={},t={})=>(t.locale??i())===`zh-TW`?`思考中`:`thinking`),Gn=e=>`Finished ${e?.note}`,Kn=e=>`完成了 ${e?.note}`,qn=((e,t={})=>(t.locale??i())===`zh-TW`?Kn(e):Gn(e)),Jn=e=>`Failed ${e?.note}`,Yn=e=>`出錯了 ${e?.note}`,Xn=((e,t={})=>(t.locale??i())===`zh-TW`?Yn(e):Jn(e)),Zn=e=>`Waiting on you ${e?.note}`,Qn=e=>`等你回答 ${e?.note}`,$n=((e,t={})=>(t.locale??i())===`zh-TW`?Qn(e):Zn(e)),er=((e={},t={})=>(t.locale??i())===`zh-TW`?`+主智慧體`:`+ Main`),tr=((e={},t={})=>(t.locale??i())===`zh-TW`?`+成員`:`+ Member`),nr=((e={},t={})=>(t.locale??i())===`zh-TW`?`前哨`:`Outposts`),rr=((e={},t={})=>(t.locale??i())===`zh-TW`?`手機`:`Phone`),ir=((e={},t={})=>(t.locale??i())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),ar=((e={},t={})=>(t.locale??i())===`zh-TW`?`接回`:`Pop`),or=e=>`Pop ${e?.name}`,sr=e=>`接回 ${e?.name}`,cr=((e,t={})=>(t.locale??i())===`zh-TW`?sr(e):or(e)),lr=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),ur=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),x=((e={},t={})=>(t.locale??i())===`zh-TW`?`關掉`:`Quit`),dr=((e={},t={})=>(t.locale??i())===`zh-TW`?`關掉塔台`:`Quit tower`),fr=e=>`Refused (${e?.status}).`,pr=e=>`已拒絕(${e?.status})。`,S=((e,t={})=>(t.locale??i())===`zh-TW`?pr(e):fr(e)),mr=((e={},t={})=>(t.locale??i())===`zh-TW`?`提醒`:`Remind`),hr=((e={},t={})=>(t.locale??i())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),gr=((e={},t={})=>(t.locale??i())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),_r=((e={},t={})=>(t.locale??i())===`zh-TW`?`提醒已關`:`Reminders off`),vr=((e={},t={})=>(t.locale??i())===`zh-TW`?`提醒已開:分頁不在前景時,單位等你回答、完成或出錯會跳系統通知`:`Reminders on: while the page is in the background, a unit waiting on you, finishing, or failing raises a system notification`),yr=((e={},t={})=>(t.locale??i())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),br=((e={},t={})=>(t.locale??i())===`zh-TW`?`主智慧體`:`main`),xr=((e={},t={})=>(t.locale??i())===`zh-TW`?`成員`:`member`),Sr=((e={},t={})=>(t.locale??i())===`zh-TW`?`前哨`:`outpost`),Cr=((e={},t={})=>(t.locale??i())===`zh-TW`?`未編入`:`unaligned`),wr=((e={},t={})=>(t.locale??i(),`session`)),Tr=((e={},t={})=>(t.locale??i())===`zh-TW`?`子智慧體`:`subagent`),Er=((e={},t={})=>(t.locale??i())===`zh-TW`?`塔台`:`tower`),Dr=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器`:`Server`),Or=((e={},t={})=>(t.locale??i())===`zh-TW`?`sb 伺服器:狀態、重新啟動與記錄`:`The sb server: state, restart, and log`),kr=((e={},t={})=>(t.locale??i())===`zh-TW`?`設定`:`Settings`),Ar=((e={},t={})=>(t.locale??i())===`zh-TW`?`音效`:`Sound`),jr=((e={},t={})=>(t.locale??i())===`zh-TW`?`音效已關`:`Sounds off`),Mr=((e={},t={})=>(t.locale??i())===`zh-TW`?`音效已開`:`Sounds on`),Nr=((e={},t={})=>(t.locale??i())===`zh-TW`?`音效:開關、音量與試聽`:`Sounds: on or off, volume, and a try`),Pr=((e={},t={})=>(t.locale??i())===`zh-TW`?`▶ 試聽`:`▶ Try`),Fr=((e={},t={})=>(t.locale??i())===`zh-TW`?`音量`:`Volume`),Ir=((e={},t={})=>(t.locale??i())===`zh-TW`?`收起`:`Stash`),Lr=e=>`Stash base ${e?.name}`,Rr=e=>`收起基地 ${e?.name}`,zr=((e,t={})=>(t.locale??i())===`zh-TW`?Rr(e):Lr(e)),Br=e=>`Stash base ${e?.name}? Its tower, mains, and members quit and come back with Pop. Nothing is stashed while anything running would be lost.`,Vr=e=>`要收起基地 ${e?.name} 嗎?塔台、主智慧體和成員會結束,之後可以用「接回」叫回來。有會遺失的東西時不會收。`,Hr=((e,t={})=>(t.locale??i())===`zh-TW`?Vr(e):Br(e)),Ur=e=>`Stashed (${e?.count})`,Wr=e=>`已收起(${e?.count})`,Gr=((e,t={})=>(t.locale??i())===`zh-TW`?Wr(e):Ur(e)),Kr=((e={},t={})=>(t.locale??i())===`zh-TW`?`智慧體`:`Agents`),qr=((e={},t={})=>(t.locale??i())===`zh-TW`?`基地`:`Bases`),Jr=((e={},t={})=>(t.locale??i())===`zh-TW`?`指揮中`:`Commanding`),Yr=((e={},t={})=>(t.locale??i())===`zh-TW`?`等待中`:`Waiting`),Xr=((e={},t={})=>(t.locale??i())===`zh-TW`?`工作中`:`Working`),Zr=((e={},t={})=>(t.locale??i())===`zh-TW`?`狀態`:`States`),Qr=e=>`tab ${e?.label}`,$r=e=>`分頁 ${e?.label}`,ei=((e,t={})=>(t.locale??i())===`zh-TW`?$r(e):Qr(e)),ti=((e={},t={})=>(t.locale??i())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),ni=((e={},t={})=>(t.locale??i())===`zh-TW`?`網路活動`:`Net activity`),ri=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器啟動後還沒有動靜`:`Nothing has happened since the server started`),ii=((e={},t={})=>(t.locale??i())===`zh-TW`?`現在`:`now`),ai=e=>`${e?.count} events in 30 min`,oi=e=>`近 30 分鐘 ${e?.count} 筆`,si=((e,t={})=>(t.locale??i())===`zh-TW`?oi(e):ai(e)),ci=((e={},t={})=>(t.locale??i())===`zh-TW`?`網的總計`:`Net totals`),li=e=>`The tower refused it: ${e?.reason}`,ui=e=>`tower 拒絕了:${e?.reason}`,di=((e,t={})=>(t.locale??i())===`zh-TW`?ui(e):li(e)),fi=((e={},t={})=>(t.locale??i())===`zh-TW`?`重新送達`:`Deliver again`),pi=((e={},t={})=>(t.locale??i())===`zh-TW`?`捨棄`:`Drop`),mi=((e={},t={})=>(t.locale??i())===`zh-TW`?`沒有這則已擱置的事件。`:`No such parked event.`),hi=((e={},t={})=>(t.locale??i())===`zh-TW`?`sb server 沒有替這個工作區執行 tower。`:`The sb server runs no tower for this workspace.`),gi=e=>{let t=_(`en`,e?.count,{},!0);return t===`one`?`${e?.count} failed run lately`:t===`other`?`${e?.count} failed runs lately`:`tower_failures`},_i=e=>`近來有 ${e?.count} 次 run 失敗`,vi=((e,t={})=>(t.locale??i())===`zh-TW`?_i(e):gi(e)),yi=((e={},t={})=>(t.locale??i())===`zh-TW`?`上一次 run 當機`:`last run crashed`),bi=((e={},t={})=>(t.locale??i())===`zh-TW`?`上一次 run 已結束`:`last run quit`),xi=((e={},t={})=>(t.locale??i())===`zh-TW`?`上一次 run 逾時`:`last run timed out`),Si=e=>`An event was parked after two runs crashed with it: ${e?.what}`,Ci=e=>`有一則事件在兩個 run 都當機後被擱置:${e?.what}`,wi=((e,t={})=>(t.locale??i())===`zh-TW`?Ci(e):Si(e)),Ti=((e={},t={})=>(t.locale??i())===`zh-TW`?`run 一再當機或逾時,所以 tower 不再自動喚醒。佇列仍保留;按重試,或由老闆送一則訊息,就會再喚醒它。`:`Runs crashed or timed out again and again, so the tower stops waking. The queue is kept; Retry, or a message from the boss, wakes it again.`),Ei=((e={},t={})=>(t.locale??i())===`zh-TW`?`重試`:`Retry`),Di=e=>`A run could not start: ${e?.reason}`,Oi=e=>`run 無法啟動:${e?.reason}`,ki=((e,t={})=>(t.locale??i())===`zh-TW`?Oi(e):Di(e)),Ai=e=>`Parked: ${e?.kind} from ${e?.from}: ${e?.first}`,ji=e=>`已擱置:${e?.kind},來自 ${e?.from}:${e?.first}`,Mi=((e,t={})=>(t.locale??i())===`zh-TW`?ji(e):Ai(e)),Ni=e=>`Parked: ${e?.kind}: ${e?.first}`,Pi=e=>`已擱置:${e?.kind}:${e?.first}`,Fi=((e,t={})=>(t.locale??i())===`zh-TW`?Pi(e):Ni(e)),Ii=e=>{let t=_(`en`,e?.count,{},!0);return t===`one`?`${e?.count} message queued`:t===`other`?`${e?.count} messages queued`:`tower_queued`},Li=e=>`${e?.count} 則排隊中`,Ri=((e,t={})=>(t.locale??i())===`zh-TW`?Li(e):Ii(e)),zi=((e={},t={})=>(t.locale??i(),`ally run`)),Bi=((e={},t={})=>(t.locale??i())===`zh-TW`?`收工中`:`closing`),Vi=((e={},t={})=>(t.locale??i())===`zh-TW`?`已暫停`:`held`),Hi=((e={},t={})=>(t.locale??i())===`zh-TW`?`喚醒中`:`waking`),Ui=((e={},t={})=>(t.locale??i())===`zh-TW`?`處理中…`:`Working…`),Wi=((e={},t={})=>(t.locale??i())===`zh-TW`?`有智慧體等你同意,才能載入資料夾的設定`:`An agent needs your OK to load a folder's settings`),Gi=((e={},t={})=>(t.locale??i())===`zh-TW`?`連不上伺服器。`:`The server could not be reached.`),Ki=e=>`using ${e?.tool}`,qi=e=>`使用 ${e?.tool}`,Ji=((e,t={})=>(t.locale??i())===`zh-TW`?qi(e):Ki(e)),Yi=`sb-locale`;function Xi(e){let n=/^zh\b/i.test(e)&&(/-(hant|tw|hk|mo)\b/i.test(e)?`zh-TW`:/-(hans|cn|sg|my)\b/i.test(e)?`zh-CN`:void 0);return t(e)??(n?t(n):void 0)??t(e.split(`-`)[0])}function Zi(e,n){return t(e)??n.map(Xi).find(Boolean)??`en`}var Qi={brand_label:ve,tagline:ti,totals_label:ci,stat_bases:qr,stat_agents:Kr,stat_working:Xr,stat_waiting:Yr,stat_commanding:Jr,mark_commanding:Tn,alerts:ee,no_alerts:Vn,pair_button:rr,pair_title:ir,server_button:Dr,server_title:Or,link_connecting:Lt,location:Xt,all_bases:te,documents:$e,timeline:ni,states:Zr,mark_working:An,mark_waiting:kn,mark_idle:y,mark_done:v,mark_error:En,credit:Ge,language:nt,settings:kr,new_base:zn,link_button:Ft,link_button_title:It};Object.keys(Qi);function $i(){let e=null;try{e=localStorage.getItem(Yi)}catch{}let t=Zi(e,navigator.languages??[navigator.language]);r(()=>t),document.documentElement.lang=t;let i={m:(e,t)=>e.textContent=t,mLabel:(e,t)=>e.setAttribute(`aria-label`,t),mTitle:(e,t)=>e.title=t,mEmpty:(e,t)=>e.dataset.empty=t};for(let e of document.querySelectorAll(`[data-m], [data-m-label], [data-m-title], [data-m-empty]`))for(let[t,n]of Object.entries(i))e.dataset[t]&&n(e,Qi[e.dataset[t]]?.()??e.dataset[t]);let a=document.getElementById(`lang`);a.replaceChildren(...n.map(e=>new Option(Yt({},{locale:e}),e,!1,e===t))),a.onchange=()=>{try{localStorage.setItem(Yi,a.value),location.reload()}catch{a.value=t}}}var ea=new Set,ta=e=>e.unit??e.key,na=e=>e.mark===`waiting`||e.pending?0:1;function ra(e,t){let n=new Map;for(let r of e.bases)for(let e of[...r.tower?[{...r.tower,role:`tower`},...r.tower.subs]:[],...[...r.tabs.flatMap(e=>e.units),...r.outside].flatMap(e=>[e,...e.subs])]){n.set(e.key,{key:e.key,ws:r.id,name:e.name,role:e.role,mark:e.mark,note:e.note,at:t,pending:e.pending,closed:!e.control||!!e.ended});for(let i of e.monitors??[])(i.status===`error`||i.status===`stale`)&&(a=>n.set(a,{key:a,unit:e.key,ws:r.id,name:e.name,role:e.role,mark:`error`,note:`monitor:${i.status}:${i.what}`,at:t}))(`${e.key}\u001fmonitor:${i.id}:${i.at}`)}for(let r of e.trust??[])r.opening&&ea.has(r.opening)||(e=>n.set(e,{key:e,ws:``,name:r.folder.split(/[\\/]/).filter(Boolean).at(-1)??r.folder,role:r.agents[0]?.role??`none`,mark:`waiting`,at:t,trust:r}))(`trust\u001f${r.folder}\u001f${r.digest}`);return n}function ia(e,t){return[...t.values()].filter(t=>{let n=e?.get(t.key);return na(t)===0?!n||na(n)!==0||n.mark!==t.mark:e!==void 0&&n?.mark!==t.mark&&(t.mark===`error`||t.mark===`done`)})}var aa=`input, textarea, select, [role=textbox], [role=combobox], [role=listbox], .term-scroll`,oa=`button, a, summary, [role=button], [role=link]`,sa=`.ask-opt, [role=radio], [role=checkbox]`,ca=`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`;function la(e,t,n=!1){if(t||e.defaultPrevented||e.isComposing||e.ctrlKey||e.altKey||e.metaKey)return;let r=e.target;if(!(r?.isContentEditable||r?.closest?.(aa))){if(e.key===`f`||e.key===`F`)return`zoom`;if(e.key===` `&&!r?.closest?.(sa)&&(n||!r?.closest?.(oa)))return`next`}}function ua(e,t=()=>document.querySelector(ca)!==null,n=window){let r,i=!1,a=null;n.addEventListener(`pointerdown`,()=>i=!0,!0),n.addEventListener(`focusin`,e=>a=i?e.target:null,!0),n.addEventListener(`keydown`,n=>{let o=n.target===a;i=!1;let s=la(n,t(),o);if(s){if(n.repeat)return r===s?n.preventDefault():void 0;e(s)&&(r=s,n.preventDefault())}}),n.addEventListener(`keyup`,e=>{r===`next`&&e.key===` `&&e.preventDefault(),r=void 0})}var da=(...e)=>e.filter(e=>e!==!1&&e!=null),fa=(e,t)=>(e.classList.add(t),e.classList.toggle(`flip`));function C(e,t,...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t??{}))r.setAttribute(e,n);return r.append(...da(...n)),r}var w=e=>String(e??``);function pa(e){let t=e.data,n=e.teamName;switch(e.kind){case`join-request`:return t.unattended?bt({label:w(t.label),short:w(t.short),team:n}):_t({label:w(t.label),short:w(t.short),team:n});case`confirm`:return at({label:w(t.label),short:w(t.short),tool:w(t.tool)});case`fork`:return ct({team:n,reason:w(t.reason)});case`mismatch`:return Ct({label:w(t.label),short:w(t.short),team:n});case`unreachable`:return kt({team:n,minutes:w(t.minutes)});case`inbox`:return mt({count:Number(t.count)||0,team:n});case`held`:return dt({count:Number(t.count)||0,team:n});case`served`:return Et({count:Number(t.count)||0,team:n})}}var ma=e=>{let t={error:0,warning:1,info:2};return[...e].sort((e,n)=>t[e.level]-t[n.level])};function ha(e){let t=Math.max(0,Math.ceil(e/1e3)),n=e=>String(e).padStart(2,`0`);return t>=3600?`${Math.floor(t/3600)}:${n(Math.floor(t/60)%60)}:${n(t%60)}`:`${Math.floor(t/60)}:${n(t%60)}`}function ga(e,t){if(e===null)return Bt();if(t)return Ht();let n=Math.floor(e/1e3);return Jt({ago:n<3600?p({n:String(Math.max(1,Math.floor(n/60)))}):n<86400?u({n:String(Math.floor(n/3600))}):s({n:String(Math.floor(n/86400))})})}function _a(e){return e.online?e.tower===`blocked`?`waiting`:e.tower===`working`?`working`:e.tower===`unknown`?`unknown`:`idle`:`unknown`}function va(e){switch(e){case`working`:return An();case`blocked`:return kn();case`idle`:return y();case`done`:return v();case`unknown`:return On();default:return e}}var ya=e({post:()=>T,sendFile:()=>xa}),ba=()=>document.querySelector(`meta[name="sb-csrf"]`)?.content??``,xa=(e,t)=>fetch(`api/${e}`,{method:`POST`,cache:`no-store`,headers:{"content-type":`application/octet-stream`,"x-sb-name":encodeURIComponent(t.name||`pasted`),"x-sb-csrf":ba()},body:t}).then(async e=>({ok:e.ok,status:e.status,body:await e.json().catch(()=>({}))})),T=(e,t)=>fetch(`api/${e}`,{method:`POST`,cache:`no-store`,headers:{"content-type":`application/json`,"x-sb-csrf":ba()},body:JSON.stringify(t)}).then(async e=>({ok:e.ok,status:e.status,body:await e.json().catch(()=>({}))})),Sa=3e4,Ca=[`pointermove`,`pointerdown`,`keydown`,`wheel`,`touchstart`];function wa(e=document.documentElement){if(matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=Date.now(),n,r=()=>{let i=t+Sa-Date.now();i>0?n=setTimeout(r,i):(n=void 0,e.toggleAttribute(`data-calm`,!0))},i=()=>{t=Date.now(),n===void 0&&(e.toggleAttribute(`data-calm`,!1),n=setTimeout(r,Sa))};for(let e of Ca)addEventListener(e,i,{capture:!0,passive:!0});document.addEventListener(`visibilitychange`,()=>document.hidden||i()),i()}function Ta(e,t,n,r){if(!e)return n(t);switch(e.state){case`held`:return Vi({},r);case`waking`:return Hi({},r);case`closing`:return Bi({},r);case`running`:return e.run?.kind===`ally`?zi({},r):n(t);case`standing`:return t===`idle`?Dn({},r):n(t)}}var Ea={crashed:e=>yi({},e),timeout:e=>xi({},e),quit:e=>bi({},e)};function Da(e,t){if(!e||e.run)return;let n=Object.hasOwn(Ea,e.lastRun?.outcome??``)?Ea[e.lastRun.outcome](t):void 0;return n&&[n,e.crashes?vi({count:e.crashes},t):``].filter(Boolean).join(` · `)}var Oa=(e,t,n,r)=>[Ta(e,t,n,r),Da(e,r)].filter(Boolean).join(` · `),ka=(e,t)=>e?.queued?Ri({count:e.queued},t):void 0,Aa=`A run could not start: `,ja=`An event was parked after two runs crashed with it: `;function Ma(e,t){return(e.kind===`settings`||e.kind===`start`)&&e.text.startsWith(Aa)?ki({reason:e.text.slice(23)},t):e.kind===`loop`?Ti({},t):e.kind===`late`&&e.text.startsWith(ja)?wi({what:e.text.slice(52)},t):e.text}function Na(e,t){return[...(e?.notices??[]).filter(e=>!e.id.startsWith(`parked-`)).map(e=>({id:e.id,level:e.level,text:Ma(e,t),actions:e.kind===`loop`?[`retry`]:[]})),...(e?.parked??[]).map(e=>({id:`parked-${e.id}`,level:`warning`,text:e.from?Mi({kind:e.kind,from:e.from,first:e.first},t):Fi({kind:e.kind,first:e.first},t),event:e.id,actions:[`deliver`,`drop`]}))]}function Pa(e,t){if(!(e.status<400)){if(e.body.reason===`No such parked event`)return mi({},t);if(e.body.reason?.startsWith(`The sb server stands in for no tower`))return hi({},t)}}async function Fa(e,t,n,r=1200){let i=e.textContent;e.disabled=!0,e.textContent=Ui(),t(void 0);try{let e=await n();e.ok?r&&await new Promise(e=>setTimeout(e,r)):t(di({reason:Pa(e)??e.body.reason??e.body.error??String(e.status)}))}catch{t(di({reason:Gi()}))}finally{e.disabled=!1,e.textContent=i}}var Ia={retry:Ei,deliver:fi,drop:pi};function La(e,t,n){let r=Na(n),i=JSON.stringify([t,r]);e.dataset.sig!==i&&(e.dataset.sig=i,e.replaceChildren(...r.map(e=>{let n=C(`small`,{class:`tnote-fail`,role:`alert`}),r=C(`p`,{class:`tnote ${e.level}`},C(`span`,null,e.text));for(let i of e.actions){let a=C(`button`,{type:`button`,class:`pair-btn`},Ia[i]());a.onclick=()=>void Fa(a,e=>n.textContent=e??``,()=>T(`tower/${encodeURIComponent(t)}/${i}`,e.event?{id:e.event}:{})),r.append(a)}return r.append(n),r})))}var Ra=140;function za(e,t){let n=document.createElement(`nav`),r=document.createElement(`div`),i=document.createElement(`i`);[n.className,r.className,i.className,n.hidden]=[`minimap`,`mm-in`,`mm-view`,!0],n.setAttribute(`aria-label`,jn()),n.append(r,i),document.body.append(n);let a=1,o=0,s=()=>{o=0;let t=e.getBoundingClientRect();i.style.transform=`translateY(${Math.round(Math.max(0,-t.top)*a)}px)`,i.style.height=`${Math.round(Math.min(innerHeight-Math.max(0,t.top),t.bottom)*a)}px`,n.classList.toggle(`away`,t.bottom<innerHeight)},c=()=>{let i=e.getBoundingClientRect();n.hidden=e.hidden||i.height<innerHeight*1.05||!matchMedia(`(min-width: 900px) and (hover: hover)`).matches,!n.hidden&&(a=Math.min(Ra/i.width,innerHeight*.4/i.height),Object.assign(n.style,{width:`${Math.round(i.width*a)}px`,height:`${Math.round(i.height*a)}px`}),r.replaceChildren(...[...t.querySelectorAll(`:scope > .base:not(.leaving)`)].map(e=>{let t=e.getBoundingClientRect(),n=document.createElement(`i`);return n.dataset.mark=e.dataset.mark??`idle`,n.style.cssText=`left:${(t.left-i.left)*a}px;top:${(t.top-i.top)*a}px;width:${t.width*a}px;height:${t.height*a}px`,n})),s())};return addEventListener(`scroll`,()=>o||=requestAnimationFrame(s),{passive:!0}),addEventListener(`resize`,c),n.addEventListener(`click`,t=>{let n=e.getBoundingClientRect(),i=(t.clientY-r.getBoundingClientRect().top)/a;scrollTo({top:n.top+scrollY+i-innerHeight/2,behavior:matchMedia(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`})}),c}function Ba({x1:e,y1:t,x2:n,y2:r,mid:i},a=64){let o=Array.from({length:201},(a,o)=>{let s=o/200,c=1-s;return[c**3*e+3*c*c*s*i+3*c*s*s*i+s**3*n,c**3*t+3*c*c*s*t+3*c*s*s*r+s**3*r]}),s=o.reduce((e,t,n)=>(e.push(n?e[n-1]+Math.hypot(t[0]-o[n-1][0],t[1]-o[n-1][1]):0),e),[]);return Array.from({length:a+1},(e,t)=>{let n=t/a*s.at(-1),r=Math.max(1,s.findIndex(e=>e>=n)),[i,c]=[o[r-1],o[r]],l=s[r]>s[r-1]?(n-s[r-1])/(s[r]-s[r-1]):0;return[i[0]+(c[0]-i[0])*l,i[1]+(c[1]-i[1])*l]})}function Va(e,t){if(t||!e.length)return[];let n=document.createElement(`style`);return n.textContent=e.map((e,t)=>`@keyframes pk${t}{${Ba(e).map(([e,t],n,r)=>`${(n/(r.length-1)*100).toFixed(2)}%{transform:translate(${e.toFixed(1)}px,${t.toFixed(1)}px)}`).join(``)}}`).join(``),[n,...e.map((e,t)=>(e=>(e.className=`packet`,e.style.animationName=`pk${t}`,e))(document.createElement(`i`)))]}var Ha=typeof document<`u`&&typeof document.querySelector==`function`&&((e=document)=>e.querySelector(`meta[name="sb-desk"]`)?.content===`1`)(),Ua=(e,t=Ha)=>t||e!==`127.0.0.1`,Wa=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Ga=function(e,t){return new URL(e,t).href},Ka={},qa=function(e){return e.pathname.endsWith(`.css`)},Ja=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},E=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=Ga(t,n);let r=s(t),i=qa(r);return Ja(Ka,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:Wa,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function D(e,t,n,r,i=!1){Object.assign(e.dataset,t),[e.hidden,e.textContent]=[i,n],r&&e.setAttribute(`aria-label`,r)}var Ya=(e,t)=>t.role===`subagent`&&t.ended&&t.key?D(e,{close:`dismiss`,key:t.key,name:t.name,role:t.role},Ke(),Qe({name:t.name})):D(e,{close:`unit`,key:t.key??``,name:t.name,role:t.role},x(),Re({name:t.name}),!(t.control&&t.key)||t.role===`subagent`),Xa=(e,t)=>D(e,{key:t?.key??``,name:t?.name??``,role:`tower`},dr(),void 0,!t?.control);function Za(e,t){e.dataset.close=`unit`,t?.u.role===`tower`&&t.base.tower?.key===t.u.key?Xa(e,t.base.tower):t&&Ya(e,t.u),e.hidden=!t||e.dataset.close!==`unit`||e.hidden}var Qa=(e,t)=>D(e,{ws:t.id,name:t.label},x(),Ce({name:t.label})),$a=(e,t,n=Ha)=>D(e,{ws:t.id,name:t.label},Ir(),zr({name:t.label}),n),eo=(e,t,n)=>D(e,{ws:t.id,name:n.label,tab:n.id},x(),ke({name:n.label})),O=(e,t)=>new Promise(n=>{let r=document.createElement(`dialog`),i=document.createElement(`p`),a=document.createElement(`div`),o=(e,t,i)=>Object.assign(document.createElement(`button`),{type:`button`,className:t,textContent:e,onclick:()=>(r.close(),n(i))});[r.className,i.textContent,a.className]=[`sheet`,e,`sheet-row`],a.append(...t?[o(ye(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(be(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()}),to=e=>e.bases.flatMap(e=>[...e.tower?[e.tower]:[],...e.tabs.flatMap(e=>e.units),...e.outside]).flatMap(e=>e.subs).filter(e=>e.ended).map(e=>e.key);function no(e,t){let n=to(t).length;e.hidden=!n,n&&(e.textContent=Ye({count:n}))}function ro(e,t,n,r=Ha){if(r)return void(e.hidden=!0);let i=n.stashed??[],a=JSON.stringify(i);e.hidden=!i.length;let o=t.closest(`[popover]`);!i.length&&o?.matches(`:popover-open`)&&o.hidePopover(),i.length&&(e.textContent=Gr({count:i.length})),t.dataset.key!==a&&(t.dataset.key=a,t.replaceChildren(...i.map(e=>{let t=document.createElement(`li`),n=document.createElement(`span`),r=document.createElement(`button`);return n.textContent=e.name===e.label?e.label:`${e.name} (${e.label})`,[r.type,r.className]=[`button`,`pair-btn`],D(r,{close:`pop`,name:e.name},ar(),cr({name:e.name})),t.append(n,r),t})))}var io=e=>E(async()=>{let{post:e}=await Promise.resolve().then(()=>ya);return{post:e}},void 0,import.meta.url).then(({post:t})=>t(`dismiss`,e)).then(e=>e.ok||(O(e.body.reason??S({status:e.status})),!1),()=>(O(b()),!1));function ao(e,{route:t,net:n,go:r}){let i=t();if(i.view===`map`)return;if(e.close===`base`||e.close===`stash`)return void(i.ws===e.ws&&r({view:`map`}));let a=e=>e.flatMap(e=>[e.key,...a(e.subs)]),o=e.close===`tab`&&i.ws===e.ws?n()?.bases.find(t=>t.id===e.ws)?.tabs.find(t=>t.id===e.tab):void 0;i.view===`session`&&(e.close===`unit`?i.key===e.key:o&&a(o.units).includes(i.key))&&r({view:`workspace`,ws:i.ws})}function oo(e){document.addEventListener(`click`,t=>{let n=t.target?.closest?.(`button[data-close]`),r=n?.dataset;if(n&&r){if(t.preventDefault(),r.close===`dismiss`||r.close===`dismiss-all`)return void io(r.close===`dismiss`?{key:r.key}:{all:!0});if(r.close===`pop`)return void(n.toggleAttribute(`disabled`,!0),Promise.all([E(()=>Promise.resolve().then(()=>ya),void 0,import.meta.url),E(()=>import(`./refusal--wJ5SRx-.js`).then(e=>e.n),[],import.meta.url)]).then(([{post:e},{reasonOf:t}])=>e(`close/pop`,{name:r.name}).then(e=>e.ok||O(t(e.body.reason,e.body.settings)??S({status:e.status})))).catch(()=>O(b())).finally(()=>n.toggleAttribute(`disabled`,!1)));O((r.close===`stash`?Hr:r.close===`base`?Ee:r.close===`tab`?Me:r.role===`tower`?Fe:Ve)({name:r.name??``}),r.close===`stash`?Ir():x()).then(t=>{t&&(n.toggleAttribute(`disabled`,!0),E(async()=>{let{post:e}=await Promise.resolve().then(()=>ya);return{post:e}},void 0,import.meta.url).then(({post:e})=>e(`close/${r.close===`base`?`all`:r.close}`,r.close===`unit`?{key:r.key}:{workspace:r.ws,...r.tab&&{tab:r.tab}})).then(t=>t.ok?ao(r,e):O(t.body.reason??S({status:t.status})),()=>O(b())).finally(()=>n.toggleAttribute(`disabled`,!1)))})}})}var so=e=>{try{return decodeURIComponent(e)}catch{return e}},co=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function lo(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(so);if(r!==`w`||!i)return{view:`map`};if(a!==`s`||!o)return{view:`workspace`,ws:i};let s=new URLSearchParams(n).get(`at`);return s?{view:`session`,ws:i,key:o,at:s}:{view:`session`,ws:i,key:o}}var k=e=>e.view===`map`?``:e.view===`workspace`?`w/${co(e.ws)}`:`w/${co(e.ws)}/s/${co(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,uo=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},fo=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null,po=e=>Math.max(0,e?.depth||0);function mo(e,t=new URL(document.baseURI).pathname){let n=()=>lo(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>k(e)||`./`,go(n){let r=t+k(n);location.pathname+location.search!==r&&history.pushState({depth:po(history.state)+1},``,r),e(n)}};return addEventListener(`popstate`,()=>e(n())),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-route]`);!t||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),t.hasAttribute(`data-back`)&&po(history.state)>0?history.back():r.go(lo(t.getAttribute(`data-route`))))}),r}var ho={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},go={commanding:Tn,working:An,waiting:kn,idle:y,done:v,error:En,unknown:On},_o={main:br,member:xr,subagent:Tr,tower:Er,outpost:Sr,outside:Cr,session:wr},vo={thinking:Wn,"watching a monitor":Un,idle:y,"waiting on a question":kn,finished:v},yo={claude:`Claude`,codex:`Codex`},bo=e=>Object.hasOwn(_o,e)?_o[e]():e,xo=e=>e===`waiting`||e===`error`,A=e=>{let t=new DOMParser().parseFromString(e.trim(),`text/html`).body.firstElementChild;if(!(t instanceof HTMLElement))throw Error(`bad template`);return document.importNode(t,!0)},j=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},M=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},N=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&fa(e,`flash`)},So=e=>(t=>(e.slice(8,t)===`stale`?Ln:Pn)({what:e.slice(t+1)}))(e.indexOf(`:`,8)),P=(e,t)=>e?e.startsWith(`tool:`)?Ji({tool:e.slice(5)}):e.startsWith(`monitor:`)?So(e):Object.hasOwn(vo,e)?vo[e]():e:go[t](),Co=(e,t,n,r,i=P(n,r))=>{M(e,t,i),e.querySelector(t).toggleAttribute(`data-monitoring`,i===P(n,r)&&n===`watching a monitor`)},F=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,k(t)||`./`),e.setAttribute(`data-route`,k(t)))},I=(e,t)=>{let n=t.getBoundingClientRect(),r=e.offsetWidth;e.style.top=`${n.bottom+8}px`,e.style.left=`${Math.max(8,Math.min(n.right-r,innerWidth-r-8))}px`},wo=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function To(e,t,n,r){N(e,n);let i=e.querySelector(`use`),a=`#i-${ho[t]??`member`}`,o=r?.filter(e=>e.onScreen).length;i.getAttribute(`href`)!==a&&i.setAttribute(`href`,a),o?e.dataset.docs=String(o):delete e.dataset.docs}function L(e,t,n,r){let i=new Map;for(let t of e.children)!t.classList.contains(`leaving`)&&t.dataset.key&&i.set(t.dataset.key,t);let a=e.firstElementChild;for(let o of t){let t=i.get(o.id);for(t||(t=n(o),t.dataset.key=o.id,t.classList.add(`enter`),setTimeout(()=>t.classList.remove(`enter`),600)),i.delete(o.id);a?.classList.contains(`leaving`);)a=a.nextElementSibling;t===a?a=a.nextElementSibling:e.insertBefore(t,a),r(t,o)}for(let e of i.values())e.classList.add(`leaving`),setTimeout(()=>e.remove(),400)}var Eo=(e,t=Math.max(0,Date.now()-e)/1e3)=>t<60?g({n:String(Math.floor(t))}):t<3600?p({n:String(Math.floor(t/60))}):t<86400?u({n:String(Math.floor(t/3600))}):s({n:String(Math.floor(t/86400))}),Do=(e,t)=>(t===void 0?delete e.dataset.since:e.dataset.since=String(t),e.textContent=t===void 0?``:Eo(t));function Oo(e,t=[]){let n=e.querySelector(`:scope > .ticks`),r=t.map(e=>`${e.at}${e.mark}`).join();n.dataset.sig!==r&&(n.dataset.sig=r,e.classList.toggle(`ticked`,t.length>0),n.replaceChildren(...t.map((e,n)=>{let r=document.createElement(`i`);return r.dataset.mark=e.mark,r.style.setProperty(`--o`,((n+1)/t.length).toFixed(2)),r})))}var R=()=>A(`<div class="unit"><div class="card"><a class="hit"></a>${wo}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><em class="agent"></em><span class="note"></span><span class="age"></span></span><span class="todo" hidden><b></b><span></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button><span class="ticks" aria-hidden="true"></span></div><div class="subs"></div></div>`);function z(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);F(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${P(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,xo(t.mark)),N(e,t.mark),To(e.querySelector(`.plate`),t.role,t.mark,t.docs),M(e,`.name`,t.name),M(e,`.role`,bo(t.role)),M(e,`.agent`,t.agent?yo[t.agent]:``),Co(e,`.note`,t.note,t.mark),Do(e.querySelector(`:scope > .card .age`),t.since);let i=e.querySelector(`:scope > .card .todo`);i.hidden=!t.todo,t.todo&&(M(i,`b`,`${t.todo.done<t.todo.total?`◐`:`✓`} ${t.todo.done}/${t.todo.total}`),M(i,`span`,t.todo.now??``)),Oo(e.querySelector(`:scope > .card`),t.ticks),Ya(e.querySelector(`:scope > .card > .quit-btn`),t),L(e.querySelector(`.subs`),t.subs??[],R,z)}function ko(e,t,n){let r=t.tower?`main`:`member`;e.hidden=!!(n&&t.tower),e.dataset.open=r,e.dataset.ws=t.id,n&&(e.dataset.tab=n),e.textContent!==(r===`main`?er():tr())&&(e.textContent=r===`main`?er():tr())}var Ao=()=>A(`<section class="base"><header><div class="tower"><i class="sweep"></i><i class="pulse"></i><svg><use href="#i-tower"/></svg><b class="badge"></b></div><div class="title"><span class="crown"><svg><use href="#i-crown"/></svg>${tt()}</span><h2><a class="enter-base"></a></h2><p><span class="tstate"></span><span class="tqueue"></span><span class="age"></span></p><button type="button" class="quit-btn tower-quit" data-close="unit" hidden></button></div><button type="button" class="quit-btn" data-close="base"></button></header><div class="subs tower-subs"></div><div class="tower-notices"></div><div class="spawn-btns"><button type="button" class="pair-btn"></button><button type="button" class="pair-btn" data-close="stash"></button></div><div class="tabs"></div><div class="outposts" data-label="${nr()}"></div></section>`),jo=e=>Oa(e.service,e.mark,e=>go[e]());function Mo(e,t){N(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),N(n,t.tower?.mark??`unknown`),M(e,`h2 a`,t.label),F(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),M(e,`.title .tstate`,t.tower?We({state:jo(t.tower)}):Hn()),M(e,`.title .tqueue`,ka(t.tower?.service)??``),Do(e.querySelector(`.title .age`),t.tower?.since),ko(e.querySelector(`.spawn-btns button`),t),Qa(e.querySelector(`header > .quit-btn`),t),$a(e.querySelector(`.spawn-btns [data-close=stash]`),t),Xa(e.querySelector(`.tower-quit`),t.tower),L(e.querySelector(`.tower-subs`),t.tower?.subs??[],R,z),La(e.querySelector(`.tower-notices`),t.id,t.tower?.service),L(e.querySelector(`.tabs`),t.tabs,()=>A(`<div class="tab"><h3><span></span><button type="button" class="tab-add"></button><button type="button" class="quit-btn" data-close="tab"></button></h3><div class="units"></div></div>`),(e,n)=>{M(e,`h3 span`,ei({label:n.label})),eo(e.querySelector(`.quit-btn`),t,n),ko(e.querySelector(`.tab-add`),t,n.id),L(e.querySelector(`.units`),n.units,R,z)}),L(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?Bn():void 0,since:e.since,ticks:e.ticks})),R,z)}var No=()=>A(`<section class="base ally"><header><div class="tower"><i class="pulse"></i><svg><use href="#i-tower"/></svg><b class="badge"></b></div><div class="title"><span class="crown"><svg><use href="#i-main"/></svg><em class="ally-tag"></em></span><h2></h2><p><span class="tstate"></span></p></div></header><ul class="ally-tabs"></ul></section>`);function Po(e,t){let n=_a(t);N(e,n),e.classList.toggle(`offline`,!t.online),N(e.querySelector(`.tower`),n),M(e,`.ally-tag`,ie({team:t.teamName})),M(e,`h2`,t.workspace??t.label),M(e,`.tstate`,`${t.workspace?`${t.label} · `:``}${t.short} · ${t.online?va(t.tower):Vt()}`),L(e.querySelector(`.ally-tabs`),t.tabs.map((e,t)=>({id:`${t}`,...e})),()=>A(`<li class="ally-tab"><b></b><span></span></li>`),(e,n)=>{M(e,`b`,n.label),M(e,`span`,t.online?va(n.state):``),e.dataset.state=n.state})}function Fo(e,t,n,r){let i=[...e.querySelectorAll(`.base:not(.leaving):not(.ally) .tower`)],a=e.querySelector(`.base.head:not(.leaving) .tower`),o=e.getBoundingClientRect(),s=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-o.x),Math.round(t.y+t.height/2-o.y)]},c=a?i.filter(e=>e!==a):[],l=c.map(e=>{let[[t,n],[r,i]]=[s(a),s(e)];return{x1:t,y1:n,x2:r,y2:i,mid:Math.round((t+r)/2)}}),u=l.map(({x1:e,y1:t,x2:n,y2:r,mid:i})=>`M${e} ${t}C${i} ${t} ${i} ${r} ${n} ${r}`),d=u.join(`|`);t.dataset.sig!==d&&(t.dataset.sig=d,t.replaceChildren(...u.map(e=>(t=>(t.setAttribute(`class`,`wire`),t.setAttribute(`d`,e),t))(document.createElementNS(`http://www.w3.org/2000/svg`,`path`)))),n.replaceChildren(...Va(l,r))),n.querySelectorAll(`.packet`).forEach((e,t)=>e.toggleAttribute(`data-live`,[`working`,`commanding`].includes(a.dataset.mark??``)||[`working`,`commanding`].includes(c[t].dataset.mark??``)))}var Io=2,Lo=20;function Ro(){let[e,t,n,r]=[j(`map`,HTMLElement),j(`bases`,HTMLElement),j(`links`,SVGSVGElement),j(`packets`,HTMLElement)],i=matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=new Set,o=za(e,t),s=()=>(o(),!e.hidden&&Fo(e,n,r,i)),c=0,l=()=>c||=requestAnimationFrame(()=>(c=0,s())),u=new ResizeObserver(e=>(e.forEach(({target:e,borderBoxSize:t})=>e.style.gridRowEnd=`span ${Math.ceil((t[0].blockSize+Lo)/Io)}`),l()));return setInterval(()=>document.querySelectorAll(`.age[data-since]`).forEach(e=>Do(e,Number(e.dataset.since))),15e3),addEventListener(`resize`,l),new ResizeObserver(([e])=>document.documentElement.style.setProperty(`--hud`,`${Math.ceil(e.borderBoxSize[0].blockSize)}px`)).observe(document.querySelector(`.hud`)),wa(),{layout:s,stats(e){let t=e.bases.flatMap(e=>[...e.tower?.subs??[],...e.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))]),n=e=>String(t.filter(t=>!e||t.mark===e).length);j(`s-commanding`,HTMLElement).parentElement.toggleAttribute(`data-on`,t.some(e=>e.mark===`commanding`));for(let[t,r]of[[`s-bases`,String(e.bases.length)],[`s-agents`,n()],[`s-working`,n(`working`)],[`s-commanding`,n(`commanding`)],[`s-waiting`,n(`waiting`)]])j(t,HTMLElement).textContent=r},show(e){let n=(e.link?.allies??[]).map(e=>({...e,id:`ally/${e.id}`,ally:!0}));L(t,[...e.bases,...n],e=>`ally`in e?No():Ao(),(e,t)=>`ally`in t?Po(e,t):Mo(e,t));for(let e of t.children)a.has(e)||(a.add(e),u.observe(e));for(let e of a)e.isConnected||(a.delete(e),u.unobserve(e));requestAnimationFrame(s)},pause(e){document.documentElement.classList.toggle(`paused`,e)}}}function zo(e,t){let n=j(`link-alerts`,HTMLButtonElement),r=j(`link-alerts-pop`,HTMLElement),i=j(`link-alerts-list`,HTMLElement),a=``,o=new Set,s=!0;r.addEventListener(`toggle`,e=>e.newState===`open`&&I(r,n)),r.setAttribute(`aria-label`,Nt()),n.title=Nt();let c=(e,t,n)=>{let r=n.querySelector(`.link-note`);for(let e of n.querySelectorAll(`button`))e.disabled=!0;T(`link/confirm-answer`,{dialogId:e.dialogId,allow:t}).then(e=>{e.ok||(r.textContent=e.body.reason??S({status:e.status}));for(let e of n.querySelectorAll(`button`))e.disabled=!1},()=>{r.textContent=b();for(let e of n.querySelectorAll(`button`))e.disabled=!1})},l=e=>{let t=C(`li`,{class:`link-alert`,"data-level":`warning`}),n=C(`button`,{type:`button`,class:`pair-btn`},Pt()),r=C(`button`,{type:`button`,class:`pair-btn`},Rt());return n.onclick=()=>c(e,!0,t),r.onclick=()=>c(e,!1,t),t.append(C(`b`,null,pa({id:``,kind:`confirm`,level:`warning`,team:e.team,teamName:``,data:{label:e.fromLabel,short:e.fromShort,tool:e.tool}})),C(`pre`,{class:`link-args`},e.args),C(`div`,{class:`devices-acts`},n,r),C(`small`,{class:`link-note`,role:`status`})),t};return{net(c){let u=ma((c?.alerts??[]).filter(e=>e.kind!==`confirm`)),d=c?.confirms??[],f=JSON.stringify([u,d]);if(f===a)return;a=f;let p=new Set([...d.map(e=>`c/${e.dialogId}`),...u.filter(e=>e.kind===`join-request`).map(e=>e.id)]);s||t([...p].filter(e=>!o.has(e)).length),[o,s]=[p,!1];let m=u.length+d.length;n.hidden=m===0,n.textContent=Mt({count:String(m)}),n.dataset.state=d.length||u.some(e=>e.level===`error`)?`error`:u.some(e=>e.level===`warning`)?`waiting`:`done`,!m&&r.matches(`:popover-open`)&&r.hidePopover(),i.replaceChildren(...da(...d.map(l),...u.map(t=>{let n=C(`li`,{class:`link-alert`,"data-level":t.level},C(`span`,null,pa(t)));if(t.kind===`join-request`||t.kind===`fork`||t.kind===`mismatch`){let i=C(`button`,{type:`button`,class:`later`},t.kind===`join-request`?Gt():Ut());i.onclick=()=>(r.hidePopover(),e()),n.append(i)}return n})))}}}var Bo=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,Vo=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,Ho={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:Vo,done:Bo},Uo=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,Wo=(e,t)=>{try{return localStorage.getItem(e)??t}catch{return t}},Go=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function Ko(e){let t=e=>document.getElementById(e),n=t(`remind`),r=t(`sound`),i=t(`sound-pop`),a=t(`sound-on`),o=t(`sound-vol`),s=t(`sound-vol-out`),c=typeof Notification<`u`,l=Wo(`sb.remind`,`1`)===`1`,u=Wo(`sb.sound`,`0`)===`1`,d=Math.min(100,Math.max(0,Number(Wo(`sb.volume`,`60`))||0)),f,p,m=new Map,h=()=>{let e=c?Notification.permission:`denied`;n.setAttribute(`aria-pressed`,String(l)),n.dataset.state=l?e===`granted`?`on`:e===`denied`?`blocked`:`ask`:`off`,n.title=c?l?e===`granted`?vr():e===`denied`?gr():hr():_r():yr(),r.dataset.state=u?`on`:`off`,r.setAttribute(`aria-label`,u?Mr():jr()),a.checked=u,o.value=s.value=String(d),p&&(p.gain.value=(d/100)**2)};n.textContent=mr(),r.textContent=Ar(),r.title=Nr(),t(`sound-on-label`).textContent=Ar(),t(`sound-vol-label`).textContent=Fr(),t(`sound-try`).textContent=Pr(),n.onclick=async()=>{l&&c&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):Go(`sb.remind`,(l=!l)?`1`:`0`),h()},i.addEventListener(`toggle`,e=>e.newState===`open`&&I(i,r)),a.onchange=()=>{Go(`sb.sound`,(u=a.checked)?`1`:`0`),h(),u&&g(`done`)},o.oninput=()=>(Go(`sb.volume`,String(d=Number(o.value))),h()),o.onchange=()=>g(`done`),t(`sound-try`).onclick=()=>g(`done`);function g(e){f??=new AudioContext,p||((p=f.createGain()).connect(f.destination),h());let t=f,n=p;m.has(e)||m.set(e,fetch(Ho[e]).then(e=>e.arrayBuffer()).then(e=>t.decodeAudioData(e))),Promise.all([t.resume(),m.get(e)]).then(([,e])=>{let r=t.createBufferSource();r.buffer=e,r.connect(n),r.start()}).catch(()=>m.delete(e))}return h(),{chime:()=>u&&g(`done`),signal(t){let n=t.flatMap(e=>(t=>t?[{a:e,k:t}]:[])(Uo(e)));if(n.length&&(u&&g([`waiting`,`error`,`done`].find(e=>n.some(t=>t.k===e))),l&&c&&Notification.permission===`granted`&&(document.hidden||!document.hasFocus())))for(let{a:t,k:r}of n){let n=new Notification(t.name,{body:t.trust?Wi():{waiting:$n,error:Xn,done:qn}[r]({note:t.note??``}).trim(),tag:t.key,icon:document.querySelector(`link[rel="icon"]`)?.href,silent:r!==`waiting`});n.onclick=()=>(window.focus(),n.close(),e(t))}}}}var qo=45e3,Jo=1e3,Yo=3e4,Xo=(e,t)=>Math.min(Yo,Jo*2**(e-1))*(.8+.4*t);function Zo(e){try{return JSON.parse(e)}catch{return}}function Qo(e){let t,n,r,i=0,a={state:`connecting`,attempt:0},o=t=>e.onStatus(a={...a,...t}),s=()=>(e.clearTimeout(n),e.clearTimeout(r),n=r=void 0),c=()=>{let e=t;t=void 0,e?.close()},l=()=>{e.clearTimeout(r),r=e.setTimeout(()=>u(),qo),o({state:`live`,attempt:0,lastContact:e.now()})},u=()=>{c(),s();let t=a.attempt+1;if(t>8)return o({state:`offline`,attempt:t});o({state:`reconnecting`,attempt:t}),e.hidden()||(n=e.setTimeout(d,Xo(t,e.random())))},d=()=>{c(),s(),i=e.now();let n=t=e.open();n.onError(()=>{t===n&&(u(),e.replaced?.().then(e=>{e&&a.state!==`live`&&a.state!==`replaced`&&(c(),s(),o({state:`replaced`}))},()=>{}))}),n.listen(`message`,r=>{if(t!==n)return;let i=Zo(r);i&&e.onNet(i),o({problem:i?void 0:lr()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:Zo(e)??ur()}),l())}),r=e.setTimeout(()=>u(),qo)};return{start(){o({state:`connecting`,attempt:0}),d()},resume(){if(a.state===`replaced`)return;let n=e.now()-i<2e3||a.lastContact!==void 0&&e.now()-a.lastContact<=2e4;t&&n||(o({attempt:0,state:a.state===`live`?`reconnecting`:a.state}),d())},restart:d,hide(){e.clearTimeout(n),n=void 0},stop(){c(),s()}}}var $o={commanding:$t,working:wn,waiting:xn,idle:ln,done:nn,error:on,unknown:vn},es=e=>(e.kind===`joined`?fn:e.kind===`left`?hn:$o[e.mark])({name:e.name}),ts=18e5,ns={waiting:0,error:0,working:1,commanding:1},rs=e=>new Date(e).toLocaleTimeString([],{hour12:!1});function is(e){let[t,n,r,i,a]=[`.tl-lanes`,`.tl-axis`,`.tl-at`,`.tl-last`,`.tl-span`].map(t=>e.querySelector(t)),o=[],s=``;matchMedia(`(max-width: 640px)`).matches&&(e.open=!1);let c=()=>{let e=Date.now()-ts,s=o.filter(t=>t.at>=e),c=s.at(-1);t.replaceChildren(...s.map(t=>{let n=document.createElement(`a`),r=(t.at-e)/ts*100;return n.className=`tl-mark ${t.kind}${r>70?` end`:``}`,n.dataset.mark=t.kind===`left`?`unknown`:t.mark,n.style.cssText=`left:${r.toFixed(2)}%;top:${(ns[t.mark]??2)*14+4}px`,n.setAttribute(`aria-label`,`${rs(t.at)} ${es(t)}`),F(n,t.key&&t.kind!==`left`?{view:`session`,ws:t.ws,key:t.key}:{view:`workspace`,ws:t.ws}),n})),n.replaceChildren(...[0,10,20].map(t=>Object.assign(document.createElement(`span`),{textContent:rs(e+t*6e4).slice(0,5)})),Object.assign(document.createElement(`span`),{textContent:ii()})),r.textContent=c?rs(c.at):``,i.textContent=c?es(c):ri(),a.textContent=si({count:String(s.length)})};return setInterval(c,3e4),c(),{net(e){let t=e.events??[],n=t.map(e=>`${e.at}${e.kind}${e.key??e.name}${e.mark}`).join();n!==s&&(s=n,o=t,c())}}}$i();var B=Ro(),as=is(document.getElementById(`timeline`)),V=e=>document.getElementById(e),os=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):Rn(),ss,H,U,cs={state:`connecting`,attempt:0},W={view:`map`},ls=!1,us,ds=``,G,fs,K=e=>G?e(G):void fs?.then(e);function ps(){fs??=E(async()=>{let{mountFocus:e}=await import(`./views-Dv5aloYQ.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(G=e({data:ks,restart:()=>Q.restart(),openTile:Y,embedTerminal:(e,t,n)=>new Promise(r=>J(i=>r(i.terminal.embed(e,t,n)))),online:()=>cs.state===`live`}),G.show(W,W),H&&G.net(H),G))}var q,ms,J=e=>{if(q)return e(q);ms??=E(async()=>{let{mountPanels:e}=await import(`./layer-CfjjGGBx.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>q=e({label:e=>H?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(Os?Os.data(e).latest():Ds(e,`?limit=12`))).items,post:e=>Os&&((t,n)=>Os.data(e).post(t,n)),stream:()=>ds,showTerminal:(e,t)=>(q?.stack.close(),G?.terminal(t),Z.go({view:`session`,ws:e,key:t}))})),ms.then(e)},Y=(e,t)=>J(n=>n.tiles.open(e,t)),X=document.querySelector(`link[rel="icon"]`),hs=X&&decodeURIComponent(X.href.slice(X.href.indexOf(`,`)+1)),gs=0;function _s(e){let t=e.bases.flatMap(e=>[...e.tower?[e.tower,...e.tower.subs]:[],...[...e.tabs.flatMap(e=>e.units),...e.outside].flatMap(e=>[e,...e.subs])]).filter(e=>e.mark===`waiting`||e.pending).length+(e.trust?.length??0);if(!X||!hs||t===gs)return;gs=t;let n=`<circle cx='23' cy='9' r='9' fill='#e0af68' stroke='#1a1b26' stroke-width='2'/><text x='23' y='13' text-anchor='middle' font-family='sans-serif' font-size='${t>9?9:12}' font-weight='700' fill='#16161e'>${t>9?`9+`:t}</text>`;X.href=`data:image/svg+xml,${encodeURIComponent(t?hs.replace(`</svg>`,`${n}</svg>`):hs)}`}var vs;function ys(e){H=U=e,_s(e),Ms.net(e.link);let t=ra(e,Date.now());if(vs&&Ns.signal(ia(vs,t)),vs=t,document.hidden)return;B.stats(e),no(V(`dismiss-all`),e),ro(V(`stashed`),V(`stashed-list`),e),$?.net(e);let n=ia(us,t);(n.length||q)&&J(e=>e.alerts(n,t)),us=t,as.net(e),K(t=>t.net(e)),W.view===`map`&&(B.show(e),ss=e,U=void 0)}function bs(e){let t=W,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;W=e,$?.route(e),e.view!==`map`&&ps(),V(`map`).hidden=e.view!==`map`,V(`legend`).hidden=e.view===`session`,V(`stage`).dataset.view=e.view,K(r=>r.show(e,t,n)),e.view===`map`&&H&&H!==ss&&(ys(H),requestAnimationFrame(B.layout)),ls&&fo(e)!==fo(t)&&Q.restart()}function xs(e){cs=e;let t=e.state===`reconnecting`||e.state===`offline`||e.state===`replaced`;document.body.dataset.stale=V(`stage`).dataset.stale=String(t),V(`link`).dataset.state=e.state,V(`link-text`).textContent={connecting:Lt,live:zt,reconnecting:Wt,offline:Vt,replaced:Vt}[e.state](),G&&H&&G.net(H),q?.stack.redraw();let n=V(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`replaced`?_e():e.state===`offline`?le({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?ge({attempt:e.attempt}):pe():fe({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=os(e.lastContact),n.replaceChildren(`${r} ${oe()} `,i,ae())}function Ss(e,t){try{let n=JSON.parse(t);K(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var Cs=document.querySelector(`meta[name="sb-build"]`)?.content,ws=e=>!!(Cs&&Cs!==JSON.parse(e).build);function Ts(e){let t=new EventSource(e?`events?watch=${encodeURIComponent(e)}`:`events`);return{onError:e=>t.onerror=e,listen:(e,n)=>t.addEventListener(e,e=>n(e.data)),close:()=>t.close()}}var Es=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),Ds=(e,t=``)=>Es(`history/${encodeURIComponent(e)}${t}`),Os=void 0,ks=e=>({older:t=>Ds(e,`?before=${encodeURIComponent(t)}`),latest:()=>Ds(e),entry:t=>Es(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),As=()=>{let e=Ts(fo(W));return e.listen(`history`,e=>Ss(`history`,e)),e.listen(`cards`,e=>Ss(`cards`,e)),e.listen(`hello`,e=>ws(e)?location.reload():(ds=e,q?.terminal.hello())),e.listen(`mirror`,e=>q?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&lo(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=us?.get(n.key);r&&(e.preventDefault(),J(e=>e.stack.show(r)))},!0);var Z=mo(e=>bs(e)),js=()=>void E(async()=>{let{linkTile:e}=await import(`./link-D6BSHU7X.js`);return{linkTile:e}},[],import.meta.url).then(({linkTile:e})=>Y(e(),!0)),Ms=zo(js,e=>e&&Ns.chime()),Ns=Ko(e=>e.trust?J(t=>t.stack.show(e)):Z.go({view:`session`,ws:e.ws,key:ta(e)})),Q=Qo({open:As,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:ys,onStatus:xs,replaced:()=>fetch(`./`,{cache:`no-store`}).then(e=>e.status===403)}),Ps=()=>Q.resume();document.addEventListener(`visibilitychange`,()=>{if(B.pause(document.hidden),document.hidden)return Q.hide();U&&ys(U),K(e=>e.wake()),Ps()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(e.preventDefault(),!q?.stack.close()&&W.view!==`map`&&Z.go(uo(W)))}),ua(e=>q?.hotkey(e)??!1),V(`teams`).addEventListener(`click`,js),V(`pair`).hidden=Ua(location.hostname),V(`pair`).addEventListener(`click`,()=>void E(async()=>{let{pairTile:e}=await import(`./pair-DIUnQzxd.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>Y(e(),!0))),V(`server`).hidden=location.hostname!==`127.0.0.1`,V(`server`).addEventListener(`click`,()=>void E(async()=>{let{serverTile:e}=await import(`./server-3HZ1jHKy.js`);return{serverTile:e}},[],import.meta.url).then(({serverTile:e})=>Y(e(),!0)));var $,Fs=matchMedia(`(pointer: coarse), (max-width: 640px)`),Is=()=>void E(async()=>{let{mountDrawer:e}=await import(`./drawer-Bf-VvXvz.js`);return{mountDrawer:e}},[],import.meta.url).then(({mountDrawer:e})=>($??=e(),H&&$.net(H),$.route(W)));Fs.matches?Is():Fs.addEventListener(`change`,()=>Fs.matches&&!$&&Is(),{once:!0}),oo({route:()=>W,net:()=>H,go:e=>Z.go(e)}),V(`stashed-pop`).addEventListener(`toggle`,e=>e.newState===`open`&&I(V(`stashed-pop`),V(`stashed`))),V(`prefs-pop`).addEventListener(`toggle`,e=>e.newState===`open`&&I(V(`prefs-pop`),V(`prefs`))),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&E(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-CSy62eQX.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,H?.bases??[]);r&&Y(n(r,(e,t,n)=>(q?.tiles.close(n),Z.go({view:`session`,ws:e,key:t})),()=>Ns.chime()),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&Ps());xs(cs),bs(Z.route()),Q.start(),ls=!0;export{ct as $,C as A,Yr as B,La as C,xa as D,T as E,na as F,Hn as G,br as H,ta as I,Bn as J,b as K,Gi as L,fa as M,ca as N,ha as O,ea as P,_t as Q,ei as R,E as S,Oa as T,S as U,xr as V,nr as W,kt as X,Rn as Y,bt as Z,xo as _,F as a,ye as at,io as b,P as c,A as d,tt as et,N as f,M as g,L as h,wo as i,be as it,da as j,ga as k,To as l,Co as m,ho as n,$e as nt,ko as o,te as ot,bo as p,Vn as q,go as r,We as rt,j as s,yo as t,_ as tt,I as u,Za as v,Pa as w,no as x,Ya as y,Xr as z};
|