pi-straw-boss 0.26.2 → 0.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +38 -0
  2. package/README.zh-TW.md +38 -0
  3. package/dist/gui/assets/ask-C1mvQKbG.js +1 -0
  4. package/dist/gui/assets/chat-BECfofMv.js +2 -0
  5. package/dist/gui/assets/index-DI9km3B9.css +1 -0
  6. package/dist/gui/assets/index-gWx1_-3G.js +1 -0
  7. package/dist/gui/assets/layer-D1jSjgZJ.js +3 -0
  8. package/dist/gui/assets/lightbox-BfLxcOSU.js +1 -0
  9. package/dist/gui/assets/pair-CHVcdx5H.js +1 -0
  10. package/dist/gui/assets/spawn-DbHqsZJv.js +1 -0
  11. package/dist/gui/assets/views-JgP8ffyr.js +7 -0
  12. package/dist/gui/index.html +3 -2
  13. package/package.json +1 -1
  14. package/src/boss.ts +36 -0
  15. package/src/briefing.ts +33 -0
  16. package/src/closing.ts +23 -0
  17. package/src/dashboard.ts +108 -29
  18. package/src/election.ts +24 -0
  19. package/src/guard.ts +83 -0
  20. package/src/gui.ts +2 -91
  21. package/src/handover.ts +93 -0
  22. package/src/herdr.ts +39 -62
  23. package/src/host.ts +82 -0
  24. package/src/index.ts +37 -685
  25. package/src/membership.ts +115 -0
  26. package/src/net.ts +4 -4
  27. package/src/order.ts +3 -3
  28. package/src/presence.ts +57 -0
  29. package/src/reach.ts +96 -0
  30. package/src/session.ts +133 -0
  31. package/src/state.ts +106 -0
  32. package/src/tools.ts +77 -0
  33. package/src/tower.ts +44 -0
  34. package/src/towertab.ts +65 -0
  35. package/dist/gui/assets/ask-D1_QuXvf.js +0 -1
  36. package/dist/gui/assets/chat-DKFo83Ey.js +0 -2
  37. package/dist/gui/assets/dom-BaTXH9WU.js +0 -1
  38. package/dist/gui/assets/index-BQP3YgWb.js +0 -1
  39. package/dist/gui/assets/index-D4oTe33x.css +0 -1
  40. package/dist/gui/assets/layer-DS7hZlBy.js +0 -3
  41. package/dist/gui/assets/lightbox-BPldIRyA.js +0 -1
  42. package/dist/gui/assets/pair-F2FcMHbJ.js +0 -1
  43. package/dist/gui/assets/spawn-Bso_wUYV.js +0 -1
  44. package/dist/gui/assets/views-D7Y4KGK_.js +0 -8
package/README.md CHANGED
@@ -35,6 +35,7 @@ Run a few agents on the same project and they start stepping on each other: two
35
35
  - **Tidy tabs.** When a pi starts in a tab or quits out of it, the tab's panes are made equal again, so workers split off one by one don't leave a chain of halves.
