pi-straw-boss 0.27.3 → 0.29.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 +5 -4
- package/README.zh-TW.md +5 -4
- package/dist/gui/assets/ask-DLVCblnO.js +1 -0
- package/dist/gui/assets/{chat-BECfofMv.js → chat-nFeusTAo.js} +2 -2
- package/dist/gui/assets/index-BxSaqaet.js +1 -0
- package/dist/gui/assets/{index-DI9km3B9.css → index-Cc-om6fn.css} +1 -1
- package/dist/gui/assets/{layer-D1jSjgZJ.js → layer-MhUpNNJY.js} +2 -2
- package/dist/gui/assets/{lightbox-BfLxcOSU.js → lightbox-Bt9x-ElA.js} +1 -1
- package/dist/gui/assets/{pair-CHVcdx5H.js → pair-CwPFgFN8.js} +1 -1
- package/dist/gui/assets/{spawn-DbHqsZJv.js → spawn-BgFg4ORi.js} +1 -1
- package/dist/gui/assets/views-CWyLbZlX.js +7 -0
- package/dist/gui/index.html +2 -2
- package/package.json +1 -1
- package/src/ask.ts +16 -10
- package/src/bridge.ts +11 -3
- package/src/control.ts +4 -2
- package/src/dashboard.ts +2 -2
- package/src/dialogs.ts +28 -14
- package/src/gui.ts +37 -19
- package/src/handover.ts +5 -5
- package/src/host.ts +1 -1
- package/src/index.ts +5 -2
- package/src/intercept.ts +170 -0
- package/src/keys.ts +6 -6
- package/src/order.ts +19 -3
- package/src/owners.ts +43 -14
- package/src/presence.ts +38 -2
- package/src/remote.ts +24 -16
- package/src/seal.ts +56 -0
- package/src/state.ts +1 -1
- package/dist/gui/assets/ask-C1mvQKbG.js +0 -1
- package/dist/gui/assets/index-gWx1_-3G.js +0 -1
- package/dist/gui/assets/views-JgP8ffyr.js +0 -7
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ Run a few agents on the same project and they start stepping on each other: two
|
|
|
30
30
|
- **A main agent per tab, by promotion.** An agent whose work grows calls `boss_promote`, or is promoted when it first dispatches a subagent. A tab has one main, and nobody takes it over except you with `/boss`.
|
|
31
31
|
- **A tower per workspace.** It opens in its own tab, pinned first, when agents start to collide: a member dispatches a subagent (it promotes itself first), a workspace has two members while another workspace already has a tower, an agent promotes itself, or you type `/boss tower`. Mains and the tower go together: a tower that opens promotes each tab's earliest member, and a tower that quits turns every main back into a member (its subagents stay). It and coordinates the main agents and the other towers, and opens a tab with a main agent for work no session owns. You don't need to talk to it.
|
|
32
32
|
- **A live dashboard** in the tower: who joined, and what they and their subagents are doing.
|
|
33
|
-
- **A browser view** of the whole net, `/boss gui`: every workspace as a base with its tower, agents, and subagents, animated and read-only. Click a base to zoom in, click a unit to read its chat as a live comms log; units that wait on you queue up as alerts. A header switch raises a system notification, and another plays a sound, when a unit waits on you, fails, or finishes; finished units wait in a list of their own, cleared one by one or all at once. A unit's comms show its background monitors, and one that fails or goes quiet raises an alert. On a desktop a unit's terminal takes your keyboard once you click into it. It reads in English or Traditional Chinese, following your browser, with a language menu in the header. + New base, the last card on the map, opens a base in a folder you pick with one member and no tower. A base without a tower takes more members (+ Member on the base adds one in a new tab, on a squad beside that squad), and its tower opens by the rules above; a base with a tower takes new mains (+ Main), each in a tab of its own. In a session's composer, a file pasted, dropped, or picked with + (20 MB at most) is stored in a private temp folder and its path goes into the message. × closes a base, a squad, or (in its view) a unit after a confirmation: each agent quits pi as `/quit` would, then its pane, tab, or workspace closes; nothing closes if one of them refuses. Each opening form takes an optional first message, and the folder picker stays inside your home folder and skips hidden folders.
|
|
33
|
+
- **A browser view** of the whole net, `/boss gui`: every workspace as a base with its tower, agents, and subagents, animated and read-only. Click a base to zoom in, click a unit to read its chat as a live comms log; units that wait on you queue up as alerts, and Space opens the next one, F enlarges the top dialog, and Escape closes it (none of them while you type); a question is answered from the keyboard too: arrows choose, Tab moves between questions, and Enter confirms and goes on. A header switch raises a system notification, and another plays a sound, when a unit waits on you, fails, or finishes; finished units wait in a list of their own, cleared one by one or all at once. A unit's comms show its background monitors, and one that fails or goes quiet raises an alert. On a desktop a unit's terminal takes your keyboard once you click into it. It reads in English or Traditional Chinese, following your browser, with a language menu in the header. + New base, the last card on the map, opens a base in a folder you pick with one member and no tower. A base without a tower takes more members (+ Member on the base adds one in a new tab, on a squad beside that squad), and its tower opens by the rules above; a base with a tower takes new mains (+ Main), each in a tab of its own. In a session's composer, a file pasted, dropped, or picked with + (20 MB at most) is stored in a private temp folder and its path goes into the message. × closes a base, a squad, or (in its view) a unit after a confirmation: each agent quits pi as `/quit` would, then its pane, tab, or workspace closes; nothing closes if one of them refuses. Each opening form takes an optional first message, and the folder picker stays inside your home folder and skips hidden folders.
|
|
34
34
|
- **Broadcast** to a tab, a workspace, every tower, or every session.
|
|
35
35
|
- **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.
|
|
36
36
|
- **Stranded subagents are asked to report.** A subagent that stays open after finishing, while the pi that launched it was restarted and no longer receives its result, is asked once over intercom to send its final report there ([how it works](docs/how-it-works.md#orphaned-subagents)).
|
|
@@ -57,10 +57,11 @@ Each of these is optional. When it is installed, Straw Boss picks it up; without
|
|
|
57
57
|
| [pi-herdr-agents](https://github.com/giuseppecrj/pi-herdr-agents) | Subagents show under the session that launched them, in the tower dashboard, the sidebar, and the GUI; a member that dispatches one is promoted to main and its tower opens. |
|
|
58
58
|
| [@juicesharp/rpiv-ask-user-question](https://www.npmjs.com/package/@juicesharp/rpiv-ask-user-question) 2.13 or newer | `ask_user_question` questionnaires can be answered from the GUI, and a waiting one marks its unit as waiting. |
|
|
59
59
|
| [pi-robot-hand](https://www.npmjs.com/package/pi-robot-hand) 0.3.0 or newer | `robot_hand` selectors can be answered from the GUI. |
|
|
60
|
+
| pi-code (hooks extension, with its dialog events) | Its hook confirmation ("Allow bash?": Allow or Deny, before any gated tool call) can be answered from the GUI. |
|
|
60
61
|
| [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 or newer | Documents a session shows open beside its comms: HTML in a sandboxed frame whose form answers the agent, text read-only. |
|
|
61
62
|
| [@juicesharp/rpiv-todo](https://www.npmjs.com/package/@juicesharp/rpiv-todo) 2.13 or newer | A session's todo list shows above its composer in the GUI, read from the session file. |
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
Any extension's `select` and `confirm` (an `mp-infra` command review, say) can be answered from the GUI too, with no change to that extension: Straw Boss wraps them on pi's shared `ctx.ui`, opens pi's own dialog as always, and relays the same dialog; the first answer wins. A `select` can be answered from a paired device; a `confirm` only on this computer's page. `input`, `editor`, and `custom` are never touched, and they, with `ask_user` from pi-ask-user, show read-only in the GUI, with the terminal one tap away.
|
|
64
65
|
|
|
65
66
|
## Quick start
|
|
66
67
|
|
|
@@ -84,8 +85,8 @@ The tower only routes and coordinates, so it can run a lighter model: set `tower
|
|
|
84
85
|
| `/boss` | Take over as this tab's main agent. |
|
|
85
86
|
| `/boss status`, `/boss tower` | Show the status; open and focus the tower. |
|
|
86
87
|
| `/boss close` | Quit this session and close its pane. |
|
|
87
|
-
| `/boss gui`, `/boss gui stop` | Open the net in the browser (any session, joins nothing); stop its server, from any session. The machine runs one server on one URL: it comes back after its session's `/reload`, and a session on a newer pi-straw-boss takes it over, so open pages reload into the new version. 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
|
|
88
|
-
| `/boss gui remote`, `/boss gui remote off` | Reach the GUI from your phone over your tailnet (`tailscale serve`, never Funnel): pair by QR code; off removes only its own serve entry. |
|
|
88
|
+
| `/boss gui`, `/boss gui stop` | Open the net in the browser (any session, joins nothing); stop its server, from any session. The machine runs one server on one URL: it comes back after its session's `/reload`, and a session on a newer pi-straw-boss takes it over, so open pages reload into the new version. 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`, a `confirm` on this computer's page only; 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. |
|
|
89
|
+
| `/boss gui remote`, `/boss gui remote off` | Reach the GUI from your phone over your tailnet (`tailscale serve`, never Funnel): pair by QR code; off removes only its own serve entry. The serve entry points at a second loopback listener of the GUI server, so a request is remote because of the listener it arrived on, whatever headers it carries. |
|
|
89
90
|
|
|
90
91
|
Subagents and sessions in Herdr worktree workspaces never join: the session that launched them speaks for them. Outside Herdr the extension does nothing.
|
|
91
92
|
|
package/README.zh-TW.md
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
- **每個分頁一個主智慧體,靠升任產生。** 工作變多的智慧體呼叫 `boss_promote`,或在第一次派出子智慧體(subagent)時自動升任。一個分頁只有一個主智慧體,除了你用 `/boss` 接手以外,沒有人能取代它。
|
|
31
31
|
- **每個工作區一座塔台。** 工作區出現第一個主智慧體時,塔台就在自己的分頁開起來,固定排在最前面。它負責協調各個主智慧體和其他塔台;沒有 session 負責的工作,它會開一個分頁、啟動新的主智慧體來處理。你不用跟它說話。
|
|
32
32
|
- **即時儀表板**在塔台裡:誰加入了,他們和他們的子智慧體正在做什麼。
|
|
33
|
-
- **瀏覽器畫面** `/boss gui`
|
|
33
|
+
- **瀏覽器畫面** `/boss gui` 看得到整張網:每個工作區是一座基地,裡面有塔台、智慧體和子智慧體,畫面會動,但只能看。點基地可以放大,點單位可以把它的對話當成即時通訊紀錄來讀;在等你回覆的單位會排成警示,按空白鍵開下一則,按 F 放大最上面的對話框,按 Esc 關掉它(打字時都不會觸發);回答問題也可以只用鍵盤:方向鍵選項目,Tab 換題,Enter 確認並跳到下一題。頂端有兩個開關:單位在等你、出錯或完成時,一個會跳系統通知,一個會播音效;已完成的單位另外排在自己的清單裡,可以一個一個清,也可以一次全清。單位的通訊畫面也會列出它在背景跑的 Monitor,出錯或太久沒輸出的 Monitor 會跳警示。在桌面上點進單位的終端機,就能直接用鍵盤操作它。畫面有英文和正體中文,預設跟隨瀏覽器語言,也可以從頂端的語言選單切換。地圖最後一張「+新基地」會在選定的資料夾開一座基地,裡面先有一位成員、沒有塔台。沒有塔台的基地只能加成員(基地上的「+成員」開在新分頁,小隊上的開在該小隊旁),等成員自己升格時才會開塔台;有塔台的基地只能加主智慧體(「+主智慧體」,各開在自己的分頁)。在 session 的輸入框貼上、拖進或用「+」選的檔案(最多 20 MB)會存到私有的暫存資料夾,路徑放進訊息。開啟表單都可以先填第一句指令;資料夾選擇只能在家目錄以下,也不會列出點開頭的資料夾。
|
|
34
34
|
- **廣播**給一個分頁、一個工作區、所有塔台,或所有 session。
|
|
35
35
|
- **分頁保持整齊。** pi 在分頁裡啟動或結束時,分頁裡的 pane 會重新平均分配,一個一個切出來的 worker 就不會留下一長串對半切的窄 pane。
|
|
36
36
|
- **斷線的子智慧體會被提醒回報。** 子智慧體做完後還開著,但開出它的 pi 已經重開、收不到它的結果時,它會收到一則 intercom,請它把最終報告送回去,只會送一次([運作方式](docs/how-it-works.md#orphaned-subagents))。
|
|
@@ -57,10 +57,11 @@ pi install npm:pi-straw-boss
|
|
|
57
57
|
| [pi-herdr-agents](https://github.com/giuseppecrj/pi-herdr-agents) | 子智慧體會顯示在開出它的 session 底下,塔台面板、側邊欄和 GUI 都看得到;成員派出子智慧體時,會升格成主智慧體,塔台也會跟著開。 |
|
|
58
58
|
| [@juicesharp/rpiv-ask-user-question](https://www.npmjs.com/package/@juicesharp/rpiv-ask-user-question) 2.13 以上 | `ask_user_question` 問卷可以在 GUI 作答,等待作答的問卷也會讓該單位顯示為等待中。 |
|
|
59
59
|
| [pi-robot-hand](https://www.npmjs.com/package/pi-robot-hand) 0.3.0 以上 | `robot_hand` 選單可以在 GUI 作答。 |
|
|
60
|
+
| pi-code(hooks 擴充,需含它的對話框事件) | 它的 hook 確認(「Allow bash?」:允許或拒絕,在任何被攔下的工具呼叫之前)可以在 GUI 作答。 |
|
|
60
61
|
| [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 以上 | session 展示的文件會開在它的通訊畫面旁邊:HTML 放在沙箱框架裡,表單送出的內容會回給 agent;文字檔只能讀。 |
|
|
61
62
|
| [@juicesharp/rpiv-todo](https://www.npmjs.com/package/@juicesharp/rpiv-todo) 2.13 以上 | session 的待辦清單會顯示在 GUI 的輸入框上方,內容從 session 檔讀取。 |
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
任何 extension 的 `select` 和 `confirm`(例如 `mp-infra` 的指令審查)也可以在 GUI 作答,不必改動那個 extension:Straw Boss 把它們包在 pi 共用的 `ctx.ui` 上,照常打開 pi 自己的對話框,同時轉送同一個對話框,先答的算數。`select` 可以從配對的裝置作答;`confirm` 只能在這台電腦的頁面作答。`input`、`editor`、`custom` 完全不碰,它們和 pi-ask-user 的 `ask_user` 在 GUI 裡只能看,可以一鍵切到終端機回答。
|
|
64
65
|
|
|
65
66
|
## 快速開始
|
|
66
67
|
|
|
@@ -83,8 +84,8 @@ pi install npm:pi-straw-boss
|
|
|
83
84
|
| `boss_rename` | 用一個短語替這個 session 命名,說明它現在在做什麼;net、GUI,以及裝了 pi-auto-tab-name 時的分頁名稱都會跟著顯示。主智慧體換工作時會呼叫它。 |
|
|
84
85
|
| `/boss` | 接手成為這個分頁的主智慧體。 |
|
|
85
86
|
| `/boss status`、`/boss tower` | 顯示狀態;開啟塔台並切換過去。 |
|
|
86
|
-
| `/boss gui`、`/boss gui stop` | 在瀏覽器開啟網(任何 session 都能開,不會加入任何東西);停止它的伺服器,在哪個 session 都可以。整台機器只跑一個伺服器、一個網址:開它的 session `/reload` 之後,會在原網址重開;版本較新的 session 會接手,開著的頁面也會自動換成新版。可以在通訊畫面直接打字給某個 session,或用終端機畫面下方的按鍵面板操作它的終端機,在桌面上也可以點進終端機直接打字;在等回覆的 `robot_hand`
|
|
87
|
-
| `/boss gui remote`、`/boss gui remote off` | 透過你的 tailnet 用手機連 GUI(`tailscale serve`,絕不用 Funnel):掃 QR code 配對;關閉時只移除它自己的 serve 設定。 |
|
|
87
|
+
| `/boss gui`、`/boss gui stop` | 在瀏覽器開啟網(任何 session 都能開,不會加入任何東西);停止它的伺服器,在哪個 session 都可以。整台機器只跑一個伺服器、一個網址:開它的 session `/reload` 之後,會在原網址重開;版本較新的 session 會接手,開著的頁面也會自動換成新版。可以在通訊畫面直接打字給某個 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 放在沙箱框架裡,表單送出的答案會傳給智慧體;純文字只能讀。 |
|
|
88
|
+
| `/boss gui remote`、`/boss gui remote off` | 透過你的 tailnet 用手機連 GUI(`tailscale serve`,絕不用 Funnel):掃 QR code 配對;關閉時只移除它自己的 serve 設定。serve 指向 GUI 伺服器的第二個 loopback 監聽埠,請求算不算遠端取決於它進來的監聽埠,不看它帶什麼標頭。 |
|
|
88
89
|
|
|
89
90
|
子智慧體,以及在 Herdr worktree 工作區裡的 session,都不會加入網,由開出它們的 session 代表它們。不在 Herdr 裡時,這個擴充套件什麼都不做。
|
|
90
91
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{C as e,F as t,_ as n}from"./index-BxSaqaet.js";var r=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案正在送出;請查看終端機。`:`Another answer is on its way; check the terminal.`),i=((e={},n={})=>(n.locale??t())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),a=((e={},n={})=>(n.locale??t())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),o=((e={},n={})=>(n.locale??t())===`zh-TW`?`已回答。`:`Answered.`),s=((e={},n={})=>(n.locale??t())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),c=((e={},n={})=>(n.locale??t())===`zh-TW`?`可以複選。`:`It takes several choices.`),l=((e={},n={})=>(n.locale??t())===`zh-TW`?`再次確認`:`Check again`),u=((e={},n={})=>(n.locale??t())===`zh-TW`?`選擇`:`Choices`),d=((e={},n={})=>(n.locale??t())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),f=((e={},n={})=>(n.locale??t())===`zh-TW`?`確認對話框只能在終端機,或在執行 GUI 的那台電腦的頁面上回答,已配對的裝置不能回答。這個頁面只能查看。`:`A confirmation can be answered only in the terminal or on the page of the computer the GUI runs on, not from a paired device. This page shows it read-only.`),p=((e={},n={})=>(n.locale??t())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),m=((e={},n={})=>(n.locale??t())===`zh-TW`?`複製指令`:`Copy command`);function h(e,t,n,r){if(typeof t!=`string`||n!==void 0&&!r)return new e(t,n);let i=h;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 g(e,t,n,r=!1){return h(Intl.PluralRules,e,n,r).select(Number(t)-Number(n?.offset??0))}var _=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),v=((e={},n={})=>(n.locale??t())===`zh-TW`?`未確認。請查看終端機。`:`Not confirmed. Check the terminal.`),y=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註`:`Note`),b=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註(選填)`:`Note (optional)`),x=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,S=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,C=((e,n={})=>(n.locale??t())===`zh-TW`?S(e):x(e)),w=((e={},n={})=>(n.locale??t())===`zh-TW`?`選項`:`Options`),T=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),E=((e={},n={})=>(n.locale??t())===`zh-TW`?`你的答案`:`Your own answer`),D=((e={},n={})=>(n.locale??t())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),O=((e={},n={})=>(n.locale??t())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),k=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),A=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),j=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),M=((e={},n={})=>(n.locale??t())===`zh-TW`?`安全考量,遠端不支援輸入機密。請到執行 GUI 的那台電腦的終端機中回答。`:`For security, entering a secret is not supported remotely. Answer it in the terminal on the computer the GUI runs on.`),N=((e={},n={})=>(n.locale??t())===`zh-TW`?`機密內容只能在終端機輸入,這裡不接受。請到執行 GUI 的那台電腦的終端機中回答。`:`A secret is entered in the terminal only, not here. Answer it in the terminal on the computer the GUI runs on.`),P=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出答案`:`Send answer`),F=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出中…`:`Sending…`),ee=((e={},n={})=>(n.locale??t())===`zh-TW`?`顯示終端機`:`Show terminal`),I=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),L=((e={},n={})=>(n.locale??t())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),R=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),z=((e={},n={})=>(n.locale??t())===`zh-TW`?`連不上伺服器。`:`The server could not be reached.`),B=((e={},n={})=>(n.locale??t())===`zh-TW`?`它在等待對話框。`:`It waits on a dialog.`),V={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1};function H(e,t,n,r,i){let{q:a}=n,o=r[a],s=V[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 U(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=H(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 W=e=>e.multiple?c():e.freeform&&e.options.length?s():``,G=(e,t)=>n(`div`,{class:`ask-one`},e.header&&n(`b`,{class:`ask-head`},e.header),n(`p`,{class:`ask-q`},e.question),e.context&&n(`div`,{class:`ask-ctx`},e.context),e.options.length>0&&n(`ol`,{class:`ask-opts`,"aria-label":w()},...e.options.map(e=>n(`li`,{class:`ask-opt`},n(`b`,null,e.title),e.description&&n(`small`,null,e.description)))),t&&W(e)&&n(`small`,{class:`ask-how`},W(e))),K=e=>e.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f\p{Cf}]/gu,`�`),q=(e,t)=>(e.select?.choices??[]).map((e,t)=>({...e,i:t})).filter(e=>!(t&&e.localOnly)),J=(e,t,n)=>({...e.size?{choices:[...e].sort((e,t)=>e-t)}:{},...t.trim()?{text:t}:{},...n.trim()?{note:n}:{}}),Y=(e,t)=>!!(t&&e?.select?.confirm),X=(e,t,n)=>({dialog:e.dialog,digest:e.digest,answerId:n,...t}),Z={digest:O,"not-allowed":A,malformed:k};function Q(t){let{outcome:n,reason:i,by:a}=t.body;return n===`accepted`?[`ok`,o()]:n===`stale`?[`error`,a===`local`?R():a===`cancel`?I():L()]:n===`rejected`?[`error`,(Object.hasOwn(Z,String(i))?Z[String(i)]:j)()]:n===`busy`?[`error`,r()]:n===`unknown`||t.status===504?[`error`,v(),!0]:[`error`,i??e({status:t.status})]}var te=e=>[`accepted`,`stale`,`busy`,`unknown`].includes(String(e.body.outcome))||e.status===504,$=e=>e.answer?`d\n${e.answer.dialog}\n${e.answer.digest}`:`c\n${e.callId}\n${e.why??``}`;function ne(e,t,r=location.hostname!==`127.0.0.1`,o){let s,c,h,g=!1,x=!1,S;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>c&&!c.el.contains(e.target)&&(c.lost=void 0));let O=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),k=()=>{if(!c)return;let e=document.activeElement;e&&e!==document.body&&e!==c.lost&&(c.lost=void 0),c.controls.forEach(e=>e.disabled=!g||x||c.done),c.send&&(c.send.disabled=!g||x||c.done||!c.pick()),e&&c.el.contains(e)&&e.disabled&&(c.lost=e);let t=c.lost;t&&!t.disabled&&c.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),c.lost=void 0)};async function A(e,r){[e.sending,x,e.spell]=[!0,!0,!1],k(),O(e.note,``,F());let i=await t(`answer`,r).catch(()=>void 0),a=n(`button`,{type:`button`,class:`cmp-link`},l());a.onclick=()=>void A(e,r);let[o,s,c]=i?Q(i):[`error`,v(),!0];[e.done,e.sending,x,e.busy]=[!i||te(i),!1,!1,i?.body.outcome===`busy`],O(e.note,o,s,...c?[a]:[]),k(),e.note.scrollIntoView?.({block:`nearest`})}let j=(e,t,r,i,a)=>{let o=n(`button`,{type:`button`,class:`ask-opt`,role:e,"aria-checked":`false`},n(`b`,a?{"data-n":String(a)}:null,t),...r.filter(Boolean).map(e=>n(`small`,null,e)));return o.onclick=i,o};function I(e,t){let i,a=q(t,r).map(e=>j(`radio`,K(e.label),[e.note&&K(e.note)],()=>(i=e.i,a.forEach((n,i)=>n.setAttribute(`aria-checked`,String(q(t,r)[i].i===e.i))),k()),e.i+1)),o=t.select?.copy!==void 0&&n(`button`,{type:`button`,class:`cmp-link`},m());return o&&(o.disabled=!navigator.clipboard,o.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>O(e.note,`ok`,p()),()=>O(e.note,`error`,d()))),e.pick=()=>i===void 0?void 0:{choice:i},e.first=U(e.el,[{opts:a,multiple:!1,answered:()=>i!==void 0}],()=>e.send),e.controls=a,[n(`pre`,{class:`ask-title`},K(t.select.title)),n(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":u()},...a),n(`div`,{class:`ask-acts`},e.send,o)]}function L(e,t){let r=t.questions.map(()=>({picks:new Set,text:n(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:D(),"aria-label":E()}),note:n(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:b(),"aria-label":y()})})),i=[],a=t.questions.map((t,a)=>{let o=r[a],s=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>j(s,e.title,[e.description,e.preview&&_()],()=>{t.multiple||(o.picks.clear(),o.text.value=``),o.picks.has(n)?o.picks.delete(n):o.picks.add(n),c.forEach((e,t)=>e.setAttribute(`aria-checked`,String(o.picks.has(t)))),k()}));return o.text.oninput=()=>(t.multiple||(o.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),k()),e.controls.push(...c,o.text,o.note),i.push({opts:c,multiple:!!t.multiple,own:o.text,note:o.note,answered:()=>o.picks.size>0||o.text.value.trim()!==``}),n(`div`,{class:`ask-one`},t.header&&n(`b`,{class:`ask-head`},t.header),n(`p`,{class:`ask-q`},t.question),n(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":w()},...c),o.text,o.note)});return e.pick=()=>r.every(e=>e.picks.size||e.text.value.trim())?{answers:r.map(e=>J(e.picks,e.text.value,e.note.value))}:void 0,e.first=U(e.el,i,()=>e.send),[...a,n(`div`,{class:`ask-acts`},e.send)]}function R(e){let t=e.asks??(e.ask?[e.ask]:[]),s=t.length>1,c=Y(e.answer,r)?void 0:e.answer,l={key:$(e),el:n(`section`,{class:`ask`}),note:n(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};c&&((l.send=n(`button`,{type:`button`,class:`ask-send`},P())).onclick=()=>void(l.pick()&&A(l,X(c,l.pick(),crypto.randomUUID()))));let u=e.tool===`secret_drop`,d=n(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${s?a():i()} ${s||!t[0]?``:W(t[0])}`.trim()),p=o&&e.tool!==`secret_drop`&&n(`button`,{type:`button`,class:`cmp-link`},ee());p&&(p.onclick=o);let m=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[n(`p`,{class:`ask-why`},C({tool:e.tool}))]:[];return l.el.append(...m,...c&&!u?c.select?I(l,c):L(l,c):[...t.length?t.map(e=>G(e,s)):e.answer?.select?[n(`pre`,{class:`ask-title`},K(e.answer.select.title)),n(`p`,{class:`ask-why`},f())]:[n(`p`,{class:`ask-why`},u?r?M():N():e.why??B())],n(`div`,{class:`ask-acts`},u?n(`p`,{class:`ask-term`},i()):d,p)],l.note),l}let z=(t,n)=>{let r=document.activeElement;c&&c!==n&&(c.focus=c.el.contains(r)?r:void 0),[s,c,h]=[t,n,n?.send?n:h],e.replaceChildren(...n?[n.el]:[]),k(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=c&&!c.done?c.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},update(e,t){g=t,e&&(S=void clearTimeout(S)),!e&&(c?.done||c?.sending)?S??=setTimeout(()=>(S=void 0,z()),6e3):e?c&&($(e)===c.key||!e.answer&&(c.done||c.sending)&&e.callId===s?.callId)?((c.busy||c.sending)&&!e.answer?c.spell=!0:c.busy&&c.spell&&e.answer&&([c.done,c.busy]=[!1,!1],O(c.note,``,T())),s=e):z(e,h?.key===$(e)&&!h.done?h:R(e)):z(),k()}}}export{g as a,F as i,Y as n,z as r,ne as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-
|
|
2
|
-
import{F as e,_ as t,g as n,t as r,u as i,v as a}from"./index-gWx1_-3G.js";import{n as o,t as s}from"./views-JgP8ffyr.js";var c=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),u=e=>`context compacted · ${e?.tokens} tokens summarized`,d=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,f=((t,n={})=>(n.locale??e())===`zh-TW`?d(t):u(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,te=((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)),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),y=e=>`${e?.count} image(s)`,b=e=>`${e?.count} 張圖片`,ne=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),re=((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.`),ie=((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`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),N=e=>`Open image ${e?.n}`,P=e=>`打開圖片 ${e?.n}`,oe=((t,n={})=>(n.locale??e())===`zh-TW`?P(t):N(t)),F=e=>`show all (${e?.size})`,I=e=>`顯示全部(${e?.size})`,L=((t,n={})=>(n.locale??e())===`zh-TW`?I(t):F(t)),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),z=e=>`◇ thought · ${e?.count} chars`,B=e=>`◇ 思考 · ${e?.count} 字元`,se=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function ue(){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 de(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 fe(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 pe=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,me=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,he={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-${r[e]??e}`),t};function ge(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,r,{who:i,link:u,docFor:d}){let p=fe(),m=new Map,h=new Set,g=()=>h.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>d?.(e))):e.shown&&h.delete(e)),y=t(`div`,{class:`chat-list`}),b=t(`div`,{class:`chat-top`}),x=t(`div`,{class:`chat-live`}),S=t(`div`,{class:`chat-end`}),C=t(`button`,{class:`chat-pill`,type:`button`,hidden:``}),w=t(`p`,{class:`chat-empty`},T()),E=t(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":l()},b,y,x,S);e.replaceChildren(E,C);let D=ue(),O=!1,k=!1,A,j,M=0,N=!1,P,F=()=>N||P!==void 0,I=()=>(clearTimeout(P),P=setTimeout(()=>(P=void 0,D.pinned&&!p.detached&&B()),250)),z=(e=D.button(p.detached))=>(C.hidden=!e,C.textContent=e??``),B=()=>(D.jump(),j=void 0,E.scrollTop=E.scrollHeight,z());async function U(e){O=!0;let t=await de(p,r,e,e=>(J(e),Y(e))).finally(()=>O=!1),n=m.get(e);if(A===e){if(!t||!n)return B();D.hold(),j=n,n.scrollIntoView({block:`center`}),a(n,`lit`),clearTimeout(M),M=window.setTimeout(()=>(j=void 0,n.classList.remove(`lit`)),2e3),z()}}let W=()=>A?void U(A):B(),G=(e,t,n,i)=>{e.disabled=!0,r.entry(n).then(n=>{let r=n&&i(n);if(r===void 0)return void(e.textContent=V());t.textContent=r,e.remove()},()=>e.textContent=V())};function K(e,i=0){if(!i||!r.pic)return null;let a=Array.from({length:i},(t,n)=>r.pic(e,n));return t(`div`,{class:`pics`},...a.map((e,r)=>{let i=t(`img`,{src:e,alt:_({n:r+1}),loading:`lazy`,decoding:`async`}),o=t(`button`,{type:`button`,class:`pic`,"aria-label":oe({n:r+1})},i);return i.addEventListener(`error`,()=>o.replaceWith(t(`em`,{class:`pic-gone`},v()))),o.addEventListener(`click`,()=>void n(async()=>{let{lightbox:e}=await import(`./lightbox-BfLxcOSU.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,r))),o}))}function _e(e,n){let r=p.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`},R()):null;o?.addEventListener(`click`,()=>G(o,a,n,t=>(e=>e&&`${e.args??``}${e.cut?`\n${ee()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=r?.more?t(`button`,{class:`more`,type:`button`},L({size:me(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:``},ae()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>d?.(e)?.()))),c&&h.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(g);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,ne({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,pe(e.at));switch(e.kind){case`user`:return t(`article`,{class:`tx you`},t(`header`,null,n,t(`b`,null,le()),H(`user`)),t(`div`,{class:`bubble`},...ge(e.text??``),K(e.id,e.images)));case`assistant`:{let r=i(),a=t(`pre`,{class:`thought-text`}),c=e.thought?t(`button`,{class:`thought`,type:`button`},e.thought<0?ce():se({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>G(c,a,e.id,e=>e.thoughtText)),t(`article`,{class:`tx in`},H(r.role),t(`div`,{class:`tx-body`},t(`header`,null,t(`b`,null,r.name),e.model?t(`span`,null,e.model):null,n,e.stop?t(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,a,e.text?t(`div`,{class:`md`},s(o(e.text))):null,e.error?t(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>_e(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`},te({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,re()),he[e.type??``]?.()??e.type??ie(),` `,e.from&&u(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`?f({tokens:(e.tokens??0).toLocaleString()}):c()),t(`pre`,null,e.text??``)));default:return t(`article`,{class:`tx note`},e.text??``,` `,n)}}function J(e){e.rebuild&&(m.clear(),y.replaceChildren());for(let t of e.dropped)m.get(t)?.remove(),m.delete(t);let t=e.added.map(e=>(m.set(e.id,q(e)),m.get(e.id)));e.front?y.prepend(...t):y.append(...t),k&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),w.remove(),p.items.length||y.append(w),b.hidden=!p.before}let Y=e=>e.touched.forEach(e=>{let t=m.get(e),n=p.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),m.set(e,r)}}),X=async()=>{if(!O&&p.before&&k){O=!0;try{let e=E.scrollHeight,t=p.prepend(await r.older(p.before));J(t),Y(t),E.scrollTop+=E.scrollHeight-e}finally{O=!1}p.before&&E.clientHeight&&b.getBoundingClientRect().bottom>=E.getBoundingClientRect().top&&X()}};C.addEventListener(`click`,()=>{A=void 0,p.detached?r.latest().then(e=>(J(p.reset(e)),B())):B()});let Z=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void X(),{root:E}),new IntersectionObserver(e=>E.clientHeight&&(D.scrolled(e.at(-1).isIntersecting),z()),{root:E,rootMargin:`0px 0px 67px`})],Q,ve=()=>(Q??(Z[0].observe(b),Z[1].observe(S)),clearTimeout(Q),Q=setTimeout(()=>(Q=void 0,Z.forEach(e=>e.disconnect())),600));E.addEventListener(`scroll`,()=>(ve(),!N&&P!==void 0&&I()),{passive:!0}),E.addEventListener(`touchstart`,()=>(N=!0,clearTimeout(P),P=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])E.addEventListener(e,()=>(N=!1,I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])E.addEventListener(e,()=>j=A=void 0,{passive:!0});let $=new ResizeObserver(()=>F()?void 0:D.pinned&&!p.detached?E.scrollTop=E.scrollHeight:j?.scrollIntoView({block:`center`}));return $.observe(y),$.observe(E),{log:E,docs:g,apply(e){if(e.reset)J(p.reset({items:e.items??[],before:e.before})),k=!0,W();else if(e.items?.length){let t=p.append(e.items);J(t),Y(t),D.arrived(t.added.length)&&!p.detached&&!F()?B():z()}},reveal(e){A=e,k&&W()},setLive(e,n){x.dataset.mark=n,x.lastChild?.textContent!==e&&x.replaceChildren(...e?[t(`b`,{class:`badge`}),t(`span`,null,e)]:[])}}}export{U as mountChat,_ as t};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-Cc-om6fn.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{F as e,_ as t,g as n,t as r,u as i,v as a}from"./index-BxSaqaet.js";import{n as o,t as s}from"./views-CWyLbZlX.js";var c=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),u=e=>`context compacted · ${e?.tokens} tokens summarized`,d=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,f=((t,n={})=>(n.locale??e())===`zh-TW`?d(t):u(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,te=((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)),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),y=e=>`${e?.count} image(s)`,b=e=>`${e?.count} 張圖片`,ne=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),re=((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.`),ie=((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`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),N=e=>`Open image ${e?.n}`,P=e=>`打開圖片 ${e?.n}`,oe=((t,n={})=>(n.locale??e())===`zh-TW`?P(t):N(t)),F=e=>`show all (${e?.size})`,I=e=>`顯示全部(${e?.size})`,L=((t,n={})=>(n.locale??e())===`zh-TW`?I(t):F(t)),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),z=e=>`◇ thought · ${e?.count} chars`,B=e=>`◇ 思考 · ${e?.count} 字元`,se=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function ue(){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 de(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 fe(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 pe=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,me=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,he={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-${r[e]??e}`),t};function ge(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,r,{who:i,link:u,docFor:d}){let p=fe(),m=new Map,h=new Set,g=()=>h.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>d?.(e))):e.shown&&h.delete(e)),y=t(`div`,{class:`chat-list`}),b=t(`div`,{class:`chat-top`}),x=t(`div`,{class:`chat-live`}),S=t(`div`,{class:`chat-end`}),C=t(`button`,{class:`chat-pill`,type:`button`,hidden:``}),w=t(`p`,{class:`chat-empty`},T()),E=t(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":l()},b,y,x,S);e.replaceChildren(E,C);let D=ue(),O=!1,k=!1,A,j,M=0,N=!1,P,F=()=>N||P!==void 0,I=()=>(clearTimeout(P),P=setTimeout(()=>(P=void 0,D.pinned&&!p.detached&&B()),250)),z=(e=D.button(p.detached))=>(C.hidden=!e,C.textContent=e??``),B=()=>(D.jump(),j=void 0,E.scrollTop=E.scrollHeight,z());async function U(e){O=!0;let t=await de(p,r,e,e=>(J(e),Y(e))).finally(()=>O=!1),n=m.get(e);if(A===e){if(!t||!n)return B();D.hold(),j=n,n.scrollIntoView({block:`center`}),a(n,`lit`),clearTimeout(M),M=window.setTimeout(()=>(j=void 0,n.classList.remove(`lit`)),2e3),z()}}let W=()=>A?void U(A):B(),G=(e,t,n,i)=>{e.disabled=!0,r.entry(n).then(n=>{let r=n&&i(n);if(r===void 0)return void(e.textContent=V());t.textContent=r,e.remove()},()=>e.textContent=V())};function K(e,i=0){if(!i||!r.pic)return null;let a=Array.from({length:i},(t,n)=>r.pic(e,n));return t(`div`,{class:`pics`},...a.map((e,r)=>{let i=t(`img`,{src:e,alt:_({n:r+1}),loading:`lazy`,decoding:`async`}),o=t(`button`,{type:`button`,class:`pic`,"aria-label":oe({n:r+1})},i);return i.addEventListener(`error`,()=>o.replaceWith(t(`em`,{class:`pic-gone`},v()))),o.addEventListener(`click`,()=>void n(async()=>{let{lightbox:e}=await import(`./lightbox-Bt9x-ElA.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,r))),o}))}function _e(e,n){let r=p.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`},R()):null;o?.addEventListener(`click`,()=>G(o,a,n,t=>(e=>e&&`${e.args??``}${e.cut?`\n${ee()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=r?.more?t(`button`,{class:`more`,type:`button`},L({size:me(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:``},ae()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>d?.(e)?.()))),c&&h.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(g);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,ne({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,pe(e.at));switch(e.kind){case`user`:return t(`article`,{class:`tx you`},t(`header`,null,n,t(`b`,null,le()),H(`user`)),t(`div`,{class:`bubble`},...ge(e.text??``),K(e.id,e.images)));case`assistant`:{let r=i(),a=t(`pre`,{class:`thought-text`}),c=e.thought?t(`button`,{class:`thought`,type:`button`},e.thought<0?ce():se({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>G(c,a,e.id,e=>e.thoughtText)),t(`article`,{class:`tx in`},H(r.role),t(`div`,{class:`tx-body`},t(`header`,null,t(`b`,null,r.name),e.model?t(`span`,null,e.model):null,n,e.stop?t(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,a,e.text?t(`div`,{class:`md`},s(o(e.text))):null,e.error?t(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>_e(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`},te({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,re()),he[e.type??``]?.()??e.type??ie(),` `,e.from&&u(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`?f({tokens:(e.tokens??0).toLocaleString()}):c()),t(`pre`,null,e.text??``)));default:return t(`article`,{class:`tx note`},e.text??``,` `,n)}}function J(e){e.rebuild&&(m.clear(),y.replaceChildren());for(let t of e.dropped)m.get(t)?.remove(),m.delete(t);let t=e.added.map(e=>(m.set(e.id,q(e)),m.get(e.id)));e.front?y.prepend(...t):y.append(...t),k&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),w.remove(),p.items.length||y.append(w),b.hidden=!p.before}let Y=e=>e.touched.forEach(e=>{let t=m.get(e),n=p.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),m.set(e,r)}}),X=async()=>{if(!O&&p.before&&k){O=!0;try{let e=E.scrollHeight,t=p.prepend(await r.older(p.before));J(t),Y(t),E.scrollTop+=E.scrollHeight-e}finally{O=!1}p.before&&E.clientHeight&&b.getBoundingClientRect().bottom>=E.getBoundingClientRect().top&&X()}};C.addEventListener(`click`,()=>{A=void 0,p.detached?r.latest().then(e=>(J(p.reset(e)),B())):B()});let Z=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void X(),{root:E}),new IntersectionObserver(e=>E.clientHeight&&(D.scrolled(e.at(-1).isIntersecting),z()),{root:E,rootMargin:`0px 0px 67px`})],Q,ve=()=>(Q??(Z[0].observe(b),Z[1].observe(S)),clearTimeout(Q),Q=setTimeout(()=>(Q=void 0,Z.forEach(e=>e.disconnect())),600));E.addEventListener(`scroll`,()=>(ve(),!N&&P!==void 0&&I()),{passive:!0}),E.addEventListener(`touchstart`,()=>(N=!0,clearTimeout(P),P=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])E.addEventListener(e,()=>(N=!1,I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])E.addEventListener(e,()=>j=A=void 0,{passive:!0});let $=new ResizeObserver(()=>F()?void 0:D.pinned&&!p.detached?E.scrollTop=E.scrollHeight:j?.scrollIntoView({block:`center`}));return $.observe(y),$.observe(E),{log:E,docs:g,apply(e){if(e.reset)J(p.reset({items:e.items??[],before:e.before})),k=!0,W();else if(e.items?.length){let t=p.append(e.items);J(t),Y(t),D.arrived(t.added.length)&&!p.detached&&!F()?B():z()}},reveal(e){A=e,k&&W()},setLive(e,n){x.dataset.mark=n,x.lastChild?.textContent!==e&&x.replaceChildren(...e?[t(`b`,{class:`badge`}),t(`span`,null,e)]:[])}}}export{U as mountChat,_ as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={},t=[`en`,`zh-TW`],n=`PARAGLIDE_LOCALE`,r=[`baseLocale`],i=[],a=typeof window>`u`;globalThis.__paraglide=globalThis.__paraglide??{},globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};var o=!1,s=()=>{let e=r;!a&&typeof window<`u`&&window.location?.href&&(e=ue(window.location.href));let t=c(e,typeof window<`u`?window.location?.href:void 0);if(t)return o||(o=!0,d(t,{reload:!1})),t;throw Error(`No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found`)};function c(e,t){let n;for(let t of e){if(t===`baseLocale`)n=`en`;else if(de(t)&&_.has(t)){let e=_.get(t);if(e){let t=e.getLocale();if(t instanceof Promise)continue;if(t!==void 0)return m(t)}}let e=p(n);if(e)return e}}var l=e=>{s=e},u=e=>{e?window.location.href=e:window.location.reload()},d=(e,t)=>{let n={reload:!0,...t},i;try{i=s()}catch{}let o=[],c=r;!a&&typeof window<`u`&&window.location?.href&&(c=ue(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(de(t)&&_.has(t)){let n=_.get(t);if(n){let r=n.setLocale(e);r instanceof Promise&&(r=r.catch(e=>{throw Error(`Custom strategy "${t}" setLocale failed.`,{cause:e})}),o.push(r))}}let l=()=>{!a&&n.reload&&window.location&&e!==i&&u(void 0)};if(o.length)return Promise.all(o).then(()=>{l()});l()},f=()=>typeof window<`u`?window.location.origin:`http://fallback.com`;function p(e){if(typeof e!=`string`)return;let n=e.toLowerCase();for(let e of t)if(e.toLowerCase()===n)return e}function m(e){let n=p(e);if(n)return n;throw Error(`Invalid locale: ${e}. Expected one of: ${t.join(`, `)}`)}function h(e){return e}function g(t,n){return new e(t,n.href)}function ee(){return 0}function te(e){return i}function ne(e,t){return e.exec(t.href)}var re=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${re}=([^;]*)`);function ie(e){return ae(e)}function ae(e){let t=h(typeof e==`string`?new URL(e,f()):new URL(e.href)),n=t.pathname.replace(/^\/+/,``).split(`/`);return n.length>0&&p(n[0])&&(t.pathname=`/`+n.slice(1).join(`/`)),h(t)}var oe=-1,se,ce;function le(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=ee();if(se===t&&oe===n)return ce;let r=h(new URL(t,`http://example.com`)),a=ie(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of te(e))if(ne(g(t.match,e),e)){s=t;break}if(s)break}return oe=n,se=t,ce=s,s}function ue(e){let t=le(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var _=new Map;function de(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}var fe=((e={},t={})=>(t.locale??s())===`zh-TW`?`警示`:`Alerts`),pe=((e={},t={})=>(t.locale??s())===`zh-TW`?`所有基地`:`all bases`),me=((e={},t={})=>(t.locale??s())===`zh-TW`?``:`.`),he=((e={},t={})=>(t.locale??s())===`zh-TW`?`最後更新:`:`Last update`),ge=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,_e=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,ve=((e,t={})=>(t.locale??s())===`zh-TW`?_e(e):ge(e)),ye=e=>`The server is up but cannot read the net: ${e?.problem}`,be=e=>`伺服器正常,但讀不到網:${e?.problem}`,xe=((e,t={})=>(t.locale??s())===`zh-TW`?be(e):ye(e)),Se=((e={},t={})=>(t.locale??s())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),Ce=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,we=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,Te=((e,t={})=>(t.locale??s())===`zh-TW`?we(e):Ce(e)),Ee=((e={},t={})=>(t.locale??s())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),De=((e={},t={})=>(t.locale??s())===`zh-TW`?`取消`:`Cancel`),Oe=((e={},t={})=>(t.locale??s())===`zh-TW`?`關閉`:`Close`),ke=e=>`Quit base ${e?.name}`,Ae=e=>`關掉基地 ${e?.name}`,je=((e,t={})=>(t.locale??s())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Quit base ${e?.name}? Every agent in it and its tower quit.`,Ne=e=>`要關掉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。`,Pe=((e,t={})=>(t.locale??s())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Quit squad ${e?.name}`,Ie=e=>`關掉小隊 ${e?.name}`,Le=((e,t={})=>(t.locale??s())===`zh-TW`?Ie(e):Fe(e)),Re=e=>`Quit squad ${e?.name}? Every agent in it quits.`,ze=e=>`要關掉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,Be=((e,t={})=>(t.locale??s())===`zh-TW`?ze(e):Re(e)),Ve=e=>`Quit the tower ${e?.name}? The base's mains become members again.`,He=e=>`要關掉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Ue=((e,t={})=>(t.locale??s())===`zh-TW`?He(e):Ve(e)),We=e=>`Quit ${e?.name}`,Ge=e=>`關掉 ${e?.name}`,Ke=((e,t={})=>(t.locale??s())===`zh-TW`?Ge(e):We(e)),qe=e=>`Quit ${e?.name}? It quits pi and its pane closes.`,Je=e=>`要關掉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Ye=((e,t={})=>(t.locale??s())===`zh-TW`?Je(e):qe(e)),Xe=e=>`control tower · ${e?.state}`,Ze=e=>`塔台 · ${e?.state}`,Qe=((e,t={})=>(t.locale??s())===`zh-TW`?Ze(e):Xe(e)),$e=((e={},t={})=>(t.locale??s())===`zh-TW`?`圖示來自 game-icons.net(Lorc、Delapouite),CC BY 3.0。`:`Icons from game-icons.net by Lorc and Delapouite, CC BY 3.0.`),et=((e={},t={})=>(t.locale??s())===`zh-TW`?`文件`:`Documents`),tt=((e={},t={})=>(t.locale??s())===`zh-TW`?`總塔台`:`head tower`),nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`語言`:`Language`),rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`連線中`:`connecting`),it=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時`:`live`),at=((e={},t={})=>(t.locale??s())===`zh-TW`?`離線`:`offline`),ot=((e={},t={})=>(t.locale??s())===`zh-TW`?`重新連線中`:`reconnecting`),st=((e={},t={})=>(t.locale??s())===`zh-TW`?`正體中文`:`English`),ct=((e={},t={})=>(t.locale??s())===`zh-TW`?`位置`:`Location`),lt=e=>`${e?.name} finished`,ut=e=>`${e?.name} 已完成`,dt=((e,t={})=>(t.locale??s())===`zh-TW`?ut(e):lt(e)),ft=e=>`${e?.name} hit an error`,pt=e=>`${e?.name} 發生錯誤`,mt=((e,t={})=>(t.locale??s())===`zh-TW`?pt(e):ft(e)),ht=e=>`${e?.name} went idle`,gt=e=>`${e?.name} 轉為閒置`,_t=((e,t={})=>(t.locale??s())===`zh-TW`?gt(e):ht(e)),vt=e=>`${e?.name} joined`,yt=e=>`${e?.name} 加入`,bt=((e,t={})=>(t.locale??s())===`zh-TW`?yt(e):vt(e)),xt=e=>`${e?.name} left`,St=e=>`${e?.name} 離開`,Ct=((e,t={})=>(t.locale??s())===`zh-TW`?St(e):xt(e)),wt=e=>`${e?.name} lost its status`,Tt=e=>`${e?.name} 失去狀態`,Et=((e,t={})=>(t.locale??s())===`zh-TW`?Tt(e):wt(e)),Dt=e=>`${e?.name} is waiting on a question`,Ot=e=>`${e?.name} 正在等待回答`,kt=((e,t={})=>(t.locale??s())===`zh-TW`?Ot(e):Dt(e)),At=e=>`${e?.name} started working`,jt=e=>`${e?.name} 開始工作`,Mt=((e,t={})=>(t.locale??s())===`zh-TW`?jt(e):At(e)),Nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`已完成`:`finished`),Pt=((e={},t={})=>(t.locale??s())===`zh-TW`?`錯誤`:`error`),Ft=((e={},t={})=>(t.locale??s())===`zh-TW`?`閒置`:`idle`),It=((e={},t={})=>(t.locale??s())===`zh-TW`?`無狀態`:`no status`),Lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待回答`:`waiting on a question`),Rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`working`),zt=e=>`Monitor failed: ${e?.what}`,Bt=e=>`Monitor 出錯:${e?.what}`,Vt=((e,t={})=>(t.locale??s())===`zh-TW`?Bt(e):zt(e)),Ht=e=>`Monitor went quiet and stopped: ${e?.what}`,Ut=e=>`Monitor 太久沒輸出,已停止:${e?.what}`,Wt=((e,t={})=>(t.locale??s())===`zh-TW`?Ut(e):Ht(e)),Gt=((e={},t={})=>(t.locale??s(),`Logs`)),Kt=((e={},t={})=>(t.locale??s())===`zh-TW`?`從未`:`never`),qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`+新基地`:`+ New base`),Jt=((e={},t={})=>(t.locale??s())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),Yt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無警示`:`no alerts`),Xt=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),Zt=((e={},t={})=>(t.locale??s())===`zh-TW`?`尚無塔台`:`no tower yet`),Qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`思考中`:`thinking`),$t=e=>`Finished ${e?.note}`,en=e=>`完成了 ${e?.note}`,tn=((e,t={})=>(t.locale??s())===`zh-TW`?en(e):$t(e)),nn=e=>`Failed ${e?.note}`,rn=e=>`出錯了 ${e?.note}`,an=((e,t={})=>(t.locale??s())===`zh-TW`?rn(e):nn(e)),on=e=>`Waiting on you ${e?.note}`,sn=e=>`等你回答 ${e?.note}`,cn=((e,t={})=>(t.locale??s())===`zh-TW`?sn(e):on(e)),ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`+主智慧體`:`+ Main`),un=((e={},t={})=>(t.locale??s())===`zh-TW`?`+成員`:`+ Member`),dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`Outposts`),fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`手機`:`Phone`),pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),v=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉`:`Quit`),gn=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉塔台`:`Quit tower`),_n=e=>`Refused (${e?.status}).`,vn=e=>`已拒絕(${e?.status})。`,yn=((e,t={})=>(t.locale??s())===`zh-TW`?vn(e):_n(e)),bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒`:`Remind`),xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),Sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),Cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已關`:`Reminders off`),wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已開:分頁不在前景時,單位等你回答、完成或出錯會跳系統通知`:`Reminders on: while the page is in the background, a unit waiting on you, finishing, or failing raises a system notification`),Tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),En=((e={},t={})=>(t.locale??s())===`zh-TW`?`主智慧體`:`main`),Dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`成員`:`member`),On=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`outpost`),kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`未編入`:`unaligned`),An=((e={},t={})=>(t.locale??s(),`session`)),jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`子智慧體`:`subagent`),Mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`塔台`:`tower`),Nn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效`:`Sound`),Pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已關`:`Sounds off`),Fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已開`:`Sounds on`),In=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效:開關、音量與試聽`:`Sounds: on or off, volume, and a try`),Ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`▶ 試聽`:`▶ Try`),Rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音量`:`Volume`),zn=((e={},t={})=>(t.locale??s())===`zh-TW`?`智慧體`:`Agents`),Bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`基地`:`Bases`),Vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待中`:`Waiting`),Hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`Working`),Un=((e={},t={})=>(t.locale??s())===`zh-TW`?`狀態`:`States`),Wn=e=>`tab ${e?.label}`,Gn=e=>`分頁 ${e?.label}`,Kn=((e,t={})=>(t.locale??s())===`zh-TW`?Gn(e):Wn(e)),qn=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),Jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`網的總計`:`Net totals`),Yn=e=>`${e?.label} tower`,Xn=e=>`${e?.label} 塔台`,Zn=((e,t={})=>(t.locale??s())===`zh-TW`?Xn(e):Yn(e)),Qn=e=>`using ${e?.tool}`,$n=e=>`使用 ${e?.tool}`,er=((e,t={})=>(t.locale??s())===`zh-TW`?$n(e):Qn(e)),tr=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待變化…`:`Waiting for changes…`),nr=`sb-locale`;function rr(e){let t=/^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 p(e)??(t?p(t):void 0)??p(e.split(`-`)[0])}function ir(e,t){return p(e)??t.map(rr).find(Boolean)??`en`}var ar={brand_label:Ee,tagline:qn,totals_label:Jn,stat_bases:Bn,stat_agents:zn,stat_working:Hn,stat_waiting:Vn,alerts:fe,no_alerts:Yt,pair_button:fn,pair_title:pn,link_connecting:rt,location:ct,all_bases:pe,documents:et,net_log:Gt,states:Un,mark_working:Rt,mark_waiting:Lt,mark_idle:Ft,mark_done:Nt,mark_error:Pt,credit:$e,language:nt,waiting_changes:tr,new_base:qt};Object.keys(ar);function or(){let e=null;try{e=localStorage.getItem(nr)}catch{}let n=ir(e,navigator.languages??[navigator.language]);l(()=>n),document.documentElement.lang=n;let r={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(r))e.dataset[t]&&n(e,ar[e.dataset[t]]?.()??e.dataset[t]);let i=document.getElementById(`lang`);i.replaceChildren(...t.map(e=>new Option(st({},{locale:e}),e,!1,e===n))),i.onchange=()=>{try{localStorage.setItem(nr,i.value),location.reload()}catch{i.value=n}}}var sr={working:Mt,waiting:kt,idle:_t,done:dt,error:mt,unknown:Et};function cr(e){let t=new Map;for(let n of e.bases){n.tower&&t.set(`tower:${n.id}`,{name:Zn({label:n.label}),mark:n.tower.mark});for(let e of n.tabs.flatMap(e=>e.units))for(let n of[e,...e.subs])t.set(n.id,{name:n.name,mark:n.mark});for(let e of n.outposts)t.set(e.id,{name:e.label,mark:e.mark})}return t}function lr(e,t){if(!e)return[];let[n,r]=[cr(e),cr(t)],i=[];for(let[e,t]of r){let r=n.get(e);r?r.mark!==t.mark&&i.push({text:sr[t.mark]({name:t.name}),mark:t.mark}):i.push({text:bt({name:t.name}),mark:t.mark})}for(let[e,t]of n)r.has(e)||i.push({text:Ct({name:t.name}),mark:`idle`});return i}var ur=e=>e.unit??e.key,dr=e=>e===`waiting`||e===`error`?0:1;function fr(e,t){let n=new Map;for(let r of e.bases)for(let e of[...r.tower?[{...r.tower,role:`tower`}]:[],...[...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}`)}return n}function pr(e,t){return[...t.values()].filter(t=>e?.get(t.key)?.mark!==t.mark&&(dr(t.mark)===0||e!==void 0&&t.mark===`done`))}var mr=`input, textarea, select, [role=textbox], [role=combobox], [role=listbox], .term-scroll`,hr=`button, a, summary, [role=button], [role=link]`,gr=`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`;function _r(e,t){if(t||e.defaultPrevented||e.isComposing||e.ctrlKey||e.altKey||e.metaKey)return;let n=e.target;if(!(n?.isContentEditable||n?.closest?.(mr))){if(e.key===`f`||e.key===`F`)return`zoom`;if(e.key===` `&&!n?.closest?.(hr))return`next`}}function vr(e,t=()=>document.querySelector(gr)!==null,n=window){let r;n.addEventListener(`keydown`,n=>{let i=_r(n,t());if(i){if(n.repeat)return r===i?n.preventDefault():void 0;e(i)&&(r=i,n.preventDefault())}}),n.addEventListener(`keyup`,()=>r=void 0)}var yr=3e4,br=[`pointermove`,`pointerdown`,`keydown`,`wheel`,`touchstart`];function xr(e=document.documentElement){if(matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=Date.now(),n,r=()=>{let i=t+yr-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,yr))};for(let e of br)addEventListener(e,i,{capture:!0,passive:!0});document.addEventListener(`visibilitychange`,()=>document.hidden||i()),i()}var Sr=(...e)=>e.filter(e=>e!==!1&&e!=null),Cr=(e,t)=>(e.classList.add(t),e.classList.toggle(`flip`));function wr(e,t,...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t??{}))r.setAttribute(e,n);return r.append(...Sr(...n)),r}function Tr({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 Er(e,t){if(t||!e.length)return[];let n=document.createElement(`style`);return n.textContent=e.map((e,t)=>`@keyframes pk${t}{${Tr(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 Dr=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Or=function(e,t){return new URL(e,t).href},kr={},Ar=function(e){return e.pathname.endsWith(`.css`)},jr=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},y=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=Or(t,n);let r=s(t),i=Ar(r);return jr(kr,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`:Dr,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 b(e,t,n,r,i=!1){Object.assign(e.dataset,t),[e.hidden,e.textContent]=[i,n],r&&e.setAttribute(`aria-label`,r)}var Mr=(e,t)=>b(e,{key:t.key??``,name:t.name,role:t.role},v(),Ke({name:t.name}),!(t.control&&t.key)||t.role===`subagent`),Nr=(e,t)=>b(e,{key:t?.key??``,name:t?.name??``,role:`tower`},gn(),void 0,!t?.control),Pr=(e,t)=>b(e,{ws:t.id,name:t.label},v(),je({name:t.label})),Fr=(e,t,n)=>b(e,{ws:t.id,name:n.label,tab:n.id},v(),Le({name:n.label})),x=(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(De(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(Oe(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()});function Ir(e,{route:t,net:n,go:r}){let i=t();if(i.view===`map`)return;if(e.close===`base`)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 Lr(e){document.addEventListener(`click`,t=>{let n=t.target?.closest?.(`button[data-close]`),r=n?.dataset;n&&r&&(t.preventDefault(),x((r.close===`base`?Pe:r.close===`tab`?Be:r.role===`tower`?Ue:Ye)({name:r.name??``}),v()).then(t=>{t&&(n.toggleAttribute(`disabled`,!0),y(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/${r.close}`,r.close===`unit`?{key:r.key}:{workspace:r.ws,...r.tab&&{tab:r.tab}})).then(t=>t.ok?Ir(r,e):x(t.body.reason??yn({status:t.status})),()=>x(Xt())).finally(()=>n.toggleAttribute(`disabled`,!1)))}))})}var Rr=e=>{try{return decodeURIComponent(e)}catch{return e}},S=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function C(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(Rr);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 w=e=>e.view===`map`?``:e.view===`workspace`?`w/${S(e.ws)}`:`w/${S(e.ws)}/s/${S(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,zr=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},T=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null;function Br(e,t=new URL(document.baseURI).pathname){let n=()=>C(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>w(e)||`./`,go(n){let r=t+w(n);location.pathname+location.search!==r&&history.pushState(null,``,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(),r.go(C(t.getAttribute(`data-route`))))}),r}var Vr={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},E={working:Rt,waiting:Lt,idle:Ft,done:Nt,error:Pt,unknown:It},Hr={main:En,member:Dn,subagent:jn,tower:Mn,outpost:On,outside:kn,session:An},Ur={thinking:Qt,idle:Ft,"waiting on a question":Lt,finished:Nt},Wr=e=>Object.hasOwn(Hr,e)?Hr[e]():e,Gr=e=>e===`waiting`||e===`error`,D=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)},O=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},k=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},A=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&Cr(e,`flash`)},Kr=e=>(t=>(e.slice(8,t)===`stale`?Wt:Vt)({what:e.slice(t+1)}))(e.indexOf(`:`,8)),j=(e,t)=>e?e.startsWith(`tool:`)?er({tool:e.slice(5)}):e.startsWith(`monitor:`)?Kr(e):Object.hasOwn(Ur,e)?Ur[e]():e:E[t](),M=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,w(t)||`./`),e.setAttribute(`data-route`,w(t)))},qr=(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`},Jr=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function Yr(e,t,n,r){A(e,n);let i=e.querySelector(`use`),a=`#i-${Vr[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 N(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 P=()=>D(`<div class="unit"><div class="card"><a class="hit"></a>${Jr}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button></div><div class="subs"></div></div>`);function F(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);M(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${j(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,Gr(t.mark)),A(e,t.mark),Yr(e.querySelector(`.plate`),t.role,t.mark,t.docs),k(e,`.name`,t.name),k(e,`.role`,Wr(t.role)),k(e,`.note`,j(t.note,t.mark)),Mr(e.querySelector(`:scope > .card > .quit-btn`),t),N(e.querySelector(`.subs`),t.subs??[],P,F)}function I(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`?ln():un())&&(e.textContent=r===`main`?ln():un())}var Xr=()=>D(`<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></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="spawn-btns"><button type="button" class="pair-btn"></button></div><div class="tabs"></div><div class="outposts" data-label="${dn()}"></div></section>`);function Zr(e,t){A(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),A(n,t.tower?.mark??`unknown`),k(e,`h2 a`,t.label),M(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),k(e,`.title p`,t.tower?Qe({state:E[t.tower.mark]()}):Zt()),I(e.querySelector(`.spawn-btns button`),t),Pr(e.querySelector(`header > .quit-btn`),t),Nr(e.querySelector(`.tower-quit`),t.tower),N(e.querySelector(`.tabs`),t.tabs,()=>D(`<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)=>{k(e,`h3 span`,Kn({label:n.label})),Fr(e.querySelector(`.quit-btn`),t,n),I(e.querySelector(`.tab-add`),t,n.id),N(e.querySelector(`.units`),n.units,P,F)}),N(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?Jt():void 0})),P,F)}function Qr(e,t,n,r){let i=[...e.querySelectorAll(`.base:not(.leaving) .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(...Er(l,r))),n.querySelectorAll(`.packet`).forEach((e,t)=>e.toggleAttribute(`data-live`,a.dataset.mark===`working`||c[t].dataset.mark===`working`))}function $r(){let[e,t,n,r,i]=[O(`map`,HTMLElement),O(`bases`,HTMLElement),O(`links`,SVGSVGElement),O(`packets`,HTMLElement),O(`log`,HTMLElement)],a=matchMedia(`(prefers-reduced-motion: reduce)`).matches,o=()=>!e.hidden&&Qr(e,n,r,a);return new ResizeObserver(o).observe(e),xr(),{layout:o,stats(e){let t=e.bases.flatMap(e=>e.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))),n=e=>String(t.filter(t=>!e||t.mark===e).length);for(let[t,r]of[[`s-bases`,String(e.bases.length)],[`s-agents`,n()],[`s-working`,n(`working`)],[`s-waiting`,n(`waiting`)]])O(t,HTMLElement).textContent=r},show(e){N(t,e.bases,Xr,Zr),requestAnimationFrame(o)},log(e){let t=new Date().toLocaleTimeString([],{hour12:!1});for(let n of e){let e=D(`<li><span></span><time></time></li>`);e.dataset.mark=n.mark,k(e,`span`,n.text),k(e,`time`,t),i.prepend(e)}for(;i.children.length>12;)i.lastElementChild.remove()},pause(e){document.documentElement.classList.toggle(`paused`,e)}}}var ei=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,ti=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,ni={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:ti,done:ei},ri=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,L=(e,t)=>{try{return localStorage.getItem(e)??t}catch{return t}},R=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function ii(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=L(`sb.remind`,`1`)===`1`,u=L(`sb.sound`,`0`)===`1`,d=Math.min(100,Math.max(0,Number(L(`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`?wn():e===`denied`?Sn():xn():Cn():Tn(),r.dataset.state=u?`on`:`off`,r.setAttribute(`aria-label`,u?Fn():Pn()),a.checked=u,o.value=s.value=String(d),p&&(p.gain.value=(d/100)**2)};n.textContent=bn(),r.textContent=Nn(),r.title=In(),t(`sound-on-label`).textContent=Nn(),t(`sound-vol-label`).textContent=Rn(),t(`sound-try`).textContent=Ln(),n.onclick=async()=>{l&&c&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):R(`sb.remind`,(l=!l)?`1`:`0`),h()},i.addEventListener(`toggle`,e=>e.newState===`open`&&qr(i,r)),a.onchange=()=>{R(`sb.sound`,(u=a.checked)?`1`:`0`),h(),u&&g(`done`)},o.oninput=()=>(R(`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(ni[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(),{signal(t){let n=t.flatMap(e=>(t=>t?[{a:e,k:t}]:[])(ri(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:{waiting:cn,error:an,done:tn}[r]({note:t.note??``}).trim(),tag:t.key,icon:document.querySelector(`link[rel="icon"]`)?.href});n.onclick=()=>(window.focus(),n.close(),e(t))}}}}var ai=45e3,oi=1e3,si=3e4,ci=(e,t)=>Math.min(si,oi*2**(e-1))*(.8+.4*t);function li(e){try{return JSON.parse(e)}catch{return}}function ui(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(),ai),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,ci(t,e.random())))},d=()=>{c(),s(),i=e.now();let n=t=e.open();n.onError(()=>t===n&&u()),n.listen(`message`,r=>{if(t!==n)return;let i=li(r);i&&e.onNet(i),o({problem:i?void 0:mn()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:li(e)??hn()}),l())}),r=e.setTimeout(()=>u(),ai)};return{start(){o({state:`connecting`,attempt:0}),d()},resume(){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()}}}or();var z=$r(),B=e=>document.getElementById(e),di=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):Kt(),fi,pi,V,H,U={state:`connecting`,attempt:0},W={view:`map`},mi=!1,G,hi=``,K,gi,q=e=>K?e(K):void gi?.then(e);function _i(){gi??=y(async()=>{let{mountFocus:e}=await import(`./views-CWyLbZlX.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(K=e({data:Ni,restart:()=>$.restart(),openTile:yi,embedTerminal:(e,t,n)=>new Promise(r=>Y(i=>r(i.terminal.embed(e,t,n)))),online:()=>U.state===`live`}),K.show(W,W),V&&K.net(V),K))}var J,vi,Y=e=>{if(J)return e(J);vi??=y(async()=>{let{mountPanels:e}=await import(`./layer-MhUpNNJY.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>J=e({label:e=>V?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(Z?Z.data(e).latest():Mi(e,`?limit=12`))).items,post:e=>Z&&((t,n)=>Z.data(e).post(t,n)),stream:()=>hi,showTerminal:(e,t)=>(J?.stack.close(),K?.terminal(t),Q.go({view:`session`,ws:e,key:t}))})),vi.then(e)},yi=(e,t)=>Y(n=>n.tiles.open(e,t)),X=document.querySelector(`link[rel="icon"]`),bi=X&&decodeURIComponent(X.href.slice(X.href.indexOf(`,`)+1)),xi=0;function Si(e){let t=e.bases.flatMap(e=>[...e.tower?[e.tower]:[],...[...e.tabs.flatMap(e=>e.units),...e.outside].flatMap(e=>[e,...e.subs])]).filter(e=>e.mark===`waiting`||e.pending).length;if(!X||!bi||t===xi)return;xi=t;let n=`<circle cx='23' cy='9' r='9' fill='#ffd166' stroke='#0b1220' 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='#06101e'>${t>9?`9+`:t}</text>`;X.href=`data:image/svg+xml,${encodeURIComponent(t?bi.replace(`</svg>`,`${n}</svg>`):bi)}`}var Ci;function wi(e){V=H=e,Si(e);let t=fr(e,Date.now());if(Ci&&Fi.signal(pr(Ci,t)),Ci=t,document.hidden)return;z.stats(e);let n=pr(G,t);(n.length||J)&&Y(e=>e.alerts(n,t)),G=t,z.log(lr(pi,e)),pi=e,q(t=>t.net(e)),W.view===`map`&&(z.show(e),fi=e,H=void 0)}function Ti(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,e.view!==`map`&&_i(),B(`map`).hidden=e.view!==`map`,B(`legend`).hidden=e.view===`session`,q(r=>r.show(e,t,n)),e.view===`map`&&V&&V!==fi&&(wi(V),requestAnimationFrame(z.layout)),mi&&T(e)!==T(t)&&$.restart()}function Ei(e){U=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=B(`stage`).dataset.stale=String(t),B(`link`).dataset.state=e.state,B(`link-text`).textContent={connecting:rt,live:it,reconnecting:ot,offline:at}[e.state](),K&&V&&K.net(V),J?.stack.redraw();let n=B(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?ve({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?Te({attempt:e.attempt}):Se():xe({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=di(e.lastContact),n.replaceChildren(`${r} ${he()} `,i,me())}function Di(e,t){try{let n=JSON.parse(t);q(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var Oi=document.querySelector(`meta[name="sb-build"]`)?.content,ki=e=>!!(Oi&&Oi!==JSON.parse(e).build);function Ai(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 ji=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),Mi=(e,t=``)=>ji(`history/${encodeURIComponent(e)}${t}`),Z=void 0,Ni=e=>({older:t=>Mi(e,`?before=${encodeURIComponent(t)}`),latest:()=>Mi(e),entry:t=>ji(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),Pi=()=>{let e=Ai(T(W));return e.listen(`history`,e=>Di(`history`,e)),e.listen(`cards`,e=>Di(`cards`,e)),e.listen(`hello`,e=>ki(e)?location.reload():(hi=e,J?.terminal.hello())),e.listen(`mirror`,e=>J?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&C(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=G?.get(n.key);r&&(e.preventDefault(),Y(e=>e.stack.show(r)))},!0);var Q=Br(e=>Ti(e)),Fi=ii(e=>Q.go({view:`session`,ws:e.ws,key:ur(e)})),$=ui({open:Pi,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:wi,onStatus:Ei}),Ii=()=>$.resume();document.addEventListener(`visibilitychange`,()=>{if(z.pause(document.hidden),document.hidden)return $.hide();H&&wi(H),q(e=>e.wake()),Ii()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(e.preventDefault(),!J?.stack.close()&&W.view!==`map`&&Q.go(zr(W)))}),vr(e=>J?.hotkey(e)??!1),B(`pair`).hidden=location.hostname!==`127.0.0.1`,B(`pair`).addEventListener(`click`,()=>void y(async()=>{let{pairTile:e}=await import(`./pair-CwPFgFN8.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>yi(e(),!0))),Lr({route:()=>W,net:()=>V,go:e=>Q.go(e)}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&y(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-BgFg4ORi.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,V?.bases??[]);r&&yi(n(r),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&Ii());Ei(U),Ti(Q.route()),$.start(),mi=!0;export{et as A,yn as C,Yt as D,Xt as E,s as F,Oe as M,De as N,Jt as O,pe as P,Vn as S,Zt as T,wr as _,I as a,ur as b,Yr as c,A as d,Wr as f,y as g,Gr as h,M as i,Qe as j,tt as k,qr as l,k as m,E as n,O as o,N as p,Jr as r,j as s,Vr as t,D as u,Cr as v,dn as w,Hn as x,dr as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--bg:#060a14;--panel:#0e1628e0;--line:#7a98e033;--text:#dbe6ff;--dim:#8b99ba;--gold:#ffd166;--grid:linear-gradient(#82a0ff0d 1px, transparent 1px) 0 0 / 44px 44px, linear-gradient(90deg, #82a0ff0d 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}body{min-height:100vh;color:var(--text);font:14px/1.4 var(--sans);background:radial-gradient(1100px 640px at 12% -10%, #38e0ff1c, transparent 62%), radial-gradient(900px 600px at 98% 8%, #966eff1c, transparent 60%), linear-gradient(var(--bg), #0a1020);background-attachment:fixed}svg{display:block}[data-mark=working]{--c:#38e0ff}[data-mark=waiting]{--c:#ffb02e}[data-mark=idle]{--c:#7184ad}[data-mark=done]{--c:#3ddc97}[data-mark=error]{--c:#ff5470}[data-mark=unknown]{--c:#4f5c7c}[data-mark]{--c1:color-mix(in srgb, var(--c) 13%, transparent);--c4:color-mix(in srgb, var(--c) 45%, transparent)}:focus-visible{outline-offset:2px;outline:2px solid #38e0ff}.shell{max-width:1480px;margin:0 auto;padding:18px 22px 40px}.hud{border:1px solid var(--line);background:var(--panel);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:5;border-radius:18px;flex-wrap:wrap;align-items:center;gap:10px 24px;padding:12px 18px;display:flex;position:sticky;top:12px}.brand{align-items:center;gap:12px;margin-right:auto;display:flex}.logo{color:#38e0ff;border:1px solid var(--line);background:radial-gradient(circle at 30% 25%,#38e0ff4d,#0a1020e6);border-radius:14px;place-items:center;width:44px;height:44px;display:grid}.logo svg{filter:drop-shadow(0 0 6px #38e0ff);width:28px;height:28px}.brand h1{letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;font-size:20px}@media (width<=1600px){.hud{column-gap:10px;padding:12px 14px}.brand{margin-right:auto}.stats{gap:6px}.stats div{min-width:58px;padding:6px 8px}.alerts{width:190px}.hud .pair-btn{padding:6px 10px}}.brand p{color:var(--dim);font-size:12px}.stats{gap:10px;display:flex}.stats div,.tally div,.alerts{background:#ffffff0a;border:1px solid #ffffff0f;border-radius:12px;min-width:78px;padding:6px 12px}.stats dt,.tally dt{color:var(--dim);letter-spacing:.08em;text-transform:uppercase;font-size:11px}.stats dd,.tally dd{font:600 20px/1.1 var(--mono)}.stats [data-mark] dd,.tally [data-mark] dd,.count b{color:var(--c)}.pair-btn{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 12px}.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:#cfe6ff;border-color:#2c5b74}.tog[data-state=on]:before{background:#38e0ff;box-shadow:0 0 6px #38e0ff}.tog[data-state=ask]:before{background:#ffd166}.tog[data-state=blocked]:before{background:#ff6b81}.tog[data-state=done]{color:#cfe6ff}.tog[data-state=done]:before{background:#7ee2a8;box-shadow:0 0 6px #7ee2a8}.alert-row{align-items:center;gap:10px;display:flex}.done-btn{white-space:nowrap;flex:none}.hud-pop{border:1px solid var(--line);color:var(--text);font:13px/1.4 var(--sans);background:#0e1628;border-radius:14px;margin:0;padding:12px;position:fixed;inset:auto;box-shadow:0 12px 32px #02050c99}.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]{accent-color:#38e0ff;flex:1;min-width:0}.sound-pop input[type=checkbox]{accent-color:#38e0ff;width:18px;height:18px}.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:#ffffff0f}.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)}.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-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:#38e0ff;border-color:#38e0ff}.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:#ff8a9c;border-color:#ff8a9c66}.base>header>.quit-btn{align-self:flex-start;margin-left:auto}.card>.quit-btn{margin-left:auto}.card>.quit-btn,.tower-quit{z-index:2;position:relative}.tower-quit{margin:6px 0 0}.sheet{border:1px solid var(--line);max-width:min(420px,100vw - 32px);color:var(--text);font:14px/1.5 var(--sans);background:#0e1628;border-radius:16px;margin:auto;padding:18px 20px}.sheet::backdrop{background:#02050c99}.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{color:#06101e;font:600 13px var(--sans);cursor:pointer;background:#ff8a9c;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]{color:#38e0ff;background:#38e0ff14;border-color:#38e0ff}.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);cursor:zoom-in;background:#0b1220;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:#040810f0;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);width:44px;height:44px;color:var(--text);background:#0e1628d9;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{max-width:min(80%,640px);color:var(--dim);white-space:pre-wrap;-webkit-line-clamp:3;border:1px dashed #38e0ff73;border-radius:12px;-webkit-box-orient:vertical;margin:0;padding:6px 12px;font-size:14px;line-height:1.45;display:-webkit-box;overflow:hidden}.queue-list b{color:#38e0ff;letter-spacing:.06em;margin-right:8px;font-size:11px;font-weight:600}.in-term .queue-list{display:none}.todos{border:1px solid var(--line);background:#0e1628d9;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:#b48cff;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:#38e0ff}.todos li.in_progress:before{content:"◐"}.todos li.completed{color:var(--dim);text-decoration:line-through}.todos li.completed:before{content:"✓";color:#3ddc97}.in-term .todos,.in-term .monitors{display:none}.monitors{border:1px solid var(--line);background:#0e1628d9;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:#38e0ff;flex:none;font-weight:600}.monitors[data-failed=true] summary b{color:#ff5d73}.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;color:#38e0ff;width:1.4em;display:inline-block}.monitors li.done b:before{content:"✓";color:#3ddc97}.monitors li.stopped b:before{content:"■";color:var(--dim)}.monitors li.error b:before,.monitors li.stale b:before{content:"!";color:#ff5d73}.monitors li.error small,.monitors li.stale small{color:#ff5d73}.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:140px;color:var(--dim);font:600 14px var(--sans);letter-spacing:.08em;cursor:pointer;background:0 0;border-radius:18px}.spawn .go{--c:#38e0ff;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-dirs{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px;max-height:40vh;display:grid;overflow:auto}.spawn-dir{border:1px solid var(--line);color:var(--text);font:13px var(--mono);text-align:left;overflow-wrap:anywhere;cursor:pointer;background:0 0;border-radius:8px;padding:7px 10px}.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}.link{color:var(--dim);text-transform:uppercase;letter-spacing:.08em;align-items:center;gap:8px;font-size:12px;display:flex}.link i{background:#4f5c7c;border-radius:50%;width:9px;height:9px}.link[data-state=live] i{background:#3ddc97;animation:2.4s ease-in-out infinite blink}.link[data-state=live]{color:#3ddc97}.link[data-state=reconnecting] i,.link[data-state=connecting] i{background:#ffb02e;animation:1s ease-in-out infinite blink}.link[data-state=offline] i{background:#ff5470}.banner{color:#c9d6f5;background:#7184ad29;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) 300px;align-items:start;gap:20px;margin-top:18px;transition:opacity .4s;display:grid}.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), #080d1a8c;border-radius:22px;min-height:420px;padding:26px;transition:opacity .4s;position:relative}.links{pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.wire{fill:none;stroke:#38e0ff4d;stroke-width:1.5px;stroke-dasharray:3 7;stroke-linecap:round}.packets{pointer-events:none;position:absolute;inset:0;overflow:hidden}.packet{opacity:0;will-change:transform;background:#38e0ff;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%,300px),1fr));align-items:start;gap:30px;display:grid;position:relative}.base{border:1px solid var(--line);background:linear-gradient(#16213c,#0c1324);border-radius:18px;padding:16px;position:relative;box-shadow:0 18px 40px #00000059}.base.head{background:linear-gradient(#ffd1661a,#0000 38%),linear-gradient(#16213c,#0c1324)}.base[data-mark=waiting]{box-shadow:0 18px 40px #00000059,inset 0 0 0 999px #ffb02e0b}.base>header{align-items:center;gap:14px;margin-bottom:14px;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:#ffd1661f;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:80px;height:80px;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%, #101a2e), #0b1222 70%);border:1px solid color-mix(in srgb, var(--c) 45%, transparent);border-radius:50%;position:absolute;inset:0}.tower svg{width:48px;height:48px;filter:drop-shadow(0 0 6px color-mix(in srgb, var(--c) 70%, 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:40px;position:absolute;bottom:-2px;right:-2px}.tabs{gap:12px;display:grid}.tab{background:#ffffff06;border:1px solid #ffffff0d;border-radius:14px;padding:10px}.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:#ffffff09;border:1px solid #ffffff0f;border-radius:12px;align-items:center;gap:10px;padding:8px 10px;transition:background-color .4s;display:flex;position:relative}.unit[data-mark=waiting]>.card{background:#ffb02e1c}.unit[data-mark=error]>.card{background:#ff54701c}.unit[data-mark=working]>.card{background:#38e0ff12}.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%, #101a2e), #0b1222 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,#0000 calc(100% - 3px),#000 calc(100% - 2px));mask:radial-gradient(farthest-side,#0000 calc(100% - 3px),#000 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:#06101e;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=working]>.badge:after{content:"";border:2px solid #06101e;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{letter-spacing:.1em;text-transform:uppercase;color:color-mix(in srgb, var(--c) 70%, var(--dim));font-size:10px;font-style:normal}.note{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.unit[data-mark=idle]>.card{opacity:.85}.subs{margin:6px 0 0 22px;padding-left:18px;position:relative}.subs:empty{display:none}.subs:before{content:"";background:repeating-linear-gradient(#7a98e080 0 4px,#0000 4px 8px);width:1px;position:absolute;top:-4px;bottom:22px;left:3px}.subs>.unit>.card:before{content:"";background:repeating-linear-gradient(90deg,#7a98e080 0 4px,#0000 4px 8px);width:15px;height:1px;position:absolute;top:50%;left:-15px}.subs>.unit{position:relative}.subs .plate{--s:30px}.subs .name{font-size:13px}.side{gap:16px;display:grid;position:sticky;top:96px}.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}.net-log summary{cursor:pointer;justify-content:space-between;align-items:center;list-style:none;display:flex}.net-log summary::-webkit-details-marker{display:none}.net-log summary:after{content:"▾";color:var(--dim);transition:transform .2s}.net-log:not([open]) summary:after{transform:rotate(-90deg)}.net-log:not([open]) h2{margin-bottom:0}.log{gap:7px;max-height:360px;padding:0;list-style:none;display:grid;overflow:hidden}.log:empty:before{content:attr(data-empty);color:var(--dim);font-size:12px}.log li{grid-template-columns:auto 1fr;gap:2px 8px;font-size:12px;animation:.4s ease-out both slide;display:grid}.log li:before{content:"";background:var(--c);border-radius:50%;width:8px;height:8px;margin-top:5px}.log time{font:11px var(--mono);color:var(--dim);grid-column:2}.credit{color:var(--dim);padding:0 6px;font-size:11px}.legend{gap:8px;padding:0;font-size:12px;list-style:none;display:grid}.legend li{align-items:center;gap:9px;display:flex}.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.flip>.card>.plate,.flash.flip.tower,.flash.flip.token>.plate{animation-name:flash-b}@keyframes spin{to{transform:rotate(360deg)}}@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 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}[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:#38e0ff}.crumbs{gap:10px;min-width:0;margin:14px 6px 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:#38e0ff;display:none}.crumbs a,.brand{text-decoration:none}.work{align-items:flex-start;gap:20px;min-width:0;display:flex}.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:#38e0ff}.alerts{width:230px;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;margin-left:-10px;box-shadow:0 0 0 2px #0e1628}.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:#ffb02e1c}.token[data-mark=error]{background:#ff54701c}.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}.flash.token>.plate{animation:.6s ease-out flash}.zoom-in,.comms-in{border:1px solid var(--line);background:var(--grid), #080d1a8c;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:#0c1324c7;padding:14px 16px 18px}.squad[data-mark=waiting]{background:#262121d9}.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{width:100%;color:var(--dim);background:#111a2f;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}.drones:before{content:"";background:repeating-linear-gradient(#7a98e099 0 4px,#0000 4px 8px);width:1px;height:14px;position:absolute;top:0;left:50%}.camp .token{width:156px}[data-group=outside] .plate{filter:saturate(.3);outline-offset:4px;outline:1px dashed #8b99ba8c}.comms-in,.tile{height:calc(var(--vvh,100vh) - 190px);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{color:#38e0ff;background:radial-gradient(circle at 35% 30%,#38e0ff47,#0b1222 72%);border-radius:50%;flex:none;place-items:center;width:30px;height:30px;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}.chat-root{min-height:0;display:grid;position:relative}.comms-in .ask{max-height:calc((var(--vvh,100vh) - 190px) * .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;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{color:var(--c);align-items:center;gap:10px;margin-top:14px;padding-left:44px;font-size:12px;display:flex}.chat-pill{--c:#38e0ff;border:0;position:absolute;bottom:14px;left:50%;transform:translate(-50%)}.lit:after{content:"";background:#38e0ff2e;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);min-width:0;color:var(--text);font:14px/1.4 var(--sans);background:#070c18;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:#38e0ff80;outline:none;box-shadow:0 0 0 3px #38e0ff1f}.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:#ff8a9c}.cmp-note[data-tone=ok]{color:#3ddc97}.cmp-note[data-tone=ask]{color:var(--gold)}.cmp-link{color:#38e0ff;font:12px var(--sans);cursor:pointer;background:0 0;border:0;padding:0}.slash{z-index:5;border:1px solid var(--line);background:#0b1324;border-radius:12px;max-height:260px;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% - 6px);left:18px;right:18px;overflow-y:auto;box-shadow:0 8px 24px #0008}.slash li{cursor:pointer;border-radius:8px;align-items:baseline;gap:10px;padding:6px 10px;display:flex}.slash li[aria-selected=true]{background:#38e0ff1f}.slash b{color:#38e0ff;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:#06101e;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{white-space:pre-wrap;overflow-wrap:anywhere;background:#ffd16614;border:1px solid #ffd16638;border-radius:14px;max-width:80%;padding:7px 12px;line-height:1.5}.tx.in{grid-template-columns:30px minmax(0,1fr);align-items:start;gap:8px;display:grid}.tx-body{border:1px solid var(--line);background:#0e1628d9;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:#38e0ff;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:#ff8a9c;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{background:#ffffff08;border:1px solid #ffffff12;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{background:#966eff12;border-color:#966eff33}.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:#ffb02e1f;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:#ffffff09;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]{color:#06101e;background:#3ddc97}.md code{font:13.5px var(--mono);background:#ffffff14;border-radius:5px;padding:1px 5px}.md pre{border:1px solid var(--line);background:#070c18;border-radius:10px;padding:10px 12px;overflow-x:auto}.md pre code{background:0 0;padding:0}.md blockquote{color:var(--dim);background:#ffffff0a;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{border:1px solid var(--line);background:var(--panel);border-radius:22px;flex:1 1 0;min-width:0;position:sticky;top:96px}.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) - 190px);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{color:var(--gold);border-color:#ffd16666}.dock{z-index:20;pointer-events:none;width:min(300px,100vw - 44px);display:grid;position:fixed;top:108px;right:max(22px,50vw - 718px)}.dialog{pointer-events:auto;border:1px solid var(--c4);background:linear-gradient(var(--c1), #0c1324 70%), #121a30;transform-origin:top;border-radius:18px;grid-area:1/1;padding:14px 16px 16px;transition:transform .3s,opacity .3s;position:relative;box-shadow:0 24px 60px #000c}.dialog:focus{outline:none}.dialog{overscroll-behavior:contain;max-height:calc(100dvh - 128px);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:#060a148c;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{background:#ffb02e0f;border:1px solid #ffb02e59;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{color:var(--gold);letter-spacing:.06em;text-transform:uppercase;background:#ffb02e24;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);overflow-wrap:anywhere;counter-increment:opt;background:#070c18;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:#ff8a9c}.ask-note[data-tone=ok]{color:#3ddc97}.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}button.ask-opt{text-align:left;color:var(--text);font:13px var(--sans);cursor:pointer}.ask-opt[aria-checked=true]{background:#ffb02e1f;border-color:#ffb02e}.ask-own{border:1px solid var(--line);min-width:0;color:var(--text);font:13px var(--sans);background:#070c18;border-radius:10px;padding:7px 12px}.ask-memo{font-size:12px}.ask input:disabled{opacity:.45}.ask-send{color:#06101e;font:600 13px var(--sans);cursor:pointer;background:#ffb02e;border:0;border-radius:10px;padding:7px 13px}.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:#06101e}a.go{justify-content:center;align-items:center;display:inline-flex}.cmp-send{color:#06101e;background:#38e0ff;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{grid-template-columns:1fr}.side{position:static}.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:#38e0ff;box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}.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 #38e0ffcc,0 0 #38e0ff00}60%{box-shadow:0 0 0 7px #38e0ff00,0 0 34px #38e0ff66}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}@keyframes term-blip{0%{box-shadow:0 0 0 2px #7ff0ffcc,0 0 32px #38e0ff88}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}@keyframes term-blip-b{0%{box-shadow:0 0 0 2px #7ff0ffcc,0 0 32px #38e0ff88}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}.term-sink{opacity:0;resize:none;pointer-events:none;border:0;width:1px;height:18px;padding:0;position:fixed;overflow:hidden}.term-typing{color:#38e0ff;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 #38e0ff99}}.term-state{color:var(--dim)}.term-state[data-tone=ok]{color:#3ddc97}.term-state[data-tone=error]{color:#ff8a9c}.term-scroll{overscroll-behavior:contain;border:1px solid var(--line);background:#090d18;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{color:#cdd6f4;width:max-content;min-width:100%;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;color:#3b2a06;min-width:10px;height:16px;font:700 9px/16px var(--mono);text-align:center;background:linear-gradient(#f6e6b8,#d8bd78);border-radius:3px 6px;padding:0 3px;position:absolute;top:-5px;left:-5px;box-shadow:0 0 0 2px #0b1222,2px 2px 0 1px #8a6f33}.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{width:100%;color:var(--text);font:13px var(--sans);text-align:left;cursor:pointer;background:#d8bd7812 linear-gradient(#f6e6b8,#d8bd78) 9px/13px 16px no-repeat;border:1px solid #d8bd7840;border-radius:10px;gap:1px;padding:7px 10px 7px 30px;display:grid}.d-doc:hover{border-color:#d8bd78aa}.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{gap:14px;display:flex}.doc-frame{background:#fff;border:1px solid #d8bd7855;border-radius:12px;width:100%;height:100%;min-height:240px}.doc-text{background:#0b1222;border:1px solid #d8bd7840;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);min-height:34px;color:var(--text);font:600 12px var(--mono);cursor:pointer;background:#0b1224;border-bottom-width:3px;border-radius:9px;padding:4px 6px}.pad-key:active:not(:disabled){background:#13203e;border-bottom-width:1px;transform:translateY(2px)}.pad-key:disabled{opacity:.35;cursor:default}.pad-key[data-key=enter]{color:#38e0ff}.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:#ff8a9c}.pad-note[data-tone=ask]{color:var(--text);background:#ffb02e14;border:1px solid #ffb02e66;border-radius:10px;padding:8px 10px}.pad-yes{color:#06101e;font:600 12px var(--sans);cursor:pointer;background:#ffb02e;border:0;border-radius:9px;padding:5px 11px}.c0{color:#45475a}.cz{color:#090d18}.c1{color:#f38ba8}.c2{color:#a6e3a1}.c3{color:#f9e2af}.c4{color:#89b4fa}.c5{color:#f5c2e7}.c6{color:#94e2d5}.c7{color:#bac2de}.c8{color:#585b70}.c9{color:#f37799}.c10{color:#89d88b}.c11{color:#ebd391}.c12{color:#74a8fc}.c13{color:#f2aede}.c14{color:#6bd7ca}.c15{color:#a6adc8}.k0{background:#090d18}.k1{background:#f38ba8}.k2{background:#a6e3a1}.k3{background:#f9e2af}.k4{background:#89b4fa}.k5{background:#f5c2e7}.k6{background:#94e2d5}.k7,.kz{background:#bac2de}.k8{background:#585b70}.k9{background:#f37799}.k10{background:#89d88b}.k11{background:#ebd391}.k12{background:#74a8fc}.k13{background:#f2aede}.k14{background:#6bd7ca}.k15{background:#a6adc8}.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}@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:calc(100% - 40px);min-width:0}.link{order:1}.hud>.pair-btn{white-space:nowrap;flex:1 1 0;order:2;justify-content:center;min-width:0;min-height:40px;padding:6px 8px}.hud>.lang{flex:none;padding-right:26px}.log{max-height:none}.log li:nth-child(n+3){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{gap:18px}.keep{gap:12px;padding:6px}.tower.big{width:84px;height:84px}.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}.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;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{padding:0 12px;display:block}.comms-head h2 small,.chan b{display:none}.modes+.chan{margin-left:0}.modes{border:1px solid var(--line);border-radius:12px;grid-area:2/1/auto/-1;padding:3px}.modes button{border:0;border-radius:9px;flex:1;min-height:40px;padding:0;font-size:14px}.modes button[aria-pressed=true]{background:#38e0ff1f}.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{font-size:16px}.composer button,.go,.later,.x,.chat-pill,.pair-btn,.alerts,.ask button,.term-bar button,.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 (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}
|
|
1
|
+
:root{--bg:#060a14;--panel:#0e1628e0;--line:#7a98e033;--text:#dbe6ff;--dim:#8b99ba;--gold:#ffd166;--grid:linear-gradient(#82a0ff0d 1px, transparent 1px) 0 0 / 44px 44px, linear-gradient(90deg, #82a0ff0d 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}body{min-height:100vh;color:var(--text);font:14px/1.4 var(--sans);background:radial-gradient(1100px 640px at 12% -10%, #38e0ff1c, transparent 62%), radial-gradient(900px 600px at 98% 8%, #966eff1c, transparent 60%), linear-gradient(var(--bg), #0a1020);background-attachment:fixed}svg{display:block}[data-mark=working]{--c:#38e0ff}[data-mark=waiting]{--c:#ffb02e}[data-mark=idle]{--c:#7184ad}[data-mark=done]{--c:#3ddc97}[data-mark=error]{--c:#ff5470}[data-mark=unknown]{--c:#4f5c7c}[data-mark]{--c1:color-mix(in srgb, var(--c) 13%, transparent);--c4:color-mix(in srgb, var(--c) 45%, transparent)}:focus-visible{outline-offset:2px;outline:2px solid #38e0ff}.shell{max-width:1480px;margin:0 auto;padding:18px 22px 40px}.hud{border:1px solid var(--line);background:var(--panel);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:5;border-radius:18px;flex-wrap:wrap;align-items:center;gap:10px 24px;padding:12px 18px;display:flex;position:sticky;top:12px}.brand{align-items:center;gap:12px;margin-right:auto;display:flex}.logo{color:#38e0ff;border:1px solid var(--line);background:radial-gradient(circle at 30% 25%,#38e0ff4d,#0a1020e6);border-radius:14px;place-items:center;width:44px;height:44px;display:grid}.logo svg{filter:drop-shadow(0 0 6px #38e0ff);width:28px;height:28px}.brand h1{letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;font-size:20px}@media (width<=1600px){.hud{column-gap:10px;padding:12px 14px}.brand{margin-right:auto}.stats{gap:6px}.stats div{min-width:58px;padding:6px 8px}.alerts{width:190px}.hud .pair-btn{padding:6px 10px}}.brand p{color:var(--dim);font-size:12px}.stats{gap:10px;display:flex}.stats div,.tally div,.alerts{background:#ffffff0a;border:1px solid #ffffff0f;border-radius:12px;min-width:78px;padding:6px 12px}.stats dt,.tally dt{color:var(--dim);letter-spacing:.08em;text-transform:uppercase;font-size:11px}.stats dd,.tally dd{font:600 20px/1.1 var(--mono)}.stats [data-mark] dd,.tally [data-mark] dd,.count b{color:var(--c)}.pair-btn{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 12px}.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:#cfe6ff;border-color:#2c5b74}.tog[data-state=on]:before{background:#38e0ff;box-shadow:0 0 6px #38e0ff}.tog[data-state=ask]:before{background:#ffd166}.tog[data-state=blocked]:before{background:#ff6b81}.tog[data-state=done]{color:#cfe6ff}.tog[data-state=done]:before{background:#7ee2a8;box-shadow:0 0 6px #7ee2a8}.alert-row{align-items:center;gap:10px;display:flex}.done-btn{white-space:nowrap;flex:none}.hud-pop{border:1px solid var(--line);color:var(--text);font:13px/1.4 var(--sans);background:#0e1628;border-radius:14px;margin:0;padding:12px;position:fixed;inset:auto;box-shadow:0 12px 32px #02050c99}.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]{accent-color:#38e0ff;flex:1;min-width:0}.sound-pop input[type=checkbox]{accent-color:#38e0ff;width:18px;height:18px}.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:#ffffff0f}.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)}.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-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:#38e0ff;border-color:#38e0ff}.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:#ff8a9c;border-color:#ff8a9c66}.base>header>.quit-btn{align-self:flex-start;margin-left:auto}.card>.quit-btn{margin-left:auto}.card>.quit-btn,.tower-quit{z-index:2;position:relative}.tower-quit{margin:6px 0 0}.sheet{border:1px solid var(--line);max-width:min(420px,100vw - 32px);color:var(--text);font:14px/1.5 var(--sans);background:#0e1628;border-radius:16px;margin:auto;padding:18px 20px}.sheet::backdrop{background:#02050c99}.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{color:#06101e;font:600 13px var(--sans);cursor:pointer;background:#ff8a9c;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]{color:#38e0ff;background:#38e0ff14;border-color:#38e0ff}.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);cursor:zoom-in;background:#0b1220;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:#040810f0;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);width:44px;height:44px;color:var(--text);background:#0e1628d9;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{max-width:min(80%,640px);color:var(--dim);white-space:pre-wrap;-webkit-line-clamp:3;border:1px dashed #38e0ff73;border-radius:12px;-webkit-box-orient:vertical;margin:0;padding:6px 12px;font-size:14px;line-height:1.45;display:-webkit-box;overflow:hidden}.queue-list b{color:#38e0ff;letter-spacing:.06em;margin-right:8px;font-size:11px;font-weight:600}.in-term .queue-list{display:none}.todos{border:1px solid var(--line);background:#0e1628d9;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:#b48cff;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:#38e0ff}.todos li.in_progress:before{content:"◐"}.todos li.completed{color:var(--dim);text-decoration:line-through}.todos li.completed:before{content:"✓";color:#3ddc97}.in-term .todos,.in-term .monitors{display:none}.monitors{border:1px solid var(--line);background:#0e1628d9;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:#38e0ff;flex:none;font-weight:600}.monitors[data-failed=true] summary b{color:#ff5d73}.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;color:#38e0ff;width:1.4em;display:inline-block}.monitors li.done b:before{content:"✓";color:#3ddc97}.monitors li.stopped b:before{content:"■";color:var(--dim)}.monitors li.error b:before,.monitors li.stale b:before{content:"!";color:#ff5d73}.monitors li.error small,.monitors li.stale small{color:#ff5d73}.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:140px;color:var(--dim);font:600 14px var(--sans);letter-spacing:.08em;cursor:pointer;background:0 0;border-radius:18px}.spawn .go{--c:#38e0ff;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-dirs{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px;max-height:40vh;display:grid;overflow:auto}.spawn-dir{border:1px solid var(--line);color:var(--text);font:13px var(--mono);text-align:left;overflow-wrap:anywhere;cursor:pointer;background:0 0;border-radius:8px;padding:7px 10px}.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}.link{color:var(--dim);text-transform:uppercase;letter-spacing:.08em;align-items:center;gap:8px;font-size:12px;display:flex}.link i{background:#4f5c7c;border-radius:50%;width:9px;height:9px}.link[data-state=live] i{background:#3ddc97;animation:2.4s ease-in-out infinite blink}.link[data-state=live]{color:#3ddc97}.link[data-state=reconnecting] i,.link[data-state=connecting] i{background:#ffb02e;animation:1s ease-in-out infinite blink}.link[data-state=offline] i{background:#ff5470}.banner{color:#c9d6f5;background:#7184ad29;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) 300px;align-items:start;gap:20px;margin-top:18px;transition:opacity .4s;display:grid}.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), #080d1a8c;border-radius:22px;min-height:420px;padding:26px;transition:opacity .4s;position:relative}.links{pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.wire{fill:none;stroke:#38e0ff4d;stroke-width:1.5px;stroke-dasharray:3 7;stroke-linecap:round}.packets{pointer-events:none;position:absolute;inset:0;overflow:hidden}.packet{opacity:0;will-change:transform;background:#38e0ff;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%,300px),1fr));align-items:start;gap:30px;display:grid;position:relative}.base{border:1px solid var(--line);background:linear-gradient(#16213c,#0c1324);border-radius:18px;padding:16px;position:relative;box-shadow:0 18px 40px #00000059}.base.head{background:linear-gradient(#ffd1661a,#0000 38%),linear-gradient(#16213c,#0c1324)}.base[data-mark=waiting]{box-shadow:0 18px 40px #00000059,inset 0 0 0 999px #ffb02e0b}.base>header{align-items:center;gap:14px;margin-bottom:14px;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:#ffd1661f;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:80px;height:80px;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%, #101a2e), #0b1222 70%);border:1px solid color-mix(in srgb, var(--c) 45%, transparent);border-radius:50%;position:absolute;inset:0}.tower svg{width:48px;height:48px;filter:drop-shadow(0 0 6px color-mix(in srgb, var(--c) 70%, 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:40px;position:absolute;bottom:-2px;right:-2px}.tabs{gap:12px;display:grid}.tab{background:#ffffff06;border:1px solid #ffffff0d;border-radius:14px;padding:10px}.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:#ffffff09;border:1px solid #ffffff0f;border-radius:12px;align-items:center;gap:10px;padding:8px 10px;transition:background-color .4s;display:flex;position:relative}.unit[data-mark=waiting]>.card{background:#ffb02e1c}.unit[data-mark=error]>.card{background:#ff54701c}.unit[data-mark=working]>.card{background:#38e0ff12}.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%, #101a2e), #0b1222 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,#0000 calc(100% - 3px),#000 calc(100% - 2px));mask:radial-gradient(farthest-side,#0000 calc(100% - 3px),#000 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:#06101e;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=working]>.badge:after{content:"";border:2px solid #06101e;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{letter-spacing:.1em;text-transform:uppercase;color:color-mix(in srgb, var(--c) 70%, var(--dim));font-size:10px;font-style:normal}.note{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.unit[data-mark=idle]>.card{opacity:.85}.subs{margin:6px 0 0 22px;padding-left:18px;position:relative}.subs:empty{display:none}.subs:before{content:"";background:repeating-linear-gradient(#7a98e080 0 4px,#0000 4px 8px);width:1px;position:absolute;top:-4px;bottom:22px;left:3px}.subs>.unit>.card:before{content:"";background:repeating-linear-gradient(90deg,#7a98e080 0 4px,#0000 4px 8px);width:15px;height:1px;position:absolute;top:50%;left:-15px}.subs>.unit{position:relative}.subs .plate{--s:30px}.subs .name{font-size:13px}.side{gap:16px;display:grid;position:sticky;top:96px}.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}.net-log summary{cursor:pointer;justify-content:space-between;align-items:center;list-style:none;display:flex}.net-log summary::-webkit-details-marker{display:none}.net-log summary:after{content:"▾";color:var(--dim);transition:transform .2s}.net-log:not([open]) summary:after{transform:rotate(-90deg)}.net-log:not([open]) h2{margin-bottom:0}.log{gap:7px;max-height:360px;padding:0;list-style:none;display:grid;overflow:hidden}.log:empty:before{content:attr(data-empty);color:var(--dim);font-size:12px}.log li{grid-template-columns:auto 1fr;gap:2px 8px;font-size:12px;animation:.4s ease-out both slide;display:grid}.log li:before{content:"";background:var(--c);border-radius:50%;width:8px;height:8px;margin-top:5px}.log time{font:11px var(--mono);color:var(--dim);grid-column:2}.credit{color:var(--dim);padding:0 6px;font-size:11px}.legend{gap:8px;padding:0;font-size:12px;list-style:none;display:grid}.legend li{align-items:center;gap:9px;display:flex}.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.flip>.card>.plate,.flash.flip.tower,.flash.flip.token>.plate{animation-name:flash-b}@keyframes spin{to{transform:rotate(360deg)}}@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 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}[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:#38e0ff}.crumbs{gap:10px;min-width:0;margin:14px 6px 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:#38e0ff;display:none}.crumbs a,.brand{text-decoration:none}.work{align-items:flex-start;gap:20px;min-width:0;display:flex}.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:#38e0ff}.alerts{width:230px;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;margin-left:-10px;box-shadow:0 0 0 2px #0e1628}.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:#ffb02e1c}.token[data-mark=error]{background:#ff54701c}.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}.flash.token>.plate{animation:.6s ease-out flash}.zoom-in,.comms-in{border:1px solid var(--line);background:var(--grid), #080d1a8c;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:#0c1324c7;padding:14px 16px 18px}.squad[data-mark=waiting]{background:#262121d9}.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{width:100%;color:var(--dim);background:#111a2f;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}.drones:before{content:"";background:repeating-linear-gradient(#7a98e099 0 4px,#0000 4px 8px);width:1px;height:14px;position:absolute;top:0;left:50%}.camp .token{width:156px}[data-group=outside] .plate{filter:saturate(.3);outline-offset:4px;outline:1px dashed #8b99ba8c}.comms-in,.tile{height:calc(var(--vvh,100vh) - 190px);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{color:#38e0ff;background:radial-gradient(circle at 35% 30%,#38e0ff47,#0b1222 72%);border-radius:50%;flex:none;place-items:center;width:30px;height:30px;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}.chat-root{min-height:0;display:grid;position:relative}.comms-in .ask{max-height:calc((var(--vvh,100vh) - 190px) * .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;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{color:var(--c);align-items:center;gap:10px;margin-top:14px;padding-left:44px;font-size:12px;display:flex}.chat-pill{--c:#38e0ff;border:0;position:absolute;bottom:14px;left:50%;transform:translate(-50%)}.lit:after{content:"";background:#38e0ff2e;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);min-width:0;color:var(--text);font:14px/1.4 var(--sans);background:#070c18;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:#38e0ff80;outline:none;box-shadow:0 0 0 3px #38e0ff1f}.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:#ff8a9c}.cmp-note[data-tone=ok]{color:#3ddc97}.cmp-note[data-tone=ask]{color:var(--gold)}.cmp-link{color:#38e0ff;font:12px var(--sans);cursor:pointer;background:0 0;border:0;padding:0}.slash{z-index:5;border:1px solid var(--line);background:#0b1324;border-radius:12px;max-height:260px;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% - 6px);left:18px;right:18px;overflow-y:auto;box-shadow:0 8px 24px #0008}.slash li{cursor:pointer;border-radius:8px;align-items:baseline;gap:10px;padding:6px 10px;display:flex}.slash li[aria-selected=true]{background:#38e0ff1f}.slash b{color:#38e0ff;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:#06101e;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{white-space:pre-wrap;overflow-wrap:anywhere;background:#ffd16614;border:1px solid #ffd16638;border-radius:14px;max-width:80%;padding:7px 12px;line-height:1.5}.tx.in{grid-template-columns:30px minmax(0,1fr);align-items:start;gap:8px;display:grid}.tx-body{border:1px solid var(--line);background:#0e1628d9;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:#38e0ff;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:#ff8a9c;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{background:#ffffff08;border:1px solid #ffffff12;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{background:#966eff12;border-color:#966eff33}.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:#ffb02e1f;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:#ffffff09;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]{color:#06101e;background:#3ddc97}.md code{font:13.5px var(--mono);background:#ffffff14;border-radius:5px;padding:1px 5px}.md pre{border:1px solid var(--line);background:#070c18;border-radius:10px;padding:10px 12px;overflow-x:auto}.md pre code{background:0 0;padding:0}.md blockquote{color:var(--dim);background:#ffffff0a;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{border:1px solid var(--line);background:var(--panel);border-radius:22px;flex:1 1 0;min-width:0;position:sticky;top:96px}.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) - 190px);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{color:var(--gold);border-color:#ffd16666}.dock{z-index:20;pointer-events:none;width:min(300px,100vw - 44px);display:grid;position:fixed;top:108px;right:max(22px,50vw - 718px)}.dialog{pointer-events:auto;border:1px solid var(--c4);background:linear-gradient(var(--c1), #0c1324 70%), #121a30;transform-origin:top;border-radius:18px;grid-area:1/1;padding:14px 16px 16px;transition:transform .3s,opacity .3s;position:relative;box-shadow:0 24px 60px #000c}.dialog:focus{outline:none}.dialog{overscroll-behavior:contain;max-height:calc(100dvh - 128px);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:#060a148c;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{background:#ffb02e0f;border:1px solid #ffb02e59;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{color:var(--gold);letter-spacing:.06em;text-transform:uppercase;background:#ffb02e24;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);overflow-wrap:anywhere;counter-increment:opt;background:#070c18;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:#ff8a9c}.ask-note[data-tone=ok]{color:#3ddc97}.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}button.ask-opt{text-align:left;color:var(--text);font:13px var(--sans);cursor:pointer}.ask-opt[aria-checked=true]{background:#ffb02e1f;border-color:#ffb02e}.ask-own{resize:vertical;field-sizing:content;border:1px solid var(--line);min-width:0;max-height:10em;color:var(--text);font:13px var(--sans);background:#070c18;border-radius:10px;padding:7px 12px}.ask-memo{font-size:12px}.ask input:disabled,.ask textarea:disabled{opacity:.45}.ask-send{color:#06101e;font:600 13px var(--sans);cursor:pointer;background:#ffb02e;border:0;border-radius:10px;padding:7px 13px}.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:#06101e}a.go{justify-content:center;align-items:center;display:inline-flex}.cmp-send{color:#06101e;background:#38e0ff;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{grid-template-columns:1fr}.side{position:static}.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:#38e0ff;box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}.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 #38e0ffcc,0 0 #38e0ff00}60%{box-shadow:0 0 0 7px #38e0ff00,0 0 34px #38e0ff66}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}@keyframes term-blip{0%{box-shadow:0 0 0 2px #7ff0ffcc,0 0 32px #38e0ff88}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}@keyframes term-blip-b{0%{box-shadow:0 0 0 2px #7ff0ffcc,0 0 32px #38e0ff88}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}.term-sink{opacity:0;resize:none;pointer-events:none;border:0;width:1px;height:18px;padding:0;position:fixed;overflow:hidden}.term-typing{color:#38e0ff;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 #38e0ff99}}.term-state{color:var(--dim)}.term-state[data-tone=ok]{color:#3ddc97}.term-state[data-tone=error]{color:#ff8a9c}.term-scroll{overscroll-behavior:contain;border:1px solid var(--line);background:#090d18;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{color:#cdd6f4;width:max-content;min-width:100%;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;color:#3b2a06;min-width:10px;height:16px;font:700 9px/16px var(--mono);text-align:center;background:linear-gradient(#f6e6b8,#d8bd78);border-radius:3px 6px;padding:0 3px;position:absolute;top:-5px;left:-5px;box-shadow:0 0 0 2px #0b1222,2px 2px 0 1px #8a6f33}.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{width:100%;color:var(--text);font:13px var(--sans);text-align:left;cursor:pointer;background:#d8bd7812 linear-gradient(#f6e6b8,#d8bd78) 9px/13px 16px no-repeat;border:1px solid #d8bd7840;border-radius:10px;gap:1px;padding:7px 10px 7px 30px;display:grid}.d-doc:hover{border-color:#d8bd78aa}.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{gap:14px;display:flex}.doc-frame{background:#fff;border:1px solid #d8bd7855;border-radius:12px;width:100%;height:100%;min-height:240px}.doc-text{background:#0b1222;border:1px solid #d8bd7840;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);min-height:34px;color:var(--text);font:600 12px var(--mono);cursor:pointer;background:#0b1224;border-bottom-width:3px;border-radius:9px;padding:4px 6px}.pad-key:active:not(:disabled){background:#13203e;border-bottom-width:1px;transform:translateY(2px)}.pad-key:disabled{opacity:.35;cursor:default}.pad-key[data-key=enter]{color:#38e0ff}.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:#ff8a9c}.pad-note[data-tone=ask]{color:var(--text);background:#ffb02e14;border:1px solid #ffb02e66;border-radius:10px;padding:8px 10px}.pad-yes{color:#06101e;font:600 12px var(--sans);cursor:pointer;background:#ffb02e;border:0;border-radius:9px;padding:5px 11px}.c0{color:#45475a}.cz{color:#090d18}.c1{color:#f38ba8}.c2{color:#a6e3a1}.c3{color:#f9e2af}.c4{color:#89b4fa}.c5{color:#f5c2e7}.c6{color:#94e2d5}.c7{color:#bac2de}.c8{color:#585b70}.c9{color:#f37799}.c10{color:#89d88b}.c11{color:#ebd391}.c12{color:#74a8fc}.c13{color:#f2aede}.c14{color:#6bd7ca}.c15{color:#a6adc8}.k0{background:#090d18}.k1{background:#f38ba8}.k2{background:#a6e3a1}.k3{background:#f9e2af}.k4{background:#89b4fa}.k5{background:#f5c2e7}.k6{background:#94e2d5}.k7,.kz{background:#bac2de}.k8{background:#585b70}.k9{background:#f37799}.k10{background:#89d88b}.k11{background:#ebd391}.k12{background:#74a8fc}.k13{background:#f2aede}.k14{background:#6bd7ca}.k15{background:#a6adc8}.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}@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:calc(100% - 40px);min-width:0}.link{order:1}.hud>.pair-btn{white-space:nowrap;flex:1 1 0;order:2;justify-content:center;min-width:0;min-height:40px;padding:6px 8px}.hud>.lang{flex:none;padding-right:26px}.log{max-height:none}.log li:nth-child(n+3){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{gap:18px}.keep{gap:12px;padding:6px}.tower.big{width:84px;height:84px}.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}.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;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{padding:0 12px;display:block}.comms-head h2 small,.chan b{display:none}.modes+.chan{margin-left:0}.modes{border:1px solid var(--line);border-radius:12px;grid-area:2/1/auto/-1;padding:3px}.modes button{border:0;border-radius:9px;flex:1;min-height:40px;padding:0;font-size:14px}.modes button[aria-pressed=true]{background:#38e0ff1f}.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,.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 (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}
|