pi-straw-boss 0.20.2 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE.md +4 -0
- package/README.md +1 -0
- package/README.zh-TW.md +1 -0
- package/dist/gui/assets/{ask-BzyjXf83.js → ask-Bsqffnlt.js} +1 -1
- package/dist/gui/assets/{chat-DVKjeMFP.js → chat-TOYLpfbg.js} +2 -2
- package/dist/gui/assets/done-jqKY4qf5.mp3 +0 -0
- package/dist/gui/assets/error-DdTLgPEw.mp3 +0 -0
- package/dist/gui/assets/index-BTGK6xu9.css +1 -0
- package/dist/gui/assets/index-DDeJoO2R.js +1 -0
- package/dist/gui/assets/{layer-BNbiWPRd.js → layer-BLf_e8pX.js} +1 -1
- package/dist/gui/assets/{lightbox-Dvr26vhq.js → lightbox-CAhvqYD4.js} +1 -1
- package/dist/gui/assets/{pair-BH6gsBf3.js → pair-BUuSyACk.js} +1 -1
- package/dist/gui/assets/{spawn-CDkaGY6G.js → spawn-DUzwQQcg.js} +1 -1
- package/dist/gui/assets/{views-CZLZBkEo.js → views-BpyIRIy3.js} +3 -3
- package/dist/gui/assets/waiting-DOg8-8gu.mp3 +0 -0
- package/dist/gui/index.html +4 -2
- package/package.json +1 -1
- package/prompts/main.md +2 -0
- package/prompts/planning.md +44 -0
- package/src/gui.ts +4 -4
- package/src/index.ts +24 -3
- package/dist/gui/assets/index-CZq2ySys.js +0 -1
- package/dist/gui/assets/index-D-3yz3dW.css +0 -1
package/NOTICE.md
CHANGED
|
@@ -52,3 +52,7 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
52
52
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
53
53
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
54
54
|
SOFTWARE.
|
|
55
|
+
|
|
56
|
+
## Sounds (`gui/sounds/`)
|
|
57
|
+
|
|
58
|
+
The GUI's sounds come from [Kenney](https://kenney.nl) (www.kenney.nl), released under Creative Commons Zero (CC0 1.0), converted to mono MP3: `waiting.mp3` is `question_002` from Interface Sounds 1.0, `done.mp3` is `confirmation_001` from Interface Sounds 1.0, and `error.mp3` is `lowDown` from Digital Audio.
|
package/README.md
CHANGED
|
@@ -67,6 +67,7 @@ The tower only routes and coordinates, so it can run a lighter model: set `tower
|
|
|
67
67
|
| `call_tower` | Message this workspace's tower, or another workspace's. |
|
|
68
68
|
| `boss_open_main` | Tower only: open a tab with a new main agent for a request no session owns. |
|
|
69
69
|
| `boss_broadcast` | Message a tab, a workspace, all towers, or every session. |
|
|
70
|
+
| `boss_rename` | Name this session with a short phrase for its current work; the net, the GUI, and (with pi-auto-tab-name) the tab show it. Main agents call it when their work changes. |
|
|
70
71
|
| `/boss` | Take over as this tab's main agent. |
|
|
71
72
|
| `/boss status`, `/boss tower` | Show the status; open and focus the tower. |
|
|
72
73
|
| `/boss close` | Quit this session and close its pane. |
|
package/README.zh-TW.md
CHANGED
|
@@ -67,6 +67,7 @@ pi install npm:pi-straw-boss
|
|
|
67
67
|
| `call_tower` | 傳訊息給這個工作區的塔台,或別的工作區的塔台。 |
|
|
68
68
|
| `boss_open_main` | 只有塔台能用:替沒有 session 負責的請求開一個分頁,啟動新的主智慧體。 |
|
|
69
69
|
| `boss_broadcast` | 傳訊息給一個分頁、一個工作區、所有塔台,或所有 session。 |
|
|
70
|
+
| `boss_rename` | 用一個短語替這個 session 命名,說明它現在在做什麼;net、GUI,以及裝了 pi-auto-tab-name 時的分頁名稱都會跟著顯示。主智慧體換工作時會呼叫它。 |
|
|
70
71
|
| `/boss` | 接手成為這個分頁的主智慧體。 |
|
|
71
72
|
| `/boss status`、`/boss tower` | 顯示狀態;開啟塔台並切換過去。 |
|
|
72
73
|
| `/boss gui`、`/boss gui stop` | 在瀏覽器開啟網(任何 session 都能開,不會加入任何東西);停止它的伺服器,在哪個 session 都可以。整台機器只跑一個伺服器、一個網址:開它的 session `/reload` 之後,會在原網址重開;版本較新的 session 會接手,開著的頁面也會自動換成新版。可以在通訊畫面直接打字給某個 session,或用終端機畫面下方的按鍵面板操作它的終端機;在等回覆的 `robot_hand` 選單或 `ask_user_question` 問卷,可以在那裡或它的警示裡作答(其他對話框只能看,要回到終端機回答;`secret_drop` 一律只能在終端機輸入)。session 用 [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 以上顯示的文件,會開在它的通訊畫面旁邊:HTML 放在沙箱框架裡,表單送出的答案會傳給智慧體;純文字只能讀。 |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as e,b as t}from"./index-
|
|
1
|
+
import{M as e,b as t}from"./index-DDeJoO2R.js";import{t as n}from"./dom-BaTXH9WU.js";var r=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案正在送出;請查看終端機。`:`Another answer is on its way; check the terminal.`),i=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),a=((t={},n={})=>(n.locale??e())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),o=((t={},n={})=>(n.locale??e())===`zh-TW`?`已回答。`:`Answered.`),s=((t={},n={})=>(n.locale??e())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),c=((t={},n={})=>(n.locale??e())===`zh-TW`?`可以複選。`:`It takes several choices.`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`再次確認`:`Check again`),u=((t={},n={})=>(n.locale??e())===`zh-TW`?`選擇`:`Choices`),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`複製指令`:`Copy command`);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=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`未確認。請查看終端機。`:`Not confirmed. Check the terminal.`),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註`:`Note`),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`備註(選填)`:`Note (optional)`),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`選項`:`Options`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`你的答案`:`Your own answer`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出答案`:`Send answer`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出中…`:`Sending…`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示終端機`:`Show terminal`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`連不上伺服器。`:`The server could not be reached.`),F=((t={},n={})=>(n.locale??e())===`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(e){let{outcome:n,reason:i,by:a}=e.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`||e.status===504?[`error`,_(),!0]:[`error`,i??t({status:e.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};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-
|
|
2
|
-
import{M as e,d as t,n,t as r}from"./index-CZq2ySys.js";import{t as i}from"./dom-BaTXH9WU.js";import{n as a,t as o}from"./views-CZLZBkEo.js";var s=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),c=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),l=e=>`context compacted · ${e?.tokens} tokens summarized`,u=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,d=((t,n={})=>(n.locale??e())===`zh-TW`?u(t):l(t)),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,h=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),g=e=>`Image ${e?.n}`,_=e=>`圖片 ${e?.n}`,v=((t,n={})=>(n.locale??e())===`zh-TW`?_(t):g(t)),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),b=e=>`${e?.count} image(s)`,x=e=>`${e?.count} 張圖片`,S=((t,n={})=>(n.locale??e())===`zh-TW`?x(t):b(t)),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),T=e=>`${e?.count} new`,E=e=>`${e?.count} 則新訊息`,D=((t,n={})=>(n.locale??e())===`zh-TW`?E(t):T(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),te=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),I=e=>`Open image ${e?.n}`,L=e=>`打開圖片 ${e?.n}`,R=((t,n={})=>(n.locale??e())===`zh-TW`?L(t):I(t)),z=e=>`show all (${e?.size})`,B=e=>`顯示全部(${e?.size})`,V=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),H=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),U=e=>`◇ thought · ${e?.count} chars`,W=e=>`◇ 思考 · ${e?.count} 字元`,G=((t,n={})=>(n.locale??e())===`zh-TW`?W(t):U(t)),ne=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),K=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),re=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function ie(){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?D({count:t}):w()}}async function ae(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 oe(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 se=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,ce=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,le={intercom_message:A,subagent_result:P,subagent_ping:N,subagent_status:F,"pi-loop-monitor":M,"memory-context":j,"doc-review":k},q=e=>{let r=t(`<span class="ava"><svg><use/></svg></span>`);return r.querySelector(`use`).setAttribute(`href`,`#i-${n[e]??e}`),r};function ue(e){let t=[],n=0;for(let r of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))t.push(e.slice(n,r.index),i(`a`,{href:r[0],rel:`noopener noreferrer`,target:`_blank`},r[0])),n=r.index+r[0].length;return[...t,e.slice(n)]}function J(e,t,{who:n,link:l,docFor:u}){let p=oe(),m=new Map,g=new Set,_=()=>g.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>u?.(e))):e.shown&&g.delete(e)),b=i(`div`,{class:`chat-list`}),x=i(`div`,{class:`chat-top`}),w=i(`div`,{class:`chat-live`}),T=i(`button`,{class:`chat-pill`,type:`button`,hidden:``}),E=i(`p`,{class:`chat-empty`},ee()),D=i(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":c()},x,b,w);e.replaceChildren(D,T);let k=ie(),A=!1,j=!1,M,N,P=0,F=()=>D.scrollHeight-D.scrollTop-D.clientHeight<80,I=(e=k.button(p.detached))=>(T.hidden=!e,T.textContent=e??``),L=()=>(k.jump(),N=void 0,D.scrollTop=D.scrollHeight,I());async function z(e){A=!0;let n=await ae(p,t,e,e=>(X(e),Z(e))).finally(()=>A=!1),r=m.get(e);if(M===e){if(!n||!r)return L();k.hold(),N=r,r.scrollIntoView({block:`center`}),r.classList.remove(`lit`),r.offsetWidth,r.classList.add(`lit`),clearTimeout(P),P=window.setTimeout(()=>(N=void 0,r.classList.remove(`lit`)),2e3),I()}}let B=()=>M?void z(M):L(),U=(e,n,r,i)=>{e.disabled=!0,t.entry(r).then(t=>{let r=t&&i(t);if(r===void 0)return void(e.textContent=K());n.textContent=r,e.remove()},()=>e.textContent=K())};function W(e,n=0){if(!n||!t.pic)return null;let a=Array.from({length:n},(n,r)=>t.pic(e,r));return i(`div`,{class:`pics`},...a.map((e,t)=>{let n=i(`img`,{src:e,alt:v({n:t+1}),loading:`lazy`,decoding:`async`}),o=i(`button`,{type:`button`,class:`pic`,"aria-label":R({n:t+1})},n);return n.addEventListener(`error`,()=>o.replaceWith(i(`em`,{class:`pic-gone`},y()))),o.addEventListener(`click`,()=>void r(async()=>{let{lightbox:e}=await import(`./lightbox-Dvr26vhq.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,t))),o}))}function J(e,t){let n=p.result(e.id),r=i(`pre`,{class:`out`},n?.text??``),a=i(`pre`,{class:`args`},e.args??``),o=e.cut?i(`button`,{class:`more`,type:`button`},H()):null;o?.addEventListener(`click`,()=>U(o,a,t,t=>(e=>e&&`${e.args??``}${e.cut?`\n${f()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=n?.more?i(`button`,{class:`more`,type:`button`},V({size:ce(n.bytes??0)})):null;s?.addEventListener(`click`,()=>U(s,r,n.id,e=>e.text));let c=e.name===`show_doc`&&u?i(`button`,{class:`more open`,type:`button`,hidden:``},te()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>u?.(e)?.()))),c&&g.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(_);let l=i(`details`,{class:`act`},i(`summary`,{"data-mark":n?n.isError?`error`:`done`:`working`},i(`b`,{class:`badge`}),i(`code`,null,e.name),i(`span`,{class:`sum`},e.summary),c),a,o,n&&i(`div`,{class:`result`},n.images?i(`em`,null,S({count:n.images})):null,r,s)),d=n&&W(n.id,n.images);return d?[l,d]:[l]}function Y(e){let t=i(`time`,null,se(e.at));switch(e.kind){case`user`:return i(`article`,{class:`tx you`},i(`header`,null,t,i(`b`,null,re()),q(`user`)),i(`div`,{class:`bubble`},...ue(e.text??``),W(e.id,e.images)));case`assistant`:{let r=n(),s=i(`pre`,{class:`thought-text`}),c=e.thought?i(`button`,{class:`thought`,type:`button`},e.thought<0?ne():G({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>U(c,s,e.id,e=>e.thoughtText)),i(`article`,{class:`tx in`},q(r.role),i(`div`,{class:`tx-body`},i(`header`,null,i(`b`,null,r.name),e.model?i(`span`,null,e.model):null,t,e.stop?i(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,s,e.text?i(`div`,{class:`md`},o(a(e.text))):null,e.error?i(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>J(t,e.id))))}case`bash`:return i(`article`,{class:`tx sys`},i(`details`,{class:`act`},i(`summary`,{"data-mark":e.exit?`error`:`done`},i(`b`,{class:`badge`}),i(`code`,null,`shell`),i(`span`,{class:`sum`},`! ${e.command}`),e.exit?i(`span`,{class:`stop`,"data-mark":`error`},h({code:e.exit})):null),e.text?i(`pre`,{class:`out`},e.text):null));case`notice`:return i(`article`,{class:`tx sys`},i(`details`,{class:`notice`},i(`summary`,null,q(`comms`),i(`em`,null,C()),le[e.type??``]?.()??e.type??O(),` `,e.from&&l(e.from)||(e.from??``),t),i(`pre`,null,e.text??``)));case`divider`:return i(`article`,{class:`tx rule`},i(`details`,null,i(`summary`,null,e.type===`compaction`?d({tokens:(e.tokens??0).toLocaleString()}):s()),i(`pre`,null,e.text??``)));default:return i(`article`,{class:`tx note`},e.text??``,` `,t)}}function X(e){e.rebuild&&(m.clear(),b.replaceChildren());for(let t of e.dropped)m.get(t)?.remove(),m.delete(t);let t=e.added.map(e=>(m.set(e.id,Y(e)),m.get(e.id)));e.front?b.prepend(...t):b.append(...t),j&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),E.remove(),p.items.length||b.append(E),x.hidden=!p.before}let Z=e=>e.touched.forEach(e=>{let t=m.get(e),n=p.items.find(t=>t.id===e);if(t&&n){let r=Y(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),m.set(e,r)}}),Q=async()=>{if(!A&&p.before&&j){A=!0;try{let e=D.scrollHeight,n=p.prepend(await t.older(p.before));X(n),Z(n),D.scrollTop+=D.scrollHeight-e}finally{A=!1}p.before&&D.clientHeight&&x.getBoundingClientRect().bottom>=D.getBoundingClientRect().top&&Q()}};new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void Q(),{root:D}).observe(x),T.addEventListener(`click`,()=>{M=void 0,p.detached?t.latest().then(e=>(X(p.reset(e)),L())):L()}),D.addEventListener(`scroll`,()=>(k.scrolled(F()),I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])D.addEventListener(e,()=>N=M=void 0,{passive:!0});let $=new ResizeObserver(()=>k.pinned&&!p.detached?D.scrollTop=D.scrollHeight:N?.scrollIntoView({block:`center`}));return $.observe(b),$.observe(D),{log:D,docs:_,apply(e){if(e.reset)X(p.reset({items:e.items??[],before:e.before})),j=!0,B();else if(e.items?.length){let t=p.append(e.items);X(t),Z(t),k.arrived(t.added.length)&&!p.detached?L():I()}},reveal(e){M=e,j&&B()},setLive(e,t){w.dataset.mark=t,w.lastChild?.textContent!==e&&w.replaceChildren(...e?[i(`b`,{class:`badge`}),i(`span`,null,e)]:[])}}}export{J as mountChat,v as t};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-BTGK6xu9.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{M as e,d as t,n,t as r}from"./index-DDeJoO2R.js";import{t as i}from"./dom-BaTXH9WU.js";import{n as a,t as o}from"./views-BpyIRIy3.js";var s=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),c=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),l=e=>`context compacted · ${e?.tokens} tokens summarized`,u=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,d=((t,n={})=>(n.locale??e())===`zh-TW`?u(t):l(t)),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,h=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),g=e=>`Image ${e?.n}`,_=e=>`圖片 ${e?.n}`,v=((t,n={})=>(n.locale??e())===`zh-TW`?_(t):g(t)),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),b=e=>`${e?.count} image(s)`,x=e=>`${e?.count} 張圖片`,S=((t,n={})=>(n.locale??e())===`zh-TW`?x(t):b(t)),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),T=e=>`${e?.count} new`,E=e=>`${e?.count} 則新訊息`,D=((t,n={})=>(n.locale??e())===`zh-TW`?E(t):T(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),te=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),I=e=>`Open image ${e?.n}`,L=e=>`打開圖片 ${e?.n}`,R=((t,n={})=>(n.locale??e())===`zh-TW`?L(t):I(t)),z=e=>`show all (${e?.size})`,B=e=>`顯示全部(${e?.size})`,V=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),H=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),U=e=>`◇ thought · ${e?.count} chars`,W=e=>`◇ 思考 · ${e?.count} 字元`,G=((t,n={})=>(n.locale??e())===`zh-TW`?W(t):U(t)),ne=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),K=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),re=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function ie(){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?D({count:t}):w()}}async function ae(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 oe(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 se=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,ce=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,le={intercom_message:A,subagent_result:P,subagent_ping:N,subagent_status:F,"pi-loop-monitor":M,"memory-context":j,"doc-review":k},q=e=>{let r=t(`<span class="ava"><svg><use/></svg></span>`);return r.querySelector(`use`).setAttribute(`href`,`#i-${n[e]??e}`),r};function ue(e){let t=[],n=0;for(let r of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))t.push(e.slice(n,r.index),i(`a`,{href:r[0],rel:`noopener noreferrer`,target:`_blank`},r[0])),n=r.index+r[0].length;return[...t,e.slice(n)]}function J(e,t,{who:n,link:l,docFor:u}){let p=oe(),m=new Map,g=new Set,_=()=>g.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>u?.(e))):e.shown&&g.delete(e)),b=i(`div`,{class:`chat-list`}),x=i(`div`,{class:`chat-top`}),w=i(`div`,{class:`chat-live`}),T=i(`button`,{class:`chat-pill`,type:`button`,hidden:``}),E=i(`p`,{class:`chat-empty`},ee()),D=i(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":c()},x,b,w);e.replaceChildren(D,T);let k=ie(),A=!1,j=!1,M,N,P=0,F=()=>D.scrollHeight-D.scrollTop-D.clientHeight<80,I=(e=k.button(p.detached))=>(T.hidden=!e,T.textContent=e??``),L=()=>(k.jump(),N=void 0,D.scrollTop=D.scrollHeight,I());async function z(e){A=!0;let n=await ae(p,t,e,e=>(X(e),Z(e))).finally(()=>A=!1),r=m.get(e);if(M===e){if(!n||!r)return L();k.hold(),N=r,r.scrollIntoView({block:`center`}),r.classList.remove(`lit`),r.offsetWidth,r.classList.add(`lit`),clearTimeout(P),P=window.setTimeout(()=>(N=void 0,r.classList.remove(`lit`)),2e3),I()}}let B=()=>M?void z(M):L(),U=(e,n,r,i)=>{e.disabled=!0,t.entry(r).then(t=>{let r=t&&i(t);if(r===void 0)return void(e.textContent=K());n.textContent=r,e.remove()},()=>e.textContent=K())};function W(e,n=0){if(!n||!t.pic)return null;let a=Array.from({length:n},(n,r)=>t.pic(e,r));return i(`div`,{class:`pics`},...a.map((e,t)=>{let n=i(`img`,{src:e,alt:v({n:t+1}),loading:`lazy`,decoding:`async`}),o=i(`button`,{type:`button`,class:`pic`,"aria-label":R({n:t+1})},n);return n.addEventListener(`error`,()=>o.replaceWith(i(`em`,{class:`pic-gone`},y()))),o.addEventListener(`click`,()=>void r(async()=>{let{lightbox:e}=await import(`./lightbox-CAhvqYD4.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,t))),o}))}function J(e,t){let n=p.result(e.id),r=i(`pre`,{class:`out`},n?.text??``),a=i(`pre`,{class:`args`},e.args??``),o=e.cut?i(`button`,{class:`more`,type:`button`},H()):null;o?.addEventListener(`click`,()=>U(o,a,t,t=>(e=>e&&`${e.args??``}${e.cut?`\n${f()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=n?.more?i(`button`,{class:`more`,type:`button`},V({size:ce(n.bytes??0)})):null;s?.addEventListener(`click`,()=>U(s,r,n.id,e=>e.text));let c=e.name===`show_doc`&&u?i(`button`,{class:`more open`,type:`button`,hidden:``},te()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>u?.(e)?.()))),c&&g.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(_);let l=i(`details`,{class:`act`},i(`summary`,{"data-mark":n?n.isError?`error`:`done`:`working`},i(`b`,{class:`badge`}),i(`code`,null,e.name),i(`span`,{class:`sum`},e.summary),c),a,o,n&&i(`div`,{class:`result`},n.images?i(`em`,null,S({count:n.images})):null,r,s)),d=n&&W(n.id,n.images);return d?[l,d]:[l]}function Y(e){let t=i(`time`,null,se(e.at));switch(e.kind){case`user`:return i(`article`,{class:`tx you`},i(`header`,null,t,i(`b`,null,re()),q(`user`)),i(`div`,{class:`bubble`},...ue(e.text??``),W(e.id,e.images)));case`assistant`:{let r=n(),s=i(`pre`,{class:`thought-text`}),c=e.thought?i(`button`,{class:`thought`,type:`button`},e.thought<0?ne():G({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>U(c,s,e.id,e=>e.thoughtText)),i(`article`,{class:`tx in`},q(r.role),i(`div`,{class:`tx-body`},i(`header`,null,i(`b`,null,r.name),e.model?i(`span`,null,e.model):null,t,e.stop?i(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,s,e.text?i(`div`,{class:`md`},o(a(e.text))):null,e.error?i(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>J(t,e.id))))}case`bash`:return i(`article`,{class:`tx sys`},i(`details`,{class:`act`},i(`summary`,{"data-mark":e.exit?`error`:`done`},i(`b`,{class:`badge`}),i(`code`,null,`shell`),i(`span`,{class:`sum`},`! ${e.command}`),e.exit?i(`span`,{class:`stop`,"data-mark":`error`},h({code:e.exit})):null),e.text?i(`pre`,{class:`out`},e.text):null));case`notice`:return i(`article`,{class:`tx sys`},i(`details`,{class:`notice`},i(`summary`,null,q(`comms`),i(`em`,null,C()),le[e.type??``]?.()??e.type??O(),` `,e.from&&l(e.from)||(e.from??``),t),i(`pre`,null,e.text??``)));case`divider`:return i(`article`,{class:`tx rule`},i(`details`,null,i(`summary`,null,e.type===`compaction`?d({tokens:(e.tokens??0).toLocaleString()}):s()),i(`pre`,null,e.text??``)));default:return i(`article`,{class:`tx note`},e.text??``,` `,t)}}function X(e){e.rebuild&&(m.clear(),b.replaceChildren());for(let t of e.dropped)m.get(t)?.remove(),m.delete(t);let t=e.added.map(e=>(m.set(e.id,Y(e)),m.get(e.id)));e.front?b.prepend(...t):b.append(...t),j&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),E.remove(),p.items.length||b.append(E),x.hidden=!p.before}let Z=e=>e.touched.forEach(e=>{let t=m.get(e),n=p.items.find(t=>t.id===e);if(t&&n){let r=Y(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),m.set(e,r)}}),Q=async()=>{if(!A&&p.before&&j){A=!0;try{let e=D.scrollHeight,n=p.prepend(await t.older(p.before));X(n),Z(n),D.scrollTop+=D.scrollHeight-e}finally{A=!1}p.before&&D.clientHeight&&x.getBoundingClientRect().bottom>=D.getBoundingClientRect().top&&Q()}};new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void Q(),{root:D}).observe(x),T.addEventListener(`click`,()=>{M=void 0,p.detached?t.latest().then(e=>(X(p.reset(e)),L())):L()}),D.addEventListener(`scroll`,()=>(k.scrolled(F()),I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])D.addEventListener(e,()=>N=M=void 0,{passive:!0});let $=new ResizeObserver(()=>k.pinned&&!p.detached?D.scrollTop=D.scrollHeight:N?.scrollIntoView({block:`center`}));return $.observe(b),$.observe(D),{log:D,docs:_,apply(e){if(e.reset)X(p.reset({items:e.items??[],before:e.before})),j=!0,B();else if(e.items?.length){let t=p.append(e.items);X(t),Z(t),k.arrived(t.added.length)&&!p.detached?L():I()}},reveal(e){M=e,j&&B()},setLive(e,t){w.dataset.mark=t,w.lastChild?.textContent!==e&&w.replaceChildren(...e?[i(`b`,{class:`badge`}),i(`span`,null,e)]:[])}}}export{J as mountChat,v as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -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;align-items:center;gap: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;font-size:20px}.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}.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{align-items:center;gap:8px;display:flex}.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}.close-x{color:var(--dim);font:600 16px/1.4 var(--sans);cursor:pointer;background:0 0;border:0;border-radius:8px;margin-left:6px;padding:0 7px}.close-x:hover{color:#ff8a9c}.base>header .close-x,.zoom-in header .close-x{align-self:flex-start;margin-left:auto}.d-close:hover{color:#ff8a9c}.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{gap:4px;display:flex}.modes[hidden]{display:none}.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}.lightbox button[hidden]{display:none}.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{display:none}.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[hidden]{display:none}.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}.packet{fill:#38e0ff;opacity:.9}.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}.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;margin-bottom:8px;font-size:11px;font-weight:600}.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}@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 out{to{opacity:0;transform:scale(.94)}}@keyframes flash{40%{transform:scale(1.12)}}@keyframes slide{0%{opacity:0;transform:translate(10px)}}@keyframes zoom{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}[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}.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)}.base>header{position:relative}.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}.modes{flex:none}.modes+.chan{margin-left:12px}.head-close{flex:none;margin-left:4px;font-size:20px}.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-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}.composer{border-top:1px solid var(--line);background:var(--panel);gap:8px;padding:12px 18px 14px;display:grid}.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}.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}.composer{position:relative}.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 90px;min-width:0}.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}.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{margin-top:8px}.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}.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}.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-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}.d-close{margin-top:12px;font-size:13px}.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}@media (width<=640px){.pad-key,.pad-yes{min-height:44px}.pad-digits summary{padding:14px 0}}.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}.alerts{flex:100%;order:3;width:auto}.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}.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%}.comms-in,.tile{height:calc(var(--vvh,100dvh) - 16px);border-radius:16px;min-height:300px}.chat-scroll{padding:12px}.comms-head{grid-template-columns:auto minmax(0,1fr) auto auto;gap:8px 10px;padding:10px 12px;display:grid}.comms-head .logo{border-radius:11px;width:36px;height:36px}.comms-head .logo svg{width:22px;height:22px}.comms-head h2 small,.chan b{display:none}.modes+.chan{margin-left:0}.head-close{border:1px solid var(--line);border-radius:12px;min-width:40px;min-height:40px;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}.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}.bubble{max-width:92%}.composer{padding:10px 12px calc(10px + env(safe-area-inset-bottom))}.cmp-row{flex-wrap:wrap}.composer textarea{flex:100%;min-height:64px}.cmp-acts{margin-left:auto}.log{max-height:none}.log li:nth-child(n+3){display:none}.dock{top:auto;right:10px;bottom:calc(10px + env(safe-area-inset-bottom));width:calc(100vw - 20px)}}@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,.d-close,.d-doc{min-height:40px}.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=pe(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(me(t)&&m.has(t)){let e=m.get(t);if(e){let t=e.getLocale();if(t instanceof Promise)continue;if(t!==void 0)return te(t)}}let e=f(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=pe(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(me(t)&&m.has(t)){let n=m.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()},ee=()=>typeof window<`u`?window.location.origin:`http://fallback.com`;function f(e){if(typeof e!=`string`)return;let n=e.toLowerCase();for(let e of t)if(e.toLowerCase()===n)return e}function te(e){let n=f(e);if(n)return n;throw Error(`Invalid locale: ${e}. Expected one of: ${t.join(`, `)}`)}function p(e){return e}function ne(t,n){return new e(t,n.href)}function re(){return 0}function ie(e){return i}function ae(e,t){return e.exec(t.href)}var oe=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${oe}=([^;]*)`);function se(e){return ce(e)}function ce(e){let t=p(typeof e==`string`?new URL(e,ee()):new URL(e.href)),n=t.pathname.replace(/^\/+/,``).split(`/`);return n.length>0&&f(n[0])&&(t.pathname=`/`+n.slice(1).join(`/`)),p(t)}var le=-1,ue,de;function fe(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=re();if(ue===t&&le===n)return de;let r=p(new URL(t,`http://example.com`)),a=se(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of ie(e))if(ae(ne(t.match,e),e)){s=t;break}if(s)break}return le=n,ue=t,de=s,s}function pe(e){let t=fe(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var m=new Map;function me(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}var he=((e={},t={})=>(t.locale??s())===`zh-TW`?`警示`:`Alerts`),ge=((e={},t={})=>(t.locale??s())===`zh-TW`?`所有基地`:`all bases`),_e=((e={},t={})=>(t.locale??s())===`zh-TW`?``:`.`),ve=((e={},t={})=>(t.locale??s())===`zh-TW`?`最後更新:`:`Last update`),ye=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,be=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,xe=((e,t={})=>(t.locale??s())===`zh-TW`?be(e):ye(e)),Se=e=>`The server is up but cannot read the net: ${e?.problem}`,Ce=e=>`伺服器正常,但讀不到網:${e?.problem}`,we=((e,t={})=>(t.locale??s())===`zh-TW`?Ce(e):Se(e)),Te=((e={},t={})=>(t.locale??s())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),Ee=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,De=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,Oe=((e,t={})=>(t.locale??s())===`zh-TW`?De(e):Ee(e)),ke=((e={},t={})=>(t.locale??s())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),Ae=((e={},t={})=>(t.locale??s())===`zh-TW`?`取消`:`Cancel`),h=((e={},t={})=>(t.locale??s())===`zh-TW`?`關閉`:`Close`),je=e=>`Close base ${e?.name}`,Me=e=>`關閉基地 ${e?.name}`,Ne=((e,t={})=>(t.locale??s())===`zh-TW`?Me(e):je(e)),Pe=e=>`Close base ${e?.name}? Every agent in it and its tower quit.`,Fe=e=>`要關閉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。`,Ie=((e,t={})=>(t.locale??s())===`zh-TW`?Fe(e):Pe(e)),Le=e=>`Close squad ${e?.name}`,Re=e=>`關閉小隊 ${e?.name}`,ze=((e,t={})=>(t.locale??s())===`zh-TW`?Re(e):Le(e)),Be=e=>`Close squad ${e?.name}? Every agent in it quits.`,Ve=e=>`要關閉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,He=((e,t={})=>(t.locale??s())===`zh-TW`?Ve(e):Be(e)),Ue=e=>`Close the tower ${e?.name}? The base's mains become members again.`,We=e=>`要關閉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Ge=((e,t={})=>(t.locale??s())===`zh-TW`?We(e):Ue(e)),Ke=e=>`Close ${e?.name}? It quits pi and its pane closes.`,qe=e=>`要關閉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Je=((e,t={})=>(t.locale??s())===`zh-TW`?qe(e):Ke(e)),Ye=e=>`control tower · ${e?.state}`,Xe=e=>`塔台 · ${e?.state}`,Ze=((e,t={})=>(t.locale??s())===`zh-TW`?Xe(e):Ye(e)),Qe=((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.`),$e=((e={},t={})=>(t.locale??s())===`zh-TW`?`文件`:`Documents`),et=((e={},t={})=>(t.locale??s())===`zh-TW`?`總塔台`:`head tower`),tt=((e={},t={})=>(t.locale??s())===`zh-TW`?`語言`:`Language`),nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`連線中`:`connecting`),rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時`:`live`),it=((e={},t={})=>(t.locale??s())===`zh-TW`?`離線`:`offline`),at=((e={},t={})=>(t.locale??s())===`zh-TW`?`重新連線中`:`reconnecting`),ot=((e={},t={})=>(t.locale??s())===`zh-TW`?`正體中文`:`English`),st=((e={},t={})=>(t.locale??s())===`zh-TW`?`位置`:`Location`),ct=e=>`${e?.name} finished`,lt=e=>`${e?.name} 已完成`,ut=((e,t={})=>(t.locale??s())===`zh-TW`?lt(e):ct(e)),dt=e=>`${e?.name} hit an error`,ft=e=>`${e?.name} 發生錯誤`,pt=((e,t={})=>(t.locale??s())===`zh-TW`?ft(e):dt(e)),mt=e=>`${e?.name} went idle`,ht=e=>`${e?.name} 轉為閒置`,gt=((e,t={})=>(t.locale??s())===`zh-TW`?ht(e):mt(e)),_t=e=>`${e?.name} joined`,vt=e=>`${e?.name} 加入`,yt=((e,t={})=>(t.locale??s())===`zh-TW`?vt(e):_t(e)),bt=e=>`${e?.name} left`,xt=e=>`${e?.name} 離開`,St=((e,t={})=>(t.locale??s())===`zh-TW`?xt(e):bt(e)),Ct=e=>`${e?.name} lost its status`,wt=e=>`${e?.name} 失去狀態`,Tt=((e,t={})=>(t.locale??s())===`zh-TW`?wt(e):Ct(e)),Et=e=>`${e?.name} is waiting on a question`,Dt=e=>`${e?.name} 正在等待回答`,Ot=((e,t={})=>(t.locale??s())===`zh-TW`?Dt(e):Et(e)),kt=e=>`${e?.name} started working`,At=e=>`${e?.name} 開始工作`,jt=((e,t={})=>(t.locale??s())===`zh-TW`?At(e):kt(e)),g=((e={},t={})=>(t.locale??s())===`zh-TW`?`已完成`:`finished`),Mt=((e={},t={})=>(t.locale??s())===`zh-TW`?`錯誤`:`error`),_=((e={},t={})=>(t.locale??s())===`zh-TW`?`閒置`:`idle`),Nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無狀態`:`no status`),v=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待回答`:`waiting on a question`),Pt=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`working`),Ft=((e={},t={})=>(t.locale??s(),`Logs`)),It=((e={},t={})=>(t.locale??s())===`zh-TW`?`從未`:`never`),Lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`+新基地`:`+ New base`),Rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),zt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無警示`:`no alerts`),Bt=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),Vt=((e={},t={})=>(t.locale??s())===`zh-TW`?`尚無塔台`:`no tower yet`),Ht=((e={},t={})=>(t.locale??s())===`zh-TW`?`思考中`:`thinking`),Ut=e=>`Finished ${e?.note}`,Wt=e=>`完成了 ${e?.note}`,Gt=((e,t={})=>(t.locale??s())===`zh-TW`?Wt(e):Ut(e)),Kt=e=>`Failed ${e?.note}`,qt=e=>`出錯了 ${e?.note}`,Jt=((e,t={})=>(t.locale??s())===`zh-TW`?qt(e):Kt(e)),Yt=e=>`Waiting on you ${e?.note}`,Xt=e=>`等你回答 ${e?.note}`,Zt=((e,t={})=>(t.locale??s())===`zh-TW`?Xt(e):Yt(e)),Qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`+主智慧體`:`+ Main`),$t=((e={},t={})=>(t.locale??s())===`zh-TW`?`+成員`:`+ Member`),en=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`Outposts`),tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`手機`:`Phone`),nn=((e={},t={})=>(t.locale??s())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),an=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),on=e=>`Refused (${e?.status}).`,sn=e=>`已拒絕(${e?.status})。`,cn=((e,t={})=>(t.locale??s())===`zh-TW`?sn(e):on(e)),ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒`:`Remind`),un=((e={},t={})=>(t.locale??s())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已關`:`Reminders off`),pn=((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`),mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`主智慧體`:`main`),gn=((e={},t={})=>(t.locale??s())===`zh-TW`?`成員`:`member`),_n=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`outpost`),vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`未編入`:`unaligned`),yn=((e={},t={})=>(t.locale??s(),`session`)),bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`子智慧體`:`subagent`),xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`塔台`:`tower`),Sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效`:`Sound`),Cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已關`:`Sounds off`),wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已開`:`Sounds on`),Tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`智慧體`:`Agents`),En=((e={},t={})=>(t.locale??s())===`zh-TW`?`基地`:`Bases`),Dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待中`:`Waiting`),On=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`Working`),kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`狀態`:`States`),An=e=>`tab ${e?.label}`,jn=e=>`分頁 ${e?.label}`,Mn=((e,t={})=>(t.locale??s())===`zh-TW`?jn(e):An(e)),Nn=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),Pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`網的總計`:`Net totals`),Fn=e=>`${e?.label} tower`,In=e=>`${e?.label} 塔台`,Ln=((e,t={})=>(t.locale??s())===`zh-TW`?In(e):Fn(e)),Rn=e=>`using ${e?.tool}`,zn=e=>`使用 ${e?.tool}`,Bn=((e,t={})=>(t.locale??s())===`zh-TW`?zn(e):Rn(e)),Vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待變化…`:`Waiting for changes…`),Hn=`sb-locale`;function Un(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 f(e)??(t?f(t):void 0)??f(e.split(`-`)[0])}function Wn(e,t){return f(e)??t.map(Un).find(Boolean)??`en`}var Gn={brand_label:ke,tagline:Nn,totals_label:Pn,stat_bases:En,stat_agents:Tn,stat_working:On,stat_waiting:Dn,alerts:he,no_alerts:zt,pair_button:tn,pair_title:nn,link_connecting:nt,location:st,all_bases:ge,documents:$e,net_log:Ft,states:kn,mark_working:Pt,mark_waiting:v,mark_idle:_,mark_done:g,mark_error:Mt,credit:Qe,language:tt,waiting_changes:Vn,new_base:Lt};Object.keys(Gn);function Kn(){let e=null;try{e=localStorage.getItem(Hn)}catch{}let n=Wn(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,Gn[e.dataset[t]]?.()??e.dataset[t]);let i=document.getElementById(`lang`);i.replaceChildren(...t.map(e=>new Option(ot({},{locale:e}),e,!1,e===n))),i.onchange=()=>{try{localStorage.setItem(Hn,i.value),location.reload()}catch{i.value=n}}}var qn={working:jt,waiting:Ot,idle:gt,done:ut,error:pt,unknown:Tt};function Jn(e){let t=new Map;for(let n of e.bases){n.tower&&t.set(`tower:${n.id}`,{name:Ln({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 Yn(e,t){if(!e)return[];let[n,r]=[Jn(e),Jn(t)],i=[];for(let[e,t]of r){let r=n.get(e);r?r.mark!==t.mark&&i.push({text:qn[t.mark]({name:t.name}),mark:t.mark}):i.push({text:yt({name:t.name}),mark:t.mark})}for(let[e,t]of n)r.has(e)||i.push({text:St({name:t.name}),mark:`idle`});return i}var Xn=e=>e===`waiting`||e===`error`?0:1;function Zn(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});return n}function Qn(e,t){return[...t.values()].filter(t=>e?.get(t.key)?.mark!==t.mark&&(Xn(t.mark)===0||e!==void 0&&t.mark===`done`))}var $n=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,er=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,tr={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:er,done:$n},nr=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,rr=(e,t)=>{try{let n=localStorage.getItem(e);return n===null?t:n===`1`}catch{return t}},ir=(e,t)=>{try{localStorage.setItem(e,t?`1`:`0`)}catch{}};function ar(e){let t=document.getElementById(`remind`),n=document.getElementById(`sound`),r=typeof Notification<`u`,i=rr(`sb.remind`,!0),a=rr(`sb.sound`,!1),o=new Map,s=()=>{let e=r?Notification.permission:`denied`;t.setAttribute(`aria-pressed`,String(i)),t.dataset.state=i?e===`granted`?`on`:e===`denied`?`blocked`:`ask`:`off`,t.title=r?i?e===`granted`?pn():e===`denied`?dn():un():fn():mn(),n.setAttribute(`aria-pressed`,String(a)),n.dataset.state=a?`on`:`off`,n.title=a?wn():Cn()};t.textContent=ln(),n.textContent=Sn(),t.onclick=async()=>{i&&r&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):ir(`sb.remind`,i=!i),s()},n.onclick=()=>{ir(`sb.sound`,a=!a),a&&c(`done`),s()};function c(e){let t=o.get(e)??new Audio(tr[e]);o.set(e,t),t.currentTime=0,t.play().catch(()=>{})}return s(),{signal(t){let n=t.flatMap(e=>(t=>t?[{a:e,k:t}]:[])(nr(e)));if(n.length&&(a&&c([`waiting`,`error`,`done`].find(e=>n.some(t=>t.k===e))),i&&r&&Notification.permission===`granted`&&(document.hidden||!document.hasFocus())))for(let{a:t,k:r}of n){let n=new Notification(t.name,{body:{waiting:Zt,error:Jt,done:Gt}[r]({note:t.note??``}).trim(),tag:t.key,icon:document.querySelector(`link[rel="icon"]`)?.href});n.onclick=()=>(window.focus(),n.close(),e(t))}}}}var or=e=>{try{return decodeURIComponent(e)}catch{return e}},y=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function sr(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(or);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 b=e=>e.view===`map`?``:e.view===`workspace`?`w/${y(e.ws)}`:`w/${y(e.ws)}/s/${y(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,cr=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},x=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null;function lr(e,t=new URL(document.baseURI).pathname){let n=()=>sr(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>b(e)||`./`,go(n){let r=t+b(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(sr(t.getAttribute(`data-route`))))}),r}var ur={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},S={working:Pt,waiting:v,idle:_,done:g,error:Mt,unknown:Nt},dr={main:hn,member:gn,subagent:bn,tower:xn,outpost:_n,outside:vn,session:yn},fr={thinking:Ht,idle:_,"waiting on a question":v,finished:g},pr=e=>Object.hasOwn(dr,e)?dr[e]():e,mr=e=>e===`waiting`||e===`error`,C=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)},w=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},T=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},E=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&(e.classList.remove(`flash`),e.offsetWidth,e.classList.add(`flash`))},D=(e,t)=>e?e.startsWith(`tool:`)?Bn({tool:e.slice(5)}):Object.hasOwn(fr,e)?fr[e]():e:S[t](),O=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,b(t)||`./`),e.setAttribute(`data-route`,b(t)))},hr=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function gr(e,t,n,r){E(e,n);let i=e.querySelector(`use`),a=`#i-${ur[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 k(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 A=()=>C(`<div class="unit"><div class="card"><a class="hit"></a>${hr}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></div></div><div class="subs"></div></div>`);function j(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);O(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${D(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,mr(t.mark)),E(e,t.mark),gr(e.querySelector(`.plate`),t.role,t.mark,t.docs),T(e,`.name`,t.name),T(e,`.role`,pr(t.role)),T(e,`.note`,D(t.note,t.mark)),k(e.querySelector(`.subs`),t.subs??[],A,j)}function M(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`?Qt():$t())&&(e.textContent=r===`main`?Qt():$t())}function _r(e,t,n){e.dataset.ws=t.id,e.dataset.name=n?n.label:t.label,n&&(e.dataset.tab=n.id),e.setAttribute(`aria-label`,n?ze({name:n.label}):Ne({name:t.label}))}var vr=()=>C(`<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>${et()}</span><h2><a class="enter-base"></a></h2><p></p></div><button type="button" class="close-x" 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="${en()}"></div></section>`);function yr(e,t){E(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),E(n,t.tower?.mark??`unknown`),T(e,`h2 a`,t.label),O(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),T(e,`.title p`,t.tower?Ze({state:S[t.tower.mark]()}):Vt()),M(e.querySelector(`.spawn-btns button`),t),_r(e.querySelector(`header .close-x`),t),k(e.querySelector(`.tabs`),t.tabs,()=>C(`<div class="tab"><h3><span></span><button type="button" class="tab-add"></button><button type="button" class="close-x" data-close="tab">×</button></h3><div class="units"></div></div>`),(e,n)=>{T(e,`h3 span`,Mn({label:n.label})),_r(e.querySelector(`.close-x`),t,n),M(e.querySelector(`.tab-add`),t,n.id),k(e.querySelector(`.units`),n.units,A,j)}),k(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?Rt():void 0})),A,j)}function br(e,t,n){let r=[...e.querySelectorAll(`.base:not(.leaving) .tower`)],i=e.querySelector(`.base.head:not(.leaving) .tower`),a=e.getBoundingClientRect(),o=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-a.x),Math.round(t.y+t.height/2-a.y)]},s=i?r.filter(e=>e!==i).map(e=>{let[[t,n],[r,a]]=[o(i),o(e)],s=Math.round((t+r)/2);return`M${t} ${n}C${s} ${n} ${s} ${a} ${r} ${a}`}):[],c=s.join(`|`);if(t.dataset.sig===c)return;t.dataset.sig=c;let l=(e,t,...n)=>{let r=document.createElementNS(`http://www.w3.org/2000/svg`,e);for(let[e,n]of Object.entries(t))r.setAttribute(e,n);return r.append(...n),r};t.replaceChildren(...s.flatMap(e=>[l(`path`,{class:`wire`,d:e}),...n?[]:[l(`circle`,{class:`packet`,r:`3`},l(`animateMotion`,{dur:`5s`,repeatCount:`indefinite`,path:e}))]]))}function xr(){let[e,t,n,r]=[w(`map`,HTMLElement),w(`bases`,HTMLElement),w(`links`,SVGSVGElement),w(`log`,HTMLElement)],i=matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=()=>!e.hidden&&br(e,n,i);return new ResizeObserver(a).observe(e),{layout:a,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`)]])w(t,HTMLElement).textContent=r},show(e){k(t,e.bases,vr,yr),requestAnimationFrame(a)},log(e){let t=new Date().toLocaleTimeString([],{hour12:!1});for(let n of e){let e=C(`<li><span></span><time></time></li>`);e.dataset.mark=n.mark,T(e,`span`,n.text),T(e,`time`,t),r.prepend(e)}for(;r.children.length>12;)r.lastElementChild.remove()},pause(e){document.documentElement.classList.toggle(`paused`,e)},still(e){e?n.pauseAnimations():n.unpauseAnimations()}}}var Sr=45e3,Cr=1e3,wr=3e4,Tr=(e,t)=>Math.min(wr,Cr*2**(e-1))*(.8+.4*t);function Er(e){try{return JSON.parse(e)}catch{return}}function Dr(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(),Sr),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,Tr(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=Er(r);i&&e.onNet(i),o({problem:i?void 0:rn()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:Er(e)??an()}),l())}),r=e.setTimeout(()=>u(),Sr)};return{start(){o({state:`connecting`,attempt:0}),d()},resume(){let n=e.now()-i<2e3||a.lastContact!==void 0&&e.now()-a.lastContact<=2e4;t&&n||(o({attempt:0,state:a.state===`live`?`reconnecting`:a.state}),d())},restart:d,hide(){e.clearTimeout(n),n=void 0},stop(){c(),s()}}}var Or=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),kr=function(e,t){return new URL(e,t).href},Ar={},jr=function(e){return e.pathname.endsWith(`.css`)},Mr=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},N=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=kr(t,n);let r=s(t),i=jr(r);return Mr(Ar,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`:Or,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)})};Kn();var P=xr(),F=e=>document.getElementById(e),Nr=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):It(),Pr,Fr,I,L,R={state:`connecting`,attempt:0},z={view:`map`},Ir=!1,B,Lr=``,V,Rr,H=e=>V?e(V):void Rr?.then(e);function zr(){Rr??=N(async()=>{let{mountFocus:e}=await import(`./views-BpyIRIy3.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(V=e({data:Xr,restart:()=>$.restart(),openTile:G,embedTerminal:(e,t,n)=>new Promise(r=>W(i=>r(i.terminal.embed(e,t,n)))),online:()=>R.state===`live`}),V.show(z,z),I&&V.net(I),V))}var U,Br,W=e=>{if(U)return e(U);Br??=N(async()=>{let{mountPanels:e}=await import(`./layer-BLf_e8pX.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>U=e({label:e=>I?.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:()=>Lr,showTerminal:(e,t)=>(U?.stack.close(),V?.terminal(t),Q.go({view:`session`,ws:e,key:t}))})),Br.then(e)},G=(e,t)=>W(n=>n.tiles.open(e,t)),K=document.querySelector(`link[rel="icon"]`),q=K&&decodeURIComponent(K.href.slice(K.href.indexOf(`,`)+1)),Vr=0;function Hr(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(!K||!q||t===Vr)return;Vr=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>`;K.href=`data:image/svg+xml,${encodeURIComponent(t?q.replace(`</svg>`,`${n}</svg>`):q)}`}var J;function Y(e){I=L=e,Hr(e);let t=Zn(e,Date.now());if(J&&Qr.signal(Qn(J,t)),J=t,document.hidden)return;P.stats(e);let n=Qn(B,t);(n.length||U)&&W(e=>e.alerts(n,t)),B=t,P.log(Yn(Fr,e)),Fr=e,H(t=>t.net(e)),z.view===`map`&&(P.show(e),Pr=e,L=void 0)}function Ur(e){let t=z,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;z=e,e.view!==`map`&&zr(),F(`map`).hidden=e.view!==`map`,F(`legend`).hidden=e.view===`session`,P.still(e.view!==`map`),H(r=>r.show(e,t,n)),e.view===`map`&&I&&I!==Pr&&(Y(I),requestAnimationFrame(P.layout)),Ir&&x(e)!==x(t)&&$.restart()}function Wr(e){R=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=F(`stage`).dataset.stale=String(t),F(`link`).dataset.state=e.state,F(`link-text`).textContent={connecting:nt,live:rt,reconnecting:at,offline:it}[e.state](),V&&I&&V.net(I),U?.stack.redraw();let n=F(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?xe({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?Oe({attempt:e.attempt}):Te():we({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=Nr(e.lastContact),n.replaceChildren(`${r} ${ve()} `,i,_e())}function Gr(e,t){try{let n=JSON.parse(t);H(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var Kr=document.querySelector(`meta[name="sb-build"]`)?.content,qr=e=>!!(Kr&&Kr!==JSON.parse(e).build);function Jr(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 Yr=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),X=(e,t=``)=>Yr(`history/${encodeURIComponent(e)}${t}`),Z=void 0,Xr=e=>({older:t=>X(e,`?before=${encodeURIComponent(t)}`),latest:()=>X(e),entry:t=>Yr(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),Zr=()=>{let e=Jr(x(z));return e.listen(`history`,e=>Gr(`history`,e)),e.listen(`cards`,e=>Gr(`cards`,e)),e.listen(`hello`,e=>qr(e)?location.reload():(Lr=e,U?.terminal.hello())),e.listen(`mirror`,e=>U?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&sr(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=B?.get(n.key);r&&(e.preventDefault(),W(e=>e.stack.show(r)))},!0);var Q=lr(e=>Ur(e)),Qr=ar(e=>Q.go({view:`session`,ws:e.ws,key:e.key})),$=Dr({open:Zr,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:Y,onStatus:Wr}),$r=()=>$.resume();document.addEventListener(`visibilitychange`,()=>{if(P.pause(document.hidden),document.hidden)return $.hide();L&&Y(L),H(e=>e.wake()),$r()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open]`)||(e.preventDefault(),!U?.stack.close()&&z.view!==`map`&&Q.go(cr(z)))}),F(`pair`).addEventListener(`click`,()=>void N(async()=>{let{pairTile:e}=await import(`./pair-BUuSyACk.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>G(e(),!0)));var ei=(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(Ae(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(h(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()}),ti=e=>{if(z.view===`map`)return;if(e.close===`base`)return void(z.ws===e.ws&&Q.go({view:`map`}));let t=e=>e.flatMap(e=>[e.key,...t(e.subs)]),n=e.close===`tab`&&z.ws===e.ws?I?.bases.find(t=>t.id===e.ws)?.tabs.find(t=>t.id===e.tab):void 0;z.view===`session`&&(e.close===`unit`?z.key===e.key:n&&t(n.units).includes(z.key))&&Q.go({view:`workspace`,ws:z.ws})};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-close]`),n=t?.dataset;t&&n&&(e.preventDefault(),ei((n.close===`base`?Ie:n.close===`tab`?He:n.role===`tower`?Ge:Je)({name:n.name??``}),h()).then(e=>{e&&(t.toggleAttribute(`disabled`,!0),N(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/${n.close}`,n.close===`unit`?{key:n.key}:{workspace:n.ws,...n.tab&&{tab:n.tab}})).then(e=>e.ok?ti(n):ei(e.body.reason??cn({status:e.status})),()=>ei(Bt())).finally(()=>t.toggleAttribute(`disabled`,!1)))}))}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&N(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-DUzwQQcg.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,I?.bases??[]);r&&G(n(r),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&$r());Wr(R),Ur(Q.route()),$.start(),Ir=!0;export{Ae as A,Bt as C,$e as D,et as E,s as M,Ze as O,Vt as S,Rt as T,Xn as _,O as a,cn as b,w as c,C as d,E as f,mr as g,T as h,hr as i,ge as j,h as k,D as l,k as m,ur as n,_r as o,pr as p,S as r,M as s,N as t,gr as u,On as v,zt as w,en as x,Dn as y};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./post-UHMNmNgA.js";import{i as t,n,t as r}from"./ask-BzyjXf83.js";import{A as i,M as a,_ as o,a as s,b as c,c as l,d as u,f as d,h as f,i as p,k as m,l as h,m as g,p as ee,u as _,w as te}from"./index-CZq2ySys.js";import{t as v}from"./dom-BaTXH9WU.js";var y=e=>`Alerts: ${e?.tally}`,b=e=>`警示:${e?.tally}`,ne=((e,t={})=>(t.locale??a())===`zh-TW`?b(e):y(e)),x=e=>`Also queued: ${e?.tally}`,S=e=>`佇列中還有:${e?.tally}`,re=((e,t={})=>(t.locale??a())===`zh-TW`?S(e):x(e)),C=((e={},t={})=>(t.locale??a())===`zh-TW`?`關閉文件`:`Close document`),w=e=>`Close ${e?.title}`,T=e=>`關閉 ${e?.title}`,ie=((e,t={})=>(t.locale??a())===`zh-TW`?T(e):w(e)),E=((e={},t={})=>(t.locale??a())===`zh-TW`?`連線中…`:`Connecting…`),D=((e={},t={})=>(t.locale??a())===`zh-TW`?`警示`:`alert`),ae=((e={},t={})=>(t.locale??a())===`zh-TW`?`符合寬度`:`Fit width`),oe=((e={},t={})=>(t.locale??a())===`zh-TW`?`無法取得紀錄。`:`History unavailable.`),O=((e={},t={})=>(t.locale??a())===`zh-TW`?`退格鍵`:`Backspace`),k=((e={},t={})=>(t.locale??a())===`zh-TW`?`下`:`Down`),A=((e={},t={})=>(t.locale??a(),`End`)),j=((e={},t={})=>(t.locale??a(),`Enter`)),M=((e={},t={})=>(t.locale??a(),`Escape`)),N=((e={},t={})=>(t.locale??a(),`Home`)),P=((e={},t={})=>(t.locale??a())===`zh-TW`?`左`:`Left`),F=((e={},t={})=>(t.locale??a())===`zh-TW`?`下一頁`:`Page down`),I=((e={},t={})=>(t.locale??a())===`zh-TW`?`上一頁`:`Page up`),L=((e={},t={})=>(t.locale??a())===`zh-TW`?`右`:`Right`),R=((e={},t={})=>(t.locale??a(),`Shift+Tab`)),z=((e={},t={})=>(t.locale??a())===`zh-TW`?`空白鍵`:`Space`),B=((e={},t={})=>(t.locale??a(),`Tab`)),V=((e={},t={})=>(t.locale??a())===`zh-TW`?`上`:`Up`),H=e=>`Keys for ${e?.name}`,U=e=>`${e?.name} 的按鍵`,W=((e,t={})=>(t.locale??a())===`zh-TW`?U(e):H(e)),G=((e={},t={})=>(t.locale??a())===`zh-TW`?`最後一則通訊`:`Last transmission`),K=((e={},t={})=>(t.locale??a())===`zh-TW`?`稍後`:`Later`),q=((e={},t={})=>(t.locale??a())===`zh-TW`?`已離開網`:`left the net`),se=e=>`The mirror ended: ${e?.why}`,ce=e=>`鏡像已結束:${e?.why}`,le=((e,t={})=>(t.locale??a())===`zh-TW`?ce(e):se(e)),ue=((e={},t={})=>(t.locale??a())===`zh-TW`?`等待輸入密碼時隱藏;請在終端機中輸入。`:`Hidden while it waits for a secret; type it in the terminal.`),de=e=>`Live · ${e?.cols}×${e?.rows}`,fe=e=>`即時 · ${e?.cols}×${e?.rows}`,pe=((e,t={})=>(t.locale??a())===`zh-TW`?fe(e):de(e)),me=((e={},t={})=>(t.locale??a())===`zh-TW`?`還沒有訊息。`:`No messages yet.`),he=((e={},t={})=>(t.locale??a())===`zh-TW`?`開啟通訊`:`Open comms`),ge=((e={},t={})=>(t.locale??a())===`zh-TW`?`此分頁隱藏時暫停。`:`Paused while this tab is hidden.`),_e=e=>`${e?.why} Open the terminal again to retry.`,ve=e=>`${e?.why} 重新開啟終端機即可重試。`,ye=((e,t={})=>(t.locale??a())===`zh-TW`?ve(e):_e(e)),be=((e={},t={})=>(t.locale??a())===`zh-TW`?`送出 Enter`:`Send Enter`),xe=((e={},t={})=>(t.locale??a())===`zh-TW`?`送出 Escape`:`Send Escape`),Se=((e={},t={})=>(t.locale??a())===`zh-TW`?`錯誤`:`error`),Ce=((e={},t={})=>(t.locale??a())===`zh-TW`?`已完成`:`finished`),J=((e={},t={})=>(t.locale??a())===`zh-TW`?`已離開`:`gone`),we=((e={},t={})=>(t.locale??a())===`zh-TW`?`提問`:`question`),Te=((e={},t={})=>(t.locale??a())===`zh-TW`?`更新`:`update`),Ee=e=>`${e?.count} finished`,De=e=>`${e?.count} 個已完成`,Oe=((e,t={})=>(t.locale??a())===`zh-TW`?De(e):Ee(e)),ke=e=>{let n=t(`en`,e?.count,{},!0);return n===`one`?`${e?.count} needs you`:n===`other`?`${e?.count} need you`:`tally_need`},Ae=e=>`${e?.count} 個需要你`,je=((e,t={})=>(t.locale??a())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Terminal of ${e?.name}, read only`,Ne=e=>`${e?.name} 的終端機,唯讀`,Pe=((e,t={})=>(t.locale??a())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Terminal · ${e?.name}`,Ie=e=>`終端機 · ${e?.name}`,Le=((e,t={})=>(t.locale??a())===`zh-TW`?Ie(e):Fe(e)),Re=((e={},t={})=>(t.locale??a())===`zh-TW`?`等待`:`waiting on`),ze=[[[`esc`,`esc`,M],[`tab`,`tab`,B],[`up`,`↑`,V],[`enter`,`enter`,j]],[[`shift+tab`,`⇧tab`,R],[`left`,`←`,P],[`down`,`↓`,k],[`right`,`→`,L]],[[`space`,`space`,z],[`backspace`,`⌫`,O],[`home`,`home`,N],[`end`,`end`,A],[`pageup`,`pgup`,I],[`pagedown`,`pgdn`,F]]],Be=`123456789`.split(``);function Ve({name:e,state:t,post:r,stream:a}){let o=[],s=v(`p`,{class:`pad-note`,role:`status`}),l=!1,u=([e,t,n])=>{let r=v(`button`,{type:`button`,class:`pad-key`,"data-key":e,"aria-label":n()},t);return r.onclick=t=>t.isTrusted&&!l&&void h(e),o.push(r),r},d=v(`details`,{class:`pad-digits`},v(`summary`,null,`1–9`),v(`div`,{class:`pad-row`},...Be.map(e=>u([e,e,()=>e])))),f=v(`div`,{class:`pad`,role:`group`,"aria-label":W({name:e})},...ze.map(e=>v(`div`,{class:`pad-row`},...e.map(u))),d,s),p=(e,t=``)=>(s.dataset.tone=t,s.replaceChildren(e)),m=(e,t,n)=>{let r=v(`button`,{type:`button`,class:`pad-yes`},e===`enter`?be():xe()),a=v(`button`,{type:`button`,class:`cmp-link`},i());r.onclick=t=>t.isTrusted&&!l&&void h(e,n),a.onclick=()=>p(``),s.dataset.tone=`ask`,s.replaceChildren(v(`span`,null,t),r,a),a.focus()};async function h(e,t){l=!0,g(),p(``);try{let n=await r(`keys`,{key:e,stream:a(),...t?{confirmed:t}:{}});n.status===409&&n.body.error===`confirm`&&typeof n.body.confirm==`string`?m(e,String(n.body.reason??``),n.body.confirm):n.ok||p(n.body.reason??c({status:n.status}),`error`)}catch{p(n(),`error`)}finally{l=!1,g()}}function g(){let e=t();for(let t of o)t.disabled=l||e===`off`||e===`hidden`&&t.dataset.key!==`esc`}return g(),{el:f,update:g}}var Y=[0,95,135,175,215,255],He=120,Ue=5e3,We=3e3,X=e=>Number.isInteger(e)&&e>=0&&e<=255,Ge=e=>X(e)?e<16?e:e<232?`rgb(${Y[Math.floor((e-16)/36)]},${Y[Math.floor((e-16)/6)%6]},${Y[(e-16)%6]})`:`rgb(${8+10*(e-232)},${8+10*(e-232)},${8+10*(e-232)})`:void 0,Ke=([e,t,n])=>[e,t,n].every(e=>X(e))?`rgb(${e},${t},${n})`:void 0;function qe(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?Ge(o[0]):a===2?Ke(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 Je(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=qe(n,t[1]),r=t.index+t[0].length;return i(e.slice(r)),t}function Z(e,t){let n=Math.min(Math.max(0,Number(t.rows)||0),He);for(;e.children.length<n;)e.append(v(`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(...Je(i).map(e=>{if(!e.cls&&!e.fg&&!e.bg)return e.text;let t=v(`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 Ye({tiles:e,post:t,stream:r,pad:i}){let a=new Map,o,s=()=>{try{return String(JSON.parse(r()).stream??``)}catch{return``}},l=(e,t,n=``)=>(e.pad?.update(),(e.state.textContent!==t||e.state.dataset.tone!==n)&&(e.state.dataset.tone=n,e.state.textContent=t)),u=(e,t)=>(e.ended=!0,l(e,ye({why:t}),`error`)),d=(e,t,r=s())=>r&&void(e.queue=e.queue.then(()=>e.post(`mirror`,{stream:r,on:t}).then(n=>t&&!n.ok&&u(e,n.body.reason??c({status:n.status})),()=>t&&u(e,n())))),f=(e,t=Math.max(e.cols,...[...e.box.children].map(e=>e.textContent?.length??0)))=>e.box.style.fontSize=e.fit.getAttribute(`aria-pressed`)===`true`&&t?`${Math.max(6,Math.floor((e.scroll.clientWidth-20)/(t*.6)))}px`:``,p=e=>Date.now()-e.seen>We,m=()=>(clearInterval(o),o=a.size&&!document.hidden?setInterval(()=>a.forEach(e=>(e.box.classList.toggle(`stale`,p(e)),e.pad?.update())),1e3):void 0);document.addEventListener(`visibilitychange`,()=>(m(),a.forEach(e=>{clearTimeout(e.away),document.hidden?e.away=setTimeout(()=>(e.parked=!0,d(e,!1),l(e,ge())),Ue):e.parked&&(e.parked=!1,d(e,!0))})));let h=(e,n)=>{let r={key:e,box:v(`div`,{class:`term`,role:`group`,"aria-label":Pe({name:n})}),scroll:v(`div`,{class:`term-scroll`,tabindex:`0`}),state:v(`p`,{class:`term-state`,role:`status`},E()),fit:v(`button`,{type:`button`,class:`cmp-link`,"aria-pressed":`false`},ae()),post:t(e),cols:0,seen:0,parked:!1,first:!0,ended:!1,queue:Promise.resolve()};return r.fit.onclick=()=>(r.fit.setAttribute(`aria-pressed`,String(r.fit.getAttribute(`aria-pressed`)!==`true`)),f(r)),r.scroll.append(r.box),new ResizeObserver(()=>f(r)).observe(r.scroll),a.set(e,r),d(r,!0),m(),r.pad=i?.({name:n,state:()=>r.parked||r.ended||p(r)?`off`:r.box.classList.contains(`hidden`)?`hidden`:`live`,post:r.post,stream:s}),r.tile={id:`term:${e}`,title:Le({name:n}),icon:`i-comms`,body:()=>v(`div`,{class:`term-tile`},v(`div`,{class:`term-bar`},r.state,r.fit),r.scroll,r.pad?.el),closed:()=>(clearTimeout(r.away),d(r,!1),a.delete(e),m())}};return{open(t,n){let r=a.get(t);r?.ended&&(r.ended=!1,l(r,E()),d(r,!0)),e.open(r?.tile??h(t,n),!0)},embed(e,t,n){let r=a.get(e);r?.ended&&(r.ended=!1,l(r,E()),d(r,!0));let i=r?.tile??h(e,t);return n.replaceChildren(i.body()),()=>(i.closed?.(),n.replaceChildren())},hello:()=>a.forEach(e=>!e.parked&&!e.ended&&d(e,!0)),frame(e){let t;try{t=JSON.parse(e)}catch{return}let n=a.get(t.key);if(n){if(n.box.classList.toggle(`hidden`,!!(t.hidden||t.ended)),t.ended)return u(n,le({why:t.ended}));if([n.seen,n.ended]=[Date.now(),!1],n.box.classList.remove(`stale`),t.hidden)return Z(n.box,{key:n.key,rows:0}),l(n,ue());Z(n.box,t),(t.whole||t.cols&&t.cols!==n.cols)&&(n.cols=t.cols||n.cols,f(n)),l(n,pe({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)=>o(e.mark)-o(t.mark)||e.at-t.at,$=e=>{let t=e.filter(e=>o(e.mark)===0).length,n=e.length-t;return[t&&je({count:t}),n&&Oe({count:n})].filter(Boolean).join(` · `)};function Xe(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(t.key)?.mark===t.mark);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(){n[0]&&i(n[0],e.focused())},close(a=`close`){let s=t.pop();if(!s)return!1;let c=t.at(-1),l=a===`close`?n.find(e=>o(e.mark)===0):void 0;return a===`later`&&s.alert.mark===s.raised&&o(s.raised)===0&&(n=[...n,s.alert].sort(Q)),!c&&l?(i(l,s.back),!0):(r(),!e.restore(s.back)&&c&&e.enter(c.alert),!0)}}}var Ze=`a, button, input, textarea, select, summary, label, [role=button]`;function Qe(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 $e(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(`
|
|
1
|
+
import{t as e}from"./post-UHMNmNgA.js";import{i as t,n,t as r}from"./ask-Bsqffnlt.js";import{A as i,M as a,_ as o,a as s,b as c,c as l,d as u,f as d,h as f,i as p,k as m,l as h,m as g,p as ee,u as _,w as te}from"./index-DDeJoO2R.js";import{t as v}from"./dom-BaTXH9WU.js";var y=e=>`Alerts: ${e?.tally}`,b=e=>`警示:${e?.tally}`,ne=((e,t={})=>(t.locale??a())===`zh-TW`?b(e):y(e)),x=e=>`Also queued: ${e?.tally}`,S=e=>`佇列中還有:${e?.tally}`,re=((e,t={})=>(t.locale??a())===`zh-TW`?S(e):x(e)),C=((e={},t={})=>(t.locale??a())===`zh-TW`?`關閉文件`:`Close document`),w=e=>`Close ${e?.title}`,T=e=>`關閉 ${e?.title}`,ie=((e,t={})=>(t.locale??a())===`zh-TW`?T(e):w(e)),E=((e={},t={})=>(t.locale??a())===`zh-TW`?`連線中…`:`Connecting…`),D=((e={},t={})=>(t.locale??a())===`zh-TW`?`警示`:`alert`),ae=((e={},t={})=>(t.locale??a())===`zh-TW`?`符合寬度`:`Fit width`),oe=((e={},t={})=>(t.locale??a())===`zh-TW`?`無法取得紀錄。`:`History unavailable.`),O=((e={},t={})=>(t.locale??a())===`zh-TW`?`退格鍵`:`Backspace`),k=((e={},t={})=>(t.locale??a())===`zh-TW`?`下`:`Down`),A=((e={},t={})=>(t.locale??a(),`End`)),j=((e={},t={})=>(t.locale??a(),`Enter`)),M=((e={},t={})=>(t.locale??a(),`Escape`)),N=((e={},t={})=>(t.locale??a(),`Home`)),P=((e={},t={})=>(t.locale??a())===`zh-TW`?`左`:`Left`),F=((e={},t={})=>(t.locale??a())===`zh-TW`?`下一頁`:`Page down`),I=((e={},t={})=>(t.locale??a())===`zh-TW`?`上一頁`:`Page up`),L=((e={},t={})=>(t.locale??a())===`zh-TW`?`右`:`Right`),R=((e={},t={})=>(t.locale??a(),`Shift+Tab`)),z=((e={},t={})=>(t.locale??a())===`zh-TW`?`空白鍵`:`Space`),B=((e={},t={})=>(t.locale??a(),`Tab`)),V=((e={},t={})=>(t.locale??a())===`zh-TW`?`上`:`Up`),H=e=>`Keys for ${e?.name}`,U=e=>`${e?.name} 的按鍵`,W=((e,t={})=>(t.locale??a())===`zh-TW`?U(e):H(e)),G=((e={},t={})=>(t.locale??a())===`zh-TW`?`最後一則通訊`:`Last transmission`),K=((e={},t={})=>(t.locale??a())===`zh-TW`?`稍後`:`Later`),q=((e={},t={})=>(t.locale??a())===`zh-TW`?`已離開網`:`left the net`),se=e=>`The mirror ended: ${e?.why}`,ce=e=>`鏡像已結束:${e?.why}`,le=((e,t={})=>(t.locale??a())===`zh-TW`?ce(e):se(e)),ue=((e={},t={})=>(t.locale??a())===`zh-TW`?`等待輸入密碼時隱藏;請在終端機中輸入。`:`Hidden while it waits for a secret; type it in the terminal.`),de=e=>`Live · ${e?.cols}×${e?.rows}`,fe=e=>`即時 · ${e?.cols}×${e?.rows}`,pe=((e,t={})=>(t.locale??a())===`zh-TW`?fe(e):de(e)),me=((e={},t={})=>(t.locale??a())===`zh-TW`?`還沒有訊息。`:`No messages yet.`),he=((e={},t={})=>(t.locale??a())===`zh-TW`?`開啟通訊`:`Open comms`),ge=((e={},t={})=>(t.locale??a())===`zh-TW`?`此分頁隱藏時暫停。`:`Paused while this tab is hidden.`),_e=e=>`${e?.why} Open the terminal again to retry.`,ve=e=>`${e?.why} 重新開啟終端機即可重試。`,ye=((e,t={})=>(t.locale??a())===`zh-TW`?ve(e):_e(e)),be=((e={},t={})=>(t.locale??a())===`zh-TW`?`送出 Enter`:`Send Enter`),xe=((e={},t={})=>(t.locale??a())===`zh-TW`?`送出 Escape`:`Send Escape`),Se=((e={},t={})=>(t.locale??a())===`zh-TW`?`錯誤`:`error`),Ce=((e={},t={})=>(t.locale??a())===`zh-TW`?`已完成`:`finished`),J=((e={},t={})=>(t.locale??a())===`zh-TW`?`已離開`:`gone`),we=((e={},t={})=>(t.locale??a())===`zh-TW`?`提問`:`question`),Te=((e={},t={})=>(t.locale??a())===`zh-TW`?`更新`:`update`),Ee=e=>`${e?.count} finished`,De=e=>`${e?.count} 個已完成`,Oe=((e,t={})=>(t.locale??a())===`zh-TW`?De(e):Ee(e)),ke=e=>{let n=t(`en`,e?.count,{},!0);return n===`one`?`${e?.count} needs you`:n===`other`?`${e?.count} need you`:`tally_need`},Ae=e=>`${e?.count} 個需要你`,je=((e,t={})=>(t.locale??a())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Terminal of ${e?.name}, read only`,Ne=e=>`${e?.name} 的終端機,唯讀`,Pe=((e,t={})=>(t.locale??a())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Terminal · ${e?.name}`,Ie=e=>`終端機 · ${e?.name}`,Le=((e,t={})=>(t.locale??a())===`zh-TW`?Ie(e):Fe(e)),Re=((e={},t={})=>(t.locale??a())===`zh-TW`?`等待`:`waiting on`),ze=[[[`esc`,`esc`,M],[`tab`,`tab`,B],[`up`,`↑`,V],[`enter`,`enter`,j]],[[`shift+tab`,`⇧tab`,R],[`left`,`←`,P],[`down`,`↓`,k],[`right`,`→`,L]],[[`space`,`space`,z],[`backspace`,`⌫`,O],[`home`,`home`,N],[`end`,`end`,A],[`pageup`,`pgup`,I],[`pagedown`,`pgdn`,F]]],Be=`123456789`.split(``);function Ve({name:e,state:t,post:r,stream:a}){let o=[],s=v(`p`,{class:`pad-note`,role:`status`}),l=!1,u=([e,t,n])=>{let r=v(`button`,{type:`button`,class:`pad-key`,"data-key":e,"aria-label":n()},t);return r.onclick=t=>t.isTrusted&&!l&&void h(e),o.push(r),r},d=v(`details`,{class:`pad-digits`},v(`summary`,null,`1–9`),v(`div`,{class:`pad-row`},...Be.map(e=>u([e,e,()=>e])))),f=v(`div`,{class:`pad`,role:`group`,"aria-label":W({name:e})},...ze.map(e=>v(`div`,{class:`pad-row`},...e.map(u))),d,s),p=(e,t=``)=>(s.dataset.tone=t,s.replaceChildren(e)),m=(e,t,n)=>{let r=v(`button`,{type:`button`,class:`pad-yes`},e===`enter`?be():xe()),a=v(`button`,{type:`button`,class:`cmp-link`},i());r.onclick=t=>t.isTrusted&&!l&&void h(e,n),a.onclick=()=>p(``),s.dataset.tone=`ask`,s.replaceChildren(v(`span`,null,t),r,a),a.focus()};async function h(e,t){l=!0,g(),p(``);try{let n=await r(`keys`,{key:e,stream:a(),...t?{confirmed:t}:{}});n.status===409&&n.body.error===`confirm`&&typeof n.body.confirm==`string`?m(e,String(n.body.reason??``),n.body.confirm):n.ok||p(n.body.reason??c({status:n.status}),`error`)}catch{p(n(),`error`)}finally{l=!1,g()}}function g(){let e=t();for(let t of o)t.disabled=l||e===`off`||e===`hidden`&&t.dataset.key!==`esc`}return g(),{el:f,update:g}}var Y=[0,95,135,175,215,255],He=120,Ue=5e3,We=3e3,X=e=>Number.isInteger(e)&&e>=0&&e<=255,Ge=e=>X(e)?e<16?e:e<232?`rgb(${Y[Math.floor((e-16)/36)]},${Y[Math.floor((e-16)/6)%6]},${Y[(e-16)%6]})`:`rgb(${8+10*(e-232)},${8+10*(e-232)},${8+10*(e-232)})`:void 0,Ke=([e,t,n])=>[e,t,n].every(e=>X(e))?`rgb(${e},${t},${n})`:void 0;function qe(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?Ge(o[0]):a===2?Ke(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 Je(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=qe(n,t[1]),r=t.index+t[0].length;return i(e.slice(r)),t}function Z(e,t){let n=Math.min(Math.max(0,Number(t.rows)||0),He);for(;e.children.length<n;)e.append(v(`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(...Je(i).map(e=>{if(!e.cls&&!e.fg&&!e.bg)return e.text;let t=v(`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 Ye({tiles:e,post:t,stream:r,pad:i}){let a=new Map,o,s=()=>{try{return String(JSON.parse(r()).stream??``)}catch{return``}},l=(e,t,n=``)=>(e.pad?.update(),(e.state.textContent!==t||e.state.dataset.tone!==n)&&(e.state.dataset.tone=n,e.state.textContent=t)),u=(e,t)=>(e.ended=!0,l(e,ye({why:t}),`error`)),d=(e,t,r=s())=>r&&void(e.queue=e.queue.then(()=>e.post(`mirror`,{stream:r,on:t}).then(n=>t&&!n.ok&&u(e,n.body.reason??c({status:n.status})),()=>t&&u(e,n())))),f=(e,t=Math.max(e.cols,...[...e.box.children].map(e=>e.textContent?.length??0)))=>e.box.style.fontSize=e.fit.getAttribute(`aria-pressed`)===`true`&&t?`${Math.max(6,Math.floor((e.scroll.clientWidth-20)/(t*.6)))}px`:``,p=e=>Date.now()-e.seen>We,m=()=>(clearInterval(o),o=a.size&&!document.hidden?setInterval(()=>a.forEach(e=>(e.box.classList.toggle(`stale`,p(e)),e.pad?.update())),1e3):void 0);document.addEventListener(`visibilitychange`,()=>(m(),a.forEach(e=>{clearTimeout(e.away),document.hidden?e.away=setTimeout(()=>(e.parked=!0,d(e,!1),l(e,ge())),Ue):e.parked&&(e.parked=!1,d(e,!0))})));let h=(e,n)=>{let r={key:e,box:v(`div`,{class:`term`,role:`group`,"aria-label":Pe({name:n})}),scroll:v(`div`,{class:`term-scroll`,tabindex:`0`}),state:v(`p`,{class:`term-state`,role:`status`},E()),fit:v(`button`,{type:`button`,class:`cmp-link`,"aria-pressed":`false`},ae()),post:t(e),cols:0,seen:0,parked:!1,first:!0,ended:!1,queue:Promise.resolve()};return r.fit.onclick=()=>(r.fit.setAttribute(`aria-pressed`,String(r.fit.getAttribute(`aria-pressed`)!==`true`)),f(r)),r.scroll.append(r.box),new ResizeObserver(()=>f(r)).observe(r.scroll),a.set(e,r),d(r,!0),m(),r.pad=i?.({name:n,state:()=>r.parked||r.ended||p(r)?`off`:r.box.classList.contains(`hidden`)?`hidden`:`live`,post:r.post,stream:s}),r.tile={id:`term:${e}`,title:Le({name:n}),icon:`i-comms`,body:()=>v(`div`,{class:`term-tile`},v(`div`,{class:`term-bar`},r.state,r.fit),r.scroll,r.pad?.el),closed:()=>(clearTimeout(r.away),d(r,!1),a.delete(e),m())}};return{open(t,n){let r=a.get(t);r?.ended&&(r.ended=!1,l(r,E()),d(r,!0)),e.open(r?.tile??h(t,n),!0)},embed(e,t,n){let r=a.get(e);r?.ended&&(r.ended=!1,l(r,E()),d(r,!0));let i=r?.tile??h(e,t);return n.replaceChildren(i.body()),()=>(i.closed?.(),n.replaceChildren())},hello:()=>a.forEach(e=>!e.parked&&!e.ended&&d(e,!0)),frame(e){let t;try{t=JSON.parse(e)}catch{return}let n=a.get(t.key);if(n){if(n.box.classList.toggle(`hidden`,!!(t.hidden||t.ended)),t.ended)return u(n,le({why:t.ended}));if([n.seen,n.ended]=[Date.now(),!1],n.box.classList.remove(`stale`),t.hidden)return Z(n.box,{key:n.key,rows:0}),l(n,ue());Z(n.box,t),(t.whole||t.cols&&t.cols!==n.cols)&&(n.cols=t.cols||n.cols,f(n)),l(n,pe({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)=>o(e.mark)-o(t.mark)||e.at-t.at,$=e=>{let t=e.filter(e=>o(e.mark)===0).length,n=e.length-t;return[t&&je({count:t}),n&&Oe({count:n})].filter(Boolean).join(` · `)};function Xe(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(t.key)?.mark===t.mark);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(){n[0]&&i(n[0],e.focused())},close(a=`close`){let s=t.pop();if(!s)return!1;let c=t.at(-1),l=a===`close`?n.find(e=>o(e.mark)===0):void 0;return a===`later`&&s.alert.mark===s.raised&&o(s.raised)===0&&(n=[...n,s.alert].sort(Q)),!c&&l?(i(l,s.back),!0):(r(),!e.restore(s.back)&&c&&e.enter(c.alert),!0)}}}var Ze=`a, button, input, textarea, select, summary, label, [role=button]`;function Qe(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 $e(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(`
|
|
2
2
|
`).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 et=()=>u(`<section class="dialog" role="dialog" aria-modal="false" tabindex="-1"><header><b class="tag">${D()}</b><span class="where"></span><button class="x" type="button" aria-label="${m()}">×</button></header><div class="who">${p}<div><h3></h3><p><em class="role"></em> <span class="state"></span></p></div></div><div class="intel"><h4>${G()}</h4><p class="said">…</p><p class="pending" hidden><b>${Re()}</b> <span></span></p></div><div class="ask-root"></div><footer><a class="go">${he()}</a><button class="later" type="button">${K()}</button><span class="queued"></span></footer></section>`),tt=()=>u(`<section class="tile" tabindex="-1"><header><svg><use href="#i-doc"/></svg><b></b><button class="x" type="button" aria-label="${C()}">×</button></header><div class="tile-body"></div></section>`);function nt(t){let[n,i,a,c,m]=[l(`dock`,HTMLElement),l(`work`,HTMLElement),l(`tiles`,HTMLElement),l(`tile-tabs`,HTMLElement),l(`alerts`,HTMLButtonElement)],v=new Map,y=(e,t,n=v.get(t.key))=>{let r=e.dataset.gone===`true`;f(e,`.said`,n?.failed?oe():n?.said??me()),e.querySelector(`.pending`).hidden=!n?.pending||r,f(e,`.pending span`,n?.pending??``),s(e.querySelector(`.go`),r?void 0:{view:`session`,ws:t.ws,key:t.key,...n?.at&&{at:n.at}})},b=(e,r={said:`…`})=>{v.set(e.key,r),t.recent(e.key).then($e,()=>({failed:!0})).then(t=>{let i=v.get(e.key)===r&&(v.set(e.key,t),n.querySelector(`.dialog[data-key="${CSS.escape(e.key)}"]`));i&&y(i,e)})},x=(e,n,i,a)=>{d(e,n.mark),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}: ${h(n.note,n.mark)}`),_(e.querySelector(`.plate`),n.role,n.mark),f(e,`h3`,n.name),f(e,`.role`,ee(n.role)),f(e,`.state`,n.gone?q():h(n.note,n.mark)),f(e,`.where`,t.label(n.ws)),f(e,`.tag`,n.gone?J():({waiting:we,error:Se,done:Ce}[n.mark]??Te)()),f(e,`.queued`,a.length?re({tally:$(a)}):``),e.querySelector(`.later`).hidden=o(n.mark)!==0,v.has(n.key)||b(n),y(e,n);let s=S.get(e);s||S.set(e,s=r(e.querySelector(`.ask-root`),C(n.key),void 0,()=>t.showTerminal(n.ws,n.key))),s.update(n.pending,n.mark===`waiting`&&document.body.dataset.stale!==`true`)},S=new WeakMap,C=n=>t.post?.(n)??((t,r)=>e(`sessions/${encodeURIComponent(n)}/${t}`,r)),w=Xe({render(e,t){g(n,e.map(e=>({...e,id:e.key})),et,(n,r)=>x(n,r,e.length-1-e.findIndex(e=>e.key===r.key),t));let r=t[0];m.disabled=!r,m.dataset.mark=r?.mark??`unknown`,f(m,`#alert-count`,String(t.length)),m.title=t.length?ne({tally:$(t)}):``,f(m,`#alert-text`,r?`${r.name} · ${h(r.note,r.mark)}`:te()),g(m.querySelector(`.faces`),t.slice(0,3).map(e=>({...e,id:e.key})),()=>u(p),(e,t)=>_(e,t.role,t.mark))},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))});m.addEventListener(`click`,()=>w.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?.(Ze)||(e.preventDefault(),e.stopPropagation(),w.raise(i.dataset.key))},!0),n.addEventListener(`click`,e=>{let t=e.target;t.closest(`.x`)?w.close():t.closest(`.later`)?w.close(`later`):t.closest(`.go`)&&queueMicrotask(()=>void w.close(`go`))});let T=0,E=()=>a.classList.toggle(`tabbed`,D.tiles.length>1&&i.clientWidth<460+D.tiles.length*400),D=Qe({render(e,t){a.hidden=!e.length,g(a,e,e=>{let t=tt();return t.querySelector(`use`).setAttribute(`href`,`#${e.icon??`i-doc`}`),t.querySelector(`.x`).setAttribute(`aria-label`,ie({title:e.title})),t.querySelector(`.tile-body`).append(e.body()),t.querySelector(`.x`).addEventListener(`click`,()=>D.close(e.id)),t},(e,n)=>{f(e,`header b`,n.title),e.classList.toggle(`active`,n.id===t)}),g(c,e,()=>u(`<button type="button" class="tab-btn"></button>`),(e,n)=>{e.textContent=n.title,e.classList.toggle(`active`,n.id===t),e.onclick=()=>D.activate(n.id)}),a.prepend(c),e.length!==T&&(T=e.length,E())},enter:e=>requestAnimationFrame(()=>a.querySelector(`.tile[data-key="${CSS.escape(e.id)}"]`)?.focus())});return new ResizeObserver(E).observe(i),{tiles:D,stack:w,terminal:Ye({tiles:D,post:C,stream:t.stream,pad:Ve}),alerts(e,t){for(let t of e)b(t),w.arrive(t);w.prune(e=>t.get(e))}}}export{nt as mountPanels};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as e,k as t}from"./index-
|
|
1
|
+
import{M as e,k as t}from"./index-DDeJoO2R.js";import{t as n}from"./dom-BaTXH9WU.js";import{t as r}from"./chat-TOYLpfbg.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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./post-UHMNmNgA.js";import{C as t,M as n,b as r}from"./index-
|
|
1
|
+
import{t as e}from"./post-UHMNmNgA.js";import{C as t,M as n,b as r}from"./index-DDeJoO2R.js";import{t as i}from"./dom-BaTXH9WU.js";var a=((e={},t={})=>(t.locale??n())===`zh-TW`?`正在取得配對碼…`:`Asking for a pairing code…`),o=((e={},t={})=>(t.locale??n())===`zh-TW`?`新的配對碼`:`New code`),s=((e={},t={})=>(t.locale??n())===`zh-TW`?`配對 QR code`:`Pairing QR code`),c=((e={},t={})=>(t.locale??n())===`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??n())===`zh-TW`?`配對手機`:`Pair a phone`),u=((e={},t={})=>(t.locale??n())===`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??n())===`zh-TW`?`開啟遠端存取`:`Turn on remote access`),f=((e={},t={})=>(t.locale??n())===`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 n=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())=>{n.replaceChildren(i(`p`,{class:`chat-empty`},d)),e(o,{}).then(e=>{let t=e.body.rows,a=String(e.body.url??``);if(e.body.error===`remote_off`)return n.replaceChildren(i(`p`,null,u()),l);if(!e.ok||!Array.isArray(t))return n.replaceChildren(i(`p`,null,e.body.reason??r({status:e.status})),o===`remote/on`?l:s);n.replaceChildren(m(t.map(String)),i(`p`,null,c()),i(`p`,null,i(`code`,null,new URL(a).host)),s)},()=>n.replaceChildren(i(`p`,null,t()),s))};return l.onclick=()=>p(`remote/on`,f()),s.onclick=()=>p(),p(),n}}}export{h as pairTile};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./post-UHMNmNgA.js";import{C as t,M as n,b as r}from"./index-
|
|
1
|
+
import{t as e}from"./post-UHMNmNgA.js";import{C as t,M as n,b as r}from"./index-DDeJoO2R.js";import{t as i}from"./dom-BaTXH9WU.js";var a=((e={},t={})=>(t.locale??n())===`zh-TW`?`正在讀取資料夾…`:`Reading folders…`),o=((e={},t={})=>(t.locale??n())===`zh-TW`?`基地名稱`:`Base name`),s=((e={},t={})=>(t.locale??n())===`zh-TW`?`第一句指令(選填)`:`First message (optional)`),c=((e={},t={})=>(t.locale??n())===`zh-TW`?`只顯示前 500 個資料夾。`:`Showing the first 500 folders.`),l=((e={},t={})=>(t.locale??n())===`zh-TW`?`這裡沒有資料夾。`:`No folders here.`),u=((e={},t={})=>(t.locale??n())===`zh-TW`?`資料夾:`:`Folder:`),d=((e={},t={})=>(t.locale??n())===`zh-TW`?`上一層`:`Up`),f=((e={},t={})=>(t.locale??n())===`zh-TW`?`在這裡開基地`:`Open the base here`),p=((e={},t={})=>(t.locale??n())===`zh-TW`?`開新基地`:`New base`),m=((e={},t={})=>(t.locale??n())===`zh-TW`?`在這裡開主智慧體`:`Open the main here`),h=e=>`New main agent in ${e?.base}`,g=e=>`在 ${e?.base} 開新的主智慧體`,_=((e,t={})=>(t.locale??n())===`zh-TW`?g(e):h(e)),v=((e={},t={})=>(t.locale??n())===`zh-TW`?`加入成員`:`Add the member`),y=e=>`New member in squad ${e?.tab}`,b=e=>`在小隊 ${e?.tab} 加一位成員`,x=((e,t={})=>(t.locale??n())===`zh-TW`?b(e):y(e)),S=e=>`New member in ${e?.base}`,C=e=>`在 ${e?.base} 加一位成員`,w=((e,t={})=>(t.locale??n())===`zh-TW`?C(e):S(e)),T=((e={},t={})=>(t.locale??n())===`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??n())===`zh-TW`?D(e):E(e)),k=e=>`The member is open in ${e?.base}.`,A=e=>`已在 ${e?.base} 加好成員。`,j=((e,t={})=>(t.locale??n())===`zh-TW`?A(e):k(e)),M=((e={},t={})=>(t.locale??n())===`zh-TW`?`開啟中…最多可能要一分鐘。`:`Opening… this can take up to a minute.`);function N(n){let h=n.kind===`base`?void 0:n.base,g=n.kind===`base`?void 0:n.tab,y=n.kind===`base`?p():n.kind===`main`?_({base:h.label}):g?x({tab:g.label}):w({base:h.label});return{id:`open-${n.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`},n.kind===`base`?f():n.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=n=>{D(a()),e(`dirs`,n?{path:n}:h?{workspace:h.id,...g&&{tab:g.id}}:{}).then(e=>{if(!e.ok)return D(e.body.reason??r({status:e.status}));w=e.body;let t=w.path===w.home?`~`:w.path.startsWith(`${w.home}/`)?`~/${w.path.slice(w.home.length+1)}`:w.path;p.textContent=t,_.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(t()))};return _.onclick=()=>w?.parent&&k(w.parent),x.onclick=()=>{if(!w)return;let i=w.path,a=S.value,o=n.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/${n.kind}`,o).then(e=>{if(!e.ok)return D(e.body.reason??r({status:e.status}));S.value=C.value=``,E=!1,D(n.kind===`base`?T():n.kind===`main`?O({base:h.label}):j({base:h.label}))},()=>D(t())).finally(()=>x.disabled=!1)},k(),i(`div`,{class:`spawn`},i(`p`,{class:`spawn-at`},u(),` `,p,` `,_),y,b,...n.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};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-
|
|
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-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-BTGK6xu9.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-Bsqffnlt.js";import{A as o,C as s,D as c,E as l,M as u,O as d,S as f,T as p,a as m,b as h,d as g,f as _,g as v,h as y,i as b,j as x,k as S,l as C,m as w,o as T,p as E,r as ee,s as D,t as te,u as O,v as k,x as A,y as j}from"./index-DDeJoO2R.js";import{t as M}from"./dom-BaTXH9WU.js";var N=((e={},t={})=>(t.locale??u())===`zh-TW`?`附加檔案`:`Attach files`),P=((e={},t={})=>(t.locale??u())===`zh-TW`?`它在等待對話框:請在上方或它的終端機中回答。`:`It waits on a dialog: answer it above, or in its terminal.`),F=((e={},t={})=>(t.locale??u())===`zh-TW`?`它在等待對話框;請在它的終端機中回答。`:`It waits on a dialog; answer it in its terminal.`),I=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個 session 已不再即時;紀錄仍可閱讀。`:`This session is no longer live; its history stays readable.`),L=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個單位沒有即時的 pi 窗格,無處可輸入。`:`No live pi pane backs this unit, so there is nothing to type into.`),R=((e={},t={})=>(t.locale??u())===`zh-TW`?`串流中斷;要等它恢復才能送出。`:`The stream is down; sending waits for it to come back.`),ne=((e={},t={})=>(t.locale??u())===`zh-TW`?`頻道關閉`:`channel closed`),re=((e={},t={})=>(t.locale??u())===`zh-TW`?`頻道開啟`:`channel open`),z=e=>`Close ${e?.name}`,ie=e=>`關閉 ${e?.name}`,ae=((e,t={})=>(t.locale??u())===`zh-TW`?ie(e):z(e)),oe=((e={},t={})=>(t.locale??u())===`zh-TW`?`指令`:`Commands`),B=((e={},t={})=>(t.locale??u())===`zh-TW`?`通訊`:`comms`),V=((e={},t={})=>(t.locale??u())===`zh-TW`?`已派出`:`Dispatched`),H=((e={},t={})=>(t.locale??u())===`zh-TW`?`無法取得:已不在它的 session 中開啟。`:`Unavailable: no longer open in its session.`),se=((e={},t={})=>(t.locale??u())===`zh-TW`?`已不在清單中:已在它的 session 中關閉,或 session 已結束。`:`No longer listed: closed in its session, or the session ended.`),U=((e={},t={})=>(t.locale??u())===`zh-TW`?`已更新:此區塊顯示時會載入新版本。`:`Updated: the new version loads when this tile shows.`),ce=((e={},t={})=>(t.locale??u())===`zh-TW`?`超過轉送上限:請在終端機中閱讀。`:`More than the relay carries: read them in the terminal.`),le=e=>`${e?.command} ends this session or switches its pane to another one.`,W=e=>`${e?.command} 會結束這個 session,或把它的窗格切換到別的 session。`,G=((e,t={})=>(t.locale??u())===`zh-TW`?W(e):le(e)),K=e=>{let t=n(`en`,e?.count,{},!0);return t===`one`?`${e?.count} entry`:t===`other`?`${e?.count} entries`:`entry_count`},q=e=>`${e?.count} 筆`,ue=((e,t={})=>(t.locale??u())===`zh-TW`?q(e):K(e)),de=e=>`${e?.name} is larger than 20 MB.`,J=e=>`${e?.name} 超過 20 MB。`,fe=((e,t={})=>(t.locale??u())===`zh-TW`?J(e):de(e)),pe=((e={},t={})=>(t.locale??u())===`zh-TW`?`做完再送`:`After this`),me=((e={},t={})=>(t.locale??u())===`zh-TW`?`載入中…`:`Loading…`),he=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個工作區不在網中。`:`This workspace is not part of the net.`),ge=((e={},t={})=>(t.locale??u())===`zh-TW`?`訊息`:`Message`),_e=((e={},t={})=>(t.locale??u())===`zh-TW`?`新的 session`:`the new session`),ve=((e={},t={})=>(t.locale??u())===`zh-TW`?`無頻道`:`no channel`),ye=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在網中`:`not in the net`),be=((e={},t={})=>(t.locale??u())===`zh-TW`?`已不再即時;紀錄在十分鐘內仍可閱讀。`:`No longer live; its history stays readable for ten minutes.`),xe=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在網中(可能已在十分鐘前結束)。`:`Not in the net (it may have ended more than ten minutes ago).`),Se=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在終端機畫面上`:`off screen in the terminal`),Ce=e=>`${e?.reason} · off screen`,we=e=>`${e?.reason} · 不在畫面上`,Te=((e,t={})=>(t.locale??u())===`zh-TW`?we(e):Ce(e)),Ee=((e={},t={})=>(t.locale??u())===`zh-TW`?`在新分頁開啟`:`Open in a new tab`),De=((e={},t={})=>(t.locale??u())===`zh-TW`?`正在開啟頻道…`:`Opening the channel…`),Oe=((e={},t={})=>(t.locale??u())===`zh-TW`?`網外`:`Outside the net`),ke=((e={},t={})=>(t.locale??u())===`zh-TW`?`未編入的 pi 窗格`:`unaligned pi panes`),Ae=e=>`Message ${e?.name}`,je=e=>`傳訊息給 ${e?.name}`,Me=((e,t={})=>(t.locale??u())===`zh-TW`?je(e):Ae(e)),Ne=((e={},t={})=>(t.locale??u())===`zh-TW`?`排隊中・做完再送`:`Queued · follow-up`),Pe=((e={},t={})=>(t.locale??u())===`zh-TW`?`排隊中・插話`:`Queued · steer`),Fe=((e={},t={})=>(t.locale??u())===`zh-TW`?`重新載入`:`Reload`),Ie=((e={},t={})=>(t.locale??u())===`zh-TW`?`送出`:`Send`),Le=e=>`Send ${e?.command}`,Re=e=>`送出 ${e?.command}`,ze=((e,t={})=>(t.locale??u())===`zh-TW`?Re(e):Le(e)),Be=((e={},t={})=>(t.locale??u())===`zh-TW`?`已照原文送出;你的修改留在這裡,尚未送出。`:`Sent as it was; your edits stayed here, unsent.`),Ve=e=>`${e?.display}, shown by ${e?.unit}`,He=e=>`${e?.display},由 ${e?.unit} 顯示`,Ue=((e,t={})=>(t.locale??u())===`zh-TW`?He(e):Ve(e)),We=((e={},t={})=>(t.locale??u())===`zh-TW`?`基地`:`base`),Ge=((e={},t={})=>(t.locale??u())===`zh-TW`?`上下文`:`context`),Ke=((e={},t={})=>(t.locale??u())===`zh-TW`?`目錄`:`directory`),qe=((e={},t={})=>(t.locale??u())===`zh-TW`?`啟動者`:`launcher`),Je=((e={},t={})=>(t.locale??u())===`zh-TW`?`模型`:`model`),Ye=((e={},t={})=>(t.locale??u())===`zh-TW`?`小隊`:`squad`),Xe=((e={},t={})=>(t.locale??u())===`zh-TW`?`無法讀取`:`unreadable`),Ze=e=>`squad ${e?.label}`,Qe=e=>`小隊 ${e?.label}`,$e=((e,t={})=>(t.locale??u())===`zh-TW`?Qe(e):Ze(e)),et=((e={},t={})=>(t.locale??u())===`zh-TW`?`小隊`:`Squads`),tt=((e={},t={})=>(t.locale??u())===`zh-TW`?`停止`:`Stop`),nt=((e={},t={})=>(t.locale??u())===`zh-TW`?`要停止目前的任務嗎?佇列中的訊息會退回它的終端機編輯器。`:`Stop the current task? Queued messages go back to its terminal editor.`),rt=((e={},t={})=>(t.locale??u())===`zh-TW`?`現在:`:`Now:`),it=((e={},t={})=>(t.locale??u())===`zh-TW`?`已完成`:`done`),at=((e={},t={})=>(t.locale??u())===`zh-TW`?`未完成`:`not done`),ot=((e={},t={})=>(t.locale??u())===`zh-TW`?`終端機`:`Terminal`),st=e=>`Todos ${e?.done}/${e?.total}`,ct=e=>`待辦 ${e?.done}/${e?.total}`,lt=((e,t={})=>(t.locale??u())===`zh-TW`?ct(e):st(e)),ut=((e={},t={})=>(t.locale??u())===`zh-TW`?`全部完成`:`All done`),dt=e=>`${e?.count} tokens`,ft=e=>`${e?.count} tokens`,pt=((e,t={})=>(t.locale??u())===`zh-TW`?ft(e):dt(e)),mt=((e={},t={})=>(t.locale??u())===`zh-TW`?`文字超過 16 KB,請縮短。`:`The text is longer than 16 KB; shorten it.`),ht=e=>{let t=n(`en`,e?.count,{},!0);return t===`one`?`${e?.count} unit`:t===`other`?`${e?.count} units`:`unit_count`},gt=e=>`${e?.count} 個單位`,_t=((e,t={})=>(t.locale??u())===`zh-TW`?gt(e):ht(e)),vt=((e={},t={})=>(t.locale??u())===`zh-TW`?`單位檔案`:`unit dossier`),yt=((e={},t={})=>(t.locale??u())===`zh-TW`?`單位`:`Units`),bt=((e={},t={})=>(t.locale??u())===`zh-TW`?`未確認。再次送出前請先查看終端機。`:`Not confirmed. Check the terminal before sending again.`),xt=((e={},t={})=>(t.locale??u())===`zh-TW`?`上傳中…`:`Uploading…`),St=((e={},t={})=>(t.locale??u())===`zh-TW`?`等待網的資料…`:`Waiting for the net…`),Ct=((e={},t={})=>(t.locale??u())===`zh-TW`?`原文已送到 session;這裡是你編輯過、尚未送出的副本。`:`The original already went to the session; what is here is your edited copy, unsent.`),Y=(e,t,n)=>({tag:e,kids:t,attrs:n}),wt=/^(?:https?:\/\/|mailto:)[^\s\u0000-\u001f]+$/i,Tt=(e,t)=>Y(`a`,t,{href:e,rel:`noopener noreferrer`,target:`_blank`}),Et=/(`+)([^`]|[^`][^]{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 X(e){let t=[],n=0;for(let r of e.matchAll(Et))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(Y(`em`,X(r[5]??r[6]))):r[7]===void 0?t.push(Tt(r[9],[r[9]])):t.push(wt.test(r[8])?Tt(r[8],X(r[7])):r[0]):t.push(Y(`del`,X(r[4]))):t.push(Y(`strong`,X(r[3]))):t.push(Y(`code`,[r[2]]));return n<e.length&&t.push(e.slice(n)),t}var Dt=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,Ot=/^\s*([-*_])(\s*\1){2,}\s*$/,kt=/^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?\s*$/,At=e=>e.trim().replace(/^\|/,``).replace(/\|$/,``).split(`|`).map(e=>e.trim()),jt=(e,t)=>/^\s*(`{3,}|~{3,}|#{1,6}\s|>)/.test(e)||Ot.test(e)||Dt.test(e)||e.includes(`|`)&&t!==void 0&&kt.test(t)&&t.includes(`-`);function Mt(e,t=0){if(t>=16)return[Y(`p`,[e])];let n=e.replace(/\r\n?/g,`
|
|
3
3
|
`).split(`
|
|
4
4
|
`),r=[];for(let e=0;e<n.length;){let i=n[e],a=n[e+1],o=i.match(/^\s*(`{3,}|~{3,})\s*([\w+-]*)/),s=i.match(/^\s*(#{1,6})\s+(.*?)\s*#*\s*$/),c=i.match(Dt);if(!i.trim())e++;else if(o){let t=[];for(e++;e<n.length&&!n[e].trim().startsWith(o[1]);e++)t.push(n[e]);e++,r.push(Y(`pre`,[Y(`code`,[t.join(`
|
|
5
5
|
`)],o[2]?{"data-lang":o[2]}:void 0)]))}else if(s)r.push(Y(`h${s[1].length}`,X(s[2]))),e++;else if(Ot.test(i))r.push(Y(`hr`,[])),e++;else if(/^\s*>/.test(i)){let i=[];for(;e<n.length&&/^\s*>/.test(n[e]);e++)i.push(n[e].replace(/^\s*> ?/,``));r.push(Y(`blockquote`,Mt(i.join(`
|
|
6
6
|
`),t+1)))}else if(i.includes(`|`)&&a!==void 0&&kt.test(a)&&a.includes(`-`)){let t=[];for(e+=2;e<n.length&&n[e].trim()&&n[e].includes(`|`);e++)t.push(At(n[e]));r.push(Y(`table`,[Y(`thead`,[Y(`tr`,At(i).map(e=>Y(`th`,X(e))))]),Y(`tbody`,t.map(e=>Y(`tr`,e.map(e=>Y(`td`,X(e))))))]))}else if(c){let i=c[1].length,a=[];for(;e<n.length;){let r=n[e].match(Dt);if(!r||r[1].length!==i||/\d/.test(r[2])!==/\d/.test(c[2]))break;let o=[r[3]],s=r[3].match(/^\[([ xX])\]\s+(.*)$/);for(s&&(o[0]=s[2]),e++;e<n.length&&n[e].trim()&&n[e].search(/\S/)>i;e++)o.push(n[e].replace(RegExp(`^ {0,${i+2}}`),``));let l=Mt(o.join(`
|
|
7
7
|
`),t+1),u=l[0],d=s?.[1]!==` `;s&&(typeof u==`object`&&u.tag===`p`?u.kids:l).unshift(Y(`i`,d?[`✓`]:[],{class:`check`,"data-done":String(d),"aria-label":d?it():at()})),a.push(Y(`li`,l,s?{class:`task`}:void 0)),!n[e]?.trim()&&n[e+1]?.match(Dt)?.[1]?.length===i&&e++}r.push(Y(/\d/.test(c[2])?`ol`:`ul`,a))}else{let t=[i];for(e++;e<n.length&&n[e].trim()&&!jt(n[e],n[e+1]);e++)t.push(n[e]);r.push(Y(`p`,X(t.join(`
|
|
8
|
-
`))))}}return r}function Nt(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 Pt=e=>/^\/(\S{0,64})$/.exec(e)?.[1],Ft=(e,t,n)=>(e+n+t)%t;function It(e,t){let n=M(`ul`,{class:`slash`,id:`slash`,role:`listbox`,"aria-label":oe()}),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=M(`li`,{id:`slash-${t}`,role:`option`,"aria-selected":String(t===i)},M(`b`,null,`/${e.name}`),e.description&&M(`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=Pt(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=Ft(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 Lt=16384,Rt=/^\s*\/(quit|exit|new|resume|fork|clone|import|reload)(?=\s|$)/,Z=new Map,zt=e=>(n,r)=>t(`sessions/${encodeURIComponent(e)}/${n}`,r);function Bt(e,t,n){if(!e.ok)return[`error`,e.status===504?bt():e.body.reason??h({status:e.status})];if(t&&!t.startsWith(n))return[`ok`,Ct()]}var Vt=e=>{try{return e?.startsWith(`[`)?JSON.parse(e):e?[`error`,e]:void 0}catch{return[`error`,e]}},Ht=(e,t)=>e!==``&&!e.startsWith(t)?Be():``,Ut=(e,t)=>e.startsWith(t)?e.slice(t.length).replace(/^\n/,``):e;function Wt(e){if(!e.online)return R();if(!e.live)return I();if(!e.control)return L();if(e.mark===`waiting`)return e.answerable?P():F()}function Gt(t,n,r,a=t=>e(`sessions/${encodeURIComponent(n)}/upload`,t)){let c=`sb-draft:${n}`,l=matchMedia(`(pointer: coarse)`).matches,u=M(`textarea`,{rows:`1`,maxlength:String(Lt),"aria-label":ge(),enterkeyhint:l?`enter`:`send`}),d=M(`button`,{type:`submit`,class:`cmp-send`},Ie()),f=M(`button`,{type:`button`,class:`cmp-alt`},pe()),p=M(`button`,{type:`button`,class:`cmp-alt cmp-stop`},tt()),m=M(`input`,{type:`file`,multiple:``,hidden:``}),g=M(`button`,{type:`button`,class:`cmp-alt`,"aria-label":N()},`+`),_=M(`p`,{class:`cmp-note`,role:`status`,"aria-live":`polite`}),v=It(u,e=>r(`commands`,{prefix:e})),y=M(`form`,{class:`composer`},v,M(`div`,{class:`cmp-row`},g,m,u,M(`div`,{class:`cmp-acts`},d,f,p)),M(`div`,{class:`cmp-foot`},_));t.replaceChildren(y);let b={name:``,control:!1,live:!1,mark:`unknown`,online:!1},x=!1,S=!1,C=e=>{try{e()}catch{}};C(()=>u.value=sessionStorage.getItem(c)??``);let w=()=>C(()=>u.value?sessionStorage.setItem(c,u.value):sessionStorage.removeItem(c)),T=()=>(u.style.height=`auto`,u.style.height=`${Math.min(u.scrollHeight,220)}px`),E=(e,t=``,...n)=>(_.dataset.tone=t,_.replaceChildren(e,...n)),ee=(e,t,n)=>{let r=M(`button`,{type:`button`,class:`cmp-yes`},t),i=M(`button`,{type:`button`,class:`cmp-link`},o());S=!0,r.onclick=()=>(S=!1,n()),i.onclick=()=>(S=!1,E(``),u.focus()),E(e,`ask`,r,i),r.focus()},[D,te]=[`${c}:note`,()=>{try{return sessionStorage.getItem(c)??``}catch{return}}],O=e=>C(()=>e?sessionStorage.setItem(D,JSON.stringify(e)):sessionStorage.removeItem(D));function k(e,t,i){let a={sent:i,answer:r(e,t)};return i!==void 0&&(O([`error`,bt()]),Z.set(n,a),a.answer.then(e=>{let t=te();e.ok&&t!==void 0&&C(()=>sessionStorage.setItem(c,Ut(t,i))),O(Bt(e,t,i))},()=>O([`error`,bt()]))),A(a)}async function A(e,{sent:t}=e){x=!0,S=!1,P(),E(t===void 0?``:i());try{let n=await e.answer;if(!y.isConnected)return;if(!n.ok)return n.status===504||O(),E(n.body.reason??h({status:n.status}),`error`);if(t===void 0)return E(``);O();let r=Ht(u.value,t);u.value=Ut(u.value,t),w(),T(),E(r,`ok`)}catch{E(bt(),`error`)}finally{Z.get(n)===e&&Z.delete(n),x=!1,P()}}function j(e,t){let n=u.value,r=Wt(b),i=t===n;if(x||S||!n.trim())return;if(r)return E(r,`error`);if(new TextEncoder().encode(n).length>16384)return E(mt(),`error`);let a=!i&&n.match(Rt)?.[0].trim();if(a)return ee(G({command:a}),ze({command:a}),()=>j(e,n));k(`input`,{text:n,as:e,confirmed:i},n)}function P(){let e=Wt(b),t=b.mark===`working`;u.placeholder=e??Me({name:b.name}),d.disabled=x||!!e||!u.value.trim(),f.hidden=p.hidden=!t||!!e,[f.disabled,p.disabled]=[d.disabled,x]}async function F(e){if(!e.length||x)return;let t=Wt(b);if(t)return E(t,`error`);E(xt(),``);for(let t of e){if(t.size>20971520)return E(fe({name:t.name}),`error`);let e=await a(t).catch(()=>void 0);if(!e?.ok||typeof e.body.path!=`string`)return E(e?.body.reason??s(),`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}E(``),w(),T(),P(),u.focus()}g.onclick=()=>m.click(),m.onchange=()=>void F([...m.files??[]]).finally(()=>m.value=``),u.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.files??[]];t.length&&(e.preventDefault(),F(t))}),y.addEventListener(`dragover`,e=>e.dataTransfer?.types.includes(`Files`)&&e.preventDefault()),y.addEventListener(`drop`,e=>{let t=[...e.dataTransfer?.files??[]];t.length&&(e.preventDefault(),F(t))}),y.addEventListener(`submit`,e=>(e.preventDefault(),j(`send`))),f.onclick=()=>j(`followUp`),p.onclick=()=>ee(nt(),tt(),()=>void(x||k(`keys`,{keys:[`esc`]}))),u.addEventListener(`input`,()=>(w(),T(),P())),y.addEventListener(`keydown`,e=>{e.key===`Escape`&&!e.isComposing&&(S||e.target===u&&u.value)&&(e.preventDefault(),S&&(S=!1,E(``),u.focus()))}),u.addEventListener(`keydown`,e=>{e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||l&&!e.altKey||(e.preventDefault(),j(e.altKey?`followUp`:`send`))});let I=window.visualViewport,L=()=>document.documentElement.style.setProperty(`--vvh`,`${I.height}px`);return I&&(I.addEventListener(`resize`,L),L()),T(),Z.has(n)?A(Z.get(n)):C(()=>{let e=Vt(sessionStorage.getItem(D));sessionStorage.removeItem(D),e&&E(e[1],e[0])}),{box:u,update:e=>(b=e,P()),ready:()=>!Wt(b)}}var Kt=`allow-forms allow-popups allow-popups-to-escape-sandbox`,qt={},Jt=new Map;function Yt(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 Xt=(e,t,n)=>e?.find(e=>Yt(e.display,t)===Yt(n,t));function Zt(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 Q=(e,t,n=``)=>(e.state.dataset.tone=n,e.state.textContent=t),Qt=(e,t)=>(e.failed=!0,Q(e,t,`error`)),$t=e=>qt.src?.(e)??`doc/${encodeURIComponent(e)}/`;function en(e){if([e.loaded,e.failed]=[e.card.revision,!1],Q(e,``),e.frame)return void(e.frame.src=$t(e.card.cap));let t=e.card.cap,n=/\.(md|markdown)$/i.test(e.card.display),i=++e.seq;(qt.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?M(`div`,{class:`md`},Nt(Mt(t.text))):M(`pre`,{class:`doc-pre`},t.text)):Qt(e,H())),()=>e.seq!==i||Qt(e,r()))}function tn(e,t){let n=Jt.get(t.cap);if(n)return n.tile;let r=t.display.split(`/`).pop()||t.display,i=t.kind===`html`?M(`iframe`,{class:`doc-frame`,sandbox:Kt,referrerpolicy:`no-referrer`,title:Ue({display:t.display,unit:e})}):void 0,a=M(`button`,{type:`button`,class:`cmp-link`},Fe()),o=i&&M(`a`,{class:`cmp-link`,href:$t(t.cap),target:`_blank`,rel:`noopener noreferrer`},Ee()),s=i??M(`div`,{class:`doc-text`},M(`p`,{class:`chat-empty`},me())),c=M(`span`,{class:`term-state`,role:`status`}),l=M(`em`,{class:`doc-off`},Se()),u=M(`div`,{class:`doc-tile`},M(`div`,{class:`term-bar doc-bar`},M(`span`,{class:`doc-why`},t.reason),l,c,M(`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)&&en(p))),f={id:`doc:${t.cap}`,title:`${r} · ${e}`,icon:`i-doc`,body:()=>u,closed:()=>(Jt.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&&en(p),l.hidden=t.onScreen,d.observe(u),en(p),Jt.set(t.cap,p),f}function nn(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 Zt(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);rn(i)}function rn(e){for(let t of Jt.values()){let n=e.get(t.card.cap);if(!n){t.gone||Q(t,se(),`error`),t.gone=!0;continue}let r=t.gone&&(Q(t,``),t.failed);[t.card,t.gone,t.off.hidden]=[n,!1,n.onScreen],(n.revision!==t.loaded||r)&&(t.shown?en(t):n.revision!==t.loaded&&Q(t,U()))}}function an(e,t,n,r){e.hidden=!t?.length&&!n,e.querySelector(`.d-doc-list`).replaceChildren(...(t??[]).map(e=>{let t=M(`button`,{type:`button`,class:`d-doc`,title:e.reason},M(`b`,null,e.display),M(`small`,null,e.onScreen?e.reason:Te({reason:e.reason})));return t.onclick=()=>r(e),t})),e.querySelector(`.d-docs-cut`).hidden=!n}var on=200;function $(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}}}}var sn=()=>g(`<a class="token">${b}<span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></a>`);function cn(e,t,n){m(e,t.key?{view:`session`,ws:n,key:t.key}:void 0),e.toggleAttribute(`hidden`,!1),e.toggleAttribute(`data-alert`,!!t.key&&v(t.mark)),_(e,t.mark),O(e.querySelector(`.plate`),t.role,t.mark,t.docs),y(e,`.name`,t.name),y(e,`.role`,E(t.role)),y(e,`.note`,C(t.note,t.mark))}var ln=()=>g(`<div class="col"><a class="token">${b}<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>`),un=()=>`<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>${l()}</span><h2></h2><p></p></div><button type="button" class="close-x" data-close="base">×</button><dl class="tally"><div><dt>${et()}</dt><dd></dd></div><div><dt>${yt()}</dt><dd></dd></div><div data-mark="working"><dt>${k()}</dt><dd></dd></div><div data-mark="waiting"><dt>${j()}</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>${A()}</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>${Oe()}</b><small>${ke()}</small></h3><div class="formation"></div></section></div><p class="lost" hidden></p></div>`,dn=()=>`<div class="dossier-in"><span class="tag">${vt()}</span><div class="portrait">${b}</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><button class="cmp-link d-close" type="button" data-close="unit" hidden>${S()}</button><div class="d-docs" hidden><h4>${c()}</h4><div class="d-doc-list"></div><p class="d-docs-cut" hidden>${ce()}</p></div><div class="d-drones" hidden><h4>${V()}</h4><div class="formation"></div></div></div>`,fn=()=>`<div class="comms-in"><header class="comms-head"><span class="logo"><svg><use href="#i-comms"/></svg></span><div class="head-id"><h2><small>${B()}</small> <span></span></h2><p></p></div><div class="modes" role="group"><button type="button" data-mode="chat" aria-pressed="true">${B()}</button><button type="button" data-mode="term" aria-pressed="false">${ot()}</button></div><span class="chan link" data-state="live"><i></i><b>${re()}</b></span><button type="button" class="close-x head-close" data-close="unit" hidden>×</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><div class="ask-root"></div><div class="composer-root"></div><div class="term-root" hidden></div></div>`;function pn({data:e,restart:t,openTile:n,embedTerminal:r,online:i}){let o=e=>document.getElementById(e),[s,c,l]=[`ws-view`,`session-view`,`dossier`].map(o),u={view:`map`},h,b={},S,k=[],A=!1,j=new Map,M,N,P,F=0,I,L,R=()=>u.view===`map`?``:u.ws,z=(e,t)=>{let n=document.createElement(`a`);return m(n,e),n.textContent=t,n};function ie(){let e=(e,t,n)=>{let r=document.createElement(e);return r.textContent=t,n&&m(r,n),r},t=o(`crumbs`),n=u;if(n.view===`map`)return t.replaceChildren(e(`b`,`Straw Net`),e(`span`,x()));let r=h?.bases.find(e=>e.id===n.ws)?.label??n.ws,i=n.view===`session`?$(h,n.key)?.u.name??M?.name??n.key:``,a=[];for(let e=n.view===`session`?$(h,n.key):void 0,t=0;e?.launcher&&t<8;e=$(h,e.launcher.key),t++)a.unshift(e.launcher);let s=[e(`a`,`Straw Net`,{view:`map`}),n.view===`workspace`?e(`b`,r):e(`a`,r,{view:`workspace`,ws:n.ws}),...a.map(t=>e(`a`,t.name,{view:`session`,ws:n.ws,key:t.key})),...i?[e(`b`,i)]:[]];s.slice(1,-2).forEach(e=>e.classList.add(`mid`));let c=s.length>3?[Object.assign(e(`span`,`…`),{className:`crumb-more`,role:`button`,tabIndex:0,onclick:()=>t.classList.toggle(`open`)})]:[];t.classList.remove(`open`),t.replaceChildren(s[0],...c,...s.slice(1))}function oe(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=o({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`),a.offsetWidth,a.classList.add(i),setTimeout(()=>a.classList.remove(i),700)}}function B(){s.firstElementChild||s.append(g(un()));let e=s.firstElementChild,t=h?.bases.find(e=>e.id===R()),n=e.querySelector(`.lost`);if(n.hidden=!!t,n.textContent=h?he():St(),e.classList.toggle(`void`,!t),!t)return;let r=e.querySelector(`.keep`);_(r,t.mark),r.classList.toggle(`head`,t.head);let i=e.querySelector(`.tower`);i.classList.toggle(`ghost`,!t.tower),_(i,t.tower?.mark??`unknown`),m(i,t.tower?{view:`session`,ws:t.id,key:t.tower.key}:void 0),i.toggleAttribute(`hidden`,!1),i.toggleAttribute(`data-alert`,!!(t.tower&&v(t.tower.mark))),y(e,`h2`,t.label),D(e.querySelector(`.spawn-btns button`),t),T(e.querySelector(`header .close-x`),t),y(e,`.title p`,t.tower?d({state:ee[t.tower.mark]()}):f());let a=t.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]));[t.tabs.length,a.length,a.filter(e=>e.mark===`working`).length,a.filter(e=>e.mark===`waiting`).length].forEach((t,n)=>e.querySelectorAll(`dd`)[n].textContent=String(t));let o=(e,n)=>{_(e,n.mark),cn(e.querySelector(`.token`),n,t.id);let r=e.querySelector(`.say`),i=b[n.key]??``;r.hidden=!i,y(r,`p`,i),w(e.querySelector(`.drones`),n.subs,sn,(e,n)=>(e.classList.add(`drone`),cn(e,n,t.id)))};w(e.querySelector(`.squads`),t.tabs,()=>g(`<section class="tab squad"><h3><i class="flag"></i><b></b><small></small><button type="button" class="tab-add"></button><button type="button" class="close-x" data-close="tab">×</button></h3><div class="formation"></div></section>`),(e,n)=>{T(e.querySelector(`h3 .close-x`),t,n),y(e,`h3 b`,$e({label:n.label})),D(e.querySelector(`.tab-add`),t,n.id);let r=n.units.flatMap(e=>[e,...e.subs]);y(e,`h3 small`,_t({count:r.length})),_(e,[`waiting`,`error`,`working`].find(e=>r.some(t=>t.mark===e))??`idle`),w(e.querySelector(`.formation`),n.units,ln,o)});let c=(n,r)=>{let i=e.querySelector(`[data-group="${n}"]`);i.hidden=!r.length,w(i.querySelector(`.formation`),r,sn,(e,n)=>cn(e,n,t.id))};c(`outposts`,t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?p():void 0}))),c(`outside`,t.outside)}function V(){if(u.view!==`session`)return;l.firstElementChild||l.append(g(dn()));let e=l.firstElementChild,t=$(h,u.key),r=t?.u,a=r?.mark??`unknown`;_(e,a),O(e.querySelector(`.plate`),r?.role??M?.role??`member`,a),y(e,`h3`,r?.name??M?.name??u.key),y(e,`.role`,E(r?.role??M?.role??`session`)),y(e,`.state`,r?C(r.note,a):ye());let o=e.querySelector(`.d-note`),s=M?.state;o.hidden=s!==`recent`&&s!==`unknown`,o.replaceChildren(s===`unknown`?xe():be()),M?.successor&&o.append(` ${rt()} `,z({view:`session`,ws:R(),key:M.successor},$(h,M.successor)?.u.name??_e()));let d=[[Je(),N],[Ge(),P?pt({count:P.toLocaleString()}):void 0],[Ke(),M?.header?.cwd],[We(),t&&z({view:`workspace`,ws:t.base.id},t.base.label)],[Ye(),t?.squad],[qe(),t?.launcher&&z({view:`session`,ws:t.base.id,key:t.launcher.key},t.launcher.name)],[Xe(),M?.unreadable?ue({count:M.unreadable}):void 0]];e.querySelector(`.specs`).replaceChildren(...d.filter(([,e])=>e).map(([e,t])=>{let n=g(`<div><dt></dt><dd></dd></div>`);return n.firstElementChild.textContent=e,n.lastElementChild.append(t),n}));let f=u.key,p=r?.name??M?.name??f;c.querySelector(`.modes`)?.toggleAttribute(`hidden`,!r?.control);let m=e.querySelector(`.d-close`);Object.assign(m.dataset,{key:f,name:p,role:r?.role??``}),m.hidden=!r?.control||r.role===`subagent`,an(e.querySelector(`.d-docs`),r?.docs,r?.docsCut,e=>n(tn(p,e))),S?.docs();let b=e.querySelector(`.d-drones`);b.hidden=!r?.subs.length,w(b.querySelector(`.formation`),(r?.subs??[]).map(e=>({...e,id:e.key})),sn,(e,t)=>(e.classList.add(`drone`),cn(e,t,R())));let x=c.querySelector(`.comms-head`);if(x){y(x,`h2 span`,r?.name??M?.name??``),y(x,`p`,[t?.base.label,t?.squad&&$e({label:t.squad})].filter(Boolean).join(` · `));let e=x.querySelector(`.chan`),n=s===`live`||!s&&r;e.dataset.state=n?`live`:`closed`,y(e,`b`,n?re():s===`recent`?ne():ve()),e.title=e.querySelector(`b`).textContent??``;let i=x.querySelector(`.head-close`),a=r?.name??M?.name??u.key;Object.assign(i.dataset,{key:u.key,name:a,role:r?.role??``}),i.setAttribute(`aria-label`,ae({name:a})),i.hidden=!r?.control||r.role===`subagent`}le(M?.todos),ce(r?.queued),S?.setLive(a===`working`?`${C(r.note,a)}`:v(a)?ee[a]():``,a),I?.update({name:r?.name??M?.name??u.key,control:!!r?.control,live:s?s===`live`:!!r,mark:a,online:i(),answerable:!!r?.pending?.answer}),L?.update(r?.pending,a===`waiting`&&!!r?.control&&i())}let H=()=>setTimeout(()=>u.view===`session`&&(document.activeElement??document.body)===document.body&&(matchMedia(`(pointer: fine)`).matches&&I?.ready()?I.box:S?.log)?.focus({preventScroll:!0}));async function se(t){let r=++F,{mountChat:i}=await te(async()=>{let{mountChat:e}=await import(`./chat-DVKjeMFP.js`);return{mountChat:e}},__vite__mapDeps([0]),import.meta.url);if(r!==F||u.view!==`session`)return;c.replaceChildren(g(fn()));let o=()=>$(h,t)?.u??{key:t,name:M?.name??t,role:M?.role??`member`,mark:`unknown`};S=i(c.querySelector(`.chat-root`),e(t),{who:o,link:e=>{let n=$(h,t)?.u.subs.find(t=>t.name===e)??h?.bases.flatMap(e=>[...e.tabs.flatMap(e=>e.units),...e.outside]).find(t=>t.name===e);return n&&z({view:`session`,ws:$(h,n.key)?.base.id??R(),key:n.key},e)},docFor:(e,r=Xt($(h,t)?.u.docs,M?.header?.cwd,e))=>r&&(()=>n(tn(o().name,r)))});let s=e(t).post??zt(t);[I,L]=[Gt(c.querySelector(`.composer-root`),t,s),a(c.querySelector(`.ask-root`),s,void 0,()=>q(`term`))],c.querySelectorAll(`.modes button`).forEach(e=>e.onclick=()=>q(e.dataset.mode)),G===`term`&&q(`term`),G=void 0,S.reveal(u.at),k.splice(0).forEach(U),V(),H()}function U(e){S?.apply(e);for(let t of e.items??[])t.kind===`assistant`&&([N,P]=[t.model??N,t.ctx??P])}function ce(e){let t=c.querySelector(`.queue-list`);if(!t)return;t.hidden=!e?.length;let n=e=>Object.assign(document.createElement(`b`),{textContent:e.as===`steer`?Pe():Ne()});t.replaceChildren(...(e??[]).map(e=>{let t=document.createElement(`p`);return t.append(n(e),document.createTextNode(e.text)),t}))}function le(e){let t=c.querySelector(`.todos`);if(!t||(t.hidden=!e?.length,!e?.length))return;let n=e.filter(e=>e.status===`completed`).length,r=e.find(e=>e.status===`in_progress`);y(t,`summary b`,lt({done:n,total:e.length})),y(t,`summary span`,r?r.activeForm??r.subject:n===e.length?ut():``),t.querySelector(`ol`).replaceChildren(...e.map(e=>Object.assign(document.createElement(`li`),{textContent:e.subject,className:e.status})))}let W,G,K=0;function q(e){if(u.view!==`session`)return;let t=u.key,n=c.querySelector(`.comms-in`);if(!n)return void(G=e===`term`?`term`:void 0);n.querySelectorAll(`.modes button`).forEach(t=>t.setAttribute(`aria-pressed`,String(t.dataset.mode===e)));for(let t of[`.chat-root`,`.ask-root`,`.composer-root`])n.querySelector(t).hidden=e===`term`;let i=n.querySelector(`.term-root`);if(i.hidden=e!==`term`,n.classList.toggle(`in-term`,e===`term`),W?.(),W=void 0,e!==`term`)return H();let a=++K;r(t,$(h,t)?.u.name??M?.name??t,i).then(e=>a===K&&u.view===`session`&&u.key===t?W=e:e())}let de=()=>(K++,W?.(),W=void 0),J=()=>(ie(),u.view===`workspace`?B():V());return{terminal(e){u.view===`session`&&u.key===e?q(`term`):G=`term`},locate:e=>$(h,e),show(e,t,n){let[r,i]=u.view===`session`?[u.key,u.at]:[];(e.view!==`workspace`||u.view!==`workspace`||e.ws!==u.ws)&&(b={}),u=e,s.hidden=e.view!==`workspace`,c.hidden=l.hidden=e.view!==`session`,(e.view!==`session`||e.key!==r)&&de(),e.view===`session`&&e.key!==r?([S,I,L,M,N,P,k,A]=[void 0,void 0,void 0,void 0,void 0,void 0,[],!1],c.replaceChildren(g(`<p class="lost">${De()}</p>`)),se(e.key)):e.view===`session`&&e.at!==i?(S?.reveal(e.at),H()):e.view!==`session`&&(F++,S=I=L=void 0),J(),e!==t&&oe(e,t,n)},net(e){h=e,nn(e,j,u.view===`session`?u.key:void 0,(e,t)=>n(tn(e,t),!1)),u.view!==`map`&&J()},cards(e){b={...b,...e},u.view===`workspace`&&B()},history(e){if(u.view===`session`&&e.key===u.key){if(M={...M,...e,items:void 0},e.reset&&([N,P]=[void 0,void 0]),document.hidden)return k.length<on?void k.push(e):void(A=!0);S?U(e):k.push(e),V()}},wake(){if(A)return A=!1,k=[],t();k.splice(0).forEach(e=>S&&U(e)),J()}}}export{pn as mountFocus,Mt as n,Nt as t};
|
|
8
|
+
`))))}}return r}function Nt(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 Pt=e=>/^\/(\S{0,64})$/.exec(e)?.[1],Ft=(e,t,n)=>(e+n+t)%t;function It(e,t){let n=M(`ul`,{class:`slash`,id:`slash`,role:`listbox`,"aria-label":oe()}),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=M(`li`,{id:`slash-${t}`,role:`option`,"aria-selected":String(t===i)},M(`b`,null,`/${e.name}`),e.description&&M(`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=Pt(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=Ft(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 Lt=16384,Rt=/^\s*\/(quit|exit|new|resume|fork|clone|import|reload)(?=\s|$)/,Z=new Map,zt=e=>(n,r)=>t(`sessions/${encodeURIComponent(e)}/${n}`,r);function Bt(e,t,n){if(!e.ok)return[`error`,e.status===504?bt():e.body.reason??h({status:e.status})];if(t&&!t.startsWith(n))return[`ok`,Ct()]}var Vt=e=>{try{return e?.startsWith(`[`)?JSON.parse(e):e?[`error`,e]:void 0}catch{return[`error`,e]}},Ht=(e,t)=>e!==``&&!e.startsWith(t)?Be():``,Ut=(e,t)=>e.startsWith(t)?e.slice(t.length).replace(/^\n/,``):e;function Wt(e){if(!e.online)return R();if(!e.live)return I();if(!e.control)return L();if(e.mark===`waiting`)return e.answerable?P():F()}function Gt(t,n,r,a=t=>e(`sessions/${encodeURIComponent(n)}/upload`,t)){let c=`sb-draft:${n}`,l=matchMedia(`(pointer: coarse)`).matches,u=M(`textarea`,{rows:`1`,maxlength:String(Lt),"aria-label":ge(),enterkeyhint:l?`enter`:`send`}),d=M(`button`,{type:`submit`,class:`cmp-send`},Ie()),f=M(`button`,{type:`button`,class:`cmp-alt`},pe()),p=M(`button`,{type:`button`,class:`cmp-alt cmp-stop`},tt()),m=M(`input`,{type:`file`,multiple:``,hidden:``}),g=M(`button`,{type:`button`,class:`cmp-alt`,"aria-label":N()},`+`),_=M(`p`,{class:`cmp-note`,role:`status`,"aria-live":`polite`}),v=It(u,e=>r(`commands`,{prefix:e})),y=M(`form`,{class:`composer`},v,M(`div`,{class:`cmp-row`},g,m,u,M(`div`,{class:`cmp-acts`},d,f,p)),M(`div`,{class:`cmp-foot`},_));t.replaceChildren(y);let b={name:``,control:!1,live:!1,mark:`unknown`,online:!1},x=!1,S=!1,C=e=>{try{e()}catch{}};C(()=>u.value=sessionStorage.getItem(c)??``);let w=()=>C(()=>u.value?sessionStorage.setItem(c,u.value):sessionStorage.removeItem(c)),T=()=>(u.style.height=`auto`,u.style.height=`${Math.min(u.scrollHeight,220)}px`),E=(e,t=``,...n)=>(_.dataset.tone=t,_.replaceChildren(e,...n)),ee=(e,t,n)=>{let r=M(`button`,{type:`button`,class:`cmp-yes`},t),i=M(`button`,{type:`button`,class:`cmp-link`},o());S=!0,r.onclick=()=>(S=!1,n()),i.onclick=()=>(S=!1,E(``),u.focus()),E(e,`ask`,r,i),r.focus()},[D,te]=[`${c}:note`,()=>{try{return sessionStorage.getItem(c)??``}catch{return}}],O=e=>C(()=>e?sessionStorage.setItem(D,JSON.stringify(e)):sessionStorage.removeItem(D));function k(e,t,i){let a={sent:i,answer:r(e,t)};return i!==void 0&&(O([`error`,bt()]),Z.set(n,a),a.answer.then(e=>{let t=te();e.ok&&t!==void 0&&C(()=>sessionStorage.setItem(c,Ut(t,i))),O(Bt(e,t,i))},()=>O([`error`,bt()]))),A(a)}async function A(e,{sent:t}=e){x=!0,S=!1,P(),E(t===void 0?``:i());try{let n=await e.answer;if(!y.isConnected)return;if(!n.ok)return n.status===504||O(),E(n.body.reason??h({status:n.status}),`error`);if(t===void 0)return E(``);O();let r=Ht(u.value,t);u.value=Ut(u.value,t),w(),T(),E(r,`ok`)}catch{E(bt(),`error`)}finally{Z.get(n)===e&&Z.delete(n),x=!1,P()}}function j(e,t){let n=u.value,r=Wt(b),i=t===n;if(x||S||!n.trim())return;if(r)return E(r,`error`);if(new TextEncoder().encode(n).length>16384)return E(mt(),`error`);let a=!i&&n.match(Rt)?.[0].trim();if(a)return ee(G({command:a}),ze({command:a}),()=>j(e,n));k(`input`,{text:n,as:e,confirmed:i},n)}function P(){let e=Wt(b),t=b.mark===`working`;u.placeholder=e??Me({name:b.name}),d.disabled=x||!!e||!u.value.trim(),f.hidden=p.hidden=!t||!!e,[f.disabled,p.disabled]=[d.disabled,x]}async function F(e){if(!e.length||x)return;let t=Wt(b);if(t)return E(t,`error`);E(xt(),``);for(let t of e){if(t.size>20971520)return E(fe({name:t.name}),`error`);let e=await a(t).catch(()=>void 0);if(!e?.ok||typeof e.body.path!=`string`)return E(e?.body.reason??s(),`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}E(``),w(),T(),P(),u.focus()}g.onclick=()=>m.click(),m.onchange=()=>void F([...m.files??[]]).finally(()=>m.value=``),u.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.files??[]];t.length&&(e.preventDefault(),F(t))}),y.addEventListener(`dragover`,e=>e.dataTransfer?.types.includes(`Files`)&&e.preventDefault()),y.addEventListener(`drop`,e=>{let t=[...e.dataTransfer?.files??[]];t.length&&(e.preventDefault(),F(t))}),y.addEventListener(`submit`,e=>(e.preventDefault(),j(`send`))),f.onclick=()=>j(`followUp`),p.onclick=()=>ee(nt(),tt(),()=>void(x||k(`keys`,{keys:[`esc`]}))),u.addEventListener(`input`,()=>(w(),T(),P())),y.addEventListener(`keydown`,e=>{e.key===`Escape`&&!e.isComposing&&(S||e.target===u&&u.value)&&(e.preventDefault(),S&&(S=!1,E(``),u.focus()))}),u.addEventListener(`keydown`,e=>{e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||l&&!e.altKey||(e.preventDefault(),j(e.altKey?`followUp`:`send`))});let I=window.visualViewport,L=()=>document.documentElement.style.setProperty(`--vvh`,`${I.height}px`);return I&&(I.addEventListener(`resize`,L),L()),T(),Z.has(n)?A(Z.get(n)):C(()=>{let e=Vt(sessionStorage.getItem(D));sessionStorage.removeItem(D),e&&E(e[1],e[0])}),{box:u,update:e=>(b=e,P()),ready:()=>!Wt(b)}}var Kt=`allow-forms allow-popups allow-popups-to-escape-sandbox`,qt={},Jt=new Map;function Yt(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 Xt=(e,t,n)=>e?.find(e=>Yt(e.display,t)===Yt(n,t));function Zt(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 Q=(e,t,n=``)=>(e.state.dataset.tone=n,e.state.textContent=t),Qt=(e,t)=>(e.failed=!0,Q(e,t,`error`)),$t=e=>qt.src?.(e)??`doc/${encodeURIComponent(e)}/`;function en(e){if([e.loaded,e.failed]=[e.card.revision,!1],Q(e,``),e.frame)return void(e.frame.src=$t(e.card.cap));let t=e.card.cap,n=/\.(md|markdown)$/i.test(e.card.display),i=++e.seq;(qt.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?M(`div`,{class:`md`},Nt(Mt(t.text))):M(`pre`,{class:`doc-pre`},t.text)):Qt(e,H())),()=>e.seq!==i||Qt(e,r()))}function tn(e,t){let n=Jt.get(t.cap);if(n)return n.tile;let r=t.display.split(`/`).pop()||t.display,i=t.kind===`html`?M(`iframe`,{class:`doc-frame`,sandbox:Kt,referrerpolicy:`no-referrer`,title:Ue({display:t.display,unit:e})}):void 0,a=M(`button`,{type:`button`,class:`cmp-link`},Fe()),o=i&&M(`a`,{class:`cmp-link`,href:$t(t.cap),target:`_blank`,rel:`noopener noreferrer`},Ee()),s=i??M(`div`,{class:`doc-text`},M(`p`,{class:`chat-empty`},me())),c=M(`span`,{class:`term-state`,role:`status`}),l=M(`em`,{class:`doc-off`},Se()),u=M(`div`,{class:`doc-tile`},M(`div`,{class:`term-bar doc-bar`},M(`span`,{class:`doc-why`},t.reason),l,c,M(`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)&&en(p))),f={id:`doc:${t.cap}`,title:`${r} · ${e}`,icon:`i-doc`,body:()=>u,closed:()=>(Jt.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&&en(p),l.hidden=t.onScreen,d.observe(u),en(p),Jt.set(t.cap,p),f}function nn(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 Zt(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);rn(i)}function rn(e){for(let t of Jt.values()){let n=e.get(t.card.cap);if(!n){t.gone||Q(t,se(),`error`),t.gone=!0;continue}let r=t.gone&&(Q(t,``),t.failed);[t.card,t.gone,t.off.hidden]=[n,!1,n.onScreen],(n.revision!==t.loaded||r)&&(t.shown?en(t):n.revision!==t.loaded&&Q(t,U()))}}function an(e,t,n,r){e.hidden=!t?.length&&!n,e.querySelector(`.d-doc-list`).replaceChildren(...(t??[]).map(e=>{let t=M(`button`,{type:`button`,class:`d-doc`,title:e.reason},M(`b`,null,e.display),M(`small`,null,e.onScreen?e.reason:Te({reason:e.reason})));return t.onclick=()=>r(e),t})),e.querySelector(`.d-docs-cut`).hidden=!n}var on=200;function $(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}}}}var sn=()=>g(`<a class="token">${b}<span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></a>`);function cn(e,t,n){m(e,t.key?{view:`session`,ws:n,key:t.key}:void 0),e.toggleAttribute(`hidden`,!1),e.toggleAttribute(`data-alert`,!!t.key&&v(t.mark)),_(e,t.mark),O(e.querySelector(`.plate`),t.role,t.mark,t.docs),y(e,`.name`,t.name),y(e,`.role`,E(t.role)),y(e,`.note`,C(t.note,t.mark))}var ln=()=>g(`<div class="col"><a class="token">${b}<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>`),un=()=>`<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>${l()}</span><h2></h2><p></p></div><button type="button" class="close-x" data-close="base">×</button><dl class="tally"><div><dt>${et()}</dt><dd></dd></div><div><dt>${yt()}</dt><dd></dd></div><div data-mark="working"><dt>${k()}</dt><dd></dd></div><div data-mark="waiting"><dt>${j()}</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>${A()}</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>${Oe()}</b><small>${ke()}</small></h3><div class="formation"></div></section></div><p class="lost" hidden></p></div>`,dn=()=>`<div class="dossier-in"><span class="tag">${vt()}</span><div class="portrait">${b}</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><button class="cmp-link d-close" type="button" data-close="unit" hidden>${S()}</button><div class="d-docs" hidden><h4>${c()}</h4><div class="d-doc-list"></div><p class="d-docs-cut" hidden>${ce()}</p></div><div class="d-drones" hidden><h4>${V()}</h4><div class="formation"></div></div></div>`,fn=()=>`<div class="comms-in"><header class="comms-head"><span class="logo"><svg><use href="#i-comms"/></svg></span><div class="head-id"><h2><small>${B()}</small> <span></span></h2><p></p></div><div class="modes" role="group"><button type="button" data-mode="chat" aria-pressed="true">${B()}</button><button type="button" data-mode="term" aria-pressed="false">${ot()}</button></div><span class="chan link" data-state="live"><i></i><b>${re()}</b></span><button type="button" class="close-x head-close" data-close="unit" hidden>×</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><div class="ask-root"></div><div class="composer-root"></div><div class="term-root" hidden></div></div>`;function pn({data:e,restart:t,openTile:n,embedTerminal:r,online:i}){let o=e=>document.getElementById(e),[s,c,l]=[`ws-view`,`session-view`,`dossier`].map(o),u={view:`map`},h,b={},S,k=[],A=!1,j=new Map,M,N,P,F=0,I,L,R=()=>u.view===`map`?``:u.ws,z=(e,t)=>{let n=document.createElement(`a`);return m(n,e),n.textContent=t,n};function ie(){let e=(e,t,n)=>{let r=document.createElement(e);return r.textContent=t,n&&m(r,n),r},t=o(`crumbs`),n=u;if(n.view===`map`)return t.replaceChildren(e(`b`,`Straw Net`),e(`span`,x()));let r=h?.bases.find(e=>e.id===n.ws)?.label??n.ws,i=n.view===`session`?$(h,n.key)?.u.name??M?.name??n.key:``,a=[];for(let e=n.view===`session`?$(h,n.key):void 0,t=0;e?.launcher&&t<8;e=$(h,e.launcher.key),t++)a.unshift(e.launcher);let s=[e(`a`,`Straw Net`,{view:`map`}),n.view===`workspace`?e(`b`,r):e(`a`,r,{view:`workspace`,ws:n.ws}),...a.map(t=>e(`a`,t.name,{view:`session`,ws:n.ws,key:t.key})),...i?[e(`b`,i)]:[]];s.slice(1,-2).forEach(e=>e.classList.add(`mid`));let c=s.length>3?[Object.assign(e(`span`,`…`),{className:`crumb-more`,role:`button`,tabIndex:0,onclick:()=>t.classList.toggle(`open`)})]:[];t.classList.remove(`open`),t.replaceChildren(s[0],...c,...s.slice(1))}function oe(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=o({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`),a.offsetWidth,a.classList.add(i),setTimeout(()=>a.classList.remove(i),700)}}function B(){s.firstElementChild||s.append(g(un()));let e=s.firstElementChild,t=h?.bases.find(e=>e.id===R()),n=e.querySelector(`.lost`);if(n.hidden=!!t,n.textContent=h?he():St(),e.classList.toggle(`void`,!t),!t)return;let r=e.querySelector(`.keep`);_(r,t.mark),r.classList.toggle(`head`,t.head);let i=e.querySelector(`.tower`);i.classList.toggle(`ghost`,!t.tower),_(i,t.tower?.mark??`unknown`),m(i,t.tower?{view:`session`,ws:t.id,key:t.tower.key}:void 0),i.toggleAttribute(`hidden`,!1),i.toggleAttribute(`data-alert`,!!(t.tower&&v(t.tower.mark))),y(e,`h2`,t.label),D(e.querySelector(`.spawn-btns button`),t),T(e.querySelector(`header .close-x`),t),y(e,`.title p`,t.tower?d({state:ee[t.tower.mark]()}):f());let a=t.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]));[t.tabs.length,a.length,a.filter(e=>e.mark===`working`).length,a.filter(e=>e.mark===`waiting`).length].forEach((t,n)=>e.querySelectorAll(`dd`)[n].textContent=String(t));let o=(e,n)=>{_(e,n.mark),cn(e.querySelector(`.token`),n,t.id);let r=e.querySelector(`.say`),i=b[n.key]??``;r.hidden=!i,y(r,`p`,i),w(e.querySelector(`.drones`),n.subs,sn,(e,n)=>(e.classList.add(`drone`),cn(e,n,t.id)))};w(e.querySelector(`.squads`),t.tabs,()=>g(`<section class="tab squad"><h3><i class="flag"></i><b></b><small></small><button type="button" class="tab-add"></button><button type="button" class="close-x" data-close="tab">×</button></h3><div class="formation"></div></section>`),(e,n)=>{T(e.querySelector(`h3 .close-x`),t,n),y(e,`h3 b`,$e({label:n.label})),D(e.querySelector(`.tab-add`),t,n.id);let r=n.units.flatMap(e=>[e,...e.subs]);y(e,`h3 small`,_t({count:r.length})),_(e,[`waiting`,`error`,`working`].find(e=>r.some(t=>t.mark===e))??`idle`),w(e.querySelector(`.formation`),n.units,ln,o)});let c=(n,r)=>{let i=e.querySelector(`[data-group="${n}"]`);i.hidden=!r.length,w(i.querySelector(`.formation`),r,sn,(e,n)=>cn(e,n,t.id))};c(`outposts`,t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?p():void 0}))),c(`outside`,t.outside)}function V(){if(u.view!==`session`)return;l.firstElementChild||l.append(g(dn()));let e=l.firstElementChild,t=$(h,u.key),r=t?.u,a=r?.mark??`unknown`;_(e,a),O(e.querySelector(`.plate`),r?.role??M?.role??`member`,a),y(e,`h3`,r?.name??M?.name??u.key),y(e,`.role`,E(r?.role??M?.role??`session`)),y(e,`.state`,r?C(r.note,a):ye());let o=e.querySelector(`.d-note`),s=M?.state;o.hidden=s!==`recent`&&s!==`unknown`,o.replaceChildren(s===`unknown`?xe():be()),M?.successor&&o.append(` ${rt()} `,z({view:`session`,ws:R(),key:M.successor},$(h,M.successor)?.u.name??_e()));let d=[[Je(),N],[Ge(),P?pt({count:P.toLocaleString()}):void 0],[Ke(),M?.header?.cwd],[We(),t&&z({view:`workspace`,ws:t.base.id},t.base.label)],[Ye(),t?.squad],[qe(),t?.launcher&&z({view:`session`,ws:t.base.id,key:t.launcher.key},t.launcher.name)],[Xe(),M?.unreadable?ue({count:M.unreadable}):void 0]];e.querySelector(`.specs`).replaceChildren(...d.filter(([,e])=>e).map(([e,t])=>{let n=g(`<div><dt></dt><dd></dd></div>`);return n.firstElementChild.textContent=e,n.lastElementChild.append(t),n}));let f=u.key,p=r?.name??M?.name??f;c.querySelector(`.modes`)?.toggleAttribute(`hidden`,!r?.control);let m=e.querySelector(`.d-close`);Object.assign(m.dataset,{key:f,name:p,role:r?.role??``}),m.hidden=!r?.control||r.role===`subagent`,an(e.querySelector(`.d-docs`),r?.docs,r?.docsCut,e=>n(tn(p,e))),S?.docs();let b=e.querySelector(`.d-drones`);b.hidden=!r?.subs.length,w(b.querySelector(`.formation`),(r?.subs??[]).map(e=>({...e,id:e.key})),sn,(e,t)=>(e.classList.add(`drone`),cn(e,t,R())));let x=c.querySelector(`.comms-head`);if(x){y(x,`h2 span`,r?.name??M?.name??``),y(x,`p`,[t?.base.label,t?.squad&&$e({label:t.squad})].filter(Boolean).join(` · `));let e=x.querySelector(`.chan`),n=s===`live`||!s&&r;e.dataset.state=n?`live`:`closed`,y(e,`b`,n?re():s===`recent`?ne():ve()),e.title=e.querySelector(`b`).textContent??``;let i=x.querySelector(`.head-close`),a=r?.name??M?.name??u.key;Object.assign(i.dataset,{key:u.key,name:a,role:r?.role??``}),i.setAttribute(`aria-label`,ae({name:a})),i.hidden=!r?.control||r.role===`subagent`}le(M?.todos),ce(r?.queued),S?.setLive(a===`working`?`${C(r.note,a)}`:v(a)?ee[a]():``,a),I?.update({name:r?.name??M?.name??u.key,control:!!r?.control,live:s?s===`live`:!!r,mark:a,online:i(),answerable:!!r?.pending?.answer}),L?.update(r?.pending,a===`waiting`&&!!r?.control&&i())}let H=()=>setTimeout(()=>u.view===`session`&&(document.activeElement??document.body)===document.body&&(matchMedia(`(pointer: fine)`).matches&&I?.ready()?I.box:S?.log)?.focus({preventScroll:!0}));async function se(t){let r=++F,{mountChat:i}=await te(async()=>{let{mountChat:e}=await import(`./chat-TOYLpfbg.js`);return{mountChat:e}},__vite__mapDeps([0]),import.meta.url);if(r!==F||u.view!==`session`)return;c.replaceChildren(g(fn()));let o=()=>$(h,t)?.u??{key:t,name:M?.name??t,role:M?.role??`member`,mark:`unknown`};S=i(c.querySelector(`.chat-root`),e(t),{who:o,link:e=>{let n=$(h,t)?.u.subs.find(t=>t.name===e)??h?.bases.flatMap(e=>[...e.tabs.flatMap(e=>e.units),...e.outside]).find(t=>t.name===e);return n&&z({view:`session`,ws:$(h,n.key)?.base.id??R(),key:n.key},e)},docFor:(e,r=Xt($(h,t)?.u.docs,M?.header?.cwd,e))=>r&&(()=>n(tn(o().name,r)))});let s=e(t).post??zt(t);[I,L]=[Gt(c.querySelector(`.composer-root`),t,s),a(c.querySelector(`.ask-root`),s,void 0,()=>q(`term`))],c.querySelectorAll(`.modes button`).forEach(e=>e.onclick=()=>q(e.dataset.mode)),G===`term`&&q(`term`),G=void 0,S.reveal(u.at),k.splice(0).forEach(U),V(),H()}function U(e){S?.apply(e);for(let t of e.items??[])t.kind===`assistant`&&([N,P]=[t.model??N,t.ctx??P])}function ce(e){let t=c.querySelector(`.queue-list`);if(!t)return;t.hidden=!e?.length;let n=e=>Object.assign(document.createElement(`b`),{textContent:e.as===`steer`?Pe():Ne()});t.replaceChildren(...(e??[]).map(e=>{let t=document.createElement(`p`);return t.append(n(e),document.createTextNode(e.text)),t}))}function le(e){let t=c.querySelector(`.todos`);if(!t||(t.hidden=!e?.length,!e?.length))return;let n=e.filter(e=>e.status===`completed`).length,r=e.find(e=>e.status===`in_progress`);y(t,`summary b`,lt({done:n,total:e.length})),y(t,`summary span`,r?r.activeForm??r.subject:n===e.length?ut():``),t.querySelector(`ol`).replaceChildren(...e.map(e=>Object.assign(document.createElement(`li`),{textContent:e.subject,className:e.status})))}let W,G,K=0;function q(e){if(u.view!==`session`)return;let t=u.key,n=c.querySelector(`.comms-in`);if(!n)return void(G=e===`term`?`term`:void 0);n.querySelectorAll(`.modes button`).forEach(t=>t.setAttribute(`aria-pressed`,String(t.dataset.mode===e)));for(let t of[`.chat-root`,`.ask-root`,`.composer-root`])n.querySelector(t).hidden=e===`term`;let i=n.querySelector(`.term-root`);if(i.hidden=e!==`term`,n.classList.toggle(`in-term`,e===`term`),W?.(),W=void 0,e!==`term`)return H();let a=++K;r(t,$(h,t)?.u.name??M?.name??t,i).then(e=>a===K&&u.view===`session`&&u.key===t?W=e:e())}let de=()=>(K++,W?.(),W=void 0),J=()=>(ie(),u.view===`workspace`?B():V());return{terminal(e){u.view===`session`&&u.key===e?q(`term`):G=`term`},locate:e=>$(h,e),show(e,t,n){let[r,i]=u.view===`session`?[u.key,u.at]:[];(e.view!==`workspace`||u.view!==`workspace`||e.ws!==u.ws)&&(b={}),u=e,s.hidden=e.view!==`workspace`,c.hidden=l.hidden=e.view!==`session`,(e.view!==`session`||e.key!==r)&&de(),e.view===`session`&&e.key!==r?([S,I,L,M,N,P,k,A]=[void 0,void 0,void 0,void 0,void 0,void 0,[],!1],c.replaceChildren(g(`<p class="lost">${De()}</p>`)),se(e.key)):e.view===`session`&&e.at!==i?(S?.reveal(e.at),H()):e.view!==`session`&&(F++,S=I=L=void 0),J(),e!==t&&oe(e,t,n)},net(e){h=e,nn(e,j,u.view===`session`?u.key:void 0,(e,t)=>n(tn(e,t),!1)),u.view!==`map`&&J()},cards(e){b={...b,...e},u.view===`workspace`&&B()},history(e){if(u.view===`session`&&e.key===u.key){if(M={...M,...e,items:void 0},e.reset&&([N,P]=[void 0,void 0]),document.hidden)return k.length<on?void k.push(e):void(A=!0);S?U(e):k.push(e),V()}},wake(){if(A)return A=!1,k=[],t();k.splice(0).forEach(e=>S&&U(e)),J()}}}export{pn as mountFocus,Mt as n,Nt as t};
|
|
Binary file
|
package/dist/gui/index.html
CHANGED
|
@@ -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-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
9
|
+
<script type="module" crossorigin src="./assets/index-DDeJoO2R.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BTGK6xu9.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<!-- Icons: game-icons.net, CC BY 3.0 (Lorc, Delapouite); see gui/ICONS.md -->
|
|
@@ -36,6 +36,8 @@
|
|
|
36
36
|
<div data-mark="waiting"><dt data-m="stat_waiting">Waiting</dt><dd id="s-waiting">0</dd></div>
|
|
37
37
|
</dl>
|
|
38
38
|
<button class="alerts" id="alerts" type="button" data-mark="unknown" aria-label="Alerts" data-m-label="alerts" disabled><span class="faces" id="alert-faces"></span><span class="count"><b id="alert-count">0</b><small id="alert-text" data-m="no_alerts">no alerts</small></span></button>
|
|
39
|
+
<button class="pair-btn tog" id="remind" type="button" aria-pressed="true"></button>
|
|
40
|
+
<button class="pair-btn tog" id="sound" type="button" aria-pressed="false"></button>
|
|
39
41
|
<button class="pair-btn" id="pair" type="button" title="Pair a phone over Tailscale (/boss gui remote turns remote access on)" data-m="pair_button" data-m-title="pair_title">Phone</button>
|
|
40
42
|
<select class="pair-btn lang" id="lang" aria-label="Language" data-m-label="language"></select>
|
|
41
43
|
<div class="link" id="link" data-state="connecting"><i></i><span id="link-text">connecting</span></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-straw-boss",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
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",
|
package/prompts/main.md
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
You are the main agent of Herdr tab {{tab}}: the boss (the user) works with you here. Your workspace tower is {{tower}}.
|
|
2
2
|
|
|
3
3
|
- Split work by owning app ({{dir}}/apps-config.md). A task is one worker's end-to-end work in one app; parallel writers in an app each get a worktree; dependent tasks wait.
|
|
4
|
+
- Before your first dispatch, plan by {{dir}}/planning.md and get the boss's confirmation.
|
|
4
5
|
- Brief each worker in English: required behavior, the Reality anchor, the boss's authorizations quoted; leave cause and location to the worker. End with: "When you need a decision these authorizations do not cover, call `caller_ping` and stop." Answer pings through the boss, then `subagent_resume` the worker.
|
|
5
6
|
- Check each result against its brief. Merging to a shared branch or deploying needs the boss's authorization.
|
|
7
|
+
- When your work turns to another task, `boss_rename` yourself with a phrase for it (at most 16 characters).
|
|
6
8
|
- boss_status finds coordinators, call_tower reaches the tower (report coordination friction there), boss_broadcast broadcasts to the net.
|
|
7
9
|
- Done when every task has landed or is reported blocked and its worktree is removed.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Planning work
|
|
2
|
+
|
|
3
|
+
Plan before your first dispatch, and plan again when the work's shape changes.
|
|
4
|
+
|
|
5
|
+
## 1. Choose the graph
|
|
6
|
+
|
|
7
|
+
Take the first case that matches:
|
|
8
|
+
|
|
9
|
+
- **single-loop**: one bounded task that you carry yourself, or that one subagent carries. Do not state it, and do not write a plan.
|
|
10
|
+
- **fan-out/fan-in**: independent branches run in subagents, and you integrate their results.
|
|
11
|
+
- **orchestrator-worker**: several workers, each owning one app's task end to end, with dependency edges or more ready tasks than the concurrency cap.
|
|
12
|
+
|
|
13
|
+
An independent review is a checkpoint, not a change of graph.
|
|
14
|
+
|
|
15
|
+
## 2. Write the plan as todos
|
|
16
|
+
|
|
17
|
+
For fan-out and orchestrator-worker, create one todo per task. A task is the largest item one worker can own end to end in one app.
|
|
18
|
+
|
|
19
|
+
- `subject`: the required outcome.
|
|
20
|
+
- `owner`: the subagent's name, or `self` for work you carry yourself.
|
|
21
|
+
- `description`: the app, the worktree branch for a parallel writer, the anchor and who exercises it, and the exact artifact path a dependent will read.
|
|
22
|
+
- `blockedBy`: the tasks whose output or landed change this one needs. Edges set the order. Tasks with no open blocker run in parallel, up to the cap (4 unless the boss or the project names another). Writers that would clash in one checkout wait.
|
|
23
|
+
- `metadata`: `{ "graph": "...", "anchor": "...", "checkpoint": "own" | "<checkpoint todo id>" }`.
|
|
24
|
+
|
|
25
|
+
## 3. Name the anchors
|
|
26
|
+
|
|
27
|
+
Each anchor is the lightest check that can fail before the change and still reach what changed:
|
|
28
|
+
|
|
29
|
+
- **testing**: the default for code changes. Use the smallest test that goes red first. Repo-wide suites, lint, and type checks run once, at the shared checkpoint or before merge, never inside each task.
|
|
30
|
+
- **pseudo-human**: a browser or computer operates the real interface and records screenshots and measurements.
|
|
31
|
+
- **human**: the boss operates or judges the delivered result. Use it where the boss's judgment is the real check: UI feel, wording, a business rule.
|
|
32
|
+
- **adversarial-review**: a fresh-context agent challenges the result against the requirement. Use it for read-only work that has no executable checkpoint.
|
|
33
|
+
|
|
34
|
+
Tasks that share one anchor share one checkpoint. Do not verify the same thing separately in each branch. Give each such group one checkpoint todo, `blockedBy` every task it covers, and tell those workers to hand their evidence to it instead of running it themselves. A task whose check is distinct, or plainly cheaper in place, keeps its own.
|
|
35
|
+
|
|
36
|
+
A change-set that touches a shared contract, authorization or permission data, or a migration gets one fresh-context reviewer after its anchor passes. Other change-sets take the author's own read of the diff against the brief.
|
|
37
|
+
|
|
38
|
+
## 4. Confirm, then start
|
|
39
|
+
|
|
40
|
+
Show the boss the plan through your question tool before the first dispatch: the graph, the tasks with their owners, the edges and what they leave parallel, each shared anchor and what it checks, and every human checkpoint. Start only on their confirmation. A change to the graph, an edge, or an anchor goes back to the boss in the same way.
|
|
41
|
+
|
|
42
|
+
## 5. Run it
|
|
43
|
+
|
|
44
|
+
Dispatch each ready task. When a result arrives, check it against its brief and its anchor, mark the todo `completed`, then dispatch whatever it unblocked. A failed or cancelled task leaves its dependents blocked: report them, and resolve the next step with the boss. Only a completed task satisfies a dependency.
|
package/src/gui.ts
CHANGED
|
@@ -29,13 +29,13 @@ import { api, type Hub as Files, image, watchSession, type Watch, watchWorkspace
|
|
|
29
29
|
|
|
30
30
|
export const BUNDLE = fileURLToPath(new URL("../dist/gui", import.meta.url));
|
|
31
31
|
export const VERSION: string = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version;
|
|
32
|
-
const TYPES: Record<string, string> = { ".html": "text/html; charset=utf-8", ".js": "text/javascript; charset=utf-8", ".css": "text/css; charset=utf-8", ".svg": "image/svg+xml", ".json": "application/json", ".woff2": "font/woff2" };
|
|
32
|
+
const TYPES: Record<string, string> = { ".html": "text/html; charset=utf-8", ".js": "text/javascript; charset=utf-8", ".css": "text/css; charset=utf-8", ".svg": "image/svg+xml", ".json": "application/json", ".woff2": "font/woff2", ".mp3": "audio/mpeg" };
|
|
33
33
|
const HEADERS = {
|
|
34
34
|
"cache-control": "no-store",
|
|
35
35
|
"referrer-policy": "no-referrer",
|
|
36
36
|
"x-content-type-options": "nosniff",
|
|
37
37
|
"cross-origin-opener-policy": "same-origin", // a page a document's link opens cannot steer this tab
|
|
38
|
-
"content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; frame-src 'self'; base-uri 'self'; frame-ancestors 'none'",
|
|
38
|
+
"content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; media-src 'self'; connect-src 'self'; frame-src 'self'; base-uri 'self'; frame-ancestors 'none'",
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
export interface Gui { url: string; port: number; token: string; csrf: string; access: Access; stop(): Promise<void> }
|
|
@@ -148,8 +148,8 @@ export async function startGui({ read, net, call, hub, dir = BUNDLE, port = 0, t
|
|
|
148
148
|
if (file === "index.html") return void res.writeHead(200, { ...HEADERS, "content-type": TYPES[".html"] }).end(page);
|
|
149
149
|
const body = bundle.get(file);
|
|
150
150
|
if (!body) return void fail(404);
|
|
151
|
-
// A font's name carries its content hash, so a phone keeps it instead of fetching
|
|
152
|
-
const keep =
|
|
151
|
+
// A font's or sound's name carries its content hash, so a phone keeps it instead of fetching it on every page load.
|
|
152
|
+
const keep = /\.(woff2|mp3)$/.test(file) ? { "cache-control": "private, max-age=31536000, immutable" } : {};
|
|
153
153
|
res.writeHead(200, { ...HEADERS, ...keep, "content-type": TYPES[extname(file)] ?? "application/octet-stream" }).end(body);
|
|
154
154
|
});
|
|
155
155
|
try {
|
package/src/index.ts
CHANGED
|
@@ -105,6 +105,16 @@ export function createStrawBoss({ run = herdrRun, api = herdrApi(), call = herdr
|
|
|
105
105
|
return isMain ? "main" : "member";
|
|
106
106
|
};
|
|
107
107
|
const tell = (text: string, level: "info" | "warning" | "error" = "info") => ui?.notify(text, level);
|
|
108
|
+
const promptOf = (current = role()) => (current === "member" && !mainId ? "member-no-main" : current);
|
|
109
|
+
// The role's prompt is a system prompt section, set when a run starts. A role that changes during a run (a member promoted as it
|
|
110
|
+
// dispatches a subagent, mains demoted as their tower quits) reaches the agent at its next step as a steer; an idle session gets it with its next run.
|
|
111
|
+
let briefed: Role | undefined, running = false;
|
|
112
|
+
const rebrief = () => {
|
|
113
|
+
const current = role(), name = promptOf(current);
|
|
114
|
+
if (!running || current === briefed || !name) return;
|
|
115
|
+
briefed = current;
|
|
116
|
+
pi.sendMessage({ customType: ENTRY, content: `<straw-boss>\nYour Straw Boss role changed during this run. This replaces the role instructions in your system prompt:\n\n${render(prompts[name])}\n</straw-boss>`, display: true }, { deliverAs: "steer" });
|
|
117
|
+
};
|
|
108
118
|
const render = (text = "") => text.replace(/\{\{(\w+)\}\}/g, (_, key: string) => ({ dir: promptDir, ...info })[key] || "none yet");
|
|
109
119
|
const tool = <P extends TSchema>(name: string, description: string, parameters: P, body: (params: Static<P>) => Promise<{ text: string; details?: unknown }>) =>
|
|
110
120
|
pi.registerTool({
|
|
@@ -266,7 +276,7 @@ export function createStrawBoss({ run = herdrRun, api = herdrApi(), call = herdr
|
|
|
266
276
|
info = { tab, workspace: ws?.label ?? at.workspaceId, main: nameOf(sessions.find((s) => s.id === mainId)), tower: nameOf(sessions.find((s) => s.id === ws?.tokens?.tower)) };
|
|
267
277
|
const wasMain = isMain;
|
|
268
278
|
isMain = mainId === me();
|
|
269
|
-
if (isMain !== wasMain) tell(`This session is ${isMain ? "now" : "no longer"} the main agent of ${info.tab}`);
|
|
279
|
+
if (isMain !== wasMain) (tell(`This session is ${isMain ? "now" : "no longer"} the main agent of ${info.tab}`), rebrief());
|
|
270
280
|
await publish(sessions);
|
|
271
281
|
// The workspace's first main opens the tower at once; later mains find it open.
|
|
272
282
|
if (isMain && !wasMain && autoTower) void openTower(undefined, true).catch((error: Error) => tell(`Straw Boss: could not open the tower: ${error.message}`, "warning"));
|
|
@@ -408,6 +418,16 @@ export function createStrawBoss({ run = herdrRun, api = herdrApi(), call = herdr
|
|
|
408
418
|
scope: Type.Optional(Type.Union([Type.Literal("tab"), Type.Literal("workspace"), Type.Literal("towers"), Type.Literal("all")], { description: "Default workspace." })),
|
|
409
419
|
}),
|
|
410
420
|
({ message, scope }) => broadcast(message, scope ?? "workspace"));
|
|
421
|
+
// The session's name is what the net, the GUI, and (through pi-auto-tab-name) the Herdr tab show for it. A tower keeps its own.
|
|
422
|
+
if (!isTower) tool("boss_rename", "Name this session with a short phrase for the work it is doing now, at most 16 characters (e.g. \"MP-3584 cost mask\", \"重構通知模組\"). The net and the GUI show it, and pi-auto-tab-name renames the Herdr tab after it.",
|
|
423
|
+
Type.Object({ name: Type.String({ description: "The phrase: what this session works on now, at most 16 characters so the tab label shows it whole." }) }),
|
|
424
|
+
async ({ name }) => {
|
|
425
|
+
const phrase = name.replace(/\s+/g, " ").trim();
|
|
426
|
+
if (!phrase) throw new Error("The name is empty");
|
|
427
|
+
if (Array.from(phrase).length > 40) throw new Error(`The name has ${Array.from(phrase).length} characters; keep it a short phrase (at most 16 fit the tab)`);
|
|
428
|
+
pi.setSessionName(phrase);
|
|
429
|
+
return { text: `This session is now named "${phrase}".`, details: { name: phrase } };
|
|
430
|
+
});
|
|
411
431
|
}
|
|
412
432
|
function addPromote() {
|
|
413
433
|
tool("boss_promote", "Become the main agent of this Herdr tab when your work grows: several steps, dispatching workers, or touching more than one app. Refused when the tab already has a main agent.", Type.Object({}), async () => {
|
|
@@ -528,11 +548,12 @@ export function createStrawBoss({ run = herdrRun, api = herdrApi(), call = herdr
|
|
|
528
548
|
});
|
|
529
549
|
|
|
530
550
|
pi.on("before_agent_start", (event) => {
|
|
531
|
-
const current = role();
|
|
532
|
-
const name = current === "member" && !mainId ? "member-no-main" : current;
|
|
551
|
+
const current = role(), name = promptOf(current);
|
|
533
552
|
if (name) event.systemPromptOptions.sections[ENTRY] = render(prompts[name]);
|
|
534
553
|
else delete event.systemPromptOptions.sections[ENTRY];
|
|
554
|
+
[briefed, running] = [current, true];
|
|
535
555
|
});
|
|
556
|
+
pi.on("agent_settled", () => void (running = false));
|
|
536
557
|
|
|
537
558
|
// A member that dispatches or resumes a subagent without promoting is promoted here, before the subagent starts, unless the tab already has a main.
|
|
538
559
|
// A tower only coordinates: it dispatches no subagent (one would outlive it with no one to take its result), and opens a main for the work instead.
|
|
@@ -1 +0,0 @@
|
|
|
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=pe(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(me(t)&&m.has(t)){let e=m.get(t);if(e){let t=e.getLocale();if(t instanceof Promise)continue;if(t!==void 0)return te(t)}}let e=f(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=pe(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(me(t)&&m.has(t)){let n=m.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()},ee=()=>typeof window<`u`?window.location.origin:`http://fallback.com`;function f(e){if(typeof e!=`string`)return;let n=e.toLowerCase();for(let e of t)if(e.toLowerCase()===n)return e}function te(e){let n=f(e);if(n)return n;throw Error(`Invalid locale: ${e}. Expected one of: ${t.join(`, `)}`)}function p(e){return e}function ne(t,n){return new e(t,n.href)}function re(){return 0}function ie(e){return i}function ae(e,t){return e.exec(t.href)}var oe=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${oe}=([^;]*)`);function se(e){return ce(e)}function ce(e){let t=p(typeof e==`string`?new URL(e,ee()):new URL(e.href)),n=t.pathname.replace(/^\/+/,``).split(`/`);return n.length>0&&f(n[0])&&(t.pathname=`/`+n.slice(1).join(`/`)),p(t)}var le=-1,ue,de;function fe(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=re();if(ue===t&&le===n)return de;let r=p(new URL(t,`http://example.com`)),a=se(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of ie(e))if(ae(ne(t.match,e),e)){s=t;break}if(s)break}return le=n,ue=t,de=s,s}function pe(e){let t=fe(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var m=new Map;function me(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}var he=((e={},t={})=>(t.locale??s())===`zh-TW`?`警示`:`Alerts`),ge=((e={},t={})=>(t.locale??s())===`zh-TW`?`所有基地`:`all bases`),_e=((e={},t={})=>(t.locale??s())===`zh-TW`?``:`.`),ve=((e={},t={})=>(t.locale??s())===`zh-TW`?`最後更新:`:`Last update`),ye=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,be=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,xe=((e,t={})=>(t.locale??s())===`zh-TW`?be(e):ye(e)),Se=e=>`The server is up but cannot read the net: ${e?.problem}`,Ce=e=>`伺服器正常,但讀不到網:${e?.problem}`,we=((e,t={})=>(t.locale??s())===`zh-TW`?Ce(e):Se(e)),Te=((e={},t={})=>(t.locale??s())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),Ee=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,De=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,Oe=((e,t={})=>(t.locale??s())===`zh-TW`?De(e):Ee(e)),ke=((e={},t={})=>(t.locale??s())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),Ae=((e={},t={})=>(t.locale??s())===`zh-TW`?`取消`:`Cancel`),h=((e={},t={})=>(t.locale??s())===`zh-TW`?`關閉`:`Close`),je=e=>`Close base ${e?.name}`,Me=e=>`關閉基地 ${e?.name}`,Ne=((e,t={})=>(t.locale??s())===`zh-TW`?Me(e):je(e)),Pe=e=>`Close base ${e?.name}? Every agent in it and its tower quit.`,Fe=e=>`要關閉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。`,Ie=((e,t={})=>(t.locale??s())===`zh-TW`?Fe(e):Pe(e)),Le=e=>`Close squad ${e?.name}`,Re=e=>`關閉小隊 ${e?.name}`,ze=((e,t={})=>(t.locale??s())===`zh-TW`?Re(e):Le(e)),Be=e=>`Close squad ${e?.name}? Every agent in it quits.`,Ve=e=>`要關閉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,He=((e,t={})=>(t.locale??s())===`zh-TW`?Ve(e):Be(e)),Ue=e=>`Close the tower ${e?.name}? The base's mains become members again.`,We=e=>`要關閉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Ge=((e,t={})=>(t.locale??s())===`zh-TW`?We(e):Ue(e)),Ke=e=>`Close ${e?.name}? It quits pi and its pane closes.`,qe=e=>`要關閉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Je=((e,t={})=>(t.locale??s())===`zh-TW`?qe(e):Ke(e)),Ye=e=>`control tower · ${e?.state}`,Xe=e=>`塔台 · ${e?.state}`,Ze=((e,t={})=>(t.locale??s())===`zh-TW`?Xe(e):Ye(e)),Qe=((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.`),$e=((e={},t={})=>(t.locale??s())===`zh-TW`?`文件`:`Documents`),et=((e={},t={})=>(t.locale??s())===`zh-TW`?`總塔台`:`head tower`),tt=((e={},t={})=>(t.locale??s())===`zh-TW`?`語言`:`Language`),nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`連線中`:`connecting`),rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時`:`live`),it=((e={},t={})=>(t.locale??s())===`zh-TW`?`離線`:`offline`),at=((e={},t={})=>(t.locale??s())===`zh-TW`?`重新連線中`:`reconnecting`),ot=((e={},t={})=>(t.locale??s())===`zh-TW`?`正體中文`:`English`),st=((e={},t={})=>(t.locale??s())===`zh-TW`?`位置`:`Location`),ct=e=>`${e?.name} finished`,lt=e=>`${e?.name} 已完成`,ut=((e,t={})=>(t.locale??s())===`zh-TW`?lt(e):ct(e)),dt=e=>`${e?.name} hit an error`,ft=e=>`${e?.name} 發生錯誤`,pt=((e,t={})=>(t.locale??s())===`zh-TW`?ft(e):dt(e)),mt=e=>`${e?.name} went idle`,ht=e=>`${e?.name} 轉為閒置`,gt=((e,t={})=>(t.locale??s())===`zh-TW`?ht(e):mt(e)),_t=e=>`${e?.name} joined`,vt=e=>`${e?.name} 加入`,yt=((e,t={})=>(t.locale??s())===`zh-TW`?vt(e):_t(e)),bt=e=>`${e?.name} left`,xt=e=>`${e?.name} 離開`,St=((e,t={})=>(t.locale??s())===`zh-TW`?xt(e):bt(e)),Ct=e=>`${e?.name} lost its status`,wt=e=>`${e?.name} 失去狀態`,Tt=((e,t={})=>(t.locale??s())===`zh-TW`?wt(e):Ct(e)),Et=e=>`${e?.name} is waiting on a question`,Dt=e=>`${e?.name} 正在等待回答`,Ot=((e,t={})=>(t.locale??s())===`zh-TW`?Dt(e):Et(e)),kt=e=>`${e?.name} started working`,At=e=>`${e?.name} 開始工作`,jt=((e,t={})=>(t.locale??s())===`zh-TW`?At(e):kt(e)),g=((e={},t={})=>(t.locale??s())===`zh-TW`?`已完成`:`finished`),Mt=((e={},t={})=>(t.locale??s())===`zh-TW`?`錯誤`:`error`),_=((e={},t={})=>(t.locale??s())===`zh-TW`?`閒置`:`idle`),Nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無狀態`:`no status`),v=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待回答`:`waiting on a question`),Pt=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`working`),Ft=((e={},t={})=>(t.locale??s(),`Logs`)),It=((e={},t={})=>(t.locale??s())===`zh-TW`?`從未`:`never`),Lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`+新基地`:`+ New base`),Rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),zt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無警示`:`no alerts`),Bt=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),Vt=((e={},t={})=>(t.locale??s())===`zh-TW`?`尚無塔台`:`no tower yet`),Ht=((e={},t={})=>(t.locale??s())===`zh-TW`?`思考中`:`thinking`),Ut=((e={},t={})=>(t.locale??s())===`zh-TW`?`+主智慧體`:`+ Main`),Wt=((e={},t={})=>(t.locale??s())===`zh-TW`?`+成員`:`+ Member`),Gt=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`Outposts`),Kt=((e={},t={})=>(t.locale??s())===`zh-TW`?`手機`:`Phone`),qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),Jt=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),Yt=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),Xt=e=>`Refused (${e?.status}).`,Zt=e=>`已拒絕(${e?.status})。`,Qt=((e,t={})=>(t.locale??s())===`zh-TW`?Zt(e):Xt(e)),$t=((e={},t={})=>(t.locale??s())===`zh-TW`?`主智慧體`:`main`),en=((e={},t={})=>(t.locale??s())===`zh-TW`?`成員`:`member`),tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`outpost`),nn=((e={},t={})=>(t.locale??s())===`zh-TW`?`未編入`:`unaligned`),rn=((e={},t={})=>(t.locale??s(),`session`)),an=((e={},t={})=>(t.locale??s())===`zh-TW`?`子智慧體`:`subagent`),on=((e={},t={})=>(t.locale??s())===`zh-TW`?`塔台`:`tower`),sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`智慧體`:`Agents`),cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`基地`:`Bases`),ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待中`:`Waiting`),un=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`Working`),dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`狀態`:`States`),fn=e=>`tab ${e?.label}`,pn=e=>`分頁 ${e?.label}`,mn=((e,t={})=>(t.locale??s())===`zh-TW`?pn(e):fn(e)),hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),gn=((e={},t={})=>(t.locale??s())===`zh-TW`?`網的總計`:`Net totals`),_n=e=>`${e?.label} tower`,vn=e=>`${e?.label} 塔台`,yn=((e,t={})=>(t.locale??s())===`zh-TW`?vn(e):_n(e)),bn=e=>`using ${e?.tool}`,xn=e=>`使用 ${e?.tool}`,Sn=((e,t={})=>(t.locale??s())===`zh-TW`?xn(e):bn(e)),Cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待變化…`:`Waiting for changes…`),wn=`sb-locale`;function Tn(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 f(e)??(t?f(t):void 0)??f(e.split(`-`)[0])}function En(e,t){return f(e)??t.map(Tn).find(Boolean)??`en`}var Dn={brand_label:ke,tagline:hn,totals_label:gn,stat_bases:cn,stat_agents:sn,stat_working:un,stat_waiting:ln,alerts:he,no_alerts:zt,pair_button:Kt,pair_title:qt,link_connecting:nt,location:st,all_bases:ge,documents:$e,net_log:Ft,states:dn,mark_working:Pt,mark_waiting:v,mark_idle:_,mark_done:g,mark_error:Mt,credit:Qe,language:tt,waiting_changes:Cn,new_base:Lt};Object.keys(Dn);function On(){let e=null;try{e=localStorage.getItem(wn)}catch{}let n=En(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,Dn[e.dataset[t]]?.()??e.dataset[t]);let i=document.getElementById(`lang`);i.replaceChildren(...t.map(e=>new Option(ot({},{locale:e}),e,!1,e===n))),i.onchange=()=>{try{localStorage.setItem(wn,i.value),location.reload()}catch{i.value=n}}}var kn={working:jt,waiting:Ot,idle:gt,done:ut,error:pt,unknown:Tt};function An(e){let t=new Map;for(let n of e.bases){n.tower&&t.set(`tower:${n.id}`,{name:yn({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 jn(e,t){if(!e)return[];let[n,r]=[An(e),An(t)],i=[];for(let[e,t]of r){let r=n.get(e);r?r.mark!==t.mark&&i.push({text:kn[t.mark]({name:t.name}),mark:t.mark}):i.push({text:yt({name:t.name}),mark:t.mark})}for(let[e,t]of n)r.has(e)||i.push({text:St({name:t.name}),mark:`idle`});return i}var Mn=e=>e===`waiting`||e===`error`?0:1;function Nn(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});return n}function Pn(e,t){return[...t.values()].filter(t=>e?.get(t.key)?.mark!==t.mark&&(Mn(t.mark)===0||e!==void 0&&t.mark===`done`))}var Fn=e=>{try{return decodeURIComponent(e)}catch{return e}},In=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function y(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(Fn);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 b=e=>e.view===`map`?``:e.view===`workspace`?`w/${In(e.ws)}`:`w/${In(e.ws)}/s/${In(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,Ln=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},x=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null;function Rn(e,t=new URL(document.baseURI).pathname){let n=()=>y(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>b(e)||`./`,go(n){let r=t+b(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(y(t.getAttribute(`data-route`))))}),r}var zn={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},S={working:Pt,waiting:v,idle:_,done:g,error:Mt,unknown:Nt},Bn={main:$t,member:en,subagent:an,tower:on,outpost:tn,outside:nn,session:rn},Vn={thinking:Ht,idle:_,"waiting on a question":v,finished:g},Hn=e=>Object.hasOwn(Bn,e)?Bn[e]():e,Un=e=>e===`waiting`||e===`error`,C=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)},w=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},T=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},E=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&(e.classList.remove(`flash`),e.offsetWidth,e.classList.add(`flash`))},Wn=(e,t)=>e?e.startsWith(`tool:`)?Sn({tool:e.slice(5)}):Object.hasOwn(Vn,e)?Vn[e]():e:S[t](),D=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,b(t)||`./`),e.setAttribute(`data-route`,b(t)))},Gn=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function Kn(e,t,n,r){E(e,n);let i=e.querySelector(`use`),a=`#i-${zn[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 O(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 k=()=>C(`<div class="unit"><div class="card"><a class="hit"></a>${Gn}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></div></div><div class="subs"></div></div>`);function A(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);D(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${Wn(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,Un(t.mark)),E(e,t.mark),Kn(e.querySelector(`.plate`),t.role,t.mark,t.docs),T(e,`.name`,t.name),T(e,`.role`,Hn(t.role)),T(e,`.note`,Wn(t.note,t.mark)),O(e.querySelector(`.subs`),t.subs??[],k,A)}function j(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`?Ut():Wt())&&(e.textContent=r===`main`?Ut():Wt())}function M(e,t,n){e.dataset.ws=t.id,e.dataset.name=n?n.label:t.label,n&&(e.dataset.tab=n.id),e.setAttribute(`aria-label`,n?ze({name:n.label}):Ne({name:t.label}))}var qn=()=>C(`<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>${et()}</span><h2><a class="enter-base"></a></h2><p></p></div><button type="button" class="close-x" 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="${Gt()}"></div></section>`);function Jn(e,t){E(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),E(n,t.tower?.mark??`unknown`),T(e,`h2 a`,t.label),D(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),T(e,`.title p`,t.tower?Ze({state:S[t.tower.mark]()}):Vt()),j(e.querySelector(`.spawn-btns button`),t),M(e.querySelector(`header .close-x`),t),O(e.querySelector(`.tabs`),t.tabs,()=>C(`<div class="tab"><h3><span></span><button type="button" class="tab-add"></button><button type="button" class="close-x" data-close="tab">×</button></h3><div class="units"></div></div>`),(e,n)=>{T(e,`h3 span`,mn({label:n.label})),M(e.querySelector(`.close-x`),t,n),j(e.querySelector(`.tab-add`),t,n.id),O(e.querySelector(`.units`),n.units,k,A)}),O(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?Rt():void 0})),k,A)}function Yn(e,t,n){let r=[...e.querySelectorAll(`.base:not(.leaving) .tower`)],i=e.querySelector(`.base.head:not(.leaving) .tower`),a=e.getBoundingClientRect(),o=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-a.x),Math.round(t.y+t.height/2-a.y)]},s=i?r.filter(e=>e!==i).map(e=>{let[[t,n],[r,a]]=[o(i),o(e)],s=Math.round((t+r)/2);return`M${t} ${n}C${s} ${n} ${s} ${a} ${r} ${a}`}):[],c=s.join(`|`);if(t.dataset.sig===c)return;t.dataset.sig=c;let l=(e,t,...n)=>{let r=document.createElementNS(`http://www.w3.org/2000/svg`,e);for(let[e,n]of Object.entries(t))r.setAttribute(e,n);return r.append(...n),r};t.replaceChildren(...s.flatMap(e=>[l(`path`,{class:`wire`,d:e}),...n?[]:[l(`circle`,{class:`packet`,r:`3`},l(`animateMotion`,{dur:`5s`,repeatCount:`indefinite`,path:e}))]]))}function Xn(){let[e,t,n,r]=[w(`map`,HTMLElement),w(`bases`,HTMLElement),w(`links`,SVGSVGElement),w(`log`,HTMLElement)],i=matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=()=>!e.hidden&&Yn(e,n,i);return new ResizeObserver(a).observe(e),{layout:a,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`)]])w(t,HTMLElement).textContent=r},show(e){O(t,e.bases,qn,Jn),requestAnimationFrame(a)},log(e){let t=new Date().toLocaleTimeString([],{hour12:!1});for(let n of e){let e=C(`<li><span></span><time></time></li>`);e.dataset.mark=n.mark,T(e,`span`,n.text),T(e,`time`,t),r.prepend(e)}for(;r.children.length>12;)r.lastElementChild.remove()},pause(e){document.documentElement.classList.toggle(`paused`,e)},still(e){e?n.pauseAnimations():n.unpauseAnimations()}}}var Zn=45e3,Qn=1e3,$n=3e4,er=(e,t)=>Math.min($n,Qn*2**(e-1))*(.8+.4*t);function tr(e){try{return JSON.parse(e)}catch{return}}function nr(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(),Zn),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,er(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=tr(r);i&&e.onNet(i),o({problem:i?void 0:Jt()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:tr(e)??Yt()}),l())}),r=e.setTimeout(()=>u(),Zn)};return{start(){o({state:`connecting`,attempt:0}),d()},resume(){let n=e.now()-i<2e3||a.lastContact!==void 0&&e.now()-a.lastContact<=2e4;t&&n||(o({attempt:0,state:a.state===`live`?`reconnecting`:a.state}),d())},restart:d,hide(){e.clearTimeout(n),n=void 0},stop(){c(),s()}}}var rr=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),ir=function(e,t){return new URL(e,t).href},ar={},or=function(e){return e.pathname.endsWith(`.css`)},sr=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},N=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=ir(t,n);let r=s(t),i=or(r);return sr(ar,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`:rr,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)})};On();var P=Xn(),F=e=>document.getElementById(e),cr=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):It(),lr,ur,I,L,R={state:`connecting`,attempt:0},z={view:`map`},dr=!1,B,fr=``,V,pr,H=e=>V?e(V):void pr?.then(e);function mr(){pr??=N(async()=>{let{mountFocus:e}=await import(`./views-CZLZBkEo.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(V=e({data:Tr,restart:()=>Q.restart(),openTile:G,embedTerminal:(e,t,n)=>new Promise(r=>W(i=>r(i.terminal.embed(e,t,n)))),online:()=>R.state===`live`}),V.show(z,z),I&&V.net(I),V))}var U,hr,W=e=>{if(U)return e(U);hr??=N(async()=>{let{mountPanels:e}=await import(`./layer-BNbiWPRd.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>U=e({label:e=>I?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(X?X.data(e).latest():Y(e,`?limit=12`))).items,post:e=>X&&((t,n)=>X.data(e).post(t,n)),stream:()=>fr,showTerminal:(e,t)=>(U?.stack.close(),V?.terminal(t),Z.go({view:`session`,ws:e,key:t}))})),hr.then(e)},G=(e,t)=>W(n=>n.tiles.open(e,t)),K=document.querySelector(`link[rel="icon"]`),q=K&&decodeURIComponent(K.href.slice(K.href.indexOf(`,`)+1)),gr=0;function _r(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(!K||!q||t===gr)return;gr=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>`;K.href=`data:image/svg+xml,${encodeURIComponent(t?q.replace(`</svg>`,`${n}</svg>`):q)}`}function J(e){if(I=L=e,_r(e),document.hidden)return;P.stats(e);let t=Nn(e,Date.now()),n=Pn(B,t);(n.length||U)&&W(e=>e.alerts(n,t)),B=t,P.log(jn(ur,e)),ur=e,H(t=>t.net(e)),z.view===`map`&&(P.show(e),lr=e,L=void 0)}function vr(e){let t=z,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;z=e,e.view!==`map`&&mr(),F(`map`).hidden=e.view!==`map`,F(`legend`).hidden=e.view===`session`,P.still(e.view!==`map`),H(r=>r.show(e,t,n)),e.view===`map`&&I&&I!==lr&&(J(I),requestAnimationFrame(P.layout)),dr&&x(e)!==x(t)&&Q.restart()}function yr(e){R=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=F(`stage`).dataset.stale=String(t),F(`link`).dataset.state=e.state,F(`link-text`).textContent={connecting:nt,live:rt,reconnecting:at,offline:it}[e.state](),V&&I&&V.net(I),U?.stack.redraw();let n=F(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?xe({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?Oe({attempt:e.attempt}):Te():we({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=cr(e.lastContact),n.replaceChildren(`${r} ${ve()} `,i,_e())}function br(e,t){try{let n=JSON.parse(t);H(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var xr=document.querySelector(`meta[name="sb-build"]`)?.content,Sr=e=>!!(xr&&xr!==JSON.parse(e).build);function Cr(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 wr=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),Y=(e,t=``)=>wr(`history/${encodeURIComponent(e)}${t}`),X=void 0,Tr=e=>({older:t=>Y(e,`?before=${encodeURIComponent(t)}`),latest:()=>Y(e),entry:t=>wr(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),Er=()=>{let e=Cr(x(z));return e.listen(`history`,e=>br(`history`,e)),e.listen(`cards`,e=>br(`cards`,e)),e.listen(`hello`,e=>Sr(e)?location.reload():(fr=e,U?.terminal.hello())),e.listen(`mirror`,e=>U?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&y(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=B?.get(n.key);r&&(e.preventDefault(),W(e=>e.stack.show(r)))},!0);var Z=Rn(e=>vr(e)),Q=nr({open:Er,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:J,onStatus:yr}),Dr=()=>Q.resume();document.addEventListener(`visibilitychange`,()=>{if(P.pause(document.hidden),document.hidden)return Q.hide();L&&J(L),H(e=>e.wake()),Dr()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open]`)||(e.preventDefault(),!U?.stack.close()&&z.view!==`map`&&Z.go(Ln(z)))}),F(`pair`).addEventListener(`click`,()=>void N(async()=>{let{pairTile:e}=await import(`./pair-BH6gsBf3.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>G(e(),!0)));var $=(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(Ae(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(h(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()}),Or=e=>{if(z.view===`map`)return;if(e.close===`base`)return void(z.ws===e.ws&&Z.go({view:`map`}));let t=e=>e.flatMap(e=>[e.key,...t(e.subs)]),n=e.close===`tab`&&z.ws===e.ws?I?.bases.find(t=>t.id===e.ws)?.tabs.find(t=>t.id===e.tab):void 0;z.view===`session`&&(e.close===`unit`?z.key===e.key:n&&t(n.units).includes(z.key))&&Z.go({view:`workspace`,ws:z.ws})};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-close]`),n=t?.dataset;t&&n&&(e.preventDefault(),$((n.close===`base`?Ie:n.close===`tab`?He:n.role===`tower`?Ge:Je)({name:n.name??``}),h()).then(e=>{e&&(t.toggleAttribute(`disabled`,!0),N(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/${n.close}`,n.close===`unit`?{key:n.key}:{workspace:n.ws,...n.tab&&{tab:n.tab}})).then(e=>e.ok?Or(n):$(e.body.reason??Qt({status:e.status})),()=>$(Bt())).finally(()=>t.toggleAttribute(`disabled`,!1)))}))}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&N(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-CDkaGY6G.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,I?.bases??[]);r&&G(n(r),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&Dr());yr(R),vr(Z.route()),Q.start(),dr=!0;export{Ae as A,Bt as C,$e as D,et as E,s as M,Ze as O,Vt as S,Rt as T,Mn as _,D as a,Qt as b,w as c,C as d,E as f,Un as g,T as h,Gn as i,ge as j,h as k,Wn as l,O as m,zn as n,M as o,Hn as p,S as r,j as s,N as t,Kn as u,un as v,zt as w,Gt as x,ln as y};
|
|
@@ -1 +0,0 @@
|
|
|
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;align-items:center;gap: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;font-size:20px}.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}.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{align-items:center;gap:8px;display:flex}.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}.close-x{color:var(--dim);font:600 16px/1.4 var(--sans);cursor:pointer;background:0 0;border:0;border-radius:8px;margin-left:6px;padding:0 7px}.close-x:hover{color:#ff8a9c}.base>header .close-x,.zoom-in header .close-x{align-self:flex-start;margin-left:auto}.d-close:hover{color:#ff8a9c}.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{gap:4px;display:flex}.modes[hidden]{display:none}.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}.lightbox button[hidden]{display:none}.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{display:none}.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[hidden]{display:none}.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}.packet{fill:#38e0ff;opacity:.9}.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}.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;margin-bottom:8px;font-size:11px;font-weight:600}.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}@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 out{to{opacity:0;transform:scale(.94)}}@keyframes flash{40%{transform:scale(1.12)}}@keyframes slide{0%{opacity:0;transform:translate(10px)}}@keyframes zoom{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}[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}.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)}.base>header{position:relative}.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}.modes{flex:none}.modes+.chan{margin-left:12px}.head-close{flex:none;margin-left:4px;font-size:20px}.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-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}.composer{border-top:1px solid var(--line);background:var(--panel);gap:8px;padding:12px 18px 14px;display:grid}.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}.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}.composer{position:relative}.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 90px;min-width:0}.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}.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{margin-top:8px}.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}.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}.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-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}.d-close{margin-top:12px;font-size:13px}.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}@media (width<=640px){.pad-key,.pad-yes{min-height:44px}.pad-digits summary{padding:14px 0}}.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}.alerts{flex:100%;order:3;width:auto}.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%}.comms-in,.tile{height:calc(var(--vvh,100dvh) - 16px);border-radius:16px;min-height:300px}.chat-scroll{padding:12px}.comms-head{grid-template-columns:auto minmax(0,1fr) auto auto;gap:8px 10px;padding:10px 12px;display:grid}.comms-head .logo{border-radius:11px;width:36px;height:36px}.comms-head .logo svg{width:22px;height:22px}.comms-head h2 small,.chan b{display:none}.modes+.chan{margin-left:0}.head-close{border:1px solid var(--line);border-radius:12px;min-width:40px;min-height:40px;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}.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}.bubble{max-width:92%}.composer{padding:10px 12px calc(10px + env(safe-area-inset-bottom))}.cmp-row{flex-wrap:wrap}.composer textarea{flex:100%;min-height:64px}.cmp-acts{margin-left:auto}.log{max-height:none}.log li:nth-child(n+3){display:none}.dock{top:auto;right:10px;bottom:calc(10px + env(safe-area-inset-bottom));width:calc(100vw - 20px)}}@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,.d-close,.d-doc{min-height:40px}.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}}
|