pi-straw-boss 0.43.0 → 0.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +4 -1
  2. package/README.zh-TW.md +3 -0
  3. package/dist/gui/assets/ask-Cp13JTEm.js +1 -0
  4. package/dist/gui/assets/chat-CdX3Lkfm.js +2 -0
  5. package/dist/gui/assets/drawer-qVyh8zOf.js +1 -0
  6. package/dist/gui/assets/index-CYBMg2XG.js +1 -0
  7. package/dist/gui/assets/index-Iw_CHyno.css +1 -0
  8. package/dist/gui/assets/layer-DPfTmZ_H.js +3 -0
  9. package/dist/gui/assets/lightbox-B1e5k9CR.js +1 -0
  10. package/dist/gui/assets/link-BPANIwWC.js +1 -0
  11. package/dist/gui/assets/open_main_title-Ccbha5pD.js +1 -0
  12. package/dist/gui/assets/pair-V89W4Loy.js +1 -0
  13. package/dist/gui/assets/picker-tBH8XoGR.js +1 -0
  14. package/dist/gui/assets/refusal--wJ5SRx-.js +1 -0
  15. package/dist/gui/assets/rolldown-runtime-DK3Fl9T5.js +1 -0
  16. package/dist/gui/assets/runtime-ZX6HkxDa.js +1 -0
  17. package/dist/gui/assets/sending-aEpvzoz2.js +1 -0
  18. package/dist/gui/assets/spawn-zPF5TTix.js +1 -0
  19. package/dist/gui/assets/trust-B-m6tCqo.js +1 -0
  20. package/dist/gui/assets/unit_count-DTUtsZm9.js +1 -0
  21. package/dist/gui/assets/views-BCs43dfq.js +7 -0
  22. package/dist/gui/index.html +5 -2
  23. package/package.json +2 -1
  24. package/prompts/main.md +1 -0
  25. package/prompts/tower.md +1 -0
  26. package/src/activity.ts +1 -1
  27. package/src/agent/cli.ts +11 -8
  28. package/src/agent/sidecar.ts +15 -1
  29. package/src/ask.ts +5 -3
  30. package/src/balance.ts +2 -2
  31. package/src/board.ts +159 -0
  32. package/src/boardread.ts +43 -0
  33. package/src/boardset.ts +35 -0
  34. package/src/bridge.ts +49 -4
  35. package/src/closemain.ts +1 -1
  36. package/src/closer.ts +3 -0
  37. package/src/control.ts +79 -9
  38. package/src/dashboard.ts +2 -127
  39. package/src/deploy.ts +45 -9
  40. package/src/dialogs.ts +21 -7
  41. package/src/gui.ts +7 -5
  42. package/src/handover.ts +53 -15
  43. package/src/header.ts +6 -2
  44. package/src/hidden.ts +61 -0
  45. package/src/host.ts +16 -5
  46. package/src/index.ts +6 -2
  47. package/src/intercept.ts +3 -0
  48. package/src/keys.ts +27 -13
  49. package/src/link/admin.ts +534 -0
  50. package/src/link/allow.ts +181 -0
  51. package/src/link/approval.ts +95 -0
  52. package/src/link/boardtargets.ts +30 -0
  53. package/src/link/config.ts +42 -5
  54. package/src/link/election.ts +16 -4
  55. package/src/link/gate.ts +116 -0
  56. package/src/link/holder.ts +363 -8
  57. package/src/link/hooks.ts +140 -0
  58. package/src/link/join.ts +11 -2
  59. package/src/link/kinds.ts +71 -6
  60. package/src/link/policy.ts +86 -0
  61. package/src/link/request.ts +220 -0
  62. package/src/link/runtime.ts +199 -18
  63. package/src/link/store.ts +67 -4
  64. package/src/link/turn.ts +89 -0
  65. package/src/link/wire.ts +2 -0
  66. package/src/membership.ts +15 -4
  67. package/src/net.ts +10 -6
  68. package/src/netdata.ts +137 -0
  69. package/src/opener.ts +14 -8
  70. package/src/order.ts +1 -1
  71. package/src/orphan.ts +1 -1
  72. package/src/owners.ts +12 -5
  73. package/src/pull.ts +37 -0
  74. package/src/reach.ts +15 -9
  75. package/src/remote.ts +12 -12
  76. package/src/roles.ts +14 -3
  77. package/src/session.ts +10 -2
  78. package/src/spawn.ts +56 -27
  79. package/src/startof.ts +99 -0
  80. package/src/stash.ts +10 -5
  81. package/src/stashing.ts +2 -1
  82. package/src/state.ts +7 -3
  83. package/src/tools.ts +52 -4
  84. package/src/towertab.ts +17 -8
  85. package/src/trust/ask.ts +182 -0
  86. package/src/trust/files.ts +159 -0
  87. package/src/trust/found.ts +103 -0
  88. package/src/trust/serve.ts +110 -0
  89. package/src/trust/settings.ts +160 -0
  90. package/src/trust/types.ts +15 -0
  91. package/src/trust/wait.ts +28 -0
  92. package/dist/gui/assets/ask-CCKfKMvv.js +0 -1
  93. package/dist/gui/assets/chat-k8ggXdWs.js +0 -2
  94. package/dist/gui/assets/drawer-DrZpXsSb.js +0 -1
  95. package/dist/gui/assets/index-BfHcFefd.js +0 -1
  96. package/dist/gui/assets/index-Bfw8ft0-.css +0 -1
  97. package/dist/gui/assets/layer-C9CWWILI.js +0 -3
  98. package/dist/gui/assets/lightbox-BEcZvcpS.js +0 -1
  99. package/dist/gui/assets/open_main_title-Bg-4377g.js +0 -1
  100. package/dist/gui/assets/pair-D8rJEwsZ.js +0 -1
  101. package/dist/gui/assets/post-UHMNmNgA.js +0 -1
  102. package/dist/gui/assets/spawn-BQsNOmwc.js +0 -1
  103. package/dist/gui/assets/unit_count-DmN2a4LP.js +0 -1
  104. package/dist/gui/assets/views-Dq2h_4v8.js +0 -7
package/README.md CHANGED
@@ -31,9 +31,10 @@ Run a few agents on the same project and they start stepping on each other: two
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
33
  - **Towers talk to each other.** A tower lists every workspace's tower (`tower_list`: who a message for it reaches, what its tabs work on) and writes to one or all of them (`tower_send`); a workspace without a tower is reached through its mains, else its members. Every `call_tower`, `boss_broadcast`, and `tower_send` message opens with a header the code writes: who sent it, in what role, to whom, and whether a reply is expected ([how](docs/how-it-works.md#talking-between-towers)).
