pi-straw-boss 0.37.3 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/README.zh-TW.md +3 -2
- package/dist/gui/assets/{ask-BKsJ-dmL.js → ask-BKm82Hqw.js} +1 -1
- package/dist/gui/assets/chat-BYveAV3V.js +2 -0
- package/dist/gui/assets/drawer-CJrP6ufa.js +1 -0
- package/dist/gui/assets/{index-Bc2hKHe-.js → index-BxN8PfTi.js} +1 -1
- package/dist/gui/assets/{index-c4SRzWUh.css → index-dHnkX53P.css} +1 -1
- package/dist/gui/assets/layer-DoXq1bM1.js +3 -0
- package/dist/gui/assets/lightbox-D_79ksgt.js +1 -0
- package/dist/gui/assets/pair-CcN3S1Eq.js +1 -0
- package/dist/gui/assets/{spawn-CH3gvfPw.js → spawn-CiRTnnnj.js} +1 -1
- package/dist/gui/assets/{unit_count-CuDE-IN6.js → unit_count-bxhnWg20.js} +1 -1
- package/dist/gui/assets/views-TAiBW70j.js +7 -0
- package/dist/gui/index.html +2 -2
- package/package.json +1 -1
- package/src/agent/claim.ts +45 -0
- package/src/agent/cli.ts +158 -0
- package/src/agent/kit.ts +161 -0
- package/src/agent/paths.ts +106 -0
- package/src/agent/sidecar.ts +347 -0
- package/src/bridge.ts +3 -2
- package/src/handover.ts +136 -17
- package/src/herdr.ts +5 -2
- package/src/host.ts +65 -12
- package/src/index.ts +4 -2
- package/src/net.ts +3 -2
- package/src/remote.ts +7 -5
- package/src/server-watch.ts +3 -4
- package/src/session.ts +7 -5
- package/src/stashing.ts +6 -2
- package/src/state.ts +6 -2
- package/dist/gui/assets/chat-qeu3pPta.js +0 -2
- package/dist/gui/assets/drawer-DPktzZAN.js +0 -1
- package/dist/gui/assets/layer-CdB4_qEG.js +0 -3
- package/dist/gui/assets/lightbox-Drh4BwTs.js +0 -1
- package/dist/gui/assets/pair-CYpt5vBi.js +0 -1
- package/dist/gui/assets/views-CaqenppV.js +0 -7
package/README.md
CHANGED
|
@@ -61,6 +61,7 @@ Each of these is optional. When it is installed, Straw Boss picks it up; without
|
|
|
61
61
|
| pi-code (hooks extension, with its dialog events) | Its hook confirmation ("Allow bash?": Allow or Deny, before any gated tool call) can be answered from the GUI. |
|
|
62
62
|
| [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 or newer | Documents a session shows open beside its comms: HTML in a sandboxed frame whose form answers the agent, text read-only. |
|
|
63
63
|
| [@juicesharp/rpiv-todo](https://www.npmjs.com/package/@juicesharp/rpiv-todo) 2.13 or newer | A session's todo list shows above its composer in the GUI, read from the session file. |
|
|
64
|
+
| [straw-boss](https://github.com/wayne930242/straw-boss) (Claude Code and Codex) | A Claude Code or Codex main-agent session joins the tab's net through a small sidecar process that straw-boss starts with the session: a member, or a main when it registers as an orchestrator. It shows in the tower dashboard, the sidebar, and the GUI with an agent badge (the GUI cannot type into it), calls the tower and broadcasts with `straw-net.py`, and hears net messages as `[straw net …]` lines typed into its pane ([how](docs/how-it-works.md#from-claude-code-or-codex)). |
|
|
64
65
|
|
|
65
66
|
Any extension's `select` and `confirm` (an `mp-infra` command review, say) can be answered from the GUI too, with no change to that extension: Straw Boss wraps them on pi's shared `ctx.ui`, opens pi's own dialog as always, and relays the same dialog; the first answer wins. Both can be answered from a paired device. `input`, `editor`, and `custom` are never touched, and they, with `ask_user` from pi-ask-user, show read-only in the GUI, with the terminal one tap away.
|
|
66
67
|
|
|
@@ -89,7 +90,7 @@ The tower only routes and coordinates, so it can run a lighter model: set `tower
|
|
|
89
90
|
| `/boss close all` | Quit this base's tower, mains, and members and close it with its shells, without stashing. It is checked first as a stash checks it; anything running that would be lost (a turn, a queued message, a dialog, a monitor, a subagent, a busy shell) closes nothing, and every reason is listed. Other bases are never touched. |
|
|
90
91
|
| Stash, Stashed, Pop on the page | A base's Stash puts it away under its label; the HUD's Stashed list opens each one again with Pop. A base's Quit is checked first, as `/boss close all` is. |
|
|
91
92
|
| `/boss stash [name]`, `/boss pop [name]` | Put this whole base away (its tower, mains, members, and idle shells) and close it; open it again later, every pi resumed from its own session file in its old role. A stash refuses, naming why, while anything a resume would lose is there: a running turn, a queued message, an open dialog, a running monitor, a subagent, or a busy shell. |
|
|
92
|
-
| `/boss gui`, `/boss gui stop` | Open the net in the browser (any session, joins nothing); stop its server, from any session. The machine runs one server on one URL: it comes back after its session's `/reload`, and a session on a newer pi-straw-boss takes it over, so open pages reload into the new version. Type into a session from its comms view, or work its terminal with the key pad under the terminal tile, or on a desktop by clicking into it and typing; answer a waiting `robot_hand` selector, `ask_user_question` questionnaire, or pi-code hook confirmation there or in its alert (so can any extension's `select` and `confirm`, also from a paired device; other dialogs show read-only, to answer in the terminal; `secret_drop` always takes its secret in the terminal, never on a page, local or over the tailnet, because pi-intercom identities are self-reported). Documents a session shows with [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 or newer open beside its comms: HTML in a sandboxed frame whose form answers the agent, text read-only. |
|
|
93
|
+
| `/boss gui`, `/boss gui stop` | Open the net in the browser (any session, joins nothing); stop its server, from any session. The machine runs one server on one URL: it comes back after its session's `/reload`, another session takes it over within a few seconds when the session that runs it ends (a closed pane, a quit, a crash; towers first, and a session on an older pi-straw-boss than the server waits about six seconds, then takes it until the next newer session takes it back), a session that starts later brings back a server that is down, even after every session quit or the machine restarted, and a session on a newer pi-straw-boss takes it over, so open pages reload into the new version. Only `/boss gui stop` keeps it stopped, until the next `/boss gui`; `/boss stash` and `/boss close all` do not start a stopped server. Type into a session from its comms view, or work its terminal with the key pad under the terminal tile, or on a desktop by clicking into it and typing; answer a waiting `robot_hand` selector, `ask_user_question` questionnaire, or pi-code hook confirmation there or in its alert (so can any extension's `select` and `confirm`, also from a paired device; other dialogs show read-only, to answer in the terminal; `secret_drop` always takes its secret in the terminal, never on a page, local or over the tailnet, because pi-intercom identities are self-reported). Documents a session shows with [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 or newer open beside its comms: HTML in a sandboxed frame whose form answers the agent, text read-only. |
|
|
93
94
|
| `/boss gui remote`, `/boss gui remote off` | Reach the GUI from your phone over your tailnet (`tailscale serve`, never Funnel): pair by QR code, and a phone stays paired (90 days from its last use, restarts and `remote off` included) until you unpair it in the Phone tile; remote access stays on across a stop, a `/reload` and a new server until `remote off`; off removes only its own serve entry. The serve entry points at a second loopback listener of the GUI server, so a request is remote because of the listener it arrived on, whatever headers it carries. |
|
|
94
95
|
|
|
95
96
|
Subagents and sessions in Herdr worktree workspaces never join: the session that launched them speaks for them. Outside Herdr the extension does nothing.
|
|
@@ -165,7 +166,7 @@ Run `bash herdr-reaper/run.sh reaper.mjs dry-run` first to see what it would do,
|
|
|
165
166
|
|
|
166
167
|
## Learn more
|
|
167
168
|
|
|
168
|
-
[How it works](docs/how-it-works.md) covers roles, the tower, the dashboard, the browser view, what the extension writes, and how Claude Code or Codex
|
|
169
|
+
[How it works](docs/how-it-works.md) covers roles, the tower, the dashboard, the browser view, what the extension writes, and how Claude Code or Codex sessions join the net.
|
|
169
170
|
|
|
170
171
|
## License
|
|
171
172
|
|
package/README.zh-TW.md
CHANGED
|
@@ -61,6 +61,7 @@ pi install npm:pi-straw-boss
|
|
|
61
61
|
| pi-code(hooks 擴充,需含它的對話框事件) | 它的 hook 確認(「Allow bash?」:允許或拒絕,在任何被攔下的工具呼叫之前)可以在 GUI 作答。 |
|
|
62
62
|
| [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 以上 | session 展示的文件會開在它的通訊畫面旁邊:HTML 放在沙箱框架裡,表單送出的內容會回給 agent;文字檔只能讀。 |
|
|
63
63
|
| [@juicesharp/rpiv-todo](https://www.npmjs.com/package/@juicesharp/rpiv-todo) 2.13 以上 | session 的待辦清單會顯示在 GUI 的輸入框上方,內容從 session 檔讀取。 |
|
|
64
|
+
| [straw-boss](https://github.com/wayne930242/straw-boss)(Claude Code 和 Codex) | Claude Code 或 Codex 的主智慧體 session 會透過 straw-boss 隨 session 啟動的小型 sidecar 行程加入分頁的網:預設是成員,登記成 orchestrator 後升成主智慧體。它會出現在塔台儀表板、側邊欄和 GUI(帶智慧體徽章,GUI 無法對它輸入),可以用 `straw-net.py` 呼叫塔台、廣播,網上的訊息會以 `[straw net …]` 開頭的一行打進它的 pane([說明](docs/how-it-works.md#from-claude-code-or-codex),英文)。 |
|
|
64
65
|
|
|
65
66
|
任何 extension 的 `select` 和 `confirm`(例如 `mp-infra` 的指令審查)也可以在 GUI 作答,不必改動那個 extension:Straw Boss 把它們包在 pi 共用的 `ctx.ui` 上,照常打開 pi 自己的對話框,同時轉送同一個對話框,先答的算數。`select` 和 `confirm` 都可以從配對的裝置作答。`input`、`editor`、`custom` 完全不碰,它們和 pi-ask-user 的 `ask_user` 在 GUI 裡只能看,可以一鍵切到終端機回答。
|
|
66
67
|
|
|
@@ -88,7 +89,7 @@ pi install npm:pi-straw-boss
|
|
|
88
89
|
| `/boss close all` | 讓這個基地的塔台、主智慧體和成員結束,連同 shell 一起關掉,不存 stash。會先用 stash 的同一套檢查;有會遺失的東西(正在跑的回合、排隊中的訊息、對話框、Monitor、子智慧體、前景有程式的 shell)就什麼都不關,並列出所有原因。其他基地完全不碰。 |
|
|
89
90
|
| 網頁上的「收起」「已收起」「接回」 | 基地的「收起」以基地名稱收起它;上方的「已收起」列出收起的基地,按「接回」打開。基地的「關掉」會先檢查,和 `/boss close all` 一樣。 |
|
|
90
91
|
| `/boss stash [名稱]`、`/boss pop [名稱]` | 把整個基地(塔台、主智慧體、成員和閒置的 shell)收起來並關掉;之後再打開,每個 pi 都從自己的 session 檔接回原本的角色。只要有接回後會遺失的東西就拒絕並說明原因:正在跑的回合、排隊中的訊息、開著的對話框、執行中的 Monitor、子智慧體,或前景有程式在跑的 shell。 |
|
|
91
|
-
| `/boss gui`、`/boss gui stop` | 在瀏覽器開啟網(任何 session 都能開,不會加入任何東西);停止它的伺服器,在哪個 session 都可以。整台機器只跑一個伺服器、一個網址:開它的 session `/reload`
|
|
92
|
+
| `/boss gui`、`/boss gui stop` | 在瀏覽器開啟網(任何 session 都能開,不會加入任何東西);停止它的伺服器,在哪個 session 都可以。整台機器只跑一個伺服器、一個網址:開它的 session `/reload` 之後,會在原網址重開;跑它的 session 結束時(關掉 pane、離開 pi、當機),另一個還開著的 session 會在幾秒內於原網址重開它(塔台優先;pi-straw-boss 版本比伺服器舊的 session 要等約六秒才接手,直到下一個較新的 session 再接回去);之後才啟動的 session 也會把停著的伺服器重開,即使所有 session 都離開過或機器重開機;版本較新的 session 會接手,開著的頁面也會自動換成新版。只有 `/boss gui stop` 會讓它維持停止,直到下一次 `/boss gui`;`/boss stash` 和 `/boss close all` 不會把停著的伺服器重開。可以在通訊畫面直接打字給某個 session,或用終端機畫面下方的按鍵面板操作它的終端機,在桌面上也可以點進終端機直接打字;在等回覆的 `robot_hand` 選單、`ask_user_question` 問卷或 pi-code 的 hook 確認,可以在那裡或它的警示裡作答(任何 extension 的 `select` 和 `confirm` 也可以,`confirm` 也可以從配對的裝置作答;其他對話框只能看,要回到終端機回答;`secret_drop` 的機密一律在終端機輸入,任何頁面(本機或 tailnet)都不接受,因為 pi-intercom 的身分是自己申報的,無法驗證)。session 用 [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 以上顯示的文件,會開在它的通訊畫面旁邊:HTML 放在沙箱框架裡,表單送出的答案會傳給智慧體;純文字只能讀。 |
|
|
92
93
|
| `/boss gui remote`、`/boss gui remote off` | 透過你的 tailnet 用手機連 GUI(`tailscale serve`,絕不用 Funnel):掃 QR code 配對,手機配對後會一直有效(從最後一次使用起算 90 天,重啟與 `remote off` 都不影響),直到你在「手機」視窗解除配對;遠端存取在 stop、`/reload`、換新伺服器之後仍會保持開啟,直到 `remote off`;關閉時只移除它自己的 serve 設定。serve 指向 GUI 伺服器的第二個 loopback 監聽埠,請求算不算遠端取決於它進來的監聽埠,不看它帶什麼標頭。 |
|
|
93
94
|
|
|
94
95
|
子智慧體,以及在 Herdr worktree 工作區裡的 session,都不會加入網,由開出它們的 session 代表它們。不在 Herdr 裡時,這個擴充套件什麼都不做。
|
|
@@ -164,7 +165,7 @@ plugin 一安裝或連結就開始清理,沒有試跑,也不會先問:第
|
|
|
164
165
|
|
|
165
166
|
## 延伸閱讀
|
|
166
167
|
|
|
167
|
-
[運作方式](docs/how-it-works.md)(英文)說明角色、塔台、儀表板、瀏覽器畫面、這個擴充套件會寫入什麼,以及 Claude Code 或 Codex
|
|
168
|
+
[運作方式](docs/how-it-works.md)(英文)說明角色、塔台、儀表板、瀏覽器畫面、這個擴充套件會寫入什麼,以及 Claude Code 或 Codex 的 session 怎麼加入網。
|
|
168
169
|
|
|
169
170
|
## 授權
|
|
170
171
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as e,D as t,v as n}from"./index-Bc2hKHe-.js";var r=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案正在送出;請查看終端機。`:`Another answer is on its way; check the terminal.`),i=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),a=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),o=((t={},n={})=>(n.locale??e())===`zh-TW`?`已回答。`:`Answered.`),s=((t={},n={})=>(n.locale??e())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),c=((t={},n={})=>(n.locale??e())===`zh-TW`?`可以複選。`:`It takes several choices.`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`再次確認`:`Check again`),u=((t={},n={})=>(n.locale??e())===`zh-TW`?`選擇`:`Choices`),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`複製指令`:`Copy command`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),h=((t={},n={})=>(n.locale??e())===`zh-TW`?`未確認。請查看終端機。`:`Not confirmed. Check the terminal.`),g=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註`:`Note`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註(選填)`:`Note (optional)`),v=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,y=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,b=((t,n={})=>(n.locale??e())===`zh-TW`?y(t):v(t)),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`選項`:`Options`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`你的答案`:`Your own answer`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),k=((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.`),A=((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.`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出答案`:`Send answer`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出中…`:`Sending…`),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?c():e.freeform&&e.options.length?s():``,U=(e,t)=>n(`div`,{class:`ask-one`},e.header&&n(`b`,{class:`ask-head`},e.header),n(`p`,{class:`ask-q`},e.question),e.context&&n(`div`,{class:`ask-ctx`},e.context),e.options.length>0&&n(`ol`,{class:`ask-opts`,"aria-label":x()},...e.options.map(e=>n(`li`,{class:`ask-opt`},n(`b`,null,e.title),e.description&&n(`small`,null,e.description)))),t&&H(e)&&n(`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:T,"not-allowed":D,malformed:E};function Y(e){let{outcome:n,reason:i,by:a}=e.body;return n===`accepted`?[`ok`,o()]:n===`stale`?[`error`,a===`local`?I():a===`cancel`?P():F()]:n===`rejected`?[`error`,(Object.hasOwn(J,String(i))?J[String(i)]:O)()]:n===`busy`?[`error`,r()]:n===`unknown`||e.status===504?[`error`,h(),!0]:[`error`,i??t({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,r=location.hostname!==`127.0.0.1`,o,s){let c,v,y,T=!1,E=!1,D;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>v&&!v.el.contains(e.target)&&(v.lost=void 0));let O=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),P=()=>{if(!v)return;let e=document.activeElement;e&&e!==document.body&&e!==v.lost&&(v.lost=void 0),v.controls.forEach(e=>e.disabled=!T||E||v.done),v.send&&(v.send.disabled=!T||E||v.done||!v.pick()),e&&v.el.contains(e)&&e.disabled&&(v.lost=e);let t=v.lost;t&&!t.disabled&&v.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),v.lost=void 0)};async function F(e,r){[e.sending,E,e.spell]=[!0,!0,!1],P(),O(e.note,``,M());let i=await t(`answer`,r).catch(()=>void 0),a=n(`button`,{type:`button`,class:`cmp-link`},l());a.onclick=()=>void F(e,r);let[o,c,u]=i?Y(i):[`error`,h(),!0];[e.done,e.sending,E,e.busy]=[!i||X(i),!1,!1,i?.body.outcome===`busy`],O(e.note,o,c,...u?[a]:[]),P(),e.note.scrollIntoView?.({block:`nearest`}),s&&i?.body.outcome===`accepted`&&setTimeout(s,1200)}let I=(e,t,r,i,a)=>{let o=n(`button`,{type:`button`,class:`ask-opt`,role:e,"aria-checked":`false`},n(`b`,a?{"data-n":String(a)}:null,t),...r.filter(Boolean).map(e=>n(`small`,null,e)));return o.onclick=i,o};function 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&&n(`button`,{type:`button`,class:`cmp-link`},p());return a&&(a.disabled=!navigator.clipboard,a.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>O(e.note,`ok`,f()),()=>O(e.note,`error`,d()))),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=i,[n(`pre`,{class:`ask-title`},W(t.select.title)),n(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":u()},...i),n(`div`,{class:`ask-acts`},e.send,a)]}function z(e,t){let r=t.questions.map(()=>({picks:new Set,text:n(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:w(),"aria-label":C()}),note:n(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:_(),"aria-label":g()})})),i=[],a=t.questions.map((t,a)=>{let o=r[a],s=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>I(s,e.title,[e.description,e.preview&&m()],()=>{t.multiple||(o.picks.clear(),o.text.value=``),o.picks.has(n)?o.picks.delete(n):o.picks.add(n),c.forEach((e,t)=>e.setAttribute(`aria-checked`,String(o.picks.has(t)))),P()}));return o.text.oninput=()=>(t.multiple||(o.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),P()),e.controls.push(...c,o.text,o.note),i.push({opts:c,multiple:!!t.multiple,own:o.text,note:o.note,answered:()=>o.picks.size>0||o.text.value.trim()!==``}),n(`div`,{class:`ask-one`},t.header&&n(`b`,{class:`ask-head`},t.header),n(`p`,{class:`ask-q`},t.question),n(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":x()},...c),o.text,o.note)});return e.pick=()=>r.every(e=>e.picks.size||e.text.value.trim())?{answers:r.map(e=>K(e.picks,e.text.value,e.note.value))}:void 0,e.first=V(e.el,i,()=>e.send),[...a,n(`div`,{class:`ask-acts`},e.send)]}function B(e){let t=e.asks??(e.ask?[e.ask]:[]),s=t.length>1,c=e.answer,l={key:Z(e),el:n(`section`,{class:`ask`}),note:n(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};c&&((l.send=n(`button`,{type:`button`,class:`ask-send`},j())).onclick=()=>void(l.pick()&&F(l,q(c,l.pick(),crypto.randomUUID()))));let u=e.tool===`secret_drop`,d=n(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${s?a():i()} ${s||!t[0]?``:H(t[0])}`.trim()),f=o&&e.tool!==`secret_drop`&&n(`button`,{type:`button`,class:`cmp-link`},N());f&&(f.onclick=o);let p=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[n(`p`,{class:`ask-why`},b({tool:e.tool}))]:[];return l.el.append(...p,...c&&!u?c.select?L(l,c):z(l,c):[...t.length?t.map(e=>U(e,s)):[n(`p`,{class:`ask-why`},u?r?k():A():e.why??R())],n(`div`,{class:`ask-acts`},u?n(`p`,{class:`ask-term`},i()):d,f)],l.note),l}let J=(t,n)=>{let r=document.activeElement;v&&v!==n&&(v.focus=v.el.contains(r)?r:void 0),[c,v,y]=[t,n,n?.send?n:y],e.replaceChildren(...n?[n.el]:[]),P(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=v&&!v.done?v.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},update(e,t){T=t,e&&(D=void clearTimeout(D)),!e&&(v?.done||v?.sending)?D??=setTimeout(()=>(D=void 0,J()),6e3):e?v&&(Z(e)===v.key||!e.answer&&(v.done||v.sending)&&e.callId===c?.callId)?((v.busy||v.sending)&&!e.answer?v.spell=!0:v.busy&&v.spell&&e.answer&&([v.done,v.busy]=[!1,!1],O(v.note,``,S())),c=e):J(e,y?.key===Z(e)&&!y.done?y:B(e)):J(),P()}}}export{L as n,M as r,Q as t};
|
|
1
|
+
import{O as e,V as t,y as n}from"./index-BxN8PfTi.js";var r=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案正在送出;請查看終端機。`:`Another answer is on its way; check the terminal.`),i=((e={},n={})=>(n.locale??t())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),a=((e={},n={})=>(n.locale??t())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),o=((e={},n={})=>(n.locale??t())===`zh-TW`?`已回答。`:`Answered.`),s=((e={},n={})=>(n.locale??t())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),c=((e={},n={})=>(n.locale??t())===`zh-TW`?`可以複選。`:`It takes several choices.`),l=((e={},n={})=>(n.locale??t())===`zh-TW`?`再次確認`:`Check again`),u=((e={},n={})=>(n.locale??t())===`zh-TW`?`選擇`:`Choices`),d=((e={},n={})=>(n.locale??t())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),f=((e={},n={})=>(n.locale??t())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),p=((e={},n={})=>(n.locale??t())===`zh-TW`?`複製指令`:`Copy command`),m=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),h=((e={},n={})=>(n.locale??t())===`zh-TW`?`未確認。請查看終端機。`:`Not confirmed. Check the terminal.`),g=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註`:`Note`),_=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註(選填)`:`Note (optional)`),v=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,y=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,b=((e,n={})=>(n.locale??t())===`zh-TW`?y(e):v(e)),x=((e={},n={})=>(n.locale??t())===`zh-TW`?`選項`:`Options`),S=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),C=((e={},n={})=>(n.locale??t())===`zh-TW`?`你的答案`:`Your own answer`),w=((e={},n={})=>(n.locale??t())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),T=((e={},n={})=>(n.locale??t())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),E=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),D=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),O=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),k=((e={},n={})=>(n.locale??t())===`zh-TW`?`安全考量,遠端不支援輸入機密。請到執行 GUI 的那台電腦的終端機中回答。`:`For security, entering a secret is not supported remotely. Answer it in the terminal on the computer the GUI runs on.`),A=((e={},n={})=>(n.locale??t())===`zh-TW`?`機密內容只能在終端機輸入,這裡不接受。請到執行 GUI 的那台電腦的終端機中回答。`:`A secret is entered in the terminal only, not here. Answer it in the terminal on the computer the GUI runs on.`),j=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出答案`:`Send answer`),M=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出中…`:`Sending…`),N=((e={},n={})=>(n.locale??t())===`zh-TW`?`顯示終端機`:`Show terminal`),P=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),F=((e={},n={})=>(n.locale??t())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),I=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),L=((e={},n={})=>(n.locale??t())===`zh-TW`?`連不上伺服器。`:`The server could not be reached.`),R=((e={},n={})=>(n.locale??t())===`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?c():e.freeform&&e.options.length?s():``,U=(e,t)=>n(`div`,{class:`ask-one`},e.header&&n(`b`,{class:`ask-head`},e.header),n(`p`,{class:`ask-q`},e.question),e.context&&n(`div`,{class:`ask-ctx`},e.context),e.options.length>0&&n(`ol`,{class:`ask-opts`,"aria-label":x()},...e.options.map(e=>n(`li`,{class:`ask-opt`},n(`b`,null,e.title),e.description&&n(`small`,null,e.description)))),t&&H(e)&&n(`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:T,"not-allowed":D,malformed:E};function Y(t){let{outcome:n,reason:i,by:a}=t.body;return n===`accepted`?[`ok`,o()]:n===`stale`?[`error`,a===`local`?I():a===`cancel`?P():F()]:n===`rejected`?[`error`,(Object.hasOwn(J,String(i))?J[String(i)]:O)()]:n===`busy`?[`error`,r()]:n===`unknown`||t.status===504?[`error`,h(),!0]:[`error`,i??e({status:t.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,r=location.hostname!==`127.0.0.1`,o,s){let c,v,y,T=!1,E=!1,D;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>v&&!v.el.contains(e.target)&&(v.lost=void 0));let O=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),P=()=>{if(!v)return;let e=document.activeElement;e&&e!==document.body&&e!==v.lost&&(v.lost=void 0),v.controls.forEach(e=>e.disabled=!T||E||v.done),v.send&&(v.send.disabled=!T||E||v.done||!v.pick()),e&&v.el.contains(e)&&e.disabled&&(v.lost=e);let t=v.lost;t&&!t.disabled&&v.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),v.lost=void 0)};async function F(e,r){[e.sending,E,e.spell]=[!0,!0,!1],P(),O(e.note,``,M());let i=await t(`answer`,r).catch(()=>void 0),a=n(`button`,{type:`button`,class:`cmp-link`},l());a.onclick=()=>void F(e,r);let[o,c,u]=i?Y(i):[`error`,h(),!0];[e.done,e.sending,E,e.busy]=[!i||X(i),!1,!1,i?.body.outcome===`busy`],O(e.note,o,c,...u?[a]:[]),P(),e.note.scrollIntoView?.({block:`nearest`}),s&&i?.body.outcome===`accepted`&&setTimeout(s,1200)}let I=(e,t,r,i,a)=>{let o=n(`button`,{type:`button`,class:`ask-opt`,role:e,"aria-checked":`false`},n(`b`,a?{"data-n":String(a)}:null,t),...r.filter(Boolean).map(e=>n(`small`,null,e)));return o.onclick=i,o};function 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&&n(`button`,{type:`button`,class:`cmp-link`},p());return a&&(a.disabled=!navigator.clipboard,a.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>O(e.note,`ok`,f()),()=>O(e.note,`error`,d()))),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=i,[n(`pre`,{class:`ask-title`},W(t.select.title)),n(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":u()},...i),n(`div`,{class:`ask-acts`},e.send,a)]}function z(e,t){let r=t.questions.map(()=>({picks:new Set,text:n(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:w(),"aria-label":C()}),note:n(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:_(),"aria-label":g()})})),i=[],a=t.questions.map((t,a)=>{let o=r[a],s=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>I(s,e.title,[e.description,e.preview&&m()],()=>{t.multiple||(o.picks.clear(),o.text.value=``),o.picks.has(n)?o.picks.delete(n):o.picks.add(n),c.forEach((e,t)=>e.setAttribute(`aria-checked`,String(o.picks.has(t)))),P()}));return o.text.oninput=()=>(t.multiple||(o.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),P()),e.controls.push(...c,o.text,o.note),i.push({opts:c,multiple:!!t.multiple,own:o.text,note:o.note,answered:()=>o.picks.size>0||o.text.value.trim()!==``}),n(`div`,{class:`ask-one`},t.header&&n(`b`,{class:`ask-head`},t.header),n(`p`,{class:`ask-q`},t.question),n(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":x()},...c),o.text,o.note)});return e.pick=()=>r.every(e=>e.picks.size||e.text.value.trim())?{answers:r.map(e=>K(e.picks,e.text.value,e.note.value))}:void 0,e.first=V(e.el,i,()=>e.send),[...a,n(`div`,{class:`ask-acts`},e.send)]}function B(e){let t=e.asks??(e.ask?[e.ask]:[]),s=t.length>1,c=e.answer,l={key:Z(e),el:n(`section`,{class:`ask`}),note:n(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};c&&((l.send=n(`button`,{type:`button`,class:`ask-send`},j())).onclick=()=>void(l.pick()&&F(l,q(c,l.pick(),crypto.randomUUID()))));let u=e.tool===`secret_drop`,d=n(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${s?a():i()} ${s||!t[0]?``:H(t[0])}`.trim()),f=o&&e.tool!==`secret_drop`&&n(`button`,{type:`button`,class:`cmp-link`},N());f&&(f.onclick=o);let p=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[n(`p`,{class:`ask-why`},b({tool:e.tool}))]:[];return l.el.append(...p,...c&&!u?c.select?L(l,c):z(l,c):[...t.length?t.map(e=>U(e,s)):[n(`p`,{class:`ask-why`},u?r?k():A():e.why??R())],n(`div`,{class:`ask-acts`},u?n(`p`,{class:`ask-term`},i()):d,f)],l.note),l}let J=(t,n)=>{let r=document.activeElement;v&&v!==n&&(v.focus=v.el.contains(r)?r:void 0),[c,v,y]=[t,n,n?.send?n:y],e.replaceChildren(...n?[n.el]:[]),P(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=v&&!v.done?v.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},update(e,t){T=t,e&&(D=void clearTimeout(D)),!e&&(v?.done||v?.sending)?D??=setTimeout(()=>(D=void 0,J()),6e3):e?v&&(Z(e)===v.key||!e.answer&&(v.done||v.sending)&&e.callId===c?.callId)?((v.busy||v.sending)&&!e.answer?v.spell=!0:v.busy&&v.spell&&e.answer&&([v.done,v.busy]=[!1,!1],O(v.note,``,S())),c=e):J(e,y?.key===Z(e)&&!y.done?y:B(e)):J(),P()}}}export{L as n,M as r,Q as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-dHnkX53P.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{V as e,d as t,n,v as r,x as i,y as a}from"./index-BxN8PfTi.js";import{n as o,t as s}from"./views-TAiBW70j.js";var c=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),u=e=>`context compacted · ${e?.tokens} tokens summarized`,d=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,f=((t,n={})=>(n.locale??e())===`zh-TW`?d(t):u(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,te=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),h=e=>`Image ${e?.n}`,g=e=>`圖片 ${e?.n}`,_=((t,n={})=>(n.locale??e())===`zh-TW`?g(t):h(t)),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),y=e=>`${e?.count} image(s)`,b=e=>`${e?.count} 張圖片`,ne=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),re=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),S=e=>`${e?.count} new`,C=e=>`${e?.count} 則新訊息`,w=((t,n={})=>(n.locale??e())===`zh-TW`?C(t):S(t)),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),N=e=>`Open image ${e?.n}`,P=e=>`打開圖片 ${e?.n}`,oe=((t,n={})=>(n.locale??e())===`zh-TW`?P(t):N(t)),F=e=>`show all (${e?.size})`,I=e=>`顯示全部(${e?.size})`,L=((t,n={})=>(n.locale??e())===`zh-TW`?I(t):F(t)),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),z=e=>`◇ thought · ${e?.count} chars`,B=e=>`◇ 思考 · ${e?.count} 字元`,se=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function ue(){let e=!0,t=0;return{get pinned(){return e},scrolled(n){e=n,n&&(t=0)},hold:()=>void(e=!1),arrived(n){return e||(t+=n),e},jump:()=>void(e=!0,t=0),button:n=>e&&!n?void 0:t&&!n?w({count:t}):x()}}async function de(e,t,n,r){let i=()=>e.items.some(e=>e.id===n);for(;!i()&&e.before;)r(e.prepend(await t.older(e.before)));return i()?!0:(r(e.reset(await t.latest())),!1)}function fe(e=600){let t=[],n,r=!1,i=new Set,a=new Map,o=new Map,s=e=>e.forEach(e=>(i.delete(e.id),e.tools?.forEach(e=>(o.delete(e.id),a.delete(e.id)))));function c(e,t){let n=[];for(let r of e)i.has(r.id)||(i.add(r.id),r.kind===`result`&&r.callId?(a.set(r.callId,r),o.has(r.callId)&&t.add(o.get(r.callId))):(r.tools?.forEach(e=>o.set(e.id,r.id)),n.push(r)));return n}let l=e=>({rebuild:!1,added:[],touched:[],dropped:[],front:!1,...e});return{get items(){return t},get before(){return n},get detached(){return r},result:e=>a.get(e),reset(e){return[t,n,r]=[[],e.before,!1],i.clear(),a.clear(),o.clear(),t=c(e.items,new Set),l({rebuild:!0,added:t})},append(i){if(r)return l({});let a=new Set,o=c(i,a);t.push(...o);let u=t.length>e?t.splice(0,t.length-e):[];return s(u),u.length&&(n=t[0].id),l({added:o,touched:[...a],dropped:u.map(e=>e.id)})},prepend(i){let a=new Set,o=c(i.items,a);t.unshift(...o),n=i.before;let u=t.length>e?t.splice(e):[];return s(u),u.length&&(r=!0),l({added:o,touched:[...a],dropped:u.map(e=>e.id),front:!0})}}}var pe=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,me=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,he={intercom_message:D,subagent_result:j,subagent_ping:A,subagent_status:M,"pi-loop-monitor":k,"memory-context":O,"doc-review":E},H=e=>{let r=t(`<span class="ava"><svg><use/></svg></span>`);return r.querySelector(`use`).setAttribute(`href`,`#i-${n[e]??e}`),r};function ge(e){let t=[],n=0;for(let r of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))t.push(e.slice(n,r.index),a(`a`,{href:r[0],rel:`noopener noreferrer`,target:`_blank`},r[0])),n=r.index+r[0].length;return[...t,e.slice(n)]}function U(e,t,{who:n,link:u,docFor:d}){let p=fe(),m=new Map,h=new Set,g=()=>h.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>d?.(e))):e.shown&&h.delete(e)),y=a(`div`,{class:`chat-list`}),b=a(`div`,{class:`chat-top`}),x=a(`div`,{class:`chat-live`}),S=a(`div`,{class:`chat-end`}),C=a(`button`,{class:`chat-pill`,type:`button`,hidden:``}),w=a(`p`,{class:`chat-empty`},T()),E=a(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":l()},b,y,x,S);e.replaceChildren(E,C);let D=ue(),O=!1,k=!1,A,j,M=0,N=!1,P,F=()=>N||P!==void 0,I=()=>(clearTimeout(P),P=setTimeout(()=>(P=void 0,D.pinned&&!p.detached&&B()),250)),z=(e=D.button(p.detached))=>(C.hidden=!e,C.textContent=e??``),B=()=>(D.jump(),j=void 0,E.scrollTop=E.scrollHeight,z());async function U(e){O=!0;let n=await de(p,t,e,e=>(J(e),Y(e))).finally(()=>O=!1),r=m.get(e);if(A===e){if(!n||!r)return B();D.hold(),j=r,r.scrollIntoView({block:`center`}),i(r,`lit`),clearTimeout(M),M=window.setTimeout(()=>(j=void 0,r.classList.remove(`lit`)),2e3),z()}}let W=()=>A?void U(A):B(),G=(e,n,r,i)=>{e.disabled=!0,t.entry(r).then(t=>{let r=t&&i(t);if(r===void 0)return void(e.textContent=V());n.textContent=r,e.remove()},()=>e.textContent=V())};function K(e,n=0){if(!n||!t.pic)return null;let i=Array.from({length:n},(n,r)=>t.pic(e,r));return a(`div`,{class:`pics`},...i.map((e,t)=>{let n=a(`img`,{src:e,alt:_({n:t+1}),loading:`lazy`,decoding:`async`}),o=a(`button`,{type:`button`,class:`pic`,"aria-label":oe({n:t+1})},n);return n.addEventListener(`error`,()=>o.replaceWith(a(`em`,{class:`pic-gone`},v()))),o.addEventListener(`click`,()=>void r(async()=>{let{lightbox:e}=await import(`./lightbox-D_79ksgt.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(i,t))),o}))}function _e(e,t){let n=p.result(e.id),r=a(`pre`,{class:`out`},n?.text??``),i=a(`pre`,{class:`args`},e.args??``),o=e.cut?a(`button`,{class:`more`,type:`button`},R()):null;o?.addEventListener(`click`,()=>G(o,i,t,t=>(e=>e&&`${e.args??``}${e.cut?`\n${ee()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=n?.more?a(`button`,{class:`more`,type:`button`},L({size:me(n.bytes??0)})):null;s?.addEventListener(`click`,()=>G(s,r,n.id,e=>e.text));let c=e.name===`show_doc`&&d?a(`button`,{class:`more open`,type:`button`,hidden:``},ae()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>d?.(e)?.()))),c&&h.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(g);let l=a(`details`,{class:`act`},a(`summary`,{"data-mark":n?n.isError?`error`:`done`:`working`},a(`b`,{class:`badge`}),a(`code`,null,e.name),a(`span`,{class:`sum`},e.summary),c),i,o,n&&a(`div`,{class:`result`},n.images?a(`em`,null,ne({count:n.images})):null,r,s)),u=n&&K(n.id,n.images);return u?[l,u]:[l]}function q(e){let t=a(`time`,null,pe(e.at));switch(e.kind){case`user`:return a(`article`,{class:`tx you`},a(`header`,null,t,a(`b`,null,le()),H(`user`)),a(`div`,{class:`bubble`},...ge(e.text??``),K(e.id,e.images)));case`assistant`:{let r=n(),i=a(`pre`,{class:`thought-text`}),c=e.thought?a(`button`,{class:`thought`,type:`button`},e.thought<0?ce():se({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>G(c,i,e.id,e=>e.thoughtText)),a(`article`,{class:`tx in`},H(r.role),a(`div`,{class:`tx-body`},a(`header`,null,a(`b`,null,r.name),e.model?a(`span`,null,e.model):null,t,e.stop?a(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,i,e.text?a(`div`,{class:`md`},s(o(e.text))):null,e.error?a(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>_e(t,e.id))))}case`bash`:return a(`article`,{class:`tx sys`},a(`details`,{class:`act`},a(`summary`,{"data-mark":e.exit?`error`:`done`},a(`b`,{class:`badge`}),a(`code`,null,`shell`),a(`span`,{class:`sum`},`! ${e.command}`),e.exit?a(`span`,{class:`stop`,"data-mark":`error`},te({code:e.exit})):null),e.text?a(`pre`,{class:`out`},e.text):null));case`notice`:return a(`article`,{class:`tx sys`},a(`details`,{class:`notice`},a(`summary`,null,H(`comms`),a(`em`,null,re()),he[e.type??``]?.()??e.type??ie(),` `,e.from&&u(e.from)||(e.from??``),t),a(`pre`,null,e.text??``)));case`divider`:return a(`article`,{class:`tx rule`},a(`details`,null,a(`summary`,null,e.type===`compaction`?f({tokens:(e.tokens??0).toLocaleString()}):c()),a(`pre`,null,e.text??``)));default:return a(`article`,{class:`tx note`},e.text??``,` `,t)}}function J(e){e.rebuild&&(m.clear(),y.replaceChildren());for(let t of e.dropped)m.get(t)?.remove(),m.delete(t);let t=e.added.map(e=>(m.set(e.id,q(e)),m.get(e.id)));e.front?y.prepend(...t):y.append(...t),k&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),w.remove(),p.items.length||y.append(w),b.hidden=!p.before}let Y=e=>e.touched.forEach(e=>{let t=m.get(e),n=p.items.find(t=>t.id===e);if(t&&n){let r=q(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),m.set(e,r)}}),X=async()=>{if(!O&&p.before&&k){O=!0;try{let e=E.scrollHeight,n=p.prepend(await t.older(p.before));J(n),Y(n),E.scrollTop+=E.scrollHeight-e}finally{O=!1}p.before&&E.clientHeight&&b.getBoundingClientRect().bottom>=E.getBoundingClientRect().top&&X()}};C.addEventListener(`click`,()=>{A=void 0,p.detached?t.latest().then(e=>(J(p.reset(e)),B())):B()});let Z=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void X(),{root:E}),new IntersectionObserver(e=>E.clientHeight&&(D.scrolled(e.at(-1).isIntersecting),z()),{root:E,rootMargin:`0px 0px 67px`})],Q,ve=()=>(Q??(Z[0].observe(b),Z[1].observe(S)),clearTimeout(Q),Q=setTimeout(()=>(Q=void 0,Z.forEach(e=>e.disconnect())),600));E.addEventListener(`scroll`,()=>(ve(),!N&&P!==void 0&&I()),{passive:!0}),E.addEventListener(`touchstart`,()=>(N=!0,clearTimeout(P),P=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])E.addEventListener(e,()=>(N=!1,I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])E.addEventListener(e,()=>j=A=void 0,{passive:!0});let $=new ResizeObserver(()=>F()?void 0:D.pinned&&!p.detached?E.scrollTop=E.scrollHeight:j?.scrollIntoView({block:`center`}));return $.observe(y),$.observe(E),{log:E,docs:g,apply(e){if(e.reset)J(p.reset({items:e.items??[],before:e.before})),k=!0,W();else if(e.items?.length){let t=p.append(e.items);J(t),Y(t),D.arrived(t.added.length)&&!p.detached&&!F()?B():z()}},reveal(e){A=e,k&&W()},setLive(e,t){x.dataset.mark=t,x.lastChild?.textContent!==e&&x.replaceChildren(...e?[a(`b`,{class:`badge`}),a(`span`,null,e)]:[])}}}export{U as mountChat,_ as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e,t}from"./unit_count-bxhnWg20.js";import{T as n,V as r,a as i,d as a,f as o,g as s,h as c,i as l,l as u,m as d,p as f,y as p}from"./index-BxN8PfTi.js";var m=((e={},t={})=>(t.locale??r())===`zh-TW`?`關閉清單`:`Close the list`),h=((e={},t={})=>(t.locale??r())===`zh-TW`?`切換到其他單位`:`Switch to a unit`),g=((e={},t={})=>(t.locale??r())===`zh-TW`?`所有單位`:`All units`),_=((e={},t={})=>(t.locale??r())===`zh-TW`?`指揮中`:`commanding`),v=((e={},t={})=>(t.locale??r())===`zh-TW`?`已結束`:`ended`),y=((e={},t={})=>(t.locale??r())===`zh-TW`?`錯誤`:`error`),b=((e={},t={})=>(t.locale??r())===`zh-TW`?`閒置`:`idle`),x=((e={},t={})=>(t.locale??r())===`zh-TW`?`無狀態`:`unknown`),S=((e={},t={})=>(t.locale??r())===`zh-TW`?`等待`:`waiting`),C=((e={},t={})=>(t.locale??r())===`zh-TW`?`工作中`:`working`),w=.4;function T(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 E=(e,t,n)=>Math.abs(n)>=.45?n>0:e>=t*w,D=(e,t)=>t||e.some(e=>e.editable||e.sink||e.scrollsX||[`input`,`textarea`,`select`].includes(e.tag));function O(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 k=e=>{let t=[];for(let n=e;n;n=n.parentElement)t.push(O(n));return t},A={working:C,waiting:S,idle:b,done:v,error:y,unknown:x,commanding:_},j=(e,t,n)=>(t?v:A[e])({},n&&{locale:n}),M=(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})));function N(t){return t.bases.flatMap(t=>{let r=[{id:`tower`,rows:t.tower?M(t.id,[{...t.tower,role:`tower`}]):[]},...t.tabs.map(e=>({id:e.id,label:n({label:e.label}),rows:M(t.id,e.units)})),{id:`outside`,label:e(),rows:M(t.id,t.outside)}].filter(e=>e.rows.length);return r.length?[{id:t.id,label:t.label,mark:t.mark,groups:r}]:[]})}var P=e=>e.reduce((e,t)=>(t.sub?e.at(-1)?.subs.push(t):e.push({...t,subs:[]}),e),[]),F=()=>a(`<div class="unit"><div class="card"><a class="hit"></a>${l}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><b class="dstate"></b><span class="note"></span></span></div></div><div class="subs"></div></div>`),I=()=>a(`<section class="dbase"><h3><a></a><small></small></h3><div class="dgroups"></div></section>`),L=()=>a(`<div class="dgroup"><h4></h4><div class="drows"></div></div>`),R=()=>matchMedia(`(max-width: 640px)`).matches;function z(){let e=p(`div`,{class:`drawer-body`}),n=p(`button`,{type:`button`,class:`x`,"aria-label":m()},`×`),r=p(`aside`,{class:`drawer`,"aria-label":h()},p(`header`,null,p(`b`,null,g()),n),e),a=p(`div`,{class:`drawer-veil`});document.body.append(a,r);let l,_,v=!1,y=0,b=0,x,S=()=>{let n=(e,t)=>{i(e.querySelector(`.hit`),{view:`session`,ws:t.ws,key:t.key}),e.querySelector(`.hit`).setAttribute(`aria-label`,`${t.name}: ${j(t.mark,t.ended)}`),e.classList.toggle(`current`,t.key===_),o(e,t.mark),u(e.querySelector(`.plate`),t.role,t.mark),s(e,`.name`,t.name),s(e,`.role`,f(t.role)),s(e,`.dstate`,j(t.mark,t.ended)),d(e,`.note`,t.note,t.mark,t.note?void 0:``),c(e.querySelector(`.subs`),t.subs??[],F,n)};c(e,N(l??{bases:[]}),I,(e,r)=>{o(e,r.mark),s(e,`h3 a`,r.label),i(e.querySelector(`h3 a`),{view:`workspace`,ws:r.id}),s(e,`small`,t({count:r.groups.reduce((e,t)=>e+t.rows.length,0)})),c(e.querySelector(`.dgroups`),r.groups,L,(e,t)=>{s(e,`h4`,t.label??``),e.querySelector(`h4`).toggleAttribute(`hidden`,!t.label),c(e.querySelector(`.drows`),P(t.rows),F,n)})})},C=e=>{y=Math.max(0,Math.min(b,e)),r.style.setProperty(`--dx`,`${y}px`),a.style.opacity=String(b?y/b:0),a.style.pointerEvents=y>0?`auto`:`none`},w=e=>{v=e,r.classList.toggle(`on`,e),r.inert=!e,document.documentElement.classList.remove(`drawer-drag`),C(e?b:0)},O=()=>{b=r.offsetWidth,S(),r.classList.add(`on`),document.documentElement.classList.add(`drawer-drag`)};r.inert=!0,document.addEventListener(`touchstart`,e=>{let t=e.target,n=r.contains(t)||t===a;if(x=void 0,!R()||e.touches.length!==1||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(v?!n:D(k(t),!!getSelection()?.toString())))return;let i=e.touches[0];x={x0:i.clientX,y0:i.clientY,mode:`wait`,was:v,base:y,last:i.clientX,at:performance.now(),v:0}},{passive:!0}),document.addEventListener(`touchmove`,e=>{if(!x||x.mode===`pass`)return;let t=e.touches[0],n=t.clientX-x.x0,r=t.clientY-x.y0;if(x.mode===`wait`){let e=T(n,r,x.was);if(e===`wait`)return;if(e===`pass`)return void(x.mode=`pass`);x.mode=`drag`,O()}e.preventDefault();let i=performance.now();x.v=(t.clientX-x.last)/Math.max(1,i-x.at),[x.last,x.at]=[t.clientX,i],C(x.base+n)},{passive:!1});let A=()=>{let e=x;x=void 0,e?.mode===`drag`&&w(E(y,b,e.v))};return document.addEventListener(`touchend`,A),document.addEventListener(`touchcancel`,A),a.addEventListener(`click`,()=>w(!1)),r.addEventListener(`click`,e=>e.target.closest(`a[data-route], .x`)&&w(!1)),document.addEventListener(`keydown`,e=>v&&e.key===`Escape`&&(e.preventDefault(),w(!1)),!0),document.addEventListener(`sb-drawer`,()=>(v||O(),w(!v))),{net(e){l=e,v&&S()},route(e){_=e.view===`session`?e.key:void 0,v&&S()}}}export{z as mountDrawer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={},t=[`en`,`zh-TW`],n=`PARAGLIDE_LOCALE`,r=[`baseLocale`],i=[],a=typeof window>`u`;globalThis.__paraglide=globalThis.__paraglide??{},globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};var o=!1,s=()=>{let e=r;!a&&typeof window<`u`&&window.location?.href&&(e=ue(window.location.href));let t=c(e,typeof window<`u`?window.location?.href:void 0);if(t)return o||(o=!0,d(t,{reload:!1})),t;throw Error(`No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found`)};function c(e,t){let n;for(let t of e){if(t===`baseLocale`)n=`en`;else if(de(t)&&_.has(t)){let e=_.get(t);if(e){let t=e.getLocale();if(t instanceof Promise)continue;if(t!==void 0)return m(t)}}let e=p(n);if(e)return e}}var l=e=>{s=e},u=e=>{e?window.location.href=e:window.location.reload()},d=(e,t)=>{let n={reload:!0,...t},i;try{i=s()}catch{}let o=[],c=r;!a&&typeof window<`u`&&window.location?.href&&(c=ue(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(de(t)&&_.has(t)){let n=_.get(t);if(n){let r=n.setLocale(e);r instanceof Promise&&(r=r.catch(e=>{throw Error(`Custom strategy "${t}" setLocale failed.`,{cause:e})}),o.push(r))}}let l=()=>{!a&&n.reload&&window.location&&e!==i&&u(void 0)};if(o.length)return Promise.all(o).then(()=>{l()});l()},f=()=>typeof window<`u`?window.location.origin:`http://fallback.com`;function p(e){if(typeof e!=`string`)return;let n=e.toLowerCase();for(let e of t)if(e.toLowerCase()===n)return e}function m(e){let n=p(e);if(n)return n;throw Error(`Invalid locale: ${e}. Expected one of: ${t.join(`, `)}`)}function h(e){return e}function g(t,n){return new e(t,n.href)}function ee(){return 0}function te(e){return i}function ne(e,t){return e.exec(t.href)}var re=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${re}=([^;]*)`);function ie(e){return ae(e)}function ae(e){let t=h(typeof e==`string`?new URL(e,f()):new URL(e.href)),n=t.pathname.replace(/^\/+/,``).split(`/`);return n.length>0&&p(n[0])&&(t.pathname=`/`+n.slice(1).join(`/`)),h(t)}var oe=-1,se,ce;function le(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=ee();if(se===t&&oe===n)return ce;let r=h(new URL(t,`http://example.com`)),a=ie(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of te(e))if(ne(g(t.match,e),e)){s=t;break}if(s)break}return oe=n,se=t,ce=s,s}function ue(e){let t=le(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var _=new Map;function de(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}var fe=((e={},t={})=>(t.locale??s())===`zh-TW`?`警示`:`Alerts`),pe=((e={},t={})=>(t.locale??s())===`zh-TW`?`所有基地`:`all bases`),me=((e={},t={})=>(t.locale??s())===`zh-TW`?``:`.`),he=((e={},t={})=>(t.locale??s())===`zh-TW`?`最後更新:`:`Last update`),ge=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,_e=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,ve=((e,t={})=>(t.locale??s())===`zh-TW`?_e(e):ge(e)),ye=e=>`The server is up but cannot read the net: ${e?.problem}`,be=e=>`伺服器正常,但讀不到網:${e?.problem}`,xe=((e,t={})=>(t.locale??s())===`zh-TW`?be(e):ye(e)),Se=((e={},t={})=>(t.locale??s())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),Ce=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,we=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,Te=((e,t={})=>(t.locale??s())===`zh-TW`?we(e):Ce(e)),Ee=((e={},t={})=>(t.locale??s())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),De=((e={},t={})=>(t.locale??s())===`zh-TW`?`取消`:`Cancel`),Oe=((e={},t={})=>(t.locale??s())===`zh-TW`?`關閉`:`Close`),ke=e=>`Quit base ${e?.name}`,Ae=e=>`關掉基地 ${e?.name}`,je=((e,t={})=>(t.locale??s())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Quit base ${e?.name}? Every agent in it and its tower quit. Nothing quits while anything running would be lost.`,Ne=e=>`要關掉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。有會遺失的東西時什麼都不關。`,Pe=((e,t={})=>(t.locale??s())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Quit squad ${e?.name}`,Ie=e=>`關掉小隊 ${e?.name}`,Le=((e,t={})=>(t.locale??s())===`zh-TW`?Ie(e):Fe(e)),Re=e=>`Quit squad ${e?.name}? Every agent in it quits.`,ze=e=>`要關掉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,Be=((e,t={})=>(t.locale??s())===`zh-TW`?ze(e):Re(e)),Ve=e=>`Quit the tower ${e?.name}? The base's mains become members again.`,He=e=>`要關掉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Ue=((e,t={})=>(t.locale??s())===`zh-TW`?He(e):Ve(e)),We=e=>`Quit ${e?.name}`,Ge=e=>`關掉 ${e?.name}`,Ke=((e,t={})=>(t.locale??s())===`zh-TW`?Ge(e):We(e)),qe=e=>`Quit ${e?.name}? It quits pi and its pane closes.`,Je=e=>`要關掉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Ye=((e,t={})=>(t.locale??s())===`zh-TW`?Je(e):qe(e)),Xe=e=>`control tower · ${e?.state}`,Ze=e=>`塔台 · ${e?.state}`,Qe=((e,t={})=>(t.locale??s())===`zh-TW`?Ze(e):Xe(e)),$e=((e={},t={})=>(t.locale??s())===`zh-TW`?`圖示來自 game-icons.net(Lorc、Delapouite),CC BY 3.0。`:`Icons from game-icons.net by Lorc and Delapouite, CC BY 3.0.`),et=((e={},t={})=>(t.locale??s())===`zh-TW`?`移除`:`Dismiss`),tt=e=>`Dismiss finished (${e?.count})`,nt=e=>`移除已完成(${e?.count})`,rt=((e,t={})=>(t.locale??s())===`zh-TW`?nt(e):tt(e)),it=e=>`Dismiss ${e?.name}`,at=e=>`從畫面移除 ${e?.name}`,ot=((e,t={})=>(t.locale??s())===`zh-TW`?at(e):it(e)),st=((e={},t={})=>(t.locale??s())===`zh-TW`?`文件`:`Documents`),ct=((e={},t={})=>(t.locale??s())===`zh-TW`?`總塔台`:`head tower`),lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`語言`:`Language`),ut=((e={},t={})=>(t.locale??s())===`zh-TW`?`連線中`:`connecting`),dt=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時`:`live`),ft=((e={},t={})=>(t.locale??s())===`zh-TW`?`離線`:`offline`),pt=((e={},t={})=>(t.locale??s())===`zh-TW`?`重新連線中`:`reconnecting`),mt=((e={},t={})=>(t.locale??s())===`zh-TW`?`正體中文`:`English`),ht=((e={},t={})=>(t.locale??s())===`zh-TW`?`位置`:`Location`),gt=e=>`${e?.name} is commanding`,_t=e=>`${e?.name} 指揮中`,vt=((e,t={})=>(t.locale??s())===`zh-TW`?_t(e):gt(e)),yt=e=>`${e?.name} finished`,bt=e=>`${e?.name} 已完成`,xt=((e,t={})=>(t.locale??s())===`zh-TW`?bt(e):yt(e)),St=e=>`${e?.name} hit an error`,Ct=e=>`${e?.name} 發生錯誤`,wt=((e,t={})=>(t.locale??s())===`zh-TW`?Ct(e):St(e)),Tt=e=>`${e?.name} went idle`,Et=e=>`${e?.name} 轉為閒置`,Dt=((e,t={})=>(t.locale??s())===`zh-TW`?Et(e):Tt(e)),Ot=e=>`${e?.name} joined`,kt=e=>`${e?.name} 加入`,At=((e,t={})=>(t.locale??s())===`zh-TW`?kt(e):Ot(e)),jt=e=>`${e?.name} left`,Mt=e=>`${e?.name} 離開`,Nt=((e,t={})=>(t.locale??s())===`zh-TW`?Mt(e):jt(e)),Pt=e=>`${e?.name} lost its status`,Ft=e=>`${e?.name} 失去狀態`,It=((e,t={})=>(t.locale??s())===`zh-TW`?Ft(e):Pt(e)),Lt=e=>`${e?.name} is waiting on a question`,Rt=e=>`${e?.name} 正在等待回答`,zt=((e,t={})=>(t.locale??s())===`zh-TW`?Rt(e):Lt(e)),Bt=e=>`${e?.name} started working`,Vt=e=>`${e?.name} 開始工作`,Ht=((e,t={})=>(t.locale??s())===`zh-TW`?Vt(e):Bt(e)),Ut=((e={},t={})=>(t.locale??s())===`zh-TW`?`指揮中`:`commanding`),Wt=((e={},t={})=>(t.locale??s())===`zh-TW`?`已完成`:`finished`),Gt=((e={},t={})=>(t.locale??s())===`zh-TW`?`錯誤`:`error`),Kt=((e={},t={})=>(t.locale??s())===`zh-TW`?`閒置`:`idle`),qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無狀態`:`no status`),Jt=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待回答`:`waiting on a question`),Yt=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`working`),Xt=e=>`Monitor failed: ${e?.what}`,Zt=e=>`Monitor 出錯:${e?.what}`,Qt=((e,t={})=>(t.locale??s())===`zh-TW`?Zt(e):Xt(e)),$t=e=>`Monitor went quiet and stopped: ${e?.what}`,en=e=>`Monitor 太久沒輸出,已停止:${e?.what}`,tn=((e,t={})=>(t.locale??s())===`zh-TW`?en(e):$t(e)),nn=((e={},t={})=>(t.locale??s(),`Logs`)),rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`從未`:`never`),an=((e={},t={})=>(t.locale??s())===`zh-TW`?`+新基地`:`+ New base`),on=((e={},t={})=>(t.locale??s())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`無警示`:`no alerts`),v=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`尚無塔台`:`no tower yet`),ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`監看中`:`Watching a monitor`),un=((e={},t={})=>(t.locale??s())===`zh-TW`?`思考中`:`thinking`),dn=e=>`Finished ${e?.note}`,fn=e=>`完成了 ${e?.note}`,pn=((e,t={})=>(t.locale??s())===`zh-TW`?fn(e):dn(e)),mn=e=>`Failed ${e?.note}`,hn=e=>`出錯了 ${e?.note}`,gn=((e,t={})=>(t.locale??s())===`zh-TW`?hn(e):mn(e)),_n=e=>`Waiting on you ${e?.note}`,vn=e=>`等你回答 ${e?.note}`,yn=((e,t={})=>(t.locale??s())===`zh-TW`?vn(e):_n(e)),bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`+主智慧體`:`+ Main`),xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`+成員`:`+ Member`),Sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`Outposts`),Cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`手機`:`Phone`),wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),Tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`接回`:`Pop`),En=e=>`Pop ${e?.name}`,Dn=e=>`接回 ${e?.name}`,On=((e,t={})=>(t.locale??s())===`zh-TW`?Dn(e):En(e)),kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),An=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),y=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉`:`Quit`),jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉塔台`:`Quit tower`),Mn=e=>`Refused (${e?.status}).`,Nn=e=>`已拒絕(${e?.status})。`,b=((e,t={})=>(t.locale??s())===`zh-TW`?Nn(e):Mn(e)),Pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒`:`Remind`),Fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),In=((e={},t={})=>(t.locale??s())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),Ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已關`:`Reminders off`),Rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已開:分頁不在前景時,單位等你回答、完成或出錯會跳系統通知`:`Reminders on: while the page is in the background, a unit waiting on you, finishing, or failing raises a system notification`),zn=((e={},t={})=>(t.locale??s())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),Bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`主智慧體`:`main`),Vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`成員`:`member`),Hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`outpost`),Un=((e={},t={})=>(t.locale??s())===`zh-TW`?`未編入`:`unaligned`),Wn=((e={},t={})=>(t.locale??s(),`session`)),Gn=((e={},t={})=>(t.locale??s())===`zh-TW`?`子智慧體`:`subagent`),Kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`塔台`:`tower`),qn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效`:`Sound`),Jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已關`:`Sounds off`),Yn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已開`:`Sounds on`),Xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效:開關、音量與試聽`:`Sounds: on or off, volume, and a try`),Zn=((e={},t={})=>(t.locale??s())===`zh-TW`?`▶ 試聽`:`▶ Try`),Qn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音量`:`Volume`),$n=((e={},t={})=>(t.locale??s())===`zh-TW`?`收起`:`Stash`),er=e=>`Stash base ${e?.name}`,tr=e=>`收起基地 ${e?.name}`,nr=((e,t={})=>(t.locale??s())===`zh-TW`?tr(e):er(e)),rr=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.`,ir=e=>`要收起基地 ${e?.name} 嗎?塔台、主智慧體和成員會結束,之後可以用「接回」叫回來。有會遺失的東西時不會收。`,ar=((e,t={})=>(t.locale??s())===`zh-TW`?ir(e):rr(e)),or=e=>`Stashed (${e?.count})`,sr=e=>`已收起(${e?.count})`,cr=((e,t={})=>(t.locale??s())===`zh-TW`?sr(e):or(e)),lr=((e={},t={})=>(t.locale??s())===`zh-TW`?`智慧體`:`Agents`),ur=((e={},t={})=>(t.locale??s())===`zh-TW`?`基地`:`Bases`),dr=((e={},t={})=>(t.locale??s())===`zh-TW`?`指揮中`:`Commanding`),fr=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待中`:`Waiting`),pr=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`Working`),mr=((e={},t={})=>(t.locale??s())===`zh-TW`?`狀態`:`States`),hr=e=>`tab ${e?.label}`,gr=e=>`分頁 ${e?.label}`,_r=((e,t={})=>(t.locale??s())===`zh-TW`?gr(e):hr(e)),vr=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),yr=((e={},t={})=>(t.locale??s())===`zh-TW`?`網的總計`:`Net totals`),br=e=>`${e?.label} tower`,xr=e=>`${e?.label} 塔台`,Sr=((e,t={})=>(t.locale??s())===`zh-TW`?xr(e):br(e)),Cr=e=>`using ${e?.tool}`,wr=e=>`使用 ${e?.tool}`,Tr=((e,t={})=>(t.locale??s())===`zh-TW`?wr(e):Cr(e)),Er=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待變化…`:`Waiting for changes…`),Dr=`sb-locale`;function Or(e){let t=/^zh\b/i.test(e)&&(/-(hant|tw|hk|mo)\b/i.test(e)?`zh-TW`:/-(hans|cn|sg|my)\b/i.test(e)?`zh-CN`:void 0);return p(e)??(t?p(t):void 0)??p(e.split(`-`)[0])}function kr(e,t){return p(e)??t.map(Or).find(Boolean)??`en`}var Ar={brand_label:Ee,tagline:vr,totals_label:yr,stat_bases:ur,stat_agents:lr,stat_working:pr,stat_waiting:fr,stat_commanding:dr,mark_commanding:Ut,alerts:fe,no_alerts:sn,pair_button:Cn,pair_title:wn,link_connecting:ut,location:ht,all_bases:pe,documents:st,net_log:nn,states:mr,mark_working:Yt,mark_waiting:Jt,mark_idle:Kt,mark_done:Wt,mark_error:Gt,credit:$e,language:lt,waiting_changes:Er,new_base:an};Object.keys(Ar);function jr(){let e=null;try{e=localStorage.getItem(Dr)}catch{}let n=kr(e,navigator.languages??[navigator.language]);l(()=>n),document.documentElement.lang=n;let r={m:(e,t)=>e.textContent=t,mLabel:(e,t)=>e.setAttribute(`aria-label`,t),mTitle:(e,t)=>e.title=t,mEmpty:(e,t)=>e.dataset.empty=t};for(let e of document.querySelectorAll(`[data-m], [data-m-label], [data-m-title], [data-m-empty]`))for(let[t,n]of Object.entries(r))e.dataset[t]&&n(e,Ar[e.dataset[t]]?.()??e.dataset[t]);let i=document.getElementById(`lang`);i.replaceChildren(...t.map(e=>new Option(mt({},{locale:e}),e,!1,e===n))),i.onchange=()=>{try{localStorage.setItem(Dr,i.value),location.reload()}catch{i.value=n}}}var Mr={commanding:vt,working:Ht,waiting:zt,idle:Dt,done:xt,error:wt,unknown:It};function Nr(e){let t=new Map;for(let n of e.bases){n.tower&&t.set(`tower:${n.id}`,{name:Sr({label:n.label}),mark:n.tower.mark});for(let e of[...n.tower?.subs??[],...n.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))])t.set(e.id,{name:e.name,mark:e.mark});for(let e of n.outposts)t.set(e.id,{name:e.label,mark:e.mark})}return t}function Pr(e,t){if(!e)return[];let[n,r]=[Nr(e),Nr(t)],i=[];for(let[e,t]of r){let r=n.get(e);r?r.mark!==t.mark&&i.push({text:Mr[t.mark]({name:t.name}),mark:t.mark}):i.push({text:At({name:t.name}),mark:t.mark})}for(let[e,t]of n)r.has(e)||i.push({text:Nt({name:t.name}),mark:`idle`});return i}var Fr=e=>e.unit??e.key,x=e=>e.mark===`waiting`||e.pending?0:1;function Ir(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}`)}return n}function Lr(e,t){return[...t.values()].filter(t=>{let n=e?.get(t.key);return x(t)===0?!n||x(n)!==0||n.mark!==t.mark:e!==void 0&&n?.mark!==t.mark&&(t.mark===`error`||t.mark===`done`)})}var Rr=`input, textarea, select, [role=textbox], [role=combobox], [role=listbox], .term-scroll`,zr=`button, a, summary, [role=button], [role=link]`,Br=`.ask-opt, [role=radio], [role=checkbox]`,Vr=`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`;function Hr(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?.(Rr))){if(e.key===`f`||e.key===`F`)return`zoom`;if(e.key===` `&&!r?.closest?.(Br)&&(n||!r?.closest?.(zr)))return`next`}}function Ur(e,t=()=>document.querySelector(Vr)!==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=Hr(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 Wr=3e4,Gr=[`pointermove`,`pointerdown`,`keydown`,`wheel`,`touchstart`];function Kr(e=document.documentElement){if(matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=Date.now(),n,r=()=>{let i=t+Wr-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,Wr))};for(let e of Gr)addEventListener(e,i,{capture:!0,passive:!0});document.addEventListener(`visibilitychange`,()=>document.hidden||i()),i()}var qr=(...e)=>e.filter(e=>e!==!1&&e!=null),Jr=(e,t)=>(e.classList.add(t),e.classList.toggle(`flip`));function Yr(e,t,...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t??{}))r.setAttribute(e,n);return r.append(...qr(...n)),r}function Xr({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 Zr(e,t){if(t||!e.length)return[];let n=document.createElement(`style`);return n.textContent=e.map((e,t)=>`@keyframes pk${t}{${Xr(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 Qr=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),$r=function(e,t){return new URL(e,t).href},ei={},ti=function(e){return e.pathname.endsWith(`.css`)},ni=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},S=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=$r(t,n);let r=s(t),i=ti(r);return ni(ei,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`:Qr,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 C(e,t,n,r,i=!1){Object.assign(e.dataset,t),[e.hidden,e.textContent]=[i,n],r&&e.setAttribute(`aria-label`,r)}var ri=(e,t)=>t.role===`subagent`&&t.ended&&t.key?C(e,{close:`dismiss`,key:t.key,name:t.name,role:t.role},et(),ot({name:t.name})):C(e,{close:`unit`,key:t.key??``,name:t.name,role:t.role},y(),Ke({name:t.name}),!(t.control&&t.key)||t.role===`subagent`),ii=(e,t)=>C(e,{key:t?.key??``,name:t?.name??``,role:`tower`},jn(),void 0,!t?.control),ai=(e,t)=>C(e,{ws:t.id,name:t.label},y(),je({name:t.label})),oi=(e,t)=>C(e,{ws:t.id,name:t.label},$n(),nr({name:t.label})),si=(e,t,n)=>C(e,{ws:t.id,name:n.label,tab:n.id},y(),Le({name:n.label})),w=(e,t)=>new Promise(n=>{let r=document.createElement(`dialog`),i=document.createElement(`p`),a=document.createElement(`div`),o=(e,t,i)=>Object.assign(document.createElement(`button`),{type:`button`,className:t,textContent:e,onclick:()=>(r.close(),n(i))});[r.className,i.textContent,a.className]=[`sheet`,e,`sheet-row`],a.append(...t?[o(De(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(Oe(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()}),ci=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 li(e,t){let n=ci(t).length;e.hidden=!n,n&&(e.textContent=rt({count:n}))}function ui(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=cr({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`],C(r,{close:`pop`,name:e.name},Tn(),On({name:e.name})),t.append(n,r),t})))}function di(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 fi(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 S(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`dismiss`,r.close===`dismiss`?{key:r.key}:{all:!0})).then(e=>e.ok||w(e.body.reason??b({status:e.status})),()=>w(v()));if(r.close===`pop`)return void(n.toggleAttribute(`disabled`,!0),S(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/pop`,{name:r.name})).then(e=>e.ok||w(e.body.reason??b({status:e.status})),()=>w(v())).finally(()=>n.toggleAttribute(`disabled`,!1)));w((r.close===`stash`?ar:r.close===`base`?Pe:r.close===`tab`?Be:r.role===`tower`?Ue:Ye)({name:r.name??``}),r.close===`stash`?$n():y()).then(t=>{t&&(n.toggleAttribute(`disabled`,!0),S(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/${r.close===`base`?`all`:r.close}`,r.close===`unit`?{key:r.key}:{workspace:r.ws,...r.tab&&{tab:r.tab}})).then(t=>t.ok?di(r,e):w(t.body.reason??b({status:t.status})),()=>w(v())).finally(()=>n.toggleAttribute(`disabled`,!1)))})}})}var pi=e=>{try{return decodeURIComponent(e)}catch{return e}},T=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function E(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(pi);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 D=e=>e.view===`map`?``:e.view===`workspace`?`w/${T(e.ws)}`:`w/${T(e.ws)}/s/${T(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,mi=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},O=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null;function hi(e,t=new URL(document.baseURI).pathname){let n=()=>E(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>D(e)||`./`,go(n){let r=t+D(n);location.pathname+location.search!==r&&history.pushState(null,``,r),e(n)}};return addEventListener(`popstate`,()=>e(n())),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-route]`);!t||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),r.go(E(t.getAttribute(`data-route`))))}),r}var gi={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},k={commanding:Ut,working:Yt,waiting:Jt,idle:Kt,done:Wt,error:Gt,unknown:qt},_i={main:Bn,member:Vn,subagent:Gn,tower:Kn,outpost:Hn,outside:Un,session:Wn},vi={thinking:un,"watching a monitor":ln,idle:Kt,"waiting on a question":Jt,finished:Wt},yi=e=>Object.hasOwn(_i,e)?_i[e]():e,bi=e=>e===`waiting`||e===`error`,A=e=>{let t=new DOMParser().parseFromString(e.trim(),`text/html`).body.firstElementChild;if(!(t instanceof HTMLElement))throw Error(`bad template`);return document.importNode(t,!0)},j=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},M=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},N=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&Jr(e,`flash`)},xi=e=>(t=>(e.slice(8,t)===`stale`?tn:Qt)({what:e.slice(t+1)}))(e.indexOf(`:`,8)),P=(e,t)=>e?e.startsWith(`tool:`)?Tr({tool:e.slice(5)}):e.startsWith(`monitor:`)?xi(e):Object.hasOwn(vi,e)?vi[e]():e:k[t](),Si=(e,t,n,r,i=P(n,r))=>{M(e,t,i),e.querySelector(t).toggleAttribute(`data-monitoring`,i===P(n,r)&&n===`watching a monitor`)},Ci=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,D(t)||`./`),e.setAttribute(`data-route`,D(t)))},wi=(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`},Ti=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function Ei(e,t,n,r){N(e,n);let i=e.querySelector(`use`),a=`#i-${gi[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 F(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 I=()=>A(`<div class="unit"><div class="card"><a class="hit"></a>${Ti}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button></div><div class="subs"></div></div>`);function L(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);Ci(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${P(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,bi(t.mark)),N(e,t.mark),Ei(e.querySelector(`.plate`),t.role,t.mark,t.docs),M(e,`.name`,t.name),M(e,`.role`,yi(t.role)),Si(e,`.note`,t.note,t.mark),ri(e.querySelector(`:scope > .card > .quit-btn`),t),F(e.querySelector(`.subs`),t.subs??[],I,L)}function Di(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`?bn():xn())&&(e.textContent=r===`main`?bn():xn())}var Oi=()=>A(`<section class="base"><header><div class="tower"><i class="sweep"></i><i class="pulse"></i><svg><use href="#i-tower"/></svg><b class="badge"></b></div><div class="title"><span class="crown"><svg><use href="#i-crown"/></svg>${ct()}</span><h2><a class="enter-base"></a></h2><p></p><button type="button" class="quit-btn tower-quit" data-close="unit" hidden></button></div><button type="button" class="quit-btn" data-close="base"></button></header><div class="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="${Sn()}"></div></section>`);function ki(e,t){N(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),N(n,t.tower?.mark??`unknown`),M(e,`h2 a`,t.label),Ci(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),M(e,`.title p`,t.tower?Qe({state:k[t.tower.mark]()}):cn()),Di(e.querySelector(`.spawn-btns button`),t),ai(e.querySelector(`header > .quit-btn`),t),oi(e.querySelector(`.spawn-btns [data-close=stash]`),t),ii(e.querySelector(`.tower-quit`),t.tower),F(e.querySelector(`.tower-subs`),t.tower?.subs??[],I,L),F(e.querySelector(`.tabs`),t.tabs,()=>A(`<div class="tab"><h3><span></span><button type="button" class="tab-add"></button><button type="button" class="quit-btn" data-close="tab"></button></h3><div class="units"></div></div>`),(e,n)=>{M(e,`h3 span`,_r({label:n.label})),si(e.querySelector(`.quit-btn`),t,n),Di(e.querySelector(`.tab-add`),t,n.id),F(e.querySelector(`.units`),n.units,I,L)}),F(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?on():void 0})),I,L)}function Ai(e,t,n,r){let i=[...e.querySelectorAll(`.base:not(.leaving) .tower`)],a=e.querySelector(`.base.head:not(.leaving) .tower`),o=e.getBoundingClientRect(),s=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-o.x),Math.round(t.y+t.height/2-o.y)]},c=a?i.filter(e=>e!==a):[],l=c.map(e=>{let[[t,n],[r,i]]=[s(a),s(e)];return{x1:t,y1:n,x2:r,y2:i,mid:Math.round((t+r)/2)}}),u=l.map(({x1:e,y1:t,x2:n,y2:r,mid:i})=>`M${e} ${t}C${i} ${t} ${i} ${r} ${n} ${r}`),d=u.join(`|`);t.dataset.sig!==d&&(t.dataset.sig=d,t.replaceChildren(...u.map(e=>(t=>(t.setAttribute(`class`,`wire`),t.setAttribute(`d`,e),t))(document.createElementNS(`http://www.w3.org/2000/svg`,`path`)))),n.replaceChildren(...Zr(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??``)))}function ji(){let[e,t,n,r,i]=[j(`map`,HTMLElement),j(`bases`,HTMLElement),j(`links`,SVGSVGElement),j(`packets`,HTMLElement),j(`log`,HTMLElement)],a=matchMedia(`(prefers-reduced-motion: reduce)`).matches,o=()=>!e.hidden&&Ai(e,n,r,a);return new ResizeObserver(o).observe(e),Kr(),{layout:o,stats(e){let t=e.bases.flatMap(e=>[...e.tower?.subs??[],...e.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))]),n=e=>String(t.filter(t=>!e||t.mark===e).length);j(`s-commanding`,HTMLElement).parentElement.toggleAttribute(`data-on`,t.some(e=>e.mark===`commanding`));for(let[t,r]of[[`s-bases`,String(e.bases.length)],[`s-agents`,n()],[`s-working`,n(`working`)],[`s-commanding`,n(`commanding`)],[`s-waiting`,n(`waiting`)]])j(t,HTMLElement).textContent=r},show(e){F(t,e.bases,Oi,ki),requestAnimationFrame(o)},log(e){let t=new Date().toLocaleTimeString([],{hour12:!1});for(let n of e){let e=A(`<li><span></span><time></time></li>`);e.dataset.mark=n.mark,M(e,`span`,n.text),M(e,`time`,t),i.prepend(e)}for(;i.children.length>12;)i.lastElementChild.remove()},pause(e){document.documentElement.classList.toggle(`paused`,e)}}}var Mi=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,Ni=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,Pi={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:Ni,done:Mi},Fi=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,Ii=(e,t)=>{try{return localStorage.getItem(e)??t}catch{return t}},Li=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function Ri(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=Ii(`sb.remind`,`1`)===`1`,u=Ii(`sb.sound`,`0`)===`1`,d=Math.min(100,Math.max(0,Number(Ii(`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`?Rn():e===`denied`?In():Fn():Ln():zn(),r.dataset.state=u?`on`:`off`,r.setAttribute(`aria-label`,u?Yn():Jn()),a.checked=u,o.value=s.value=String(d),p&&(p.gain.value=(d/100)**2)};n.textContent=Pn(),r.textContent=qn(),r.title=Xn(),t(`sound-on-label`).textContent=qn(),t(`sound-vol-label`).textContent=Qn(),t(`sound-try`).textContent=Zn(),n.onclick=async()=>{l&&c&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):Li(`sb.remind`,(l=!l)?`1`:`0`),h()},i.addEventListener(`toggle`,e=>e.newState===`open`&&wi(i,r)),a.onchange=()=>{Li(`sb.sound`,(u=a.checked)?`1`:`0`),h(),u&&g(`done`)},o.oninput=()=>(Li(`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(Pi[e]).then(e=>e.arrayBuffer()).then(e=>t.decodeAudioData(e))),Promise.all([t.resume(),m.get(e)]).then(([,e])=>{let r=t.createBufferSource();r.buffer=e,r.connect(n),r.start()}).catch(()=>m.delete(e))}return h(),{signal(t){let n=t.flatMap(e=>(t=>t?[{a:e,k:t}]:[])(Fi(e)));if(n.length&&(u&&g([`waiting`,`error`,`done`].find(e=>n.some(t=>t.k===e))),l&&c&&Notification.permission===`granted`&&(document.hidden||!document.hasFocus())))for(let{a:t,k:r}of n){let n=new Notification(t.name,{body:{waiting:yn,error:gn,done:pn}[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 zi=45e3,Bi=1e3,Vi=3e4,Hi=(e,t)=>Math.min(Vi,Bi*2**(e-1))*(.8+.4*t);function Ui(e){try{return JSON.parse(e)}catch{return}}function Wi(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(),zi),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,Hi(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=Ui(r);i&&e.onNet(i),o({problem:i?void 0:kn()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:Ui(e)??An()}),l())}),r=e.setTimeout(()=>u(),zi)};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()}}}jr();var R=ji(),z=e=>document.getElementById(e),Gi=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):rn(),Ki,qi,B,V,Ji={state:`connecting`,attempt:0},H={view:`map`},Yi=!1,Xi,Zi=``,U,Qi,W=e=>U?e(U):void Qi?.then(e);function $i(){Qi??=S(async()=>{let{mountFocus:e}=await import(`./views-CaqenppV.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(U=e({data:ma,restart:()=>Z.restart(),openTile:ta,embedTerminal:(e,t,n)=>new Promise(r=>K(i=>r(i.terminal.embed(e,t,n)))),online:()=>Ji.state===`live`}),U.show(H,H),B&&U.net(B),U))}var G,ea,K=e=>{if(G)return e(G);ea??=S(async()=>{let{mountPanels:e}=await import(`./layer-CdB4_qEG.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>G=e({label:e=>B?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(Y?Y.data(e).latest():J(e,`?limit=12`))).items,post:e=>Y&&((t,n)=>Y.data(e).post(t,n)),stream:()=>Zi,showTerminal:(e,t)=>(G?.stack.close(),U?.terminal(t),X.go({view:`session`,ws:e,key:t}))})),ea.then(e)},ta=(e,t)=>K(n=>n.tiles.open(e,t)),q=document.querySelector(`link[rel="icon"]`),na=q&&decodeURIComponent(q.href.slice(q.href.indexOf(`,`)+1)),ra=0;function ia(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;if(!q||!na||t===ra)return;ra=t;let n=`<circle cx='23' cy='9' r='9' fill='#ffd166' stroke='#0b1220' stroke-width='2'/><text x='23' y='13' text-anchor='middle' font-family='sans-serif' font-size='${t>9?9:12}' font-weight='700' fill='#06101e'>${t>9?`9+`:t}</text>`;q.href=`data:image/svg+xml,${encodeURIComponent(t?na.replace(`</svg>`,`${n}</svg>`):na)}`}var aa;function oa(e){B=V=e,ia(e);let t=Ir(e,Date.now());if(aa&&ga.signal(Lr(aa,t)),aa=t,document.hidden)return;R.stats(e),li(z(`dismiss-all`),e),ui(z(`stashed`),z(`stashed-list`),e),Q?.net(e);let n=Lr(Xi,t);(n.length||G)&&K(e=>e.alerts(n,t)),Xi=t,R.log(Pr(qi,e)),qi=e,W(t=>t.net(e)),H.view===`map`&&(R.show(e),Ki=e,V=void 0)}function sa(e){let t=H,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;H=e,Q?.route(e),e.view!==`map`&&$i(),z(`map`).hidden=e.view!==`map`,z(`legend`).hidden=e.view===`session`,W(r=>r.show(e,t,n)),e.view===`map`&&B&&B!==Ki&&(oa(B),requestAnimationFrame(R.layout)),Yi&&O(e)!==O(t)&&Z.restart()}function ca(e){Ji=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=z(`stage`).dataset.stale=String(t),z(`link`).dataset.state=e.state,z(`link-text`).textContent={connecting:ut,live:dt,reconnecting:pt,offline:ft}[e.state](),U&&B&&U.net(B),G?.stack.redraw();let n=z(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?ve({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?Te({attempt:e.attempt}):Se():xe({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=Gi(e.lastContact),n.replaceChildren(`${r} ${he()} `,i,me())}function la(e,t){try{let n=JSON.parse(t);W(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var ua=document.querySelector(`meta[name="sb-build"]`)?.content,da=e=>!!(ua&&ua!==JSON.parse(e).build);function fa(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 pa=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),J=(e,t=``)=>pa(`history/${encodeURIComponent(e)}${t}`),Y=void 0,ma=e=>({older:t=>J(e,`?before=${encodeURIComponent(t)}`),latest:()=>J(e),entry:t=>pa(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),ha=()=>{let e=fa(O(H));return e.listen(`history`,e=>la(`history`,e)),e.listen(`cards`,e=>la(`cards`,e)),e.listen(`hello`,e=>da(e)?location.reload():(Zi=e,G?.terminal.hello())),e.listen(`mirror`,e=>G?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&E(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=Xi?.get(n.key);r&&(e.preventDefault(),K(e=>e.stack.show(r)))},!0);var X=hi(e=>sa(e)),ga=Ri(e=>X.go({view:`session`,ws:e.ws,key:Fr(e)})),Z=Wi({open:ha,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:oa,onStatus:ca}),_a=()=>Z.resume();document.addEventListener(`visibilitychange`,()=>{if(R.pause(document.hidden),document.hidden)return Z.hide();V&&oa(V),W(e=>e.wake()),_a()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(e.preventDefault(),!G?.stack.close()&&H.view!==`map`&&X.go(mi(H)))}),Ur(e=>G?.hotkey(e)??!1),z(`pair`).hidden=location.hostname!==`127.0.0.1`,z(`pair`).addEventListener(`click`,()=>void S(async()=>{let{pairTile:e}=await import(`./pair-CYpt5vBi.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>ta(e(),!0)));var Q,$=matchMedia(`(pointer: coarse), (max-width: 640px)`),va=()=>void S(async()=>{let{mountDrawer:e}=await import(`./drawer-DPktzZAN.js`);return{mountDrawer:e}},[],import.meta.url).then(({mountDrawer:e})=>(Q??=e(),B&&Q.net(B),Q.route(H)));$.matches?va():$.addEventListener(`change`,()=>$.matches&&!Q&&va(),{once:!0}),fi({route:()=>H,net:()=>B,go:e=>X.go(e)}),z(`stashed-pop`).addEventListener(`toggle`,e=>e.newState===`open`&&wi(z(`stashed-pop`),z(`stashed`))),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&S(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-CH3gvfPw.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,B?.bases??[]);r&&ta(n(r,(e,t,n)=>(G?.tiles.close(n),X.go({view:`session`,ws:e,key:t}))),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&_a());ca(Ji),sa(X.route()),Z.start(),Yi=!0;export{v as A,s as B,Fr as C,b as D,fr as E,st as F,Qe as I,Oe as L,on as M,rn as N,Sn as O,ct as P,De as R,x as S,pr as T,S as _,Di as a,Jr as b,Ei as c,N as d,yi as f,bi as g,M as h,Ci as i,sn as j,cn as k,wi as l,F as m,k as n,j as o,Si as p,Ti as r,P as s,gi as t,A as u,Yr as v,_r as w,Vr as x,qr as y,pe as z};
|
|
1
|
+
var e={},t=[`en`,`zh-TW`],n=`PARAGLIDE_LOCALE`,r=[`baseLocale`],i=[],a=typeof window>`u`;globalThis.__paraglide=globalThis.__paraglide??{},globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};var o=!1,s=()=>{let e=r;!a&&typeof window<`u`&&window.location?.href&&(e=ue(window.location.href));let t=c(e,typeof window<`u`?window.location?.href:void 0);if(t)return o||(o=!0,d(t,{reload:!1})),t;throw Error(`No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found`)};function c(e,t){let n;for(let t of e){if(t===`baseLocale`)n=`en`;else if(de(t)&&_.has(t)){let e=_.get(t);if(e){let t=e.getLocale();if(t instanceof Promise)continue;if(t!==void 0)return m(t)}}let e=p(n);if(e)return e}}var l=e=>{s=e},u=e=>{e?window.location.href=e:window.location.reload()},d=(e,t)=>{let n={reload:!0,...t},i;try{i=s()}catch{}let o=[],c=r;!a&&typeof window<`u`&&window.location?.href&&(c=ue(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(de(t)&&_.has(t)){let n=_.get(t);if(n){let r=n.setLocale(e);r instanceof Promise&&(r=r.catch(e=>{throw Error(`Custom strategy "${t}" setLocale failed.`,{cause:e})}),o.push(r))}}let l=()=>{!a&&n.reload&&window.location&&e!==i&&u(void 0)};if(o.length)return Promise.all(o).then(()=>{l()});l()},f=()=>typeof window<`u`?window.location.origin:`http://fallback.com`;function p(e){if(typeof e!=`string`)return;let n=e.toLowerCase();for(let e of t)if(e.toLowerCase()===n)return e}function m(e){let n=p(e);if(n)return n;throw Error(`Invalid locale: ${e}. Expected one of: ${t.join(`, `)}`)}function h(e){return e}function g(t,n){return new e(t,n.href)}function ee(){return 0}function te(e){return i}function ne(e,t){return e.exec(t.href)}var re=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${re}=([^;]*)`);function ie(e){return ae(e)}function ae(e){let t=h(typeof e==`string`?new URL(e,f()):new URL(e.href)),n=t.pathname.replace(/^\/+/,``).split(`/`);return n.length>0&&p(n[0])&&(t.pathname=`/`+n.slice(1).join(`/`)),h(t)}var oe=-1,se,ce;function le(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=ee();if(se===t&&oe===n)return ce;let r=h(new URL(t,`http://example.com`)),a=ie(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of te(e))if(ne(g(t.match,e),e)){s=t;break}if(s)break}return oe=n,se=t,ce=s,s}function ue(e){let t=le(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var _=new Map;function de(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}var fe=((e={},t={})=>(t.locale??s())===`zh-TW`?`警示`:`Alerts`),pe=((e={},t={})=>(t.locale??s())===`zh-TW`?`所有基地`:`all bases`),me=((e={},t={})=>(t.locale??s())===`zh-TW`?``:`.`),he=((e={},t={})=>(t.locale??s())===`zh-TW`?`最後更新:`:`Last update`),ge=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,_e=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,ve=((e,t={})=>(t.locale??s())===`zh-TW`?_e(e):ge(e)),ye=e=>`The server is up but cannot read the net: ${e?.problem}`,be=e=>`伺服器正常,但讀不到網:${e?.problem}`,xe=((e,t={})=>(t.locale??s())===`zh-TW`?be(e):ye(e)),Se=((e={},t={})=>(t.locale??s())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),Ce=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,we=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,Te=((e,t={})=>(t.locale??s())===`zh-TW`?we(e):Ce(e)),Ee=((e={},t={})=>(t.locale??s())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),De=((e={},t={})=>(t.locale??s())===`zh-TW`?`取消`:`Cancel`),Oe=((e={},t={})=>(t.locale??s())===`zh-TW`?`關閉`:`Close`),ke=e=>`Quit base ${e?.name}`,Ae=e=>`關掉基地 ${e?.name}`,je=((e,t={})=>(t.locale??s())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Quit base ${e?.name}? Every agent in it and its tower quit. Nothing quits while anything running would be lost.`,Ne=e=>`要關掉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。有會遺失的東西時什麼都不關。`,Pe=((e,t={})=>(t.locale??s())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Quit squad ${e?.name}`,Ie=e=>`關掉小隊 ${e?.name}`,Le=((e,t={})=>(t.locale??s())===`zh-TW`?Ie(e):Fe(e)),Re=e=>`Quit squad ${e?.name}? Every agent in it quits.`,ze=e=>`要關掉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,Be=((e,t={})=>(t.locale??s())===`zh-TW`?ze(e):Re(e)),Ve=e=>`Quit the tower ${e?.name}? The base's mains become members again.`,He=e=>`要關掉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Ue=((e,t={})=>(t.locale??s())===`zh-TW`?He(e):Ve(e)),We=e=>`Quit ${e?.name}`,Ge=e=>`關掉 ${e?.name}`,Ke=((e,t={})=>(t.locale??s())===`zh-TW`?Ge(e):We(e)),qe=e=>`Quit ${e?.name}? It quits pi and its pane closes.`,Je=e=>`要關掉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Ye=((e,t={})=>(t.locale??s())===`zh-TW`?Je(e):qe(e)),Xe=e=>`control tower · ${e?.state}`,Ze=e=>`塔台 · ${e?.state}`,Qe=((e,t={})=>(t.locale??s())===`zh-TW`?Ze(e):Xe(e)),$e=((e={},t={})=>(t.locale??s())===`zh-TW`?`圖示來自 game-icons.net(Lorc、Delapouite),CC BY 3.0。`:`Icons from game-icons.net by Lorc and Delapouite, CC BY 3.0.`),et=((e={},t={})=>(t.locale??s())===`zh-TW`?`移除`:`Dismiss`),tt=e=>`Dismiss finished (${e?.count})`,nt=e=>`移除已完成(${e?.count})`,rt=((e,t={})=>(t.locale??s())===`zh-TW`?nt(e):tt(e)),it=e=>`Dismiss ${e?.name}`,at=e=>`從畫面移除 ${e?.name}`,ot=((e,t={})=>(t.locale??s())===`zh-TW`?at(e):it(e)),st=((e={},t={})=>(t.locale??s())===`zh-TW`?`文件`:`Documents`),ct=((e={},t={})=>(t.locale??s())===`zh-TW`?`總塔台`:`head tower`),lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`語言`:`Language`),ut=((e={},t={})=>(t.locale??s())===`zh-TW`?`連線中`:`connecting`),dt=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時`:`live`),ft=((e={},t={})=>(t.locale??s())===`zh-TW`?`離線`:`offline`),pt=((e={},t={})=>(t.locale??s())===`zh-TW`?`重新連線中`:`reconnecting`),mt=((e={},t={})=>(t.locale??s())===`zh-TW`?`正體中文`:`English`),ht=((e={},t={})=>(t.locale??s())===`zh-TW`?`位置`:`Location`),gt=e=>`${e?.name} is commanding`,_t=e=>`${e?.name} 指揮中`,vt=((e,t={})=>(t.locale??s())===`zh-TW`?_t(e):gt(e)),yt=e=>`${e?.name} finished`,bt=e=>`${e?.name} 已完成`,xt=((e,t={})=>(t.locale??s())===`zh-TW`?bt(e):yt(e)),St=e=>`${e?.name} hit an error`,Ct=e=>`${e?.name} 發生錯誤`,wt=((e,t={})=>(t.locale??s())===`zh-TW`?Ct(e):St(e)),Tt=e=>`${e?.name} went idle`,Et=e=>`${e?.name} 轉為閒置`,Dt=((e,t={})=>(t.locale??s())===`zh-TW`?Et(e):Tt(e)),Ot=e=>`${e?.name} joined`,kt=e=>`${e?.name} 加入`,At=((e,t={})=>(t.locale??s())===`zh-TW`?kt(e):Ot(e)),jt=e=>`${e?.name} left`,Mt=e=>`${e?.name} 離開`,Nt=((e,t={})=>(t.locale??s())===`zh-TW`?Mt(e):jt(e)),Pt=e=>`${e?.name} lost its status`,Ft=e=>`${e?.name} 失去狀態`,It=((e,t={})=>(t.locale??s())===`zh-TW`?Ft(e):Pt(e)),Lt=e=>`${e?.name} is waiting on a question`,Rt=e=>`${e?.name} 正在等待回答`,zt=((e,t={})=>(t.locale??s())===`zh-TW`?Rt(e):Lt(e)),Bt=e=>`${e?.name} started working`,Vt=e=>`${e?.name} 開始工作`,Ht=((e,t={})=>(t.locale??s())===`zh-TW`?Vt(e):Bt(e)),Ut=((e={},t={})=>(t.locale??s())===`zh-TW`?`指揮中`:`commanding`),Wt=((e={},t={})=>(t.locale??s())===`zh-TW`?`已完成`:`finished`),Gt=((e={},t={})=>(t.locale??s())===`zh-TW`?`錯誤`:`error`),Kt=((e={},t={})=>(t.locale??s())===`zh-TW`?`閒置`:`idle`),qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無狀態`:`no status`),Jt=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待回答`:`waiting on a question`),Yt=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`working`),Xt=e=>`Monitor failed: ${e?.what}`,Zt=e=>`Monitor 出錯:${e?.what}`,Qt=((e,t={})=>(t.locale??s())===`zh-TW`?Zt(e):Xt(e)),$t=e=>`Monitor went quiet and stopped: ${e?.what}`,en=e=>`Monitor 太久沒輸出,已停止:${e?.what}`,tn=((e,t={})=>(t.locale??s())===`zh-TW`?en(e):$t(e)),nn=((e={},t={})=>(t.locale??s(),`Logs`)),rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`從未`:`never`),an=((e={},t={})=>(t.locale??s())===`zh-TW`?`+新基地`:`+ New base`),on=((e={},t={})=>(t.locale??s())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`無警示`:`no alerts`),v=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`尚無塔台`:`no tower yet`),ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`監看中`:`Watching a monitor`),un=((e={},t={})=>(t.locale??s())===`zh-TW`?`思考中`:`thinking`),dn=e=>`Finished ${e?.note}`,fn=e=>`完成了 ${e?.note}`,pn=((e,t={})=>(t.locale??s())===`zh-TW`?fn(e):dn(e)),mn=e=>`Failed ${e?.note}`,hn=e=>`出錯了 ${e?.note}`,gn=((e,t={})=>(t.locale??s())===`zh-TW`?hn(e):mn(e)),_n=e=>`Waiting on you ${e?.note}`,vn=e=>`等你回答 ${e?.note}`,yn=((e,t={})=>(t.locale??s())===`zh-TW`?vn(e):_n(e)),bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`+主智慧體`:`+ Main`),xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`+成員`:`+ Member`),Sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`Outposts`),Cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`手機`:`Phone`),wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),Tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`接回`:`Pop`),En=e=>`Pop ${e?.name}`,Dn=e=>`接回 ${e?.name}`,On=((e,t={})=>(t.locale??s())===`zh-TW`?Dn(e):En(e)),kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),An=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),y=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉`:`Quit`),jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉塔台`:`Quit tower`),Mn=e=>`Refused (${e?.status}).`,Nn=e=>`已拒絕(${e?.status})。`,b=((e,t={})=>(t.locale??s())===`zh-TW`?Nn(e):Mn(e)),Pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒`:`Remind`),Fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),In=((e={},t={})=>(t.locale??s())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),Ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已關`:`Reminders off`),Rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已開:分頁不在前景時,單位等你回答、完成或出錯會跳系統通知`:`Reminders on: while the page is in the background, a unit waiting on you, finishing, or failing raises a system notification`),zn=((e={},t={})=>(t.locale??s())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),Bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`主智慧體`:`main`),Vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`成員`:`member`),Hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`outpost`),Un=((e={},t={})=>(t.locale??s())===`zh-TW`?`未編入`:`unaligned`),Wn=((e={},t={})=>(t.locale??s(),`session`)),Gn=((e={},t={})=>(t.locale??s())===`zh-TW`?`子智慧體`:`subagent`),Kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`塔台`:`tower`),qn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效`:`Sound`),Jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已關`:`Sounds off`),Yn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已開`:`Sounds on`),Xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效:開關、音量與試聽`:`Sounds: on or off, volume, and a try`),Zn=((e={},t={})=>(t.locale??s())===`zh-TW`?`▶ 試聽`:`▶ Try`),Qn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音量`:`Volume`),$n=((e={},t={})=>(t.locale??s())===`zh-TW`?`收起`:`Stash`),er=e=>`Stash base ${e?.name}`,tr=e=>`收起基地 ${e?.name}`,nr=((e,t={})=>(t.locale??s())===`zh-TW`?tr(e):er(e)),rr=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.`,ir=e=>`要收起基地 ${e?.name} 嗎?塔台、主智慧體和成員會結束,之後可以用「接回」叫回來。有會遺失的東西時不會收。`,ar=((e,t={})=>(t.locale??s())===`zh-TW`?ir(e):rr(e)),or=e=>`Stashed (${e?.count})`,sr=e=>`已收起(${e?.count})`,cr=((e,t={})=>(t.locale??s())===`zh-TW`?sr(e):or(e)),lr=((e={},t={})=>(t.locale??s())===`zh-TW`?`智慧體`:`Agents`),ur=((e={},t={})=>(t.locale??s())===`zh-TW`?`基地`:`Bases`),dr=((e={},t={})=>(t.locale??s())===`zh-TW`?`指揮中`:`Commanding`),fr=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待中`:`Waiting`),pr=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`Working`),mr=((e={},t={})=>(t.locale??s())===`zh-TW`?`狀態`:`States`),hr=e=>`tab ${e?.label}`,gr=e=>`分頁 ${e?.label}`,_r=((e,t={})=>(t.locale??s())===`zh-TW`?gr(e):hr(e)),vr=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),yr=((e={},t={})=>(t.locale??s())===`zh-TW`?`網的總計`:`Net totals`),br=e=>`${e?.label} tower`,xr=e=>`${e?.label} 塔台`,Sr=((e,t={})=>(t.locale??s())===`zh-TW`?xr(e):br(e)),Cr=e=>`using ${e?.tool}`,wr=e=>`使用 ${e?.tool}`,Tr=((e,t={})=>(t.locale??s())===`zh-TW`?wr(e):Cr(e)),Er=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待變化…`:`Waiting for changes…`),Dr=`sb-locale`;function Or(e){let t=/^zh\b/i.test(e)&&(/-(hant|tw|hk|mo)\b/i.test(e)?`zh-TW`:/-(hans|cn|sg|my)\b/i.test(e)?`zh-CN`:void 0);return p(e)??(t?p(t):void 0)??p(e.split(`-`)[0])}function kr(e,t){return p(e)??t.map(Or).find(Boolean)??`en`}var Ar={brand_label:Ee,tagline:vr,totals_label:yr,stat_bases:ur,stat_agents:lr,stat_working:pr,stat_waiting:fr,stat_commanding:dr,mark_commanding:Ut,alerts:fe,no_alerts:sn,pair_button:Cn,pair_title:wn,link_connecting:ut,location:ht,all_bases:pe,documents:st,net_log:nn,states:mr,mark_working:Yt,mark_waiting:Jt,mark_idle:Kt,mark_done:Wt,mark_error:Gt,credit:$e,language:lt,waiting_changes:Er,new_base:an};Object.keys(Ar);function jr(){let e=null;try{e=localStorage.getItem(Dr)}catch{}let n=kr(e,navigator.languages??[navigator.language]);l(()=>n),document.documentElement.lang=n;let r={m:(e,t)=>e.textContent=t,mLabel:(e,t)=>e.setAttribute(`aria-label`,t),mTitle:(e,t)=>e.title=t,mEmpty:(e,t)=>e.dataset.empty=t};for(let e of document.querySelectorAll(`[data-m], [data-m-label], [data-m-title], [data-m-empty]`))for(let[t,n]of Object.entries(r))e.dataset[t]&&n(e,Ar[e.dataset[t]]?.()??e.dataset[t]);let i=document.getElementById(`lang`);i.replaceChildren(...t.map(e=>new Option(mt({},{locale:e}),e,!1,e===n))),i.onchange=()=>{try{localStorage.setItem(Dr,i.value),location.reload()}catch{i.value=n}}}var Mr={commanding:vt,working:Ht,waiting:zt,idle:Dt,done:xt,error:wt,unknown:It};function Nr(e){let t=new Map;for(let n of e.bases){n.tower&&t.set(`tower:${n.id}`,{name:Sr({label:n.label}),mark:n.tower.mark});for(let e of[...n.tower?.subs??[],...n.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))])t.set(e.id,{name:e.name,mark:e.mark});for(let e of n.outposts)t.set(e.id,{name:e.label,mark:e.mark})}return t}function Pr(e,t){if(!e)return[];let[n,r]=[Nr(e),Nr(t)],i=[];for(let[e,t]of r){let r=n.get(e);r?r.mark!==t.mark&&i.push({text:Mr[t.mark]({name:t.name}),mark:t.mark}):i.push({text:At({name:t.name}),mark:t.mark})}for(let[e,t]of n)r.has(e)||i.push({text:Nt({name:t.name}),mark:`idle`});return i}var Fr=e=>e.unit??e.key,x=e=>e.mark===`waiting`||e.pending?0:1;function Ir(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}`)}return n}function Lr(e,t){return[...t.values()].filter(t=>{let n=e?.get(t.key);return x(t)===0?!n||x(n)!==0||n.mark!==t.mark:e!==void 0&&n?.mark!==t.mark&&(t.mark===`error`||t.mark===`done`)})}var Rr=`input, textarea, select, [role=textbox], [role=combobox], [role=listbox], .term-scroll`,zr=`button, a, summary, [role=button], [role=link]`,Br=`.ask-opt, [role=radio], [role=checkbox]`,Vr=`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`;function Hr(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?.(Rr))){if(e.key===`f`||e.key===`F`)return`zoom`;if(e.key===` `&&!r?.closest?.(Br)&&(n||!r?.closest?.(zr)))return`next`}}function Ur(e,t=()=>document.querySelector(Vr)!==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=Hr(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 Wr=3e4,Gr=[`pointermove`,`pointerdown`,`keydown`,`wheel`,`touchstart`];function Kr(e=document.documentElement){if(matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=Date.now(),n,r=()=>{let i=t+Wr-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,Wr))};for(let e of Gr)addEventListener(e,i,{capture:!0,passive:!0});document.addEventListener(`visibilitychange`,()=>document.hidden||i()),i()}var qr=(...e)=>e.filter(e=>e!==!1&&e!=null),Jr=(e,t)=>(e.classList.add(t),e.classList.toggle(`flip`));function Yr(e,t,...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t??{}))r.setAttribute(e,n);return r.append(...qr(...n)),r}function Xr({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 Zr(e,t){if(t||!e.length)return[];let n=document.createElement(`style`);return n.textContent=e.map((e,t)=>`@keyframes pk${t}{${Xr(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 Qr=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),$r=function(e,t){return new URL(e,t).href},ei={},ti=function(e){return e.pathname.endsWith(`.css`)},ni=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},S=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=$r(t,n);let r=s(t),i=ti(r);return ni(ei,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`:Qr,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 C(e,t,n,r,i=!1){Object.assign(e.dataset,t),[e.hidden,e.textContent]=[i,n],r&&e.setAttribute(`aria-label`,r)}var ri=(e,t)=>t.role===`subagent`&&t.ended&&t.key?C(e,{close:`dismiss`,key:t.key,name:t.name,role:t.role},et(),ot({name:t.name})):C(e,{close:`unit`,key:t.key??``,name:t.name,role:t.role},y(),Ke({name:t.name}),!(t.control&&t.key)||t.role===`subagent`),ii=(e,t)=>C(e,{key:t?.key??``,name:t?.name??``,role:`tower`},jn(),void 0,!t?.control),ai=(e,t)=>C(e,{ws:t.id,name:t.label},y(),je({name:t.label})),oi=(e,t)=>C(e,{ws:t.id,name:t.label},$n(),nr({name:t.label})),si=(e,t,n)=>C(e,{ws:t.id,name:n.label,tab:n.id},y(),Le({name:n.label})),w=(e,t)=>new Promise(n=>{let r=document.createElement(`dialog`),i=document.createElement(`p`),a=document.createElement(`div`),o=(e,t,i)=>Object.assign(document.createElement(`button`),{type:`button`,className:t,textContent:e,onclick:()=>(r.close(),n(i))});[r.className,i.textContent,a.className]=[`sheet`,e,`sheet-row`],a.append(...t?[o(De(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(Oe(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()}),ci=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 li(e,t){let n=ci(t).length;e.hidden=!n,n&&(e.textContent=rt({count:n}))}function ui(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=cr({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`],C(r,{close:`pop`,name:e.name},Tn(),On({name:e.name})),t.append(n,r),t})))}function di(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 fi(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 S(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`dismiss`,r.close===`dismiss`?{key:r.key}:{all:!0})).then(e=>e.ok||w(e.body.reason??b({status:e.status})),()=>w(v()));if(r.close===`pop`)return void(n.toggleAttribute(`disabled`,!0),S(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/pop`,{name:r.name})).then(e=>e.ok||w(e.body.reason??b({status:e.status})),()=>w(v())).finally(()=>n.toggleAttribute(`disabled`,!1)));w((r.close===`stash`?ar:r.close===`base`?Pe:r.close===`tab`?Be:r.role===`tower`?Ue:Ye)({name:r.name??``}),r.close===`stash`?$n():y()).then(t=>{t&&(n.toggleAttribute(`disabled`,!0),S(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/${r.close===`base`?`all`:r.close}`,r.close===`unit`?{key:r.key}:{workspace:r.ws,...r.tab&&{tab:r.tab}})).then(t=>t.ok?di(r,e):w(t.body.reason??b({status:t.status})),()=>w(v())).finally(()=>n.toggleAttribute(`disabled`,!1)))})}})}var pi=e=>{try{return decodeURIComponent(e)}catch{return e}},T=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function E(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(pi);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 D=e=>e.view===`map`?``:e.view===`workspace`?`w/${T(e.ws)}`:`w/${T(e.ws)}/s/${T(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,mi=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},O=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null;function hi(e,t=new URL(document.baseURI).pathname){let n=()=>E(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>D(e)||`./`,go(n){let r=t+D(n);location.pathname+location.search!==r&&history.pushState(null,``,r),e(n)}};return addEventListener(`popstate`,()=>e(n())),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-route]`);!t||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),r.go(E(t.getAttribute(`data-route`))))}),r}var gi={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},k={commanding:Ut,working:Yt,waiting:Jt,idle:Kt,done:Wt,error:Gt,unknown:qt},_i={main:Bn,member:Vn,subagent:Gn,tower:Kn,outpost:Hn,outside:Un,session:Wn},vi={thinking:un,"watching a monitor":ln,idle:Kt,"waiting on a question":Jt,finished:Wt},yi={claude:`Claude`,codex:`Codex`},bi=e=>Object.hasOwn(_i,e)?_i[e]():e,xi=e=>e===`waiting`||e===`error`,A=e=>{let t=new DOMParser().parseFromString(e.trim(),`text/html`).body.firstElementChild;if(!(t instanceof HTMLElement))throw Error(`bad template`);return document.importNode(t,!0)},j=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},M=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},N=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&Jr(e,`flash`)},Si=e=>(t=>(e.slice(8,t)===`stale`?tn:Qt)({what:e.slice(t+1)}))(e.indexOf(`:`,8)),P=(e,t)=>e?e.startsWith(`tool:`)?Tr({tool:e.slice(5)}):e.startsWith(`monitor:`)?Si(e):Object.hasOwn(vi,e)?vi[e]():e:k[t](),Ci=(e,t,n,r,i=P(n,r))=>{M(e,t,i),e.querySelector(t).toggleAttribute(`data-monitoring`,i===P(n,r)&&n===`watching a monitor`)},wi=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,D(t)||`./`),e.setAttribute(`data-route`,D(t)))},Ti=(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`},Ei=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function Di(e,t,n,r){N(e,n);let i=e.querySelector(`use`),a=`#i-${gi[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 F(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 I=()=>A(`<div class="unit"><div class="card"><a class="hit"></a>${Ei}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><em class="agent"></em><span class="note"></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button></div><div class="subs"></div></div>`);function L(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);wi(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${P(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,xi(t.mark)),N(e,t.mark),Di(e.querySelector(`.plate`),t.role,t.mark,t.docs),M(e,`.name`,t.name),M(e,`.role`,bi(t.role)),M(e,`.agent`,t.agent?yi[t.agent]:``),Ci(e,`.note`,t.note,t.mark),ri(e.querySelector(`:scope > .card > .quit-btn`),t),F(e.querySelector(`.subs`),t.subs??[],I,L)}function Oi(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`?bn():xn())&&(e.textContent=r===`main`?bn():xn())}var ki=()=>A(`<section class="base"><header><div class="tower"><i class="sweep"></i><i class="pulse"></i><svg><use href="#i-tower"/></svg><b class="badge"></b></div><div class="title"><span class="crown"><svg><use href="#i-crown"/></svg>${ct()}</span><h2><a class="enter-base"></a></h2><p></p><button type="button" class="quit-btn tower-quit" data-close="unit" hidden></button></div><button type="button" class="quit-btn" data-close="base"></button></header><div class="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="${Sn()}"></div></section>`);function Ai(e,t){N(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),N(n,t.tower?.mark??`unknown`),M(e,`h2 a`,t.label),wi(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),M(e,`.title p`,t.tower?Qe({state:k[t.tower.mark]()}):cn()),Oi(e.querySelector(`.spawn-btns button`),t),ai(e.querySelector(`header > .quit-btn`),t),oi(e.querySelector(`.spawn-btns [data-close=stash]`),t),ii(e.querySelector(`.tower-quit`),t.tower),F(e.querySelector(`.tower-subs`),t.tower?.subs??[],I,L),F(e.querySelector(`.tabs`),t.tabs,()=>A(`<div class="tab"><h3><span></span><button type="button" class="tab-add"></button><button type="button" class="quit-btn" data-close="tab"></button></h3><div class="units"></div></div>`),(e,n)=>{M(e,`h3 span`,_r({label:n.label})),si(e.querySelector(`.quit-btn`),t,n),Oi(e.querySelector(`.tab-add`),t,n.id),F(e.querySelector(`.units`),n.units,I,L)}),F(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?on():void 0})),I,L)}function ji(e,t,n,r){let i=[...e.querySelectorAll(`.base:not(.leaving) .tower`)],a=e.querySelector(`.base.head:not(.leaving) .tower`),o=e.getBoundingClientRect(),s=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-o.x),Math.round(t.y+t.height/2-o.y)]},c=a?i.filter(e=>e!==a):[],l=c.map(e=>{let[[t,n],[r,i]]=[s(a),s(e)];return{x1:t,y1:n,x2:r,y2:i,mid:Math.round((t+r)/2)}}),u=l.map(({x1:e,y1:t,x2:n,y2:r,mid:i})=>`M${e} ${t}C${i} ${t} ${i} ${r} ${n} ${r}`),d=u.join(`|`);t.dataset.sig!==d&&(t.dataset.sig=d,t.replaceChildren(...u.map(e=>(t=>(t.setAttribute(`class`,`wire`),t.setAttribute(`d`,e),t))(document.createElementNS(`http://www.w3.org/2000/svg`,`path`)))),n.replaceChildren(...Zr(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??``)))}function Mi(){let[e,t,n,r,i]=[j(`map`,HTMLElement),j(`bases`,HTMLElement),j(`links`,SVGSVGElement),j(`packets`,HTMLElement),j(`log`,HTMLElement)],a=matchMedia(`(prefers-reduced-motion: reduce)`).matches,o=()=>!e.hidden&&ji(e,n,r,a);return new ResizeObserver(o).observe(e),Kr(),{layout:o,stats(e){let t=e.bases.flatMap(e=>[...e.tower?.subs??[],...e.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))]),n=e=>String(t.filter(t=>!e||t.mark===e).length);j(`s-commanding`,HTMLElement).parentElement.toggleAttribute(`data-on`,t.some(e=>e.mark===`commanding`));for(let[t,r]of[[`s-bases`,String(e.bases.length)],[`s-agents`,n()],[`s-working`,n(`working`)],[`s-commanding`,n(`commanding`)],[`s-waiting`,n(`waiting`)]])j(t,HTMLElement).textContent=r},show(e){F(t,e.bases,ki,Ai),requestAnimationFrame(o)},log(e){let t=new Date().toLocaleTimeString([],{hour12:!1});for(let n of e){let e=A(`<li><span></span><time></time></li>`);e.dataset.mark=n.mark,M(e,`span`,n.text),M(e,`time`,t),i.prepend(e)}for(;i.children.length>12;)i.lastElementChild.remove()},pause(e){document.documentElement.classList.toggle(`paused`,e)}}}var Ni=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,Pi=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,Fi={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:Pi,done:Ni},Ii=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,Li=(e,t)=>{try{return localStorage.getItem(e)??t}catch{return t}},Ri=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function zi(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=Li(`sb.remind`,`1`)===`1`,u=Li(`sb.sound`,`0`)===`1`,d=Math.min(100,Math.max(0,Number(Li(`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`?Rn():e===`denied`?In():Fn():Ln():zn(),r.dataset.state=u?`on`:`off`,r.setAttribute(`aria-label`,u?Yn():Jn()),a.checked=u,o.value=s.value=String(d),p&&(p.gain.value=(d/100)**2)};n.textContent=Pn(),r.textContent=qn(),r.title=Xn(),t(`sound-on-label`).textContent=qn(),t(`sound-vol-label`).textContent=Qn(),t(`sound-try`).textContent=Zn(),n.onclick=async()=>{l&&c&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):Ri(`sb.remind`,(l=!l)?`1`:`0`),h()},i.addEventListener(`toggle`,e=>e.newState===`open`&&Ti(i,r)),a.onchange=()=>{Ri(`sb.sound`,(u=a.checked)?`1`:`0`),h(),u&&g(`done`)},o.oninput=()=>(Ri(`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(Fi[e]).then(e=>e.arrayBuffer()).then(e=>t.decodeAudioData(e))),Promise.all([t.resume(),m.get(e)]).then(([,e])=>{let r=t.createBufferSource();r.buffer=e,r.connect(n),r.start()}).catch(()=>m.delete(e))}return h(),{signal(t){let n=t.flatMap(e=>(t=>t?[{a:e,k:t}]:[])(Ii(e)));if(n.length&&(u&&g([`waiting`,`error`,`done`].find(e=>n.some(t=>t.k===e))),l&&c&&Notification.permission===`granted`&&(document.hidden||!document.hasFocus())))for(let{a:t,k:r}of n){let n=new Notification(t.name,{body:{waiting:yn,error:gn,done:pn}[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 Bi=45e3,Vi=1e3,Hi=3e4,Ui=(e,t)=>Math.min(Hi,Vi*2**(e-1))*(.8+.4*t);function Wi(e){try{return JSON.parse(e)}catch{return}}function Gi(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(),Bi),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,Ui(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=Wi(r);i&&e.onNet(i),o({problem:i?void 0:kn()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:Wi(e)??An()}),l())}),r=e.setTimeout(()=>u(),Bi)};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()}}}jr();var R=Mi(),z=e=>document.getElementById(e),Ki=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):rn(),qi,Ji,B,V,Yi={state:`connecting`,attempt:0},H={view:`map`},Xi=!1,Zi,Qi=``,U,$i,W=e=>U?e(U):void $i?.then(e);function ea(){$i??=S(async()=>{let{mountFocus:e}=await import(`./views-TAiBW70j.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(U=e({data:ha,restart:()=>Z.restart(),openTile:na,embedTerminal:(e,t,n)=>new Promise(r=>K(i=>r(i.terminal.embed(e,t,n)))),online:()=>Yi.state===`live`}),U.show(H,H),B&&U.net(B),U))}var G,ta,K=e=>{if(G)return e(G);ta??=S(async()=>{let{mountPanels:e}=await import(`./layer-DoXq1bM1.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>G=e({label:e=>B?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(Y?Y.data(e).latest():ma(e,`?limit=12`))).items,post:e=>Y&&((t,n)=>Y.data(e).post(t,n)),stream:()=>Qi,showTerminal:(e,t)=>(G?.stack.close(),U?.terminal(t),X.go({view:`session`,ws:e,key:t}))})),ta.then(e)},na=(e,t)=>K(n=>n.tiles.open(e,t)),q=document.querySelector(`link[rel="icon"]`),J=q&&decodeURIComponent(q.href.slice(q.href.indexOf(`,`)+1)),ra=0;function ia(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;if(!q||!J||t===ra)return;ra=t;let n=`<circle cx='23' cy='9' r='9' fill='#ffd166' stroke='#0b1220' stroke-width='2'/><text x='23' y='13' text-anchor='middle' font-family='sans-serif' font-size='${t>9?9:12}' font-weight='700' fill='#06101e'>${t>9?`9+`:t}</text>`;q.href=`data:image/svg+xml,${encodeURIComponent(t?J.replace(`</svg>`,`${n}</svg>`):J)}`}var aa;function oa(e){B=V=e,ia(e);let t=Ir(e,Date.now());if(aa&&_a.signal(Lr(aa,t)),aa=t,document.hidden)return;R.stats(e),li(z(`dismiss-all`),e),ui(z(`stashed`),z(`stashed-list`),e),Q?.net(e);let n=Lr(Zi,t);(n.length||G)&&K(e=>e.alerts(n,t)),Zi=t,R.log(Pr(Ji,e)),Ji=e,W(t=>t.net(e)),H.view===`map`&&(R.show(e),qi=e,V=void 0)}function sa(e){let t=H,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;H=e,Q?.route(e),e.view!==`map`&&ea(),z(`map`).hidden=e.view!==`map`,z(`legend`).hidden=e.view===`session`,W(r=>r.show(e,t,n)),e.view===`map`&&B&&B!==qi&&(oa(B),requestAnimationFrame(R.layout)),Xi&&O(e)!==O(t)&&Z.restart()}function ca(e){Yi=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=z(`stage`).dataset.stale=String(t),z(`link`).dataset.state=e.state,z(`link-text`).textContent={connecting:ut,live:dt,reconnecting:pt,offline:ft}[e.state](),U&&B&&U.net(B),G?.stack.redraw();let n=z(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?ve({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?Te({attempt:e.attempt}):Se():xe({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=Ki(e.lastContact),n.replaceChildren(`${r} ${he()} `,i,me())}function la(e,t){try{let n=JSON.parse(t);W(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var ua=document.querySelector(`meta[name="sb-build"]`)?.content,da=e=>!!(ua&&ua!==JSON.parse(e).build);function fa(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 pa=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),ma=(e,t=``)=>pa(`history/${encodeURIComponent(e)}${t}`),Y=void 0,ha=e=>({older:t=>ma(e,`?before=${encodeURIComponent(t)}`),latest:()=>ma(e),entry:t=>pa(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),ga=()=>{let e=fa(O(H));return e.listen(`history`,e=>la(`history`,e)),e.listen(`cards`,e=>la(`cards`,e)),e.listen(`hello`,e=>da(e)?location.reload():(Qi=e,G?.terminal.hello())),e.listen(`mirror`,e=>G?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&E(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=Zi?.get(n.key);r&&(e.preventDefault(),K(e=>e.stack.show(r)))},!0);var X=hi(e=>sa(e)),_a=zi(e=>X.go({view:`session`,ws:e.ws,key:Fr(e)})),Z=Gi({open:ga,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:oa,onStatus:ca}),va=()=>Z.resume();document.addEventListener(`visibilitychange`,()=>{if(R.pause(document.hidden),document.hidden)return Z.hide();V&&oa(V),W(e=>e.wake()),va()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(e.preventDefault(),!G?.stack.close()&&H.view!==`map`&&X.go(mi(H)))}),Ur(e=>G?.hotkey(e)??!1),z(`pair`).hidden=location.hostname!==`127.0.0.1`,z(`pair`).addEventListener(`click`,()=>void S(async()=>{let{pairTile:e}=await import(`./pair-CcN3S1Eq.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>na(e(),!0)));var Q,$=matchMedia(`(pointer: coarse), (max-width: 640px)`),ya=()=>void S(async()=>{let{mountDrawer:e}=await import(`./drawer-CJrP6ufa.js`);return{mountDrawer:e}},[],import.meta.url).then(({mountDrawer:e})=>(Q??=e(),B&&Q.net(B),Q.route(H)));$.matches?ya():$.addEventListener(`change`,()=>$.matches&&!Q&&ya(),{once:!0}),fi({route:()=>H,net:()=>B,go:e=>X.go(e)}),z(`stashed-pop`).addEventListener(`toggle`,e=>e.newState===`open`&&Ti(z(`stashed-pop`),z(`stashed`))),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&S(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-CiRTnnnj.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,B?.bases??[]);r&&na(n(r,(e,t,n)=>(G?.tiles.close(n),X.go({view:`session`,ws:e,key:t}))),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&va());ca(Yi),sa(X.route()),Z.start(),Xi=!0;export{cn as A,pe as B,x as C,fr as D,pr as E,ct as F,st as I,Qe as L,sn as M,on as N,b as O,rn as P,Oe as R,Vr as S,_r as T,s as V,xi as _,wi as a,qr as b,P as c,A as d,N as f,M as g,F as h,Ei as i,v as j,Sn as k,Di as l,Ci as m,gi as n,Oi as o,bi as p,k as r,j as s,yi as t,Ti as u,S as v,Fr as w,Jr as x,Yr as y,De as z};
|