36
36
  - **Stranded subagents are asked to report.** A subagent that stays open after finishing, while the pi that launched it was restarted and no longer receives its result, is asked once over intercom to send its final report there ([how it works](docs/how-it-works.md#orphaned-subagents)).
37
37
  - **A net view in Herdr's sidebar.** An optional plugin turns the Agents list into the net, towers first and each subagent under its launcher, on by default and switched by one key.
38
+ - **A reaper for leftover worktree panes.** A second optional plugin closes the panes agents leave behind in worktree workspaces, removes the clean checkouts, and keeps the workspaces you pin.
38
39
 
39
40
  ## Install
40
41
 
@@ -118,6 +119,43 @@ Run `herdr server reload-config` to load the key, and `herdr plugin unlink wayne
118
119
  `herdr plugin install wayne930242/pi-straw-boss/herdr-plugin` installs it from GitHub instead of a checkout.
119
120
  [How it works](docs/how-it-works.md#sidebar-net-view) has the tokens and a sidebar rows snippet that shows each member's role in Herdr's own view too.
120
121
 
122
+ ## Leftover worktree panes
123
+
124
+ A second optional Herdr plugin, in [`herdr-reaper/`](herdr-reaper), cleans up after agents that ran in worktree workspaces.
125
+ In a workspace whose worktree is a linked git worktree (whatever its name), it closes the pane of an agent that has exited once the pane's shell is idle, and never the focused pane.
126
+ Herdr then closes the tab and the workspace, and the plugin removes the workspace's checkout if `git status` is clean and nothing else is using it (no other pane works in it, no other workspace is open on it).
127
+ Git-ignored files (`.env`, `node_modules`, caches, local databases) do not make a checkout dirty, so they are deleted with it.
128
+ The branch always stays, and so does a dirty checkout, with the reason in the plugin log.
129
+ A checkout with a submodule is never removed (git refuses by design) and stays with git's reason in the log; if a removal fails partway and leaves files git no longer tracks, the log says "half-removed" and names the directory for you to delete.
130
+ Every other workspace is left alone.
131
+ It sweeps every 10 minutes and a minute after an agent exits, and the `reap-now` action sweeps at once.
132
+ Every close, removal, skip and pin is a line in the plugin log (`herdr plugin log list --plugin wayne930242.straw-boss-reaper`).
133
+
134
+ A pinned workspace is never reaped.
135
+ The `pin` action toggles the pin of the workspace it runs in, and a workspace you rename more than a minute after it appeared is pinned for you (pi-herdr-agents names its workspaces within seconds, which pins nothing); unpinning also renames it back.
136
+ The pin is the workspace token `$pin`, a Nerd Font pin glyph, which a Space row shows once you add it.
137
+ It needs Herdr 0.9.3 or newer, git and node 18 or newer.
138
+
139
+ ```bash
140
+ herdr plugin install wayne930242/pi-straw-boss/herdr-reaper
141
+ ```
142
+
143
+ ```toml
144
+ [[keys.command]]
145
+ key = "prefix+P"
146
+ type = "plugin_action"
147
+ command = "wayne930242.straw-boss-reaper.pin"
148
+ description = "pin or unpin the workspace"
149
+
150
+ [ui.sidebar.spaces]
151
+ rows = [["state_icon", "workspace", { token = "$pin" }], ["branch", "git_status"]]
152
+ ```
153
+
154
+ `herdr plugin link /path/to/pi-straw-boss/herdr-reaper` links a checkout instead, and `herdr plugin unlink wayne930242.straw-boss-reaper` removes the plugin.
155
+ The plugin starts reaping as soon as it is installed or linked, with no trial run and no confirmation: its first sweep treats every idle, agent-less pane in a linked-worktree workspace as one whose agent exited, about a minute and a half after the first hook runs.
156
+ Run `bash herdr-reaper/run.sh reaper.mjs dry-run` first to see what it would do, and pin the workspaces you want to keep (the pin action works once the plugin is linked, and a `config.json` with `only_under` can be put in the plugin's config directory before that).
157
+ [How it works](docs/how-it-works.md#worktree-reaper) has the rules and the limits.
158
+
121
159
  ## Learn more
122
160
 
123
161
  [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 agents can find a tower.
package/README.zh-TW.md CHANGED
@@ -35,6 +35,7 @@
35
35
  - **分頁保持整齊。** pi 在分頁裡啟動或結束時,分頁裡的 pane 會重新平均分配,一個一個切出來的 worker 就不會留下一長串對半切的窄 pane。
36
36
  - **斷線的子智慧體會被提醒回報。** 子智慧體做完後還開著,但開出它的 pi 已經重開、收不到它的結果時,它會收到一則 intercom,請它把最終報告送回去,只會送一次([運作方式](docs/how-it-works.md#orphaned-subagents))。
37
37
  - **Herdr 側邊欄的網路檢視。** 一個選用的 plugin 會把 Agents 清單排成網的樣子:塔台在前,每個子智慧體排在開出它的人底下。預設開啟,按一個鍵就能切換。
38
+ - **清理閒置的 worktree pane。** 另一個選用的 plugin 會關掉智慧體在 worktree 工作區留下的 pane,移除乾淨的 checkout,並保留你釘選的工作區。
38
39
 
39
40
  ## 安裝
40
41
 
@@ -117,6 +118,43 @@ description = "toggle the straw net view"
117
118
  也可以不用原始碼,改用 `herdr plugin install wayne930242/pi-straw-boss/herdr-plugin` 從 GitHub 安裝。
118
119
  [運作方式](docs/how-it-works.md#sidebar-net-view)列出了所有標記,也有一段側邊欄列設定,讓 Herdr 原本的檢視也能顯示每個成員的角色。
119
120
 
121
+ ## 閒置的 worktree pane
122
+
123
+ 另一個選用的 Herdr plugin 放在 [`herdr-reaper/`](herdr-reaper),專門清理 worktree 工作區裡智慧體跑完留下的東西。
124
+ 只處理 worktree 是 linked git worktree 的工作區(不管它叫什麼名字):智慧體結束、pane 的 shell 閒置之後,就關掉這個 pane,但絕不關掉有焦點的 pane。
125
+ Herdr 接著會關掉分頁和工作區,plugin 再在 `git status` 乾淨、而且沒有別的東西還在用它(沒有別的 pane 在裡面工作,也沒有別的工作區開在同一個 checkout)時移除這個工作區的 checkout。
126
+ git 忽略的檔案(`.env`、`node_modules`、快取、本機資料庫)不算變更,所以會跟著 checkout 一起被刪掉。
127
+ 分支一律保留;有未提交變更的 checkout 也留著,原因寫在 plugin 日誌裡。
128
+ 含 submodule 的 checkout 不會被移除(git 設計上就拒絕),會連同 git 給的原因留在日誌裡;若移除做到一半失敗、留下 git 已不再追蹤的檔案,日誌會寫「half-removed」並指出該目錄,由你自己刪除。
129
+ 其他工作區完全不動。
130
+ 它每 10 分鐘掃一次,智慧體結束後約一分鐘也會掃,`reap-now` 動作則立刻掃。
131
+ 每一次關閉、移除、略過和釘選,都是 plugin 日誌(`herdr plugin log list --plugin wayne930242.straw-boss-reaper`)裡的一行。
132
+
133
+ 釘選的工作區永遠不會被清理。
134
+ `pin` 動作會切換它所在工作區的釘選;工作區出現一分鐘後才被你改名的話,會自動釘選(pi-herdr-agents 在幾秒內替工作區命名,不會觸發釘選),取消釘選時也會改回原名。
135
+ 釘選是工作區的 token `$pin`,內容是 Nerd Font 的圖釘字形,要加進 Space 的列設定才看得到。
136
+ 需要 Herdr 0.9.3 以上、git 和 node 18 以上。
137
+
138
+ ```bash
139
+ herdr plugin install wayne930242/pi-straw-boss/herdr-reaper
140
+ ```
141
+
142
+ ```toml
143
+ [[keys.command]]
144
+ key = "prefix+P"
145
+ type = "plugin_action"
146
+ command = "wayne930242.straw-boss-reaper.pin"
147
+ description = "pin or unpin the workspace"
148
+
149
+ [ui.sidebar.spaces]
150
+ rows = [["state_icon", "workspace", { token = "$pin" }], ["branch", "git_status"]]
151
+ ```
152
+
153
+ 也可以用 `herdr plugin link /path/to/pi-straw-boss/herdr-reaper` 連結原始碼,用 `herdr plugin unlink wayne930242.straw-boss-reaper` 移除。
154
+ plugin 一安裝或連結就開始清理,沒有試跑,也不會先問:第一次掃描會把 linked-worktree 工作區裡所有沒有智慧體、shell 閒置的 pane 都當成智慧體已結束,大約在第一個 hook 執行後一分半鐘。
155
+ 請先執行 `bash herdr-reaper/run.sh reaper.mjs dry-run` 看它會做什麼,並釘選想保留的工作區(plugin 連結後 `pin` 動作才能用;也可以在連結之前,先在 plugin 的設定目錄放一個帶 `only_under` 的 `config.json`)。
156
+ [運作方式](docs/how-it-works.md#worktree-reaper)(英文)有規則和限制。
157
+
120
158
  ## 延伸閱讀
121
159
 
122
160
  [運作方式](docs/how-it-works.md)(英文)說明角色、塔台、儀表板、瀏覽器畫面、這個擴充套件會寫入什麼,以及 Claude Code 或 Codex 的智慧體怎麼找到塔台。
@@ -0,0 +1 @@
1
+ import{C as e,F as t,_ as n}from"./index-gWx1_-3G.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`);function m(e,t,n,r){if(typeof t!=`string`||n!==void 0&&!r)return new e(t,n);let i=m;if(n!==void 0){let r=i.prototypeKeys??=new Set([`constructor`,`__defineGetter__`,`__defineSetter__`,`hasOwnProperty`,`__lookupGetter__`,`__lookupSetter__`,`isPrototypeOf`,`propertyIsEnumerable`,`toString`,`valueOf`,`__proto__`,`toLocaleString`]);if(Object.getOwnPropertyNames(Object.prototype).some(e=>!r.has(e)))return new e(t,n)}let a=[];for(let r of Object.keys(n??{}).sort()){let i=n[r];if(i!==void 0){if(i!==null&&![`string`,`number`,`boolean`].includes(typeof i)||typeof i==`number`&&!Number.isFinite(i))return new e(t,n);a.push([r,i])}}let o=JSON.stringify([t,a]),s=i.caches??=new WeakMap,c=s.get(e);if(c||(c=new Map,s.set(e,c)),c.has(o))return c.get(o);let l=new e(t,n);if(c.size>=256){let e=c.keys().next().value;e!==void 0&&c.delete(e)}return c.set(o,l),l}function h(e,t,n,r=!1){return m(Intl.PluralRules,e,n,r).select(Number(t)-Number(n?.offset??0))}var g=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),_=((e={},n={})=>(n.locale??t())===`zh-TW`?`未確認。請查看終端機。`:`Not confirmed. Check the terminal.`),v=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註`:`Note`),y=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註(選填)`:`Note (optional)`),b=((e={},n={})=>(n.locale??t())===`zh-TW`?`選項`:`Options`),x=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),S=((e={},n={})=>(n.locale??t())===`zh-TW`?`你的答案`:`Your own answer`),C=((e={},n={})=>(n.locale??t())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),w=((e={},n={})=>(n.locale??t())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),T=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),E=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),D=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),O=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出答案`:`Send answer`),k=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出中…`:`Sending…`),A=((e={},n={})=>(n.locale??t())===`zh-TW`?`顯示終端機`:`Show terminal`),j=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),M=((e={},n={})=>(n.locale??t())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),N=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),P=((e={},n={})=>(n.locale??t())===`zh-TW`?`連不上伺服器。`:`The server could not be reached.`),F=((e={},n={})=>(n.locale??t())===`zh-TW`?`它在等待對話框。`:`It waits on a dialog.`),I=e=>e.multiple?c():e.freeform&&e.options.length?s():``,L=(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":b()},...e.options.map(e=>n(`li`,{class:`ask-opt`},n(`b`,null,e.title),e.description&&n(`small`,null,e.description)))),t&&I(e)&&n(`small`,{class:`ask-how`},I(e))),R=e=>e.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f]/g,`�`),z=(e,t)=>(e.select?.choices??[]).map((e,t)=>({...e,i:t})).filter(e=>!(t&&e.localOnly)),B=(e,t,n)=>({...e.size?{choices:[...e].sort((e,t)=>e-t)}:{},...t.trim()?{text:t}:{},...n.trim()?{note:n}:{}}),V=(e,t,n)=>({dialog:e.dialog,digest:e.digest,answerId:n,...t}),H={digest:w,"not-allowed":E,malformed:T};function U(t){let{outcome:n,reason:i,by:a}=t.body;return n===`accepted`?[`ok`,o()]:n===`stale`?[`error`,a===`local`?N():a===`cancel`?j():M()]:n===`rejected`?[`error`,(Object.hasOwn(H,String(i))?H[String(i)]:D)()]:n===`busy`?[`error`,r()]:n===`unknown`||t.status===504?[`error`,_(),!0]:[`error`,i??e({status:t.status})]}var W=e=>[`accepted`,`stale`,`busy`,`unknown`].includes(String(e.body.outcome))||e.status===504,G=e=>e.answer?`d\n${e.answer.dialog}\n${e.answer.digest}`:`c\n${e.callId}\n${e.why??``}`;function K(e,t,r=location.hostname!==`127.0.0.1`,o){let s,c,m,h=!1,w=!1,T;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>c&&!c.el.contains(e.target)&&(c.lost=void 0));let E=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),D=()=>{if(!c)return;let e=document.activeElement;e&&e!==document.body&&e!==c.lost&&(c.lost=void 0),c.controls.forEach(e=>e.disabled=!h||w||c.done),c.send&&(c.send.disabled=!h||w||c.done||!c.pick()),e&&c.el.contains(e)&&e.disabled&&(c.lost=e);let t=c.lost;t&&!t.disabled&&c.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),c.lost=void 0)};async function j(e,r){[e.sending,w,e.spell]=[!0,!0,!1],D(),E(e.note,``,k());let i=await t(`answer`,r).catch(()=>void 0),a=n(`button`,{type:`button`,class:`cmp-link`},l());a.onclick=()=>void j(e,r);let[o,s,c]=i?U(i):[`error`,_(),!0];[e.done,e.sending,w,e.busy]=[!i||W(i),!1,!1,i?.body.outcome===`busy`],E(e.note,o,s,...c?[a]:[]),D(),e.note.scrollIntoView?.({block:`nearest`})}let M=(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 N(e,t){let i,a=z(t,r).map(e=>M(`radio`,e.label,[e.note],()=>(i=e.i,a.forEach((n,i)=>n.setAttribute(`aria-checked`,String(z(t,r)[i].i===e.i))),D()),e.i+1)),o=t.select?.copy!==void 0&&n(`button`,{type:`button`,class:`cmp-link`},p());return o&&(o.disabled=!navigator.clipboard,o.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>E(e.note,`ok`,f()),()=>E(e.note,`error`,d()))),e.pick=()=>i===void 0?void 0:{choice:i},e.controls=a,[n(`pre`,{class:`ask-title`},R(t.select.title)),n(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":u()},...a),n(`div`,{class:`ask-acts`},e.send,o)]}function P(e,t){let r=t.questions.map(()=>({picks:new Set,text:n(`input`,{type:`text`,maxlength:`8192`,class:`ask-own`,placeholder:C(),"aria-label":S()}),note:n(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:y(),"aria-label":v()})})),i=t.questions.map((t,i)=>{let a=r[i],o=t.multiple?`checkbox`:`radio`,s=t.options.map((e,n)=>M(o,e.title,[e.description,e.preview&&g()],()=>{t.multiple||(a.picks.clear(),a.text.value=``),a.picks.has(n)?a.picks.delete(n):a.picks.add(n),s.forEach((e,t)=>e.setAttribute(`aria-checked`,String(a.picks.has(t)))),D()}));return a.text.oninput=()=>(t.multiple||(a.picks.clear(),s.forEach(e=>e.setAttribute(`aria-checked`,`false`))),D()),e.controls.push(...s,a.text,a.note),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":b()},...s),a.text,a.note)});return e.pick=()=>r.every(e=>e.picks.size||e.text.value.trim())?{answers:r.map(e=>B(e.picks,e.text.value,e.note.value))}:void 0,[...i,n(`div`,{class:`ask-acts`},e.send)]}function H(e){let t=e.asks??(e.ask?[e.ask]:[]),r=t.length>1,s=e.answer,c={key:G(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};s&&((c.send=n(`button`,{type:`button`,class:`ask-send`},O())).onclick=()=>void(c.pick()&&j(c,V(s,c.pick(),crypto.randomUUID()))));let l=n(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${r?a():i()} ${r||!t[0]?``:I(t[0])}`.trim()),u=o&&e.tool!==`secret_drop`&&n(`button`,{type:`button`,class:`cmp-link`},A());return u&&(u.onclick=o),c.el.append(...s?s.select?N(c,s):P(c,s):[...t.length?t.map(e=>L(e,r)):[n(`p`,{class:`ask-why`},e.why??F())],n(`div`,{class:`ask-acts`},l,u)],c.note),c}let K=(t,n)=>{let r=document.activeElement;c&&c!==n&&(c.focus=c.el.contains(r)?r:void 0),[s,c,m]=[t,n,n?.send?n:m],e.replaceChildren(...n?[n.el]:[]),D(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{update(e,t){h=t,e&&(T=void clearTimeout(T)),!e&&(c?.done||c?.sending)?T??=setTimeout(()=>(T=void 0,K()),6e3):e?c&&(G(e)===c.key||!e.answer&&(c.done||c.sending)&&e.callId===s?.callId)?((c.busy||c.sending)&&!e.answer?c.spell=!0:c.busy&&c.spell&&e.answer&&([c.done,c.busy]=[!1,!1],E(c.note,``,x())),s=e):K(e,m?.key===G(e)&&!m.done?m:H(e)):K(),D()}}}export{h as i,P as n,k as r,K as t};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-DI9km3B9.css"])))=>i.map(i=>d[i]);
2
+ import{F as e,_ as t,g as n,t as r,u as i,v as a}from"./index-gWx1_-3G.js";import{n as o,t as s}from"./views-JgP8ffyr.js";var c=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),u=e=>`context compacted · ${e?.tokens} tokens summarized`,d=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,f=((t,n={})=>(n.locale??e())===`zh-TW`?d(t):u(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,te=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),h=e=>`Image ${e?.n}`,g=e=>`圖片 ${e?.n}`,_=((t,n={})=>(n.locale??e())===`zh-TW`?g(t):h(t)),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),y=e=>`${e?.count} image(s)`,b=e=>`${e?.count} 張圖片`,ne=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),re=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),S=e=>`${e?.count} new`,C=e=>`${e?.count} 則新訊息`,w=((t,n={})=>(n.locale??e())===`zh-TW`?C(t):S(t)),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),N=e=>`Open image ${e?.n}`,P=e=>`打開圖片 ${e?.n}`,oe=((t,n={})=>(n.locale??e())===`zh-TW`?P(t):N(t)),F=e=>`show all (${e?.size})`,I=e=>`顯示全部(${e?.size})`,L=((t,n={})=>(n.locale??e())===`zh-TW`?I(t):F(t)),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),z=e=>`◇ thought · ${e?.count} chars`,B=e=>`◇ 思考 · ${e?.count} 字元`,se=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function ue(){let e=!0,t=0;return{get pinned(){return e},scrolled(n){e=n,n&&(t=0)},hold:()=>void(e=!1),arrived(n){return e||(t+=n),e},jump:()=>void(e=!0,t=0),button:n=>e&&!n?void 0:t&&!n?w({count:t}):x()}}async function de(e,t,n,r){let i=()=>e.items.some(e=>e.id===n);for(;!i()&&e.before;)r(e.prepend(await t.older(e.before)));return i()?!0:(r(e.reset(await t.latest())),!1)}function fe(e=600){let t=[],n,r=!1,i=new Set,a=new Map,o=new Map,s=e=>e.forEach(e=>(i.delete(e.id),e.tools?.forEach(e=>(o.delete(e.id),a.delete(e.id)))));function c(e,t){let n=[];for(let r of e)i.has(r.id)||(i.add(r.id),r.kind===`result`&&r.callId?(a.set(r.callId,r),o.has(r.callId)&&t.add(o.get(r.callId))):(r.tools?.forEach(e=>o.set(e.id,r.id)),n.push(r)));return n}let l=e=>({rebuild:!1,added:[],touched:[],dropped:[],front:!1,...e});return{get items(){return t},get before(){return n},get detached(){return r},result:e=>a.get(e),reset(e){return[t,n,r]=[[],e.before,!1],i.clear(),a.clear(),o.clear(),t=c(e.items,new Set),l({rebuild:!0,added:t})},append(i){if(r)return l({});let a=new Set,o=c(i,a);t.push(...o);let u=t.length>e?t.splice(0,t.length-e):[];return s(u),u.length&&(n=t[0].id),l({added:o,touched:[...a],dropped:u.map(e=>e.id)})},prepend(i){let a=new Set,o=c(i.items,a);t.unshift(...o),n=i.before;let u=t.length>e?t.splice(e):[];return s(u),u.length&&(r=!0),l({added:o,touched:[...a],dropped:u.map(e=>e.id),front:!0})}}}var pe=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,me=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,he={intercom_message:D,subagent_result:j,subagent_ping:A,subagent_status:M,"pi-loop-monitor":k,"memory-context":O,"doc-review":E},H=e=>{let t=i(`<span class="ava"><svg><use/></svg></span>`);return t.querySelector(`use`).setAttribute(`href`,`#i-${r[e]??e}`),t};function ge(e){let n=[],r=0;for(let i of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))n.push(e.slice(r,i.index),t(`a`,{href:i[0],rel:`noopener noreferrer`,target:`_blank`},i[0])),r=i.index+i[0].length;return[...n,e.slice(r)]}function U(e,r,{who:i,link:u,docFor:d}){let p=fe(),m=new Map,h=new Set,g=()=>h.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>d?.(e))):e.shown&&h.delete(e)),y=t(`div`,{class:`chat-list`}),b=t(`div`,{class:`chat-top`}),x=t(`div`,{class:`chat-live`}),S=t(`div`,{class:`chat-end`}),C=t(`button`,{class:`chat-pill`,type:`button`,hidden:``}),w=t(`p`,{class:`chat-empty`},T()),E=t(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":l()},b,y,x,S);e.replaceChildren(E,C);let D=ue(),O=!1,k=!1,A,j,M=0,N=!1,P,F=()=>N||P!==void 0,I=()=>(clearTimeout(P),P=setTimeout(()=>(P=void 0,D.pinned&&!p.detached&&B()),250)),z=(e=D.button(p.detached))=>(C.hidden=!e,C.textContent=e??``),B=()=>(D.jump(),j=void 0,E.scrollTop=E.scrollHeight,z());async function U(e){O=!0;let t=await de(p,r,e,e=>(J(e),Y(e))).finally(()=>O=!1),n=m.get(e);if(A===e){if(!t||!n)return B();D.hold(),j=n,n.scrollIntoView({block:`center`}),a(n,`lit`),clearTimeout(M),M=window.setTimeout(()=>(j=void 0,n.classList.remove(`lit`)),2e3),z()}}let W=()=>A?void U(A):B(),G=(e,t,n,i)=>{e.disabled=!0,r.entry(n).then(n=>{let r=n&&i(n);if(r===void 0)return void(e.textContent=V());t.textContent=r,e.remove()},()=>e.textContent=V())};function K(e,i=0){if(!i||!r.pic)return null;let a=Array.from({length:i},(t,n)=>r.pic(e,n));return t(`div`,{class:`pics`},...a.map((e,r)=>{let i=t(`img`,{src:e,alt:_({n:r+1}),loading:`lazy`,decoding:`async`}),o=t(`button`,{type:`button`,class:`pic`,"aria-label":oe({n:r+1})},i);return i.addEventListener(`error`,()=>o.replaceWith(t(`em`,{class:`pic-gone`},v()))),o.addEventListener(`click`,()=>void n(async()=>{let{lightbox:e}=await import(`./lightbox-BfLxcOSU.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,r))),o}))}function _e(e,n){let r=p.result(e.id),i=t(`pre`,{class:`out`},r?.text??``),a=t(`pre`,{class:`args`},e.args??``),o=e.cut?t(`button`,{class:`more`,type:`button`},R()):null;o?.addEventListener(`click`,()=>G(o,a,n,t=>(e=>e&&`${e.args??``}${e.cut?`\n${ee()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=r?.more?t(`button`,{class:`more`,type:`button`},L({size:me(r.bytes??0)})):null;s?.addEventListener(`click`,()=>G(s,i,r.id,e=>e.text));let c=e.name===`show_doc`&&d?t(`button`,{class:`more open`,type:`button`,hidden:``},ae()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>d?.(e)?.()))),c&&h.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(g);let l=t(`details`,{class:`act`},t(`summary`,{"data-mark":r?r.isError?`error`:`done`:`working`},t(`b`,{class:`badge`}),t(`code`,null,e.name),t(`span`,{class:`sum`},e.summary),c),a,o,r&&t(`div`,{class:`result`},r.images?t(`em`,null,ne({count:r.images})):null,i,s)),u=r&&K(r.id,r.images);return u?[l,u]:[l]}function q(e){let n=t(`time`,null,pe(e.at));switch(e.kind){case`user`:return t(`article`,{class:`tx you`},t(`header`,null,n,t(`b`,null,le()),H(`user`)),t(`div`,{class:`bubble`},...ge(e.text??``),K(e.id,e.images)));case`assistant`:{let r=i(),a=t(`pre`,{class:`thought-text`}),c=e.thought?t(`button`,{class:`thought`,type:`button`},e.thought<0?ce():se({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>G(c,a,e.id,e=>e.thoughtText)),t(`article`,{class:`tx in`},H(r.role),t(`div`,{class:`tx-body`},t(`header`,null,t(`b`,null,r.name),e.model?t(`span`,null,e.model):null,n,e.stop?t(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,a,e.text?t(`div`,{class:`md`},s(o(e.text))):null,e.error?t(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>_e(t,e.id))))}case`bash`:return t(`article`,{class:`tx sys`},t(`details`,{class:`act`},t(`summary`,{"data-mark":e.exit?`error`:`done`},t(`b`,{class:`badge`}),t(`code`,null,`shell`),t(`span`,{class:`sum`},`! ${e.command}`),e.exit?t(`span`,{class:`stop`,"data-mark":`error`},te({code:e.exit})):null),e.text?t(`pre`,{class:`out`},e.text):null));case`notice`:return t(`article`,{class:`tx sys`},t(`details`,{class:`notice`},t(`summary`,null,H(`comms`),t(`em`,null,re()),he[e.type??``]?.()??e.type??ie(),` `,e.from&&u(e.from)||(e.from??``),n),t(`pre`,null,e.text??``)));case`divider`:return t(`article`,{class:`tx rule`},t(`details`,null,t(`summary`,null,e.type===`compaction`?f({tokens:(e.tokens??0).toLocaleString()}):c()),t(`pre`,null,e.text??``)));default:return t(`article`,{class:`tx note`},e.text??``,` `,n)}}function J(e){e.rebuild&&(m.clear(),y.replaceChildren());for(let t of e.dropped)m.get(t)?.remove(),m.delete(t);let t=e.added.map(e=>(m.set(e.id,q(e)),m.get(e.id)));e.front?y.prepend(...t):y.append(...t),k&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),w.remove(),p.items.length||y.append(w),b.hidden=!p.before}let Y=e=>e.touched.forEach(e=>{let t=m.get(e),n=p.items.find(t=>t.id===e);if(t&&n){let r=q(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),m.set(e,r)}}),X=async()=>{if(!O&&p.before&&k){O=!0;try{let e=E.scrollHeight,t=p.prepend(await r.older(p.before));J(t),Y(t),E.scrollTop+=E.scrollHeight-e}finally{O=!1}p.before&&E.clientHeight&&b.getBoundingClientRect().bottom>=E.getBoundingClientRect().top&&X()}};C.addEventListener(`click`,()=>{A=void 0,p.detached?r.latest().then(e=>(J(p.reset(e)),B())):B()});let Z=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void X(),{root:E}),new IntersectionObserver(e=>E.clientHeight&&(D.scrolled(e.at(-1).isIntersecting),z()),{root:E,rootMargin:`0px 0px 67px`})],Q,ve=()=>(Q??(Z[0].observe(b),Z[1].observe(S)),clearTimeout(Q),Q=setTimeout(()=>(Q=void 0,Z.forEach(e=>e.disconnect())),600));E.addEventListener(`scroll`,()=>(ve(),!N&&P!==void 0&&I()),{passive:!0}),E.addEventListener(`touchstart`,()=>(N=!0,clearTimeout(P),P=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])E.addEventListener(e,()=>(N=!1,I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])E.addEventListener(e,()=>j=A=void 0,{passive:!0});let $=new ResizeObserver(()=>F()?void 0:D.pinned&&!p.detached?E.scrollTop=E.scrollHeight:j?.scrollIntoView({block:`center`}));return $.observe(y),$.observe(E),{log:E,docs:g,apply(e){if(e.reset)J(p.reset({items:e.items??[],before:e.before})),k=!0,W();else if(e.items?.length){let t=p.append(e.items);J(t),Y(t),D.arrived(t.added.length)&&!p.detached&&!F()?B():z()}},reveal(e){A=e,k&&W()},setLive(e,n){x.dataset.mark=n,x.lastChild?.textContent!==e&&x.replaceChildren(...e?[t(`b`,{class:`badge`}),t(`span`,null,e)]:[])}}}export{U as mountChat,_ as t};
@@ -0,0 +1 @@
1
+ :root{--bg:#060a14;--panel:#0e1628e0;--line:#7a98e033;--text:#dbe6ff;--dim:#8b99ba;--gold:#ffd166;--grid:linear-gradient(#82a0ff0d 1px, transparent 1px) 0 0 / 44px 44px, linear-gradient(90deg, #82a0ff0d 1px, transparent 1px) 0 0 / 44px 44px;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--sans:ui-rounded, "Avenir Next", "Trebuchet MS", system-ui, -apple-system, "Segoe UI", sans-serif}*{box-sizing:border-box;margin:0}html{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}body{min-height:100vh;color:var(--text);font:14px/1.4 var(--sans);background:radial-gradient(1100px 640px at 12% -10%, #38e0ff1c, transparent 62%), radial-gradient(900px 600px at 98% 8%, #966eff1c, transparent 60%), linear-gradient(var(--bg), #0a1020);background-attachment:fixed}svg{display:block}[data-mark=working]{--c:#38e0ff}[data-mark=waiting]{--c:#ffb02e}[data-mark=idle]{--c:#7184ad}[data-mark=done]{--c:#3ddc97}[data-mark=error]{--c:#ff5470}[data-mark=unknown]{--c:#4f5c7c}[data-mark]{--c1:color-mix(in srgb, var(--c) 13%, transparent);--c4:color-mix(in srgb, var(--c) 45%, transparent)}:focus-visible{outline-offset:2px;outline:2px solid #38e0ff}.shell{max-width:1480px;margin:0 auto;padding:18px 22px 40px}.hud{border:1px solid var(--line);background:var(--panel);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:5;border-radius:18px;flex-wrap:wrap;align-items:center;gap:10px 24px;padding:12px 18px;display:flex;position:sticky;top:12px}.brand{align-items:center;gap:12px;margin-right:auto;display:flex}.logo{color:#38e0ff;border:1px solid var(--line);background:radial-gradient(circle at 30% 25%,#38e0ff4d,#0a1020e6);border-radius:14px;place-items:center;width:44px;height:44px;display:grid}.logo svg{filter:drop-shadow(0 0 6px #38e0ff);width:28px;height:28px}.brand h1{letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;font-size:20px}@media (width<=1600px){.hud{column-gap:10px;padding:12px 14px}.brand{margin-right:auto}.stats{gap:6px}.stats div{min-width:58px;padding:6px 8px}.alerts{width:190px}.hud .pair-btn{padding:6px 10px}}.brand p{color:var(--dim);font-size:12px}.stats{gap:10px;display:flex}.stats div,.tally div,.alerts{background:#ffffff0a;border:1px solid #ffffff0f;border-radius:12px;min-width:78px;padding:6px 12px}.stats dt,.tally dt{color:var(--dim);letter-spacing:.08em;text-transform:uppercase;font-size:11px}.stats dd,.tally dd{font:600 20px/1.1 var(--mono)}.stats [data-mark] dd,.tally [data-mark] dd,.count b{color:var(--c)}.pair-btn{border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);letter-spacing:.08em;text-transform:uppercase;cursor:pointer;background:0 0;border-radius:12px;padding:6px 12px}.tog{align-items:center;gap:6px;display:inline-flex}.tog:before{content:"";background:var(--line);border-radius:50%;flex:none;width:7px;height:7px}.tog[data-state=on]{color:#cfe6ff;border-color:#2c5b74}.tog[data-state=on]:before{background:#38e0ff;box-shadow:0 0 6px #38e0ff}.tog[data-state=ask]:before{background:#ffd166}.tog[data-state=blocked]:before{background:#ff6b81}.tog[data-state=done]{color:#cfe6ff}.tog[data-state=done]:before{background:#7ee2a8;box-shadow:0 0 6px #7ee2a8}.alert-row{align-items:center;gap:10px;display:flex}.done-btn{white-space:nowrap;flex:none}.hud-pop{border:1px solid var(--line);color:var(--text);font:13px/1.4 var(--sans);background:#0e1628;border-radius:14px;margin:0;padding:12px;position:fixed;inset:auto;box-shadow:0 12px 32px #02050c99}.sound-pop{gap:12px;width:240px}.sound-pop:popover-open{display:grid}.sound-pop label{justify-content:space-between;align-items:center;gap:10px;display:flex}.sound-pop input[type=range]{accent-color:#38e0ff;flex:1;min-width:0}.sound-pop input[type=checkbox]{accent-color:#38e0ff;width:18px;height:18px}.sound-pop output{text-align:right;width:3ch;font:12px var(--mono);color:var(--dim)}.done-pop{width:min(340px,100vw - 16px)}.done-pop ul{gap:2px;max-height:50vh;margin:0 0 10px;padding:0;list-style:none;display:grid;overflow:auto}.done-go{color:inherit;border-radius:10px;align-items:center;gap:10px;padding:6px 8px;text-decoration:none;display:flex}.done-go:hover,.done-go:focus-visible{background:#ffffff0f}.done-go .plate{--s:30px;flex:none}.done-go .badge{display:none}.done-go span{min-width:0;display:grid}.done-go .name{font-weight:600}.done-go .name,.done-go small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.done-go small{color:var(--dim)}#done-clear,#sound-try{width:100%}.lang{text-transform:none}.lang option{background:var(--bg);color:var(--text)}.pair{text-align:center;color:var(--dim);justify-items:center;gap:12px;font-size:13px;display:grid}.qr{shape-rendering:crispedges;border-radius:12px;width:min(100%,300px)}.spawn-btns{flex-wrap:wrap;gap:8px;margin:12px 0 4px;display:flex}.base>.spawn-btns{margin:-4px 0 12px}.tab h3>span,.squad h3>b{white-space:nowrap;text-overflow:ellipsis;flex:0 auto;min-width:0;overflow:hidden}.tab h3>button{flex:none}.tab-add{white-space:nowrap;border:1px solid var(--line);color:var(--dim);font:600 11px var(--sans);letter-spacing:.08em;cursor:pointer;background:0 0;border-radius:10px;flex:none;margin-left:auto;padding:2px 8px}.squad .tab-add{margin-left:0}.tab-add:hover,.new-base:hover{color:#38e0ff;border-color:#38e0ff}.quit-btn{border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);cursor:pointer;background:0 0;border-radius:8px;flex:none;margin-left:6px;padding:2px 9px}.quit-btn:hover{color:#ff8a9c;border-color:#ff8a9c66}.base>header>.quit-btn{align-self:flex-start;margin-left:auto}.card>.quit-btn{margin-left:auto}.card>.quit-btn,.tower-quit{z-index:2;position:relative}.tower-quit{margin:6px 0 0}.sheet{border:1px solid var(--line);max-width:min(420px,100vw - 32px);color:var(--text);font:14px/1.5 var(--sans);background:#0e1628;border-radius:16px;margin:auto;padding:18px 20px}.sheet::backdrop{background:#02050c99}.sheet p{margin:0 0 14px}.sheet-row{justify-content:flex-end;gap:10px;display:flex}.sheet .later{cursor:pointer;border-radius:10px;padding:6px 14px}.sheet-yes{color:#06101e;font:600 13px var(--sans);cursor:pointer;background:#ff8a9c;border:0;border-radius:10px;padding:6px 14px}.modes{flex:none;gap:4px;display:flex}.modes button{white-space:nowrap;border:1px solid var(--line);color:var(--dim);font:600 12px var(--sans);cursor:pointer;background:0 0;border-radius:999px;padding:4px 14px}.modes button[aria-pressed=true]{color:#38e0ff;background:#38e0ff14;border-color:#38e0ff}.term-root{min-height:0;padding:10px 16px 14px}.term-root .term-tile{height:100%}.pics{flex-wrap:wrap;align-items:flex-start;gap:6px;margin-top:8px;display:flex}.pic{border:1px solid var(--line);cursor:zoom-in;background:#0b1220;border-radius:8px;max-width:100%;padding:0;line-height:0;overflow:hidden}.pic img{max-width:240px;max-height:180px;display:block}.pic-gone{color:var(--dim);font-size:12px}.lightbox{background:#040810f0;border:0;width:100vw;max-width:none;height:100dvh;max-height:none;margin:0;padding:0;overflow:auto}.lightbox[open]{place-items:center;display:grid}.lightbox::backdrop{background:0 0}.lightbox img{object-fit:contain;cursor:zoom-in;max-width:94vw;max-height:88dvh}.lightbox.zoom[open]{place-items:start}.lightbox.zoom img{cursor:zoom-out;max-width:none;max-height:none}.lightbox button{border:1px solid var(--line);width:44px;height:44px;color:var(--text);background:#0e1628d9;border-radius:50%;place-items:center;font-size:26px;line-height:1;display:grid;position:fixed}.lb-close{top:14px;right:14px}.lb-prev,.lb-next{top:calc(50% - 22px)}.lb-prev{left:14px}.lb-next{right:14px}.lb-count{color:var(--dim);font:13px var(--mono);position:fixed;bottom:14px;left:50%;transform:translate(-50%)}.queue-list{justify-items:end;gap:4px;margin:0 16px 6px;display:grid}.queue-list p{max-width:min(80%,640px);color:var(--dim);white-space:pre-wrap;-webkit-line-clamp:3;border:1px dashed #38e0ff73;border-radius:12px;-webkit-box-orient:vertical;margin:0;padding:6px 12px;font-size:14px;line-height:1.45;display:-webkit-box;overflow:hidden}.queue-list b{color:#38e0ff;letter-spacing:.06em;margin-right:8px;font-size:11px;font-weight:600}.in-term .queue-list{display:none}.todos{border:1px solid var(--line);background:#0e1628d9;border-radius:12px;margin:0 16px;padding:6px 12px;font-size:13px}.todos summary{cursor:pointer;align-items:baseline;gap:10px;min-width:0;list-style:none;display:flex}.todos summary::-webkit-details-marker{display:none}.todos summary b{color:#b48cff;flex:none;font-weight:600}.todos summary span{min-width:0;color:var(--dim);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.todos summary:after{content:"▸";color:var(--dim);margin-left:auto}.todos[open] summary:after{content:"▾"}.todos ol{gap:3px;max-height:30vh;margin:6px 0 2px;padding:0;list-style:none;display:grid;overflow-y:auto}.todos li{font:13px/1.5 var(--sans);margin:0}.todos li:before{content:"○";width:1.4em;color:var(--dim);display:inline-block}.todos li.in_progress{color:#38e0ff}.todos li.in_progress:before{content:"◐"}.todos li.completed{color:var(--dim);text-decoration:line-through}.todos li.completed:before{content:"✓";color:#3ddc97}.in-term .todos,.in-term .monitors{display:none}.monitors{border:1px solid var(--line);background:#0e1628d9;border-radius:12px;margin:6px 16px 0;padding:6px 12px;font-size:13px}.monitors summary{cursor:pointer;align-items:baseline;gap:10px;min-width:0;list-style:none;display:flex}.monitors summary::-webkit-details-marker{display:none}.monitors summary b{color:#38e0ff;flex:none;font-weight:600}.monitors[data-failed=true] summary b{color:#ff5d73}.monitors summary span{min-width:0;color:var(--dim);font:12px var(--mono);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.monitors summary:after{content:"▸";color:var(--dim);margin-left:auto}.monitors[open] summary:after{content:"▾"}.monitors ul{gap:6px;max-height:30vh;margin:6px 0 2px;padding:0;list-style:none;display:grid;overflow-y:auto}.monitors li{text-indent:-1.4em;gap:1px;padding-left:1.4em;display:grid}.monitors li b{overflow-wrap:anywhere;font-weight:500}.monitors li b:before{content:"◐";text-indent:0;color:#38e0ff;width:1.4em;display:inline-block}.monitors li.done b:before{content:"✓";color:#3ddc97}.monitors li.stopped b:before{content:"■";color:var(--dim)}.monitors li.error b:before,.monitors li.stale b:before{content:"!";color:#ff5d73}.monitors li.error small,.monitors li.stale small{color:#ff5d73}.monitors li small{color:var(--dim);text-indent:0}.monitors li code{color:var(--dim);font:12px var(--mono);text-indent:0;overflow-wrap:anywhere}.new-base{border:1px dashed var(--line);min-height:140px;color:var(--dim);font:600 14px var(--sans);letter-spacing:.08em;cursor:pointer;background:0 0;border-radius:18px}.spawn .go{--c:#38e0ff;border:0}.spawn{color:var(--dim);gap:10px;font-size:13px;display:grid}.spawn-at{flex-wrap:wrap;align-items:center;gap:8px;margin:0;display:flex}.spawn-path{color:var(--text);overflow-wrap:anywhere}.spawn-dirs{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px;max-height:40vh;display:grid;overflow:auto}.spawn-dir{border:1px solid var(--line);color:var(--text);font:13px var(--mono);text-align:left;overflow-wrap:anywhere;cursor:pointer;background:0 0;border-radius:8px;padding:7px 10px}.spawn textarea,.spawn input{box-sizing:border-box;border:1px solid var(--line);width:100%;color:var(--text);font:14px var(--sans);background:0 0;border-radius:8px;padding:8px 10px}.link{color:var(--dim);text-transform:uppercase;letter-spacing:.08em;align-items:center;gap:8px;font-size:12px;display:flex}.link i{background:#4f5c7c;border-radius:50%;width:9px;height:9px}.link[data-state=live] i{background:#3ddc97;animation:2.4s ease-in-out infinite blink}.link[data-state=live]{color:#3ddc97}.link[data-state=reconnecting] i,.link[data-state=connecting] i{background:#ffb02e;animation:1s ease-in-out infinite blink}.link[data-state=offline] i{background:#ff5470}.banner{color:#c9d6f5;background:#7184ad29;border-radius:14px;margin:14px 0 0;padding:10px 16px;font-size:13px}.banner b{font-family:var(--mono);font-weight:600}.stage{grid-template-columns:minmax(0,1fr) 300px;align-items:start;gap:20px;margin-top:18px;transition:opacity .4s;display:grid}.stage[data-stale=true] .map,body[data-stale=true] .stats{opacity:.4}.stage[data-stale=true] *{animation-play-state:paused!important}.map{border:1px solid var(--line);background:var(--grid), #080d1a8c;border-radius:22px;min-height:420px;padding:26px;transition:opacity .4s;position:relative}.links{pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.wire{fill:none;stroke:#38e0ff4d;stroke-width:1.5px;stroke-dasharray:3 7;stroke-linecap:round}.packets{pointer-events:none;position:absolute;inset:0;overflow:hidden}.packet{opacity:0;will-change:transform;background:#38e0ff;border-radius:50%;width:6px;height:6px;transition:opacity .4s;animation:none;position:absolute;top:-3px;left:-3px}.packet[data-live]{opacity:.9;animation-play-state:running}.bases{grid-template-columns:repeat(auto-fill,minmax(min(100%,300px),1fr));align-items:start;gap:30px;display:grid;position:relative}.base{border:1px solid var(--line);background:linear-gradient(#16213c,#0c1324);border-radius:18px;padding:16px;position:relative;box-shadow:0 18px 40px #00000059}.base.head{background:linear-gradient(#ffd1661a,#0000 38%),linear-gradient(#16213c,#0c1324)}.base[data-mark=waiting]{box-shadow:0 18px 40px #00000059,inset 0 0 0 999px #ffb02e0b}.base>header{align-items:center;gap:14px;margin-bottom:14px;display:flex;position:relative}.title{justify-items:start;min-width:0;margin-right:auto;display:grid}.title h2{white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:17px;overflow:hidden}.title p{max-width:100%;color:var(--dim);white-space:nowrap;text-overflow:ellipsis;font-size:12px;overflow:hidden}.crown{letter-spacing:.12em;text-transform:uppercase;color:var(--gold);background:#ffd1661f;border-radius:999px;align-items:center;gap:5px;margin-bottom:3px;padding:2px 9px 2px 6px;font-size:10px;display:inline-flex}.crown svg{width:14px;height:14px}.base:not(.head) .crown{display:none}.tower{width:80px;height:80px;color:var(--c);flex:none;place-items:center;display:grid;position:relative}.tower:before{content:"";background:radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--c) 24%, #101a2e), #0b1222 70%);border:1px solid color-mix(in srgb, var(--c) 45%, transparent);border-radius:50%;position:absolute;inset:0}.tower svg{width:48px;height:48px;filter:drop-shadow(0 0 6px color-mix(in srgb, var(--c) 70%, transparent));position:relative}.tower.ghost{opacity:.45}.tower.ghost:before{border-style:dashed}.sweep,.pulse{opacity:0;pointer-events:none;border-radius:50%;position:absolute;inset:0}.sweep{background:conic-gradient(from 0deg, transparent 0 70%, color-mix(in srgb, var(--c) 55%, transparent) 100%)}.pulse{border:2px solid var(--c)}.tower[data-mark=working] .sweep{opacity:1;animation:3.2s linear infinite spin}.tower[data-mark=waiting] .pulse{animation:1.5s ease-out infinite ping}.tower>.badge{--s:40px;position:absolute;bottom:-2px;right:-2px}.tabs{gap:12px;display:grid}.tab{background:#ffffff06;border:1px solid #ffffff0d;border-radius:14px;padding:10px}.tab h3{color:var(--dim);letter-spacing:.12em;text-transform:uppercase;align-items:center;gap:8px;margin-bottom:8px;font-size:11px;font-weight:600;display:flex}.units,.subs{gap:8px;display:grid}.outposts{gap:8px;margin-top:12px;display:grid}.outposts:empty{display:none}.outposts:before{content:attr(data-label);color:var(--dim);letter-spacing:.12em;text-transform:uppercase;font-size:11px}.card{background:#ffffff09;border:1px solid #ffffff0f;border-radius:12px;align-items:center;gap:10px;padding:8px 10px;transition:background-color .4s;display:flex;position:relative}.unit[data-mark=waiting]>.card{background:#ffb02e1c}.unit[data-mark=error]>.card{background:#ff54701c}.unit[data-mark=working]>.card{background:#38e0ff12}.plate{width:var(--s,40px);height:var(--s,40px);color:var(--c);background:radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--c) 26%, #101a2e), #0b1222 72%);border-radius:50%;flex:none;place-items:center;transition:color .4s;display:grid;position:relative}.plate svg{width:calc(var(--s,40px) * .55);height:calc(var(--s,40px) * .55)}.ring,.plate:after{pointer-events:none;border-radius:50%;position:absolute;inset:-3px}.ring{opacity:0;background:conic-gradient(from 0deg, transparent 0 55%, var(--c));-webkit-mask:radial-gradient(farthest-side,#0000 calc(100% - 3px),#000 calc(100% - 2px));mask:radial-gradient(farthest-side,#0000 calc(100% - 3px),#000 calc(100% - 2px))}.plate[data-mark=working]>.ring{opacity:1;animation:1.1s linear infinite spin}.plate:after{content:"";border:2px solid var(--c);opacity:0}.plate[data-mark=waiting]:after{animation:1.5s ease-out infinite ping}.badge{width:clamp(16px, calc(var(--s,40px) * .3), 24px);height:clamp(16px, calc(var(--s,40px) * .3), 24px);font:700 10px/1 var(--mono);color:#06101e;background:var(--c);border-radius:50%;flex:none;place-items:center;transition:background-color .4s;display:grid}.plate>.badge{position:absolute;bottom:-4px;right:-4px}[data-mark=waiting]>.badge:after{content:"?"}[data-mark=idle]>.badge:after{content:"z"}[data-mark=done]>.badge:after{content:"✓"}[data-mark=error]>.badge:after{content:"!"}[data-mark=unknown]>.badge:after{content:"·"}[data-mark=working]>.badge:after{content:"";border:2px solid #06101e;border-right-color:#0000;border-radius:50%;width:8px;height:8px;animation:.8s linear infinite spin}[data-mark=waiting]>.badge{animation:1.2s ease-in-out infinite hop}.meta{min-width:0;display:grid}.name{white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.line{color:var(--dim);align-items:baseline;gap:8px;min-width:0;font-size:12px;display:flex}.role{letter-spacing:.1em;text-transform:uppercase;color:color-mix(in srgb, var(--c) 70%, var(--dim));font-size:10px;font-style:normal}.note{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.unit[data-mark=idle]>.card{opacity:.85}.subs{margin:6px 0 0 22px;padding-left:18px;position:relative}.subs:empty{display:none}.subs:before{content:"";background:repeating-linear-gradient(#7a98e080 0 4px,#0000 4px 8px);width:1px;position:absolute;top:-4px;bottom:22px;left:3px}.subs>.unit>.card:before{content:"";background:repeating-linear-gradient(90deg,#7a98e080 0 4px,#0000 4px 8px);width:15px;height:1px;position:absolute;top:50%;left:-15px}.subs>.unit{position:relative}.subs .plate{--s:30px}.subs .name{font-size:13px}.side{gap:16px;display:grid;position:sticky;top:96px}.panel{border:1px solid var(--line);background:var(--panel);border-radius:18px;padding:14px 16px}.panel h2{color:var(--dim);letter-spacing:.14em;text-transform:uppercase;margin-bottom:10px;font-size:11px}.net-log summary{cursor:pointer;justify-content:space-between;align-items:center;list-style:none;display:flex}.net-log summary::-webkit-details-marker{display:none}.net-log summary:after{content:"▾";color:var(--dim);transition:transform .2s}.net-log:not([open]) summary:after{transform:rotate(-90deg)}.net-log:not([open]) h2{margin-bottom:0}.log{gap:7px;max-height:360px;padding:0;list-style:none;display:grid;overflow:hidden}.log:empty:before{content:attr(data-empty);color:var(--dim);font-size:12px}.log li{grid-template-columns:auto 1fr;gap:2px 8px;font-size:12px;animation:.4s ease-out both slide;display:grid}.log li:before{content:"";background:var(--c);border-radius:50%;width:8px;height:8px;margin-top:5px}.log time{font:11px var(--mono);color:var(--dim);grid-column:2}.credit{color:var(--dim);padding:0 6px;font-size:11px}.legend{gap:8px;padding:0;font-size:12px;list-style:none;display:grid}.legend li{align-items:center;gap:9px;display:flex}.enter{animation:.5s cubic-bezier(.2,.9,.3,1.15) both pop}.leaving{pointer-events:none;animation:.35s ease-in both out}.flash>.card>.plate,.flash.tower{animation:.6s ease-out flash}.flash.flip>.card>.plate,.flash.flip.tower,.flash.flip.token>.plate{animation-name:flash-b}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.7)}}@keyframes hop{50%{transform:translateY(-3px)}}@keyframes blink{50%{opacity:.35}}@keyframes pop{0%{opacity:0;transform:scale(.92)translateY(8px)}}@keyframes pop-b{0%{opacity:0;transform:scale(.92)translateY(8px)}}@keyframes out{to{opacity:0;transform:scale(.94)}}@keyframes out-b{to{opacity:0;transform:scale(.94)}}@keyframes flash{40%{transform:scale(1.12)}}@keyframes flash-b{40%{transform:scale(1.12)}}@keyframes slide{0%{opacity:0;transform:translate(10px)}}@keyframes slide-b{0%{opacity:0;transform:translate(10px)}}@keyframes zoom{0%{opacity:0;transform:scale(.45)}}@keyframes zoom-b{0%{opacity:0;transform:scale(.45)}}@keyframes come-in{0%{opacity:0;transform:translate(-14px)scale(.98)}}@keyframes go-out{0%{opacity:0;transform:translate(14px)scale(.98)}}.tx.fresh{animation:.32s cubic-bezier(.2,.8,.2,1) both come-in}.tx.you.fresh{animation-name:go-out}[data-calm] :is(.link i,.sweep,.pulse,.ring,.badge,.term-typing),[data-calm] :is(.plate,.badge):after{animation:none!important}[data-calm] .tower[data-mark=waiting] .pulse{opacity:.55}[data-calm] .plate[data-mark=waiting]:after{opacity:.55;transform:scale(1.25)}[data-calm] .packet{opacity:0;animation-play-state:paused!important}[hidden]{display:none!important}a{color:inherit}.crumbs,.tally dt,.comms-head small,.tx.you>header,.notice em,.rule summary,.dossier-in>.tag,.d-drones h4,.d-docs h4,.specs dt,.stop,.dialog .tag,.intel h4,.pending b{color:var(--dim);letter-spacing:.14em;text-transform:uppercase;font-size:11px;font-style:normal}.token .name,.drone .note,.count small,.sum,.where,.tile b{white-space:nowrap;text-overflow:ellipsis;max-width:100%;overflow:hidden}.md a,.bubble a,.notice a,.d-note a,.specs a,.crumbs a{color:#38e0ff}.crumbs{gap:10px;min-width:0;margin:14px 6px 0;display:flex}.crumbs>*+:before{content:"›";opacity:.5;margin-right:10px}.crumbs>*{white-space:nowrap;text-overflow:ellipsis;letter-spacing:.06em;flex:0 auto;min-width:0;max-width:28ch;overflow:hidden}.crumbs>:last-child{flex:auto;max-width:none}.crumb-more{cursor:pointer;color:#38e0ff;display:none}.crumbs a,.brand{text-decoration:none}.work{align-items:flex-start;gap:20px;min-width:0;display:flex}.view{flex:1 1 0;min-width:0}body[data-stale=true] .work{opacity:.45}.enter-zoom{transform-origin:var(--ox,50%) var(--oy,0);animation:.5s ease-out both zoom}.enter-slide,.dossier{animation:.4s ease-out both slide}.enter-back{animation:.4s ease-out both pop}.enter-zoom.flip{animation-name:zoom-b}.enter-slide.flip{animation-name:slide-b}.enter-back.flip{animation-name:pop-b}.hit,.enter-base:after{z-index:1;border-radius:inherit;position:absolute;inset:0}.enter-base:after{content:"";z-index:0}.hit:hover{box-shadow:inset 0 0 0 1px var(--c)}.enter-base{text-decoration:none}.base>header:hover h2{color:#38e0ff}.alerts{width:230px;color:inherit;font:inherit;text-align:left;cursor:pointer;align-items:center;gap:10px;display:flex;position:relative}.alerts:disabled{cursor:default;opacity:.6}.alerts:not(:disabled){border-color:var(--c4);background:var(--c1)}.faces{flex:none;padding-left:10px;display:flex}.faces .plate{--s:28px;margin-left:-10px;box-shadow:0 0 0 2px #0e1628}.faces .badge{display:none}.count{min-width:0;display:grid}.count b{font:600 18px/1.1 var(--mono)}.count small,.comms-head p,.cmp-note,.where,.queued,.d-line,.who p{color:var(--dim);font-size:12px}.token{border:1px solid #0000;border-radius:16px;justify-items:center;gap:3px;width:100%;padding:10px 8px 9px;text-decoration:none;display:grid;position:relative}a.token:hover{border-color:var(--c4)}.token[data-mark=waiting]{background:#ffb02e1c}.token[data-mark=error]{background:#ff54701c}.token .plate{--s:64px;margin-bottom:4px}.token .name{font-weight:600}.token .line{justify-items:center;max-width:100%;display:grid}.drone{width:94px;padding:6px;font-size:12px}.drone .plate{--s:44px}.drone .role{display:none}.flash.token>.plate{animation:.6s ease-out flash}.zoom-in,.comms-in{border:1px solid var(--line);background:var(--grid), #080d1a8c;border-radius:22px;position:relative}.zoom-in{min-height:420px;padding:24px}.zoom-in.void>:not(.lost){display:none}.lost,.chat-empty{color:var(--dim);text-align:center;padding:60px 0}.keep{align-items:center;gap:20px;padding:18px 22px;display:flex}.keep h2{font-size:24px}.tower.big{width:120px;height:120px}.tower.big svg{width:72px;height:72px}.tower.big>.badge{--s:96px;bottom:4px;right:4px}a.tower:hover:before{border-color:var(--c)}.tally{gap:10px;display:flex}.squads,.camps{grid-template-columns:repeat(auto-fit,minmax(min(100%,430px),1fr));align-items:start;gap:18px;margin-top:20px;display:grid}.squad{background:#0c1324c7;padding:14px 16px 18px}.squad[data-mark=waiting]{background:#262121d9}.squad h3{align-items:center;gap:10px;margin-bottom:14px;display:flex}.squad h3 b,.crumbs b{color:var(--text)}.squad h3 small{margin-left:auto}.squad h3 svg{width:18px;height:18px}.flag{background:var(--c);width:10px;height:10px;box-shadow:0 0 8px var(--c);border-radius:2px;transform:rotate(45deg)}.formation{flex-wrap:wrap;align-items:flex-start;gap:16px 20px;display:flex}.col{justify-items:center;gap:8px;width:196px;display:grid}.say{width:100%;color:var(--dim);background:#111a2f;border-radius:12px;margin-top:4px;padding:7px 10px;font-size:12px;line-height:1.35}.say p{overflow-wrap:anywhere;max-height:4.05em;overflow:hidden}.drones{flex-wrap:wrap;justify-content:center;gap:8px;width:100%;padding-top:16px;display:flex;position:relative}.drones:empty{display:none}.drones:before{content:"";background:repeating-linear-gradient(#7a98e099 0 4px,#0000 4px 8px);width:1px;height:14px;position:absolute;top:0;left:50%}.camp .token{width:156px}[data-group=outside] .plate{filter:saturate(.3);outline-offset:4px;outline:1px dashed #8b99ba8c}.comms-in,.tile{height:calc(var(--vvh,100vh) - 190px);grid-template-rows:auto minmax(0,1fr) auto;min-height:380px;display:grid;overflow:hidden}.comms-head,.tile>header{background:var(--panel);align-items:center;gap:12px;padding:12px 18px;display:flex}.ava{color:#38e0ff;background:radial-gradient(circle at 35% 30%,#38e0ff47,#0b1222 72%);border-radius:50%;flex:none;place-items:center;width:30px;height:30px;display:grid}.ava svg{width:58%;height:58%}.comms-head h2{font-size:16px}.chan{white-space:nowrap;flex:none;margin-left:auto}.head-id{flex:auto;min-width:0}.head-id h2,.head-id p{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.head-back{display:none}.modes+.chan{margin-left:12px}.chat-root{min-height:0;display:grid;position:relative}.comms-in .ask{max-height:calc((var(--vvh,100vh) - 190px) * .55);overscroll-behavior:contain;overflow-y:auto}.chat-scroll{overflow-anchor:none;padding:12px 16px;font-size:15px;overflow-y:auto}.chat-list{gap:8px;display:grid}.tx.in+.tx.in,.tx.you+.tx.you{margin-top:-4px}.tx.in+.tx.in>.ava,.tx.you+.tx.you .ava{visibility:hidden}.tx.in+.tx.in .tx-body>header b,.tx.you+.tx.you>header b{display:none}.chat-top{height:1px}.chat-end{height:1px;margin-top:-1px}.chat-live{color:var(--c);align-items:center;gap:10px;margin-top:14px;padding-left:44px;font-size:12px;display:flex}.chat-pill{--c:#38e0ff;border:0;position:absolute;bottom:14px;left:50%;transform:translate(-50%)}.lit:after{content:"";background:#38e0ff2e;border-radius:14px;animation:1s 1s forwards out;position:absolute;inset:0}.lit.flip:after{animation-name:out-b}.composer{border-top:1px solid var(--line);background:var(--panel);gap:8px;padding:12px 18px 14px;display:grid;position:relative}.cmp-row,.cmp-acts,.cmp-foot,.cmp-note{align-items:center;gap:8px;display:flex}.cmp-row{align-items:flex-end;gap:10px}.composer textarea{resize:none;border:1px solid var(--line);min-width:0;color:var(--text);font:14px/1.4 var(--sans);background:#070c18;border-radius:12px;flex:1;padding:9px 12px}@supports (field-sizing:content){.composer textarea{field-sizing:content;max-height:220px}.composer{grid-template-columns:minmax(0,1fr)}}.composer textarea:focus{border-color:#38e0ff80;outline:none;box-shadow:0 0 0 3px #38e0ff1f}.composer button:disabled{opacity:.45;cursor:default}.cmp-note{flex-wrap:wrap;flex:1;min-height:18px}.cmp-note[data-tone=error],.cmp-alt.cmp-stop{color:#ff8a9c}.cmp-note[data-tone=ok]{color:#3ddc97}.cmp-note[data-tone=ask]{color:var(--gold)}.cmp-link{color:#38e0ff;font:12px var(--sans);cursor:pointer;background:0 0;border:0;padding:0}.slash{z-index:5;border:1px solid var(--line);background:#0b1324;border-radius:12px;max-height:260px;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% - 6px);left:18px;right:18px;overflow-y:auto;box-shadow:0 8px 24px #0008}.slash li{cursor:pointer;border-radius:8px;align-items:baseline;gap:10px;padding:6px 10px;display:flex}.slash li[aria-selected=true]{background:#38e0ff1f}.slash b{color:#38e0ff;font:600 13px var(--mono);white-space:nowrap}.slash span{min-width:0;color:var(--dim);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.cmp-yes{background:var(--gold);color:#06101e;font:600 12px var(--sans);cursor:pointer;border:0;border-radius:8px;padding:3px 10px}.tx{content-visibility:auto;contain-intrinsic-size:auto 220px;min-width:0}.tx.you{contain-intrinsic-size:auto 76px}.tx.sys,.tx.rule{contain-intrinsic-size:auto 40px}.tx.note{contain-intrinsic-size:auto 24px}.tx time,.tx.note{color:var(--dim);font:11px var(--mono)}.tx.you{justify-items:end;gap:5px;display:grid}.tx.you>header{color:var(--gold);align-items:center;gap:8px;display:flex}.tx.you .ava{color:var(--gold)}.bubble{white-space:pre-wrap;overflow-wrap:anywhere;background:#ffd16614;border:1px solid #ffd16638;border-radius:14px;max-width:80%;padding:7px 12px;line-height:1.5}.tx.in{grid-template-columns:30px minmax(0,1fr);align-items:start;gap:8px;display:grid}.tx-body{border:1px solid var(--line);background:#0e1628d9;border-radius:14px;gap:6px;padding:8px 12px;display:grid}.tx-body,.tx-body>*{min-width:0}.tx-body>header{color:var(--dim);font:11px var(--mono);align-items:baseline;gap:10px;display:flex}.tx-body>header b{color:#38e0ff;font:600 13px var(--sans)}.stop,.dialog .tag{background:var(--c1);color:var(--c);border-radius:999px;padding:1px 8px;font-size:10px}.fault{color:#ff8a9c;font-size:13px}.thought,.more,.tab-btn{border:1px solid var(--line);color:var(--dim);font:11px var(--sans);cursor:pointer;background:0 0;border-radius:999px;justify-self:start;padding:2px 10px}.thought-text:empty{display:none}.thought-text,.out,.args,.notice pre,.rule pre{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--dim);font:13px/1.45 var(--mono)}.act,.notice{background:#ffffff08;border:1px solid #ffffff12;border-radius:10px}.act>summary,.notice>summary,.rule summary{cursor:pointer;align-items:center;gap:8px;min-width:0;padding:5px 10px;font-size:13.5px;list-style:none;display:flex}summary::-webkit-details-marker{display:none}.act code{color:var(--c);font:600 11px var(--mono);letter-spacing:.06em;text-transform:uppercase}.sum{min-width:0;color:var(--dim)}.act[open] .sum{white-space:normal}.open{flex:none;margin-left:auto}.act>pre,.result{margin:0 10px 8px}.result{gap:6px;display:grid}.tx.sys{padding-left:38px}.notice{background:#966eff12;border-color:#966eff33}.notice .ava{width:22px;height:22px}.notice pre,.rule pre{padding:0 10px 8px}.rule summary{justify-content:center}.rule summary:before,.rule summary:after{content:"";background:var(--line);flex:1;height:1px}.tx.note{text-align:center}.dossier-in{text-align:center;justify-items:center;gap:6px;display:grid;position:relative}.dossier-in>.tag{text-align:left;justify-self:stretch}.portrait{background:radial-gradient(var(--c1), transparent 70%);border-radius:50%;padding:8px}.portrait .plate{--s:96px}.dossier-in h3{overflow-wrap:anywhere;margin-top:4px;font-size:18px}.d-line,.who p{align-items:baseline;gap:8px;display:flex}.d-note{background:#ffb02e1f;border-radius:10px;padding:8px 10px;font-size:12px}.specs{text-align:left;justify-self:stretch;gap:2px;margin-top:10px;display:grid}.specs div{background:#ffffff09;grid-template-columns:76px minmax(0,1fr);gap:8px;padding:7px 10px;display:grid}.specs dt{font-size:10px}.specs dd{overflow-wrap:anywhere;font-size:12.5px}.d-drones,.d-squads{margin-top:8px}.d-squads{justify-self:stretch;gap:10px;display:grid}.d-squad{gap:6px;display:grid}.d-squad small{color:var(--dim)}.d-squad .formation{gap:6px}.d-x,.head-info{display:none}.d-drones .formation{justify-content:center;gap:6px}.md{overflow-wrap:anywhere;line-height:1.55}.md p,.md ul,.md ol,.md pre,.md table,.md blockquote{margin:0 0 8px}.md>:last-child{margin-bottom:0}.md :is(h1,h2,h3,h4,h5,h6){margin:12px 0 6px;font-size:16px}.md>:first-child{margin-top:0}.md h1{font-size:19px}.md ul,.md ol{padding-left:22px}.md li>p{margin:0}.md li.task{margin-left:-18px;list-style:none}.check{vertical-align:-2px;text-align:center;width:14px;height:14px;font:700 10px/12px var(--mono);border:1px solid;border-radius:4px;margin-right:7px;display:inline-block}.check[data-done=true]{color:#06101e;background:#3ddc97}.md code{font:13.5px var(--mono);background:#ffffff14;border-radius:5px;padding:1px 5px}.md pre{border:1px solid var(--line);background:#070c18;border-radius:10px;padding:10px 12px;overflow-x:auto}.md pre code{background:0 0;padding:0}.md blockquote{color:var(--dim);background:#ffffff0a;padding:6px 12px}.md table{border-collapse:collapse;display:block;overflow-x:auto}.md th,.md td{border:1px solid var(--line);padding:4px 10px}.tiles{flex:1 1 0;gap:20px;min-width:0;display:flex}.tile-tabs{display:none}.tile{border:1px solid var(--line);background:var(--panel);border-radius:22px;flex:1 1 0;min-width:0;position:sticky;top:96px}.tile>header svg{width:22px;height:22px;color:var(--gold)}.tile{grid-template-columns:minmax(0,1fr)}.tile>header b{flex:1;min-width:0}.tile-body{padding:16px 20px;overflow:auto}.tiles.tabbed{flex-direction:column;gap:8px}.tile:has(.spawn,.pair){height:auto;min-height:0;max-height:calc(var(--vvh,100vh) - 190px);align-self:flex-start}.spawn .chat-empty{text-align:left;padding:0}.spawn .chat-empty:empty{display:none}.tiles.tabbed .tile-tabs{gap:6px;display:flex}.tiles.tabbed .tile:not(.active){display:none}.tiles.tabbed .tile{flex:none}.tab-btn.active,.open{color:var(--gold);border-color:#ffd16666}.dock{z-index:20;pointer-events:none;width:min(300px,100vw - 44px);display:grid;position:fixed;top:108px;right:max(22px,50vw - 718px)}.dialog{pointer-events:auto;border:1px solid var(--c4);background:linear-gradient(var(--c1), #0c1324 70%), #121a30;transform-origin:top;border-radius:18px;grid-area:1/1;padding:14px 16px 16px;transition:transform .3s,opacity .3s;position:relative;box-shadow:0 24px 60px #000c}.dialog:focus{outline:none}.dialog{overscroll-behavior:contain;max-height:calc(100dvh - 128px);overflow-y:auto}.dialog>header{align-items:center;gap:8px;min-width:0;margin-bottom:12px;display:flex}.where{min-width:0}.x{color:var(--dim);cursor:pointer;background:0 0;border:0;margin-left:auto;font-size:20px}.zoom{color:var(--dim);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0 6px;font-size:17px}.zoom+.x{margin-left:0}.zoom:hover,.x:hover{color:var(--text)}.dock.wide{width:min(880px,100vw - 44px);top:72px;right:50%;transform:translate(50%)}.dock.wide .dialog{max-height:calc(100dvh - 96px)}.who{align-items:center;gap:14px;display:flex}.who .plate{--s:56px}.who h3{font-size:17px}.intel{background:#060a148c;border-radius:12px;margin-top:12px;padding:10px 12px}.intel h4{margin-bottom:4px}.said{overflow-wrap:anywhere;font-size:13px;line-height:1.45}.pending{color:var(--c);font:12px var(--mono);overflow-wrap:anywhere;margin-top:8px}.dialog footer{flex-wrap:wrap;align-items:center;gap:10px;margin-top:14px;display:flex}.ask{background:#ffb02e0f;border:1px solid #ffb02e59;border-radius:14px;gap:8px;margin:10px 18px 0;padding:12px 14px;display:grid}.dialog .ask{margin:10px 0 0}.ask-one{gap:8px;display:grid}.ask-one+.ask-one{margin-top:8px}.ask-head{color:var(--gold);letter-spacing:.06em;text-transform:uppercase;background:#ffb02e24;border-radius:999px;justify-self:start;padding:1px 9px;font-size:11px}.ask-how{color:var(--dim);font-size:12px}.ask-q{white-space:pre-wrap;overflow-wrap:anywhere;font-weight:600}.ask-ctx,.ask-why{color:var(--dim);white-space:pre-wrap;overflow-wrap:anywhere;max-height:9em;font-size:13px;overflow:auto}.ask-opts{counter-reset:opt;gap:6px;max-height:16em;margin:0;padding:0;list-style:none;display:grid;overflow:auto}.ask-opt{border:1px solid var(--line);overflow-wrap:anywhere;counter-increment:opt;background:#070c18;border-radius:10px;gap:2px;padding:7px 12px;font-size:13px;display:grid}.ask-opt b:before{content:counter(opt) ". ";color:var(--dim)}.ask-opt b[data-n]:before{content:attr(data-n) ". "}.ask-opt small{color:var(--dim);font-size:12px}.ask-acts{flex-wrap:wrap;align-items:center;gap:6px 14px;display:flex}.ask-acts>:last-child{margin-left:auto}.ask-term{color:var(--gold);font-size:12px}.ask button:disabled{opacity:.45;cursor:default}.ask-note:empty{display:none}.ask-note{color:var(--dim);flex-wrap:wrap;align-items:center;gap:4px 10px;font-size:12px;display:flex}.ask-note[data-tone=error]{color:#ff8a9c}.ask-note[data-tone=ok]{color:#3ddc97}.ask-title{font:12.5px/1.45 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;max-height:12em;margin:0;overflow:auto}div.ask-opts{max-height:none}button.ask-opt{text-align:left;color:var(--text);font:13px var(--sans);cursor:pointer}.ask-opt[aria-checked=true]{background:#ffb02e1f;border-color:#ffb02e}.ask-own{border:1px solid var(--line);min-width:0;color:var(--text);font:13px var(--sans);background:#070c18;border-radius:10px;padding:7px 12px}.ask-memo{font-size:12px}.ask input:disabled{opacity:.45}.ask-send{color:#06101e;font:600 13px var(--sans);cursor:pointer;background:#ffb02e;border:0;border-radius:10px;padding:7px 13px}.go,.later,.chat-pill,.cmp-send,.cmp-alt{font:600 13px var(--sans);cursor:pointer;border-radius:10px;padding:7px 13px;text-decoration:none}.go,.chat-pill{background:var(--c);color:#06101e}a.go{justify-content:center;align-items:center;display:inline-flex}.cmp-send{color:#06101e;background:#38e0ff;border:0}.later,.cmp-alt{border:1px solid var(--line);color:var(--text);background:0 0}.queued{color:var(--dim);flex:1 0 100%;font-size:12px}.queued:empty{display:none}html.paused *,html.paused :before,html.paused :after{animation-play-state:paused!important}@media (width<=1100px){.stage{grid-template-columns:1fr}.side{position:static}.stats{display:none}}.term-tile{grid-template-rows:auto minmax(0,1fr) auto;gap:10px;height:100%;display:grid}.tile-body:has(.term-tile){padding:12px 14px;overflow:hidden}.term-bar{justify-content:space-between;align-items:center;gap:12px;font-size:12px;display:flex}.term-scroll{transition:border-color .2s,box-shadow .2s}.term-scroll.typing{border-color:#38e0ff;box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}.term-scroll.engage{animation:.6s ease-out term-engage}.term-scroll.blip{animation:.22s ease-out term-blip}.term-scroll.blip.flip{animation-name:term-blip-b}@keyframes term-engage{0%{box-shadow:0 0 #38e0ffcc,0 0 #38e0ff00}60%{box-shadow:0 0 0 7px #38e0ff00,0 0 34px #38e0ff66}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}@keyframes term-blip{0%{box-shadow:0 0 0 2px #7ff0ffcc,0 0 32px #38e0ff88}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}@keyframes term-blip-b{0%{box-shadow:0 0 0 2px #7ff0ffcc,0 0 32px #38e0ff88}to{box-shadow:0 0 0 1px #38e0ff66,0 0 22px #38e0ff2e}}.term-sink{opacity:0;resize:none;pointer-events:none;border:0;width:1px;height:18px;padding:0;position:fixed;overflow:hidden}.term-typing{color:#38e0ff;margin-left:auto;font-weight:600;animation:1.6s ease-in-out infinite term-note}@keyframes term-note{50%{opacity:.55;text-shadow:0 0 10px #38e0ff99}}.term-state{color:var(--dim)}.term-state[data-tone=ok]{color:#3ddc97}.term-state[data-tone=error]{color:#ff8a9c}.term-scroll{overscroll-behavior:contain;border:1px solid var(--line);background:#090d18;border-radius:14px;padding:8px 10px;overflow:auto}@font-face{font-family:SB Nerd Symbols;src:local(SymbolsNFM),local(Symbols Nerd Font Mono),local(HackNFM-Regular),url(./SymbolsNerdFontMono-DkrHkSnn.woff2)format("woff2");unicode-range:U+E000-F8FF,U+F0000-FFFFD;font-display:swap}.term{color:#cdd6f4;width:max-content;min-width:100%;font:12px/1.3 var(--mono);white-space:pre;font-family:ui-monospace,SF Mono,Menlo,Consolas,SB Nerd Symbols,monospace;transition:opacity .2s}.term .tr{min-height:1.3em}.term.stale{opacity:.5}.term.hidden{display:none}.plate[data-docs]:before{content:attr(data-docs);z-index:1;color:#3b2a06;min-width:10px;height:16px;font:700 9px/16px var(--mono);text-align:center;background:linear-gradient(#f6e6b8,#d8bd78);border-radius:3px 6px;padding:0 3px;position:absolute;top:-5px;left:-5px;box-shadow:0 0 0 2px #0b1222,2px 2px 0 1px #8a6f33}.d-docs{text-align:left;margin-top:12px}.d-docs h4{text-align:center;margin:0 0 6px}.d-doc-list{gap:6px;display:grid}.d-doc{width:100%;color:var(--text);font:13px var(--sans);text-align:left;cursor:pointer;background:#d8bd7812 linear-gradient(#f6e6b8,#d8bd78) 9px/13px 16px no-repeat;border:1px solid #d8bd7840;border-radius:10px;gap:1px;padding:7px 10px 7px 30px;display:grid}.d-doc:hover{border-color:#d8bd78aa}.d-doc b{overflow-wrap:anywhere;font-weight:600}.d-doc small{color:var(--dim);font-size:11px}.d-docs-cut{color:var(--dim);margin:6px 0 0;font-size:12px}.doc-tile{grid-template-rows:auto minmax(0,1fr);gap:10px;height:100%;display:grid}.tile-body:has(.doc-tile){padding:12px 14px;overflow:hidden}.doc-bar{flex-wrap:wrap;justify-content:flex-start}.doc-why{min-width:0;color:var(--text);flex:160px}.doc-off{color:var(--gold);font-style:normal}.doc-acts{gap:14px;display:flex}.doc-frame{background:#fff;border:1px solid #d8bd7855;border-radius:12px;width:100%;height:100%;min-height:240px}.doc-text{background:#0b1222;border:1px solid #d8bd7840;border-radius:12px;padding:14px 18px;overflow:auto}.doc-pre{white-space:pre-wrap;font:12.5px/1.45 var(--mono);margin:0}.pad{gap:6px;display:grid}.pad-row{grid-template-columns:repeat(auto-fit,minmax(48px,1fr));gap:6px;display:grid}.pad-key{border:1px solid var(--line);min-height:34px;color:var(--text);font:600 12px var(--mono);cursor:pointer;background:#0b1224;border-bottom-width:3px;border-radius:9px;padding:4px 6px}.pad-key:active:not(:disabled){background:#13203e;border-bottom-width:1px;transform:translateY(2px)}.pad-key:disabled{opacity:.35;cursor:default}.pad-key[data-key=enter]{color:#38e0ff}.pad-key[data-key=esc]{color:var(--gold)}.pad-key:is([data-key=up],[data-key=down],[data-key=left],[data-key=right],[data-key=backspace]){font-size:16px}.pad-digits summary{color:var(--dim);cursor:pointer;padding:2px 0;font-size:12px}.pad-note:empty{display:none}.pad-note{color:var(--dim);flex-wrap:wrap;align-items:center;gap:6px 12px;margin:0;font-size:12px;display:flex}.pad-note[data-tone=error]{color:#ff8a9c}.pad-note[data-tone=ask]{color:var(--text);background:#ffb02e14;border:1px solid #ffb02e66;border-radius:10px;padding:8px 10px}.pad-yes{color:#06101e;font:600 12px var(--sans);cursor:pointer;background:#ffb02e;border:0;border-radius:9px;padding:5px 11px}.c0{color:#45475a}.cz{color:#090d18}.c1{color:#f38ba8}.c2{color:#a6e3a1}.c3{color:#f9e2af}.c4{color:#89b4fa}.c5{color:#f5c2e7}.c6{color:#94e2d5}.c7{color:#bac2de}.c8{color:#585b70}.c9{color:#f37799}.c10{color:#89d88b}.c11{color:#ebd391}.c12{color:#74a8fc}.c13{color:#f2aede}.c14{color:#6bd7ca}.c15{color:#a6adc8}.k0{background:#090d18}.k1{background:#f38ba8}.k2{background:#a6e3a1}.k3{background:#f9e2af}.k4{background:#89b4fa}.k5{background:#f5c2e7}.k6{background:#94e2d5}.k7,.kz{background:#bac2de}.k8{background:#585b70}.k9{background:#f37799}.k10{background:#89d88b}.k11{background:#ebd391}.k12{background:#74a8fc}.k13{background:#f2aede}.k14{background:#6bd7ca}.k15{background:#a6adc8}.tb{font-weight:700}.td{opacity:.6}.ti{font-style:italic}.tu{text-decoration:underline}.ts{text-decoration:line-through}.tu.ts{text-decoration:underline line-through}@media (width<=900px){.work{flex-direction:column;align-items:stretch}.view,.tiles{flex:none}.tile{position:static}.keep{flex-wrap:wrap}}@media (width<=640px){.shell{padding:max(8px, env(safe-area-inset-top)) max(8px, env(safe-area-inset-right)) calc(24px + env(safe-area-inset-bottom)) max(8px, env(safe-area-inset-left))}.hud{flex-wrap:wrap;gap:10px;padding:10px 12px;position:static}.brand p,.link span{display:none}.alert-row{flex:100%;order:3;min-width:0}.alert-row .alerts{flex:auto;width:auto;min-width:0}.done-btn{min-height:40px}.brand{flex:calc(100% - 40px);min-width:0}.link{order:1}.hud>.pair-btn{white-space:nowrap;flex:1 1 0;order:2;justify-content:center;min-width:0;min-height:40px;padding:6px 8px}.hud>.lang{flex:none;padding-right:26px}.log{max-height:none}.log li:nth-child(n+3){display:none}.crumbs{gap:6px}.crumbs>*+:before{margin-right:6px}.crumbs>*{max-width:16ch}.crumbs:not(.open)>.mid{display:none}.crumbs:not(.open)>.crumb-more{flex:none;display:block}.crumbs.open{flex-wrap:wrap;row-gap:4px}.map,.zoom-in{padding:14px}.bases{gap:18px}.keep{gap:12px;padding:6px}.tower.big{width:84px;height:84px}.tally{flex-wrap:wrap}.col{width:100%}.dossier:not(.full){content-visibility:hidden}.comms-in,.dossier.full{left:0;right:0;top:var(--vvt,0px);height:var(--vvh,100dvh);background:var(--bg);position:fixed}.tiles:has(.tile){left:0;right:0;top:var(--vvt,0px);height:var(--vvh,100dvh);background:var(--bg);position:fixed}.comms-in{z-index:15;border:0;border-radius:0;grid-template-columns:minmax(0,1fr);min-height:0}.tiles:has(.tile){z-index:16;padding:8px;overflow-y:auto}.tile{height:calc(var(--vvh,100dvh) - 16px);border-radius:16px;min-height:300px}.dossier.full{z-index:17;overscroll-behavior:contain;padding:max(16px, env(safe-area-inset-top)) 16px calc(16px + env(safe-area-inset-bottom));border:0;border-radius:0;overflow-y:auto}.dossier.full .d-x{place-items:center;display:grid;position:absolute;top:0;right:0}.comms-head{padding:max(10px, env(safe-area-inset-top)) 12px 10px;grid-template-columns:auto minmax(0,1fr) auto auto;gap:8px 10px;display:grid}.comms-head .logo{display:none}.head-back{border:1px solid var(--line);width:40px;height:40px;color:var(--text);border-radius:12px;place-items:center;font-size:24px;text-decoration:none;display:grid}.head-info{padding:0 12px;display:block}.comms-head h2 small,.chan b{display:none}.modes+.chan{margin-left:0}.modes{border:1px solid var(--line);border-radius:12px;grid-area:2/1/auto/-1;padding:3px}.modes button{border:0;border-radius:9px;flex:1;min-height:40px;padding:0;font-size:14px}.modes button[aria-pressed=true]{background:#38e0ff1f}.chat-scroll{overscroll-behavior:contain;padding:12px}.chat-scroll:focus-visible{outline:none}.bubble{max-width:92%}.composer{padding:10px 12px calc(10px + env(safe-area-inset-bottom))}.cmp-foot:has(>.cmp-note:empty){display:none}.cmp-row{flex-wrap:wrap}.composer textarea{flex:100%;order:-1;min-height:64px}.cmp-acts{margin-left:auto}.dock,.dock.wide{width:calc(100vw - 20px);top:auto;right:10px}.dock{bottom:calc(10px + env(safe-area-inset-bottom))}.dock.wide{transform:none}.dialog .zoom{display:none}}@media (pointer:coarse){.composer textarea,.ask input{font-size:16px}.composer button,.go,.later,.x,.chat-pill,.pair-btn,.alerts,.ask button,.term-bar button,.quit-btn,.d-doc{min-height:40px}}@media (width<=640px),(pointer:coarse){.pad-key,.pad-yes{min-height:44px}.pad-digits summary{padding:14px 0}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}
@@ -0,0 +1 @@
1
+ var e={},t=[`en`,`zh-TW`],n=`PARAGLIDE_LOCALE`,r=[`baseLocale`],i=[],a=typeof window>`u`;globalThis.__paraglide=globalThis.__paraglide??{},globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};var o=!1,s=()=>{let e=r;!a&&typeof window<`u`&&window.location?.href&&(e=ue(window.location.href));let t=c(e,typeof window<`u`?window.location?.href:void 0);if(t)return o||(o=!0,d(t,{reload:!1})),t;throw Error(`No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found`)};function c(e,t){let n;for(let t of e){if(t===`baseLocale`)n=`en`;else if(de(t)&&_.has(t)){let e=_.get(t);if(e){let t=e.getLocale();if(t instanceof Promise)continue;if(t!==void 0)return m(t)}}let e=p(n);if(e)return e}}var l=e=>{s=e},u=e=>{e?window.location.href=e:window.location.reload()},d=(e,t)=>{let n={reload:!0,...t},i;try{i=s()}catch{}let o=[],c=r;!a&&typeof window<`u`&&window.location?.href&&(c=ue(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(de(t)&&_.has(t)){let n=_.get(t);if(n){let r=n.setLocale(e);r instanceof Promise&&(r=r.catch(e=>{throw Error(`Custom strategy "${t}" setLocale failed.`,{cause:e})}),o.push(r))}}let l=()=>{!a&&n.reload&&window.location&&e!==i&&u(void 0)};if(o.length)return Promise.all(o).then(()=>{l()});l()},f=()=>typeof window<`u`?window.location.origin:`http://fallback.com`;function p(e){if(typeof e!=`string`)return;let n=e.toLowerCase();for(let e of t)if(e.toLowerCase()===n)return e}function m(e){let n=p(e);if(n)return n;throw Error(`Invalid locale: ${e}. Expected one of: ${t.join(`, `)}`)}function h(e){return e}function g(t,n){return new e(t,n.href)}function ee(){return 0}function te(e){return i}function ne(e,t){return e.exec(t.href)}var re=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${re}=([^;]*)`);function ie(e){return ae(e)}function ae(e){let t=h(typeof e==`string`?new URL(e,f()):new URL(e.href)),n=t.pathname.replace(/^\/+/,``).split(`/`);return n.length>0&&p(n[0])&&(t.pathname=`/`+n.slice(1).join(`/`)),h(t)}var oe=-1,se,ce;function le(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=ee();if(se===t&&oe===n)return ce;let r=h(new URL(t,`http://example.com`)),a=ie(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of te(e))if(ne(g(t.match,e),e)){s=t;break}if(s)break}return oe=n,se=t,ce=s,s}function ue(e){let t=le(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var _=new Map;function de(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}var fe=((e={},t={})=>(t.locale??s())===`zh-TW`?`警示`:`Alerts`),pe=((e={},t={})=>(t.locale??s())===`zh-TW`?`所有基地`:`all bases`),me=((e={},t={})=>(t.locale??s())===`zh-TW`?``:`.`),he=((e={},t={})=>(t.locale??s())===`zh-TW`?`最後更新:`:`Last update`),ge=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,_e=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,ve=((e,t={})=>(t.locale??s())===`zh-TW`?_e(e):ge(e)),ye=e=>`The server is up but cannot read the net: ${e?.problem}`,be=e=>`伺服器正常,但讀不到網:${e?.problem}`,xe=((e,t={})=>(t.locale??s())===`zh-TW`?be(e):ye(e)),Se=((e={},t={})=>(t.locale??s())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),Ce=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,we=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,Te=((e,t={})=>(t.locale??s())===`zh-TW`?we(e):Ce(e)),Ee=((e={},t={})=>(t.locale??s())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),De=((e={},t={})=>(t.locale??s())===`zh-TW`?`取消`:`Cancel`),Oe=((e={},t={})=>(t.locale??s())===`zh-TW`?`關閉`:`Close`),ke=e=>`Quit base ${e?.name}`,Ae=e=>`關掉基地 ${e?.name}`,je=((e,t={})=>(t.locale??s())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Quit base ${e?.name}? Every agent in it and its tower quit.`,Ne=e=>`要關掉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。`,Pe=((e,t={})=>(t.locale??s())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Quit squad ${e?.name}`,Ie=e=>`關掉小隊 ${e?.name}`,Le=((e,t={})=>(t.locale??s())===`zh-TW`?Ie(e):Fe(e)),Re=e=>`Quit squad ${e?.name}? Every agent in it quits.`,ze=e=>`要關掉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,Be=((e,t={})=>(t.locale??s())===`zh-TW`?ze(e):Re(e)),Ve=e=>`Quit the tower ${e?.name}? The base's mains become members again.`,He=e=>`要關掉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Ue=((e,t={})=>(t.locale??s())===`zh-TW`?He(e):Ve(e)),We=e=>`Quit ${e?.name}`,Ge=e=>`關掉 ${e?.name}`,Ke=((e,t={})=>(t.locale??s())===`zh-TW`?Ge(e):We(e)),qe=e=>`Quit ${e?.name}? It quits pi and its pane closes.`,Je=e=>`要關掉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Ye=((e,t={})=>(t.locale??s())===`zh-TW`?Je(e):qe(e)),Xe=e=>`control tower · ${e?.state}`,Ze=e=>`塔台 · ${e?.state}`,Qe=((e,t={})=>(t.locale??s())===`zh-TW`?Ze(e):Xe(e)),$e=((e={},t={})=>(t.locale??s())===`zh-TW`?`圖示來自 game-icons.net(Lorc、Delapouite),CC BY 3.0。`:`Icons from game-icons.net by Lorc and Delapouite, CC BY 3.0.`),et=((e={},t={})=>(t.locale??s())===`zh-TW`?`文件`:`Documents`),tt=((e={},t={})=>(t.locale??s())===`zh-TW`?`總塔台`:`head tower`),nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`語言`:`Language`),rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`連線中`:`connecting`),it=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時`:`live`),at=((e={},t={})=>(t.locale??s())===`zh-TW`?`離線`:`offline`),ot=((e={},t={})=>(t.locale??s())===`zh-TW`?`重新連線中`:`reconnecting`),st=((e={},t={})=>(t.locale??s())===`zh-TW`?`正體中文`:`English`),ct=((e={},t={})=>(t.locale??s())===`zh-TW`?`位置`:`Location`),lt=e=>`${e?.name} finished`,ut=e=>`${e?.name} 已完成`,dt=((e,t={})=>(t.locale??s())===`zh-TW`?ut(e):lt(e)),ft=e=>`${e?.name} hit an error`,pt=e=>`${e?.name} 發生錯誤`,mt=((e,t={})=>(t.locale??s())===`zh-TW`?pt(e):ft(e)),ht=e=>`${e?.name} went idle`,gt=e=>`${e?.name} 轉為閒置`,_t=((e,t={})=>(t.locale??s())===`zh-TW`?gt(e):ht(e)),vt=e=>`${e?.name} joined`,yt=e=>`${e?.name} 加入`,bt=((e,t={})=>(t.locale??s())===`zh-TW`?yt(e):vt(e)),xt=e=>`${e?.name} left`,St=e=>`${e?.name} 離開`,Ct=((e,t={})=>(t.locale??s())===`zh-TW`?St(e):xt(e)),wt=e=>`${e?.name} lost its status`,Tt=e=>`${e?.name} 失去狀態`,Et=((e,t={})=>(t.locale??s())===`zh-TW`?Tt(e):wt(e)),Dt=e=>`${e?.name} is waiting on a question`,Ot=e=>`${e?.name} 正在等待回答`,kt=((e,t={})=>(t.locale??s())===`zh-TW`?Ot(e):Dt(e)),At=e=>`${e?.name} started working`,jt=e=>`${e?.name} 開始工作`,Mt=((e,t={})=>(t.locale??s())===`zh-TW`?jt(e):At(e)),Nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`已完成`:`finished`),Pt=((e={},t={})=>(t.locale??s())===`zh-TW`?`錯誤`:`error`),Ft=((e={},t={})=>(t.locale??s())===`zh-TW`?`閒置`:`idle`),It=((e={},t={})=>(t.locale??s())===`zh-TW`?`無狀態`:`no status`),Lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待回答`:`waiting on a question`),Rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`working`),zt=e=>`Monitor failed: ${e?.what}`,Bt=e=>`Monitor 出錯:${e?.what}`,Vt=((e,t={})=>(t.locale??s())===`zh-TW`?Bt(e):zt(e)),Ht=e=>`Monitor went quiet and stopped: ${e?.what}`,Ut=e=>`Monitor 太久沒輸出,已停止:${e?.what}`,Wt=((e,t={})=>(t.locale??s())===`zh-TW`?Ut(e):Ht(e)),Gt=((e={},t={})=>(t.locale??s(),`Logs`)),Kt=((e={},t={})=>(t.locale??s())===`zh-TW`?`從未`:`never`),qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`+新基地`:`+ New base`),Jt=((e={},t={})=>(t.locale??s())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),Yt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無警示`:`no alerts`),Xt=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),Zt=((e={},t={})=>(t.locale??s())===`zh-TW`?`尚無塔台`:`no tower yet`),Qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`思考中`:`thinking`),$t=e=>`Finished ${e?.note}`,en=e=>`完成了 ${e?.note}`,tn=((e,t={})=>(t.locale??s())===`zh-TW`?en(e):$t(e)),nn=e=>`Failed ${e?.note}`,rn=e=>`出錯了 ${e?.note}`,an=((e,t={})=>(t.locale??s())===`zh-TW`?rn(e):nn(e)),on=e=>`Waiting on you ${e?.note}`,sn=e=>`等你回答 ${e?.note}`,cn=((e,t={})=>(t.locale??s())===`zh-TW`?sn(e):on(e)),ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`+主智慧體`:`+ Main`),un=((e={},t={})=>(t.locale??s())===`zh-TW`?`+成員`:`+ Member`),dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`Outposts`),fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`手機`:`Phone`),pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),v=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉`:`Quit`),gn=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉塔台`:`Quit tower`),_n=e=>`Refused (${e?.status}).`,vn=e=>`已拒絕(${e?.status})。`,yn=((e,t={})=>(t.locale??s())===`zh-TW`?vn(e):_n(e)),bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒`:`Remind`),xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),Sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),Cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已關`:`Reminders off`),wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已開:分頁不在前景時,單位等你回答、完成或出錯會跳系統通知`:`Reminders on: while the page is in the background, a unit waiting on you, finishing, or failing raises a system notification`),Tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),En=((e={},t={})=>(t.locale??s())===`zh-TW`?`主智慧體`:`main`),Dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`成員`:`member`),On=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`outpost`),kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`未編入`:`unaligned`),An=((e={},t={})=>(t.locale??s(),`session`)),jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`子智慧體`:`subagent`),Mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`塔台`:`tower`),Nn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效`:`Sound`),Pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已關`:`Sounds off`),Fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已開`:`Sounds on`),In=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效:開關、音量與試聽`:`Sounds: on or off, volume, and a try`),Ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`▶ 試聽`:`▶ Try`),Rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音量`:`Volume`),zn=((e={},t={})=>(t.locale??s())===`zh-TW`?`智慧體`:`Agents`),Bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`基地`:`Bases`),Vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待中`:`Waiting`),Hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`Working`),Un=((e={},t={})=>(t.locale??s())===`zh-TW`?`狀態`:`States`),Wn=e=>`tab ${e?.label}`,Gn=e=>`分頁 ${e?.label}`,Kn=((e,t={})=>(t.locale??s())===`zh-TW`?Gn(e):Wn(e)),qn=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),Jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`網的總計`:`Net totals`),Yn=e=>`${e?.label} tower`,Xn=e=>`${e?.label} 塔台`,Zn=((e,t={})=>(t.locale??s())===`zh-TW`?Xn(e):Yn(e)),Qn=e=>`using ${e?.tool}`,$n=e=>`使用 ${e?.tool}`,er=((e,t={})=>(t.locale??s())===`zh-TW`?$n(e):Qn(e)),tr=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待變化…`:`Waiting for changes…`),nr=`sb-locale`;function rr(e){let t=/^zh\b/i.test(e)&&(/-(hant|tw|hk|mo)\b/i.test(e)?`zh-TW`:/-(hans|cn|sg|my)\b/i.test(e)?`zh-CN`:void 0);return p(e)??(t?p(t):void 0)??p(e.split(`-`)[0])}function ir(e,t){return p(e)??t.map(rr).find(Boolean)??`en`}var ar={brand_label:Ee,tagline:qn,totals_label:Jn,stat_bases:Bn,stat_agents:zn,stat_working:Hn,stat_waiting:Vn,alerts:fe,no_alerts:Yt,pair_button:fn,pair_title:pn,link_connecting:rt,location:ct,all_bases:pe,documents:et,net_log:Gt,states:Un,mark_working:Rt,mark_waiting:Lt,mark_idle:Ft,mark_done:Nt,mark_error:Pt,credit:$e,language:nt,waiting_changes:tr,new_base:qt};Object.keys(ar);function or(){let e=null;try{e=localStorage.getItem(nr)}catch{}let n=ir(e,navigator.languages??[navigator.language]);l(()=>n),document.documentElement.lang=n;let r={m:(e,t)=>e.textContent=t,mLabel:(e,t)=>e.setAttribute(`aria-label`,t),mTitle:(e,t)=>e.title=t,mEmpty:(e,t)=>e.dataset.empty=t};for(let e of document.querySelectorAll(`[data-m], [data-m-label], [data-m-title], [data-m-empty]`))for(let[t,n]of Object.entries(r))e.dataset[t]&&n(e,ar[e.dataset[t]]?.()??e.dataset[t]);let i=document.getElementById(`lang`);i.replaceChildren(...t.map(e=>new Option(st({},{locale:e}),e,!1,e===n))),i.onchange=()=>{try{localStorage.setItem(nr,i.value),location.reload()}catch{i.value=n}}}var sr={working:Mt,waiting:kt,idle:_t,done:dt,error:mt,unknown:Et};function cr(e){let t=new Map;for(let n of e.bases){n.tower&&t.set(`tower:${n.id}`,{name:Zn({label:n.label}),mark:n.tower.mark});for(let e of n.tabs.flatMap(e=>e.units))for(let n of[e,...e.subs])t.set(n.id,{name:n.name,mark:n.mark});for(let e of n.outposts)t.set(e.id,{name:e.label,mark:e.mark})}return t}function lr(e,t){if(!e)return[];let[n,r]=[cr(e),cr(t)],i=[];for(let[e,t]of r){let r=n.get(e);r?r.mark!==t.mark&&i.push({text:sr[t.mark]({name:t.name}),mark:t.mark}):i.push({text:bt({name:t.name}),mark:t.mark})}for(let[e,t]of n)r.has(e)||i.push({text:Ct({name:t.name}),mark:`idle`});return i}var ur=e=>e.unit??e.key,dr=e=>e===`waiting`||e===`error`?0:1;function fr(e,t){let n=new Map;for(let r of e.bases)for(let e of[...r.tower?[{...r.tower,role:`tower`}]:[],...[...r.tabs.flatMap(e=>e.units),...r.outside].flatMap(e=>[e,...e.subs])]){n.set(e.key,{key:e.key,ws:r.id,name:e.name,role:e.role,mark:e.mark,note:e.note,at:t,pending:e.pending,closed:!e.control||!!e.ended});for(let i of e.monitors??[])(i.status===`error`||i.status===`stale`)&&(a=>n.set(a,{key:a,unit:e.key,ws:r.id,name:e.name,role:e.role,mark:`error`,note:`monitor:${i.status}:${i.what}`,at:t}))(`${e.key}\u001fmonitor:${i.id}:${i.at}`)}return n}function pr(e,t){return[...t.values()].filter(t=>e?.get(t.key)?.mark!==t.mark&&(dr(t.mark)===0||e!==void 0&&t.mark===`done`))}var mr=3e4,hr=[`pointermove`,`pointerdown`,`keydown`,`wheel`,`touchstart`];function gr(e=document.documentElement){if(matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=Date.now(),n,r=()=>{let i=t+mr-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,mr))};for(let e of hr)addEventListener(e,i,{capture:!0,passive:!0});document.addEventListener(`visibilitychange`,()=>document.hidden||i()),i()}var _r=(...e)=>e.filter(e=>e!==!1&&e!=null),vr=(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(..._r(...n)),r}function br({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 xr(e,t){if(t||!e.length)return[];let n=document.createElement(`style`);return n.textContent=e.map((e,t)=>`@keyframes pk${t}{${br(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 Sr=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Cr=function(e,t){return new URL(e,t).href},wr={},Tr=function(e){return e.pathname.endsWith(`.css`)},Er=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},y=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=Cr(t,n);let r=s(t),i=Tr(r);return Er(wr,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`:Sr,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function b(e,t,n,r,i=!1){Object.assign(e.dataset,t),[e.hidden,e.textContent]=[i,n],r&&e.setAttribute(`aria-label`,r)}var Dr=(e,t)=>b(e,{key:t.key??``,name:t.name,role:t.role},v(),Ke({name:t.name}),!(t.control&&t.key)||t.role===`subagent`),Or=(e,t)=>b(e,{key:t?.key??``,name:t?.name??``,role:`tower`},gn(),void 0,!t?.control),kr=(e,t)=>b(e,{ws:t.id,name:t.label},v(),je({name:t.label})),Ar=(e,t,n)=>b(e,{ws:t.id,name:n.label,tab:n.id},v(),Le({name:n.label})),x=(e,t)=>new Promise(n=>{let r=document.createElement(`dialog`),i=document.createElement(`p`),a=document.createElement(`div`),o=(e,t,i)=>Object.assign(document.createElement(`button`),{type:`button`,className:t,textContent:e,onclick:()=>(r.close(),n(i))});[r.className,i.textContent,a.className]=[`sheet`,e,`sheet-row`],a.append(...t?[o(De(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(Oe(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()});function jr(e,{route:t,net:n,go:r}){let i=t();if(i.view===`map`)return;if(e.close===`base`)return void(i.ws===e.ws&&r({view:`map`}));let a=e=>e.flatMap(e=>[e.key,...a(e.subs)]),o=e.close===`tab`&&i.ws===e.ws?n()?.bases.find(t=>t.id===e.ws)?.tabs.find(t=>t.id===e.tab):void 0;i.view===`session`&&(e.close===`unit`?i.key===e.key:o&&a(o.units).includes(i.key))&&r({view:`workspace`,ws:i.ws})}function Mr(e){document.addEventListener(`click`,t=>{let n=t.target?.closest?.(`button[data-close]`),r=n?.dataset;n&&r&&(t.preventDefault(),x((r.close===`base`?Pe:r.close===`tab`?Be:r.role===`tower`?Ue:Ye)({name:r.name??``}),v()).then(t=>{t&&(n.toggleAttribute(`disabled`,!0),y(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/${r.close}`,r.close===`unit`?{key:r.key}:{workspace:r.ws,...r.tab&&{tab:r.tab}})).then(t=>t.ok?jr(r,e):x(t.body.reason??yn({status:t.status})),()=>x(Xt())).finally(()=>n.toggleAttribute(`disabled`,!1)))}))})}var Nr=e=>{try{return decodeURIComponent(e)}catch{return e}},S=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function C(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(Nr);if(r!==`w`||!i)return{view:`map`};if(a!==`s`||!o)return{view:`workspace`,ws:i};let s=new URLSearchParams(n).get(`at`);return s?{view:`session`,ws:i,key:o,at:s}:{view:`session`,ws:i,key:o}}var w=e=>e.view===`map`?``:e.view===`workspace`?`w/${S(e.ws)}`:`w/${S(e.ws)}/s/${S(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,Pr=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},T=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null;function Fr(e,t=new URL(document.baseURI).pathname){let n=()=>C(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>w(e)||`./`,go(n){let r=t+w(n);location.pathname+location.search!==r&&history.pushState(null,``,r),e(n)}};return addEventListener(`popstate`,()=>e(n())),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-route]`);!t||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),r.go(C(t.getAttribute(`data-route`))))}),r}var Ir={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},E={working:Rt,waiting:Lt,idle:Ft,done:Nt,error:Pt,unknown:It},Lr={main:En,member:Dn,subagent:jn,tower:Mn,outpost:On,outside:kn,session:An},Rr={thinking:Qt,idle:Ft,"waiting on a question":Lt,finished:Nt},zr=e=>Object.hasOwn(Lr,e)?Lr[e]():e,Br=e=>e===`waiting`||e===`error`,D=e=>{let t=new DOMParser().parseFromString(e.trim(),`text/html`).body.firstElementChild;if(!(t instanceof HTMLElement))throw Error(`bad template`);return document.importNode(t,!0)},O=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},k=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},A=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&vr(e,`flash`)},Vr=e=>(t=>(e.slice(8,t)===`stale`?Wt:Vt)({what:e.slice(t+1)}))(e.indexOf(`:`,8)),j=(e,t)=>e?e.startsWith(`tool:`)?er({tool:e.slice(5)}):e.startsWith(`monitor:`)?Vr(e):Object.hasOwn(Rr,e)?Rr[e]():e:E[t](),M=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,w(t)||`./`),e.setAttribute(`data-route`,w(t)))},Hr=(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`},Ur=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function Wr(e,t,n,r){A(e,n);let i=e.querySelector(`use`),a=`#i-${Ir[t]??`member`}`,o=r?.filter(e=>e.onScreen).length;i.getAttribute(`href`)!==a&&i.setAttribute(`href`,a),o?e.dataset.docs=String(o):delete e.dataset.docs}function N(e,t,n,r){let i=new Map;for(let t of e.children)!t.classList.contains(`leaving`)&&t.dataset.key&&i.set(t.dataset.key,t);let a=e.firstElementChild;for(let o of t){let t=i.get(o.id);for(t||(t=n(o),t.dataset.key=o.id,t.classList.add(`enter`),setTimeout(()=>t.classList.remove(`enter`),600)),i.delete(o.id);a?.classList.contains(`leaving`);)a=a.nextElementSibling;t===a?a=a.nextElementSibling:e.insertBefore(t,a),r(t,o)}for(let e of i.values())e.classList.add(`leaving`),setTimeout(()=>e.remove(),400)}var P=()=>D(`<div class="unit"><div class="card"><a class="hit"></a>${Ur}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button></div><div class="subs"></div></div>`);function F(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);M(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${j(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,Br(t.mark)),A(e,t.mark),Wr(e.querySelector(`.plate`),t.role,t.mark,t.docs),k(e,`.name`,t.name),k(e,`.role`,zr(t.role)),k(e,`.note`,j(t.note,t.mark)),Dr(e.querySelector(`:scope > .card > .quit-btn`),t),N(e.querySelector(`.subs`),t.subs??[],P,F)}function I(e,t,n){let r=t.tower?`main`:`member`;e.hidden=!!(n&&t.tower),e.dataset.open=r,e.dataset.ws=t.id,n&&(e.dataset.tab=n),e.textContent!==(r===`main`?ln():un())&&(e.textContent=r===`main`?ln():un())}var Gr=()=>D(`<section class="base"><header><div class="tower"><i class="sweep"></i><i class="pulse"></i><svg><use href="#i-tower"/></svg><b class="badge"></b></div><div class="title"><span class="crown"><svg><use href="#i-crown"/></svg>${tt()}</span><h2><a class="enter-base"></a></h2><p></p><button type="button" class="quit-btn tower-quit" data-close="unit" hidden></button></div><button type="button" class="quit-btn" data-close="base"></button></header><div class="spawn-btns"><button type="button" class="pair-btn"></button></div><div class="tabs"></div><div class="outposts" data-label="${dn()}"></div></section>`);function Kr(e,t){A(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),A(n,t.tower?.mark??`unknown`),k(e,`h2 a`,t.label),M(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),k(e,`.title p`,t.tower?Qe({state:E[t.tower.mark]()}):Zt()),I(e.querySelector(`.spawn-btns button`),t),kr(e.querySelector(`header > .quit-btn`),t),Or(e.querySelector(`.tower-quit`),t.tower),N(e.querySelector(`.tabs`),t.tabs,()=>D(`<div class="tab"><h3><span></span><button type="button" class="tab-add"></button><button type="button" class="quit-btn" data-close="tab"></button></h3><div class="units"></div></div>`),(e,n)=>{k(e,`h3 span`,Kn({label:n.label})),Ar(e.querySelector(`.quit-btn`),t,n),I(e.querySelector(`.tab-add`),t,n.id),N(e.querySelector(`.units`),n.units,P,F)}),N(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?Jt():void 0})),P,F)}function qr(e,t,n,r){let i=[...e.querySelectorAll(`.base:not(.leaving) .tower`)],a=e.querySelector(`.base.head:not(.leaving) .tower`),o=e.getBoundingClientRect(),s=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-o.x),Math.round(t.y+t.height/2-o.y)]},c=a?i.filter(e=>e!==a):[],l=c.map(e=>{let[[t,n],[r,i]]=[s(a),s(e)];return{x1:t,y1:n,x2:r,y2:i,mid:Math.round((t+r)/2)}}),u=l.map(({x1:e,y1:t,x2:n,y2:r,mid:i})=>`M${e} ${t}C${i} ${t} ${i} ${r} ${n} ${r}`),d=u.join(`|`);t.dataset.sig!==d&&(t.dataset.sig=d,t.replaceChildren(...u.map(e=>(t=>(t.setAttribute(`class`,`wire`),t.setAttribute(`d`,e),t))(document.createElementNS(`http://www.w3.org/2000/svg`,`path`)))),n.replaceChildren(...xr(l,r))),n.querySelectorAll(`.packet`).forEach((e,t)=>e.toggleAttribute(`data-live`,a.dataset.mark===`working`||c[t].dataset.mark===`working`))}function Jr(){let[e,t,n,r,i]=[O(`map`,HTMLElement),O(`bases`,HTMLElement),O(`links`,SVGSVGElement),O(`packets`,HTMLElement),O(`log`,HTMLElement)],a=matchMedia(`(prefers-reduced-motion: reduce)`).matches,o=()=>!e.hidden&&qr(e,n,r,a);return new ResizeObserver(o).observe(e),gr(),{layout:o,stats(e){let t=e.bases.flatMap(e=>e.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))),n=e=>String(t.filter(t=>!e||t.mark===e).length);for(let[t,r]of[[`s-bases`,String(e.bases.length)],[`s-agents`,n()],[`s-working`,n(`working`)],[`s-waiting`,n(`waiting`)]])O(t,HTMLElement).textContent=r},show(e){N(t,e.bases,Gr,Kr),requestAnimationFrame(o)},log(e){let t=new Date().toLocaleTimeString([],{hour12:!1});for(let n of e){let e=D(`<li><span></span><time></time></li>`);e.dataset.mark=n.mark,k(e,`span`,n.text),k(e,`time`,t),i.prepend(e)}for(;i.children.length>12;)i.lastElementChild.remove()},pause(e){document.documentElement.classList.toggle(`paused`,e)}}}var Yr=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,Xr=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,Zr={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:Xr,done:Yr},Qr=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,L=(e,t)=>{try{return localStorage.getItem(e)??t}catch{return t}},R=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function $r(e){let t=e=>document.getElementById(e),n=t(`remind`),r=t(`sound`),i=t(`sound-pop`),a=t(`sound-on`),o=t(`sound-vol`),s=t(`sound-vol-out`),c=typeof Notification<`u`,l=L(`sb.remind`,`1`)===`1`,u=L(`sb.sound`,`0`)===`1`,d=Math.min(100,Math.max(0,Number(L(`sb.volume`,`60`))||0)),f,p,m=new Map,h=()=>{let e=c?Notification.permission:`denied`;n.setAttribute(`aria-pressed`,String(l)),n.dataset.state=l?e===`granted`?`on`:e===`denied`?`blocked`:`ask`:`off`,n.title=c?l?e===`granted`?wn():e===`denied`?Sn():xn():Cn():Tn(),r.dataset.state=u?`on`:`off`,r.setAttribute(`aria-label`,u?Fn():Pn()),a.checked=u,o.value=s.value=String(d),p&&(p.gain.value=(d/100)**2)};n.textContent=bn(),r.textContent=Nn(),r.title=In(),t(`sound-on-label`).textContent=Nn(),t(`sound-vol-label`).textContent=Rn(),t(`sound-try`).textContent=Ln(),n.onclick=async()=>{l&&c&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):R(`sb.remind`,(l=!l)?`1`:`0`),h()},i.addEventListener(`toggle`,e=>e.newState===`open`&&Hr(i,r)),a.onchange=()=>{R(`sb.sound`,(u=a.checked)?`1`:`0`),h(),u&&g(`done`)},o.oninput=()=>(R(`sb.volume`,String(d=Number(o.value))),h()),o.onchange=()=>g(`done`),t(`sound-try`).onclick=()=>g(`done`);function g(e){f??=new AudioContext,p||((p=f.createGain()).connect(f.destination),h());let t=f,n=p;m.has(e)||m.set(e,fetch(Zr[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}]:[])(Qr(e)));if(n.length&&(u&&g([`waiting`,`error`,`done`].find(e=>n.some(t=>t.k===e))),l&&c&&Notification.permission===`granted`&&(document.hidden||!document.hasFocus())))for(let{a:t,k:r}of n){let n=new Notification(t.name,{body:{waiting:cn,error:an,done:tn}[r]({note:t.note??``}).trim(),tag:t.key,icon:document.querySelector(`link[rel="icon"]`)?.href});n.onclick=()=>(window.focus(),n.close(),e(t))}}}}var ei=45e3,ti=1e3,ni=3e4,ri=(e,t)=>Math.min(ni,ti*2**(e-1))*(.8+.4*t);function ii(e){try{return JSON.parse(e)}catch{return}}function ai(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(),ei),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,ri(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=ii(r);i&&e.onNet(i),o({problem:i?void 0:mn()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:ii(e)??hn()}),l())}),r=e.setTimeout(()=>u(),ei)};return{start(){o({state:`connecting`,attempt:0}),d()},resume(){let n=e.now()-i<2e3||a.lastContact!==void 0&&e.now()-a.lastContact<=2e4;t&&n||(o({attempt:0,state:a.state===`live`?`reconnecting`:a.state}),d())},restart:d,hide(){e.clearTimeout(n),n=void 0},stop(){c(),s()}}}or();var z=Jr(),B=e=>document.getElementById(e),oi=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):Kt(),si,ci,V,H,li={state:`connecting`,attempt:0},U={view:`map`},ui=!1,di,fi=``,W,pi,G=e=>W?e(W):void pi?.then(e);function mi(){pi??=y(async()=>{let{mountFocus:e}=await import(`./views-JgP8ffyr.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(W=e({data:Oi,restart:()=>$.restart(),openTile:J,embedTerminal:(e,t,n)=>new Promise(r=>q(i=>r(i.terminal.embed(e,t,n)))),online:()=>li.state===`live`}),W.show(U,U),V&&W.net(V),W))}var K,hi,q=e=>{if(K)return e(K);hi??=y(async()=>{let{mountPanels:e}=await import(`./layer-D1jSjgZJ.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>K=e({label:e=>V?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(Z?Z.data(e).latest():X(e,`?limit=12`))).items,post:e=>Z&&((t,n)=>Z.data(e).post(t,n)),stream:()=>fi,showTerminal:(e,t)=>(K?.stack.close(),W?.terminal(t),Q.go({view:`session`,ws:e,key:t}))})),hi.then(e)},J=(e,t)=>q(n=>n.tiles.open(e,t)),Y=document.querySelector(`link[rel="icon"]`),gi=Y&&decodeURIComponent(Y.href.slice(Y.href.indexOf(`,`)+1)),_i=0;function vi(e){let t=e.bases.flatMap(e=>[...e.tower?[e.tower]:[],...[...e.tabs.flatMap(e=>e.units),...e.outside].flatMap(e=>[e,...e.subs])]).filter(e=>e.mark===`waiting`||e.pending).length;if(!Y||!gi||t===_i)return;_i=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>`;Y.href=`data:image/svg+xml,${encodeURIComponent(t?gi.replace(`</svg>`,`${n}</svg>`):gi)}`}var yi;function bi(e){V=H=e,vi(e);let t=fr(e,Date.now());if(yi&&Ai.signal(pr(yi,t)),yi=t,document.hidden)return;z.stats(e);let n=pr(di,t);(n.length||K)&&q(e=>e.alerts(n,t)),di=t,z.log(lr(ci,e)),ci=e,G(t=>t.net(e)),U.view===`map`&&(z.show(e),si=e,H=void 0)}function xi(e){let t=U,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;U=e,e.view!==`map`&&mi(),B(`map`).hidden=e.view!==`map`,B(`legend`).hidden=e.view===`session`,G(r=>r.show(e,t,n)),e.view===`map`&&V&&V!==si&&(bi(V),requestAnimationFrame(z.layout)),ui&&T(e)!==T(t)&&$.restart()}function Si(e){li=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=B(`stage`).dataset.stale=String(t),B(`link`).dataset.state=e.state,B(`link-text`).textContent={connecting:rt,live:it,reconnecting:ot,offline:at}[e.state](),W&&V&&W.net(V),K?.stack.redraw();let n=B(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?ve({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?Te({attempt:e.attempt}):Se():xe({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=oi(e.lastContact),n.replaceChildren(`${r} ${he()} `,i,me())}function Ci(e,t){try{let n=JSON.parse(t);G(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var wi=document.querySelector(`meta[name="sb-build"]`)?.content,Ti=e=>!!(wi&&wi!==JSON.parse(e).build);function Ei(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 Di=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),X=(e,t=``)=>Di(`history/${encodeURIComponent(e)}${t}`),Z=void 0,Oi=e=>({older:t=>X(e,`?before=${encodeURIComponent(t)}`),latest:()=>X(e),entry:t=>Di(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),ki=()=>{let e=Ei(T(U));return e.listen(`history`,e=>Ci(`history`,e)),e.listen(`cards`,e=>Ci(`cards`,e)),e.listen(`hello`,e=>Ti(e)?location.reload():(fi=e,K?.terminal.hello())),e.listen(`mirror`,e=>K?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&C(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=di?.get(n.key);r&&(e.preventDefault(),q(e=>e.stack.show(r)))},!0);var Q=Fr(e=>xi(e)),Ai=$r(e=>Q.go({view:`session`,ws:e.ws,key:ur(e)})),$=ai({open:ki,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:bi,onStatus:Si}),ji=()=>$.resume();document.addEventListener(`visibilitychange`,()=>{if(z.pause(document.hidden),document.hidden)return $.hide();H&&bi(H),G(e=>e.wake()),ji()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(e.preventDefault(),!K?.stack.close()&&U.view!==`map`&&Q.go(Pr(U)))}),B(`pair`).hidden=location.hostname!==`127.0.0.1`,B(`pair`).addEventListener(`click`,()=>void y(async()=>{let{pairTile:e}=await import(`./pair-CHVcdx5H.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>J(e(),!0))),Mr({route:()=>U,net:()=>V,go:e=>Q.go(e)}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&y(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-DbHqsZJv.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,V?.bases??[]);r&&J(n(r),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&ji());Si(li),xi(Q.route()),$.start(),ui=!0;export{et as A,yn as C,Yt as D,Xt as E,s as F,Oe as M,De as N,Jt as O,pe as P,Vn as S,Zt as T,yr as _,I as a,ur as b,Wr as c,A as d,zr as f,y as g,Br as h,M as i,Qe as j,tt as k,Hr as l,k as m,E as n,O as o,N as p,Ur as r,j as s,Ir as t,D as u,vr as v,dn as w,Hn as x,dr as y};
@@ -0,0 +1,3 @@
1
+ import{t as e}from"./post-UHMNmNgA.js";import{i as t,n,t as r}from"./ask-C1mvQKbG.js";import{C as i,D as a,F as o,M as s,N as c,_ as l,b as u,c as d,d as f,f as p,i as m,l as h,m as g,o as _,p as v,r as y,s as b,u as x,v as S,y as C}from"./index-gWx1_-3G.js";var w=e=>`Alerts: ${e?.tally}`,T=e=>`警示:${e?.tally}`,E=((e,t={})=>(t.locale??o())===`zh-TW`?T(e):w(e)),D=e=>`Also queued: ${e?.tally}`,O=e=>`佇列中還有:${e?.tally}`,ee=((e,t={})=>(t.locale??o())===`zh-TW`?O(e):D(e)),te=((e={},t={})=>(t.locale??o())===`zh-TW`?`全部清除`:`Clear all`),k=((e={},t={})=>(t.locale??o())===`zh-TW`?`關閉文件`:`Close document`),A=e=>`Close ${e?.title}`,j=e=>`關閉 ${e?.title}`,ne=((e,t={})=>(t.locale??o())===`zh-TW`?j(e):A(e)),M=((e={},t={})=>(t.locale??o())===`zh-TW`?`連線中…`:`Connecting…`),N=((e={},t={})=>(t.locale??o())===`zh-TW`?`警示`:`alert`),re=((e={},t={})=>(t.locale??o())===`zh-TW`?`放大`:`Enlarge`),ie=((e={},t={})=>(t.locale??o())===`zh-TW`?`縮小`:`Shrink`),ae=((e={},t={})=>(t.locale??o())===`zh-TW`?`完成`:`Done`),P=((e={},t={})=>(t.locale??o())===`zh-TW`?`已完成的單位:點一列打開它的通訊並清掉,或全部清除`:`Finished units: a row opens its comms and clears it, or clear them all`),F=((e={},t={})=>(t.locale??o())===`zh-TW`?`符合寬度`:`Fit width`),oe=((e={},t={})=>(t.locale??o())===`zh-TW`?`無法取得紀錄。`:`History unavailable.`),I=((e={},t={})=>(t.locale??o())===`zh-TW`?`退格鍵`:`Backspace`),L=((e={},t={})=>(t.locale??o())===`zh-TW`?`下`:`Down`),R=((e={},t={})=>(t.locale??o(),`End`)),z=((e={},t={})=>(t.locale??o(),`Enter`)),B=((e={},t={})=>(t.locale??o(),`Escape`)),se=((e={},t={})=>(t.locale??o(),`Home`)),ce=((e={},t={})=>(t.locale??o())===`zh-TW`?`左`:`Left`),V=((e={},t={})=>(t.locale??o())===`zh-TW`?`下一頁`:`Page down`),H=((e={},t={})=>(t.locale??o())===`zh-TW`?`上一頁`:`Page up`),U=((e={},t={})=>(t.locale??o())===`zh-TW`?`右`:`Right`),W=((e={},t={})=>(t.locale??o(),`Shift+Tab`)),G=((e={},t={})=>(t.locale??o())===`zh-TW`?`空白鍵`:`Space`),le=((e={},t={})=>(t.locale??o(),`Tab`)),ue=((e={},t={})=>(t.locale??o())===`zh-TW`?`上`:`Up`),de=e=>`Keys for ${e?.name}`,fe=e=>`${e?.name} 的按鍵`,pe=((e,t={})=>(t.locale??o())===`zh-TW`?fe(e):de(e)),me=((e={},t={})=>(t.locale??o())===`zh-TW`?`最後一則通訊`:`Last transmission`),he=((e={},t={})=>(t.locale??o())===`zh-TW`?`稍後`:`Later`),ge=((e={},t={})=>(t.locale??o())===`zh-TW`?`已離開網`:`left the net`),_e=e=>`The mirror ended: ${e?.why}`,ve=e=>`鏡像已結束:${e?.why}`,ye=((e,t={})=>(t.locale??o())===`zh-TW`?ve(e):_e(e)),be=((e={},t={})=>(t.locale??o())===`zh-TW`?`等待輸入密碼時隱藏;請在終端機中輸入。`:`Hidden while it waits for a secret; type it in the terminal.`),xe=e=>`Live · ${e?.cols}×${e?.rows}`,Se=e=>`即時 · ${e?.cols}×${e?.rows}`,Ce=((e,t={})=>(t.locale??o())===`zh-TW`?Se(e):xe(e)),we=((e={},t={})=>(t.locale??o())===`zh-TW`?`還沒有訊息。`:`No messages yet.`),Te=((e={},t={})=>(t.locale??o())===`zh-TW`?`開啟通訊`:`Open comms`),Ee=((e={},t={})=>(t.locale??o())===`zh-TW`?`此分頁隱藏時暫停。`:`Paused while this tab is hidden.`),De=e=>`${e?.why} Open the terminal again to retry.`,Oe=e=>`${e?.why} 重新開啟終端機即可重試。`,ke=((e,t={})=>(t.locale??o())===`zh-TW`?Oe(e):De(e)),Ae=((e={},t={})=>(t.locale??o())===`zh-TW`?`送出 Enter`:`Send Enter`),je=((e={},t={})=>(t.locale??o())===`zh-TW`?`送出 Escape`:`Send Escape`),Me=e=>`Send ${e?.key}`,Ne=e=>`送出 ${e?.key}`,Pe=((e,t={})=>(t.locale??o())===`zh-TW`?Ne(e):Me(e)),Fe=((e={},t={})=>(t.locale??o())===`zh-TW`?`錯誤`:`error`),Ie=((e={},t={})=>(t.locale??o())===`zh-TW`?`已完成`:`finished`),Le=((e={},t={})=>(t.locale??o())===`zh-TW`?`已離開`:`gone`),Re=((e={},t={})=>(t.locale??o())===`zh-TW`?`提問`:`question`),ze=((e={},t={})=>(t.locale??o())===`zh-TW`?`更新`:`update`),Be=e=>`${e?.count} finished`,Ve=e=>`${e?.count} 個已完成`,He=((e,t={})=>(t.locale??o())===`zh-TW`?Ve(e):Be(e)),Ue=e=>{let n=t(`en`,e?.count,{},!0);return n===`one`?`${e?.count} needs you`:n===`other`?`${e?.count} need you`:`tally_need`},We=e=>`${e?.count} 個需要你`,Ge=((e,t={})=>(t.locale??o())===`zh-TW`?We(e):Ue(e)),Ke=e=>`Terminal of ${e?.name}, read only`,qe=e=>`${e?.name} 的終端機,唯讀`,Je=((e,t={})=>(t.locale??o())===`zh-TW`?qe(e):Ke(e)),Ye=e=>`Terminal · ${e?.name}`,Xe=e=>`終端機 · ${e?.name}`,Ze=((e,t={})=>(t.locale??o())===`zh-TW`?Xe(e):Ye(e)),Qe=((e={},t={})=>(t.locale??o())===`zh-TW`?`◉ 鍵盤直送中 · 點外面結束`:`◉ Keyboard goes to the pane · click outside to stop`),K=((e={},t={})=>(t.locale??o())===`zh-TW`?`點這裡後,鍵盤直接送進終端機(Ctrl、Alt、⌘ 組合鍵除外)`:`Click here and the keyboard goes straight to the terminal (except Ctrl, Alt, and ⌘ combinations)`),$e=((e={},t={})=>(t.locale??o())===`zh-TW`?`等待`:`waiting on`),et=[[[`esc`,`esc`,B],[`tab`,`tab`,le],[`up`,`↑`,ue],[`enter`,`enter`,z]],[[`shift+tab`,`⇧tab`,W],[`left`,`←`,ce],[`down`,`↓`,L],[`right`,`→`,U]],[[`space`,`space`,G],[`backspace`,`⌫`,I],[`home`,`home`,se],[`end`,`end`,R],[`pageup`,`pgup`,H],[`pagedown`,`pgdn`,V]]],tt=`123456789`.split(``),nt={ArrowUp:`up`,ArrowDown:`down`,ArrowLeft:`left`,ArrowRight:`right`,Enter:`enter`,Escape:`esc`,Backspace:`backspace`,Home:`home`,End:`end`,PageUp:`pageup`,PageDown:`pagedown`},rt=130,it=64,q=4e3,at=typeof navigator<`u`&&/Mac|iPhone|iPad/.test(navigator.platform),ot=e=>e.split(`+`).map(e=>e.length===1?e.toUpperCase():e[0].toUpperCase()+e.slice(1)).join(`+`);function st({name:e,state:t,post:r,stream:a,blip:o}){let s=[],u=l(`p`,{class:`pad-note`,role:`status`}),d=!1,f=([e,t,n])=>{let r=l(`button`,{type:`button`,class:`pad-key`,"data-key":e,"aria-label":n()},t);return r.onclick=t=>t.isTrusted&&(v.push({key:e}),x()),s.push(r),r},p=l(`details`,{class:`pad-digits`},l(`summary`,null,`1–9`),l(`div`,{class:`pad-row`},...tt.map(e=>f([e,e,()=>e])))),m=l(`div`,{class:`pad`,role:`group`,"aria-label":pe({name:e})},...et.map(e=>l(`div`,{class:`pad-row`},...e.map(f))),p,u),h=(e,t=``)=>(u.dataset.tone=t,u.replaceChildren(e)),g=(e,t,n)=>{let r=l(`button`,{type:`button`,class:`pad-yes`},e===`enter`?Ae():e===`esc`?je():Pe({key:ot(e)})),i=l(`button`,{type:`button`,class:`cmp-link`},c());r.onclick=t=>t.isTrusted&&!d&&void _({key:e},n),i.onclick=()=>h(``),u.dataset.tone=`ask`,u.replaceChildren(l(`span`,null,t),r,i),i.focus()};async function _(e,t){d=!0,D(),h(``),y=Date.now();try{let n=await r(`keys`,{...e,stream:a(),...t?{confirmed:t}:{}});n.status===409&&n.body.error===`confirm`&&typeof n.body.confirm==`string`&&`key`in e?(v=[],g(e.key,String(n.body.reason??``),n.body.confirm)):n.ok||(v=[],h(n.body.reason??i({status:n.status}),`error`))}catch{v=[],h(n(),`error`)}finally{d=!1,D(),x()}}let v=[],y=0,b;function x(){if(d||b||!v.length)return;let e=y+rt-Date.now();if(e>0)return void(b=setTimeout(()=>(b=void 0,x()),e));_(v.shift())}let S=e=>{if(e.ctrlKey===e.altKey||e.shiftKey)return;let t=e.ctrlKey?`ctrl`:`alt`,n=/^Key([A-Z])$/.exec(e.code)?.[1].toLowerCase();if(at||t!==`ctrl`||n!==`v`&&(n!==`c`||getSelection()?.isCollapsed))return n?`${t}+${n}`:{Enter:t===`alt`?`alt+enter`:void 0,Backspace:t===`alt`?`alt+backspace`:void 0,ArrowLeft:`${t}+left`,ArrowRight:`${t}+right`}[e.key]},C=e=>(t=>t===`live`||t===`hidden`&&e===`esc`)(t());function w(e){if(e.metaKey||e.isComposing||e.key===`Process`)return!1;let t=e.ctrlKey||e.altKey?S(e):e.key===`Tab`?e.shiftKey?`shift+tab`:`tab`:e.key===`Delete`?`delete`:nt[e.key];return t?(!C(t)||e.repeat&&(v.length||![`up`,`down`,`left`,`right`,`backspace`,`delete`].includes(t))||(v.push({key:t}),o?.(),x()),!0):!1}function T(e){let t=[...e.replace(/[\u0000-\u001f\u007f-\u009f]/g,``)];if(t.length&&C()){for(let e of t){let t=v.at(-1);t&&`text`in t&&[...t.text].length<it?t.text+=e:v.push({text:e})}o?.(),x()}}function E(e){let t=[...e.replace(/\r\n?/g,`
2
+ `).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g,``)];if(t.length&&C()){for(let e=0;e<t.length;e+=q)v.push({paste:t.slice(e,e+q).join(``)});o?.(),x()}}function D(){let e=t();for(let t of s)t.disabled=e===`off`||e===`hidden`&&t.dataset.key!==`esc`}return D(),{el:m,update:D,type:w,text:T,paste:E}}var J=[0,95,135,175,215,255],ct=120,lt=5e3,ut=3e3,Y=e=>Number.isInteger(e)&&e>=0&&e<=255,dt=e=>Y(e)?e<16?e:e<232?`rgb(${J[Math.floor((e-16)/36)]},${J[Math.floor((e-16)/6)%6]},${J[(e-16)%6]})`:`rgb(${8+10*(e-232)},${8+10*(e-232)},${8+10*(e-232)})`:void 0,ft=([e,t,n])=>[e,t,n].every(e=>Y(e))?`rgb(${e},${t},${n})`:void 0;function pt(e,t){let n={...e},r=t.split(`;`);for(let e=0;e<r.length;e++){let t=r[e].split(`:`).map(e=>e===``?0:Number(e)),i=t[0];if(i===38||i===48||i===58){let a=t.length>1?t[1]:Number(r[e+1]),o=t.length>1?t.slice(2):r.slice(e+2,e+(a===5?3:5)).map(Number);t.length===1&&(e+=a===5?2:a===2?4:1);let s=a===5?dt(o[0]):a===2?ft(o.slice(-3)):void 0;s!==void 0&&i!==58&&(n[i===38?`fg`:`bg`]=s)}else if(i===0)for(let e of Object.keys(n))delete n[e];else i===1||i===2?n[i===1?`b`:`d`]=!0:i===22?n.b=n.d=!1:i===3||i===23?n.i=i===3:i===4||i===21||i===24?n.u=i!==24&&t[1]!==0:i===7||i===27?n.v=i===7:i===9||i===29?n.s=i===9:i>=30&&i<=37||i>=90&&i<=97?n.fg=i-(i<90?30:82):i>=40&&i<=47||i>=100&&i<=107?n.bg=i-(i<100?40:92):(i===39||i===49)&&delete n[i===39?`fg`:`bg`]}return n}function mt(e){let t=[],n={},r=0,i=e=>{let r=e.replace(/\x1b(\[[0-?]*[ -/]*[@-~]?)?|[\u0000-\u001f\u007f-\u009f]/g,``);if(!r)return;let[i,a]=n.v?[n.bg??`z`,n.fg??`z`]:[n.fg,n.bg],o=[typeof i==`number`||i===`z`?`c${i}`:``,typeof a==`number`||a===`z`?`k${a}`:``,...[`b`,`d`,`i`,`u`,`s`].filter(e=>n[e]).map(e=>`t${e}`)].filter(Boolean).join(` `);t.push({text:r,cls:o,...typeof i==`string`&&i!==`z`&&{fg:i},...typeof a==`string`&&a!==`z`&&{bg:a}})};for(let t of e.matchAll(/\x1b\[([0-9;:]{0,64})m/g))i(e.slice(r,t.index)),n=pt(n,t[1]),r=t.index+t[0].length;return i(e.slice(r)),t}function X(e,t){let n=Math.min(Math.max(0,Number(t.rows)||0),ct);for(;e.children.length<n;)e.append(l(`div`,{class:`tr`}));for(;e.children.length>n;)e.lastElementChild.remove();for(let[r,i]of Array.isArray(t.set)?t.set:[])!Number.isInteger(r)||r<0||r>=n||typeof i!=`string`||e.children[r].replaceChildren(...mt(i).map(e=>{if(!e.cls&&!e.fg&&!e.bg)return e.text;let t=l(`span`,e.cls?{class:e.cls}:null,e.text);return e.fg&&(t.style.color=e.fg),e.bg&&(t.style.backgroundColor=e.bg),t}))}function Z({tiles:e,post:t,stream:r,pad:a}){let o=new Map,s,c=()=>{try{return String(JSON.parse(r()).stream??``)}catch{return``}},u=(e,t,n=``)=>(e.pad?.update(),(e.state.textContent!==t||e.state.dataset.tone!==n)&&(e.state.dataset.tone=n,e.state.textContent=t)),d=(e,t)=>(e.ended=!0,u(e,ke({why:t}),`error`)),f=(e,t,r=c())=>r&&void(e.queue=e.queue.then(()=>e.post(`mirror`,{stream:r,on:t}).then(n=>t&&!n.ok&&d(e,n.body.reason??i({status:n.status})),()=>t&&d(e,n())))),p=(e,t=Math.max(e.cols,...[...e.box.children].map(e=>e.textContent?.length??0)))=>e.box.style.fontSize=e.fit.getAttribute(`aria-pressed`)===`true`&&t?`${Math.max(6,Math.floor((e.scroll.clientWidth-20)/(t*.6)))}px`:``,m=e=>Date.now()-e.seen>ut,h=()=>(clearInterval(s),s=o.size&&!document.hidden?setInterval(()=>o.forEach(e=>(e.box.classList.toggle(`stale`,m(e)),e.pad?.update())),1e3):void 0);document.addEventListener(`visibilitychange`,()=>(h(),o.forEach(e=>{clearTimeout(e.away),document.hidden?e.away=setTimeout(()=>(e.parked=!0,f(e,!1),u(e,Ee())),lt):e.parked&&(e.parked=!1,f(e,!0))})));let g=(e,n)=>{let r={key:e,box:l(`div`,{class:`term`,role:`group`,"aria-label":Je({name:n})}),scroll:l(`div`,{class:`term-scroll`,tabindex:`0`}),state:l(`p`,{class:`term-state`,role:`status`},M()),fit:l(`button`,{type:`button`,class:`cmp-link`,"aria-pressed":`false`},F()),typing:l(`span`,{class:`term-typing`,hidden:``},Qe()),sink:l(`textarea`,{class:`term-sink`,rows:`1`,"aria-label":K(),autocomplete:`off`,autocapitalize:`off`,autocorrect:`off`,spellcheck:`false`}),post:t(e),cols:0,seen:0,parked:!1,first:!0,ended:!1,queue:Promise.resolve()};if(r.fit.onclick=()=>(r.fit.setAttribute(`aria-pressed`,String(r.fit.getAttribute(`aria-pressed`)!==`true`)),p(r),requestAnimationFrame(()=>r.scroll.scrollTop=r.scroll.scrollHeight)),r.scroll.append(r.box),globalThis.matchMedia?.(`(pointer: fine)`).matches){let{sink:e}=r,t=()=>(t=>(e.value=``,t&&r.pad?.text?.(t)))(e.value);r.scroll.title=K(),r.scroll.addEventListener(`click`,()=>getSelection()?.isCollapsed!==!1&&e.focus({preventScroll:!0})),e.addEventListener(`keydown`,e=>r.pad?.type?.(e)&&e.preventDefault()),e.addEventListener(`input`,e=>!e.isComposing&&t()),e.addEventListener(`compositionend`,t),e.addEventListener(`paste`,e=>(e.preventDefault(),r.pad?.paste?.(e.clipboardData?.getData(`text/plain`)??``))),e.addEventListener(`focus`,()=>{let t=r.scroll.getBoundingClientRect();Object.assign(e.style,{left:`${t.left+12}px`,top:`${Math.min(t.bottom,innerHeight)-28}px`}),r.typing.hidden=!1,r.scroll.classList.add(`typing`,`engage`)}),e.addEventListener(`blur`,()=>(r.typing.hidden=!0,r.scroll.classList.remove(`typing`,`engage`,`blip`),t())),r.scroll.addEventListener(`animationend`,e=>r.scroll.classList.remove(e.animationName===`term-engage`?`engage`:`blip`))}return new ResizeObserver(()=>p(r)).observe(r.scroll),o.set(e,r),f(r,!0),h(),r.pad=a?.({name:n,state:()=>r.parked||r.ended||m(r)?`off`:r.box.classList.contains(`hidden`)?`hidden`:`live`,post:r.post,stream:c,blip:()=>S(r.scroll,`blip`)}),r.tile={id:`term:${e}`,title:Ze({name:n}),icon:`i-comms`,body:()=>l(`div`,{class:`term-tile`},l(`div`,{class:`term-bar`},r.state,r.typing,r.fit),r.scroll,r.sink,r.pad?.el),closed:()=>(clearTimeout(r.away),f(r,!1),o.delete(e),h())}};return{open(t,n){let r=o.get(t);r?.ended&&(r.ended=!1,u(r,M()),f(r,!0)),e.open(r?.tile??g(t,n),!0)},embed(e,t,n){let r=o.get(e);r?.ended&&(r.ended=!1,u(r,M()),f(r,!0));let i=r?.tile??g(e,t);return n.replaceChildren(i.body()),()=>(i.closed?.(),n.replaceChildren())},hello:()=>o.forEach(e=>!e.parked&&!e.ended&&f(e,!0)),frame(e){let t;try{t=JSON.parse(e)}catch{return}let n=o.get(t.key);if(n){if(n.box.classList.toggle(`hidden`,!!(t.hidden||t.ended)),t.ended)return d(n,ye({why:t.ended}));if([n.seen,n.ended]=[Date.now(),!1],n.box.classList.remove(`stale`),t.hidden)return X(n.box,{key:n.key,rows:0}),u(n,be());X(n.box,t),(t.whole||t.cols&&t.cols!==n.cols)&&(n.cols=t.cols||n.cols,p(n)),u(n,Ce({cols:n.cols,rows:n.box.children.length}),`ok`),n.first&&t.whole&&(n.first=!1,requestAnimationFrame(()=>n.scroll.scrollTop=n.scroll.scrollHeight))}}}}var Q=(e,t)=>C(e.mark)-C(t.mark)||e.at-t.at,$=e=>{let t=e.filter(e=>C(e.mark)===0).length,n=e.length-t;return[t&&Ge({count:t}),n&&He({count:n})].filter(Boolean).join(` · `)};function ht(e){let t=[],n=[],r=()=>e.render(t.map(e=>e.alert),n),i=(i,a,o=!0)=>{let s=t.findIndex(e=>e.alert.key===i.key);if(s>=0&&!o)return;let c=s>=0?t.splice(s,1)[0]:{alert:i,back:a,raised:i.mark};!o&&t.length?t.splice(t.length-1,0,c):t.push(c),n=n.filter(e=>e.key!==i.key),r(),o&&e.enter(c.alert)};return{get open(){return t.map(e=>e.alert)},get queue(){return n},arrive(e){let i=t.find(t=>t.alert.key===e.key);if(i)[i.alert,i.raised]=[{...e,at:i.alert.at},e.mark];else{let t=n.find(t=>t.key===e.key);n=[...n.filter(t=>t.key!==e.key),t&&t.mark===e.mark?t:e].sort(Q)}r()},prune(e){n=n.filter(t=>(e=>e?.mark===t.mark&&!(C(t.mark)!==0&&e.closed))(e(t.key)));for(let n of t){let t=e(n.alert.key);n.alert=t?{...n.alert,...t,gone:void 0,at:n.alert.at}:{...n.alert,mark:`unknown`,note:void 0,pending:void 0,gone:!0}}r()},redraw:r,show:(t,n=!0)=>i(t,e.focused(),n),raise(n){let r=t.find(e=>e.alert.key===n);r&&r!==t.at(-1)&&i(r.alert,e.focused())},next(){let t=n.find(e=>C(e.mark)===0);t&&i(t,e.focused())},resolve(e){n=n.filter(t=>C(t.mark)===0||!e.includes(t.key)),r()},close(a=`close`){let o=t.pop();if(!o)return!1;let s=t.at(-1),c=a===`close`?n.find(e=>C(e.mark)===0):void 0;return a===`later`&&o.alert.mark===o.raised&&C(o.raised)===0&&(n=[...n,o.alert].sort(Q)),!s&&c?(i(c,o.back),!0):(r(),!e.restore(o.back)&&s&&e.enter(s.alert),!0)}}}var gt=`a, button, input, textarea, select, summary, label, [role=button]`;function _t(e){let t=[],n,r=()=>e.render(t,n);return{get tiles(){return t},get active(){return n},open(i,a=!0){if(!a&&t.length>=4&&!t.some(e=>e.id===i.id))return void i.closed?.();t.some(e=>e.id===i.id)||(t=[...t,i]).slice(0,-4).forEach(e=>e.closed?.()),t=t.slice(-4),(a||!t.some(e=>e.id===n))&&(n=i.id),r(),a&&e.enter(t.find(e=>e.id===i.id))},close(e){let i=t.findIndex(t=>t.id===e);i<0||(t[i].closed?.(),t=t.filter(t=>t.id!==e),n===e&&(n=(t[i]??t[i-1])?.id),r())},activate(e){n=e,r()}}}function vt(e){let t=new Set(e.flatMap(e=>e.kind===`result`&&e.callId?[e.callId]:[])),n=e.filter(e=>e.kind===`assistant`),r=n.at(-1),i=r?.tools?.find(e=>!t.has(e.id));return{said:(n.findLast(e=>e.text?.trim())?.text?.trim().split(`
3
+ `).filter(Boolean).at(-1))?.slice(0,280),pending:i&&`${i.name} · ${i.summary}`.slice(0,200),at:(r??e.findLast(e=>e.kind!==`result`))?.id}}var yt=()=>x(`<section class="dialog" role="dialog" aria-modal="false" tabindex="-1"><header><b class="tag">${N()}</b><span class="where"></span><button class="zoom" type="button"></button><button class="x" type="button" aria-label="${s()}">×</button></header><div class="who">${y}<div><h3></h3><p><em class="role"></em> <span class="state"></span></p></div></div><div class="intel"><h4>${me()}</h4><p class="said">…</p><p class="pending" hidden><b>${$e()}</b> <span></span></p></div><div class="ask-root"></div><footer><a class="go">${Te()}</a><button class="later" type="button">${he()}</button><span class="queued"></span></footer></section>`),bt=()=>x(`<li><a class="done-go">${y}<span><b class="name"></b><small></small></span></a></li>`),xt=()=>x(`<section class="tile" tabindex="-1"><header><svg><use href="#i-doc"/></svg><b></b><button class="x" type="button" aria-label="${k()}">×</button></header><div class="tile-body"></div></section>`);function St(t){let[n,i,o,s,c]=[_(`dock`,HTMLElement),_(`work`,HTMLElement),_(`tiles`,HTMLElement),_(`tile-tabs`,HTMLElement),_(`alerts`,HTMLButtonElement)],l=new Map,S=(e,t,n=l.get(t.key))=>{let r=e.dataset.gone===`true`;g(e,`.said`,n?.failed?oe():n?.said??we()),e.querySelector(`.pending`).hidden=!n?.pending||r,g(e,`.pending span`,n?.pending??``),m(e.querySelector(`.go`),r?void 0:{view:`session`,ws:t.ws,key:u(t),...n?.at&&{at:n.at}})},w=(e,r={said:`…`})=>{l.set(e.key,r),t.recent(u(e)).then(vt,()=>({failed:!0})).then(t=>{let i=l.get(e.key)===r&&(l.set(e.key,t),n.querySelector(`.dialog[data-key="${CSS.escape(e.key)}"]`));i&&S(i,e),e.mark===`done`&&N(L.queue)})},T=()=>n.classList.contains(`wide`),D=e=>{n.classList.toggle(`wide`,e);try{localStorage.setItem(`sb.dialog-wide`,e?`1`:`0`)}catch{}for(let e of n.querySelectorAll(`.zoom`))O(e)},O=e=>{e.textContent=T()?`⤡`:`⤢`,e.setAttribute(`aria-pressed`,String(T())),e.setAttribute(`aria-label`,T()?ie():re()),e.title=e.getAttribute(`aria-label`)};try{n.classList.toggle(`wide`,localStorage.getItem(`sb.dialog-wide`)===`1`)}catch{}let k=(e,n,i,a)=>{f(e,n.mark),O(e.querySelector(`.zoom`)),e.dataset.gone=String(!!n.gone),e.style.transform=i?`translateY(${-12*i}px) scale(${1-.06*i})`:``,e.style.opacity=String(Math.max(0,1-.3*i)),e.toggleAttribute(`inert`,i>0),e.setAttribute(`aria-label`,`${n.name}: ${b(n.note,n.mark)}`),d(e.querySelector(`.plate`),n.role,n.mark),g(e,`h3`,n.name),g(e,`.role`,p(n.role)),g(e,`.state`,n.gone?ge():b(n.note,n.mark)),g(e,`.where`,t.label(n.ws)),g(e,`.tag`,n.gone?Le():({waiting:Re,error:Fe,done:Ie}[n.mark]??ze)()),g(e,`.queued`,a.length?ee({tally:$(a)}):``),e.querySelector(`.later`).hidden=C(n.mark)!==0,l.has(n.key)||w(n),S(e,n);let o=F.get(e);o||F.set(e,o=r(e.querySelector(`.ask-root`),I(u(n)),void 0,()=>t.showTerminal(n.ws,u(n)))),o.update(n.pending,n.mark===`waiting`&&document.body.dataset.stale!==`true`)},[A,j,M]=[_(`done`,HTMLButtonElement),_(`done-pop`,HTMLElement),_(`done-list`,HTMLElement)],N=e=>{let n=e.filter(e=>C(e.mark)!==0);A.hidden=!n.length,A.textContent=`${ae()} ${n.length}`,A.title=P(),!n.length&&j.matches(`:popover-open`)&&j.hidePopover(),v(M,n.map(e=>({...e,id:e.key})),bt,(e,n)=>{let r=l.get(n.key);d(e.querySelector(`.plate`),n.role,n.mark),g(e,`.name`,n.name),g(e,`small`,`${t.label(n.ws)} · ${r?.said??b(n.note,n.mark)}`),m(e.querySelector(`.done-go`),{view:`session`,ws:n.ws,key:u(n),...r?.at&&{at:r.at}})})};_(`done-clear`,HTMLButtonElement).textContent=te(),j.setAttribute(`aria-label`,P()),j.addEventListener(`toggle`,e=>e.newState===`open`&&h(j,A)),M.addEventListener(`click`,e=>{let t=e.target.closest(`li[data-key]`);t&&queueMicrotask(()=>(L.resolve([t.dataset.key]),j.hidePopover()))}),_(`done-clear`,HTMLButtonElement).addEventListener(`click`,()=>(L.resolve(L.queue.map(e=>e.key)),j.hidePopover()));let F=new WeakMap,I=n=>t.post?.(n)??((t,r)=>e(`sessions/${encodeURIComponent(n)}/${t}`,r)),L=ht({render(e,t){v(n,e.map(e=>({...e,id:e.key})),yt,(n,r)=>k(n,r,e.length-1-e.findIndex(e=>e.key===r.key),t));let r=t.filter(e=>C(e.mark)===0),i=r[0];c.disabled=!i,c.dataset.mark=i?.mark??`unknown`,g(c,`#alert-count`,String(r.length)),c.title=r.length?E({tally:$(r)}):``,g(c,`#alert-text`,i?`${i.name} · ${b(i.note,i.mark)}`:a()),v(c.querySelector(`.faces`),r.slice(0,3).map(e=>({...e,id:e.key})),()=>x(y),(e,t)=>d(e,t.role,t.mark)),N(t)},enter:e=>n.querySelector(`[data-key="${CSS.escape(e.key)}"] .go`)?.focus(),focused:()=>document.activeElement instanceof HTMLElement&&document.activeElement!==document.body?document.activeElement:void 0,restore:e=>!!(e?.isConnected&&!e.closest(`[inert]`)&&(e.focus(),document.activeElement===e))});c.addEventListener(`click`,()=>L.next()),document.addEventListener(`click`,e=>{let t=t=>{let n=t.getBoundingClientRect();return e.clientX>=n.left&&e.clientX<=n.right&&e.clientY>=n.top&&e.clientY<=n.bottom},r=[...n.querySelectorAll(`.dialog:not(.leaving)`)],i=r.slice(0,-1).reverse().find(t);e.defaultPrevented||!i||!r.length||t(r.at(-1))||e.target?.closest?.(gt)||(e.preventDefault(),e.stopPropagation(),L.raise(i.dataset.key))},!0),n.addEventListener(`click`,e=>{let t=e.target;t.closest(`.zoom`)?D(!T()):t.closest(`.x`)?L.close():t.closest(`.later`)?L.close(`later`):t.closest(`.go`)&&queueMicrotask(()=>void L.close(`go`))});let R=0,z=()=>o.classList.toggle(`tabbed`,B.tiles.length>1&&i.clientWidth<460+B.tiles.length*400),B=_t({render(e,t){o.hidden=!e.length,v(o,e,e=>{let t=xt();return t.querySelector(`use`).setAttribute(`href`,`#${e.icon??`i-doc`}`),t.querySelector(`.x`).setAttribute(`aria-label`,ne({title:e.title})),t.querySelector(`.tile-body`).append(e.body()),t.querySelector(`.x`).addEventListener(`click`,()=>B.close(e.id)),t},(e,n)=>{g(e,`header b`,n.title),e.classList.toggle(`active`,n.id===t)}),v(s,e,()=>x(`<button type="button" class="tab-btn"></button>`),(e,n)=>{e.textContent=n.title,e.classList.toggle(`active`,n.id===t),e.onclick=()=>B.activate(n.id)}),o.prepend(s),e.length!==R&&(R=e.length,z())},enter:e=>requestAnimationFrame(()=>o.querySelector(`.tile[data-key="${CSS.escape(e.id)}"]`)?.focus())});return new ResizeObserver(z).observe(i),{tiles:B,stack:L,terminal:Z({tiles:B,post:I,stream:t.stream,pad:st}),alerts(e,t){for(let t of e)w(t),L.arrive(t);L.prune(e=>t.get(e))}}}export{St as mountPanels};
@@ -0,0 +1 @@
1
+ import{F as e,M as t,_ as n}from"./index-gWx1_-3G.js";import{t as r}from"./chat-BECfofMv.js";var i=((t={},n={})=>(n.locale??e())===`zh-TW`?`下一張`:`Next image`),a=((t={},n={})=>(n.locale??e())===`zh-TW`?`上一張`:`Previous image`),o=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片檢視`:`Image viewer`);function s(e,s){let c=s,l=n(`img`,{alt:``}),u=n(`span`,{class:`lb-count`}),d=(e,t,r,i)=>{let a=n(`button`,{type:`button`,class:e,"aria-label":t},r);return a.addEventListener(`click`,e=>(e.stopPropagation(),i())),a},f=t=>(c=(c+t+e.length)%e.length,g()),p=d(`lb-prev`,a(),`‹`,()=>f(-1)),m=d(`lb-next`,i(),`›`,()=>f(1)),h=n(`dialog`,{class:`lightbox`,"aria-label":o()},l,p,m,d(`lb-close`,t(),`×`,()=>h.close()),u);function g(){h.classList.remove(`zoom`),l.src=e[c],l.alt=r({n:c+1}),u.textContent=e.length>1?`${c+1} / ${e.length}`:``,p.hidden=m.hidden=e.length<2}l.addEventListener(`click`,e=>(e.stopPropagation(),h.classList.toggle(`zoom`))),h.addEventListener(`click`,()=>h.close()),h.addEventListener(`keydown`,t=>{e.length>1&&(t.key===`ArrowLeft`||t.key===`ArrowRight`)&&(t.preventDefault(),f(t.key===`ArrowLeft`?-1:1))}),h.addEventListener(`close`,()=>h.remove()),document.body.append(h),g(),h.showModal()}export{s as lightbox};
@@ -0,0 +1 @@
1
+ import{t as e}from"./post-UHMNmNgA.js";import{C as t,E as n,F as r,_ as i}from"./index-gWx1_-3G.js";var a=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在取得配對碼…`:`Asking for a pairing code…`),o=((e={},t={})=>(t.locale??r())===`zh-TW`?`新的配對碼`:`New code`),s=((e={},t={})=>(t.locale??r())===`zh-TW`?`配對 QR code`:`Pairing QR code`),c=((e={},t={})=>(t.locale??r())===`zh-TW`?`用以本機使用者身分登入 Tailscale 的手機掃描。只能用一次,十分鐘內有效。`:`Scan it with a phone signed in to Tailscale as this machine's user. It works once, within ten minutes.`),l=((e={},t={})=>(t.locale??r())===`zh-TW`?`配對手機`:`Pair a phone`),u=((e={},t={})=>(t.locale??r())===`zh-TW`?`遠端存取還沒開啟。要開啟,讓你 tailnet 上的手機可以開這個頁面嗎?只有用這台電腦的 Tailscale 帳號登入的裝置能配對,絕不使用 Funnel。`:`Remote access is off. Turn it on so a phone on your tailnet can open this page? Only devices signed in to Tailscale as this machine's user can pair; Funnel is never used.`),d=((e={},t={})=>(t.locale??r())===`zh-TW`?`開啟遠端存取`:`Turn on remote access`),f=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在開啟遠端存取…`:`Turning remote access on…`),p=`http://www.w3.org/2000/svg`;function m(e){let t=e.length,n=document.createElementNS(p,`svg`),r=document.createElementNS(p,`rect`),i=document.createElementNS(p,`path`);n.setAttribute(`viewBox`,`-4 -4 ${t+8} ${t+8}`),n.setAttribute(`class`,`qr`),n.setAttribute(`role`,`img`),n.setAttribute(`aria-label`,s());for(let[e,n]of Object.entries({x:`-4`,y:`-4`,width:String(t+8),height:String(t+8),fill:`#fff`}))r.setAttribute(e,n);return i.setAttribute(`d`,e.flatMap((e,t)=>[...e].flatMap((e,n)=>e===`1`?[`M${n} ${t}h1v1h-1z`]:[])).join(``)),i.setAttribute(`fill`,`#06101e`),n.append(r,i),n}function h(){return{id:`pair`,title:l(),body:()=>{let r=i(`div`,{class:`pair`}),s=i(`button`,{type:`button`,class:`later`},o()),l=i(`button`,{type:`button`,class:`pair-btn`},d()),p=(o=`remote/pair`,d=a())=>{r.replaceChildren(i(`p`,{class:`chat-empty`},d)),e(o,{}).then(e=>{let n=e.body.rows,a=String(e.body.url??``);if(e.body.error===`remote_off`)return r.replaceChildren(i(`p`,null,u()),l);if(!e.ok||!Array.isArray(n))return r.replaceChildren(i(`p`,null,e.body.reason??t({status:e.status})),o===`remote/on`?l:s);r.replaceChildren(m(n.map(String)),i(`p`,null,c()),i(`p`,null,i(`code`,null,new URL(a).host)),s)},()=>r.replaceChildren(i(`p`,null,n()),s))};return l.onclick=()=>p(`remote/on`,f()),s.onclick=()=>p(),p(),r}}}export{h as pairTile};
@@ -0,0 +1 @@
1
+ import{t as e}from"./post-UHMNmNgA.js";import{C as t,E as n,F as r,_ as i}from"./index-gWx1_-3G.js";var a=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在讀取資料夾…`:`Reading folders…`),o=((e={},t={})=>(t.locale??r())===`zh-TW`?`基地名稱`:`Base name`),s=((e={},t={})=>(t.locale??r())===`zh-TW`?`第一句指令(選填)`:`First message (optional)`),c=((e={},t={})=>(t.locale??r())===`zh-TW`?`只顯示前 500 個資料夾。`:`Showing the first 500 folders.`),l=((e={},t={})=>(t.locale??r())===`zh-TW`?`這裡沒有資料夾。`:`No folders here.`),u=((e={},t={})=>(t.locale??r())===`zh-TW`?`資料夾:`:`Folder:`),d=((e={},t={})=>(t.locale??r())===`zh-TW`?`上一層`:`Up`),f=((e={},t={})=>(t.locale??r())===`zh-TW`?`在這裡開基地`:`Open the base here`),p=((e={},t={})=>(t.locale??r())===`zh-TW`?`開新基地`:`New base`),m=((e={},t={})=>(t.locale??r())===`zh-TW`?`在這裡開主智慧體`:`Open the main here`),h=e=>`New main agent in ${e?.base}`,g=e=>`在 ${e?.base} 開新的主智慧體`,_=((e,t={})=>(t.locale??r())===`zh-TW`?g(e):h(e)),v=((e={},t={})=>(t.locale??r())===`zh-TW`?`加入成員`:`Add the member`),y=e=>`New member in squad ${e?.tab}`,b=e=>`在小隊 ${e?.tab} 加一位成員`,x=((e,t={})=>(t.locale??r())===`zh-TW`?b(e):y(e)),S=e=>`New member in ${e?.base}`,C=e=>`在 ${e?.base} 加一位成員`,w=((e,t={})=>(t.locale??r())===`zh-TW`?C(e):S(e)),T=((e={},t={})=>(t.locale??r())===`zh-TW`?`基地已經開好,第一位成員已就位。`:`The base is open with its first member.`),E=e=>`The main is open in a new squad of ${e?.base}.`,D=e=>`已在 ${e?.base} 的新小隊開好主智慧體。`,O=((e,t={})=>(t.locale??r())===`zh-TW`?D(e):E(e)),k=e=>`The member is open in ${e?.base}.`,A=e=>`已在 ${e?.base} 加好成員。`,j=((e,t={})=>(t.locale??r())===`zh-TW`?A(e):k(e)),M=((e={},t={})=>(t.locale??r())===`zh-TW`?`開啟中…最多可能要一分鐘。`:`Opening… this can take up to a minute.`);function N(r){let h=r.kind===`base`?void 0:r.base,g=r.kind===`base`?void 0:r.tab,y=r.kind===`base`?p():r.kind===`main`?_({base:h.label}):g?x({tab:g.label}):w({base:h.label});return{id:`open-${r.kind}-${h?.id??``}-${g?.id??``}`,title:y,body:()=>{let p=i(`code`,{class:`spawn-path`}),_=i(`button`,{type:`button`,class:`later`},d()),y=i(`div`,{class:`spawn-dirs`}),b=i(`p`,{class:`chat-empty`}),x=i(`button`,{type:`button`,class:`go`},r.kind===`base`?f():r.kind===`main`?m():v()),S=i(`textarea`,{rows:`3`,placeholder:s()}),C=i(`input`,{type:`text`,maxlength:`64`,placeholder:o()}),w,E=!1;C.addEventListener(`input`,()=>E=!0);let D=e=>b.textContent=e,k=r=>{D(a()),e(`dirs`,r?{path:r}:h?{workspace:h.id,...g&&{tab:g.id}}:{}).then(e=>{if(!e.ok)return D(e.body.reason??t({status:e.status}));w=e.body;let n=w.path===w.home?`~`:w.path.startsWith(`${w.home}/`)?`~/${w.path.slice(w.home.length+1)}`:w.path;p.textContent=n,_.disabled=!w.parent,y.replaceChildren(...w.dirs.map(e=>{let t=i(`button`,{type:`button`,class:`spawn-dir`},`${e}/`);return t.onclick=()=>k(`${w.path}/${e}`),t})),E||(C.value=w.path===w.home?``:w.path.slice(w.path.lastIndexOf(`/`)+1)),D(w.dirs.length?w.truncated?c():``:l())},()=>D(n()))};return _.onclick=()=>w?.parent&&k(w.parent),x.onclick=()=>{if(!w)return;let i=w.path,a=S.value,o=r.kind===`base`?{dir:i,label:C.value,prompt:a}:{workspace:h.id,...g&&{tab:g.id},dir:i,prompt:a};x.disabled=!0,D(M()),e(`open/${r.kind}`,o).then(e=>{if(!e.ok)return D(e.body.reason??t({status:e.status}));S.value=C.value=``,E=!1,D(r.kind===`base`?T():r.kind===`main`?O({base:h.label}):j({base:h.label}))},()=>D(n())).finally(()=>x.disabled=!1)},k(),i(`div`,{class:`spawn`},i(`p`,{class:`spawn-at`},u(),` `,p,` `,_),y,b,...r.kind===`base`?[C]:[],S,x)}}}function P(e,t){let n=e.dataset.open;if(n===`base`)return{kind:n};let r=t.find(t=>t.id===e.dataset.ws),i=e.dataset.tab?r?.tabs.find(t=>t.id===e.dataset.tab):void 0;if(!(n!==`main`&&n!==`member`||!r||e.dataset.tab&&!i))return{kind:n,base:{id:r.id,label:r.label},...i&&{tab:{id:i.id,label:i.label}}}}export{P as openingOf,N as spawnTile};
@@ -0,0 +1,7 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-DI9km3B9.css"])))=>i.map(i=>d[i]);
2
+ import{r as e,t}from"./post-UHMNmNgA.js";import{i as n,n as r,r as i,t as a}from"./ask-C1mvQKbG.js";import{A as o,C as s,E as c,F as l,M as u,N as d,O as f,P as p,S as m,T as h,_ as g,a as _,c as v,d as y,f as b,g as x,h as S,i as C,j as w,k as T,m as E,n as D,p as O,r as k,s as A,u as j,v as M,w as N,x as P}from"./index-gWx1_-3G.js";var ee=((e={},t={})=>(t.locale??l())===`zh-TW`?`附加檔案`:`Attach files`),F=((e={},t={})=>(t.locale??l())===`zh-TW`?`返回`:`Back`),I=((e={},t={})=>(t.locale??l())===`zh-TW`?`它在等待對話框:請在上方或它的終端機中回答。`:`It waits on a dialog: answer it above, or in its terminal.`),L=((e={},t={})=>(t.locale??l())===`zh-TW`?`它在等待對話框;請在它的終端機中回答。`:`It waits on a dialog; answer it in its terminal.`),R=((e={},t={})=>(t.locale??l())===`zh-TW`?`這個 session 已不再即時;紀錄仍可閱讀。`:`This session is no longer live; its history stays readable.`),te=((e={},t={})=>(t.locale??l())===`zh-TW`?`這個單位沒有即時的 pi 窗格,無處可輸入。`:`No live pi pane backs this unit, so there is nothing to type into.`),ne=((e={},t={})=>(t.locale??l())===`zh-TW`?`串流中斷;要等它恢復才能送出。`:`The stream is down; sending waits for it to come back.`),re=((e={},t={})=>(t.locale??l())===`zh-TW`?`頻道關閉`:`channel closed`),ie=((e={},t={})=>(t.locale??l())===`zh-TW`?`頻道開啟`:`channel open`),ae=((e={},t={})=>(t.locale??l())===`zh-TW`?`指令`:`Commands`),oe=((e={},t={})=>(t.locale??l())===`zh-TW`?`通訊`:`comms`),se=((e={},t={})=>(t.locale??l())===`zh-TW`?`已派出`:`Dispatched`),ce=((e={},t={})=>(t.locale??l())===`zh-TW`?`無法取得:已不在它的 session 中開啟。`:`Unavailable: no longer open in its session.`),le=((e={},t={})=>(t.locale??l())===`zh-TW`?`已不在清單中:已在它的 session 中關閉,或 session 已結束。`:`No longer listed: closed in its session, or the session ended.`),ue=((e={},t={})=>(t.locale??l())===`zh-TW`?`已更新:此區塊顯示時會載入新版本。`:`Updated: the new version loads when this tile shows.`),de=((e={},t={})=>(t.locale??l())===`zh-TW`?`超過轉送上限:請在終端機中閱讀。`:`More than the relay carries: read them in the terminal.`),fe=e=>`${e?.command} ends this session or switches its pane to another one.`,pe=e=>`${e?.command} 會結束這個 session,或把它的窗格切換到別的 session。`,me=((e,t={})=>(t.locale??l())===`zh-TW`?pe(e):fe(e)),he=e=>{let t=n(`en`,e?.count,{},!0);return t===`one`?`${e?.count} entry`:t===`other`?`${e?.count} entries`:`entry_count`},ge=e=>`${e?.count} 筆`,_e=((e,t={})=>(t.locale??l())===`zh-TW`?ge(e):he(e)),ve=e=>`${e?.name} is larger than 20 MB.`,ye=e=>`${e?.name} 超過 20 MB。`,be=((e,t={})=>(t.locale??l())===`zh-TW`?ye(e):ve(e)),xe=((e={},t={})=>(t.locale??l())===`zh-TW`?`做完再送`:`After this`),Se=((e={},t={})=>(t.locale??l())===`zh-TW`?`資料`:`Info`),Ce=((e={},t={})=>(t.locale??l())===`zh-TW`?`載入中…`:`Loading…`),we=((e={},t={})=>(t.locale??l())===`zh-TW`?`這個工作區不在網中。`:`This workspace is not part of the net.`),Te=((e={},t={})=>(t.locale??l())===`zh-TW`?`訊息`:`Message`),Ee=e=>`exit ${e?.code}`,De=e=>`結束碼 ${e?.code}`,Oe=((e,t={})=>(t.locale??l())===`zh-TW`?De(e):Ee(e)),ke=e=>`${e?.count} lines`,Ae=e=>`${e?.count} 行`,je=((e,t={})=>(t.locale??l())===`zh-TW`?Ae(e):ke(e)),Me=((e={},t={})=>(t.locale??l())===`zh-TW`?`完成`:`finished`),Ne=((e={},t={})=>(t.locale??l())===`zh-TW`?`出錯`:`failed`),Pe=((e={},t={})=>(t.locale??l())===`zh-TW`?`執行中`:`running`),Fe=((e={},t={})=>(t.locale??l())===`zh-TW`?`太久沒輸出,已停止`:`no output, stopped`),Ie=((e={},t={})=>(t.locale??l())===`zh-TW`?`已停止`:`stopped`),Le=e=>`${e?.count} failed`,Re=e=>`${e?.count} 個出錯`,ze=((e,t={})=>(t.locale??l())===`zh-TW`?Re(e):Le(e)),Be=e=>`${e?.count} running`,Ve=e=>`${e?.count} 個執行中`,He=((e,t={})=>(t.locale??l())===`zh-TW`?Ve(e):Be(e)),Ue=((e={},t={})=>(t.locale??l())===`zh-TW`?`Monitor`:`Monitors`),We=((e={},t={})=>(t.locale??l())===`zh-TW`?`新的 session`:`the new session`),Ge=((e={},t={})=>(t.locale??l())===`zh-TW`?`無頻道`:`no channel`),Ke=((e={},t={})=>(t.locale??l())===`zh-TW`?`不在網中`:`not in the net`),qe=((e={},t={})=>(t.locale??l())===`zh-TW`?`已不再即時;紀錄在十分鐘內仍可閱讀。`:`No longer live; its history stays readable for ten minutes.`),Je=((e={},t={})=>(t.locale??l())===`zh-TW`?`不在網中(可能已在十分鐘前結束)。`:`Not in the net (it may have ended more than ten minutes ago).`),Ye=((e={},t={})=>(t.locale??l())===`zh-TW`?`不在終端機畫面上`:`off screen in the terminal`),Xe=e=>`${e?.reason} · off screen`,Ze=e=>`${e?.reason} · 不在畫面上`,Qe=((e,t={})=>(t.locale??l())===`zh-TW`?Ze(e):Xe(e)),$e=((e={},t={})=>(t.locale??l())===`zh-TW`?`在新分頁開啟`:`Open in a new tab`),et=((e={},t={})=>(t.locale??l())===`zh-TW`?`正在開啟頻道…`:`Opening the channel…`),tt=((e={},t={})=>(t.locale??l())===`zh-TW`?`網外`:`Outside the net`),nt=((e={},t={})=>(t.locale??l())===`zh-TW`?`未編入的 pi 窗格`:`unaligned pi panes`),rt=e=>`Message ${e?.name}`,it=e=>`傳訊息給 ${e?.name}`,at=((e,t={})=>(t.locale??l())===`zh-TW`?it(e):rt(e)),ot=((e={},t={})=>(t.locale??l())===`zh-TW`?`排隊中・做完再送`:`Queued · follow-up`),st=((e={},t={})=>(t.locale??l())===`zh-TW`?`排隊中・插話`:`Queued · steer`),ct=((e={},t={})=>(t.locale??l())===`zh-TW`?`重新載入`:`Reload`),lt=((e={},t={})=>(t.locale??l())===`zh-TW`?`送出`:`Send`),ut=e=>`Send ${e?.command}`,dt=e=>`送出 ${e?.command}`,ft=((e,t={})=>(t.locale??l())===`zh-TW`?dt(e):ut(e)),pt=((e={},t={})=>(t.locale??l())===`zh-TW`?`已照原文送出;你的修改留在這裡,尚未送出。`:`Sent as it was; your edits stayed here, unsent.`),mt=e=>`${e?.display}, shown by ${e?.unit}`,ht=e=>`${e?.display},由 ${e?.unit} 顯示`,gt=((e,t={})=>(t.locale??l())===`zh-TW`?ht(e):mt(e)),_t=((e={},t={})=>(t.locale??l())===`zh-TW`?`基地`:`base`),vt=((e={},t={})=>(t.locale??l())===`zh-TW`?`上下文`:`context`),yt=((e={},t={})=>(t.locale??l())===`zh-TW`?`目錄`:`directory`),bt=((e={},t={})=>(t.locale??l())===`zh-TW`?`啟動者`:`launcher`),xt=((e={},t={})=>(t.locale??l())===`zh-TW`?`模型`:`model`),St=((e={},t={})=>(t.locale??l())===`zh-TW`?`小隊`:`squad`),Ct=((e={},t={})=>(t.locale??l())===`zh-TW`?`無法讀取`:`unreadable`),wt=e=>`squad ${e?.label}`,Tt=e=>`小隊 ${e?.label}`,Et=((e,t={})=>(t.locale??l())===`zh-TW`?Tt(e):wt(e)),Dt=((e={},t={})=>(t.locale??l())===`zh-TW`?`小隊`:`Squads`),Ot=((e={},t={})=>(t.locale??l())===`zh-TW`?`停止`:`Stop`),kt=((e={},t={})=>(t.locale??l())===`zh-TW`?`要停止目前的任務嗎?佇列中的訊息會退回它的終端機編輯器。`:`Stop the current task? Queued messages go back to its terminal editor.`),At=((e={},t={})=>(t.locale??l())===`zh-TW`?`現在:`:`Now:`),jt=((e={},t={})=>(t.locale??l())===`zh-TW`?`已完成`:`done`),Mt=((e={},t={})=>(t.locale??l())===`zh-TW`?`未完成`:`not done`),Nt=((e={},t={})=>(t.locale??l())===`zh-TW`?`終端機`:`Terminal`),Pt=e=>`Todos ${e?.done}/${e?.total}`,Ft=e=>`待辦 ${e?.done}/${e?.total}`,It=((e,t={})=>(t.locale??l())===`zh-TW`?Ft(e):Pt(e)),Lt=((e={},t={})=>(t.locale??l())===`zh-TW`?`全部完成`:`All done`),Rt=e=>`${e?.count} tokens`,zt=e=>`${e?.count} tokens`,Bt=((e,t={})=>(t.locale??l())===`zh-TW`?zt(e):Rt(e)),Vt=((e={},t={})=>(t.locale??l())===`zh-TW`?`文字超過 16 KB,請縮短。`:`The text is longer than 16 KB; shorten it.`),Ht=((e={},t={})=>(t.locale??l())===`zh-TW`?`下屬`:`Under this tower`),Ut=e=>{let t=n(`en`,e?.count,{},!0);return t===`one`?`${e?.count} unit`:t===`other`?`${e?.count} units`:`unit_count`},Wt=e=>`${e?.count} 個單位`,Gt=((e,t={})=>(t.locale??l())===`zh-TW`?Wt(e):Ut(e)),Kt=((e={},t={})=>(t.locale??l())===`zh-TW`?`單位檔案`:`unit dossier`),qt=((e={},t={})=>(t.locale??l())===`zh-TW`?`單位`:`Units`),z=((e={},t={})=>(t.locale??l())===`zh-TW`?`未確認。再次送出前請先查看終端機。`:`Not confirmed. Check the terminal before sending again.`),Jt=((e={},t={})=>(t.locale??l())===`zh-TW`?`上傳中…`:`Uploading…`),Yt=((e={},t={})=>(t.locale??l())===`zh-TW`?`等待網的資料…`:`Waiting for the net…`),Xt=((e={},t={})=>(t.locale??l())===`zh-TW`?`原文已送到 session;這裡是你編輯過、尚未送出的副本。`:`The original already went to the session; what is here is your edited copy, unsent.`),B=(e,t,n)=>({tag:e,kids:t,attrs:n}),Zt=/^(?:https?:\/\/|mailto:)[^\s\u0000-\u001f]+$/i,Qt=(e,t)=>B(`a`,t,{href:e,rel:`noopener noreferrer`,target:`_blank`}),$t=/(`+)([^`]|[^`][^]{0,1000}?[^`])\1(?!`)|\*\*([^*][^]{0,1000}?)\*\*|~~([^~][^]{0,1000}?)~~|\*([^\s*][^*]{0,500}?)\*|(?<![\w])_([^\s_][^_]{0,500}?)_(?![\w])|\[([^\]]{1,500})\]\(([^)\s]{1,2000})(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)\]]+)/g;function V(e){let t=[],n=0;for(let r of e.matchAll($t))r.index>n&&t.push(e.slice(n,r.index)),n=r.index+r[0].length,r[2]===void 0?r[3]===void 0?r[4]===void 0?r[5]!==void 0||r[6]!==void 0?t.push(B(`em`,V(r[5]??r[6]))):r[7]===void 0?t.push(Qt(r[9],[r[9]])):t.push(Zt.test(r[8])?Qt(r[8],V(r[7])):r[0]):t.push(B(`del`,V(r[4]))):t.push(B(`strong`,V(r[3]))):t.push(B(`code`,[r[2]]));return n<e.length&&t.push(e.slice(n)),t}var en=e=>e.search(/\S/),H=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,tn=/^\s*([-*_])(\s*\1){2,}\s*$/,nn=/^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?\s*$/,rn=e=>e.trim().replace(/^\|/,``).replace(/\|$/,``).split(`|`).map(e=>e.trim()),an=(e,t)=>/^\s*(`{3,}|~{3,}|#{1,6}\s|>)/.test(e)||tn.test(e)||H.test(e)||e.includes(`|`)&&t!==void 0&&nn.test(t)&&t.includes(`-`);function U(e,t=0,n=e.replace(/\r\n?/g,`
3
+ `).split(`
4
+ `),r=n.map(en)){if(t>=16)return[B(`p`,[n.join(`
5
+ `)])];let i=[];for(let e=0;e<n.length;){let a=n[e],o=n[e+1],s=a.match(/^\s*(`{3,}|~{3,})\s*([\w+-]*)/),c=a.match(/^\s*(#{1,6})\s+(.*?)\s*#*\s*$/),l=a.match(H);if(r[e]<0)e++;else if(s){let t=[];for(e++;e<n.length&&!n[e].trim().startsWith(s[1]);e++)t.push(n[e]);e++,i.push(B(`pre`,[B(`code`,[t.join(`
6
+ `)],s[2]?{"data-lang":s[2]}:void 0)]))}else if(c)i.push(B(`h${c[1].length}`,V(c[2]))),e++;else if(tn.test(a))i.push(B(`hr`,[])),e++;else if(/^\s*>/.test(a)){let r=[];for(;e<n.length&&/^\s*>/.test(n[e]);e++)r.push(n[e].replace(/^\s*> ?/,``));i.push(B(`blockquote`,U(``,t+1,r,r.map(en))))}else if(a.includes(`|`)&&o!==void 0&&nn.test(o)&&o.includes(`-`)){let t=[];for(e+=2;e<n.length&&n[e].trim()&&n[e].includes(`|`);e++)t.push(rn(n[e]));i.push(B(`table`,[B(`thead`,[B(`tr`,rn(a).map(e=>B(`th`,V(e))))]),B(`tbody`,t.map(e=>B(`tr`,e.map(e=>B(`td`,V(e))))))]))}else if(l){let a=l[1].length,o=[],s=a+2;for(;e<n.length;){let i=n[e].match(H);if(!i||i[1].length!==a||/\d/.test(i[2])!==/\d/.test(l[2]))break;let c=[i[3]],u=i[3].match(/^\[([ xX])\]\s+(.*)$/);u&&(c[0]=u[2]);let d=[en(c[0])];for(e++;e<n.length&&r[e]>a;e++){let t=n[e],i=0;for(;i<s&&t.charCodeAt(i)===32;)i++;c.push(i?t.slice(i):t),d.push(r[e]-i)}let f=U(``,t+1,c,d),p=f[0],m=u?.[1]!==` `;u&&(typeof p==`object`&&p.tag===`p`?p.kids:f).unshift(B(`i`,m?[`✓`]:[],{class:`check`,"data-done":String(m),"aria-label":m?jt():Mt()})),o.push(B(`li`,f,u?{class:`task`}:void 0)),!n[e]?.trim()&&n[e+1]?.match(H)?.[1]?.length===a&&e++}i.push(B(/\d/.test(l[2])?`ol`:`ul`,o))}else{let t=[a];for(e++;e<n.length&&n[e].trim()&&!an(n[e],n[e+1]);e++)t.push(n[e]);i.push(B(`p`,V(t.join(`
7
+ `))))}}return i}function on(e){let t=e=>{if(typeof e==`string`)return document.createTextNode(e);let n=document.createElement(e.tag);for(let[t,r]of Object.entries(e.attrs??{}))n.setAttribute(t,r);return n.append(...e.kids.map(t)),n},n=document.createDocumentFragment();return n.append(...e.map(t)),n}var sn=`allow-forms allow-popups allow-popups-to-escape-sandbox`,cn={},W=new Map;function ln(e,t=``){let n=[];for(let r of(e.startsWith(`/`)?e:`${t}/${e}`).split(`/`))r===`..`?n.pop():r&&r!==`.`&&n.push(r);return`/${n.join(`/`)}`}var un=(e,t,n)=>e?.find(e=>ln(e.display,t)===ln(n,t));function dn(e,t,n=[]){let r=e.get(t);return e.set(t,new Set(n.map(e=>e.display))),r?n.filter(e=>!r.has(e.display)):[]}var G=(e,t,n=``)=>(e.state.dataset.tone=n,e.state.textContent=t),fn=(e,t)=>(e.failed=!0,G(e,t,`error`)),pn=e=>cn.src?.(e)??`doc/${encodeURIComponent(e)}/`;function K(e){if([e.loaded,e.failed]=[e.card.revision,!1],G(e,``),e.frame)return void(e.frame.src=pn(e.card.cap));let t=e.card.cap,n=/\.(md|markdown)$/i.test(e.card.display),i=++e.seq;(cn.load?.(t)??fetch(`api/doc/${encodeURIComponent(t)}`,{cache:`no-store`}).then(e=>e.ok?e.json():void 0)).then(t=>e.seq!==i||(t?e.body.replaceChildren(n?g(`div`,{class:`md`},on(U(t.text))):g(`pre`,{class:`doc-pre`},t.text)):fn(e,ce())),()=>e.seq!==i||fn(e,r()))}function mn(e,t){let n=W.get(t.cap);if(n)return n.tile;let r=t.display.split(`/`).pop()||t.display,i=t.kind===`html`?g(`iframe`,{class:`doc-frame`,sandbox:sn,referrerpolicy:`no-referrer`,title:gt({display:t.display,unit:e})}):void 0,a=g(`button`,{type:`button`,class:`cmp-link`},ct()),o=i&&g(`a`,{class:`cmp-link`,href:pn(t.cap),target:`_blank`,rel:`noopener noreferrer`},$e()),s=i??g(`div`,{class:`doc-text`},g(`p`,{class:`chat-empty`},Ce())),c=g(`span`,{class:`term-state`,role:`status`}),l=g(`em`,{class:`doc-off`},Ye()),u=g(`div`,{class:`doc-tile`},g(`div`,{class:`term-bar doc-bar`},g(`span`,{class:`doc-why`},t.reason),l,c,g(`span`,{class:`doc-acts`},a,o)),s),d=new IntersectionObserver(([e])=>(p.shown=!!e?.isIntersecting,p.shown&&!p.gone&&(p.failed||p.loaded!==p.card.revision)&&K(p))),f={id:`doc:${t.cap}`,title:`${r} · ${e}`,icon:`i-doc`,body:()=>u,closed:()=>(W.delete(t.cap),d.disconnect())},p={card:t,tile:f,loaded:0,seq:0,shown:!1,gone:!1,body:s,state:c,off:l,...i&&{frame:i}};return a.onclick=()=>!p.gone&&K(p),l.hidden=t.onScreen,d.observe(u),K(p),W.set(t.cap,p),f}function hn(e,t,n,r){let i=new Map,a=new Set;for(let o of e.bases)for(let e of[...o.tower?[o.tower]:[],...[...o.tabs.flatMap(e=>e.units),...o.outside].flatMap(e=>[e,...e.subs])]){for(let t of e.docs??[])i.set(t.cap,t);for(let i of dn(t,e.key,e.docs))e.key===n&&r(e.name,i);a.add(e.key)}for(let e of t.keys())a.has(e)||t.delete(e);gn(i)}function gn(e){for(let t of W.values()){let n=e.get(t.card.cap);if(!n){t.gone||G(t,le(),`error`),t.gone=!0;continue}let r=t.gone&&(G(t,``),t.failed);[t.card,t.gone,t.off.hidden]=[n,!1,n.onScreen],(n.revision!==t.loaded||r)&&(t.shown?K(t):n.revision!==t.loaded&&G(t,ue()))}}function _n(e,t,n,r){e.hidden=!t?.length&&!n,e.querySelector(`.d-doc-list`).replaceChildren(...(t??[]).map(e=>{let t=g(`button`,{type:`button`,class:`d-doc`,title:e.reason},g(`b`,null,e.display),g(`small`,null,e.onScreen?e.reason:Qe({reason:e.reason})));return t.onclick=()=>r(e),t})),e.querySelector(`.d-docs-cut`).hidden=!n}var q=e=>e.route.view===`map`?``:e.route.ws;function J(e,t){for(let n of e?.bases??[]){if(n.tower?.key===t)return{u:{key:t,name:n.tower.name,role:`tower`,mark:n.tower.mark,control:n.tower.control,pending:n.tower.pending,docs:n.tower.docs,docsCut:n.tower.docsCut,subs:[]},base:n};for(let[e,r]of[...n.tabs.map(e=>[e.label,e.units]),[void 0,n.outside]])for(let i of r){if(i.key===t)return{u:i,base:n,squad:e};let r=i.subs.find(e=>e.key===t);if(r)return{u:r,base:n,squad:e,launcher:i}}}}function vn(e){if(e.route.view!==`session`)return;let t=e.route.key,n=J(e.net,t),r=n?.u;return{key:t,hit:n,u:r,mk:r?.mark??`unknown`,state:e.info?.state,name:r?.name??e.info?.name??t}}var Y=()=>j(`<a class="token">${k}<span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></a>`);function X(e,t,n){C(e,t.key?{view:`session`,ws:n,key:t.key}:void 0),e.toggleAttribute(`hidden`,!1),e.toggleAttribute(`data-alert`,!!t.key&&S(t.mark)),y(e,t.mark),v(e.querySelector(`.plate`),t.role,t.mark,t.docs),E(e,`.name`,t.name),E(e,`.role`,b(t.role)),E(e,`.note`,A(t.note,t.mark))}var Z=(e,t)=>{let n=document.createElement(`a`);return C(n,e),n.textContent=t,n},yn=()=>`<div class="dossier-in"><span class="tag">${Kt()}</span><button class="x d-x" type="button" aria-label="${u()}">×</button><div class="portrait">${k}</div><h3></h3><p class="d-line"><em class="role"></em> <span class="state"></span></p><p class="d-note" hidden></p><dl class="specs"></dl><div class="d-docs" hidden><h4>${o()}</h4><div class="d-doc-list"></div><p class="d-docs-cut" hidden>${de()}</p></div><div class="d-drones" hidden><h4>${se()}</h4><div class="formation"></div></div><div class="d-squads" hidden><h4>${Ht()}</h4><div class="d-squad-list"></div></div></div>`,bn=e=>e.classList.add(`drone`);function xn(e,t,{openTile:n,fullScreen:r}){return function({key:i,hit:a,u:o,mk:s,state:c,name:l}){e.firstElementChild||(e.append(j(yn())),e.querySelector(`.d-x`).onclick=()=>r(!1));let u=e.firstElementChild,{net:d,info:f,model:p,ctx:m}=t,h=q(t);y(u,s),v(u.querySelector(`.plate`),o?.role??f?.role??`member`,s),E(u,`h3`,l),E(u,`.role`,b(o?.role??f?.role??`session`)),E(u,`.state`,o?A(o.note,s):Ke());let g=u.querySelector(`.d-note`);g.hidden=c!==`recent`&&c!==`unknown`,g.replaceChildren(c===`unknown`?Je():qe()),f?.successor&&g.append(` ${At()} `,Z({view:`session`,ws:h,key:f.successor},J(d,f.successor)?.u.name??We()));let _=[[xt(),p],[vt(),m?Bt({count:m.toLocaleString()}):void 0],[yt(),f?.header?.cwd],[_t(),a&&Z({view:`workspace`,ws:a.base.id},a.base.label)],[St(),a?.squad],[bt(),a?.launcher&&Z({view:`session`,ws:a.base.id,key:a.launcher.key},a.launcher.name)],[Ct(),f?.unreadable?_e({count:f.unreadable}):void 0]];u.querySelector(`.specs`).replaceChildren(..._.filter(([,e])=>e).map(([e,t])=>{let n=j(`<div><dt></dt><dd></dd></div>`);return n.firstElementChild.textContent=e,n.lastElementChild.append(t),n})),_n(u.querySelector(`.d-docs`),o?.docs,o?.docsCut,e=>n(mn(l,e)));let x=u.querySelector(`.d-drones`);x.hidden=!o?.subs.length,O(x.querySelector(`.formation`),(o?.subs??[]).map(e=>({...e,id:e.key})),Y,(e,t)=>(bn(e),X(e,t,h)));let S=u.querySelector(`.d-squads`),C=o?.role===`tower`?a?.base:void 0;S.hidden=!C?.tabs.length,O(S.querySelector(`.d-squad-list`),C?.tabs??[],()=>j(`<div class="d-squad"><small></small><div class="formation"></div></div>`),(e,t)=>(E(e,`small`,Et({label:t.label})),O(e.querySelector(`.formation`),t.units.flatMap(e=>[e,...e.subs]).map(e=>({...e,id:e.key})),Y,(e,t)=>(bn(e),X(e,t,C.id)))))}}function Sn(e){let t=(e,t,n)=>{let r=document.createElement(e);return r.textContent=t,n&&C(r,n),r},n=document.getElementById(`crumbs`),{route:r,net:i,info:a}=e;if(r.view===`map`)return n.replaceChildren(t(`b`,`Straw Net`),t(`span`,p()));let o=i?.bases.find(e=>e.id===r.ws)?.label??r.ws,s=r.view===`session`?J(i,r.key)?.u.name??a?.name??r.key:``,c=[];for(let e=r.view===`session`?J(i,r.key):void 0,t=0;e?.launcher&&t<8;e=J(i,e.launcher.key),t++)c.unshift(e.launcher);let l=[t(`a`,`Straw Net`,{view:`map`}),r.view===`workspace`?t(`b`,o):t(`a`,o,{view:`workspace`,ws:r.ws}),...c.map(e=>t(`a`,e.name,{view:`session`,ws:r.ws,key:e.key})),...s?[t(`b`,s)]:[]];l.slice(1,-2).forEach(e=>e.classList.add(`mid`));let u=l.length>3?[Object.assign(t(`span`,`…`),{className:`crumb-more`,role:`button`,tabIndex:0,onclick:()=>n.classList.toggle(`open`)})]:[];n.classList.remove(`open`),n.replaceChildren(l[0],...u,...l.slice(1))}function Cn(e,t,n){let r=e=>[`map`,`workspace`,`session`].indexOf(e.view),i=r(e)<r(t)?`enter-back`:e.view===`workspace`&&n?`enter-zoom`:e.view===`session`&&t.view!==`session`?`enter-slide`:``,a=document.getElementById({map:`map`,workspace:`ws-view`,session:`session-view`}[e.view]);if(i){if(n){let e=a.getBoundingClientRect();a.style.setProperty(`--ox`,`${Math.round(n.x+n.width/2-e.x)}px`),a.style.setProperty(`--oy`,`${Math.round(n.y+n.height/2-e.y)}px`)}a.classList.remove(`enter-zoom`,`enter-slide`,`enter-back`),M(a,i),setTimeout(()=>a.classList.remove(i),700)}}function wn(e,t){let n=e.querySelector(`.queue-list`);if(!n)return;n.hidden=!t?.length;let r=e=>Object.assign(document.createElement(`b`),{textContent:e.as===`steer`?st():ot()});n.replaceChildren(...(t??[]).map(e=>{let t=document.createElement(`p`);return t.append(r(e),document.createTextNode(e.text)),t}))}function Tn(e,t){let n=e.querySelector(`.todos`);if(!n||(n.hidden=!t?.length,!t?.length))return;let r=t.filter(e=>e.status===`completed`).length,i=t.find(e=>e.status===`in_progress`);E(n,`summary b`,It({done:r,total:t.length})),E(n,`summary span`,i?i.activeForm??i.subject:r===t.length?Lt():``),n.querySelector(`ol`).replaceChildren(...t.map(e=>Object.assign(document.createElement(`li`),{textContent:e.subject,className:e.status})))}function En(e,t){let n=e.querySelector(`.monitors`);if(!n||(n.hidden=!t?.length,!t?.length))return;let r=t.filter(e=>e.status===`running`),i=t.filter(e=>e.status===`error`||e.status===`stale`).length;n.dataset.failed=String(i>0),E(n,`summary b`,[Ue(),r.length&&He({count:r.length}),i&&ze({count:i})].filter(Boolean).join(` · `)),E(n,`summary span`,r[0]?r[0].last??r[0].what:``);let a={running:Pe,done:Me,error:Ne,stale:Fe,stopped:Ie};n.querySelector(`ul`).replaceChildren(...t.map(e=>{let t=Object.assign(document.createElement(`li`),{className:e.status}),n=[a[e.status](),e.exit!==void 0&&Oe({code:e.exit}),je({count:e.lines})].filter(Boolean).join(` · `);return t.append(Object.assign(document.createElement(`b`),{textContent:e.what}),Object.assign(document.createElement(`small`),{textContent:n})),e.last&&t.append(Object.assign(document.createElement(`code`),{textContent:e.last})),t}))}var Dn=e=>/^\/(\S{0,64})$/.exec(e)?.[1],On=(e,t,n)=>(e+n+t)%t;function kn(e,t){let n=g(`ul`,{class:`slash`,id:`slash`,role:`listbox`,"aria-label":ae()}),r=[],i=0,a;e.setAttribute(`aria-controls`,`slash`);let o=()=>!n.hidden&&r.length>0,s=()=>(r=[],n.hidden=!0,e.removeAttribute(`aria-activedescendant`)),c=()=>{n.replaceChildren(...r.map((e,t)=>{let n=g(`li`,{id:`slash-${t}`,role:`option`,"aria-selected":String(t===i)},g(`b`,null,`/${e.name}`),e.description&&g(`span`,null,e.description));return n.onmousedown=e=>e.preventDefault(),n.onclick=()=>l(e),n})),n.hidden=!r.length,r.length&&(e.setAttribute(`aria-activedescendant`,`slash-${i}`),n.children[i]?.scrollIntoView({block:`nearest`}))},l=t=>{e.value=`/${t.name} `,s(),e.focus(),e.dispatchEvent(new Event(`input`))};return s(),e.addEventListener(`input`,()=>{let n=Dn(e.value),o=e.value;if(clearTimeout(a),n===void 0)return s();a=setTimeout(async()=>{let a=await t(n).catch(()=>void 0);if(e.value!==o)return;let s=a?.ok&&Array.isArray(a.body.commands)?a.body.commands:[];[r,i]=[s,0],c()},120)}),e.addEventListener(`blur`,s),e.addEventListener(`keydown`,e=>{if(!o()||e.isComposing||e.keyCode===229)return;let t=e.key;if(t===`ArrowDown`||t===`ArrowUp`)i=On(i,r.length,t===`ArrowDown`?1:-1),c();else if(t===`Enter`&&!e.shiftKey||t===`Tab`)l(r[i]);else if(t===`Escape`)s();else return;e.preventDefault(),e.stopImmediatePropagation()}),n}var An=16384,jn=/^\s*\/(quit|exit|new|resume|fork|clone|import|reload)(?=\s|$)/,Q=new Map,Mn=e=>(n,r)=>t(`sessions/${encodeURIComponent(e)}/${n}`,r);function Nn(e,t,n){if(!e.ok)return[`error`,e.status===504?z():e.body.reason??s({status:e.status})];if(t&&!t.startsWith(n))return[`ok`,Xt()]}var Pn=e=>{try{return e?.startsWith(`[`)?JSON.parse(e):e?[`error`,e]:void 0}catch{return[`error`,e]}},Fn=(e,t)=>e!==``&&!e.startsWith(t)?pt():``,In=(e,t)=>e.startsWith(t)?e.slice(t.length).replace(/^\n/,``):e;function $(e){if(!e.online)return ne();if(!e.live)return R();if(!e.control)return te();if(e.mark===`waiting`)return e.answerable?I():L()}function Ln(t,n,r,a=t=>e(`sessions/${encodeURIComponent(n)}/upload`,t)){let o=`sb-draft:${n}`,l=matchMedia(`(pointer: coarse)`).matches,u=g(`textarea`,{rows:`1`,maxlength:String(An),"aria-label":Te(),enterkeyhint:l?`enter`:`send`}),f=g(`button`,{type:`submit`,class:`cmp-send`},lt()),p=g(`button`,{type:`button`,class:`cmp-alt`},xe()),m=g(`button`,{type:`button`,class:`cmp-alt cmp-stop`},Ot()),h=g(`input`,{type:`file`,multiple:``,hidden:``}),_=g(`button`,{type:`button`,class:`cmp-alt`,"aria-label":ee()},`+`),v=g(`p`,{class:`cmp-note`,role:`status`,"aria-live":`polite`}),y=kn(u,e=>r(`commands`,{prefix:e})),b=g(`form`,{class:`composer`},y,g(`div`,{class:`cmp-row`},_,h,u,g(`div`,{class:`cmp-acts`},f,p,m)),g(`div`,{class:`cmp-foot`},v));t.replaceChildren(b);let x={name:``,control:!1,live:!1,mark:`unknown`,online:!1},S=!1,C=!1,w=e=>{try{e()}catch{}};w(()=>u.value=sessionStorage.getItem(o)??``);let T=()=>w(()=>u.value?sessionStorage.setItem(o,u.value):sessionStorage.removeItem(o)),E=CSS.supports(`field-sizing`,`content`)?()=>{}:()=>(u.style.height=`auto`,u.style.height=`${Math.min(u.scrollHeight,220)}px`),D=(e,t=``,...n)=>(v.dataset.tone=t,v.replaceChildren(e,...n)),O=(e,t,n)=>{let r=g(`button`,{type:`button`,class:`cmp-yes`},t),i=g(`button`,{type:`button`,class:`cmp-link`},d());C=!0,r.onclick=()=>(C=!1,n()),i.onclick=()=>(C=!1,D(``),u.focus()),D(e,`ask`,r,i),r.focus()},[k,A]=[`${o}:note`,()=>{try{return sessionStorage.getItem(o)??``}catch{return}}],j=e=>w(()=>e?sessionStorage.setItem(k,JSON.stringify(e)):sessionStorage.removeItem(k));function M(e,t,i){let a={sent:i,answer:r(e,t)};return i!==void 0&&(j([`error`,z()]),Q.set(n,a),a.answer.then(e=>{let t=A();e.ok&&t!==void 0&&w(()=>sessionStorage.setItem(o,In(t,i))),j(Nn(e,t,i))},()=>j([`error`,z()]))),N(a)}async function N(e,{sent:t}=e){S=!0,C=!1,F(),D(t===void 0?``:i());try{let n=await e.answer;if(!b.isConnected)return;if(!n.ok)return n.status===504||j(),D(n.body.reason??s({status:n.status}),`error`);if(t===void 0)return D(``);j();let r=Fn(u.value,t);u.value=In(u.value,t),T(),E(),D(r,`ok`)}catch{D(z(),`error`)}finally{Q.get(n)===e&&Q.delete(n),S=!1,F()}}function P(e,t){let n=u.value,r=$(x),i=t===n;if(S||C||!n.trim())return;if(r)return D(r,`error`);if(new TextEncoder().encode(n).length>16384)return D(Vt(),`error`);let a=!i&&n.match(jn)?.[0].trim();if(a)return O(me({command:a}),ft({command:a}),()=>P(e,n));M(`input`,{text:n,as:e,confirmed:i},n)}function F(){let e=$(x),t=x.mark===`working`;u.placeholder=e??at({name:x.name}),f.disabled=S||!!e||!u.value.trim(),p.hidden=m.hidden=!t||!!e,[p.disabled,m.disabled]=[f.disabled,S]}async function I(e){if(!e.length||S)return;let t=$(x);if(t)return D(t,`error`);D(Jt(),``);for(let t of e){if(t.size>20971520)return D(be({name:t.name}),`error`);let e=await a(t).catch(()=>void 0);if(!e?.ok||typeof e.body.path!=`string`)return D(e?.body.reason??c(),`error`);let n=u.selectionStart??u.value.length,r=u.value.slice(0,n),i=u.value.slice(u.selectionEnd??n),o=`${r&&!/\s$/.test(r)?` `:``}${e.body.path}${/^\s/.test(i)?``:` `}`;u.value=r+o+i,u.selectionStart=u.selectionEnd=n+o.length}D(``),T(),E(),F(),u.focus()}_.onclick=()=>h.click(),h.onchange=()=>void I([...h.files??[]]).finally(()=>h.value=``),u.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.files??[]];t.length&&(e.preventDefault(),I(t))}),b.addEventListener(`dragover`,e=>e.dataTransfer?.types.includes(`Files`)&&e.preventDefault()),b.addEventListener(`drop`,e=>{let t=[...e.dataTransfer?.files??[]];t.length&&(e.preventDefault(),I(t))}),b.addEventListener(`submit`,e=>(e.preventDefault(),P(`send`))),p.onclick=()=>P(`followUp`),m.onclick=()=>O(kt(),Ot(),()=>void(S||M(`keys`,{keys:[`esc`]}))),u.addEventListener(`input`,()=>(T(),E(),F())),b.addEventListener(`keydown`,e=>{e.key===`Escape`&&!e.isComposing&&(C||e.target===u&&u.value)&&(e.preventDefault(),C&&(C=!1,D(``),u.focus()))}),u.addEventListener(`keydown`,e=>{e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||l&&!e.altKey||(e.preventDefault(),P(e.altKey?`followUp`:`send`))});let L=window.visualViewport,R=()=>[[`--vvh`,L.height],[`--vvt`,L.offsetTop]].forEach(([e,t])=>document.documentElement.style.setProperty(e,`${t}px`));return L&&(L.addEventListener(`resize`,R),L.addEventListener(`scroll`,R),R()),E(),Q.has(n)?N(Q.get(n)):w(()=>{let e=Pn(sessionStorage.getItem(k));sessionStorage.removeItem(k),e&&D(e[1],e[0])}),{box:u,update:e=>(x=e,F()),ready:()=>!$(x)}}var Rn=()=>`<div class="comms-in"><header class="comms-head"><a class="head-back" aria-label="${F()}">‹</a><span class="logo"><svg><use href="#i-comms"/></svg></span><div class="head-id"><h2><small>${oe()}</small> <span></span></h2><p></p></div><div class="modes" role="group"><button type="button" data-mode="chat" aria-pressed="true">${oe()}</button><button type="button" data-mode="term" aria-pressed="false">${Nt()}</button></div><span class="chan link" data-state="live"><i></i><b>${ie()}</b></span><button type="button" class="pair-btn head-info">${Se()}</button></header><div class="chat-root"></div><div class="queue-list" hidden></div><details class="todos" hidden><summary><b></b><span></span></summary><ol></ol></details><details class="monitors" hidden><summary><b></b><span></span></summary><ul></ul></details><div class="ask-root"></div><div class="composer-root"></div><div class="term-root" hidden></div></div>`;function zn(e,{view:t,data:n,openTile:r,embedTerminal:i,online:o,fullScreen:s,opened:c}){let l,u,d,f=0,p,m,h=0,g=()=>setTimeout(()=>e.route.view===`session`&&(document.activeElement??document.body)===document.body&&(matchMedia(`(pointer: fine)`).matches&&u?.ready()?u.box:l?.log)?.focus({preventScroll:!0}));async function _(i){let o=++f,{mountChat:p}=await x(async()=>{let{mountChat:e}=await import(`./chat-BECfofMv.js`);return{mountChat:e}},__vite__mapDeps([0]),import.meta.url);if(o!==f||e.route.view!==`session`)return;t.replaceChildren(j(Rn()));let h=()=>J(e.net,i)?.u??{key:i,name:e.info?.name??i,role:e.info?.role??`member`,mark:`unknown`};l=p(t.querySelector(`.chat-root`),n(i),{who:h,link:t=>{let n=J(e.net,i)?.u.subs.find(e=>e.name===t)??e.net?.bases.flatMap(e=>[...e.tabs.flatMap(e=>e.units),...e.outside]).find(e=>e.name===t);return n&&Z({view:`session`,ws:J(e.net,n.key)?.base.id??q(e),key:n.key},t)},docFor:(t,n=un(J(e.net,i)?.u.docs,e.info?.header?.cwd,t))=>n&&(()=>r(mn(h().name,n)))});let _=n(i).post??Mn(i);[u,d]=[Ln(t.querySelector(`.composer-root`),i,_),a(t.querySelector(`.ask-root`),_,void 0,()=>v(`term`))],t.querySelectorAll(`.modes button`).forEach(e=>e.onclick=()=>v(e.dataset.mode)),t.querySelector(`.head-info`).onclick=()=>s(!0),m===`term`&&v(`term`),m=void 0,l.reveal(e.route.at),c(),g()}function v(n){if(e.route.view!==`session`)return;let r=e.route.key,a=t.querySelector(`.comms-in`);if(!a)return void(m=n===`term`?`term`:void 0);a.querySelectorAll(`.modes button`).forEach(e=>e.setAttribute(`aria-pressed`,String(e.dataset.mode===n)));for(let e of[`.chat-root`,`.ask-root`,`.composer-root`])a.querySelector(e).hidden=n===`term`;let o=a.querySelector(`.term-root`);if(o.hidden=n!==`term`,a.classList.toggle(`in-term`,n===`term`),p?.(),p=void 0,n!==`term`)return g();let s=++h;i(r,J(e.net,r)?.u.name??e.info?.name??r,o).then(t=>s===h&&e.route.view===`session`&&e.route.key===r?(p=t,o.querySelector(`.term-sink`)?.focus({preventScroll:!0})):t())}return{get chat(){return l},open(e){[l,u,d]=[void 0,void 0,void 0],t.replaceChildren(j(`<p class="lost">${et()}</p>`)),_(e)},close(){f++,l=u=d=void 0,t.replaceChildren()},reveal(e){l?.reveal(e),g()},leaveMode:()=>(h++,p?.(),p=void 0),terminal(t){e.route.view===`session`&&e.route.key===t?v(`term`):m=`term`},draw({u:n,hit:r,mk:i,state:a,name:s}){t.querySelector(`.modes`)?.toggleAttribute(`hidden`,!n?.control),l?.docs();let c=t.querySelector(`.comms-head`);if(c){E(c,`h2 span`,n?.name??e.info?.name??``),E(c,`p`,[r?.base.label,r?.squad&&Et({label:r.squad})].filter(Boolean).join(` · `));let t=c.querySelector(`.chan`),i=a===`live`||!a&&n;t.dataset.state=i?`live`:`closed`,E(t,`b`,i?ie():a===`recent`?re():Ge()),t.title=t.querySelector(`b`).textContent??``,C(c.querySelector(`.head-back`),{view:`workspace`,ws:q(e)})}Tn(t,e.info?.todos),En(t,n?.monitors),wn(t,n?.queued),l?.setLive(i===`working`?`${A(n.note,i)}`:S(i)?D[i]():``,i),u?.update({name:s,control:!!n?.control,live:a?a===`live`:!!n,mark:i,online:o(),answerable:!!n?.pending?.answer}),d?.update(n?.pending,i===`waiting`&&!!n?.control&&o())}}}var Bn=()=>j(`<div class="col"><a class="token">${k}<span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></a><div class="say"><p></p></div><div class="drones"></div></div>`),Vn=()=>`<div class="zoom-in"><header class="base keep"><a class="tower big"><i class="sweep"></i><i class="pulse"></i><svg><use href="#i-tower"/></svg><b class="badge"></b></a><div class="title"><span class="crown"><svg><use href="#i-crown"/></svg>${T()}</span><h2></h2><p></p></div><dl class="tally"><div><dt>${Dt()}</dt><dd></dd></div><div><dt>${qt()}</dt><dd></dd></div><div data-mark="working"><dt>${P()}</dt><dd></dd></div><div data-mark="waiting"><dt>${m()}</dt><dd></dd></div></dl></header><div class="spawn-btns"><button type="button" class="pair-btn"></button></div><div class="squads"></div><div class="camps"><section class="tab squad camp" data-group="outposts"><h3><svg><use href="#i-outpost"/></svg><b>${N()}</b><small></small></h3><div class="formation"></div></section><section class="tab squad camp" data-group="outside"><h3><svg><use href="#i-outside"/></svg><b>${tt()}</b><small>${nt()}</small></h3><div class="formation"></div></section></div><p class="lost" hidden></p></div>`;function Hn(e,t){e.firstElementChild||e.append(j(Vn()));let{net:n,cards:r}=t,i=e.firstElementChild,a=n?.bases.find(e=>e.id===q(t)),o=i.querySelector(`.lost`);if(o.hidden=!!a,o.textContent=n?we():Yt(),i.classList.toggle(`void`,!a),!a)return;let s=i.querySelector(`.keep`);y(s,a.mark),s.classList.toggle(`head`,a.head);let c=i.querySelector(`.tower`);c.classList.toggle(`ghost`,!a.tower),y(c,a.tower?.mark??`unknown`),C(c,a.tower?{view:`session`,ws:a.id,key:a.tower.key}:void 0),c.toggleAttribute(`hidden`,!1),c.toggleAttribute(`data-alert`,!!(a.tower&&S(a.tower.mark))),E(i,`h2`,a.label),_(i.querySelector(`.spawn-btns button`),a),E(i,`.title p`,a.tower?w({state:D[a.tower.mark]()}):h());let l=a.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]));[a.tabs.length,l.length,l.filter(e=>e.mark===`working`).length,l.filter(e=>e.mark===`waiting`).length].forEach((e,t)=>i.querySelectorAll(`dd`)[t].textContent=String(e));let u=(e,t)=>{y(e,t.mark),X(e.querySelector(`.token`),t,a.id);let n=e.querySelector(`.say`),i=r[t.key]??``;n.hidden=!i,E(n,`p`,i),O(e.querySelector(`.drones`),t.subs,Y,(e,t)=>(e.classList.add(`drone`),X(e,t,a.id)))};O(i.querySelector(`.squads`),a.tabs,()=>j(`<section class="tab squad"><h3><i class="flag"></i><b></b><small></small><button type="button" class="tab-add"></button></h3><div class="formation"></div></section>`),(e,t)=>{E(e,`h3 b`,Et({label:t.label})),_(e.querySelector(`.tab-add`),a,t.id);let n=t.units.flatMap(e=>[e,...e.subs]);E(e,`h3 small`,Gt({count:n.length})),y(e,[`waiting`,`error`,`working`].find(e=>n.some(t=>t.mark===e))??`idle`),O(e.querySelector(`.formation`),t.units,Bn,u)});let d=(e,t)=>{let n=i.querySelector(`[data-group="${e}"]`);n.hidden=!t.length,O(n.querySelector(`.formation`),t,Y,(e,t)=>X(e,t,a.id))};d(`outposts`,a.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?f():void 0}))),d(`outside`,a.outside)}var Un=200;function Wn({data:e,restart:t,openTile:n,embedTerminal:r,online:i}){let[a,o,s]=[`ws-view`,`session-view`,`dossier`].map(e=>document.getElementById(e)),c={route:{view:`map`},cards:{}},l=[],u=!1,d=new Map,f=e=>s.classList.toggle(`full`,e),p=xn(s,c,{openTile:n,fullScreen:f}),m=zn(c,{view:o,data:e,openTile:n,embedTerminal:r,online:i,fullScreen:f,opened:()=>(l.splice(0).forEach(h),g())});function h(e){m.chat?.apply(e);for(let t of e.items??[])t.kind===`assistant`&&([c.model,c.ctx]=[t.model??c.model,t.ctx??c.ctx])}function g(){let e=vn(c);e&&(p(e),m.draw(e))}let _=()=>(Sn(c),c.route.view===`workspace`?Hn(a,c):g());return{terminal:m.terminal,locate:e=>J(c.net,e),show(e,t,n){let[r,i]=c.route.view===`session`?[c.route.key,c.route.at]:[];(e.view!==`workspace`||c.route.view!==`workspace`||e.ws!==c.route.ws)&&(c.cards={}),c.route=e,a.hidden=e.view!==`workspace`,o.hidden=s.hidden=e.view!==`session`,f(!1),(e.view!==`session`||e.key!==r)&&m.leaveMode(),e.view===`session`&&e.key!==r?([c.info,c.model,c.ctx,l,u]=[void 0,void 0,void 0,[],!1],m.open(e.key)):e.view===`session`&&e.at!==i?m.reveal(e.at):e.view!==`session`&&m.close(),_(),e!==t&&Cn(e,t,n)},net(e){c.net=e,hn(e,d,c.route.view===`session`?c.route.key:void 0,(e,t)=>n(mn(e,t),!1)),c.route.view!==`map`&&_()},cards(e){c.cards={...c.cards,...e},c.route.view===`workspace`&&Hn(a,c)},history(e){if(c.route.view===`session`&&e.key===c.route.key){if(c.info={...c.info,...e,items:void 0},e.reset&&([c.model,c.ctx]=[void 0,void 0]),document.hidden)return l.length<Un?void l.push(e):void(u=!0);m.chat?h(e):l.push(e),g()}},wake(){if(u)return u=!1,l=[],t();l.splice(0).forEach(e=>m.chat&&h(e)),_()}}}export{Wn as mountFocus,U as n,on as t};
@@ -6,8 +6,8 @@
6
6
  <meta name="referrer" content="no-referrer">
7
7
  <title>Straw Net</title>
8
8
  <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%230b1220'/%3E%3Cpath d='M16 5l9 7h-4v13h-10V12H7z' fill='%2338e0ff'/%3E%3C/svg%3E">
9
- <script type="module" crossorigin src="./assets/index-BQP3YgWb.js"></script>
10
- <link rel="stylesheet" crossorigin href="./assets/index-D4oTe33x.css">
9
+ <script type="module" crossorigin src="./assets/index-gWx1_-3G.js"></script>
10
+ <link rel="stylesheet" crossorigin href="./assets/index-DI9km3B9.css">
11
11
  </head>
12
12
  <body>
13
13
  <!-- Icons: game-icons.net, CC BY 3.0 (Lorc, Delapouite); see gui/ICONS.md -->
@@ -57,6 +57,7 @@
57
57
  <div class="work" id="work">
58
58
  <main class="map view" id="map">
59
59
  <svg class="links" id="links" aria-hidden="true"></svg>
60
+ <div class="packets" id="packets" aria-hidden="true"></div>
60
61
  <div class="bases" id="bases"><button type="button" class="new-base" data-open="base" data-m="new_base">+ New base</button></div>
61
62
  </main>
62
63
  <section class="zoom view" id="ws-view" hidden></section>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-straw-boss",
3
- "version": "0.26.2",
3
+ "version": "0.27.1",
4
4
  "description": "Straw Boss coordination for pi in Herdr: sessions join a tab's net by choice, the first joiner is its main agent, a workspace tower opens on demand with a live monitoring dashboard, and boss_broadcast reaches the rest",
5
5
  "type": "module",
6
6
  "license": "MIT",