34
+ - **A work board.** A main writes one line of what it does and a short checklist (`board_set`); towers read every main's entry (`board_read`), on this computer and, with Straw Link, on teammates' computers, so a tower routes work knowing where each main stands ([how](docs/how-it-works.md#the-work-board)).
34
35
  - **A tower closes the mains it opened.** A main a tower opened for a request reports to the sender and to the tower, and the tower closes it (`boss_close_main`) when nothing is running in it ([how](docs/how-it-works.md#closing-an-opened-main)).
35
36
  - **A digest for the tower**: joins, subagent launches, and renames in its workspace since its last run, read into its next run once and cleared ([how](docs/how-it-works.md#the-towers-digest)).
36
- - **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 switch in the header's settings (the gear) raises a system notification, and another plays a sound, when a unit waits on you, fails, or finishes; finished units wait in a list of their own, cleared one by one or all at once, and a finished subagent on the map is dismissed one by one or all at once (Dismiss finished, beside the location). A unit's comms show its background monitors, and one that fails or goes quiet raises a notice (a quiet entry under the header's Notices button; only a unit waiting on you raises the prominent alert); a unit that is idle while a subagent of it works, or while a monitor of it runs, shows as commanding with a glow, and one that only waits on a running monitor shows its note in red. On a desktop a unit's terminal takes your keyboard once you click into it. It reads in English or Traditional Chinese, following your browser, with a language menu in the header's settings. + New base, the last card on the map, opens a base in a folder you pick with one member and no tower. A base without a tower takes more members (+ Member on the base adds one in a new tab, on a squad beside that squad), and its tower opens by the rules above; a base with a tower takes new mains (+ Main, on the base or in the tower's comms), each in a tab of its own. In a session's composer, a file pasted, dropped, or picked with + (20 MB at most) is stored in a private temp folder and its path goes into the message. × closes a base, a squad, or (in its view) a unit after a confirmation: each agent quits pi as `/quit` would, then its pane, tab, or workspace closes; nothing closes if one of them refuses. Each opening form takes an optional first message; the folder is picked in Finder-style columns (with New folder, and the base named after the folder by default), staying inside your home folder and skipping hidden folders, and while the unit opens a deploy panel shows the real steps (create, start, join the net, deliver the first message) with each step's clock, and names the step and the reason when one fails.
37
+ - **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 switch in the header's settings (the gear) raises a system notification, and another plays a sound, when a unit waits on you, fails, or finishes; finished units wait in a list of their own, cleared one by one or all at once, and a finished subagent on the map is dismissed one by one or all at once (Dismiss finished, beside the location). A unit's comms show its background monitors, and one that fails or goes quiet raises a notice (a quiet entry under the header's Notices button; only a unit waiting on you raises the prominent alert); a unit that is idle while a subagent of it works, or while a monitor of it runs, shows as commanding with a glow, and one that only waits on a running monitor shows its note in red. On a desktop a unit's terminal takes your keyboard once you click into it. It reads in English or Traditional Chinese, following your browser, with a language menu in the header's settings. + New base, the last card on the map, opens a base in a folder you pick with one member and no tower. A base without a tower takes more members (+ Member on the base adds one in a new tab, on a squad beside that squad), and its tower opens by the rules above; a base with a tower takes new mains (+ Main, on the base or in the tower's comms), each in a tab of its own. In a session's composer, a file pasted, dropped, or picked with + (20 MB at most) is stored in a private temp folder and its path goes into the message. × closes a base, a squad, or (in its view) a unit after a confirmation: each agent quits pi as `/quit` would, then its pane, tab, or workspace closes; nothing closes if one of them refuses. Each opening form takes an optional first message; the folder is picked in Finder-style columns (with New folder, and the base named after the folder by default), staying inside your home folder and skipping hidden folders (on Windows also the ones with the Hidden or System attribute, such as AppData and the old profile links), and while the unit opens a deploy panel shows the real steps (create, start, join the net, deliver the first message) with each step's clock, and names the step and the reason when one fails. A pi that must confirm project trust before it starts (a folder with `.pi/` settings, extensions, skills, or MCP servers) asks in the GUI as an alert too, with the folder, what trusting would load, and Trust, Trust this time, or Don't trust (the terminal can answer as well, and the first answer counts; a paired phone may answer; the deploy panel of an opening shows it inline).
37
38
  - **Broadcast** to a tab, a workspace, every tower (a workspace without one, through its mains or members), or every session.
38
39
  - **Tidy tabs.** When a pi starts in a tab or quits out of it, the tab's panes are made equal again, so workers split off one by one don't leave a chain of halves.
39
40
  - **Stranded subagents are asked to report.** A subagent that stays open after finishing, while the pi that launched it was restarted and no longer receives its result, is asked once over intercom to send its final report there ([how it works](docs/how-it-works.md#orphaned-subagents)).
@@ -88,6 +89,8 @@ The tower only routes and coordinates, so it can run a lighter model: set `tower
88
89
  | `boss_close_main` | Tower only: close a main this tower opened, once nothing runs in it. |
89
90
  | `tower_list` | Tower only: every workspace's tower, who a message for it reaches, its state, and what its tabs work on. |
90
91
  | `tower_send` | Tower only: message one other tower (by workspace id or label), or all of them. |
92
+ | `board_read` | Tower only: the work board: what each main is doing and how far it is, here and on teammates' computers. |
93
+ | `board_set` | A tab's main: replace its own board entry (one line of current work, up to 8 checklist items). |
91
94
  | `boss_broadcast` | Message a tab, a workspace, all towers, or every session (under a header). |
92
95
  | `boss_rename` | Name this session with a short phrase for its current work; the net and the GUI show it, and a main agent's tab takes it as its label. Main agents call it when their work changes. |
93
96
  | `/boss` | Take over as this tab's main agent. |
package/README.zh-TW.md CHANGED
@@ -31,6 +31,7 @@
31
31
  - **每個工作區一座塔台。** 工作區出現第一個主智慧體時,塔台就在自己的分頁開起來,固定排在最前面。它負責協調各個主智慧體和其他塔台;沒有 session 負責的工作,它會開一個分頁、啟動新的主智慧體來處理。你不用跟它說話。
32
32
  - **即時儀表板**在塔台裡:誰加入了,他們和他們的子智慧體正在做什麼。
33
33
  - **塔台之間可以直接溝通。** 塔台能列出每個工作區的塔台(`tower_list`:訊息會送到誰、各分頁在做什麼),也能對其中一座或全部發訊息(`tower_send`);沒有塔台的工作區,訊息改送它的主智慧體,沒有主智慧體就送成員。`call_tower`、`boss_broadcast`、`tower_send` 的每則訊息開頭都有一行程式寫的標頭:誰送的、什麼角色、送給誰、要不要回覆([細節](docs/how-it-works.md#talking-between-towers),英文)。
34
+ - **工作看板。** 主智慧體寫一行目前在做什麼,加一份短清單(`board_set`);塔台讀每個主智慧體的項目(`board_read`),本機的,加上 Straw Link 團隊中隊友電腦上的,這樣塔台分派工作時知道各主智慧體做到哪([細節](docs/how-it-works.md#the-work-board))。
34
35
  - **塔台會關掉自己開的主智慧體。** 塔台替請求開出的主智慧體做完後,向發話者和那座塔台各回報一次;塔台確認裡面沒有東西在跑,就用 `boss_close_main` 把它關掉([細節](docs/how-it-works.md#closing-an-opened-main),英文)。
35
36
  - **給塔台的摘要**:自塔台上一輪以來,工作區裡有誰加入、啟動了哪些子智慧體、誰改了名字;塔台下一輪會讀進來一次,讀完就清掉([細節](docs/how-it-works.md#the-towers-digest))。
36
37
  - **瀏覽器畫面** `/boss gui` 看得到整張網:每個工作區是一座基地,裡面有塔台、智慧體和子智慧體,畫面會動,但只能看。點基地可以放大,點單位可以把它的對話當成即時通訊紀錄來讀;在等你回覆的單位會排成警示,按空白鍵開下一則,按 F 放大最上面的對話框,按 Esc 關掉它(打字時都不會觸發);回答問題也可以只用鍵盤:方向鍵選項目,Tab 換題,Enter 確認並跳到下一題。頂端齒輪「設定」裡有兩個開關:單位在等你、出錯或完成時,一個會跳系統通知,一個會播音效;已完成的單位另外排在自己的清單裡,可以一個一個清,也可以一次全清;地圖上已結束的子智慧體也可以一個一個移除,或用位置列旁的「移除已完成」一次全移除。單位的通訊畫面也會列出它在背景跑的 Monitor,出錯或太久沒輸出的 Monitor 會列進標頭的「通知」(只有在等你回答的單位才會跳出醒目的警示,出錯和完成都只是安靜的通知);自己閒置、但它的子智慧體在工作或等待,或它的 Monitor 還在跑的單位,會顯示成帶光暈的「指揮中」;只在等 Monitor 跑完的單位,備註會用紅字顯示「監看中」。在桌面上點進單位的終端機,就能直接用鍵盤操作它。畫面有英文和正體中文,預設跟隨瀏覽器語言,也可以從頂端「設定」裡的語言選單切換。地圖最後一張「+新基地」會在選定的資料夾開一座基地,裡面先有一位成員、沒有塔台。沒有塔台的基地只能加成員(基地上的「+成員」開在新分頁,小隊上的開在該小隊旁),等成員自己升格時才會開塔台;有塔台的基地只能加主智慧體(「+主智慧體」,各開在自己的分頁)。在 session 的輸入框貼上、拖進或用「+」選的檔案(最多 20 MB)會存到私有的暫存資料夾,路徑放進訊息。開啟表單都可以先填第一句指令;資料夾選擇只能在家目錄以下,也不會列出點開頭的資料夾。
@@ -88,6 +89,8 @@ pi install npm:pi-straw-boss
88
89
  | `boss_close_main` | 只有塔台能用:關掉這座塔台自己開的主智慧體,裡面沒有東西在跑時才會關。 |
89
90
  | `tower_list` | 只有塔台能用:列出每個工作區的塔台、訊息會送到誰、它的狀態,以及各分頁在做什麼。 |
90
91
  | `tower_send` | 只有塔台能用:傳訊息給另一座塔台(用工作區 id 或名稱),或全部塔台。 |
92
+ | `board_read` | 只有塔台能用:看工作看板,也就是各主智慧體正在做什麼、做到哪;本機的,加上 Straw Link 團隊中隊友電腦上的。 |
93
+ | `board_set` | 分頁的主智慧體用:換掉自己的看板項目(一行目前的工作,加最多 8 個清單項)。 |
91
94
  | `boss_broadcast` | 傳訊息給一個分頁、一個工作區、所有塔台,或所有 session(訊息開頭有標頭)。 |
92
95
  | `boss_rename` | 用一個短語替這個 session 命名,說明它現在在做什麼;net 與 GUI 會顯示它,主智慧體的分頁也會改成這個名稱。主智慧體換工作時會呼叫它。 |
93
96
  | `/boss` | 接手成為這個分頁的主智慧體。 |
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{a as t,i as n,n as r,r as i,t as a}from"./sending-aEpvzoz2.js";import{D as o,z as s}from"./index-CYBMg2XG.js";var c=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),u=((t={},n={})=>(n.locale??e())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`可以複選。`:`It takes several choices.`),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`選擇`:`Choices`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),h=((t={},n={})=>(n.locale??e())===`zh-TW`?`複製指令`:`Copy command`),g=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註`:`Note`),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註(選填)`:`Note (optional)`),y=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,b=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,x=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`選項`:`Options`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`你的答案`:`Your own answer`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`安全考量,遠端不支援輸入機密。請到執行 GUI 的那台電腦的終端機中回答。`:`For security, entering a secret is not supported remotely. Answer it in the terminal on the computer the GUI runs on.`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`機密內容只能在終端機輸入,這裡不接受。請到執行 GUI 的那台電腦的終端機中回答。`:`A secret is entered in the terminal only, not here. Answer it in the terminal on the computer the GUI runs on.`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出答案`:`Send answer`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示終端機`:`Show terminal`),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),I=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),L=((t={},n={})=>(n.locale??e())===`zh-TW`?`連不上伺服器。`:`The server could not be reached.`),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`它在等待對話框。`:`It waits on a dialog.`),z={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1};function B(e,t,n,r,i){let{q:a}=n,o=r[a],s=z[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 V(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=B(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 H=e=>e.multiple?d():e.freeform&&e.options.length?u():``,U=(e,t)=>o(`div`,{class:`ask-one`},e.header&&o(`b`,{class:`ask-head`},e.header),o(`p`,{class:`ask-q`},e.question),e.context&&o(`div`,{class:`ask-ctx`},e.context),e.options.length>0&&o(`ol`,{class:`ask-opts`,"aria-label":S()},...e.options.map(e=>o(`li`,{class:`ask-opt`},o(`b`,null,e.title),e.description&&o(`small`,null,e.description)))),t&&H(e)&&o(`small`,{class:`ask-how`},H(e))),W=e=>e.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f\p{Cf}]/gu,`�`),G=e=>(e.select?.choices??[]).map((e,t)=>({...e,i:t})),K=(e,t,n)=>({...e.size?{choices:[...e].sort((e,t)=>e-t)}:{},...t.trim()?{text:t}:{},...n.trim()?{note:n}:{}}),q=(e,t,n)=>({dialog:e.dialog,digest:e.digest,answerId:n,...t}),J={digest:E,"not-allowed":O,malformed:D};function Y(e){let{outcome:i,reason:a,by:o}=e.body;return i===`accepted`?[`ok`,n()]:i===`stale`?[`error`,o===`local`?I():o===`cancel`?P():F()]:i===`rejected`?[`error`,(Object.hasOwn(J,String(a))?J[String(a)]:k)()]:i===`busy`?[`error`,t()]:i===`unknown`||e.status===504?[`error`,r(),!0]:[`error`,a??s({status:e.status})]}var X=e=>[`accepted`,`stale`,`busy`,`unknown`].includes(String(e.body.outcome))||e.status===504,Z=e=>e.answer?`d\n${e.answer.dialog}\n${e.answer.digest}`:`c\n${e.callId}\n${e.why??``}`;function Q(e,t,n=location.hostname!==`127.0.0.1`,s,u){let d,y,b,E=!1,D=!1,O;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>y&&!y.el.contains(e.target)&&(y.lost=void 0));let k=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),P=()=>{if(!y)return;let e=document.activeElement;e&&e!==document.body&&e!==y.lost&&(y.lost=void 0),y.controls.forEach(e=>e.disabled=!E||D||y.done),y.send&&(y.send.disabled=!E||D||y.done||!y.pick()),e&&y.el.contains(e)&&e.disabled&&(y.lost=e);let t=y.lost;t&&!t.disabled&&y.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),y.lost=void 0)};async function F(e,n){[e.sending,D,e.spell]=[!0,!0,!1],P(),k(e.note,``,a());let s=await t(`answer`,n).catch(()=>void 0),c=o(`button`,{type:`button`,class:`cmp-link`},i());c.onclick=()=>void F(e,n);let[l,d,f]=s?Y(s):[`error`,r(),!0];[e.done,e.sending,D,e.busy]=[!s||X(s),!1,!1,s?.body.outcome===`busy`],k(e.note,l,d,...f?[c]:[]),P(),e.note.scrollIntoView?.({block:`nearest`}),u&&s?.body.outcome===`accepted`&&setTimeout(u,1200)}let I=(e,t,n,r,i)=>{let a=o(`button`,{type:`button`,class:`ask-opt`,role:e,"aria-checked":`false`},o(`b`,i?{"data-n":String(i)}:null,t),...n.filter(Boolean).map(e=>o(`small`,null,e)));return a.onclick=r,a};function L(e,t){let r,i=G(t).map(e=>I(`radio`,W(e.label),[e.note&&W(e.note)],()=>(r=e.i,i.forEach((n,r)=>n.setAttribute(`aria-checked`,String(G(t)[r].i===e.i))),P()),e.i+1)),a=t.select?.copy!==void 0&&o(`button`,{type:`button`,class:`cmp-link`},h());a&&(a.disabled=!navigator.clipboard,a.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>k(e.note,`ok`,m()),()=>k(e.note,`error`,p())));let s=i.filter((e,r)=>!(n&&G(t)[r].hereOnly));return i.forEach(e=>!s.includes(e)&&(e.disabled=!0)),e.pick=()=>r===void 0?void 0:{choice:r},e.first=V(e.el,[{opts:i,multiple:!1,answered:()=>r!==void 0}],()=>e.send),e.controls=s,[o(`pre`,{class:`ask-title`},W(t.select.title)),o(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":f()},...i),o(`div`,{class:`ask-acts`},e.send,a)]}function z(e,t){let n=t.questions.map(()=>({picks:new Set,text:o(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:T(),"aria-label":w()}),note:o(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:v(),"aria-label":_()})})),r=[],i=t.questions.map((t,i)=>{let a=n[i],s=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>I(s,e.title,[e.description,e.preview&&g()],()=>{t.multiple||(a.picks.clear(),a.text.value=``),a.picks.has(n)?a.picks.delete(n):a.picks.add(n),c.forEach((e,t)=>e.setAttribute(`aria-checked`,String(a.picks.has(t)))),P()}));return a.text.oninput=()=>(t.multiple||(a.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),P()),e.controls.push(...c,a.text,a.note),r.push({opts:c,multiple:!!t.multiple,own:a.text,note:a.note,answered:()=>a.picks.size>0||a.text.value.trim()!==``}),o(`div`,{class:`ask-one`},t.header&&o(`b`,{class:`ask-head`},t.header),o(`p`,{class:`ask-q`},t.question),o(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":S()},...c),a.text,a.note)});return e.pick=()=>n.every(e=>e.picks.size||e.text.value.trim())?{answers:n.map(e=>K(e.picks,e.text.value,e.note.value))}:void 0,e.first=V(e.el,r,()=>e.send),[...i,o(`div`,{class:`ask-acts`},e.send)]}function B(e){let t=e.asks??(e.ask?[e.ask]:[]),r=t.length>1,i=e.answer,a={key:Z(e),el:o(`section`,{class:`ask`}),note:o(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};i&&((a.send=o(`button`,{type:`button`,class:`ask-send`},M())).onclick=()=>void(a.pick()&&F(a,q(i,a.pick(),crypto.randomUUID()))));let u=e.tool===`secret_drop`,d=o(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${r?l():c()} ${r||!t[0]?``:H(t[0])}`.trim()),f=s&&e.tool!==`secret_drop`&&o(`button`,{type:`button`,class:`cmp-link`},N());f&&(f.onclick=s);let p=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[o(`p`,{class:`ask-why`},x({tool:e.tool}))]:[];return a.el.append(...p,...i&&!u?i.select?L(a,i):z(a,i):[...t.length?t.map(e=>U(e,r)):[o(`p`,{class:`ask-why`},u?n?A():j():e.why??R())],o(`div`,{class:`ask-acts`},u?o(`p`,{class:`ask-term`},c()):d,f)],a.note),a}let J=(t,n)=>{let r=document.activeElement;y&&y!==n&&(y.focus=y.el.contains(r)?r:void 0),[d,y,b]=[t,n,n?.send?n:b],e.replaceChildren(...n?[n.el]:[]),P(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=y&&!y.done?y.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},update(e,t){E=t,e&&(O=void clearTimeout(O)),!e&&(y?.done||y?.sending)?O??=setTimeout(()=>(O=void 0,J()),6e3):e?y&&(Z(e)===y.key||!e.answer&&(y.done||y.sending)&&e.callId===d?.callId)?((y.busy||y.sending)&&!e.answer?y.spell=!0:y.busy&&y.spell&&e.answer&&([y.done,y.busy]=[!1,!1],k(y.note,``,C())),d=e):J(e,b?.key===Z(e)&&!b.done?b:B(e)):J(),P()}}}export{L as n,Q as t};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-Iw_CHyno.css"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{D as t,S as n,d as r,k as i,n as a,p as o}from"./index-CYBMg2XG.js";import{n as s,t as c}from"./views-BCs43dfq.js";var l=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),u=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),d=e=>`context compacted · ${e?.tokens} tokens summarized`,f=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,ee=((t,n={})=>(n.locale??e())===`zh-TW`?f(t):d(t)),te=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,h=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),g=e=>`Image ${e?.n}`,_=e=>`圖片 ${e?.n}`,v=((t,n={})=>(n.locale??e())===`zh-TW`?_(t):g(t)),ne=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),y=e=>`${e?.count} image(s)`,b=e=>`${e?.count} 張圖片`,x=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),re=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),C=e=>`${e?.count} new`,w=e=>`${e?.count} 則新訊息`,T=((t,n={})=>(n.locale??e())===`zh-TW`?w(t):C(t)),ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),P=e=>`Open image ${e?.n}`,F=e=>`打開圖片 ${e?.n}`,oe=((t,n={})=>(n.locale??e())===`zh-TW`?F(t):P(t)),I=e=>`show all (${e?.size})`,L=e=>`顯示全部(${e?.size})`,se=((t,n={})=>(n.locale??e())===`zh-TW`?L(t):I(t)),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),R=e=>`◇ thought · ${e?.count} chars`,z=e=>`◇ 思考 · ${e?.count} 字元`,le=((t,n={})=>(n.locale??e())===`zh-TW`?z(t):R(t)),ue=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),B=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function H(){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?T({count:t}):S()}}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=>o(e.role),me=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,he=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,ge={intercom_message:O,subagent_result:M,subagent_ping:j,subagent_status:N,"pi-loop-monitor":A,"memory-context":k,"doc-review":D},U=e=>{let t=r(`<span class="ava"><svg><use/></svg></span>`);return t.querySelector(`use`).setAttribute(`href`,`#i-${a[e]??e}`),t};function _e(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 W(e,r,{who:a,link:o,docFor:d}){let f=fe(),p=new Map,m=new Set,g=()=>m.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>d?.(e))):e.shown&&m.delete(e)),_=t(`div`,{class:`chat-list`}),y=t(`div`,{class:`chat-top`}),b=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`},ie()),T=t(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":u()},y,_,b,S);e.replaceChildren(T,C);let D=H(),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&&!f.detached&&R()),250)),L=(e=D.button(f.detached))=>(C.hidden=!e,C.textContent=e??``),R=()=>(D.jump(),j=void 0,T.scrollTop=T.scrollHeight,L());async function z(e){O=!0;let t=await de(f,r,e,e=>(J(e),Y(e))).finally(()=>O=!1),n=p.get(e);if(A===e){if(!t||!n)return R();D.hold(),j=n,n.scrollIntoView({block:`center`}),i(n,`lit`),clearTimeout(M),M=window.setTimeout(()=>(j=void 0,n.classList.remove(`lit`)),2e3),L()}}let W=()=>A?void z(A):R(),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=B());t.textContent=r,e.remove()},()=>e.textContent=B())};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:v({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`},ne()))),o.addEventListener(`click`,()=>void n(async()=>{let{lightbox:e}=await import(`./lightbox-B1e5k9CR.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,r))),o}))}function ve(e,n){let r=f.result(e.id),i=t(`pre`,{class:`out`},r?.text??``),a=t(`pre`,{class:`args`},e.args??``),o=e.cut?t(`button`,{class:`more`,type:`button`},ce()):null;o?.addEventListener(`click`,()=>G(o,a,n,t=>(e=>e&&`${e.args??``}${e.cut?`\n${te()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=r?.more?t(`button`,{class:`more`,type:`button`},se({size:he(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&&m.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,x({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,me(e.at));switch(e.kind){case`user`:return t(`article`,{class:`tx you`},t(`header`,null,n,t(`b`,null,V()),U(`user`)),t(`div`,{class:`bubble`},..._e(e.text??``),K(e.id,e.images)));case`assistant`:{let r=a(),i=t(`pre`,{class:`thought-text`}),o=e.thought?t(`button`,{class:`thought`,type:`button`},e.thought<0?ue():le({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&o?.addEventListener(`click`,()=>G(o,i,e.id,e=>e.thoughtText)),t(`article`,{class:`tx in`},U(r.role),t(`div`,{class:`tx-body`},t(`header`,null,t(`b`,null,pe(r)),e.model?t(`span`,null,e.model):null,n,e.stop?t(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),o,i,e.text?t(`div`,{class:`md`},c(s(e.text))):null,e.error?t(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>ve(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`},h({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,U(`comms`),t(`em`,null,re()),ge[e.type??``]?.()??e.type??E(),` `,e.from&&o(e.from)||(e.from??``),n),t(`pre`,null,e.text??``)));case`divider`:return t(`article`,{class:`tx rule`},t(`details`,null,t(`summary`,null,e.type===`compaction`?ee({tokens:(e.tokens??0).toLocaleString()}):l()),t(`pre`,null,e.text??``)));default:return t(`article`,{class:`tx note`},e.text??``,` `,n)}}function J(e){e.rebuild&&(p.clear(),_.replaceChildren());for(let t of e.dropped)p.get(t)?.remove(),p.delete(t);let t=e.added.map(e=>(p.set(e.id,q(e)),p.get(e.id)));e.front?_.prepend(...t):_.append(...t),k&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),w.remove(),f.items.length||_.append(w),y.hidden=!f.before}let Y=e=>e.touched.forEach(e=>{let t=p.get(e),n=f.items.find(t=>t.id===e);if(t&&n){let r=q(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),p.set(e,r)}}),X=async()=>{if(!O&&f.before&&k){O=!0;try{let e=T.scrollHeight,t=f.prepend(await r.older(f.before));J(t),Y(t),T.scrollTop+=T.scrollHeight-e}finally{O=!1}f.before&&T.clientHeight&&y.getBoundingClientRect().bottom>=T.getBoundingClientRect().top&&X()}};C.addEventListener(`click`,()=>{A=void 0,f.detached?r.latest().then(e=>(J(f.reset(e)),R())):R()});let Z=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void X(),{root:T}),new IntersectionObserver(e=>T.clientHeight&&(D.scrolled(e.at(-1).isIntersecting),L()),{root:T,rootMargin:`0px 0px 67px`})],Q,ye=()=>(Q??(Z[0].observe(y),Z[1].observe(S)),clearTimeout(Q),Q=setTimeout(()=>(Q=void 0,Z.forEach(e=>e.disconnect())),600));T.addEventListener(`scroll`,()=>(ye(),!N&&P!==void 0&&I()),{passive:!0}),T.addEventListener(`touchstart`,()=>(N=!0,clearTimeout(P),P=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])T.addEventListener(e,()=>(N=!1,I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])T.addEventListener(e,()=>j=A=void 0,{passive:!0});let $=new ResizeObserver(()=>F()?void 0:D.pinned&&!f.detached?T.scrollTop=T.scrollHeight:j?.scrollIntoView({block:`center`}));return $.observe(_),$.observe(T),{log:T,docs:g,apply(e){if(e.reset)J(f.reset({items:e.items??[],before:e.before})),k=!0,W();else if(e.items?.length){let t=f.append(e.items);J(t),Y(t),D.arrived(t.added.length)&&!f.detached&&!F()?R():L()}},reveal(e){A=e,k&&W()},setLive(e,n){b.dataset.mark=n,b.lastChild?.textContent!==e&&b.replaceChildren(...e?[t(`b`,{class:`badge`}),t(`span`,null,e)]:[])}}}export{W as mountChat,v as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{t}from"./open_main_title-Ccbha5pD.js";import{n,t as r}from"./unit_count-DTUtsZm9.js";import{D as i,P as a,a as o,b as s,d as c,f as l,g as u,h as d,i as f,l as p,m,o as h,p as g,x as _,y as v}from"./index-CYBMg2XG.js";var y=((t={},n={})=>(n.locale??e())===`zh-TW`?`關閉清單`:`Close the list`),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`切換到其他單位`:`Switch to a unit`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`回到主地圖`:`Back to the map`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`所有單位`:`All units`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`指揮中`:`commanding`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`已結束`:`ended`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`錯誤`:`error`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`閒置`:`idle`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`無狀態`:`unknown`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`等待`:`waiting`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`工作中`:`working`),A=.4;function j(e,t,n){let[r,i]=[Math.abs(e),Math.abs(t)];return Math.max(r,i)<10?`wait`:r>=1.7*i&&(n?e<0:e>0)?`drag`:`pass`}var M=(e,t,n)=>Math.abs(n)>=.45?n>0:e>=t*A,N=(e,t)=>t||e.some(e=>e.editable||e.sink||e.scrollsX||[`input`,`textarea`,`select`].includes(e.tag));function P(e){let t=e,n=getComputedStyle(e).overflowX;return{tag:e.tagName.toLowerCase(),editable:t.isContentEditable,sink:e.matches(`.composer, .term-sink`),scrollsX:(n===`auto`||n===`scroll`)&&e.scrollWidth>e.clientWidth+1}}var F=e=>{let t=[];for(let n=e;n;n=n.parentElement)t.push(P(n));return t},I={working:k,waiting:O,idle:E,done:w,error:T,unknown:D,commanding:C},L=(e,t,n)=>(t?w:I[e])({},n&&{locale:n}),R=(e,t)=>t.flatMap(t=>[t,...t.subs.map(e=>({...e,sub:!0}))].map(t=>({id:t.key,key:t.key,ws:e,name:t.name,role:t.role,mark:t.mark,note:t.note,ended:!!t.ended,sub:`sub`in t,control:!!t.control})));function z(e){return e.bases.flatMap(e=>{let t=[{id:`tower`,rows:e.tower?R(e.id,[{...e.tower,role:`tower`}]):[]},...e.tabs.map(t=>({id:t.id,label:a({label:t.label}),rows:R(e.id,t.units)})),{id:`outside`,label:n(),rows:R(e.id,e.outside)}].filter(e=>e.rows.length);return t.length?[{id:e.id,label:e.label,mark:e.mark,groups:t}]:[]})}var B=e=>e.role===`main`&&e.mark===`idle`,V=e=>e.reduce((e,t)=>(t.sub?e.at(-1)?.subs.push(t):e.push({...t,subs:[]}),e),[]),H=()=>c(`<div class="unit"><div class="card"><a class="hit"></a>${f}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><b class="dstate"></b><span class="note"></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button></div><div class="subs"></div></div>`),U=()=>c(`<div class="unit tower-row"><div class="trow"><a class="tower-go">${f}</a><button type="button" class="pair-btn tower-add"></button></div><div class="subs"></div></div>`),W=()=>c(`<section class="dbase"><h3><a></a><small></small></h3><div class="dgroups"></div></section>`),G=()=>c(`<div class="dgroup"><h4></h4><div class="drows"></div></div>`),K=()=>matchMedia(`(max-width: 640px)`).matches;function q(){let e=i(`div`,{class:`drawer-body`}),n=i(`button`,{type:`button`,class:`x`,"aria-label":y()},`×`),a=i(`a`,{class:`drawer-map`},x()),c=i(`button`,{type:`button`,class:`pair-btn`,"data-close":`dismiss-all`,hidden:``}),f=i(`div`,{class:`drawer-top`,hidden:``},c);o(a,{view:`map`});let C=i(`aside`,{class:`drawer`,"aria-label":b()},i(`header`,null,i(`b`,null,S()),n),f,e,i(`footer`,{class:`drawer-foot`},a)),w=i(`div`,{class:`drawer-veil`});document.body.append(w,C);let T,E,D=!1,O=0,k=0,A,P=()=>{_(c,T??{bases:[]}),f.hidden=c.hidden;let n=(e,t)=>{o(e.querySelector(`.hit`),{view:`session`,ws:t.ws,key:t.key}),e.querySelector(`.hit`).setAttribute(`aria-label`,`${t.name}: ${L(t.mark,t.ended)}`),e.classList.toggle(`current`,t.key===E),e.toggleAttribute(`data-dismiss`,t.role===`subagent`&&t.ended),e.dataset.key=t.key,l(e,t.mark),p(e.querySelector(`.plate`),t.role,t.mark),u(e,`.name`,t.name),u(e,`.role`,g(t.role)),u(e,`.dstate`,L(t.mark,t.ended)),m(e,`.note`,t.note,t.mark,t.note?void 0:``);let r=e.querySelector(`:scope > .card > .quit-btn`);B(t)?v(r,t):r.hidden=!0,d(e.querySelector(`.subs`),t.subs??[],H,n)},i=(e,r)=>{let i=e.querySelector(`.tower-go`),a=e.querySelector(`.tower-add`),s=T?.bases.find(e=>e.id===r.ws);o(i,{view:`session`,ws:r.ws,key:r.key}),i.setAttribute(`aria-label`,`${r.name}: ${L(r.mark,r.ended)}`),e.classList.toggle(`current`,r.key===E),e.dataset.key=r.key,l(e,r.mark),p(i.querySelector(`.plate`),`tower`,r.mark),a.hidden=!s,s&&(h(a,s),a.textContent=`+`,a.setAttribute(`aria-label`,t({base:s.label}))),d(e.querySelector(`.subs`),r.subs,H,n)};d(e,z(T??{bases:[]}),W,(e,t)=>{l(e,t.mark),u(e,`h3 a`,t.label),o(e.querySelector(`h3 a`),{view:`workspace`,ws:t.id}),u(e,`small`,r({count:t.groups.reduce((e,t)=>e+t.rows.length,0)})),d(e.querySelector(`.dgroups`),t.groups,G,(e,t)=>{u(e,`h4`,t.label??``),e.querySelector(`h4`).toggleAttribute(`hidden`,!t.label),t.id===`tower`?d(e.querySelector(`.drows`),V(t.rows),U,i):d(e.querySelector(`.drows`),V(t.rows),H,n)})})},I=e=>{O=Math.max(0,Math.min(k,e)),C.style.setProperty(`--dx`,`${O}px`),w.style.opacity=String(k?O/k:0),w.style.pointerEvents=O>0?`auto`:`none`},R=e=>{D=e,C.classList.toggle(`on`,e),C.inert=!e,document.documentElement.classList.remove(`drawer-drag`),I(e?k:0)},q=()=>{k=C.offsetWidth,P(),C.classList.add(`on`),document.documentElement.classList.add(`drawer-drag`)};C.inert=!0,document.addEventListener(`touchstart`,e=>{let t=e.target,n=C.contains(t)||t===w;if(A=void 0,!K()||e.touches.length!==1||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(D?!n:N(F(t),!!getSelection()?.toString())))return;let r=e.touches[0],i=D?t.closest(`.unit[data-dismiss] > .card`)??void 0:void 0;A={x0:r.clientX,y0:r.clientY,mode:`wait`,was:D,base:O,last:r.clientX,at:performance.now(),v:0,card:i}},{passive:!0}),document.addEventListener(`touchmove`,e=>{if(!A||A.mode===`pass`)return;let t=e.touches[0],n=t.clientX-A.x0,r=t.clientY-A.y0;if(A.mode===`wait`){let e=j(n,r,A.was);if(e===`wait`)return;if(e===`pass`&&A.card&&j(n,r,!1)===`drag`)A.mode=`card`,A.card.classList.add(`swiping`);else if(e===`pass`)return void(A.mode=`pass`);else A.mode=`drag`,q()}e.preventDefault();let i=performance.now();if(A.v=(t.clientX-A.last)/Math.max(1,i-A.at),[A.last,A.at]=[t.clientX,i],A.mode!==`card`)return I(A.base+n);let a=Math.max(0,n);A.card.style.setProperty(`--sx`,`${a}px`),A.card.style.setProperty(`--so`,String(1-a/A.card.offsetWidth))},{passive:!1});let J=(e,t)=>{e.classList.remove(`swiping`),e.style.removeProperty(`--sx`),e.style.removeProperty(`--so`),t&&(e.classList.add(`gone`),s({key:e.parentElement.dataset.key}).then(t=>t||e.classList.remove(`gone`)))},Y=e=>{let t=A;A=void 0,t?.mode===`drag`&&R(M(O,k,t.v)),t?.mode===`card`&&J(t.card,e.type===`touchend`&&M(Math.max(0,t.last-t.x0),t.card.offsetWidth,t.v))};return document.addEventListener(`touchend`,Y),document.addEventListener(`touchcancel`,Y),w.addEventListener(`click`,()=>R(!1)),C.addEventListener(`click`,e=>e.target.closest(`a[data-route], button[data-open], .x`)&&R(!1)),document.addEventListener(`keydown`,e=>D&&e.key===`Escape`&&(e.preventDefault(),R(!1)),!0),document.addEventListener(`sb-drawer`,()=>(D||q(),R(!D))),{net(e){T=e,D&&P()},route(e){E=e.view===`session`?e.key:void 0,a.toggleAttribute(`aria-current`,e.view===`map`),D&&P()}}}export{q as mountDrawer};
@@ -0,0 +1 @@
1
+ import{t as e}from"./rolldown-runtime-DK3Fl9T5.js";import{i as t,n,r,t as i}from"./runtime-ZX6HkxDa.js";var a=e=>`${e?.n}d`,o=e=>`${e?.n} 天`,s=((e,t={})=>(t.locale??i())===`zh-TW`?o(e):a(e)),c=e=>`${e?.n}h`,l=e=>`${e?.n} 小時`,u=((e,t={})=>(t.locale??i())===`zh-TW`?l(e):c(e)),d=e=>`${e?.n}m`,f=e=>`${e?.n} 分`,p=((e,t={})=>(t.locale??i())===`zh-TW`?f(e):d(e)),m=e=>`${e?.n}s`,h=e=>`${e?.n} 秒`,g=((e,t={})=>(t.locale??i())===`zh-TW`?h(e):m(e)),ee=((e={},t={})=>(t.locale??i())===`zh-TW`?`警示`:`Alerts`),te=((e={},t={})=>(t.locale??i())===`zh-TW`?`所有基地`:`all bases`),ne=e=>`${e?.team} · teammate`,re=e=>`${e?.team} · 隊友`,ie=((e,t={})=>(t.locale??i())===`zh-TW`?re(e):ne(e)),ae=((e={},t={})=>(t.locale??i())===`zh-TW`?``:`.`),oe=((e={},t={})=>(t.locale??i())===`zh-TW`?`最後更新:`:`Last update`),se=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,ce=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,le=((e,t={})=>(t.locale??i())===`zh-TW`?ce(e):se(e)),ue=e=>`The server is up but cannot read the net: ${e?.problem}`,de=e=>`伺服器正常,但讀不到網:${e?.problem}`,fe=((e,t={})=>(t.locale??i())===`zh-TW`?de(e):ue(e)),pe=((e={},t={})=>(t.locale??i())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),me=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,he=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,ge=((e,t={})=>(t.locale??i())===`zh-TW`?he(e):me(e)),_e=((e={},t={})=>(t.locale??i())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),ve=((e={},t={})=>(t.locale??i())===`zh-TW`?`取消`:`Cancel`),ye=((e={},t={})=>(t.locale??i())===`zh-TW`?`關閉`:`Close`),be=e=>`Quit base ${e?.name}`,xe=e=>`關掉基地 ${e?.name}`,Se=((e,t={})=>(t.locale??i())===`zh-TW`?xe(e):be(e)),Ce=e=>`Quit base ${e?.name}? Every agent in it and its tower quit. Nothing quits while anything running would be lost.`,we=e=>`要關掉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。有會遺失的東西時什麼都不關。`,Te=((e,t={})=>(t.locale??i())===`zh-TW`?we(e):Ce(e)),Ee=e=>`Quit squad ${e?.name}`,De=e=>`關掉小隊 ${e?.name}`,Oe=((e,t={})=>(t.locale??i())===`zh-TW`?De(e):Ee(e)),ke=e=>`Quit squad ${e?.name}? Every agent in it quits.`,Ae=e=>`要關掉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,je=((e,t={})=>(t.locale??i())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Quit the tower ${e?.name}? The base's mains become members again.`,Ne=e=>`要關掉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Pe=((e,t={})=>(t.locale??i())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Quit ${e?.name}`,Ie=e=>`關掉 ${e?.name}`,Le=((e,t={})=>(t.locale??i())===`zh-TW`?Ie(e):Fe(e)),Re=e=>`Quit ${e?.name}? It quits pi and its pane closes.`,ze=e=>`要關掉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Be=((e,t={})=>(t.locale??i())===`zh-TW`?ze(e):Re(e)),Ve=e=>`control tower · ${e?.state}`,He=e=>`塔台 · ${e?.state}`,Ue=((e,t={})=>(t.locale??i())===`zh-TW`?He(e):Ve(e)),We=((e={},t={})=>(t.locale??i())===`zh-TW`?`圖示來自 game-icons.net(Lorc、Delapouite),CC BY 3.0。`:`Icons from game-icons.net by Lorc and Delapouite, CC BY 3.0.`),Ge=((e={},t={})=>(t.locale??i())===`zh-TW`?`移除`:`Dismiss`),Ke=e=>`Dismiss finished (${e?.count})`,qe=e=>`移除已完成(${e?.count})`,Je=((e,t={})=>(t.locale??i())===`zh-TW`?qe(e):Ke(e)),Ye=e=>`Dismiss ${e?.name}`,Xe=e=>`從畫面移除 ${e?.name}`,Ze=((e,t={})=>(t.locale??i())===`zh-TW`?Xe(e):Ye(e)),Qe=((e={},t={})=>(t.locale??i())===`zh-TW`?`文件`:`Documents`),$e=((e={},t={})=>(t.locale??i())===`zh-TW`?`總塔台`:`head tower`),et=((e={},t={})=>(t.locale??i())===`zh-TW`?`語言`:`Language`),tt=e=>`${e?.label} (${e?.short}) asks you to confirm a ${e?.tool} call from its tower`,nt=e=>`${e?.label}(${e?.short})請你確認它塔台的一次 ${e?.tool} 呼叫`,rt=((e,t={})=>(t.locale??i())===`zh-TW`?nt(e):tt(e)),it=e=>`Team ${e?.team} stopped: ${e?.reason}`,at=e=>`團隊 ${e?.team} 已停止:${e?.reason}`,ot=((e,t={})=>(t.locale??i())===`zh-TW`?at(e):it(e)),st=e=>`${e?.count} message has waited more than 10 minutes for an idle tower in team ${e?.team}`,ct=e=>`團隊 ${e?.team} 有 ${e?.count} 則訊息已等了超過 10 分鐘,塔台一直不閒`,lt=((e,t={})=>(t.locale??i())===`zh-TW`?ct(e):st(e)),ut=e=>`${e?.count} message waiting in the inbox of team ${e?.team}: no tower is open on its project`,dt=e=>`團隊 ${e?.team} 的收件匣有 ${e?.count} 則訊息在等:專案上沒有開著的塔台`,ft=((e,t={})=>(t.locale??i())===`zh-TW`?dt(e):ut(e)),pt=e=>`${e?.label} (${e?.short}) asks to join team ${e?.team}`,mt=e=>`${e?.label}(${e?.short})要求加入團隊 ${e?.team}`,ht=((e,t={})=>(t.locale??i())===`zh-TW`?mt(e):pt(e)),gt=e=>`${e?.label} (${e?.short}), an unattended device, asks to join team ${e?.team}`,_t=e=>`${e?.label}(${e?.short})是無人值守的裝置,要求加入團隊 ${e?.team}`,vt=((e,t={})=>(t.locale??i())===`zh-TW`?_t(e):gt(e)),yt=e=>`${e?.label} (${e?.short}) shows another roster than this computer in team ${e?.team}; the relay may be showing different rosters`,bt=e=>`團隊 ${e?.team} 中,${e?.label}(${e?.short})顯示的名冊和這台電腦不同;中繼站可能對不同人顯示不同名冊`,xt=((e,t={})=>(t.locale??i())===`zh-TW`?bt(e):yt(e)),St=e=>`The relay of team ${e?.team} has been unreachable for ${e?.minutes} minutes`,Ct=e=>`團隊 ${e?.team} 的中繼站已經 ${e?.minutes} 分鐘連不上`,wt=((e,t={})=>(t.locale??i())===`zh-TW`?Ct(e):St(e)),Tt=e=>`Link ${e?.count}`,Et=e=>`連線 ${e?.count}`,Dt=((e,t={})=>(t.locale??i())===`zh-TW`?Et(e):Tt(e)),Ot=((e={},t={})=>(t.locale??i())===`zh-TW`?`Straw Link 通知`:`Straw Link notices`),kt=((e={},t={})=>(t.locale??i())===`zh-TW`?`允許`:`Allow`),At=((e={},t={})=>(t.locale??i())===`zh-TW`?`團隊`:`Teams`),jt=((e={},t={})=>(t.locale??i())===`zh-TW`?`Straw Link:跨電腦的團隊`:`Straw Link: teams across computers`),Mt=((e={},t={})=>(t.locale??i())===`zh-TW`?`連線中`:`connecting`),Nt=((e={},t={})=>(t.locale??i())===`zh-TW`?`拒絕`:`Deny`),Pt=((e={},t={})=>(t.locale??i())===`zh-TW`?`即時`:`live`),Ft=((e={},t={})=>(t.locale??i())===`zh-TW`?`尚未見到`:`not seen yet`),It=((e={},t={})=>(t.locale??i())===`zh-TW`?`離線`:`offline`),Lt=((e={},t={})=>(t.locale??i())===`zh-TW`?`在線`:`online`),Rt=((e={},t={})=>(t.locale??i())===`zh-TW`?`開啟團隊`:`Open Teams`),zt=((e={},t={})=>(t.locale??i())===`zh-TW`?`重新連線中`:`reconnecting`),Bt=((e={},t={})=>(t.locale??i())===`zh-TW`?`查看`:`Review`),Vt=e=>`seen ${e?.ago} ago`,Ht=e=>`${e?.ago}前見到`,Ut=((e,t={})=>(t.locale??i())===`zh-TW`?Ht(e):Vt(e)),Wt=((e={},t={})=>(t.locale??i())===`zh-TW`?`正體中文`:`English`),Gt=((e={},t={})=>(t.locale??i())===`zh-TW`?`位置`:`Location`),Kt=e=>`${e?.name} is commanding`,qt=e=>`${e?.name} 指揮中`,Jt=((e,t={})=>(t.locale??i())===`zh-TW`?qt(e):Kt(e)),Yt=e=>`${e?.name} finished`,Xt=e=>`${e?.name} 已完成`,Zt=((e,t={})=>(t.locale??i())===`zh-TW`?Xt(e):Yt(e)),Qt=e=>`${e?.name} hit an error`,$t=e=>`${e?.name} 發生錯誤`,en=((e,t={})=>(t.locale??i())===`zh-TW`?$t(e):Qt(e)),tn=e=>`${e?.name} went idle`,nn=e=>`${e?.name} 轉為閒置`,rn=((e,t={})=>(t.locale??i())===`zh-TW`?nn(e):tn(e)),an=e=>`${e?.name} joined`,on=e=>`${e?.name} 加入`,sn=((e,t={})=>(t.locale??i())===`zh-TW`?on(e):an(e)),cn=e=>`${e?.name} left`,ln=e=>`${e?.name} 離開`,un=((e,t={})=>(t.locale??i())===`zh-TW`?ln(e):cn(e)),dn=e=>`${e?.name} lost its status`,fn=e=>`${e?.name} 失去狀態`,pn=((e,t={})=>(t.locale??i())===`zh-TW`?fn(e):dn(e)),mn=e=>`${e?.name} is waiting on a question`,hn=e=>`${e?.name} 正在等待回答`,gn=((e,t={})=>(t.locale??i())===`zh-TW`?hn(e):mn(e)),_n=e=>`${e?.name} started working`,vn=e=>`${e?.name} 開始工作`,yn=((e,t={})=>(t.locale??i())===`zh-TW`?vn(e):_n(e)),bn=((e={},t={})=>(t.locale??i())===`zh-TW`?`指揮中`:`commanding`),_=((e={},t={})=>(t.locale??i())===`zh-TW`?`已完成`:`finished`),xn=((e={},t={})=>(t.locale??i())===`zh-TW`?`錯誤`:`error`),v=((e={},t={})=>(t.locale??i())===`zh-TW`?`閒置`:`idle`),Sn=((e={},t={})=>(t.locale??i())===`zh-TW`?`無狀態`:`no status`),y=((e={},t={})=>(t.locale??i())===`zh-TW`?`等待回答`:`waiting on a question`),Cn=((e={},t={})=>(t.locale??i())===`zh-TW`?`工作中`:`working`),wn=((e={},t={})=>(t.locale??i())===`zh-TW`?`地圖總覽`:`Overview of the map`),Tn=e=>`Monitor failed: ${e?.what}`,En=e=>`Monitor 出錯:${e?.what}`,Dn=((e,t={})=>(t.locale??i())===`zh-TW`?En(e):Tn(e)),On=e=>`Monitor went quiet and stopped: ${e?.what}`,kn=e=>`Monitor 太久沒輸出,已停止:${e?.what}`,An=((e,t={})=>(t.locale??i())===`zh-TW`?kn(e):On(e)),jn=((e={},t={})=>(t.locale??i())===`zh-TW`?`從未`:`never`),Mn=((e={},t={})=>(t.locale??i())===`zh-TW`?`+新基地`:`+ New base`),Nn=((e={},t={})=>(t.locale??i())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),Pn=((e={},t={})=>(t.locale??i())===`zh-TW`?`無警示`:`no alerts`),b=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),Fn=((e={},t={})=>(t.locale??i())===`zh-TW`?`尚無塔台`:`no tower yet`),In=((e={},t={})=>(t.locale??i())===`zh-TW`?`監看中`:`Watching a monitor`),Ln=((e={},t={})=>(t.locale??i())===`zh-TW`?`思考中`:`thinking`),Rn=e=>`Finished ${e?.note}`,zn=e=>`完成了 ${e?.note}`,Bn=((e,t={})=>(t.locale??i())===`zh-TW`?zn(e):Rn(e)),Vn=e=>`Failed ${e?.note}`,Hn=e=>`出錯了 ${e?.note}`,Un=((e,t={})=>(t.locale??i())===`zh-TW`?Hn(e):Vn(e)),Wn=e=>`Waiting on you ${e?.note}`,Gn=e=>`等你回答 ${e?.note}`,Kn=((e,t={})=>(t.locale??i())===`zh-TW`?Gn(e):Wn(e)),qn=((e={},t={})=>(t.locale??i())===`zh-TW`?`+主智慧體`:`+ Main`),Jn=((e={},t={})=>(t.locale??i())===`zh-TW`?`+成員`:`+ Member`),Yn=((e={},t={})=>(t.locale??i())===`zh-TW`?`前哨`:`Outposts`),Xn=((e={},t={})=>(t.locale??i())===`zh-TW`?`手機`:`Phone`),Zn=((e={},t={})=>(t.locale??i())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),Qn=((e={},t={})=>(t.locale??i())===`zh-TW`?`接回`:`Pop`),$n=e=>`Pop ${e?.name}`,er=e=>`接回 ${e?.name}`,tr=((e,t={})=>(t.locale??i())===`zh-TW`?er(e):$n(e)),nr=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),rr=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),x=((e={},t={})=>(t.locale??i())===`zh-TW`?`關掉`:`Quit`),ir=((e={},t={})=>(t.locale??i())===`zh-TW`?`關掉塔台`:`Quit tower`),ar=e=>`Refused (${e?.status}).`,or=e=>`已拒絕(${e?.status})。`,S=((e,t={})=>(t.locale??i())===`zh-TW`?or(e):ar(e)),sr=((e={},t={})=>(t.locale??i())===`zh-TW`?`提醒`:`Remind`),cr=((e={},t={})=>(t.locale??i())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),lr=((e={},t={})=>(t.locale??i())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),ur=((e={},t={})=>(t.locale??i())===`zh-TW`?`提醒已關`:`Reminders off`),dr=((e={},t={})=>(t.locale??i())===`zh-TW`?`提醒已開:分頁不在前景時,單位等你回答、完成或出錯會跳系統通知`:`Reminders on: while the page is in the background, a unit waiting on you, finishing, or failing raises a system notification`),fr=((e={},t={})=>(t.locale??i())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),pr=((e={},t={})=>(t.locale??i())===`zh-TW`?`主智慧體`:`main`),mr=((e={},t={})=>(t.locale??i())===`zh-TW`?`成員`:`member`),hr=((e={},t={})=>(t.locale??i())===`zh-TW`?`前哨`:`outpost`),gr=((e={},t={})=>(t.locale??i())===`zh-TW`?`未編入`:`unaligned`),_r=((e={},t={})=>(t.locale??i(),`session`)),vr=((e={},t={})=>(t.locale??i())===`zh-TW`?`子智慧體`:`subagent`),yr=((e={},t={})=>(t.locale??i())===`zh-TW`?`塔台`:`tower`),br=((e={},t={})=>(t.locale??i())===`zh-TW`?`設定`:`Settings`),xr=((e={},t={})=>(t.locale??i())===`zh-TW`?`音效`:`Sound`),Sr=((e={},t={})=>(t.locale??i())===`zh-TW`?`音效已關`:`Sounds off`),Cr=((e={},t={})=>(t.locale??i())===`zh-TW`?`音效已開`:`Sounds on`),wr=((e={},t={})=>(t.locale??i())===`zh-TW`?`音效:開關、音量與試聽`:`Sounds: on or off, volume, and a try`),Tr=((e={},t={})=>(t.locale??i())===`zh-TW`?`▶ 試聽`:`▶ Try`),Er=((e={},t={})=>(t.locale??i())===`zh-TW`?`音量`:`Volume`),Dr=((e={},t={})=>(t.locale??i())===`zh-TW`?`收起`:`Stash`),Or=e=>`Stash base ${e?.name}`,kr=e=>`收起基地 ${e?.name}`,Ar=((e,t={})=>(t.locale??i())===`zh-TW`?kr(e):Or(e)),jr=e=>`Stash base ${e?.name}? Its tower, mains, and members quit and come back with Pop. Nothing is stashed while anything running would be lost.`,Mr=e=>`要收起基地 ${e?.name} 嗎?塔台、主智慧體和成員會結束,之後可以用「接回」叫回來。有會遺失的東西時不會收。`,Nr=((e,t={})=>(t.locale??i())===`zh-TW`?Mr(e):jr(e)),Pr=e=>`Stashed (${e?.count})`,Fr=e=>`已收起(${e?.count})`,Ir=((e,t={})=>(t.locale??i())===`zh-TW`?Fr(e):Pr(e)),Lr=((e={},t={})=>(t.locale??i())===`zh-TW`?`智慧體`:`Agents`),Rr=((e={},t={})=>(t.locale??i())===`zh-TW`?`基地`:`Bases`),zr=((e={},t={})=>(t.locale??i())===`zh-TW`?`指揮中`:`Commanding`),Br=((e={},t={})=>(t.locale??i())===`zh-TW`?`等待中`:`Waiting`),Vr=((e={},t={})=>(t.locale??i())===`zh-TW`?`工作中`:`Working`),Hr=((e={},t={})=>(t.locale??i())===`zh-TW`?`狀態`:`States`),Ur=e=>`tab ${e?.label}`,Wr=e=>`分頁 ${e?.label}`,Gr=((e,t={})=>(t.locale??i())===`zh-TW`?Wr(e):Ur(e)),Kr=((e={},t={})=>(t.locale??i())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),qr=((e={},t={})=>(t.locale??i())===`zh-TW`?`網路活動`:`Net activity`),Jr=((e={},t={})=>(t.locale??i())===`zh-TW`?`伺服器啟動後還沒有動靜`:`Nothing has happened since the server started`),Yr=((e={},t={})=>(t.locale??i())===`zh-TW`?`現在`:`now`),Xr=e=>`${e?.count} events in 30 min`,Zr=e=>`近 30 分鐘 ${e?.count} 筆`,Qr=((e,t={})=>(t.locale??i())===`zh-TW`?Zr(e):Xr(e)),$r=((e={},t={})=>(t.locale??i())===`zh-TW`?`網的總計`:`Net totals`),ei=((e={},t={})=>(t.locale??i())===`zh-TW`?`有智慧體等你同意,才能載入資料夾的設定`:`An agent needs your OK to load a folder's settings`),ti=e=>`using ${e?.tool}`,ni=e=>`使用 ${e?.tool}`,ri=((e,t={})=>(t.locale??i())===`zh-TW`?ni(e):ti(e)),ii=`sb-locale`;function ai(e){let n=/^zh\b/i.test(e)&&(/-(hant|tw|hk|mo)\b/i.test(e)?`zh-TW`:/-(hans|cn|sg|my)\b/i.test(e)?`zh-CN`:void 0);return t(e)??(n?t(n):void 0)??t(e.split(`-`)[0])}function oi(e,n){return t(e)??n.map(ai).find(Boolean)??`en`}var si={brand_label:_e,tagline:Kr,totals_label:$r,stat_bases:Rr,stat_agents:Lr,stat_working:Vr,stat_waiting:Br,stat_commanding:zr,mark_commanding:bn,alerts:ee,no_alerts:Pn,pair_button:Xn,pair_title:Zn,link_connecting:Mt,location:Gt,all_bases:te,documents:Qe,timeline:qr,states:Hr,mark_working:Cn,mark_waiting:y,mark_idle:v,mark_done:_,mark_error:xn,credit:We,language:et,settings:br,new_base:Mn,link_button:At,link_button_title:jt};Object.keys(si);function ci(){let e=null;try{e=localStorage.getItem(ii)}catch{}let t=oi(e,navigator.languages??[navigator.language]);r(()=>t),document.documentElement.lang=t;let i={m:(e,t)=>e.textContent=t,mLabel:(e,t)=>e.setAttribute(`aria-label`,t),mTitle:(e,t)=>e.title=t,mEmpty:(e,t)=>e.dataset.empty=t};for(let e of document.querySelectorAll(`[data-m], [data-m-label], [data-m-title], [data-m-empty]`))for(let[t,n]of Object.entries(i))e.dataset[t]&&n(e,si[e.dataset[t]]?.()??e.dataset[t]);let a=document.getElementById(`lang`);a.replaceChildren(...n.map(e=>new Option(Wt({},{locale:e}),e,!1,e===t))),a.onchange=()=>{try{localStorage.setItem(ii,a.value),location.reload()}catch{a.value=t}}}var li=new Set,ui=e=>e.unit??e.key,di=e=>e.mark===`waiting`||e.pending?0:1;function fi(e,t){let n=new Map;for(let r of e.bases)for(let e of[...r.tower?[{...r.tower,role:`tower`},...r.tower.subs]:[],...[...r.tabs.flatMap(e=>e.units),...r.outside].flatMap(e=>[e,...e.subs])]){n.set(e.key,{key:e.key,ws:r.id,name:e.name,role:e.role,mark:e.mark,note:e.note,at:t,pending:e.pending,closed:!e.control||!!e.ended});for(let i of e.monitors??[])(i.status===`error`||i.status===`stale`)&&(a=>n.set(a,{key:a,unit:e.key,ws:r.id,name:e.name,role:e.role,mark:`error`,note:`monitor:${i.status}:${i.what}`,at:t}))(`${e.key}\u001fmonitor:${i.id}:${i.at}`)}for(let r of e.trust??[])r.opening&&li.has(r.opening)||(e=>n.set(e,{key:e,ws:``,name:r.folder.split(/[\\/]/).filter(Boolean).at(-1)??r.folder,role:r.agents[0]?.role??`none`,mark:`waiting`,at:t,trust:r}))(`trust\u001f${r.folder}\u001f${r.digest}`);return n}function pi(e,t){return[...t.values()].filter(t=>{let n=e?.get(t.key);return di(t)===0?!n||di(n)!==0||n.mark!==t.mark:e!==void 0&&n?.mark!==t.mark&&(t.mark===`error`||t.mark===`done`)})}var mi=`input, textarea, select, [role=textbox], [role=combobox], [role=listbox], .term-scroll`,hi=`button, a, summary, [role=button], [role=link]`,gi=`.ask-opt, [role=radio], [role=checkbox]`,_i=`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`;function vi(e,t,n=!1){if(t||e.defaultPrevented||e.isComposing||e.ctrlKey||e.altKey||e.metaKey)return;let r=e.target;if(!(r?.isContentEditable||r?.closest?.(mi))){if(e.key===`f`||e.key===`F`)return`zoom`;if(e.key===` `&&!r?.closest?.(gi)&&(n||!r?.closest?.(hi)))return`next`}}function yi(e,t=()=>document.querySelector(_i)!==null,n=window){let r,i=!1,a=null;n.addEventListener(`pointerdown`,()=>i=!0,!0),n.addEventListener(`focusin`,e=>a=i?e.target:null,!0),n.addEventListener(`keydown`,n=>{let o=n.target===a;i=!1;let s=vi(n,t(),o);if(s){if(n.repeat)return r===s?n.preventDefault():void 0;e(s)&&(r=s,n.preventDefault())}}),n.addEventListener(`keyup`,e=>{r===`next`&&e.key===` `&&e.preventDefault(),r=void 0})}var bi=(...e)=>e.filter(e=>e!==!1&&e!=null),xi=(e,t)=>(e.classList.add(t),e.classList.toggle(`flip`));function C(e,t,...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t??{}))r.setAttribute(e,n);return r.append(...bi(...n)),r}var w=e=>String(e??``);function Si(e){let t=e.data,n=e.teamName;switch(e.kind){case`join-request`:return t.unattended?vt({label:w(t.label),short:w(t.short),team:n}):ht({label:w(t.label),short:w(t.short),team:n});case`confirm`:return rt({label:w(t.label),short:w(t.short),tool:w(t.tool)});case`fork`:return ot({team:n,reason:w(t.reason)});case`mismatch`:return xt({label:w(t.label),short:w(t.short),team:n});case`unreachable`:return wt({team:n,minutes:w(t.minutes)});case`inbox`:return ft({count:w(t.count),team:n});case`held`:return lt({count:w(t.count),team:n})}}var Ci=e=>{let t={error:0,warning:1,info:2};return[...e].sort((e,n)=>t[e.level]-t[n.level])};function wi(e){let t=Math.max(0,Math.ceil(e/1e3)),n=e=>String(e).padStart(2,`0`);return t>=3600?`${Math.floor(t/3600)}:${n(Math.floor(t/60)%60)}:${n(t%60)}`:`${Math.floor(t/60)}:${n(t%60)}`}function Ti(e,t){if(e===null)return Ft();if(t)return Lt();let n=Math.floor(e/1e3);return Ut({ago:n<3600?p({n:String(Math.max(1,Math.floor(n/60)))}):n<86400?u({n:String(Math.floor(n/3600))}):s({n:String(Math.floor(n/86400))})})}function Ei(e){return e.online?e.tower===`blocked`?`waiting`:e.tower===`working`?`working`:e.tower===`unknown`?`unknown`:`idle`:`unknown`}function Di(e){switch(e){case`working`:return Cn();case`blocked`:return y();case`idle`:return v();case`done`:return _();case`unknown`:return Sn();default:return e}}var Oi=e({post:()=>ji,sendFile:()=>Ai}),ki=()=>document.querySelector(`meta[name="sb-csrf"]`)?.content??``,Ai=(e,t)=>fetch(`api/${e}`,{method:`POST`,cache:`no-store`,headers:{"content-type":`application/octet-stream`,"x-sb-name":encodeURIComponent(t.name||`pasted`),"x-sb-csrf":ki()},body:t}).then(async e=>({ok:e.ok,status:e.status,body:await e.json().catch(()=>({}))})),ji=(e,t)=>fetch(`api/${e}`,{method:`POST`,cache:`no-store`,headers:{"content-type":`application/json`,"x-sb-csrf":ki()},body:JSON.stringify(t)}).then(async e=>({ok:e.ok,status:e.status,body:await e.json().catch(()=>({}))})),Mi=3e4,Ni=[`pointermove`,`pointerdown`,`keydown`,`wheel`,`touchstart`];function Pi(e=document.documentElement){if(matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=Date.now(),n,r=()=>{let i=t+Mi-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,Mi))};for(let e of Ni)addEventListener(e,i,{capture:!0,passive:!0});document.addEventListener(`visibilitychange`,()=>document.hidden||i()),i()}var Fi=140;function Ii(e,t){let n=document.createElement(`nav`),r=document.createElement(`div`),i=document.createElement(`i`);[n.className,r.className,i.className,n.hidden]=[`minimap`,`mm-in`,`mm-view`,!0],n.setAttribute(`aria-label`,wn()),n.append(r,i),document.body.append(n);let a=1,o=0,s=()=>{o=0;let t=e.getBoundingClientRect();i.style.transform=`translateY(${Math.round(Math.max(0,-t.top)*a)}px)`,i.style.height=`${Math.round(Math.min(innerHeight-Math.max(0,t.top),t.bottom)*a)}px`,n.classList.toggle(`away`,t.bottom<innerHeight)},c=()=>{let i=e.getBoundingClientRect();n.hidden=e.hidden||i.height<innerHeight*1.05||!matchMedia(`(min-width: 900px) and (hover: hover)`).matches,!n.hidden&&(a=Math.min(Fi/i.width,innerHeight*.4/i.height),Object.assign(n.style,{width:`${Math.round(i.width*a)}px`,height:`${Math.round(i.height*a)}px`}),r.replaceChildren(...[...t.querySelectorAll(`:scope > .base:not(.leaving)`)].map(e=>{let t=e.getBoundingClientRect(),n=document.createElement(`i`);return n.dataset.mark=e.dataset.mark??`idle`,n.style.cssText=`left:${(t.left-i.left)*a}px;top:${(t.top-i.top)*a}px;width:${t.width*a}px;height:${t.height*a}px`,n})),s())};return addEventListener(`scroll`,()=>o||=requestAnimationFrame(s),{passive:!0}),addEventListener(`resize`,c),n.addEventListener(`click`,t=>{let n=e.getBoundingClientRect(),i=(t.clientY-r.getBoundingClientRect().top)/a;scrollTo({top:n.top+scrollY+i-innerHeight/2,behavior:matchMedia(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`})}),c}function Li({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 Ri(e,t){if(t||!e.length)return[];let n=document.createElement(`style`);return n.textContent=e.map((e,t)=>`@keyframes pk${t}{${Li(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 zi=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Bi=function(e,t){return new URL(e,t).href},Vi={},Hi=function(e){return e.pathname.endsWith(`.css`)},Ui=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},T=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=Bi(t,n);let r=s(t),i=Hi(r);return Ui(Vi,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`:zi,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 E(e,t,n,r,i=!1){Object.assign(e.dataset,t),[e.hidden,e.textContent]=[i,n],r&&e.setAttribute(`aria-label`,r)}var Wi=(e,t)=>t.role===`subagent`&&t.ended&&t.key?E(e,{close:`dismiss`,key:t.key,name:t.name,role:t.role},Ge(),Ze({name:t.name})):E(e,{close:`unit`,key:t.key??``,name:t.name,role:t.role},x(),Le({name:t.name}),!(t.control&&t.key)||t.role===`subagent`),Gi=(e,t)=>E(e,{key:t?.key??``,name:t?.name??``,role:`tower`},ir(),void 0,!t?.control);function Ki(e,t){e.dataset.close=`unit`,t?.u.role===`tower`&&t.base.tower?.key===t.u.key?Gi(e,t.base.tower):t&&Wi(e,t.u),e.hidden=!t||e.dataset.close!==`unit`||e.hidden}var qi=(e,t)=>E(e,{ws:t.id,name:t.label},x(),Se({name:t.label})),Ji=(e,t)=>E(e,{ws:t.id,name:t.label},Dr(),Ar({name:t.label})),Yi=(e,t,n)=>E(e,{ws:t.id,name:n.label,tab:n.id},x(),Oe({name:n.label})),D=(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(ve(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(ye(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()}),Xi=e=>e.bases.flatMap(e=>[...e.tower?[e.tower]:[],...e.tabs.flatMap(e=>e.units),...e.outside]).flatMap(e=>e.subs).filter(e=>e.ended).map(e=>e.key);function Zi(e,t){let n=Xi(t).length;e.hidden=!n,n&&(e.textContent=Je({count:n}))}function Qi(e,t,n){let r=n.stashed??[],i=JSON.stringify(r);e.hidden=!r.length;let a=t.closest(`[popover]`);!r.length&&a?.matches(`:popover-open`)&&a.hidePopover(),r.length&&(e.textContent=Ir({count:r.length})),t.dataset.key!==i&&(t.dataset.key=i,t.replaceChildren(...r.map(e=>{let t=document.createElement(`li`),n=document.createElement(`span`),r=document.createElement(`button`);return n.textContent=e.name===e.label?e.label:`${e.name} (${e.label})`,[r.type,r.className]=[`button`,`pair-btn`],E(r,{close:`pop`,name:e.name},Qn(),tr({name:e.name})),t.append(n,r),t})))}var $i=e=>T(async()=>{let{post:e}=await Promise.resolve().then(()=>Oi);return{post:e}},void 0,import.meta.url).then(({post:t})=>t(`dismiss`,e)).then(e=>e.ok||(D(e.body.reason??S({status:e.status})),!1),()=>(D(b()),!1));function ea(e,{route:t,net:n,go:r}){let i=t();if(i.view===`map`)return;if(e.close===`base`||e.close===`stash`)return void(i.ws===e.ws&&r({view:`map`}));let a=e=>e.flatMap(e=>[e.key,...a(e.subs)]),o=e.close===`tab`&&i.ws===e.ws?n()?.bases.find(t=>t.id===e.ws)?.tabs.find(t=>t.id===e.tab):void 0;i.view===`session`&&(e.close===`unit`?i.key===e.key:o&&a(o.units).includes(i.key))&&r({view:`workspace`,ws:i.ws})}function ta(e){document.addEventListener(`click`,t=>{let n=t.target?.closest?.(`button[data-close]`),r=n?.dataset;if(n&&r){if(t.preventDefault(),r.close===`dismiss`||r.close===`dismiss-all`)return void $i(r.close===`dismiss`?{key:r.key}:{all:!0});if(r.close===`pop`)return void(n.toggleAttribute(`disabled`,!0),Promise.all([T(()=>Promise.resolve().then(()=>Oi),void 0,import.meta.url),T(()=>import(`./refusal--wJ5SRx-.js`).then(e=>e.n),[],import.meta.url)]).then(([{post:e},{reasonOf:t}])=>e(`close/pop`,{name:r.name}).then(e=>e.ok||D(t(e.body.reason,e.body.settings)??S({status:e.status})))).catch(()=>D(b())).finally(()=>n.toggleAttribute(`disabled`,!1)));D((r.close===`stash`?Nr:r.close===`base`?Te:r.close===`tab`?je:r.role===`tower`?Pe:Be)({name:r.name??``}),r.close===`stash`?Dr():x()).then(t=>{t&&(n.toggleAttribute(`disabled`,!0),T(async()=>{let{post:e}=await Promise.resolve().then(()=>Oi);return{post:e}},void 0,import.meta.url).then(({post:e})=>e(`close/${r.close===`base`?`all`:r.close}`,r.close===`unit`?{key:r.key}:{workspace:r.ws,...r.tab&&{tab:r.tab}})).then(t=>t.ok?ea(r,e):D(t.body.reason??S({status:t.status})),()=>D(b())).finally(()=>n.toggleAttribute(`disabled`,!1)))})}})}var na=e=>{try{return decodeURIComponent(e)}catch{return e}},ra=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function ia(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(na);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 O=e=>e.view===`map`?``:e.view===`workspace`?`w/${ra(e.ws)}`:`w/${ra(e.ws)}/s/${ra(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,aa=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},oa=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null,sa=e=>Math.max(0,e?.depth||0);function ca(e,t=new URL(document.baseURI).pathname){let n=()=>ia(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>O(e)||`./`,go(n){let r=t+O(n);location.pathname+location.search!==r&&history.pushState({depth:sa(history.state)+1},``,r),e(n)}};return addEventListener(`popstate`,()=>e(n())),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-route]`);!t||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),t.hasAttribute(`data-back`)&&sa(history.state)>0?history.back():r.go(ia(t.getAttribute(`data-route`))))}),r}var la={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},ua={commanding:bn,working:Cn,waiting:y,idle:v,done:_,error:xn,unknown:Sn},da={main:pr,member:mr,subagent:vr,tower:yr,outpost:hr,outside:gr,session:_r},fa={thinking:Ln,"watching a monitor":In,idle:v,"waiting on a question":y,finished:_},pa={claude:`Claude`,codex:`Codex`},ma=e=>Object.hasOwn(da,e)?da[e]():e,ha=e=>e===`waiting`||e===`error`,k=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)},A=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},j=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},M=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&xi(e,`flash`)},ga=e=>(t=>(e.slice(8,t)===`stale`?An:Dn)({what:e.slice(t+1)}))(e.indexOf(`:`,8)),N=(e,t)=>e?e.startsWith(`tool:`)?ri({tool:e.slice(5)}):e.startsWith(`monitor:`)?ga(e):Object.hasOwn(fa,e)?fa[e]():e:ua[t](),_a=(e,t,n,r,i=N(n,r))=>{j(e,t,i),e.querySelector(t).toggleAttribute(`data-monitoring`,i===N(n,r)&&n===`watching a monitor`)},P=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,O(t)||`./`),e.setAttribute(`data-route`,O(t)))},F=(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`},va=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function ya(e,t,n,r){M(e,n);let i=e.querySelector(`use`),a=`#i-${la[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 I(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 ba=(e,t=Math.max(0,Date.now()-e)/1e3)=>t<60?g({n:String(Math.floor(t))}):t<3600?p({n:String(Math.floor(t/60))}):t<86400?u({n:String(Math.floor(t/3600))}):s({n:String(Math.floor(t/86400))}),xa=(e,t)=>(t===void 0?delete e.dataset.since:e.dataset.since=String(t),e.textContent=t===void 0?``:ba(t));function Sa(e,t=[]){let n=e.querySelector(`:scope > .ticks`),r=t.map(e=>`${e.at}${e.mark}`).join();n.dataset.sig!==r&&(n.dataset.sig=r,e.classList.toggle(`ticked`,t.length>0),n.replaceChildren(...t.map((e,n)=>{let r=document.createElement(`i`);return r.dataset.mark=e.mark,r.style.setProperty(`--o`,((n+1)/t.length).toFixed(2)),r})))}var L=()=>k(`<div class="unit"><div class="card"><a class="hit"></a>${va}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><em class="agent"></em><span class="note"></span><span class="age"></span></span><span class="todo" hidden><b></b><span></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button><span class="ticks" aria-hidden="true"></span></div><div class="subs"></div></div>`);function R(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);P(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${N(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,ha(t.mark)),M(e,t.mark),ya(e.querySelector(`.plate`),t.role,t.mark,t.docs),j(e,`.name`,t.name),j(e,`.role`,ma(t.role)),j(e,`.agent`,t.agent?pa[t.agent]:``),_a(e,`.note`,t.note,t.mark),xa(e.querySelector(`:scope > .card .age`),t.since);let i=e.querySelector(`:scope > .card .todo`);i.hidden=!t.todo,t.todo&&(j(i,`b`,`${t.todo.done<t.todo.total?`◐`:`✓`} ${t.todo.done}/${t.todo.total}`),j(i,`span`,t.todo.now??``)),Sa(e.querySelector(`:scope > .card`),t.ticks),Wi(e.querySelector(`:scope > .card > .quit-btn`),t),I(e.querySelector(`.subs`),t.subs??[],L,R)}function Ca(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`?qn():Jn())&&(e.textContent=r===`main`?qn():Jn())}var wa=()=>k(`<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>${$e()}</span><h2><a class="enter-base"></a></h2><p><span class="tstate"></span><span class="age"></span></p><button type="button" class="quit-btn tower-quit" data-close="unit" hidden></button></div><button type="button" class="quit-btn" data-close="base"></button></header><div class="subs tower-subs"></div><div class="spawn-btns"><button type="button" class="pair-btn"></button><button type="button" class="pair-btn" data-close="stash"></button></div><div class="tabs"></div><div class="outposts" data-label="${Yn()}"></div></section>`);function Ta(e,t){M(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),M(n,t.tower?.mark??`unknown`),j(e,`h2 a`,t.label),P(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),j(e,`.title .tstate`,t.tower?Ue({state:ua[t.tower.mark]()}):Fn()),xa(e.querySelector(`.title .age`),t.tower?.since),Ca(e.querySelector(`.spawn-btns button`),t),qi(e.querySelector(`header > .quit-btn`),t),Ji(e.querySelector(`.spawn-btns [data-close=stash]`),t),Gi(e.querySelector(`.tower-quit`),t.tower),I(e.querySelector(`.tower-subs`),t.tower?.subs??[],L,R),I(e.querySelector(`.tabs`),t.tabs,()=>k(`<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)=>{j(e,`h3 span`,Gr({label:n.label})),Yi(e.querySelector(`.quit-btn`),t,n),Ca(e.querySelector(`.tab-add`),t,n.id),I(e.querySelector(`.units`),n.units,L,R)}),I(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?Nn():void 0,since:e.since,ticks:e.ticks})),L,R)}var Ea=()=>k(`<section class="base ally"><header><div class="tower"><i class="pulse"></i><svg><use href="#i-tower"/></svg><b class="badge"></b></div><div class="title"><span class="crown"><svg><use href="#i-main"/></svg><em class="ally-tag"></em></span><h2></h2><p><span class="tstate"></span></p></div></header><ul class="ally-tabs"></ul></section>`);function Da(e,t){let n=Ei(t);M(e,n),e.classList.toggle(`offline`,!t.online),M(e.querySelector(`.tower`),n),j(e,`.ally-tag`,ie({team:t.teamName})),j(e,`h2`,t.workspace??t.label),j(e,`.tstate`,`${t.workspace?`${t.label} · `:``}${t.short} · ${t.online?Di(t.tower):It()}`),I(e.querySelector(`.ally-tabs`),t.tabs.map((e,t)=>({id:`${t}`,...e})),()=>k(`<li class="ally-tab"><b></b><span></span></li>`),(e,n)=>{j(e,`b`,n.label),j(e,`span`,t.online?Di(n.state):``),e.dataset.state=n.state})}function Oa(e,t,n,r){let i=[...e.querySelectorAll(`.base:not(.leaving):not(.ally) .tower`)],a=e.querySelector(`.base.head:not(.leaving) .tower`),o=e.getBoundingClientRect(),s=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-o.x),Math.round(t.y+t.height/2-o.y)]},c=a?i.filter(e=>e!==a):[],l=c.map(e=>{let[[t,n],[r,i]]=[s(a),s(e)];return{x1:t,y1:n,x2:r,y2:i,mid:Math.round((t+r)/2)}}),u=l.map(({x1:e,y1:t,x2:n,y2:r,mid:i})=>`M${e} ${t}C${i} ${t} ${i} ${r} ${n} ${r}`),d=u.join(`|`);t.dataset.sig!==d&&(t.dataset.sig=d,t.replaceChildren(...u.map(e=>(t=>(t.setAttribute(`class`,`wire`),t.setAttribute(`d`,e),t))(document.createElementNS(`http://www.w3.org/2000/svg`,`path`)))),n.replaceChildren(...Ri(l,r))),n.querySelectorAll(`.packet`).forEach((e,t)=>e.toggleAttribute(`data-live`,[`working`,`commanding`].includes(a.dataset.mark??``)||[`working`,`commanding`].includes(c[t].dataset.mark??``)))}var ka=2,Aa=20;function ja(){let[e,t,n,r]=[A(`map`,HTMLElement),A(`bases`,HTMLElement),A(`links`,SVGSVGElement),A(`packets`,HTMLElement)],i=matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=new Set,o=Ii(e,t),s=()=>(o(),!e.hidden&&Oa(e,n,r,i)),c=0,l=()=>c||=requestAnimationFrame(()=>(c=0,s())),u=new ResizeObserver(e=>(e.forEach(({target:e,borderBoxSize:t})=>e.style.gridRowEnd=`span ${Math.ceil((t[0].blockSize+Aa)/ka)}`),l()));return setInterval(()=>document.querySelectorAll(`.age[data-since]`).forEach(e=>xa(e,Number(e.dataset.since))),15e3),addEventListener(`resize`,l),new ResizeObserver(([e])=>document.documentElement.style.setProperty(`--hud`,`${Math.ceil(e.borderBoxSize[0].blockSize)}px`)).observe(document.querySelector(`.hud`)),Pi(),{layout:s,stats(e){let t=e.bases.flatMap(e=>[...e.tower?.subs??[],...e.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))]),n=e=>String(t.filter(t=>!e||t.mark===e).length);A(`s-commanding`,HTMLElement).parentElement.toggleAttribute(`data-on`,t.some(e=>e.mark===`commanding`));for(let[t,r]of[[`s-bases`,String(e.bases.length)],[`s-agents`,n()],[`s-working`,n(`working`)],[`s-commanding`,n(`commanding`)],[`s-waiting`,n(`waiting`)]])A(t,HTMLElement).textContent=r},show(e){let n=(e.link?.allies??[]).map(e=>({...e,id:`ally/${e.id}`,ally:!0}));I(t,[...e.bases,...n],e=>`ally`in e?Ea():wa(),(e,t)=>`ally`in t?Da(e,t):Ta(e,t));for(let e of t.children)a.has(e)||(a.add(e),u.observe(e));for(let e of a)e.isConnected||(a.delete(e),u.unobserve(e));requestAnimationFrame(s)},pause(e){document.documentElement.classList.toggle(`paused`,e)}}}function Ma(e,t){let n=A(`link-alerts`,HTMLButtonElement),r=A(`link-alerts-pop`,HTMLElement),i=A(`link-alerts-list`,HTMLElement),a=``,o=new Set,s=!0;r.addEventListener(`toggle`,e=>e.newState===`open`&&F(r,n)),r.setAttribute(`aria-label`,Ot()),n.title=Ot();let c=(e,t,n)=>{let r=n.querySelector(`.link-note`);for(let e of n.querySelectorAll(`button`))e.disabled=!0;ji(`link/confirm-answer`,{dialogId:e.dialogId,allow:t}).then(e=>{e.ok||(r.textContent=e.body.reason??S({status:e.status}));for(let e of n.querySelectorAll(`button`))e.disabled=!1},()=>{r.textContent=b();for(let e of n.querySelectorAll(`button`))e.disabled=!1})},l=e=>{let t=C(`li`,{class:`link-alert`,"data-level":`warning`}),n=C(`button`,{type:`button`,class:`pair-btn`},kt()),r=C(`button`,{type:`button`,class:`pair-btn`},Nt());return n.onclick=()=>c(e,!0,t),r.onclick=()=>c(e,!1,t),t.append(C(`b`,null,Si({id:``,kind:`confirm`,level:`warning`,team:e.team,teamName:``,data:{label:e.fromLabel,short:e.fromShort,tool:e.tool}})),C(`pre`,{class:`link-args`},e.args),C(`div`,{class:`devices-acts`},n,r),C(`small`,{class:`link-note`,role:`status`})),t};return{net(c){let u=Ci((c?.alerts??[]).filter(e=>e.kind!==`confirm`)),d=c?.confirms??[],f=JSON.stringify([u,d]);if(f===a)return;a=f;let p=new Set([...d.map(e=>`c/${e.dialogId}`),...u.filter(e=>e.kind===`join-request`).map(e=>e.id)]);s||t([...p].filter(e=>!o.has(e)).length),[o,s]=[p,!1];let m=u.length+d.length;n.hidden=m===0,n.textContent=Dt({count:String(m)}),n.dataset.state=d.length||u.some(e=>e.level===`error`)?`error`:u.some(e=>e.level===`warning`)?`waiting`:`done`,!m&&r.matches(`:popover-open`)&&r.hidePopover(),i.replaceChildren(...bi(...d.map(l),...u.map(t=>{let n=C(`li`,{class:`link-alert`,"data-level":t.level},C(`span`,null,Si(t)));if(t.kind===`join-request`||t.kind===`fork`||t.kind===`mismatch`){let i=C(`button`,{type:`button`,class:`later`},t.kind===`join-request`?Bt():Rt());i.onclick=()=>(r.hidePopover(),e()),n.append(i)}return n})))}}}var Na=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,Pa=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,Fa={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:Pa,done:Na},Ia=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,La=(e,t)=>{try{return localStorage.getItem(e)??t}catch{return t}},Ra=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function za(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=La(`sb.remind`,`1`)===`1`,u=La(`sb.sound`,`0`)===`1`,d=Math.min(100,Math.max(0,Number(La(`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`?dr():e===`denied`?lr():cr():ur():fr(),r.dataset.state=u?`on`:`off`,r.setAttribute(`aria-label`,u?Cr():Sr()),a.checked=u,o.value=s.value=String(d),p&&(p.gain.value=(d/100)**2)};n.textContent=sr(),r.textContent=xr(),r.title=wr(),t(`sound-on-label`).textContent=xr(),t(`sound-vol-label`).textContent=Er(),t(`sound-try`).textContent=Tr(),n.onclick=async()=>{l&&c&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):Ra(`sb.remind`,(l=!l)?`1`:`0`),h()},i.addEventListener(`toggle`,e=>e.newState===`open`&&F(i,r)),a.onchange=()=>{Ra(`sb.sound`,(u=a.checked)?`1`:`0`),h(),u&&g(`done`)},o.oninput=()=>(Ra(`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(Fa[e]).then(e=>e.arrayBuffer()).then(e=>t.decodeAudioData(e))),Promise.all([t.resume(),m.get(e)]).then(([,e])=>{let r=t.createBufferSource();r.buffer=e,r.connect(n),r.start()}).catch(()=>m.delete(e))}return h(),{chime:()=>u&&g(`done`),signal(t){let n=t.flatMap(e=>(t=>t?[{a:e,k:t}]:[])(Ia(e)));if(n.length&&(u&&g([`waiting`,`error`,`done`].find(e=>n.some(t=>t.k===e))),l&&c&&Notification.permission===`granted`&&(document.hidden||!document.hasFocus())))for(let{a:t,k:r}of n){let n=new Notification(t.name,{body:t.trust?ei():{waiting:Kn,error:Un,done:Bn}[r]({note:t.note??``}).trim(),tag:t.key,icon:document.querySelector(`link[rel="icon"]`)?.href,silent:r!==`waiting`});n.onclick=()=>(window.focus(),n.close(),e(t))}}}}var Ba=45e3,Va=1e3,Ha=3e4,Ua=(e,t)=>Math.min(Ha,Va*2**(e-1))*(.8+.4*t);function Wa(e){try{return JSON.parse(e)}catch{return}}function Ga(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(),Ba),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,Ua(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=Wa(r);i&&e.onNet(i),o({problem:i?void 0:nr()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:Wa(e)??rr()}),l())}),r=e.setTimeout(()=>u(),Ba)};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()}}}var Ka={commanding:Jt,working:yn,waiting:gn,idle:rn,done:Zt,error:en,unknown:pn},qa=e=>(e.kind===`joined`?sn:e.kind===`left`?un:Ka[e.mark])({name:e.name}),Ja=18e5,Ya={waiting:0,error:0,working:1,commanding:1},Xa=e=>new Date(e).toLocaleTimeString([],{hour12:!1});function Za(e){let[t,n,r,i,a]=[`.tl-lanes`,`.tl-axis`,`.tl-at`,`.tl-last`,`.tl-span`].map(t=>e.querySelector(t)),o=[],s=``;matchMedia(`(max-width: 640px)`).matches&&(e.open=!1);let c=()=>{let e=Date.now()-Ja,s=o.filter(t=>t.at>=e),c=s.at(-1);t.replaceChildren(...s.map(t=>{let n=document.createElement(`a`),r=(t.at-e)/Ja*100;return n.className=`tl-mark ${t.kind}${r>70?` end`:``}`,n.dataset.mark=t.kind===`left`?`unknown`:t.mark,n.style.cssText=`left:${r.toFixed(2)}%;top:${(Ya[t.mark]??2)*14+4}px`,n.setAttribute(`aria-label`,`${Xa(t.at)} ${qa(t)}`),P(n,t.key&&t.kind!==`left`?{view:`session`,ws:t.ws,key:t.key}:{view:`workspace`,ws:t.ws}),n})),n.replaceChildren(...[0,10,20].map(t=>Object.assign(document.createElement(`span`),{textContent:Xa(e+t*6e4).slice(0,5)})),Object.assign(document.createElement(`span`),{textContent:Yr()})),r.textContent=c?Xa(c.at):``,i.textContent=c?qa(c):Jr(),a.textContent=Qr({count:String(s.length)})};return setInterval(c,3e4),c(),{net(e){let t=e.events??[],n=t.map(e=>`${e.at}${e.kind}${e.key??e.name}${e.mark}`).join();n!==s&&(s=n,o=t,c())}}}ci();var z=ja(),Qa=Za(document.getElementById(`timeline`)),B=e=>document.getElementById(e),$a=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):jn(),eo,V,H,to={state:`connecting`,attempt:0},U={view:`map`},no=!1,ro,io=``,W,ao,G=e=>W?e(W):void ao?.then(e);function oo(){ao??=T(async()=>{let{mountFocus:e}=await import(`./views-BCs43dfq.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(W=e({data:So,restart:()=>Q.restart(),openTile:J,embedTerminal:(e,t,n)=>new Promise(r=>q(i=>r(i.terminal.embed(e,t,n)))),online:()=>to.state===`live`}),W.show(U,U),V&&W.net(V),W))}var K,so,q=e=>{if(K)return e(K);so??=T(async()=>{let{mountPanels:e}=await import(`./layer-DPfTmZ_H.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>K=e({label:e=>V?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(X?X.data(e).latest():xo(e,`?limit=12`))).items,post:e=>X&&((t,n)=>X.data(e).post(t,n)),stream:()=>io,showTerminal:(e,t)=>(K?.stack.close(),W?.terminal(t),Z.go({view:`session`,ws:e,key:t}))})),so.then(e)},J=(e,t)=>q(n=>n.tiles.open(e,t)),Y=document.querySelector(`link[rel="icon"]`),co=Y&&decodeURIComponent(Y.href.slice(Y.href.indexOf(`,`)+1)),lo=0;function uo(e){let t=e.bases.flatMap(e=>[...e.tower?[e.tower,...e.tower.subs]:[],...[...e.tabs.flatMap(e=>e.units),...e.outside].flatMap(e=>[e,...e.subs])]).filter(e=>e.mark===`waiting`||e.pending).length+(e.trust?.length??0);if(!Y||!co||t===lo)return;lo=t;let n=`<circle cx='23' cy='9' r='9' fill='#e0af68' stroke='#1a1b26' stroke-width='2'/><text x='23' y='13' text-anchor='middle' font-family='sans-serif' font-size='${t>9?9:12}' font-weight='700' fill='#16161e'>${t>9?`9+`:t}</text>`;Y.href=`data:image/svg+xml,${encodeURIComponent(t?co.replace(`</svg>`,`${n}</svg>`):co)}`}var fo;function po(e){V=H=e,uo(e),To.net(e.link);let t=fi(e,Date.now());if(fo&&Eo.signal(pi(fo,t)),fo=t,document.hidden)return;z.stats(e),Zi(B(`dismiss-all`),e),Qi(B(`stashed`),B(`stashed-list`),e),$?.net(e);let n=pi(ro,t);(n.length||K)&&q(e=>e.alerts(n,t)),ro=t,Qa.net(e),G(t=>t.net(e)),U.view===`map`&&(z.show(e),eo=e,H=void 0)}function mo(e){let t=U,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;U=e,$?.route(e),e.view!==`map`&&oo(),B(`map`).hidden=e.view!==`map`,B(`legend`).hidden=e.view===`session`,B(`stage`).dataset.view=e.view,G(r=>r.show(e,t,n)),e.view===`map`&&V&&V!==eo&&(po(V),requestAnimationFrame(z.layout)),no&&oa(e)!==oa(t)&&Q.restart()}function ho(e){to=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:Mt,live:Pt,reconnecting:zt,offline:It}[e.state](),W&&V&&W.net(V),K?.stack.redraw();let n=B(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?le({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?ge({attempt:e.attempt}):pe():fe({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=$a(e.lastContact),n.replaceChildren(`${r} ${oe()} `,i,ae())}function go(e,t){try{let n=JSON.parse(t);G(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var _o=document.querySelector(`meta[name="sb-build"]`)?.content,vo=e=>!!(_o&&_o!==JSON.parse(e).build);function yo(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 bo=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),xo=(e,t=``)=>bo(`history/${encodeURIComponent(e)}${t}`),X=void 0,So=e=>({older:t=>xo(e,`?before=${encodeURIComponent(t)}`),latest:()=>xo(e),entry:t=>bo(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),Co=()=>{let e=yo(oa(U));return e.listen(`history`,e=>go(`history`,e)),e.listen(`cards`,e=>go(`cards`,e)),e.listen(`hello`,e=>vo(e)?location.reload():(io=e,K?.terminal.hello())),e.listen(`mirror`,e=>K?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&ia(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=ro?.get(n.key);r&&(e.preventDefault(),q(e=>e.stack.show(r)))},!0);var Z=ca(e=>mo(e)),wo=()=>void T(async()=>{let{linkTile:e}=await import(`./link-BPANIwWC.js`);return{linkTile:e}},[],import.meta.url).then(({linkTile:e})=>J(e(),!0)),To=Ma(wo,e=>e&&Eo.chime()),Eo=za(e=>e.trust?q(t=>t.stack.show(e)):Z.go({view:`session`,ws:e.ws,key:ui(e)})),Q=Ga({open:Co,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:po,onStatus:ho}),Do=()=>Q.resume();document.addEventListener(`visibilitychange`,()=>{if(z.pause(document.hidden),document.hidden)return Q.hide();H&&po(H),G(e=>e.wake()),Do()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(e.preventDefault(),!K?.stack.close()&&U.view!==`map`&&Z.go(aa(U)))}),yi(e=>K?.hotkey(e)??!1),B(`teams`).addEventListener(`click`,wo),B(`pair`).hidden=location.hostname!==`127.0.0.1`,B(`pair`).addEventListener(`click`,()=>void T(async()=>{let{pairTile:e}=await import(`./pair-V89W4Loy.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>J(e(),!0)));var $,Oo=matchMedia(`(pointer: coarse), (max-width: 640px)`),ko=()=>void T(async()=>{let{mountDrawer:e}=await import(`./drawer-qVyh8zOf.js`);return{mountDrawer:e}},[],import.meta.url).then(({mountDrawer:e})=>($??=e(),V&&$.net(V),$.route(U)));Oo.matches?ko():Oo.addEventListener(`change`,()=>Oo.matches&&!$&&ko(),{once:!0}),ta({route:()=>U,net:()=>V,go:e=>Z.go(e)}),B(`stashed-pop`).addEventListener(`toggle`,e=>e.newState===`open`&&F(B(`stashed-pop`),B(`stashed`))),B(`prefs-pop`).addEventListener(`toggle`,e=>e.newState===`open`&&F(B(`prefs-pop`),B(`prefs`))),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&T(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-zPF5TTix.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,V?.bases??[]);r&&J(n(r,(e,t,n)=>(K?.tiles.close(n),Z.go({view:`session`,ws:e,key:t})),()=>Eo.chime()),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&Do());ho(to),mo(Z.route()),Q.start(),no=!0;export{ye as $,_i as A,Yn as B,ji as C,C as D,Ti as E,Vr as F,jn as G,b as H,Br as I,ht as J,wt as K,mr as L,di as M,ui as N,bi as O,Gr as P,Ue as Q,pr as R,T as S,wi as T,Pn as U,Fn as V,Nn as W,$e as X,ot as Y,Qe as Z,ha as _,P as a,$i as b,N as c,k as d,ve as et,M as f,j as g,I as h,va as i,li as j,xi as k,ya as l,_a as m,la as n,Ca as o,ma as p,vt as q,ua as r,A as s,pa as t,te as tt,F as u,Ki as v,Ai as w,Zi as x,Wi as y,S as z};
@@ -0,0 +1 @@
1
+ :root{--bg:#16161e;--bg-2:#1a1b26;--surface-0:#1f2335;--surface-1:#24283b;--raised:#1f2335;--sunken:#16161e;--well:#16161e8c;--panel:#1f2335eb;--plate:#1a1b26;--plate-hi:#292e42;--term-bg:#16161e;--term-fg:#c0caf5;--line-c:#737aa2;--line:#737aa242;--hi:#fff;--shadow:#08080d;--text:#c0caf5;--dim:#868dba;--ink:#16161e;--accent:#7dcfff;--accent-hi:#b4e4ff;--working:#7dcfff;--gold:#e0af68;--amber:#ff9e64;--ok:#9ece6a;--err:#f7768e;--err-soft:#ff9fb0;--violet:#bb9af7;--idle:#737aa2;--unknown:#545c7e;--paper-hi:#f6e6b8;--paper:#d8bd78;--paper-ink:#3b2a06;--paper-edge:#8a6f33;--aura-1:color-mix(in srgb, var(--accent) 7%, transparent);--aura-2:color-mix(in srgb, var(--violet) 8%, transparent);--grid:linear-gradient(color-mix(in srgb, var(--line-c) 5%, transparent) 1px, transparent 1px) 0 0 / 44px 44px, linear-gradient(90deg, color-mix(in srgb, var(--line-c) 5%, transparent) 1px, transparent 1px) 0 0 / 44px 44px;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--sans:ui-rounded, "Avenir Next", "Trebuchet MS", system-ui, -apple-system, "Segoe UI", sans-serif}*{box-sizing:border-box;margin:0}html{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;-webkit-font-smoothing:antialiased;scrollbar-color:color-mix(in srgb, var(--line-c) 45%, transparent) transparent}::selection{background:color-mix(in srgb, var(--accent) 28%, transparent)}body{min-height:100vh;color:var(--text);font:14px/1.4 var(--sans);background:radial-gradient(1100px 640px at 12% -10%, var(--aura-1), transparent 62%), radial-gradient(900px 600px at 98% 8%, var(--aura-2), transparent 60%), linear-gradient(var(--bg), var(--bg-2));background-attachment:fixed}svg{display:block}[data-mark=working]{--c:var(--working)}[data-mark=waiting]{--c:var(--amber)}[data-mark=idle]{--c:var(--idle)}[data-mark=done]{--c:var(--ok)}[data-mark=error]{--c:var(--err)}[data-mark=unknown]{--c:var(--unknown)}[data-mark=commanding]{--c:var(--violet)}[data-mark]{--c1:color-mix(in srgb, var(--c) 13%, transparent);--c4:color-mix(in srgb, var(--c) 45%, transparent)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.shell{max-width:2200px;margin:0 auto;padding:14px 20px 32px}.hud{border:1px solid var(--line);background:var(--panel);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:5;border-radius:16px;flex-wrap:wrap;align-items:center;gap:8px 12px;padding:8px 12px;display:flex;position:sticky;top:8px}.brand{align-items:center;gap:12px;margin-right:8px;display:flex}.logo{width:36px;height:36px;color:var(--accent);background:radial-gradient(circle at 30% 25%, color-mix(in srgb, var(--accent) 30%, transparent), color-mix(in srgb, var(--bg-2) 90%, transparent));border:1px solid var(--line);border-radius:11px;place-items:center;display:grid}.logo svg{width:24px;height:24px;filter:drop-shadow(0 0 5px color-mix(in srgb, var(--accent) 70%, transparent))}.brand h1{letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;font-size:17px}.brand p{color:var(--dim);font-size:12px}.stats{background:color-mix(in srgb, var(--hi) 4%, transparent);border:1px solid color-mix(in srgb, var(--hi) 6%, transparent);border-radius:13px;gap:2px;padding:2px;display:flex}.stats div,.tally div,.alerts{background:color-mix(in srgb, var(--hi) 4%, transparent);border:1px solid color-mix(in srgb, var(--hi) 6%, transparent);border-radius:12px;min-width:0;padding:4px 10px}.stats dt,.tally dt{color:var(--dim);letter-spacing:.08em;text-transform:uppercase;font-size:10px}.stats dd,.tally dd{font:600 17px/1.15 var(--mono);font-variant-numeric:tabular-nums}.stats div{background:0 0;border-color:#0000;border-radius:10px;min-width:4.5em;padding:3px 10px}.tally dd{font-size:20px}.stats [data-mark] dd,.tally [data-mark] dd,.count b{color:var(--c)}.pair-btn{white-space:nowrap;border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);letter-spacing:.08em;text-transform:uppercase;cursor:pointer;background:0 0;border-radius:12px;padding:6px 10px}.tog{align-items:center;gap:6px;display:inline-flex}.tog:before{content:"";background:var(--line);border-radius:50%;flex:none;width:7px;height:7px}.tog[data-state=on]{color:var(--text);border-color:color-mix(in srgb, var(--accent) 35%, var(--bg))}.tog[data-state=on]:before{background:var(--accent);box-shadow:0 0 6px var(--accent)}.tog[data-state=ask]:before{background:var(--gold)}.tog[data-state=blocked]:before{background:var(--err)}.tog[data-state=done]{color:var(--text)}.tog[data-state=done]:before{background:var(--ok);box-shadow:0 0 6px var(--ok)}.tog[data-state=error]{color:color-mix(in srgb, var(--err-soft) 45%, var(--hi))}.tog[data-state=error]:before{background:var(--err);box-shadow:0 0 6px var(--err)}.alert-row{align-items:center;gap:10px;min-width:0;display:flex}.done-btn{white-space:nowrap;flex:none}.prefs-btn{place-items:center;width:34px;height:34px;margin-left:auto;padding:0;display:grid}.prefs-btn svg{fill:currentColor;width:18px;height:18px}.prefs-btn:hover,.prefs-btn[aria-expanded=true]{color:var(--text)}.prefs-btn:has(+.prefs-pop #remind[data-state=blocked]){color:var(--err-soft)}.prefs-pop{width:210px}.prefs-pop:popover-open{gap:6px;display:grid}.prefs-pop>.pair-btn{text-align:left;justify-content:flex-start;width:100%}.hud-pop{border:1px solid var(--line);background:var(--raised);color:var(--text);font:13px/1.4 var(--sans);box-shadow:0 12px 32px color-mix(in srgb, var(--shadow) 60%, transparent);border-radius:14px;margin:0;padding:12px;position:fixed;inset:auto}.sound-pop{gap:12px;width:240px}.sound-pop:popover-open{display:grid}.sound-pop label{justify-content:space-between;align-items:center;gap:10px;display:flex}.sound-pop input[type=range]{min-width:0;accent-color:var(--accent);flex:1}.sound-pop input[type=checkbox]{width:18px;height:18px;accent-color:var(--accent)}.sound-pop output{text-align:right;width:3ch;font:12px var(--mono);color:var(--dim)}.done-pop{width:min(340px,100vw - 16px)}.done-pop ul{gap:2px;max-height:50vh;margin:0 0 10px;padding:0;list-style:none;display:grid;overflow:auto}.done-go{color:inherit;border-radius:10px;align-items:center;gap:10px;padding:6px 8px;text-decoration:none;display:flex}.done-go:hover,.done-go:focus-visible{background:color-mix(in srgb, var(--hi) 6%, transparent)}.done-go .plate{--s:30px;flex:none}.done-go .badge{display:none}.done-go span{min-width:0;display:grid}.done-go .name{font-weight:600}.done-go .name,.done-go small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.done-go small{color:var(--dim)}#done-clear,#sound-try{width:100%}.lang{text-transform:none}.lang option{background:var(--bg);color:var(--text)}.pair{text-align:center;color:var(--dim);justify-items:center;gap:12px;font-size:13px;display:grid}.qr{shape-rendering:crispedges;border-radius:12px;width:min(100%,300px)}.devices{text-align:left;border-top:1px solid var(--line);gap:8px;width:100%;padding-top:12px;display:grid}.devices h4{font:600 12px var(--sans);letter-spacing:.08em;text-transform:uppercase;margin:0}.devices ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.devices li{justify-content:space-between;align-items:center;gap:10px;display:flex}.devices li span{min-width:0;display:grid}.devices li b{color:var(--text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.devices-acts{flex-wrap:wrap;gap:8px;display:flex}.devices small,.devices .chat-empty{color:var(--dim)}.spawn-btns{flex-wrap:wrap;gap:8px;margin:12px 0 4px;display:flex}.base>.spawn-btns{margin:-4px 0 12px}.tab h3>span,.squad h3>b{white-space:nowrap;text-overflow:ellipsis;flex:0 auto;min-width:0;overflow:hidden}.tab h3>button{flex:none}.tab h3>span{flex-grow:1}.tab-add{white-space:nowrap;border:1px solid var(--line);color:var(--dim);font:600 11px var(--sans);letter-spacing:.08em;cursor:pointer;background:0 0;border-radius:10px;flex:none;margin-left:auto;padding:2px 8px}.squad .tab-add{margin-left:0}.tab-add:hover,.new-base:hover{color:var(--accent);border-color:var(--accent)}.quit-btn{border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);cursor:pointer;background:0 0;border-radius:8px;flex:none;margin-left:6px;padding:2px 9px}.quit-btn:hover{color:var(--err-soft);border-color:color-mix(in srgb, var(--err-soft) 40%, transparent)}.base>header>.quit-btn{align-self:flex-start;margin-left:auto}@media (hover:hover) and (pointer:fine){:is(.card>.quit-btn,.tab h3>.quit-btn,.base>header>.quit-btn,.tower-quit){opacity:0;transition:opacity .15s}:is(.card:hover,.card:focus-within)>.quit-btn,:is(.tab h3:hover,.tab h3:focus-within)>.quit-btn,:is(.base>header:hover,.base>header:focus-within) :is(.quit-btn,.tower-quit){opacity:1}}#stashed-list li{align-items:center;gap:8px;display:flex}#stashed-list span{overflow-wrap:anywhere;flex:1}.card>.quit-btn{margin-left:auto}.card>.quit-btn,.base>header>.quit-btn,.tower-quit{z-index:2;position:relative}.tower-quit{margin:6px 0 0}.sheet{border:1px solid var(--line);background:var(--raised);max-width:min(420px,100vw - 32px);color:var(--text);font:14px/1.5 var(--sans);border-radius:16px;margin:auto;padding:18px 20px}.sheet::backdrop{background:color-mix(in srgb, var(--shadow) 60%, transparent)}.sheet p{margin:0 0 14px}.sheet-row{justify-content:flex-end;gap:10px;display:flex}.sheet .later{cursor:pointer;border-radius:10px;padding:6px 14px}.sheet-yes{background:var(--err-soft);color:var(--ink);font:600 13px var(--sans);cursor:pointer;border:0;border-radius:10px;padding:6px 14px}.modes{flex:none;gap:4px;display:flex}.modes button{white-space:nowrap;border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);cursor:pointer;background:0 0;border-radius:999px;padding:4px 14px}.modes button[aria-pressed=true]{border-color:var(--accent);color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent)}.term-root{min-height:0;padding:10px 16px 14px}.term-root .term-tile{height:100%}.pics{flex-wrap:wrap;align-items:flex-start;gap:6px;margin-top:8px;display:flex}.pic{border:1px solid var(--line);background:var(--plate);cursor:zoom-in;border-radius:8px;max-width:100%;padding:0;line-height:0;overflow:hidden}.pic img{max-width:240px;max-height:180px;display:block}.pic-gone{color:var(--dim);font-size:12px}.lightbox{background:color-mix(in srgb, var(--bg) 94%, transparent);border:0;width:100vw;max-width:none;height:100dvh;max-height:none;margin:0;padding:0;overflow:auto}.lightbox[open]{place-items:center;display:grid}.lightbox::backdrop{background:0 0}.lightbox img{object-fit:contain;cursor:zoom-in;max-width:94vw;max-height:88dvh}.lightbox.zoom[open]{place-items:start}.lightbox.zoom img{cursor:zoom-out;max-width:none;max-height:none}.lightbox button{border:1px solid var(--line);background:var(--panel);width:44px;height:44px;color:var(--text);border-radius:50%;place-items:center;font-size:26px;line-height:1;display:grid;position:fixed}.lb-close{top:14px;right:14px}.lb-prev,.lb-next{top:calc(50% - 22px)}.lb-prev{left:14px}.lb-next{right:14px}.lb-count{color:var(--dim);font:13px var(--mono);position:fixed;bottom:14px;left:50%;transform:translate(-50%)}.queue-list{justify-items:end;gap:4px;margin:0 16px 6px;display:grid}.queue-list p{border:1px dashed color-mix(in srgb, var(--accent) 45%, transparent);max-width:min(80%,640px);color:var(--dim);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:12px;margin:0;padding:6px 12px;font-size:14px;line-height:1.45}.queue-list p>span{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.queue-list p[role=button]{cursor:pointer}.queue-list p[role=button]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.queue-list p[data-open]>span{display:block;overflow:visible}.queue-list b{color:var(--accent);letter-spacing:.06em;margin-right:8px;font-size:11px;font-weight:600}.queue-act{color:var(--dim);flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:4px 10px;margin:0 16px 6px;font-size:12px;line-height:1.4;display:flex}.queue-act[hidden]{display:none}.queue-act span{text-align:right;flex:0 auto;max-width:64ch}.in-term .queue-list,.in-term .queue-act{display:none}.todos{border:1px solid var(--line);background:var(--panel);border-radius:12px;margin:0 16px;padding:6px 12px;font-size:13px}.todos summary{cursor:pointer;align-items:baseline;gap:10px;min-width:0;list-style:none;display:flex}.todos summary::-webkit-details-marker{display:none}.todos summary b{color:var(--violet);flex:none;font-weight:600}.todos summary span{min-width:0;color:var(--dim);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.todos summary:after{content:"▸";color:var(--dim);margin-left:auto}.todos[open] summary:after{content:"▾"}.todos ol{gap:3px;max-height:30vh;margin:6px 0 2px;padding:0;list-style:none;display:grid;overflow-y:auto}.todos li{font:13px/1.5 var(--sans);margin:0}.todos li:before{content:"○";width:1.4em;color:var(--dim);display:inline-block}.todos li.in_progress{color:var(--accent)}.todos li.in_progress:before{content:"◐"}.todos li.completed{color:var(--dim);text-decoration:line-through}.todos li.completed:before{content:"✓";color:var(--ok)}.in-term .todos,.in-term .monitors{display:none}.monitors{border:1px solid var(--line);background:var(--panel);border-radius:12px;margin:6px 16px 0;padding:6px 12px;font-size:13px}.monitors summary{cursor:pointer;align-items:baseline;gap:10px;min-width:0;list-style:none;display:flex}.monitors summary::-webkit-details-marker{display:none}.monitors summary b{color:var(--accent);flex:none;font-weight:600}.monitors[data-failed=true] summary b{color:var(--err)}.monitors summary span{min-width:0;color:var(--dim);font:12px var(--mono);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.monitors summary:after{content:"▸";color:var(--dim);margin-left:auto}.monitors[open] summary:after{content:"▾"}.monitors ul{gap:6px;max-height:30vh;margin:6px 0 2px;padding:0;list-style:none;display:grid;overflow-y:auto}.monitors li{text-indent:-1.4em;gap:1px;padding-left:1.4em;display:grid}.monitors li b{overflow-wrap:anywhere;font-weight:500}.monitors li b:before{content:"◐";text-indent:0;width:1.4em;color:var(--accent);display:inline-block}.monitors li.done b:before{content:"✓";color:var(--ok)}.monitors li.stopped b:before{content:"■";color:var(--dim)}.monitors li.error b:before,.monitors li.stale b:before{content:"!";color:var(--err)}.monitors li.error small,.monitors li.stale small{color:var(--err)}.monitors li small{color:var(--dim);text-indent:0}.monitors li code{color:var(--dim);font:12px var(--mono);text-indent:0;overflow-wrap:anywhere}.new-base{border:1px dashed var(--line);min-height:96px;color:var(--dim);font:600 14px var(--sans);letter-spacing:.08em;cursor:pointer;background:0 0;border-radius:18px}.spawn .go{--c:var(--accent);border:0}.spawn{color:var(--dim);gap:10px;font-size:13px;display:grid}.spawn-at{flex-wrap:wrap;align-items:center;gap:8px;margin:0;display:flex}.spawn-path{color:var(--text);overflow-wrap:anywhere}.spawn textarea,.spawn input{box-sizing:border-box;border:1px solid var(--line);width:100%;color:var(--text);font:14px var(--sans);background:0 0;border-radius:8px;padding:8px 10px}.picker{gap:8px;min-width:0;display:grid}.picker-bar{align-items:center;gap:6px;min-width:0;display:flex}.picker-bar .later{font:13px var(--sans);cursor:pointer;border-radius:8px;flex:none;padding:4px 10px}.picker-bar .later:disabled{opacity:.4;cursor:default}.picker-crumbs{scrollbar-width:none;white-space:nowrap;flex:1;align-items:center;min-width:0;display:flex;overflow-x:auto}.picker-crumbs::-webkit-scrollbar{display:none}.picker-crumbs button{text-overflow:ellipsis;max-width:14em;color:var(--dim);font:13px var(--sans);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;padding:3px 6px;overflow:hidden}.picker-crumbs button:hover{color:var(--text);background:color-mix(in srgb, var(--accent) 8%, transparent)}.picker-crumbs button+button:before{content:"›";color:var(--dim);margin-right:6px}.picker-crumbs button[aria-current=true]{color:var(--text);font-weight:600}.picker input{box-sizing:border-box}.picker-body{border:1px solid var(--line);border-radius:10px;grid-template-columns:minmax(90px,130px) minmax(0,1fr);min-width:0;height:min(40vh,280px);min-height:170px;display:grid;overflow:hidden}.picker-places{background:color-mix(in srgb, var(--bg) 40%, transparent);border-right:1px solid var(--line);flex-direction:column;gap:2px;padding:6px;display:flex;overflow-y:auto}.picker-places button{color:var(--text);font:13px var(--sans);text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:5px 8px;overflow:hidden}.picker-places button:hover{background:color-mix(in srgb, var(--accent) 10%, transparent)}.picker-places b{color:var(--dim);font:600 11px var(--sans);letter-spacing:.08em;text-transform:uppercase;margin:8px 8px 2px}.picker-cols{outline-offset:-2px;min-width:0;display:flex;overflow:auto hidden}@media (prefers-reduced-motion:no-preference){.picker-cols,.pcol{scroll-behavior:smooth}}.pcol{width:var(--pw,176px);border-right:1px solid var(--line);flex-direction:column;flex:none;gap:1px;padding:4px;display:flex;overflow-y:auto}.pcol:last-child{border-right:0}.pitem{width:100%;color:var(--text);font:13px var(--sans);text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;padding:5px 8px;display:block;overflow:hidden}.pitem:hover{background:color-mix(in srgb, var(--accent) 8%, transparent)}.pitem[aria-selected=true]{background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--accent-hi)}.pcol[data-focus=true] .pitem[aria-selected=true]{background:color-mix(in srgb, var(--accent) 32%, transparent)}.pitem[aria-selected=true]:after{content:"›";float:right;opacity:.7}.pempty{color:var(--dim);margin:6px 8px;font-size:12px}.spawn-name{color:var(--dim);gap:4px;font-size:12px;display:grid}@media (width<=640px){.picker-body{grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr);height:min(52vh,360px)}.picker-places{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;align-items:center;overflow:auto hidden}.picker-places b{display:none}.picker-places button{flex:none;max-width:10em}.pcol:not(:last-child){display:none}.pcol{border-right:0;flex:1;width:auto}.pitem{padding:10px 12px}}.deploy{border:1px solid var(--line);background:color-mix(in srgb, var(--accent) 5%, transparent);color:var(--text);border-radius:14px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px 12px;padding:14px 16px;display:grid}.deploy>*{grid-column:1/-1;margin:0}.deploy>.deploy-bar{grid-column:1}.deploy>.deploy-count{grid-column:2}.deploy-title{font:600 15px var(--sans);letter-spacing:.04em;overflow-wrap:anywhere;align-items:center;gap:8px;display:flex}.deploy-title svg{width:24px;height:24px;color:var(--gold);filter:drop-shadow(0 0 5px color-mix(in srgb, var(--gold) 60%, transparent));flex:none}.deploy-bar{border:1px solid var(--line);background:color-mix(in srgb, var(--bg) 70%, transparent);border-radius:4px;height:14px;position:relative;overflow:hidden}.deploy-bar:after{content:"";background:repeating-linear-gradient(90deg, transparent 0 calc(5% - 2px), var(--bg-2,var(--bg)) calc(5% - 2px) 5%);position:absolute;inset:0}.deploy-fill{height:100%;width:calc(var(--done,0) / var(--of,1) * 100%);background:linear-gradient(90deg, var(--accent), var(--accent-hi), var(--accent)) 0 0 / 200% 100%;transition:width .7s cubic-bezier(.2,.8,.2,1),background-color .4s;display:block}.deploy[data-state=running] .deploy-fill{animation:1.8s linear infinite deploy-sheen}.deploy-count{font:600 13px var(--mono);color:var(--accent)}.deploy-steps{gap:6px;padding:0;list-style:none;display:grid}.deploy-steps li{color:var(--dim);grid-template-columns:1.6em minmax(0,1fr) auto;align-items:baseline;display:grid}.deploy-steps .deploy-mark:before{content:"·"}.deploy-steps [data-state=done]{color:var(--text)}.deploy-steps [data-state=done] .deploy-mark{color:var(--ok)}.deploy-steps [data-state=done] .deploy-mark:before{content:"✔"}.deploy-steps [data-state=active]{color:var(--text);font-weight:600}.deploy-steps [data-state=active] .deploy-mark{color:var(--accent);animation:1s ease-in-out infinite deploy-pulse}.deploy-steps [data-state=active] .deploy-mark:before{content:"▶"}.deploy-steps [data-state=failed]{color:var(--err-soft);font-weight:600}.deploy-steps [data-state=failed] .deploy-mark{color:var(--err)}.deploy-steps [data-state=failed] .deploy-mark:before{content:"✖"}.deploy-time{font:12px var(--mono);color:var(--dim)}.deploy-steps [data-state=active] .deploy-time{color:var(--accent)}.deploy-note{overflow-wrap:anywhere;font-size:13px;line-height:1.5}.deploy-note:empty{display:none}.deploy[data-state=failed]{border-color:color-mix(in srgb, var(--err) 55%, var(--line));background:color-mix(in srgb, var(--err) 8%, transparent)}.deploy[data-state=failed] .deploy-note{color:var(--err-soft)}.deploy[data-state=failed] .deploy-fill{background:var(--err)}.deploy[data-state=ready]{border-color:color-mix(in srgb, var(--ok) 60%, var(--line));animation:1.1s ease-out deploy-ready}.deploy[data-state=ready] .deploy-fill{background:var(--ok)}.deploy[data-state=ready] .deploy-note{color:var(--ok);letter-spacing:.08em;font-weight:600;animation:.6s ease-out deploy-rise}.deploy[data-state=ready] .deploy-title svg{animation:.7s ease-out deploy-hop}.deploy .later{justify-self:start;display:none}.deploy[data-state=failed] .later{display:inline-block}@keyframes deploy-sheen{to{background-position:-200% 0}}@keyframes deploy-pulse{50%{opacity:.3;transform:translate(2px)}}@keyframes deploy-ready{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--ok) 55%, transparent)}to{box-shadow:0 0 0 18px #0000}}@keyframes deploy-rise{0%{opacity:0;transform:translateY(6px)}}@keyframes deploy-hop{40%{transform:translateY(-5px)scale(1.2)}}.link{color:var(--dim);text-transform:uppercase;letter-spacing:.08em;align-items:center;gap:8px;padding:0 4px;font-size:12px;display:flex}.link span{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.link i{background:var(--unknown);border-radius:50%;width:9px;height:9px}.link[data-state=live] i{background:var(--ok);animation:2.4s ease-in-out infinite blink}.link[data-state=live]{color:var(--ok)}.link[data-state=reconnecting] i,.link[data-state=connecting] i{background:var(--amber);animation:1s ease-in-out infinite blink}.link[data-state=offline] i{background:var(--err)}.banner{background:color-mix(in srgb, var(--idle) 16%, transparent);color:var(--text);border-radius:14px;margin:14px 0 0;padding:10px 16px;font-size:13px}.banner b{font-family:var(--mono);font-weight:600}.stage{grid-template-columns:minmax(0,1fr);align-items:start;gap:20px;margin-top:12px;transition:opacity .4s;display:grid}.stage[data-view=session]{grid-template-columns:minmax(0,1fr) 300px}.stage:not([data-view=session])>.side{display:none}.stage[data-stale=true] .map,body[data-stale=true] .stats{opacity:.4}.stage[data-stale=true] *{animation-play-state:paused!important}.map{border:1px solid var(--line);background:var(--grid), var(--well);border-radius:18px;min-height:420px;padding:20px;transition:opacity .4s;position:relative}.links{pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.wire{fill:none;stroke:color-mix(in srgb, var(--accent) 30%, transparent);stroke-width:1.5px;stroke-dasharray:3 7;stroke-linecap:round}.packets{pointer-events:none;position:absolute;inset:0;overflow:hidden}.packet{background:var(--accent);opacity:0;will-change:transform;border-radius:50%;width:6px;height:6px;transition:opacity .4s;animation:none;position:absolute;top:-3px;left:-3px}.packet[data-live]{opacity:.9;animation-play-state:running}.bases{grid-template-columns:repeat(auto-fill,minmax(min(100%,330px),1fr));grid-auto-rows:2px;align-items:start;gap:0 20px;display:grid;position:relative}.base{border:1px solid var(--line);background:linear-gradient(180deg, var(--surface-1), var(--surface-0));box-shadow:0 18px 40px color-mix(in srgb, var(--shadow) 35%, transparent);border-radius:16px;padding:14px;position:relative}.base.head{background:linear-gradient(180deg, color-mix(in srgb, var(--gold) 10%, transparent), transparent 38%), linear-gradient(180deg, var(--surface-1), var(--surface-0))}.base[data-mark=waiting]{box-shadow:0 18px 40px color-mix(in srgb, var(--shadow) 35%, transparent), inset 0 0 0 999px color-mix(in srgb, var(--amber) 4%, transparent)}.base>header{align-items:center;gap:12px;margin-bottom:10px;display:flex;position:relative}.title{justify-items:start;min-width:0;margin-right:auto;display:grid}.title h2{white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:17px;overflow:hidden}.title p{max-width:100%;color:var(--dim);white-space:nowrap;text-overflow:ellipsis;font-size:12px;overflow:hidden}.crown{letter-spacing:.12em;text-transform:uppercase;color:var(--gold);background:color-mix(in srgb, var(--gold) 12%, transparent);border-radius:999px;align-items:center;gap:5px;margin-bottom:3px;padding:2px 9px 2px 6px;font-size:10px;display:inline-flex}.crown svg{width:14px;height:14px}.base:not(.head) .crown{display:none}.tower{width:64px;height:64px;color:var(--c);flex:none;place-items:center;display:grid;position:relative}.tower:before{content:"";background:radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--c) 24%, var(--plate-hi)), var(--plate) 70%);border:1px solid color-mix(in srgb, var(--c) 45%, transparent);border-radius:50%;position:absolute;inset:0}.tower svg{width:38px;height:38px;filter:drop-shadow(0 0 5px color-mix(in srgb, var(--c) 55%, transparent));position:relative}.tower.ghost{opacity:.45}.tower.ghost:before{border-style:dashed}.sweep,.pulse{opacity:0;pointer-events:none;border-radius:50%;position:absolute;inset:0}.sweep{background:conic-gradient(from 0deg, transparent 0 70%, color-mix(in srgb, var(--c) 55%, transparent) 100%)}.pulse{border:2px solid var(--c)}.tower[data-mark=working] .sweep{opacity:1;animation:3.2s linear infinite spin}.tower[data-mark=waiting] .pulse{animation:1.5s ease-out infinite ping}.tower>.badge{--s:36px;position:absolute;bottom:-3px;right:-3px}.tabs{gap:10px;display:grid}.tab{background:color-mix(in srgb, var(--hi) 2%, transparent);border:1px solid color-mix(in srgb, var(--hi) 5%, transparent);border-radius:14px;padding:8px}.tab h3{color:var(--dim);letter-spacing:.12em;text-transform:uppercase;align-items:center;gap:8px;margin-bottom:8px;font-size:11px;font-weight:600;display:flex}.units,.subs{gap:8px;display:grid}.outposts{gap:8px;margin-top:12px;display:grid}.outposts:empty{display:none}.outposts:before{content:attr(data-label);color:var(--dim);letter-spacing:.12em;text-transform:uppercase;font-size:11px}.card{background:color-mix(in srgb, var(--hi) 4%, transparent);border:1px solid color-mix(in srgb, var(--hi) 6%, transparent);border-radius:12px;align-items:center;gap:10px;padding:8px 10px;transition:background-color .4s;display:flex;position:relative}@media (hover:hover) and (pointer:fine){.card{transition:background-color .4s,border-color .2s,transform .18s cubic-bezier(.2,.8,.2,1),box-shadow .18s}.card:hover{border-color:color-mix(in srgb, var(--c,var(--line-c)) 40%, transparent);box-shadow:0 6px 18px color-mix(in srgb, var(--shadow) 55%, transparent);transform:translateY(-1px)}.base{transition:border-color .25s}.base:hover{border-color:color-mix(in srgb, var(--line-c) 36%, transparent)}.pair-btn,.tab-add,.quit-btn,.modes button,.later,.cmp-alt{transition:color .15s,border-color .15s,background-color .15s,transform .12s}.pair-btn:hover:not(:disabled){color:var(--text);border-color:color-mix(in srgb, var(--line-c) 50%, transparent);background:color-mix(in srgb, var(--hi) 4%, transparent)}}:is(.pair-btn,.tab-add,.quit-btn,.go,.later,.cmp-send,.cmp-alt,.ask-send,.sheet-yes,.new-base,.modes button,.pitem,.d-doc,.thought,.more,.tab-btn):active:not(:disabled){transform:scale(.97)}.unit[data-mark=waiting]>.card{background:color-mix(in srgb, var(--amber) 11%, transparent)}.unit[data-mark=error]>.card{background:color-mix(in srgb, var(--err) 11%, transparent)}.unit[data-mark=working]>.card{background:color-mix(in srgb, var(--c) 7%, transparent)}.unit[data-mark=commanding]>.card,.token[data-mark=commanding]{background:color-mix(in srgb, var(--violet) 9%, transparent)}.plate{width:var(--s,40px);height:var(--s,40px);color:var(--c);background:radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--c) 26%, var(--plate-hi)), var(--plate) 72%);border-radius:50%;flex:none;place-items:center;transition:color .4s;display:grid;position:relative}.plate svg{width:calc(var(--s,40px) * .55);height:calc(var(--s,40px) * .55)}.ring,.plate:after{pointer-events:none;border-radius:50%;position:absolute;inset:-3px}.ring{opacity:0;background:conic-gradient(from 0deg, transparent 0 55%, var(--c));-webkit-mask:radial-gradient(farthest-side, transparent calc(100% - 3px), var(--shadow) calc(100% - 2px));mask:radial-gradient(farthest-side, transparent calc(100% - 3px), var(--shadow) calc(100% - 2px))}.plate[data-mark=working]>.ring{opacity:1;animation:1.1s linear infinite spin}.plate:after{content:"";border:2px solid var(--c);opacity:0}.plate[data-mark=waiting]:after{animation:1.5s ease-out infinite ping}.badge{width:clamp(16px, calc(var(--s,40px) * .3), 24px);height:clamp(16px, calc(var(--s,40px) * .3), 24px);font:700 10px/1 var(--mono);color:var(--ink);background:var(--c);border-radius:50%;flex:none;place-items:center;transition:background-color .4s;display:grid}.plate>.badge{position:absolute;bottom:-4px;right:-4px}[data-mark=waiting]>.badge:after{content:"?"}[data-mark=idle]>.badge:after{content:"z"}[data-mark=done]>.badge:after{content:"✓"}[data-mark=error]>.badge:after{content:"!"}[data-mark=unknown]>.badge:after{content:"·"}[data-mark=commanding]>.badge:after{content:"◈"}[data-mark=working]>.badge:after{content:"";border:2px solid var(--ink);border-right-color:#0000;border-radius:50%;width:8px;height:8px;animation:.8s linear infinite spin}[data-mark=waiting]>.badge{animation:1.2s ease-in-out infinite hop}.meta{min-width:0;display:grid}.name{white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.line{color:var(--dim);align-items:baseline;gap:8px;min-width:0;font-size:12px;display:flex}.role{white-space:nowrap;letter-spacing:.1em;text-transform:uppercase;color:color-mix(in srgb, var(--c) 70%, var(--dim));flex:none;font-size:10px;font-style:normal}.note{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}[data-monitoring]{color:var(--err);font-weight:600}.unit[data-mark=idle]>.card{opacity:.85}.subs{margin:6px 0 0 22px;padding-left:18px;position:relative}.subs:empty{display:none}.base>.tower-subs{margin:-8px 0 12px 22px}.subs:before{content:"";background:repeating-linear-gradient(color-mix(in srgb, var(--line-c) 50%, transparent) 0 4px, transparent 4px 8px);width:1px;position:absolute;top:-4px;bottom:22px;left:3px}.subs>.unit>.card:before{content:"";background:repeating-linear-gradient(90deg, color-mix(in srgb, var(--line-c) 50%, transparent) 0 4px, transparent 4px 8px);width:15px;height:1px;position:absolute;top:50%;left:-15px}.subs>.unit{position:relative}.subs>.unit>.card:after{content:"";border:3px solid #0000;border-left:4px solid color-mix(in srgb, var(--line-c) 60%, transparent);pointer-events:none;position:absolute;top:calc(50% - 3px);left:-5px}.subs>.unit:is([data-mark=working],[data-mark=commanding])>.card:before{animation:.8s linear infinite flow-x}.subs:has(>.unit:is([data-mark=working],[data-mark=commanding])):before{animation:.8s linear infinite flow-y}@keyframes flow-x{to{background-position:8px 0}}@keyframes flow-y{to{background-position:0 8px}}.subs .plate{--s:30px}.subs .name{font-size:13px}.side{top:calc(var(--hud,64px) + 20px);gap:16px;display:grid;position:sticky}.panel{border:1px solid var(--line);background:var(--panel);border-radius:18px;padding:14px 16px}.panel h2{color:var(--dim);letter-spacing:.14em;text-transform:uppercase;margin-bottom:10px;font-size:11px}.timeline summary{cursor:pointer;align-items:baseline;gap:10px;min-width:0;list-style:none;display:flex}.timeline summary::-webkit-details-marker{display:none}.timeline summary:after{content:"▾";color:var(--dim);margin-left:8px;transition:transform .2s}.timeline:not([open]) summary:after{transform:rotate(-90deg)}.timeline h2{flex:none;margin:0}.tl-at{color:var(--dim);font:11px var(--mono);flex:none}.tl-last{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:12.5px;overflow:hidden}.tl-span{color:var(--dim);flex:none;margin-left:auto;font-size:11px}.tl-lanes{border-top:1px dashed var(--line);height:46px;margin-top:8px;position:relative}.tl-lanes:after{content:"";background:var(--accent);width:2px;box-shadow:0 0 8px color-mix(in srgb, var(--accent) 60%, transparent);border-radius:1px;position:absolute;top:0;bottom:0;right:0}.tl-mark{width:10px;height:10px;margin-left:-5px;position:absolute}.tl-mark:before{content:"";background:var(--c);border-radius:2px;position:absolute;inset:1px}.tl-mark:is([data-mark=waiting],[data-mark=error],[data-mark=commanding]):before{transform:rotate(45deg)}.tl-mark:is([data-mark=done],.joined,.left):before{border-radius:50%}.tl-mark.left:before{box-shadow:inset 0 0 0 1.5px var(--c);background:0 0}.tl-mark:hover:before,.tl-mark:focus-visible:before{box-shadow:0 0 0 3px color-mix(in srgb, var(--c) 35%, transparent)}.tl-mark:focus-visible{outline:none}.tl-mark:hover:after,.tl-mark:focus-visible:after{content:attr(aria-label);z-index:1;border:1px solid var(--line);background:var(--raised);color:var(--text);font:12px var(--sans);white-space:nowrap;box-shadow:0 6px 16px color-mix(in srgb, var(--shadow) 60%, transparent);border-radius:8px;padding:4px 8px;position:absolute;bottom:calc(100% + 8px);left:-6px}.tl-mark.end:hover:after,.tl-mark.end:focus-visible:after{left:auto;right:-6px}.tl-axis{color:var(--dim);font:10px var(--mono);justify-content:space-between;margin-top:4px;display:flex}.line .age{color:var(--dim);font:10.5px var(--mono);opacity:.85;flex:none}.line .age:empty{display:none}.line .age:before{content:"· "}.unit[data-mark=waiting]>.card .age,.title .age{color:var(--amber);opacity:1}.title .age{color:var(--dim)}.title .age:not(:empty):before{content:" · "}.todo{align-items:baseline;gap:6px;min-width:0;font-size:11.5px;display:flex}.todo b{color:var(--violet);font:600 10.5px var(--mono);flex:none}.todo span{white-space:nowrap;text-overflow:ellipsis;opacity:.85;min-width:0;overflow:hidden}.todo span:empty{display:none}.ticks{pointer-events:none;gap:3px;height:3px;display:flex;position:absolute;bottom:3px;left:52px;right:12px}.ticks:empty{display:none}.ticks i{background:var(--c);opacity:calc(.25 + .65 * var(--o,1));border-radius:1px;flex:0 0 6px}.card.ticked{padding-bottom:11px}.subs .ticks{left:44px}.minimap{z-index:4;box-sizing:content-box;border:1px solid var(--line);background:var(--panel);opacity:.65;cursor:pointer;border-radius:10px;padding:6px;transition:opacity .2s;position:fixed;bottom:20px;right:20px}.minimap:hover{opacity:1}body:has(.tile) .minimap{opacity:0;pointer-events:none}body:has(.tile-layer:not([hidden])) .minimap{opacity:0;pointer-events:none}.minimap.away{opacity:0;pointer-events:none}.mm-in{position:absolute;inset:6px}.mm-in i{background:color-mix(in srgb, var(--c) 35%, var(--surface-1));border-radius:2px;position:absolute}.mm-view{border:1px solid var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent);pointer-events:none;border-radius:3px;position:absolute;top:6px;left:4px;right:4px}.credit{color:var(--dim);padding:0 6px;font-size:11px}.bar{flex-wrap:wrap;align-items:center;gap:6px 16px;margin:12px 6px 0;display:flex}.bar-acts{align-items:center;gap:8px;display:flex}.bar-acts .pair-btn{border-radius:10px;padding:3px 9px;font-size:11px}.legend{color:var(--dim);flex-wrap:wrap;gap:4px 14px;margin:0 0 0 auto;padding:0;font-size:11px;list-style:none;display:flex}.legend li{align-items:center;gap:6px;display:flex}.legend .badge{width:13px;height:13px;font-size:8px}.foot{gap:10px;margin-top:14px;display:grid}.foot .credit{opacity:.75}.enter{animation:.5s cubic-bezier(.2,.9,.3,1.15) both pop}.leaving{pointer-events:none;animation:.35s ease-in both out}.flash>.card>.plate,.flash.tower{animation:.6s ease-out flash}.flash>.card{animation:.9s ease-out card-glow}.flash.flip>.card{animation-name:card-glow-b}.flash.flip>.card>.plate,.flash.flip.tower,.flash.flip.token>.plate{animation-name:flash-b}@keyframes spin{to{transform:rotate(360deg)}}@keyframes glow{0%,to{box-shadow:0 0 5px 0 var(--c4)}50%{box-shadow:0 0 16px 4px var(--c)}}.plate[data-mark=commanding]:before,.tower[data-mark=commanding]:after{content:"";pointer-events:none;border-radius:50%;animation:2.4s ease-in-out infinite glow;position:absolute;inset:-2px}.stats [data-mark=commanding][data-on],.comms-head[data-mark=commanding] .logo{border-color:var(--c4);animation:2.4s ease-in-out infinite glow}.comms-head[data-mark=commanding] .logo{color:var(--c)}.comms-head[data-mark=commanding] h2 span{color:var(--c);text-shadow:0 0 10px var(--c4)}@keyframes ping{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.7)}}@keyframes hop{50%{transform:translateY(-3px)}}@keyframes blink{50%{opacity:.35}}@keyframes pop{0%{opacity:0;transform:scale(.92)translateY(8px)}}@keyframes pop-b{0%{opacity:0;transform:scale(.92)translateY(8px)}}@keyframes out{to{opacity:0;transform:scale(.94)}}@keyframes out-b{to{opacity:0;transform:scale(.94)}}@keyframes flash{40%{transform:scale(1.12)}}@keyframes card-glow{30%{box-shadow:0 0 0 1px var(--c4), 0 0 18px 1px var(--c4)}}@keyframes card-glow-b{30%{box-shadow:0 0 0 1px var(--c4), 0 0 18px 1px var(--c4)}}@keyframes flash-b{40%{transform:scale(1.12)}}@keyframes slide{0%{opacity:0;transform:translate(10px)}}@keyframes slide-b{0%{opacity:0;transform:translate(10px)}}@keyframes zoom{0%{opacity:0;transform:scale(.45)}}@keyframes zoom-b{0%{opacity:0;transform:scale(.45)}}@keyframes come-in{0%{opacity:0;transform:translate(-14px)scale(.98)}}@keyframes go-out{0%{opacity:0;transform:translate(14px)scale(.98)}}.tx.fresh{animation:.32s cubic-bezier(.2,.8,.2,1) both come-in}.tx.you.fresh{animation-name:go-out}[data-calm] :is(.link i,.sweep,.pulse,.ring,.badge,.term-typing),[data-calm] :is(.plate,.badge):after{animation:none!important}[data-calm] .tower[data-mark=waiting] .pulse{opacity:.55}[data-calm] .plate[data-mark=waiting]:after{opacity:.55;transform:scale(1.25)}[data-calm] .packet{opacity:0;animation-play-state:paused!important}[data-calm] .subs:before,[data-calm] .subs>.unit>.card:before{animation:none!important}@media (prefers-reduced-motion:reduce),(hover:none) and (prefers-reduced-motion:reduce){.plate[data-mark=commanding]:before,.tower[data-mark=commanding]:after{box-shadow:0 0 12px 3px var(--c4)}.stats [data-mark=commanding][data-on],.comms-head[data-mark=commanding] .logo{box-shadow:0 0 12px 2px var(--c4)}}[data-calm] :is(.plate,.tower)[data-mark=commanding]:before,[data-calm] .tower[data-mark=commanding]:after{box-shadow:0 0 12px 3px var(--c4);animation:none!important}[hidden]{display:none!important}a{color:inherit}.crumbs,.tally dt,.comms-head small,.tx.you>header,.notice em,.rule summary,.dossier-in>.tag,.d-drones h4,.d-docs h4,.specs dt,.stop,.dialog .tag,.intel h4,.pending b{color:var(--dim);letter-spacing:.14em;text-transform:uppercase;font-size:11px;font-style:normal}.token .name,.drone .note,.count small,.sum,.where,.tile b{white-space:nowrap;text-overflow:ellipsis;max-width:100%;overflow:hidden}.md a,.bubble a,.notice a,.d-note a,.specs a,.crumbs a{color:var(--accent)}.crumbs{gap:10px;min-width:0;display:flex}.crumbs>*+:before{content:"›";opacity:.5;margin-right:10px}.crumbs>*{white-space:nowrap;text-overflow:ellipsis;letter-spacing:.06em;flex:0 auto;min-width:0;max-width:28ch;overflow:hidden}.crumbs>:last-child{flex:auto;max-width:none}.crumb-more{cursor:pointer;color:var(--accent);display:none}.crumbs a,.brand{text-decoration:none}.work{align-items:flex-start;gap:20px;min-width:0;display:flex;position:relative}.gauge{visibility:hidden;height:0;position:absolute;left:0;right:0}.view{flex:1 1 0;min-width:0}body[data-stale=true] .work{opacity:.45}.enter-zoom{transform-origin:var(--ox,50%) var(--oy,0);animation:.5s ease-out both zoom}.enter-slide,.dossier{animation:.4s ease-out both slide}.enter-back{animation:.4s ease-out both pop}.enter-zoom.flip{animation-name:zoom-b}.enter-slide.flip{animation-name:slide-b}.enter-back.flip{animation-name:pop-b}.hit,.enter-base:after{z-index:1;border-radius:inherit;position:absolute;inset:0}.enter-base:after{content:"";z-index:0}.hit:hover{box-shadow:inset 0 0 0 1px var(--c)}.enter-base{text-decoration:none}.base>header:hover h2{color:var(--accent)}.alerts{width:210px;color:inherit;font:inherit;text-align:left;cursor:pointer;align-items:center;gap:10px;display:flex;position:relative}.alerts:disabled{cursor:default;opacity:.6}.alerts:not(:disabled){border-color:var(--c4);background:var(--c1)}.faces{flex:none;padding-left:10px;display:flex}.faces .plate{--s:28px;box-shadow:0 0 0 2px var(--raised);margin-left:-10px}.faces .badge{display:none}.count{min-width:0;display:grid}.count b{font:600 18px/1.1 var(--mono)}.count small,.comms-head p,.cmp-note,.where,.queued,.d-line,.who p{color:var(--dim);font-size:12px}.token{border:1px solid #0000;border-radius:16px;justify-items:center;gap:3px;width:100%;padding:10px 8px 9px;text-decoration:none;display:grid;position:relative}a.token:hover{border-color:var(--c4)}.token[data-mark=waiting]{background:color-mix(in srgb, var(--amber) 11%, transparent)}.token[data-mark=error]{background:color-mix(in srgb, var(--err) 11%, transparent)}.token .plate{--s:64px;margin-bottom:4px}.token .name{font-weight:600}.token .line{justify-items:center;max-width:100%;display:grid}.drone{width:94px;padding:6px;font-size:12px}.drone .plate{--s:44px}.drone .role{display:none}.agent{letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--c4);color:var(--dim);border-radius:8px;margin-left:4px;padding:0 5px;font-size:9px;font-style:normal}.agent:empty,.drone .agent{display:none}.flash.token>.plate{animation:.6s ease-out flash}.zoom-in,.comms-in{border:1px solid var(--line);background:var(--grid), var(--well);border-radius:22px;position:relative}.zoom-in{min-height:420px;padding:24px}.zoom-in.void>:not(.lost){display:none}.lost,.chat-empty{color:var(--dim);text-align:center;padding:60px 0}.keep{align-items:center;gap:20px;padding:18px 22px;display:flex}.keep h2{font-size:24px}.tower.big{width:120px;height:120px}.tower.big svg{width:72px;height:72px}.tower.big>.badge{--s:96px;bottom:4px;right:4px}a.tower:hover:before{border-color:var(--c)}.tally{gap:10px;display:flex}.squads,.camps{grid-template-columns:repeat(auto-fit,minmax(min(100%,430px),1fr));align-items:start;gap:18px;margin-top:20px;display:grid}.squad{background:color-mix(in srgb, var(--surface-0) 78%, transparent);padding:14px 16px 18px}.squad[data-mark=waiting]{background:color-mix(in srgb, var(--amber) 7%, var(--surface-0))}.squad h3{align-items:center;gap:10px;margin-bottom:14px;display:flex}.squad h3 b,.crumbs b{color:var(--text)}.squad h3 small{margin-left:auto}.squad h3 svg{width:18px;height:18px}.flag{background:var(--c);width:10px;height:10px;box-shadow:0 0 8px var(--c);border-radius:2px;transform:rotate(45deg)}.formation{flex-wrap:wrap;align-items:flex-start;gap:16px 20px;display:flex}.col{justify-items:center;gap:8px;width:196px;display:grid}.say{background:var(--raised);width:100%;color:var(--dim);border-radius:12px;margin-top:4px;padding:7px 10px;font-size:12px;line-height:1.35}.say p{overflow-wrap:anywhere;max-height:4.05em;overflow:hidden}.drones{flex-wrap:wrap;justify-content:center;gap:8px;width:100%;padding-top:16px;display:flex;position:relative}.drones:empty{display:none}.tower-drones{justify-content:flex-start;margin-top:-8px;padding-left:35px}.drones.tower-drones:before{left:82px}.drones:before{content:"";background:repeating-linear-gradient(color-mix(in srgb, var(--line-c) 60%, transparent) 0 4px, transparent 4px 8px);width:1px;height:14px;position:absolute;top:0;left:50%}.camp .token{width:156px}[data-group=outside] .plate{filter:saturate(.3);outline:1px dashed color-mix(in srgb, var(--dim) 55%, transparent);outline-offset:4px}.comms-in,.tile{height:calc(var(--vvh,100vh) - var(--hud,64px) - 64px);grid-template-rows:auto minmax(0,1fr) auto;min-height:380px;display:grid;overflow:hidden}.comms-head,.tile>header{background:var(--panel);align-items:center;gap:12px;padding:12px 18px;display:flex}.ava{width:30px;height:30px;color:var(--accent);background:radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--accent) 28%, transparent), var(--plate) 72%);border-radius:50%;flex:none;place-items:center;display:grid}.ava svg{width:58%;height:58%}.comms-head h2{font-size:16px}.chan{white-space:nowrap;flex:none;margin-left:auto}.head-id{flex:auto;min-width:0}.head-id h2,.head-id p{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.head-back{display:none}.modes+.chan{margin-left:12px}.head-main,.head-quit{margin-left:4px}.head-quit{letter-spacing:.08em;text-transform:uppercase;border-radius:12px;padding:6px 10px}.chat-root{min-height:0;display:grid;position:relative}.comms-in .ask{max-height:calc((var(--vvh,100vh) - var(--hud,64px) - 64px) * .55);overscroll-behavior:contain;overflow-y:auto}.chat-scroll{overflow-anchor:none;padding:12px 16px;font-size:15px;overflow-y:auto}.chat-list{gap:8px;max-width:1040px;margin-inline:auto;display:grid}.tx.in+.tx.in,.tx.you+.tx.you{margin-top:-4px}.tx.in+.tx.in>.ava,.tx.you+.tx.you .ava{visibility:hidden}.tx.in+.tx.in .tx-body>header b,.tx.you+.tx.you>header b{display:none}.chat-top{height:1px}.chat-end{height:1px;margin-top:-1px}.chat-live{max-width:1040px;color:var(--c);align-items:center;gap:10px;margin:14px auto 0;padding-left:44px;font-size:12px;display:flex}.chat-pill{--c:var(--accent);border:0;position:absolute;bottom:14px;left:50%;transform:translate(-50%)}.lit:after{content:"";background:color-mix(in srgb, var(--accent) 18%, transparent);border-radius:14px;animation:1s 1s forwards out;position:absolute;inset:0}.lit.flip:after{animation-name:out-b}.composer{border-top:1px solid var(--line);background:var(--panel);gap:8px;padding:12px 18px 14px;display:grid;position:relative}.cmp-row,.cmp-acts,.cmp-foot,.cmp-note{align-items:center;gap:8px;display:flex}.cmp-row{align-items:flex-end;gap:10px}.composer textarea{resize:none;border:1px solid var(--line);background:var(--sunken);min-width:0;color:var(--text);font:14px/1.4 var(--sans);border-radius:12px;flex:1;padding:9px 12px}@supports (field-sizing:content){.composer textarea{field-sizing:content;max-height:220px}.composer{grid-template-columns:minmax(0,1fr)}}.composer textarea:focus{border-color:color-mix(in srgb, var(--accent) 50%, transparent);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent);outline:none}.composer button:disabled{opacity:.45;cursor:default}.cmp-note{flex-wrap:wrap;flex:1;min-height:18px}.cmp-note[data-tone=error],.cmp-alt.cmp-stop{color:var(--err-soft)}.cmp-note[data-tone=ok]{color:var(--ok)}.cmp-note[data-tone=ask]{color:var(--gold)}.cmp-link{color:var(--accent);font:12px var(--sans);cursor:pointer;background:0 0;border:0;padding:0}.slash{z-index:5;border:1px solid var(--line);background:var(--surface-0);max-height:260px;box-shadow:0 8px 24px color-mix(in srgb, var(--shadow) 53%, transparent);border-radius:12px;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% - 6px);left:18px;right:18px;overflow-y:auto}.slash li{cursor:pointer;border-radius:8px;align-items:baseline;gap:10px;padding:6px 10px;display:flex}.slash li[aria-selected=true]{background:color-mix(in srgb, var(--accent) 12%, transparent)}.slash b{color:var(--accent);font:600 13px var(--mono);white-space:nowrap}.slash span{min-width:0;color:var(--dim);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.cmp-yes{background:var(--gold);color:var(--ink);font:600 12px var(--sans);cursor:pointer;border:0;border-radius:8px;padding:3px 10px}.tx{content-visibility:auto;contain-intrinsic-size:auto 220px;min-width:0}.tx.you{contain-intrinsic-size:auto 76px}.tx.sys,.tx.rule{contain-intrinsic-size:auto 40px}.tx.note{contain-intrinsic-size:auto 24px}.tx time,.tx.note{color:var(--dim);font:11px var(--mono)}.tx.you{justify-items:end;gap:5px;display:grid}.tx.you>header{color:var(--gold);align-items:center;gap:8px;display:flex}.tx.you .ava{color:var(--gold)}.bubble{border:1px solid color-mix(in srgb, var(--gold) 22%, transparent);background:color-mix(in srgb, var(--gold) 8%, transparent);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:14px;max-width:80%;padding:7px 12px;line-height:1.5}.tx.in{grid-template-columns:30px minmax(0,1fr);align-items:start;gap:8px;display:grid}.tx-body{border:1px solid var(--line);background:var(--panel);border-radius:14px;gap:6px;padding:8px 12px;display:grid}.tx-body,.tx-body>*{min-width:0}.tx-body>header{color:var(--dim);font:11px var(--mono);align-items:baseline;gap:10px;display:flex}.tx-body>header b{color:var(--accent);font:600 13px var(--sans)}.stop,.dialog .tag{background:var(--c1);color:var(--c);border-radius:999px;padding:1px 8px;font-size:10px}.fault{color:var(--err-soft);font-size:13px}.thought,.more,.tab-btn{border:1px solid var(--line);color:var(--dim);font:11px var(--sans);cursor:pointer;background:0 0;border-radius:999px;justify-self:start;padding:2px 10px}.thought-text:empty{display:none}.thought-text,.out,.args,.notice pre,.rule pre{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--dim);font:13px/1.45 var(--mono)}.act,.notice{border:1px solid color-mix(in srgb, var(--hi) 7%, transparent);background:color-mix(in srgb, var(--hi) 3%, transparent);border-radius:10px}.act>summary,.notice>summary,.rule summary{cursor:pointer;align-items:center;gap:8px;min-width:0;padding:5px 10px;font-size:13.5px;list-style:none;display:flex}summary::-webkit-details-marker{display:none}.act code{color:var(--c);font:600 11px var(--mono);letter-spacing:.06em;text-transform:uppercase}.sum{min-width:0;color:var(--dim)}.act[open] .sum{white-space:normal}.open{flex:none;margin-left:auto}.act>pre,.result{margin:0 10px 8px}.result{gap:6px;display:grid}.tx.sys{padding-left:38px}.notice{border-color:color-mix(in srgb, var(--violet) 20%, transparent);background:color-mix(in srgb, var(--violet) 7%, transparent)}.notice .ava{width:22px;height:22px}.notice pre,.rule pre{padding:0 10px 8px}.rule summary{justify-content:center}.rule summary:before,.rule summary:after{content:"";background:var(--line);flex:1;height:1px}.tx.note{text-align:center}.dossier-in{text-align:center;justify-items:center;gap:6px;display:grid;position:relative}.dossier-in>.tag{text-align:left;justify-self:stretch}.portrait{background:radial-gradient(var(--c1), transparent 70%);border-radius:50%;padding:8px}.portrait .plate{--s:96px}.dossier-in h3{overflow-wrap:anywhere;margin-top:4px;font-size:18px}.d-line,.who p{align-items:baseline;gap:8px;display:flex}.d-note{background:color-mix(in srgb, var(--amber) 12%, transparent);border-radius:10px;padding:8px 10px;font-size:12px}.specs{text-align:left;justify-self:stretch;gap:2px;margin-top:10px;display:grid}.specs div{background:color-mix(in srgb, var(--hi) 4%, transparent);grid-template-columns:76px minmax(0,1fr);gap:8px;padding:7px 10px;display:grid}.specs dt{font-size:10px}.specs dd{overflow-wrap:anywhere;font-size:12.5px}.d-drones,.d-squads{margin-top:8px}.d-squads{justify-self:stretch;gap:10px;display:grid}.d-squad{gap:6px;display:grid}.d-squad small{color:var(--dim)}.d-squad .formation{gap:6px}.d-x,.head-info{display:none}.d-drones .formation{justify-content:center;gap:6px}.md{overflow-wrap:anywhere;line-height:1.55}.md p,.md ul,.md ol,.md pre,.md table,.md blockquote{margin:0 0 8px}.md>:last-child{margin-bottom:0}.md :is(h1,h2,h3,h4,h5,h6){margin:12px 0 6px;font-size:16px}.md>:first-child{margin-top:0}.md h1{font-size:19px}.md ul,.md ol{padding-left:22px}.md li>p{margin:0}.md li.task{margin-left:-18px;list-style:none}.check{vertical-align:-2px;text-align:center;width:14px;height:14px;font:700 10px/12px var(--mono);border:1px solid;border-radius:4px;margin-right:7px;display:inline-block}.check[data-done=true]{background:var(--ok);color:var(--ink)}.md code{background:color-mix(in srgb, var(--hi) 8%, transparent);font:13.5px var(--mono);border-radius:5px;padding:1px 5px}.md pre{border:1px solid var(--line);background:var(--sunken);border-radius:10px;padding:10px 12px;overflow-x:auto}.md pre code{background:0 0;padding:0}.md blockquote{background:color-mix(in srgb, var(--hi) 4%, transparent);color:var(--dim);padding:6px 12px}.md table{border-collapse:collapse;display:block;overflow-x:auto}.md th,.md td{border:1px solid var(--line);padding:4px 10px}.tiles{flex:1 1 0;gap:20px;min-width:0;display:flex}.tile-tabs{display:none}.tile{min-width:0;top:calc(var(--hud,64px) + 20px);border:1px solid var(--line);background:var(--panel);border-radius:22px;flex:1 1 0;position:sticky}.tile>header svg{width:22px;height:22px;color:var(--gold)}.tile{grid-template-columns:minmax(0,1fr)}.tile>header b{flex:1;min-width:0}.tile-body{padding:16px 20px;overflow:auto}.tiles.tabbed{flex-direction:column;gap:8px}.tile:has(.spawn,.pair){height:auto;min-height:0;max-height:calc(var(--vvh,100vh) - var(--hud,64px) - 64px);align-self:flex-start}.spawn .chat-empty{text-align:left;padding:0}.spawn .chat-empty:empty{display:none}.tiles.tabbed .tile-tabs{gap:6px;display:flex}.tiles.tabbed .tile:not(.active){display:none}.tiles.tabbed .tile{flex:none}.tab-btn.active,.open{border-color:color-mix(in srgb, var(--gold) 40%, transparent);color:var(--gold)}.dock{z-index:20;top:calc(var(--hud,64px) + 24px);pointer-events:none;width:min(300px,100vw - 44px);display:grid;position:fixed;right:max(20px,50vw - 1080px)}.dialog{pointer-events:auto;border:1px solid var(--c4);background:linear-gradient(var(--c1), var(--surface-0) 70%), var(--raised);box-shadow:0 24px 60px color-mix(in srgb, var(--shadow) 80%, transparent);transform-origin:top;border-radius:18px;grid-area:1/1;padding:14px 16px 16px;transition:transform .3s,opacity .3s;position:relative}.dialog:focus{outline:none}.dialog{max-height:calc(100dvh - var(--hud,64px) - 44px);overscroll-behavior:contain;overflow-y:auto}.dialog>header{align-items:center;gap:8px;min-width:0;margin-bottom:12px;display:flex}.where{min-width:0}.x{color:var(--dim);cursor:pointer;background:0 0;border:0;margin-left:auto;font-size:20px}.zoom{color:var(--dim);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 6px;font-size:17px}.zoom+.x{margin-left:0}.zoom:hover,.x:hover{color:var(--text)}.dock.wide{width:min(880px,100vw - 44px);top:72px;right:50%;transform:translate(50%)}.dock.wide .dialog{max-height:calc(100dvh - 96px)}.who{align-items:center;gap:14px;display:flex}.who .plate{--s:56px}.who h3{font-size:17px}.intel{background:color-mix(in srgb, var(--bg) 55%, transparent);border-radius:12px;margin-top:12px;padding:10px 12px}.intel h4{margin-bottom:4px}.said{overflow-wrap:anywhere;font-size:13px;line-height:1.45}.pending{color:var(--c);font:12px var(--mono);overflow-wrap:anywhere;margin-top:8px}.dialog footer{flex-wrap:wrap;align-items:center;gap:10px;margin-top:14px;display:flex}.ask{border:1px solid color-mix(in srgb, var(--amber) 35%, transparent);background:color-mix(in srgb, var(--amber) 6%, transparent);border-radius:14px;gap:8px;margin:10px 18px 0;padding:12px 14px;display:grid}.dialog .ask{margin:10px 0 0}.ask-one{gap:8px;display:grid}.ask-one+.ask-one{margin-top:8px}.ask-head{background:color-mix(in srgb, var(--amber) 14%, transparent);color:var(--gold);letter-spacing:.06em;text-transform:uppercase;border-radius:999px;justify-self:start;padding:1px 9px;font-size:11px}.ask-how{color:var(--dim);font-size:12px}.ask-q{white-space:pre-wrap;overflow-wrap:anywhere;font-weight:600}.ask-ctx,.ask-why{color:var(--dim);white-space:pre-wrap;overflow-wrap:anywhere;max-height:9em;font-size:13px;overflow:auto}.ask-opts{counter-reset:opt;gap:6px;max-height:16em;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.ask-opt{border:1px solid var(--line);background:var(--sunken);overflow-wrap:anywhere;counter-increment:opt;border-radius:10px;gap:2px;padding:7px 12px;font-size:13px;display:grid}.ask-opt b:before{content:counter(opt) ". ";color:var(--dim)}.ask-opt b[data-n]:before{content:attr(data-n) ". "}.ask-opt small{color:var(--dim);font-size:12px}.ask-acts{flex-wrap:wrap;align-items:center;gap:6px 14px;display:flex}.ask-acts>:last-child{margin-left:auto}.ask-term{color:var(--gold);font-size:12px}.ask button:disabled{opacity:.45;cursor:default}.ask-note:empty{display:none}.ask-note{color:var(--dim);flex-wrap:wrap;align-items:center;gap:4px 10px;font-size:12px;display:flex}.ask-note[data-tone=error]{color:var(--err-soft)}.ask-note[data-tone=ok]{color:var(--ok)}.ask-title{font:12.5px/1.45 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;max-height:12em;margin:0;overflow:auto}div.ask-opts{max-height:none;overflow:visible}button.ask-opt{text-align:left;color:var(--text);font:13px var(--sans);cursor:pointer}.ask-opt[aria-checked=true]{border-color:var(--amber);background:color-mix(in srgb, var(--amber) 12%, transparent)}.ask-own{resize:vertical;field-sizing:content;border:1px solid var(--line);background:var(--sunken);min-width:0;max-height:10em;color:var(--text);font:13px var(--sans);border-radius:10px;padding:7px 12px}.ask-memo{font-size:12px}.ask input:disabled,.ask textarea:disabled{opacity:.45}.ask-send{background:var(--amber);color:var(--ink);font:600 13px var(--sans);cursor:pointer;border:0;border-radius:10px;padding:7px 13px}.trust h4{color:var(--dim);letter-spacing:.14em;text-transform:uppercase;margin:4px 0 0;font-size:11px;font-weight:400}.trust-found{gap:8px;max-height:14em;display:grid;overflow:auto}.trust-group b{font:12.5px var(--mono);overflow-wrap:anywhere}.trust-group small{color:var(--err-soft);display:block}.trust-group ul{font:12px/1.5 var(--mono);color:var(--dim);overflow-wrap:anywhere;margin:2px 0 0;padding:0 0 0 1.2em}.trust-more{font-family:var(--sans);margin-left:-1.2em;font-style:italic;list-style:none}.trust-folder{font:600 13px/1.4 var(--mono);overflow-wrap:anywhere;margin:0}.trust .ask-why{max-height:none;overflow:visible}.trust .ask-acts>:last-child{margin-left:0}@media (width<=600px){.deploy-trust .trust-found{max-height:7em}.deploy-trust .ask-why{font-size:12px}}.deploy-trust:empty{display:none}.deploy-trust .ask{margin:0}.go,.later,.chat-pill,.cmp-send,.cmp-alt{font:600 13px var(--sans);cursor:pointer;border-radius:10px;padding:7px 13px;text-decoration:none}.go,.chat-pill{background:var(--c);color:var(--ink)}a.go{justify-content:center;align-items:center;display:inline-flex}.cmp-send{background:var(--accent);color:var(--ink);border:0}.later,.cmp-alt{border:1px solid var(--line);color:var(--text);background:0 0}.queued{color:var(--dim);flex:1 0 100%;font-size:12px}.queued:empty{display:none}html.paused *,html.paused :before,html.paused :after{animation-play-state:paused!important}@media (width<=1100px){.stage[data-view]{grid-template-columns:1fr}.side{position:static}}@media (width<=1040px){.stats{display:none}}.term-tile{grid-template-rows:auto minmax(0,1fr) auto;gap:10px;height:100%;display:grid}.tile-body:has(.term-tile){padding:12px 14px;overflow:hidden}.term-bar{justify-content:space-between;align-items:center;gap:12px;font-size:12px;display:flex}.term-scroll{transition:border-color .2s,box-shadow .2s}.term-scroll.typing{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 18%, transparent)}.term-scroll.engage{animation:.6s ease-out term-engage}.term-scroll.blip{animation:.22s ease-out term-blip}.term-scroll.blip.flip{animation-name:term-blip-b}@keyframes term-engage{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 80%, transparent), 0 0 0 color-mix(in srgb, var(--accent) 0%, transparent)}60%{box-shadow:0 0 0 7px color-mix(in srgb, var(--accent) 0%, transparent), 0 0 34px color-mix(in srgb, var(--accent) 40%, transparent)}to{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 18%, transparent)}}@keyframes term-blip{0%{box-shadow:0 0 0 2px color-mix(in srgb, var(--accent-hi) 80%, transparent), 0 0 32px color-mix(in srgb, var(--accent) 53%, transparent)}to{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 18%, transparent)}}@keyframes term-blip-b{0%{box-shadow:0 0 0 2px color-mix(in srgb, var(--accent-hi) 80%, transparent), 0 0 32px color-mix(in srgb, var(--accent) 53%, transparent)}to{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent), 0 0 22px color-mix(in srgb, var(--accent) 18%, transparent)}}.term-sink{opacity:0;resize:none;pointer-events:none;border:0;width:1px;height:18px;padding:0;position:fixed;overflow:hidden}.term-typing{color:var(--accent);margin-left:auto;font-weight:600;animation:1.6s ease-in-out infinite term-note}@keyframes term-note{50%{opacity:.55;text-shadow:0 0 10px color-mix(in srgb, var(--accent) 60%, transparent)}}.term-state{color:var(--dim)}.term-state[data-tone=ok]{color:var(--ok)}.term-state[data-tone=error]{color:var(--err-soft)}.term-scroll{overscroll-behavior:contain;border:1px solid var(--line);background:var(--term-bg);border-radius:14px;padding:8px 10px;overflow:auto}@font-face{font-family:SB Nerd Symbols;src:local(SymbolsNFM),local(Symbols Nerd Font Mono),local(HackNFM-Regular),url(./SymbolsNerdFontMono-DkrHkSnn.woff2)format("woff2");unicode-range:U+E000-F8FF,U+F0000-FFFFD;font-display:swap}.term{width:max-content;min-width:100%;color:var(--term-fg);font:12px/1.3 var(--mono);white-space:pre;font-family:ui-monospace,SF Mono,Menlo,Consolas,SB Nerd Symbols,monospace;transition:opacity .2s}.term .tr{min-height:1.3em}.term.stale{opacity:.5}.term.hidden{display:none}.plate[data-docs]:before{content:attr(data-docs);z-index:1;background:linear-gradient(var(--paper-hi), var(--paper));min-width:10px;height:16px;color:var(--paper-ink);font:700 9px/16px var(--mono);text-align:center;box-shadow:0 0 0 2px var(--plate), 2px 2px 0 1px var(--paper-edge);border-radius:3px 6px;padding:0 3px;position:absolute;top:-5px;left:-5px}.d-docs{text-align:left;margin-top:12px}.d-docs h4{text-align:center;margin:0 0 6px}.d-doc-list{gap:6px;display:grid}.d-doc{border:1px solid color-mix(in srgb, var(--paper) 25%, transparent);background:color-mix(in srgb, var(--paper) 7%, transparent) no-repeat 9px 50% / 13px 16px linear-gradient(var(--paper-hi), var(--paper));width:100%;color:var(--text);font:13px var(--sans);text-align:left;cursor:pointer;border-radius:10px;gap:1px;padding:7px 10px 7px 30px;display:grid}.d-doc:hover{border-color:color-mix(in srgb, var(--paper) 67%, transparent)}.d-doc b{overflow-wrap:anywhere;font-weight:600}.d-doc small{color:var(--dim);font-size:11px}.d-docs-cut{color:var(--dim);margin:6px 0 0;font-size:12px}.doc-tile{grid-template-rows:auto minmax(0,1fr);gap:10px;height:100%;display:grid}.tile-body:has(.doc-tile){padding:12px 14px;overflow:hidden}.doc-bar{flex-wrap:wrap;justify-content:flex-start}.doc-why{min-width:0;color:var(--text);flex:160px}.doc-off{color:var(--gold);font-style:normal}.doc-acts{align-items:center;gap:14px;display:flex}.doc-acts>.cmp-link{align-items:center;display:inline-flex}.doc-frame{border:1px solid color-mix(in srgb, var(--paper) 33%, transparent);background:#fff;border-radius:12px;width:100%;height:100%;min-height:240px}.doc-text{border:1px solid color-mix(in srgb, var(--paper) 25%, transparent);background:var(--plate);border-radius:12px;padding:14px 18px;overflow:auto}.doc-pre{white-space:pre-wrap;font:12.5px/1.45 var(--mono);margin:0}.pad{gap:6px;display:grid}.pad-row{grid-template-columns:repeat(auto-fit,minmax(48px,1fr));gap:6px;display:grid}.pad-key{border:1px solid var(--line);background:var(--surface-0);min-height:34px;color:var(--text);font:600 12px var(--mono);cursor:pointer;border-bottom-width:3px;border-radius:9px;padding:4px 6px}.pad-key:active:not(:disabled){background:var(--raised);border-bottom-width:1px;transform:translateY(2px)}.pad-key:disabled{opacity:.35;cursor:default}.pad-key[data-key=enter]{color:var(--accent)}.pad-key[data-key=esc]{color:var(--gold)}.pad-key:is([data-key=up],[data-key=down],[data-key=left],[data-key=right],[data-key=backspace]){font-size:16px}.pad-digits summary{color:var(--dim);cursor:pointer;padding:2px 0;font-size:12px}.pad-note:empty{display:none}.pad-note{color:var(--dim);flex-wrap:wrap;align-items:center;gap:6px 12px;margin:0;font-size:12px;display:flex}.pad-note[data-tone=error]{color:var(--err-soft)}.pad-note[data-tone=ask]{border:1px solid color-mix(in srgb, var(--amber) 40%, transparent);background:color-mix(in srgb, var(--amber) 8%, transparent);color:var(--text);border-radius:10px;padding:8px 10px}.pad-yes{background:var(--amber);color:var(--ink);font:600 12px var(--sans);cursor:pointer;border:0;border-radius:9px;padding:5px 11px}.c0{color:#414868}.cz{color:var(--term-bg)}.c1{color:#f7768e}.c2{color:#9ece6a}.c3{color:#e0af68}.c4{color:#7aa2f7}.c5{color:#bb9af7}.c6{color:#7dcfff}.c7{color:#a9b1d6}.c8{color:#545c7e}.c9{color:#ff899d}.c10{color:#9fe044}.c11{color:#faba4a}.c12{color:#8db0ff}.c13{color:#c7a9ff}.c14{color:#a4daff}.c15{color:#c0caf5}.k0{background:var(--term-bg)}.k1{background:#f7768e}.k2{background:#9ece6a}.k3{background:#e0af68}.k4{background:#7aa2f7}.k5{background:#bb9af7}.k6{background:#7dcfff}.k7,.kz{background:#a9b1d6}.k8{background:#545c7e}.k9{background:#ff899d}.k10{background:#9fe044}.k11{background:#faba4a}.k12{background:#8db0ff}.k13{background:#c7a9ff}.k14{background:#a4daff}.k15{background:#c0caf5}.tb{font-weight:700}.td{opacity:.6}.ti{font-style:italic}.tu{text-decoration:underline}.ts{text-decoration:line-through}.tu.ts{text-decoration:underline line-through}.drawer,.drawer-veil{display:none}.drawer{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;z-index:30;background:var(--surface-0);border-right:1px solid var(--line);width:min(86vw,360px);box-shadow:8px 0 30px color-mix(in srgb, var(--shadow) 50%, transparent);transform:translateX(calc(var(--dx,0px) - 100%));visibility:hidden;flex-direction:column;transition:transform .22s ease-out,visibility 0s .22s;display:flex;position:fixed;inset:0 auto 0 0}.drawer.on{visibility:visible;transition:transform .22s ease-out}.drawer-veil{z-index:29;background:color-mix(in srgb, var(--shadow) 60%, transparent);opacity:0;pointer-events:none;transition:opacity .22s;position:fixed;inset:0}.drawer-drag .drawer,.drawer-drag .drawer-veil{transition:none}.drawer>header{padding:max(12px, env(safe-area-inset-top)) 12px 8px max(14px, env(safe-area-inset-left));color:var(--dim);letter-spacing:.1em;text-transform:uppercase;justify-content:space-between;align-items:center;font-size:12px;display:flex}.drawer-top{padding:0 10px 8px max(10px, env(safe-area-inset-left));justify-content:space-between;align-items:center;gap:8px;display:flex}.drawer-top[hidden]{display:none}.drawer-top{justify-content:flex-end}.drawer-top .pair-btn{min-height:36px}.drawer-top .pair-btn[hidden]{display:none}.drawer-body{overscroll-behavior:contain;min-height:0;padding:4px 10px 16px max(10px, env(safe-area-inset-left));flex:1;align-content:start;gap:12px;display:grid;overflow-y:auto}.drawer-foot{padding:8px 10px max(10px, env(safe-area-inset-bottom)) max(10px, env(safe-area-inset-left));border-top:1px solid var(--line);background:var(--surface-0);flex:none}.drawer-map{border:1px solid var(--line);background:color-mix(in srgb, var(--hi) 4%, transparent);min-height:48px;color:var(--text);border-radius:12px;justify-content:center;align-items:center;padding:0 12px;font-size:14px;font-weight:600;text-decoration:none;display:flex}.drawer-map[aria-current]{color:var(--dim)}.dbase h3{justify-content:space-between;align-items:baseline;gap:8px;margin:0 0 6px;font-size:14px;display:flex}.dbase h3 a{color:var(--text);text-overflow:ellipsis;white-space:nowrap;text-decoration:none;overflow:hidden}.dbase h3 small,.dgroup h4{color:var(--dim);letter-spacing:.1em;text-transform:uppercase;font-size:11px}.dbase[data-mark=waiting] h3 a{color:var(--c)}.dgroups,.drows{gap:6px;display:grid}.dgroup h4{margin:4px 0 0;font-weight:600}.drawer .card{gap:8px;min-height:44px;padding:6px 8px}.drawer .plate{--s:28px}.drawer .subs{margin-left:16px;padding-left:12px}.drawer .trow{justify-content:space-between;align-items:center;gap:8px;display:flex}.drawer .tower-go{border:1px solid var(--line);width:56px;height:44px;color:var(--c);border-radius:12px;place-items:center;text-decoration:none;display:grid}.drawer .tower-row.current>.trow>.tower-go{border-color:var(--c4);background:var(--c1)}.drawer .tower-go .plate{--s:34px}.drawer .tower-add{letter-spacing:0;place-items:center;min-width:56px;min-height:44px;padding:0;font-size:22px;font-weight:400;line-height:1;display:grid}.drawer .tower-add[hidden]{display:none}.drawer .quit-btn{min-height:44px}.drawer .quit-btn[hidden]{display:none}.drawer .line{gap:6px}.drawer .dstate{color:var(--c);flex:none;font-size:11px;font-weight:600}.drawer .unit.current>.card{border-color:var(--c4);box-shadow:inset 3px 0 var(--c), inset -3px 0 var(--c)}.drawer .unit[data-dismiss]>.card{transform:translateX(var(--sx,0px));opacity:var(--so,1);transition:transform .2s ease-out,opacity .2s}.drawer .unit>.card.swiping{transition:none}.drawer .unit>.card.gone{--sx:110%;--so:0}@media (width<=640px){.drawer{display:flex}.drawer-veil{display:block}}@media (width<=900px){.work{flex-direction:column;align-items:stretch}.view,.tiles{flex:none}.tile{position:static}.keep{flex-wrap:wrap}}@media (width<=640px){.shell{padding:max(8px, env(safe-area-inset-top)) max(8px, env(safe-area-inset-right)) calc(24px + env(safe-area-inset-bottom)) max(8px, env(safe-area-inset-left))}.hud{flex-wrap:wrap;gap:10px;padding:10px 12px;position:static}.brand p,.link span{display:none}.alert-row{flex:100%;order:3;min-width:0}.alert-row .alerts{flex:auto;width:auto;min-width:0}.done-btn{min-height:40px}.brand{flex:auto;min-width:0}.prefs-btn{width:40px;height:40px}.prefs-pop>*{min-height:40px}.tl-span{display:none}.crumbs{gap:6px}.crumbs>*+:before{margin-right:6px}.crumbs>*{max-width:16ch}.crumbs:not(.open)>.mid{display:none}.crumbs:not(.open)>.crumb-more{flex:none;display:block}.crumbs.open{flex-wrap:wrap;row-gap:4px}.map,.zoom-in{padding:14px}.bases{column-gap:18px}.legend{display:none}.keep{gap:12px;padding:6px}.tower.big{width:84px;height:84px}.tower-drones{padding-left:1px}.drones.tower-drones:before{left:48px}.tally{flex-wrap:wrap}.col{width:100%}.dossier:not(.full){content-visibility:hidden}.comms-in,.dossier.full{left:0;right:0;top:var(--vvt,0px);height:var(--vvh,100dvh);background:var(--bg);position:fixed}.tiles:has(.tile){left:0;right:0;top:var(--vvt,0px);height:var(--vvh,100dvh);background:var(--bg);position:fixed}.comms-in{z-index:15;border:0;border-radius:0;grid-template-columns:minmax(0,1fr);min-height:0}#session-view.enter-slide,#session-view.enter-back{animation:none}#session-view.enter-slide>.comms-in{animation:.4s ease-out both slide}#session-view>.lost{inset:var(--vvt,0px) 0 auto;height:var(--vvh,100dvh);z-index:15;background:var(--bg);margin:0;position:fixed}.tiles:has(.tile){z-index:16;padding:8px;overflow-y:auto}.tile{height:calc(var(--vvh,100dvh) - 16px);border-radius:16px;min-height:300px}.dossier.full{z-index:17;overscroll-behavior:contain;padding:max(16px, env(safe-area-inset-top)) 16px calc(16px + env(safe-area-inset-bottom));border:0;border-radius:0;overflow-y:auto}.dossier.full .d-x{place-items:center;display:grid;position:absolute;top:0;right:0}.comms-head{padding:max(10px, env(safe-area-inset-top)) 12px 10px;grid-template-columns:auto minmax(0,1fr) auto auto auto auto;gap:8px 10px;display:grid}.comms-head .logo{display:none}.head-back{border:1px solid var(--line);width:40px;height:40px;color:var(--text);border-radius:12px;place-items:center;font-size:24px;text-decoration:none;display:grid}.head-info,.head-main:not([hidden]),.head-quit:not([hidden]){margin:0;padding:0 12px;display:block}.comms-head h2 small,.chan b{display:none}.modes+.chan{margin-left:0}.modes{border:1px solid var(--line);border-radius:12px;grid-area:2/1/auto/-1;padding:3px}.modes button{border:0;border-radius:9px;flex:1;min-height:40px;padding:0;font-size:14px}.modes button[aria-pressed=true]{background:color-mix(in srgb, var(--accent) 12%, transparent)}.chat-scroll{overscroll-behavior:contain;padding:12px}.chat-scroll:focus-visible{outline:none}.bubble{max-width:92%}.composer{padding:10px 12px calc(10px + env(safe-area-inset-bottom))}.cmp-foot:has(>.cmp-note:empty){display:none}.cmp-row{flex-wrap:wrap}.composer textarea{flex:100%;order:-1;min-height:64px}.cmp-acts{margin-left:auto}.dock,.dock.wide{width:calc(100vw - 20px);top:auto;right:10px}.dock{bottom:calc(10px + env(safe-area-inset-bottom))}.dock.wide{transform:none}.dialog .zoom{display:none}}@media (pointer:coarse){.composer textarea,.ask input,.ask textarea{font-size:16px}.composer button,.go,.later,.x,.chat-pill,.pair-btn,.alerts,.ask button,.term-bar button,.doc-acts>.cmp-link,.quit-btn,.d-doc{min-height:40px}}@media (width<=640px),(pointer:coarse){.pad-key,.pad-yes{min-height:44px}.pad-digits summary{padding:14px 0}}@media (width<=640px){.brand{min-height:44px}.prefs-btn{width:44px;height:44px}.prefs-pop>*{min-height:44px}.crumbs{align-items:center}.crumbs>*{padding-block:14px;line-height:16px}:is(.pair-btn,.alerts,.done-btn,.quit-btn,.later,.go,.x,.d-doc,.ask-send,.ask-opt,.sheet-yes,.cmp-yes,.chat-pill){min-height:44px}:is(.pair-btn,.quit-btn,.later,.x,.tab-add,.ask-send,.sheet-yes,.cmp-yes){min-width:44px}.tab h3{min-height:44px}:is(.tab-add,.thought,.more,.tab-btn){isolation:isolate;background:0 0;border:0;min-height:44px;position:relative}:is(.tab-add,.thought,.more,.tab-btn):before{content:"";z-index:-1;border:1px solid var(--line);pointer-events:none;border-radius:999px;position:absolute;inset:11px 0}.tab-add:before{border-radius:10px}.tab-btn.active:before,.more.open:before{border-color:color-mix(in srgb, var(--gold) 40%, transparent)}:is(.act>summary,.notice>summary,.rule summary,.todos summary,.monitors summary,.timeline summary){box-sizing:border-box;align-items:center;min-height:44px;padding-block:0}.todos,.monitors{padding-block:0}:is(.todos ol,.monitors ul){margin:0 0 10px}.link-form summary{padding-block:12px}.queue-act{flex-wrap:nowrap;justify-content:space-between;gap:10px}.queue-act span{text-align:left;flex:1 1 0}.queue-act button{flex:none;min-width:56px;min-height:44px}.trust .ask-acts{grid-template-columns:1fr 1fr;gap:8px;display:grid}.trust .ask-send{grid-column:1/-1}.tl-mark{pointer-events:none}.picker-body{height:clamp(180px,100dvh - 412px,360px)}.tile:has(.spawn,.pair){max-height:calc(var(--vvh,100dvh) - 16px)}.teams-tile{grid-template-columns:minmax(0,1fr)}.teams-tile b{white-space:normal;overflow-wrap:anywhere}.specs a,.d-squad a{padding-block:12px;line-height:20px;display:inline-block}.dbase h3{align-items:center}.dbase h3 a{padding-block:12px;line-height:20px}.cmp-link{align-items:center;padding-inline:8px;display:inline-flex}:is(.ask,.term-bar,.doc-acts,.composer) :is(button,.cmp-link){min-height:44px}.slash li{align-items:center;min-height:44px}:where(input:not([type=checkbox],[type=radio],[type=file],[type=hidden]),select,textarea){box-sizing:border-box;min-height:44px}.picker-crumbs button,.picker-places button,.pitem,.drawer-top .pair-btn{min-height:44px}.head-back{width:44px;height:44px}.modes button{min-height:44px}:is(.head-info,.head-main:not([hidden]),.head-quit:not([hidden])){min-width:44px;min-height:44px}.composer textarea{min-height:56px}.cmp-row{gap:8px 10px}.comms-in .ask-acts{background:color-mix(in srgb, var(--amber) 6%, var(--bg));margin:0 -14px -12px;padding:8px 14px 12px;position:sticky;bottom:-12px}.composer :is(.cmp-alt,.cmp-send){min-height:48px}.composer .cmp-alt{min-width:48px}.composer .cmp-send{min-width:64px}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.base.ally{background:linear-gradient(180deg, color-mix(in srgb, var(--accent) 7%, transparent), transparent 42%), linear-gradient(180deg, var(--surface-1), var(--surface-0))}.base.ally .crown{color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent);text-transform:none;letter-spacing:.04em;display:inline-flex}.base.ally.offline{opacity:.55}.ally-tabs{gap:4px;margin:0;padding:0;list-style:none;display:grid}.ally-tab{border:1px solid var(--line);border-radius:10px;justify-content:space-between;gap:10px;padding:6px 10px;font-size:12px;display:flex}.ally-tab b{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ally-tab span{color:var(--dim);flex:none}.ally-tab[data-state=working] span{color:var(--accent)}.ally-tab[data-state=blocked] span{color:var(--amber)}.link-pop{width:min(460px,100vw - 16px)}.link-pop ul{gap:8px;max-height:60vh;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.link-alert{border:1px solid var(--line);border-radius:10px;gap:6px;padding:8px 10px;font-size:13px;display:grid}.link-alert[data-level=error]{background:#f7768e1a}.link-alert[data-level=warning]{background:color-mix(in srgb, var(--amber) 9%, transparent)}.link-args{border:1px solid var(--line);white-space:pre-wrap;word-break:break-word;border-radius:8px;max-height:180px;margin:0;padding:8px;font-size:11px;overflow:auto}.link-note{color:var(--dim)}.teams-tile{gap:14px;padding:4px 2px 12px;font-size:13px;display:grid}.teams-tile h3{font-size:15px}.teams-tile h4{margin:0 0 4px;font-size:13px}.link-status{min-height:1.2em;color:var(--amber);margin:0}.link-short{color:var(--dim);font-family:ui-monospace,monospace}.link-meta{color:var(--dim);overflow-wrap:anywhere;margin:2px 0 8px;font-size:12px}.link-team,.link-request,.link-invite,.link-form{border:1px solid var(--line);background:color-mix(in srgb, var(--surface-1) 70%, transparent);border-radius:12px;padding:10px 12px}.link-request{background:color-mix(in srgb, var(--amber) 9%, transparent)}.link-team[data-status=stopped]{background:#f7768e1a}.link-warn{border:1px solid var(--line);background:color-mix(in srgb, var(--amber) 10%, transparent);border-radius:8px;margin:6px 0;padding:6px 10px}.link-roster{border-collapse:collapse;width:100%;margin:6px 0 10px}.link-roster th{text-align:left;color:var(--dim);padding:2px 6px;font-size:11px;font-weight:500}.link-roster .nw{white-space:nowrap}.link-roster select{max-width:100%}.link-roster td{vertical-align:middle;overflow-wrap:anywhere;padding:5px 6px}.link-roster tr[data-online=false] td{color:var(--dim)}.link-roster em{color:var(--dim);margin-left:6px;font-size:11px;font-style:normal}.link-roster .link-dup{color:var(--amber)}.link-acts{flex-wrap:wrap;gap:6px;display:flex}.link-acts button{white-space:nowrap}.link-inline{gap:8px;margin-top:8px;display:flex}.link-inline input{flex:1;min-width:0}.link-words{gap:8px;margin:8px 0;display:grid}.link-set{letter-spacing:.02em;text-align:left;padding:10px 12px;font-size:15px}.link-bigwords{letter-spacing:.04em;overflow-wrap:anywhere;margin:8px 0;font-size:20px;font-weight:700}.link-invite{justify-items:start;gap:8px;display:grid}.link-invite .qr{border-radius:8px;width:min(240px,100%);height:auto}.link-invite textarea,.link-form textarea{width:100%;font-family:ui-monospace,monospace;font-size:11px}.link-invite[data-lapsed=true] .qr{opacity:.25}.link-count{font-variant-numeric:tabular-nums}.link-form{gap:8px;display:grid}.link-form summary{cursor:pointer;font-weight:600}.link-form label{color:var(--dim);gap:3px;display:grid}.link-scan video{border-radius:10px;width:min(320px,100%)}.link-open-invite{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.teams-tile [data-armed=true]{color:var(--amber)}@media (width<=640px){.link-roster thead{display:none}.link-roster tr{border-bottom:1px solid var(--line);grid-template-columns:1fr 1fr;gap:2px 8px;padding:6px 0;display:grid}}
@@ -0,0 +1,3 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{n as t,t as n}from"./ask-Cp13JTEm.js";import{t as r}from"./registry-Bx4Ukv2M.js";import{n as i,t as a}from"./trust-B-m6tCqo.js";import{$ as o,C as s,D as c,M as l,N as u,U as d,a as f,c as p,d as m,et as h,f as g,g as _,h as v,i as y,k as b,l as x,m as S,p as C,s as w,u as T,z as E}from"./index-CYBMg2XG.js";var D=e=>`Alerts: ${e?.tally} (Space opens the next)`,O=e=>`警示:${e?.tally}(空白鍵開下一則)`,ee=((t,n={})=>(n.locale??e())===`zh-TW`?O(t):D(t)),k=e=>`Also queued: ${e?.tally}`,A=e=>`佇列中還有:${e?.tally}`,te=((t,n={})=>(n.locale??e())===`zh-TW`?A(t):k(t)),ne=((t={},n={})=>(n.locale??e())===`zh-TW`?`全部清除`:`Clear all`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`關閉文件`:`Close document`),M=e=>`Close ${e?.title}`,N=e=>`關閉 ${e?.title}`,re=((t,n={})=>(n.locale??e())===`zh-TW`?N(t):M(t)),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`連線中…`:`Connecting…`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`警示`:`alert`),ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`放大(F)`:`Enlarge (F)`),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`縮小(F)`:`Shrink (F)`),oe=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`Notices`),I=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知:已完成或出錯的單位。點一列打開它的通訊並清掉,或全部清除`:`Notices: units that finished or failed. A row opens its comms and clears it, or clear them all`),L=((t={},n={})=>(n.locale??e())===`zh-TW`?`符合寬度`:`Fit width`),se=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得紀錄。`:`History unavailable.`),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`退格鍵`:`Backspace`),z=((t={},n={})=>(n.locale??e())===`zh-TW`?`下`:`Down`),B=((t={},n={})=>(n.locale??e(),`End`)),V=((t={},n={})=>(n.locale??e(),`Enter`)),H=((t={},n={})=>(n.locale??e(),`Escape`)),U=((t={},n={})=>(n.locale??e(),`Home`)),W=((t={},n={})=>(n.locale??e())===`zh-TW`?`左`:`Left`),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`下一頁`:`Page down`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`上一頁`:`Page up`),ue=((t={},n={})=>(n.locale??e())===`zh-TW`?`右`:`Right`),de=((t={},n={})=>(n.locale??e(),`Shift+Tab`)),fe=((t={},n={})=>(n.locale??e())===`zh-TW`?`空白鍵`:`Space`),pe=((t={},n={})=>(n.locale??e(),`Tab`)),me=((t={},n={})=>(n.locale??e())===`zh-TW`?`上`:`Up`),he=e=>`Keys for ${e?.name}`,ge=e=>`${e?.name} 的按鍵`,_e=((t,n={})=>(n.locale??e())===`zh-TW`?ge(t):he(t)),ve=((t={},n={})=>(n.locale??e())===`zh-TW`?`最後一則通訊`:`Last transmission`),ye=((t={},n={})=>(n.locale??e())===`zh-TW`?`稍後`:`Later`),be=((t={},n={})=>(n.locale??e())===`zh-TW`?`已離開網`:`left the net`),xe=e=>`The mirror ended: ${e?.why}`,Se=e=>`鏡像已結束:${e?.why}`,Ce=((t,n={})=>(n.locale??e())===`zh-TW`?Se(t):xe(t)),we=((t={},n={})=>(n.locale??e())===`zh-TW`?`等待輸入密碼時隱藏;請在終端機中輸入。`:`Hidden while it waits for a secret; type it in the terminal.`),Te=e=>`Live · ${e?.cols}×${e?.rows}`,Ee=e=>`即時 · ${e?.cols}×${e?.rows}`,De=((t,n={})=>(n.locale??e())===`zh-TW`?Ee(t):Te(t)),Oe=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有訊息。`:`No messages yet.`),ke=((t={},n={})=>(n.locale??e())===`zh-TW`?`開啟通訊`:`Open comms`),Ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`此分頁隱藏時暫停。`:`Paused while this tab is hidden.`),je=e=>`${e?.why} Open the terminal again to retry.`,Me=e=>`${e?.why} 重新開啟終端機即可重試。`,Ne=((t,n={})=>(n.locale??e())===`zh-TW`?Me(t):je(t)),Pe=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出 Enter`:`Send Enter`),Fe=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出 Escape`:`Send Escape`),Ie=e=>`Send ${e?.key}`,Le=e=>`送出 ${e?.key}`,Re=((t,n={})=>(n.locale??e())===`zh-TW`?Le(t):Ie(t)),ze=((t={},n={})=>(n.locale??e())===`zh-TW`?`錯誤`:`error`),Be=((t={},n={})=>(n.locale??e())===`zh-TW`?`已完成`:`finished`),Ve=((t={},n={})=>(n.locale??e())===`zh-TW`?`已離開`:`gone`),He=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問`:`question`),Ue=((t={},n={})=>(n.locale??e())===`zh-TW`?`更新`:`update`),We=e=>{let t=r(`en`,e?.count,{},!0);return t===`one`?`${e?.count} notice`:t===`other`?`${e?.count} notices`:`tally_finished`},Ge=e=>`${e?.count} 則通知`,Ke=((t,n={})=>(n.locale??e())===`zh-TW`?Ge(t):We(t)),qe=e=>{let t=r(`en`,e?.count,{},!0);return t===`one`?`${e?.count} needs you`:t===`other`?`${e?.count} need you`:`tally_need`},Je=e=>`${e?.count} 個需要你`,Ye=((t,n={})=>(n.locale??e())===`zh-TW`?Je(t):qe(t)),Xe=e=>`Terminal of ${e?.name}, read only`,Ze=e=>`${e?.name} 的終端機,唯讀`,Qe=((t,n={})=>(n.locale??e())===`zh-TW`?Ze(t):Xe(t)),$e=e=>`Terminal · ${e?.name}`,et=e=>`終端機 · ${e?.name}`,tt=((t,n={})=>(n.locale??e())===`zh-TW`?et(t):$e(t)),G=((t={},n={})=>(n.locale??e())===`zh-TW`?`要信任這個資料夾嗎?`:`Trust this folder?`),nt=((t={},n={})=>(n.locale??e())===`zh-TW`?`◉ 鍵盤直送中 · 點外面結束`:`◉ Keyboard goes to the pane · click outside to stop`),K=((t={},n={})=>(n.locale??e())===`zh-TW`?`點這裡後,鍵盤直接送進終端機(Ctrl、Alt、⌘ 組合鍵除外)`:`Click here and the keyboard goes straight to the terminal (except Ctrl, Alt, and ⌘ combinations)`),rt=((t={},n={})=>(n.locale??e())===`zh-TW`?`等待`:`waiting on`),it=[[[`esc`,`esc`,H],[`tab`,`tab`,pe],[`up`,`↑`,me],[`enter`,`enter`,V]],[[`shift+tab`,`⇧tab`,de],[`left`,`←`,W],[`down`,`↓`,z],[`right`,`→`,ue]],[[`space`,`space`,fe],[`backspace`,`⌫`,R],[`home`,`home`,U],[`end`,`end`,B],[`pageup`,`pgup`,le],[`pagedown`,`pgdn`,ce]]],at=`123456789`.split(``),ot={ArrowUp:`up`,ArrowDown:`down`,ArrowLeft:`left`,ArrowRight:`right`,Enter:`enter`,Escape:`esc`,Backspace:`backspace`,Home:`home`,End:`end`,PageUp:`pageup`,PageDown:`pagedown`},st=130,ct=64,q=4e3,lt=typeof navigator<`u`&&/Mac|iPhone|iPad/.test(navigator.platform),ut=e=>e.split(`+`).map(e=>e.length===1?e.toUpperCase():e[0].toUpperCase()+e.slice(1)).join(`+`);function dt({name:e,state:n,post:r,stream:i,blip:a}){let o=[],s=c(`p`,{class:`pad-note`,role:`status`}),l=!1,u=([e,t,n])=>{let r=c(`button`,{type:`button`,class:`pad-key`,"data-key":e,"aria-label":n()},t);return r.onclick=t=>t.isTrusted&&(_.push({key:e}),b()),o.push(r),r},d=c(`details`,{class:`pad-digits`},c(`summary`,null,`1–9`),c(`div`,{class:`pad-row`},...at.map(e=>u([e,e,()=>e])))),f=c(`div`,{class:`pad`,role:`group`,"aria-label":_e({name:e})},...it.map(e=>c(`div`,{class:`pad-row`},...e.map(u))),d,s),p=(e,t=``)=>(s.dataset.tone=t,s.replaceChildren(e)),m=(e,t,n)=>{let r=c(`button`,{type:`button`,class:`pad-yes`},e===`enter`?Pe():e===`esc`?Fe():Re({key:ut(e)})),i=c(`button`,{type:`button`,class:`cmp-link`},h());r.onclick=t=>t.isTrusted&&!l&&void g({key:e},n),i.onclick=()=>p(``),s.dataset.tone=`ask`,s.replaceChildren(c(`span`,null,t),r,i),i.focus()};async function g(e,n){l=!0,D(),p(``),v=Date.now();try{let t=await r(`keys`,{...e,stream:i(),...n?{confirmed:n}:{}});t.status===409&&t.body.error===`confirm`&&typeof t.body.confirm==`string`&&`key`in e?(_=[],m(e.key,String(t.body.reason??``),t.body.confirm)):t.ok||(_=[],p(t.body.reason??E({status:t.status}),`error`))}catch{_=[],p(t(),`error`)}finally{l=!1,D(),b()}}let _=[],v=0,y;function b(){if(l||y||!_.length)return;let e=v+st-Date.now();if(e>0)return void(y=setTimeout(()=>(y=void 0,b()),e));g(_.shift())}let x=e=>{if(e.ctrlKey===e.altKey||e.shiftKey)return;let t=e.ctrlKey?`ctrl`:`alt`,n=/^Key([A-Z])$/.exec(e.code)?.[1].toLowerCase();if(lt||t!==`ctrl`||n!==`v`&&(n!==`c`||getSelection()?.isCollapsed))return n?`${t}+${n}`:{Enter:t===`alt`?`alt+enter`:void 0,Backspace:t===`alt`?`alt+backspace`:void 0,ArrowLeft:`${t}+left`,ArrowRight:`${t}+right`}[e.key]},S=e=>(t=>t===`live`||t===`hidden`&&e===`esc`)(n());function C(e){if(e.metaKey||e.isComposing||e.key===`Process`)return!1;let t=e.ctrlKey||e.altKey?x(e):e.key===`Tab`?e.shiftKey?`shift+tab`:`tab`:e.key===`Delete`?`delete`:ot[e.key];return t?(!S(t)||e.repeat&&(_.length||![`up`,`down`,`left`,`right`,`backspace`,`delete`].includes(t))||(_.push({key:t}),a?.(),b()),!0):!1}function w(e){let t=[...e.replace(/[\u0000-\u001f\u007f-\u009f]/g,``)];if(t.length&&S()){for(let e of t){let t=_.at(-1);t&&`text`in t&&[...t.text].length<ct?t.text+=e:_.push({text:e})}a?.(),b()}}function T(e){let t=[...e.replace(/\r\n?/g,`
2
+ `).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g,``)];if(t.length&&S()){for(let e=0;e<t.length;e+=q)_.push({paste:t.slice(e,e+q).join(``)});a?.(),b()}}function D(){let e=n();for(let t of o)t.disabled=e===`off`||e===`hidden`&&t.dataset.key!==`esc`}return D(),{el:f,update:D,type:C,text:w,paste:T}}var J=[0,95,135,175,215,255],ft=120,pt=5e3,mt=3e3,Y=e=>Number.isInteger(e)&&e>=0&&e<=255,ht=e=>Y(e)?e<16?e:e<232?`rgb(${J[Math.floor((e-16)/36)]},${J[Math.floor((e-16)/6)%6]},${J[(e-16)%6]})`:`rgb(${8+10*(e-232)},${8+10*(e-232)},${8+10*(e-232)})`:void 0,X=([e,t,n])=>[e,t,n].every(e=>Y(e))?`rgb(${e},${t},${n})`:void 0;function gt(e,t){let n={...e},r=t.split(`;`);for(let e=0;e<r.length;e++){let t=r[e].split(`:`).map(e=>e===``?0:Number(e)),i=t[0];if(i===38||i===48||i===58){let a=t.length>1?t[1]:Number(r[e+1]),o=t.length>1?t.slice(2):r.slice(e+2,e+(a===5?3:5)).map(Number);t.length===1&&(e+=a===5?2:a===2?4:1);let s=a===5?ht(o[0]):a===2?X(o.slice(-3)):void 0;s!==void 0&&i!==58&&(n[i===38?`fg`:`bg`]=s)}else if(i===0)for(let e of Object.keys(n))delete n[e];else i===1||i===2?n[i===1?`b`:`d`]=!0:i===22?n.b=n.d=!1:i===3||i===23?n.i=i===3:i===4||i===21||i===24?n.u=i!==24&&t[1]!==0:i===7||i===27?n.v=i===7:i===9||i===29?n.s=i===9:i>=30&&i<=37||i>=90&&i<=97?n.fg=i-(i<90?30:82):i>=40&&i<=47||i>=100&&i<=107?n.bg=i-(i<100?40:92):(i===39||i===49)&&delete n[i===39?`fg`:`bg`]}return n}function _t(e){let t=[],n={},r=0,i=e=>{let r=e.replace(/\x1b(\[[0-?]*[ -/]*[@-~]?)?|[\u0000-\u001f\u007f-\u009f]/g,``);if(!r)return;let[i,a]=n.v?[n.bg??`z`,n.fg??`z`]:[n.fg,n.bg],o=[typeof i==`number`||i===`z`?`c${i}`:``,typeof a==`number`||a===`z`?`k${a}`:``,...[`b`,`d`,`i`,`u`,`s`].filter(e=>n[e]).map(e=>`t${e}`)].filter(Boolean).join(` `);t.push({text:r,cls:o,...typeof i==`string`&&i!==`z`&&{fg:i},...typeof a==`string`&&a!==`z`&&{bg:a}})};for(let t of e.matchAll(/\x1b\[([0-9;:]{0,64})m/g))i(e.slice(r,t.index)),n=gt(n,t[1]),r=t.index+t[0].length;return i(e.slice(r)),t}function Z(e,t){let n=Math.min(Math.max(0,Number(t.rows)||0),ft);for(;e.children.length<n;)e.append(c(`div`,{class:`tr`}));for(;e.children.length>n;)e.lastElementChild.remove();for(let[r,i]of Array.isArray(t.set)?t.set:[])!Number.isInteger(r)||r<0||r>=n||typeof i!=`string`||e.children[r].replaceChildren(..._t(i).map(e=>{if(!e.cls&&!e.fg&&!e.bg)return e.text;let t=c(`span`,e.cls?{class:e.cls}:null,e.text);return e.fg&&(t.style.color=e.fg),e.bg&&(t.style.backgroundColor=e.bg),t}))}function vt({tiles:e,post:n,stream:r,pad:i}){let a=new Map,o,s=()=>{try{return String(JSON.parse(r()).stream??``)}catch{return``}},l=(e,t,n=``)=>(e.pad?.update(),(e.state.textContent!==t||e.state.dataset.tone!==n)&&(e.state.dataset.tone=n,e.state.textContent=t)),u=(e,t)=>(e.ended=!0,l(e,Ne({why:t}),`error`)),d=(e,n,r=s())=>r&&void(e.queue=e.queue.then(()=>e.post(`mirror`,{stream:r,on:n}).then(t=>n&&!t.ok&&u(e,t.body.reason??E({status:t.status})),()=>n&&u(e,t())))),f=(e,t=Math.max(e.cols,...[...e.box.children].map(e=>e.textContent?.length??0)))=>e.box.style.fontSize=e.fit.getAttribute(`aria-pressed`)===`true`&&t?`${Math.max(6,Math.floor((e.scroll.clientWidth-20)/(t*.6)))}px`:``,p=e=>Date.now()-e.seen>mt,m=()=>(clearInterval(o),o=a.size&&!document.hidden?setInterval(()=>a.forEach(e=>(e.box.classList.toggle(`stale`,p(e)),e.pad?.update())),1e3):void 0);document.addEventListener(`visibilitychange`,()=>(m(),a.forEach(e=>{clearTimeout(e.away),document.hidden?e.away=setTimeout(()=>(e.parked=!0,d(e,!1),l(e,Ae())),pt):e.parked&&(e.parked=!1,d(e,!0))})));let h=(e,t)=>{let r={key:e,box:c(`div`,{class:`term`,role:`group`,"aria-label":Qe({name:t})}),scroll:c(`div`,{class:`term-scroll`,tabindex:`0`}),state:c(`p`,{class:`term-state`,role:`status`},P()),fit:c(`button`,{type:`button`,class:`cmp-link`,"aria-pressed":`false`},L()),typing:c(`span`,{class:`term-typing`,hidden:``},nt()),sink:c(`textarea`,{class:`term-sink`,rows:`1`,"aria-label":K(),autocomplete:`off`,autocapitalize:`off`,autocorrect:`off`,spellcheck:`false`}),post:n(e),cols:0,seen:0,parked:!1,first:!0,ended:!1,queue:Promise.resolve()};if(r.fit.onclick=()=>(r.fit.setAttribute(`aria-pressed`,String(r.fit.getAttribute(`aria-pressed`)!==`true`)),f(r),requestAnimationFrame(()=>r.scroll.scrollTop=r.scroll.scrollHeight)),r.scroll.append(r.box),globalThis.matchMedia?.(`(pointer: fine)`).matches){let{sink:e}=r,t=()=>(t=>(e.value=``,t&&r.pad?.text?.(t)))(e.value);r.scroll.title=K(),r.scroll.addEventListener(`click`,()=>getSelection()?.isCollapsed!==!1&&e.focus({preventScroll:!0})),e.addEventListener(`keydown`,e=>r.pad?.type?.(e)&&e.preventDefault()),e.addEventListener(`input`,e=>!e.isComposing&&t()),e.addEventListener(`compositionend`,t),e.addEventListener(`paste`,e=>(e.preventDefault(),r.pad?.paste?.(e.clipboardData?.getData(`text/plain`)??``))),e.addEventListener(`focus`,()=>{let t=r.scroll.getBoundingClientRect();Object.assign(e.style,{left:`${t.left+12}px`,top:`${Math.min(t.bottom,innerHeight)-28}px`}),r.typing.hidden=!1,r.scroll.classList.add(`typing`,`engage`)}),e.addEventListener(`blur`,()=>(r.typing.hidden=!0,r.scroll.classList.remove(`typing`,`engage`,`blip`),t())),r.scroll.addEventListener(`animationend`,e=>r.scroll.classList.remove(e.animationName===`term-engage`?`engage`:`blip`))}return new ResizeObserver(()=>f(r)).observe(r.scroll),a.set(e,r),d(r,!0),m(),r.pad=i?.({name:t,state:()=>r.parked||r.ended||p(r)?`off`:r.box.classList.contains(`hidden`)?`hidden`:`live`,post:r.post,stream:s,blip:()=>b(r.scroll,`blip`)}),r.tile={id:`term:${e}`,title:tt({name:t}),icon:`i-comms`,body:()=>c(`div`,{class:`term-tile`},c(`div`,{class:`term-bar`},r.state,r.typing,r.fit),r.scroll,r.sink,r.pad?.el),closed:()=>(clearTimeout(r.away),d(r,!1),a.delete(e),m())}};return{open(t,n){let r=a.get(t);r?.ended&&(r.ended=!1,l(r,P()),d(r,!0)),e.open(r?.tile??h(t,n),!0)},embed(e,t,n){let r=a.get(e);r?.ended&&(r.ended=!1,l(r,P()),d(r,!0));let i=r?.tile??h(e,t);return n.replaceChildren(i.body()),()=>(i.closed?.(),n.replaceChildren())},hello:()=>a.forEach(e=>!e.parked&&!e.ended&&d(e,!0)),frame(e){let t;try{t=JSON.parse(e)}catch{return}let n=a.get(t.key);if(n){if(n.box.classList.toggle(`hidden`,!!(t.hidden||t.ended)),t.ended)return u(n,Ce({why:t.ended}));if([n.seen,n.ended]=[Date.now(),!1],n.box.classList.remove(`stale`),t.hidden)return Z(n.box,{key:n.key,rows:0}),l(n,we());Z(n.box,t),(t.whole||t.cols&&t.cols!==n.cols)&&(n.cols=t.cols||n.cols,f(n)),l(n,De({cols:n.cols,rows:n.box.children.length}),`ok`),n.first&&t.whole&&(n.first=!1,requestAnimationFrame(()=>n.scroll.scrollTop=n.scroll.scrollHeight))}}}}var Q=(e,t)=>l(e)-l(t)||e.at-t.at,$=e=>{let t=e.filter(e=>l(e)===0).length,n=e.length-t;return[t&&Ye({count:t}),n&&Ke({count:n})].filter(Boolean).join(` · `)};function yt(e){let t=[],n=[],r=()=>e.render(t.map(e=>e.alert),n),i=(i,a,o=!0)=>{let s=t.findIndex(e=>e.alert.key===i.key);if(s>=0&&!o)return;let c=s>=0?t.splice(s,1)[0]:{alert:i,back:a,raised:i.mark};!o&&t.length?t.splice(t.length-1,0,c):t.push(c),n=n.filter(e=>e.key!==i.key),r(),o&&e.enter(c.alert)};return{get open(){return t.map(e=>e.alert)},get queue(){return n},arrive(e){let i=t.find(t=>t.alert.key===e.key);if(i)[i.alert,i.raised]=[{...e,at:i.alert.at},e.mark];else{let t=n.find(t=>t.key===e.key);n=[...n.filter(t=>t.key!==e.key),t&&t.mark===e.mark?t:e].sort(Q)}r()},prune(e){n=n.filter(t=>(e=>e?.mark===t.mark&&!(l(t)!==0&&e.closed))(e(t.key)));for(let n of t){let t=e(n.alert.key);n.alert=t?{...n.alert,...t,gone:void 0,at:n.alert.at}:{...n.alert,mark:`unknown`,note:void 0,pending:void 0,gone:!0}}r()},redraw:r,show:(t,n=!0)=>i(t,e.focused(),n),raise(n){let r=t.find(e=>e.alert.key===n);r&&r!==t.at(-1)&&i(r.alert,e.focused())},next(){let t=n.find(e=>l(e)===0);t&&i(t,e.focused())},resolve(e){n=n.filter(t=>l(t)===0||!e.includes(t.key)),r()},close(a=`close`){let o=t.pop();if(!o)return!1;let s=t.at(-1),c=a===`close`?n.find(e=>l(e)===0):void 0;return a===`later`&&o.alert.mark===o.raised&&l({mark:o.raised,pending:o.alert.pending})===0&&(n=[...n,o.alert].sort(Q)),!s&&c?(i(c,o.back),!0):(r(),!e.restore(o.back)&&s&&e.enter(s.alert),!0)}}}var bt=`a, button, input, textarea, select, summary, label, [role=button]`;function xt(e){let t=[],n,r=()=>e.render(t,n);return{get tiles(){return t},get active(){return n},open(i,a=!0){if(!a&&t.length>=4&&!t.some(e=>e.id===i.id))return void i.closed?.();t.some(e=>e.id===i.id)||(t=[...t,i]).slice(0,-4).forEach(e=>e.closed?.()),t=t.slice(-4),(a||!t.some(e=>e.id===n))&&(n=i.id),r(),a&&e.enter(t.find(e=>e.id===i.id))},close(e){let i=t.findIndex(t=>t.id===e);i<0||(t[i].closed?.(),t=t.filter(t=>t.id!==e),n===e&&(n=(t[i]??t[i-1])?.id),r())},activate(e){n=e,r()}}}function St(e){let t=new Set(e.flatMap(e=>e.kind===`result`&&e.callId?[e.callId]:[])),n=e.filter(e=>e.kind===`assistant`),r=n.at(-1),i=r?.tools?.find(e=>!t.has(e.id));return{said:(n.findLast(e=>e.text?.trim())?.text?.trim().split(`
3
+ `).filter(Boolean).at(-1))?.slice(0,280),pending:i&&`${i.name} · ${i.summary}`.slice(0,200),at:(r??e.findLast(e=>e.kind!==`result`))?.id}}var Ct=()=>m(`<section class="dialog" role="dialog" aria-modal="false" tabindex="-1"><header><b class="tag">${F()}</b><span class="where"></span><button class="zoom" type="button"></button><button class="x" type="button" aria-label="${o()}">×</button></header><div class="who">${y}<div><h3></h3><p><em class="role"></em> <span class="state"></span></p></div></div><div class="intel"><h4>${ve()}</h4><p class="said">…</p><p class="pending" hidden><b>${rt()}</b> <span></span></p></div><div class="ask-root"></div><footer><a class="go">${ke()}</a><button class="later" type="button">${ye()}</button><span class="queued"></span></footer></section>`),wt=()=>m(`<li><a class="done-go">${y}<span><b class="name"></b><small></small></span></a></li>`),Tt=()=>m(`<section class="tile" tabindex="-1"><header><svg><use href="#i-doc"/></svg><b></b><button class="x" type="button" aria-label="${j()}">×</button></header><div class="tile-body"></div></section>`);function Et(e){let[t,r,o,c,h]=[w(`dock`,HTMLElement),w(`work`,HTMLElement),w(`tiles`,HTMLElement),w(`tile-tabs`,HTMLElement),w(`alerts`,HTMLButtonElement)],b=new Map,E=(e,t,n=b.get(t.key))=>{let r=e.dataset.gone===`true`;_(e,`.said`,n?.failed?se():n?.said??Oe()),e.querySelector(`.pending`).hidden=!n?.pending||r,_(e,`.pending span`,n?.pending??``),f(e.querySelector(`.go`),r?void 0:{view:`session`,ws:t.ws,key:u(t),...n?.at&&{at:n.at}})},D=(n,r={said:`…`})=>{b.set(n.key,r),e.recent(u(n)).then(St,()=>({failed:!0})).then(e=>{let i=b.get(n.key)===r&&(b.set(n.key,e),t.querySelector(`.dialog[data-key="${CSS.escape(n.key)}"]`));i&&E(i,n),n.mark===`done`&&F(V.queue)})},O=()=>t.classList.contains(`wide`),k=e=>{t.classList.toggle(`wide`,e);try{localStorage.setItem(`sb.dialog-wide`,e?`1`:`0`)}catch{}for(let e of t.querySelectorAll(`.zoom`))A(e)},A=e=>{e.textContent=O()?`⤡`:`⤢`,e.setAttribute(`aria-pressed`,String(O())),e.setAttribute(`aria-label`,O()?ae():ie()),e.title=e.getAttribute(`aria-label`)};try{t.classList.toggle(`wide`,localStorage.getItem(`sb.dialog-wide`)===`1`)}catch{}let j=(t,r,i,a)=>{if(g(t,r.mark),A(t.querySelector(`.zoom`)),t.dataset.gone=String(!!r.gone),t.style.transform=i?`translateY(${-12*i}px) scale(${1-.06*i})`:``,t.style.opacity=String(Math.max(0,1-.3*i)),t.toggleAttribute(`inert`,i>0),t.setAttribute(`aria-label`,`${r.name}: ${p(r.note,r.mark)}`),x(t.querySelector(`.plate`),r.role,r.mark),_(t,`h3`,r.name),_(t,`.role`,C(r.role)),S(t,`.state`,r.note,r.mark,r.gone?be():void 0),_(t,`.where`,e.label(r.ws)),_(t,`.tag`,r.gone?Ve():({waiting:He,error:ze,done:Be}[r.mark]??Ue)()),_(t,`.queued`,a.length?te({tally:$(a)}):``),t.querySelector(`.later`).hidden=l(r)!==0,r.trust)return R(t,r);b.has(r.key)||D(r),E(t,r);let o=z.get(t);o||z.set(t,o=n(t.querySelector(`.ask-root`),B(u(r)),void 0,()=>e.showTerminal(r.ws,u(r)),()=>t.isConnected&&!t.classList.contains(`leaving`)&&(V.raise(t.dataset.key),V.close()))),o.update(r.pending,r.mark===`waiting`&&document.body.dataset.stale!==`true`)},[M,N,P]=[w(`done`,HTMLButtonElement),w(`done-pop`,HTMLElement),w(`done-list`,HTMLElement)],F=t=>{let n=t.filter(e=>l(e)!==0);M.hidden=!n.length,M.textContent=`${oe()} ${n.length}`,[M.title,M.dataset.state]=[I(),n.some(e=>e.mark===`error`)?`error`:`done`],!n.length&&N.matches(`:popover-open`)&&N.hidePopover(),v(P,n.map(e=>({...e,id:e.key})),wt,(t,n)=>{let r=b.get(n.key);x(t.querySelector(`.plate`),n.role,n.mark),_(t,`.name`,n.name),_(t,`small`,`${e.label(n.ws)} · ${r?.said??p(n.note,n.mark)}`),f(t.querySelector(`.done-go`),{view:`session`,ws:n.ws,key:u(n),...r?.at&&{at:r.at}})})};w(`done-clear`,HTMLButtonElement).textContent=ne(),N.setAttribute(`aria-label`,I()),N.addEventListener(`toggle`,e=>e.newState===`open`&&T(N,M)),P.addEventListener(`click`,e=>{let t=e.target.closest(`li[data-key]`);t&&queueMicrotask(()=>(V.resolve([t.dataset.key]),N.hidePopover()))}),w(`done-clear`,HTMLButtonElement).addEventListener(`click`,()=>(V.resolve(V.queue.map(e=>e.key)),N.hidePopover()));let L=new WeakMap,R=(e,t)=>{for(let t of[`.intel`,`.go`])e.querySelector(t).hidden=!0;_(e,`h3`,G()),_(e,`.role`,i(t.trust)),_(e,`.state`,``);let n=L.get(e);n||L.set(e,n=a(e=>s(`trust/answer`,e),()=>e.isConnected&&!e.classList.contains(`leaving`)&&(V.raise(e.dataset.key),V.close()))),e.querySelector(`.trust`)||e.querySelector(`.ask-root`).replaceChildren(n),n.update(t.gone?void 0:t.trust,document.body.dataset.stale!==`true`)},z=new WeakMap,B=t=>e.post?.(t)??((e,n)=>s(`sessions/${encodeURIComponent(t)}/${e}`,n)),V=yt({render(e,n){v(t,e.map(e=>({...e,id:e.key})),Ct,(t,r)=>j(t,r,e.length-1-e.findIndex(e=>e.key===r.key),n));let r=n.filter(e=>l(e)===0),i=r[0];h.disabled=!i,h.dataset.mark=i?.mark??`unknown`,_(h,`#alert-count`,String(r.length)),h.title=r.length?ee({tally:$(r)}):``,_(h,`#alert-text`,i?`${i.name} · ${i.trust?G():p(i.note,i.mark)}`:d()),v(h.querySelector(`.faces`),r.slice(0,3).map(e=>({...e,id:e.key})),()=>m(y),(e,t)=>x(e,t.role,t.mark)),F(n)},enter(e){let n=t.querySelector(`[data-key="${CSS.escape(e.key)}"]`);n&&!z.get(n)?.enter()&&n.querySelector(`.go`)?.focus()},focused:()=>document.activeElement instanceof HTMLElement&&document.activeElement!==document.body?document.activeElement:void 0,restore:e=>!!(e?.isConnected&&!e.closest(`[inert]`)&&(e.focus(),document.activeElement===e))});h.addEventListener(`click`,()=>V.next()),document.addEventListener(`click`,e=>{let n=t=>{let n=t.getBoundingClientRect();return e.clientX>=n.left&&e.clientX<=n.right&&e.clientY>=n.top&&e.clientY<=n.bottom},r=[...t.querySelectorAll(`.dialog:not(.leaving)`)],i=r.slice(0,-1).reverse().find(n);e.defaultPrevented||!i||!r.length||n(r.at(-1))||e.target?.closest?.(bt)||(e.preventDefault(),e.stopPropagation(),V.raise(i.dataset.key))},!0),t.addEventListener(`click`,e=>{let t=e.target;t.closest(`.zoom`)?k(!O()):t.closest(`.x`)?V.close():t.closest(`.later`)?V.close(`later`):t.closest(`.go`)&&queueMicrotask(()=>void V.close(`go`))});let H=0,U=()=>o.classList.toggle(`tabbed`,W.tiles.length>1&&r.clientWidth<460+W.tiles.length*400),W=xt({render(e,t){o.hidden=!e.length,v(o,e,e=>{let t=Tt();return t.querySelector(`use`).setAttribute(`href`,`#${e.icon??`i-doc`}`),t.querySelector(`.x`).setAttribute(`aria-label`,re({title:e.title})),t.querySelector(`.tile-body`).append(e.body()),t.querySelector(`.x`).addEventListener(`click`,()=>W.close(e.id)),t},(e,n)=>{_(e,`header b`,n.title),e.classList.toggle(`active`,n.id===t)}),v(c,e,()=>m(`<button type="button" class="tab-btn"></button>`),(e,n)=>{e.textContent=n.title,e.classList.toggle(`active`,n.id===t),e.onclick=()=>W.activate(n.id)}),o.prepend(c),e.length!==H&&(H=e.length,U())},enter:e=>requestAnimationFrame(()=>o.querySelector(`.tile[data-key="${CSS.escape(e.id)}"]`)?.focus())});return new ResizeObserver(U).observe(r.appendChild(Object.assign(document.createElement(`i`),{className:`gauge`}))),{tiles:W,stack:V,terminal:vt({tiles:W,post:B,stream:e.stream,pad:dt}),hotkey(e){if(e===`next`)return!h.disabled&&(V.next(),!0);let n=[...t.querySelectorAll(`.dialog:not(.leaving) .zoom`)].at(-1);return n?.getClientRects().length?(n.click(),!0):!1},alerts(e,t){for(let t of e)t.trust||D(t),V.arrive(t);V.prune(e=>t.get(e))}}}export{Et as mountPanels};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{$ as t,D as n}from"./index-CYBMg2XG.js";import{t as r}from"./chat-CdX3Lkfm.js";var i=((t={},n={})=>(n.locale??e())===`zh-TW`?`下一張`:`Next image`),a=((t={},n={})=>(n.locale??e())===`zh-TW`?`上一張`:`Previous image`),o=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片檢視`:`Image viewer`);function s(e,s){let c=s,l=n(`img`,{alt:``}),u=n(`span`,{class:`lb-count`}),d=(e,t,r,i)=>{let a=n(`button`,{type:`button`,class:e,"aria-label":t},r);return a.addEventListener(`click`,e=>(e.stopPropagation(),i())),a},f=t=>(c=(c+t+e.length)%e.length,g()),p=d(`lb-prev`,a(),`‹`,()=>f(-1)),m=d(`lb-next`,i(),`›`,()=>f(1)),h=n(`dialog`,{class:`lightbox`,"aria-label":o()},l,p,m,d(`lb-close`,t(),`×`,()=>h.close()),u);function g(){h.classList.remove(`zoom`),l.src=e[c],l.alt=r({n:c+1}),u.textContent=e.length>1?`${c+1} / ${e.length}`:``,p.hidden=m.hidden=e.length<2}l.addEventListener(`click`,e=>(e.stopPropagation(),h.classList.toggle(`zoom`))),h.addEventListener(`click`,()=>h.close()),h.addEventListener(`keydown`,t=>{e.length>1&&(t.key===`ArrowLeft`||t.key===`ArrowRight`)&&(t.preventDefault(),f(t.key===`ArrowLeft`?-1:1))}),h.addEventListener(`close`,()=>h.remove()),document.body.append(h),g(),h.showModal()}export{s as lightbox};