pi-straw-boss 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.zh-TW.md +18 -1
- package/dist/gui/assets/{ask-CAlgsVra.js → ask-D3XwBKrA.js} +1 -1
- package/dist/gui/assets/chat-KJ5OJZrs.js +2 -0
- package/dist/gui/assets/index-BeicptWN.css +1 -0
- package/dist/gui/assets/index-D1R15Bje.js +1 -0
- package/dist/gui/assets/{layer-BVDCWy-f.js → layer-B9ha3rOi.js} +1 -1
- package/dist/gui/assets/lightbox-CPgw_w-O.js +1 -0
- package/dist/gui/assets/{pair-CV8iexz_.js → pair-D1PRxtSn.js} +1 -1
- package/dist/gui/assets/{spawn-Dm9G4Tc4.js → spawn-DsaEsxYP.js} +1 -1
- package/dist/gui/assets/views-D-p29s2P.js +8 -0
- package/dist/gui/index.html +2 -2
- package/package.json +1 -1
- package/src/ask.ts +4 -2
- package/src/bridge.ts +34 -3
- package/src/dialogs.ts +8 -5
- package/src/gui.ts +9 -4
- package/src/index.ts +1 -1
- package/src/net.ts +4 -2
- package/src/watch.ts +16 -0
- package/dist/gui/assets/chat-DD_Z_8cn.js +0 -1
- package/dist/gui/assets/index-BVodxW0J.js +0 -1
- package/dist/gui/assets/index-D1GkSIRb.css +0 -1
- package/dist/gui/assets/views-C4HEP3AY.js +0 -8
package/README.zh-TW.md
CHANGED
|
@@ -30,7 +30,24 @@
|
|
|
30
30
|
pi install npm:pi-straw-boss
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
### 需求
|
|
34
|
+
|
|
35
|
+
- pi 要跑在 [Herdr](https://herdr.dev) 0.9.4 以上。
|
|
36
|
+
- [pi-intercom](https://www.npmjs.com/package/pi-intercom) 0.17.1 以上:網的頻道、訊息,以及 GUI 轉送對話框,都是透過它。
|
|
37
|
+
|
|
38
|
+
### 支援的套件
|
|
39
|
+
|
|
40
|
+
下面的套件都可裝可不裝。裝了,Straw Boss 會自動接上;沒裝,其他功能照常運作。
|
|
41
|
+
|
|
42
|
+
| 套件 | Straw Boss 怎麼用它 |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| [pi-herdr-agents](https://github.com/giuseppecrj/pi-herdr-agents) | 子智慧體會顯示在開出它的 session 底下,塔台面板、側邊欄和 GUI 都看得到;成員派出子智慧體時,會升格成主智慧體,塔台也會跟著開。 |
|
|
45
|
+
| [@juicesharp/rpiv-ask-user-question](https://www.npmjs.com/package/@juicesharp/rpiv-ask-user-question) 2.13 以上 | `ask_user_question` 問卷可以在 GUI 作答,等待作答的問卷也會讓該單位顯示為等待中。 |
|
|
46
|
+
| [pi-robot-hand](https://www.npmjs.com/package/pi-robot-hand) 0.3.0 以上 | `robot_hand` 選單可以在 GUI 作答。 |
|
|
47
|
+
| [pi-herdr-doc-review](https://www.npmjs.com/package/pi-herdr-doc-review) 0.4.0 以上 | session 展示的文件會開在它的通訊畫面旁邊:HTML 放在沙箱框架裡,表單送出的內容會回給 agent;文字檔只能讀。 |
|
|
48
|
+
| [@juicesharp/rpiv-todo](https://www.npmjs.com/package/@juicesharp/rpiv-todo) 2.13 以上 | session 的待辦清單會顯示在 GUI 的輸入框上方,內容從 session 檔讀取。 |
|
|
49
|
+
|
|
50
|
+
其他對話框(任何 extension 的 `select`、`confirm`、`input`、`editor`,以及 pi-ask-user 的 `ask_user`)在 GUI 裡只能看,可以一鍵切到終端機回答。
|
|
34
51
|
|
|
35
52
|
## 快速開始
|
|
36
53
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as e,b as t}from"./index-
|
|
1
|
+
import{M as e,b as t}from"./index-D1R15Bje.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};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-BeicptWN.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{M as e,d as t,n,t as r}from"./index-D1R15Bje.js";import{t as i}from"./dom-BaTXH9WU.js";import{n as a,t as o}from"./views-D-p29s2P.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-CPgw_w-O.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};
|
|
@@ -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}.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-term{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-term,.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={},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-D-p29s2P.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-B9ha3rOi.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-D1PRxtSn.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-DsaEsxYP.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,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./post-UHMNmNgA.js";import{i as t,n,t as r}from"./ask-CAlgsVra.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-BVodxW0J.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-D3XwBKrA.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-D1R15Bje.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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{M as e,k as t}from"./index-D1R15Bje.js";import{t as n}from"./dom-BaTXH9WU.js";import{t as r}from"./chat-KJ5OJZrs.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-D1R15Bje.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-D1R15Bje.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};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-BeicptWN.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-D3XwBKrA.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 D,s as O,t as ee,u as k,v as A,x as j,y as M}from"./index-D1R15Bje.js";import{t as N}from"./dom-BaTXH9WU.js";var P=((e={},t={})=>(t.locale??u())===`zh-TW`?`附加檔案`:`Attach files`),F=((e={},t={})=>(t.locale??u())===`zh-TW`?`它在等待對話框:請在上方或它的終端機中回答。`:`It waits on a dialog: answer it above, or in its terminal.`),I=((e={},t={})=>(t.locale??u())===`zh-TW`?`它在等待對話框;請在它的終端機中回答。`:`It waits on a dialog; answer it in its terminal.`),L=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個 session 已不再即時;紀錄仍可閱讀。`:`This session is no longer live; its history stays readable.`),R=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個單位沒有即時的 pi 窗格,無處可輸入。`:`No live pi pane backs this unit, so there is nothing to type into.`),z=((e={},t={})=>(t.locale??u())===`zh-TW`?`串流中斷;要等它恢復才能送出。`:`The stream is down; sending waits for it to come back.`),te=((e={},t={})=>(t.locale??u())===`zh-TW`?`頻道關閉`:`channel closed`),ne=((e={},t={})=>(t.locale??u())===`zh-TW`?`頻道開啟`:`channel open`),B=e=>`Close ${e?.name}`,re=e=>`關閉 ${e?.name}`,ie=((e,t={})=>(t.locale??u())===`zh-TW`?re(e):B(e)),ae=((e={},t={})=>(t.locale??u())===`zh-TW`?`指令`:`Commands`),V=((e={},t={})=>(t.locale??u())===`zh-TW`?`通訊`:`comms`),H=((e={},t={})=>(t.locale??u())===`zh-TW`?`已派出`:`Dispatched`),U=((e={},t={})=>(t.locale??u())===`zh-TW`?`無法取得:已不在它的 session 中開啟。`:`Unavailable: no longer open in its session.`),oe=((e={},t={})=>(t.locale??u())===`zh-TW`?`已不在清單中:已在它的 session 中關閉,或 session 已結束。`:`No longer listed: closed in its session, or the session ended.`),W=((e={},t={})=>(t.locale??u())===`zh-TW`?`已更新:此區塊顯示時會載入新版本。`:`Updated: the new version loads when this tile shows.`),se=((e={},t={})=>(t.locale??u())===`zh-TW`?`超過轉送上限:請在終端機中閱讀。`:`More than the relay carries: read them in the terminal.`),ce=e=>`${e?.command} ends this session or switches its pane to another one.`,G=e=>`${e?.command} 會結束這個 session,或把它的窗格切換到別的 session。`,K=((e,t={})=>(t.locale??u())===`zh-TW`?G(e):ce(e)),q=e=>{let t=n(`en`,e?.count,{},!0);return t===`one`?`${e?.count} entry`:t===`other`?`${e?.count} entries`:`entry_count`},J=e=>`${e?.count} 筆`,le=((e,t={})=>(t.locale??u())===`zh-TW`?J(e):q(e)),ue=e=>`${e?.name} is larger than 20 MB.`,de=e=>`${e?.name} 超過 20 MB。`,fe=((e,t={})=>(t.locale??u())===`zh-TW`?de(e):ue(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
|
+
`).split(`
|
|
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
|
+
`)],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
|
+
`),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
|
+
`),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=N(`ul`,{class:`slash`,id:`slash`,role:`listbox`,"aria-label":ae()}),r=[],i=0,a;e.setAttribute(`aria-controls`,`slash`);let o=()=>!n.hidden&&r.length>0,s=()=>(r=[],n.hidden=!0,e.removeAttribute(`aria-activedescendant`)),c=()=>{n.replaceChildren(...r.map((e,t)=>{let n=N(`li`,{id:`slash-${t}`,role:`option`,"aria-selected":String(t===i)},N(`b`,null,`/${e.name}`),e.description&&N(`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 z();if(!e.live)return L();if(!e.control)return R();if(e.mark===`waiting`)return e.answerable?F():I()}function Gt(t,n,r,a=t=>e(`sessions/${encodeURIComponent(n)}/upload`,t)){let c=`sb-draft:${n}`,l=matchMedia(`(pointer: coarse)`).matches,u=N(`textarea`,{rows:`1`,maxlength:String(Lt),"aria-label":ge(),enterkeyhint:l?`enter`:`send`}),d=N(`button`,{type:`submit`,class:`cmp-send`},Ie()),f=N(`button`,{type:`button`,class:`cmp-alt`},pe()),p=N(`button`,{type:`button`,class:`cmp-alt cmp-stop`},tt()),m=N(`input`,{type:`file`,multiple:``,hidden:``}),g=N(`button`,{type:`button`,class:`cmp-alt`,"aria-label":P()},`+`),_=N(`p`,{class:`cmp-note`,role:`status`,"aria-live":`polite`}),v=It(u,e=>r(`commands`,{prefix:e})),y=N(`form`,{class:`composer`},v,N(`div`,{class:`cmp-row`},g,m,u,N(`div`,{class:`cmp-acts`},d,f,p)),N(`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)),D=(e,t,n)=>{let r=N(`button`,{type:`button`,class:`cmp-yes`},t),i=N(`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()},[O,ee]=[`${c}:note`,()=>{try{return sessionStorage.getItem(c)??``}catch{return}}],k=e=>C(()=>e?sessionStorage.setItem(O,JSON.stringify(e)):sessionStorage.removeItem(O));function A(e,t,i){let a={sent:i,answer:r(e,t)};return i!==void 0&&(k([`error`,bt()]),Z.set(n,a),a.answer.then(e=>{let t=ee();e.ok&&t!==void 0&&C(()=>sessionStorage.setItem(c,Ut(t,i))),k(Bt(e,t,i))},()=>k([`error`,bt()]))),j(a)}async function j(e,{sent:t}=e){x=!0,S=!1,F(),E(t===void 0?``:i());try{let n=await e.answer;if(!y.isConnected)return;if(!n.ok)return n.status===504||k(),E(n.body.reason??h({status:n.status}),`error`);if(t===void 0)return E(``);k();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,F()}}function M(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 D(K({command:a}),ze({command:a}),()=>M(e,n));A(`input`,{text:n,as:e,confirmed:i},n)}function F(){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=x}async function I(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(),F(),u.focus()}g.onclick=()=>m.click(),m.onchange=()=>void I([...m.files??[]]).finally(()=>m.value=``),u.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.files??[]];t.length&&(e.preventDefault(),I(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(),I(t))}),y.addEventListener(`submit`,e=>(e.preventDefault(),M(`send`))),f.onclick=()=>M(`followUp`),p.onclick=()=>D(nt(),tt(),()=>void(x||A(`keys`,{keys:[`esc`]}))),u.addEventListener(`input`,()=>(w(),T(),F())),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(),M(e.altKey?`followUp`:`send`))});let L=window.visualViewport,R=()=>document.documentElement.style.setProperty(`--vvh`,`${L.height}px`);return L&&(L.addEventListener(`resize`,R),R()),T(),Z.has(n)?j(Z.get(n)):C(()=>{let e=Vt(sessionStorage.getItem(O));sessionStorage.removeItem(O),e&&E(e[1],e[0])}),{box:u,update:e=>(b=e,F()),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?N(`div`,{class:`md`},Nt(Mt(t.text))):N(`pre`,{class:`doc-pre`},t.text)):Qt(e,U())),()=>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`?N(`iframe`,{class:`doc-frame`,sandbox:Kt,referrerpolicy:`no-referrer`,title:Ue({display:t.display,unit:e})}):void 0,a=N(`button`,{type:`button`,class:`cmp-link`},Fe()),o=i&&N(`a`,{class:`cmp-link`,href:$t(t.cap),target:`_blank`,rel:`noopener noreferrer`},Ee()),s=i??N(`div`,{class:`doc-text`},N(`p`,{class:`chat-empty`},me())),c=N(`span`,{class:`term-state`,role:`status`}),l=N(`em`,{class:`doc-off`},Se()),u=N(`div`,{class:`doc-tile`},N(`div`,{class:`term-bar doc-bar`},N(`span`,{class:`doc-why`},t.reason),l,c,N(`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,oe(),`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,W()))}}function an(e,t,n,r){e.hidden=!t?.length&&!n,e.querySelector(`.d-doc-list`).replaceChildren(...(t??[]).map(e=>{let t=N(`button`,{type:`button`,class:`d-doc`,title:e.reason},N(`b`,null,e.display),N(`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),k(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>${A()}</dt><dd></dd></div><div data-mark="waiting"><dt>${M()}</dt><dd></dd></div></dl></header><div class="spawn-btns"><button type="button" class="pair-btn"></button></div><div class="squads"></div><div class="camps"><section class="tab squad camp" data-group="outposts"><h3><svg><use href="#i-outpost"/></svg><b>${j()}</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-term" type="button" hidden>${ot()}</button><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>${se()}</p></div><div class="d-drones" hidden><h4>${H()}</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>${V()}</small> <span></span></h2><p></p></div><div class="modes" role="group"><button type="button" data-mode="chat" aria-pressed="true">${V()}</button><button type="button" data-mode="term" aria-pressed="false">${ot()}</button></div><span class="chan link" data-state="live"><i></i><b>${ne()}</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,A=[],j=!1,M=new Map,N,P,F,I=0,L,R,z=()=>u.view===`map`?``:u.ws,B=(e,t)=>{let n=document.createElement(`a`);return m(n,e),n.textContent=t,n};function re(){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??N?.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 ae(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 V(){s.firstElementChild||s.append(g(un()));let e=s.firstElementChild,t=h?.bases.find(e=>e.id===z()),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),O(e.querySelector(`.spawn-btns button`),t),T(e.querySelector(`header .close-x`),t),y(e,`.title p`,t.tower?d({state:D[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})),O(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 H(){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),k(e.querySelector(`.plate`),r?.role??N?.role??`member`,a),y(e,`h3`,r?.name??N?.name??u.key),y(e,`.role`,E(r?.role??N?.role??`session`)),y(e,`.state`,r?C(r.note,a):ye());let o=e.querySelector(`.d-note`),s=N?.state;o.hidden=s!==`recent`&&s!==`unknown`,o.replaceChildren(s===`unknown`?xe():be()),N?.successor&&o.append(` ${rt()} `,B({view:`session`,ws:z(),key:N.successor},$(h,N.successor)?.u.name??_e()));let d=[[Je(),P],[Ge(),F?pt({count:F.toLocaleString()}):void 0],[Ke(),N?.header?.cwd],[We(),t&&B({view:`workspace`,ws:t.base.id},t.base.label)],[Ye(),t?.squad],[qe(),t?.launcher&&B({view:`session`,ws:t.base.id,key:t.launcher.key},t.launcher.name)],[Xe(),N?.unreadable?le({count:N.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=e.querySelector(`.d-term`),p=u.key,m=r?.name??N?.name??p;[f.hidden,f.onclick]=[!r?.control,()=>J(`term`)],c.querySelector(`.modes`)?.toggleAttribute(`hidden`,!r?.control);let b=e.querySelector(`.d-close`);Object.assign(b.dataset,{key:p,name:m,role:r?.role??``}),b.hidden=!r?.control||r.role===`subagent`,an(e.querySelector(`.d-docs`),r?.docs,r?.docsCut,e=>n(tn(m,e))),S?.docs();let x=e.querySelector(`.d-drones`);x.hidden=!r?.subs.length,w(x.querySelector(`.formation`),(r?.subs??[]).map(e=>({...e,id:e.key})),sn,(e,t)=>(e.classList.add(`drone`),cn(e,t,z())));let T=c.querySelector(`.comms-head`);if(T){y(T,`h2 span`,r?.name??N?.name??``),y(T,`p`,[t?.base.label,t?.squad&&$e({label:t.squad})].filter(Boolean).join(` · `));let e=T.querySelector(`.chan`),n=s===`live`||!s&&r;e.dataset.state=n?`live`:`closed`,y(e,`b`,n?ne():s===`recent`?te():ve()),e.title=e.querySelector(`b`).textContent??``;let i=T.querySelector(`.head-close`),a=r?.name??N?.name??u.key;Object.assign(i.dataset,{key:u.key,name:a,role:r?.role??``}),i.setAttribute(`aria-label`,ie({name:a})),i.hidden=!r?.control||r.role===`subagent`}ce(N?.todos),se(r?.queued),S?.setLive(a===`working`?`${C(r.note,a)}`:v(a)?D[a]():``,a),L?.update({name:r?.name??N?.name??u.key,control:!!r?.control,live:s?s===`live`:!!r,mark:a,online:i(),answerable:!!r?.pending?.answer}),R?.update(r?.pending,a===`waiting`&&!!r?.control&&i())}let U=()=>setTimeout(()=>u.view===`session`&&(document.activeElement??document.body)===document.body&&(matchMedia(`(pointer: fine)`).matches&&L?.ready()?L.box:S?.log)?.focus({preventScroll:!0}));async function oe(t){let r=++I,{mountChat:i}=await ee(async()=>{let{mountChat:e}=await import(`./chat-KJ5OJZrs.js`);return{mountChat:e}},__vite__mapDeps([0]),import.meta.url);if(r!==I||u.view!==`session`)return;c.replaceChildren(g(fn()));let o=()=>$(h,t)?.u??{key:t,name:N?.name??t,role:N?.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&&B({view:`session`,ws:$(h,n.key)?.base.id??z(),key:n.key},e)},docFor:(e,r=Xt($(h,t)?.u.docs,N?.header?.cwd,e))=>r&&(()=>n(tn(o().name,r)))});let s=e(t).post??zt(t);[L,R]=[Gt(c.querySelector(`.composer-root`),t,s),a(c.querySelector(`.ask-root`),s,void 0,()=>J(`term`))],c.querySelectorAll(`.modes button`).forEach(e=>e.onclick=()=>J(e.dataset.mode)),K===`term`&&J(`term`),K=void 0,S.reveal(u.at),A.splice(0).forEach(W),H(),U()}function W(e){S?.apply(e);for(let t of e.items??[])t.kind===`assistant`&&([P,F]=[t.model??P,t.ctx??F])}function se(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 ce(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 G,K,q=0;function J(e){if(u.view!==`session`)return;let t=u.key,n=c.querySelector(`.comms-in`);if(!n)return void(K=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`),G?.(),G=void 0,e!==`term`)return U();let a=++q;r(t,$(h,t)?.u.name??N?.name??t,i).then(e=>a===q&&u.view===`session`&&u.key===t?G=e:e())}let ue=()=>(q++,G?.(),G=void 0),de=()=>(re(),u.view===`workspace`?V():H());return{terminal(e){u.view===`session`&&u.key===e?J(`term`):K=`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)&&ue(),e.view===`session`&&e.key!==r?([S,L,R,N,P,F,A,j]=[void 0,void 0,void 0,void 0,void 0,void 0,[],!1],c.replaceChildren(g(`<p class="lost">${De()}</p>`)),oe(e.key)):e.view===`session`&&e.at!==i?(S?.reveal(e.at),U()):e.view!==`session`&&(I++,S=L=R=void 0),de(),e!==t&&ae(e,t,n)},net(e){h=e,nn(e,M,u.view===`session`?u.key:void 0,(e,t)=>n(tn(e,t),!1)),u.view!==`map`&&de()},cards(e){b={...b,...e},u.view===`workspace`&&V()},history(e){if(u.view===`session`&&e.key===u.key){if(N={...N,...e,items:void 0},e.reset&&([P,F]=[void 0,void 0]),document.hidden)return A.length<on?void A.push(e):void(j=!0);S?W(e):A.push(e),H()}},wake(){if(j)return j=!1,A=[],t();A.splice(0).forEach(e=>S&&W(e)),de()}}}export{pn as mountFocus,Mt as n,Nt as t};
|
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-D1R15Bje.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BeicptWN.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<!-- Icons: game-icons.net, CC BY 3.0 (Lorc, Delapouite); see gui/ICONS.md -->
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-straw-boss",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.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/src/ask.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { open, stat } from "node:fs/promises";
|
|
2
2
|
import { type Json, parse } from "./items.ts";
|
|
3
|
-
import type { Net, Unit } from "./net.ts";
|
|
3
|
+
import type { Net, Queued, Unit } from "./net.ts";
|
|
4
4
|
import type { Answerable, Dialog } from "./owners.ts";
|
|
5
5
|
|
|
6
6
|
// What a waiting session waits on: the current branch's newest assistant message's tool call with no result yet, read from the end of
|
|
@@ -104,7 +104,7 @@ export async function pendingOf(file: string): Promise<Pending | undefined> {
|
|
|
104
104
|
export const waitsForSecret = async (file: string) => (await pendingOf(file), CACHE.get(file)?.secret !== false); // dropped from the cache meanwhile: hidden until the next look
|
|
105
105
|
|
|
106
106
|
/** The dialogs bridges relay, by unit key, and how they join what the file says (dialogs.ts); `docsOf`, the documents they list. */
|
|
107
|
-
export interface Relayed { dialogsOf(key: string): Dialog[] | undefined; merge(key: string, file: Pending | undefined, dialogs: Dialog[], readable: boolean): Pending; docsOf?(key: string): Pick<Unit, "docs" | "docsCut"> | undefined }
|
|
107
|
+
export interface Relayed { dialogsOf(key: string): Dialog[] | undefined; merge(key: string, file: Pending | undefined, dialogs: Dialog[], readable: boolean): Pending; docsOf?(key: string): Pick<Unit, "docs" | "docsCut"> | undefined; queuedOf?(key: string): Queued[] | undefined }
|
|
108
108
|
|
|
109
109
|
/** Adds what each waiting unit waits on, and the documents each unit shows, to a snapshot. A unit with a relayed dialog waits even before Herdr reports its pane blocked. */
|
|
110
110
|
export async function withPending(net: Net, fileOf: (key: string) => string | undefined, relayed?: Relayed): Promise<Net> {
|
|
@@ -113,6 +113,8 @@ export async function withPending(net: Net, fileOf: (key: string) => string | un
|
|
|
113
113
|
for (const u of [...(b.tower ? [b.tower] : []), ...[...b.tabs.flatMap((t) => t.units), ...b.outside].flatMap((u) => [u, ...u.subs])]) {
|
|
114
114
|
const dialogs = relayed?.dialogsOf(u.key);
|
|
115
115
|
Object.assign(u, relayed?.docsOf?.(u.key));
|
|
116
|
+
const queued = relayed?.queuedOf?.(u.key);
|
|
117
|
+
if (queued?.length) u.queued = queued;
|
|
116
118
|
if (dialogs?.length) [u.mark, b.mark] = ["waiting", "waiting"];
|
|
117
119
|
if (dialogs?.length && u !== b.tower) (u as Unit).note = "waiting on a question";
|
|
118
120
|
const file = u.mark === "waiting" ? fileOf(u.key) : undefined;
|
package/src/bridge.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
|
5
5
|
import { type Doc, type Fields, fieldsOk, listenDocs, submitForm } from "./documents.ts";
|
|
6
6
|
import { type Answer, type Bus, type Dialog, OWNERS, type OwnerAdapter, type Verdict } from "./owners.ts";
|
|
7
7
|
import { type Cmd, listCommands, MAX_PREFIX } from "./commands.ts";
|
|
8
|
+
import type { Queued } from "./net.ts";
|
|
8
9
|
import { type Editor, probeEditor } from "./probe.ts";
|
|
9
10
|
|
|
10
11
|
// The bridge runs in every pi session inside Herdr, subagents included. It turns the owners' dialog events (owners.ts) into one list of open
|
|
@@ -19,15 +20,21 @@ import { type Editor, probeEditor } from "./probe.ts";
|
|
|
19
20
|
// the documents the session shows with its dialogs (documents.ts) and hands a form answer for one of them to their owner. The composer's `/` menu
|
|
20
21
|
// asks it (`commands`) for the session's commands that match what is typed, and it answers with their names, sources, and descriptions.
|
|
21
22
|
// A close button asks it (`close`) to quit its session the way /boss close does (index.ts), which answers whether it will.
|
|
23
|
+
// It relays the session's queue too: pi tells extensions only whether messages wait (hasPendingMessages), so the bridge keeps what it saw
|
|
24
|
+
// typed while the agent works (`input` with a streaming behavior) and drops one when its user message starts; a queue pi emptied another
|
|
25
|
+
// way (Esc, Alt+Up) clears at the next check.
|
|
22
26
|
|
|
23
27
|
export const REGISTER = "intercom:extension-register";
|
|
24
28
|
const VERDICT_MS = 2000, POLL_MS = 2000, KEEP_MS = 120_000, KEEP = 16, MAX_GUIS = 8, MAX_MESSAGE = 15 * 1024;
|
|
29
|
+
/** At most this many queued messages go to the GUI (the oldest, which are delivered first), each cut to this many characters. */
|
|
30
|
+
export const MAX_QUEUED = 5, QUEUED_TEXT = 200;
|
|
31
|
+
const clipQueued = (text: string) => (text.length > QUEUED_TEXT ? `${text.slice(0, QUEUED_TEXT - 1)}…` : text);
|
|
25
32
|
export const guiNamespace = (g: string) => `straw-boss/gui/${createHash("sha256").update(g).digest("hex").slice(0, 32)}`;
|
|
26
33
|
export type Outcome = "accepted" | "rejected" | "stale" | "busy" | "unknown";
|
|
27
34
|
export interface Ack { version: 1; type: "ack"; bridgeId: string; id: string; answerId: string; outcome: Outcome; reason?: string; by?: string }
|
|
28
35
|
/** `closed`: dialogs closed in the last 2 minutes (at most 16), so an answer that comes late hears who closed it, and a resent one that won, that it won. */
|
|
29
|
-
/** `documents`: what the document owner lists now; `docsCut` when they did not fit the message (they are dropped first). */
|
|
30
|
-
export interface Dialogs { version: 1; type: "dialogs"; bridgeId: string; pane: string; file: string | null; dialogs: Dialog[]; closed: Closed[]; documents?: Doc[]; docsCut?: true }
|
|
36
|
+
/** `documents`: what the document owner lists now; `docsCut` when they did not fit the message (they are dropped first). `queued`: the session's queue, oldest first. */
|
|
37
|
+
export interface Dialogs { version: 1; type: "dialogs"; bridgeId: string; pane: string; file: string | null; dialogs: Dialog[]; closed: Closed[]; documents?: Doc[]; docsCut?: true; queued?: Queued[] }
|
|
31
38
|
export interface Closed { id: string; by: string; answerId?: string }
|
|
32
39
|
export interface ProbeResult extends Editor { version: 1; type: "probe-result"; bridgeId: string; probeId: string }
|
|
33
40
|
export interface CommandsResult { version: 1; type: "commands-result"; bridgeId: string; reqId: string; commands: Cmd[] }
|
|
@@ -50,6 +57,7 @@ export function startBridge(pi: ExtensionAPI, { env, dir, local, close }: { env:
|
|
|
50
57
|
const chans = new Map<string, Channel>(), me = () => env.PI_INTERCOM_SESSION_ID ?? "";
|
|
51
58
|
let g: string | undefined, gpid = 0, seen: number | undefined, poll: ReturnType<typeof setInterval> | undefined, offs: (() => void)[] = [], warned = false;
|
|
52
59
|
let file: () => string | undefined = () => undefined, tell = (_text: string) => {}, editor = (): Editor => ({ editor: "unknown" }), docs: Doc[] = [];
|
|
60
|
+
let queued: Queued[] = [], waits = () => false;
|
|
53
61
|
const open = () => [...recs.values()].filter((r) => r.state !== "closed");
|
|
54
62
|
const alive = () => { try { return gpid > 0 && (process.kill(gpid, 0), true); } catch (e) { return (e as NodeJS.ErrnoException).code === "EPERM"; } }; // a server that died without removing gui.json gets no probe answers
|
|
55
63
|
|
|
@@ -64,7 +72,8 @@ export function startBridge(pi: ExtensionAPI, { env, dir, local, close }: { env:
|
|
|
64
72
|
if (!target()) return;
|
|
65
73
|
const dialogs = final ? [] : open().map((r) => ({ ...r.d, ...(r.state !== "open" ? { busy: true as const } : {}) }));
|
|
66
74
|
const closed = final ? [] : [...recs.values()].filter((r) => r.state === "closed").map((r) => ({ id: r.d.id, by: r.by!, ...(r.by === "remote" && r.answerId ? { answerId: r.answerId } : {}) }));
|
|
67
|
-
|
|
75
|
+
const queue = final ? [] : queued.slice(0, MAX_QUEUED).map((q) => ({ ...q, text: clipQueued(q.text) }));
|
|
76
|
+
let msg: Dialogs = { version: 1, type: "dialogs", bridgeId, pane: env.HERDR_PANE_ID!, file: file() ?? null, dialogs, closed, documents: final ? [] : docs, ...(queue.length ? { queued: queue } : {}) };
|
|
68
77
|
const big = () => Buffer.byteLength(JSON.stringify(msg)) > MAX_MESSAGE; // in bytes, as the broker counts
|
|
69
78
|
if (big()) msg = { ...msg, documents: [], docsCut: true }; // the documents go first: they stay in the terminal, and the unit says so
|
|
70
79
|
if (big()) msg = { ...msg, dialogs: dialogs.map(({ select, questions, ...d }) => ({ ...d, big: true as const })) }; // shown read-only: too long to show
|
|
@@ -73,6 +82,7 @@ export function startBridge(pi: ExtensionAPI, { env, dir, local, close }: { env:
|
|
|
73
82
|
// gui.json names the server's session; it is read at the session's start and then on every mtime change, checked every 2 s (unref'd).
|
|
74
83
|
const follow = () => {
|
|
75
84
|
const at = statSync(join(dir, "gui.json"), { throwIfNoEntry: false })?.mtimeMs ?? 0;
|
|
85
|
+
if (queued.length && !waits()) requeue([]); // pi emptied its queue without delivering (Esc, Alt+Up)
|
|
76
86
|
if (at === seen) return false;
|
|
77
87
|
seen = at;
|
|
78
88
|
try {
|
|
@@ -171,9 +181,29 @@ export function startBridge(pi: ExtensionAPI, { env, dir, local, close }: { env:
|
|
|
171
181
|
if (docs.some((d) => d.id === m.id && d.kind === "html")) submitForm(bus, m.id, m.answerId, m.fields, out);
|
|
172
182
|
else out({ accepted: false, reason: "closed" });
|
|
173
183
|
}
|
|
184
|
+
const requeue = (next: Queued[]) => {
|
|
185
|
+
if (next.length === queued.length && next.every((q, i) => q === queued[i])) return;
|
|
186
|
+
queued = next;
|
|
187
|
+
push();
|
|
188
|
+
};
|
|
189
|
+
pi.on("input", (e) => {
|
|
190
|
+
if (e.streamingBehavior) requeue([...queued, { text: e.text, as: e.streamingBehavior }]);
|
|
191
|
+
});
|
|
192
|
+
pi.on("message_start", (e) => {
|
|
193
|
+
const msg = e.message as { role?: string; content?: unknown };
|
|
194
|
+
if (msg.role !== "user" || !queued.length) return;
|
|
195
|
+
const text = typeof msg.content === "string" ? msg.content : Array.isArray(msg.content) ? msg.content.map((b: { type?: string; text?: string }) => (b?.type === "text" ? (b.text ?? "") : "")).join("") : "";
|
|
196
|
+
const i = queued.findIndex((q) => q.text === text); // another extension may have changed the text: then the oldest went
|
|
197
|
+
requeue(queued.filter((_, j) => j !== Math.max(0, i)));
|
|
198
|
+
});
|
|
199
|
+
pi.on("agent_settled", () => {
|
|
200
|
+
if (queued.length && !waits()) requeue([]);
|
|
201
|
+
});
|
|
174
202
|
pi.on("session_start", (_e, ctx) => {
|
|
175
203
|
offs.forEach((off) => off());
|
|
176
204
|
docs = [];
|
|
205
|
+
queued = [];
|
|
206
|
+
waits = () => { try { return ctx.hasPendingMessages(); } catch { return false; } }; // a replaced session's context throws
|
|
177
207
|
file = () => ctx.sessionManager.getSessionFile();
|
|
178
208
|
tell = (text) => ctx.hasUI && ctx.ui.notify(text, "warning");
|
|
179
209
|
editor = () => probeEditor(ctx);
|
|
@@ -195,6 +225,7 @@ export function startBridge(pi: ExtensionAPI, { env, dir, local, close }: { env:
|
|
|
195
225
|
});
|
|
196
226
|
pi.on("session_shutdown", () => {
|
|
197
227
|
docs = [];
|
|
228
|
+
queued = [];
|
|
198
229
|
open().forEach((r) => report.closed(r.d.id, "error"));
|
|
199
230
|
push(true);
|
|
200
231
|
[...calls.values()].forEach((c) => c.stop?.());
|
package/src/dialogs.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
3
3
|
import { type Pending, type Relayed, SEVERAL } from "./ask.ts";
|
|
4
|
-
import { type Ack, type AnswerMessage, type Bridge, type CloseResult, type Dialogs, type FormMessage, type FormReply, guiNamespace, type LocalHub, REGISTER, type ToHub } from "./bridge.ts";
|
|
4
|
+
import { type Ack, type AnswerMessage, type Bridge, type CloseResult, type Dialogs, type FormMessage, type FormReply, guiNamespace, type LocalHub, MAX_QUEUED, QUEUED_TEXT, REGISTER, type ToHub } from "./bridge.ts";
|
|
5
5
|
import { createCaps, type Doc, docsOf, type Fields, fieldsOk, type FormResult, type Shelf } from "./documents.ts";
|
|
6
6
|
import type { Session } from "./herdr.ts";
|
|
7
7
|
import { canonical } from "./history.ts";
|
|
8
|
-
import type { Ref } from "./net.ts";
|
|
8
|
+
import type { Queued, Ref } from "./net.ts";
|
|
9
9
|
import { type Answerable, type Dialog, OWNERS, questionsDigest, type Reply, selectDigest } from "./owners.ts";
|
|
10
10
|
import { checkCommands, type Cmd } from "./commands.ts";
|
|
11
11
|
import { checkProbe, type Editor } from "./probe.ts";
|
|
@@ -78,7 +78,9 @@ export function createHub(pi: ExtensionAPI, me: string, local: Bridge) {
|
|
|
78
78
|
if (!active || msg?.version !== 1 || !str(msg.bridgeId)) return;
|
|
79
79
|
const closed = msg.type === "dialogs" && Array.isArray(msg.closed) && msg.closed.length <= 16 && msg.closed.every((c) => str(c?.id) && str(c.by) && opt(c.answerId));
|
|
80
80
|
const docs = msg.type === "dialogs" && (msg.documents === undefined ? [] : docsOf({ version: 1, documents: msg.documents })); // documents out of shape go alone, as if cut
|
|
81
|
-
|
|
81
|
+
// A queue out of shape is left out; the dialogs and documents still go.
|
|
82
|
+
const queued = msg.type === "dialogs" && Array.isArray(msg.queued) && msg.queued.length <= MAX_QUEUED && msg.queued.every((q) => typeof q?.text === "string" && q.text.length <= QUEUED_TEXT && (q.as === "steer" || q.as === "followUp")) ? msg.queued.map(({ text, as }) => ({ text, as })) : undefined;
|
|
83
|
+
if (closed && str(msg.pane) && (msg.file === null || str(msg.file)) && Array.isArray(msg.dialogs) && msg.dialogs.every(valid)) (bridges.set(from, { ...msg, ...(docs ? { documents: docs } : { documents: [], docsCut: true as const }), queued }), change());
|
|
82
84
|
if (msg.type === "ack") waiting.get([from, msg.bridgeId, msg.id, msg.answerId].join("\n"))?.(msg);
|
|
83
85
|
if (msg.type === "probe-result") probes.get([from, msg.bridgeId, msg.probeId].join("\n"))?.(checkProbe({ ...msg }));
|
|
84
86
|
if (msg.type === "commands-result" && str(msg.reqId)) lists.get([from, msg.bridgeId, msg.reqId].join("\n"))?.(checkCommands(msg.commands));
|
|
@@ -145,16 +147,17 @@ export function createHub(pi: ExtensionAPI, me: string, local: Bridge) {
|
|
|
145
147
|
/** Binds each relayed list to a unit, from this net reading's sessions and registry. */
|
|
146
148
|
relayed(sessions, refs) {
|
|
147
149
|
[bound, targets, reach] = [new Map(), new Map(), new Map()];
|
|
148
|
-
const shelved: { key: string; from: string; bridgeId: string; docs: Doc[] }[] = [], cut = new Set<string>();
|
|
150
|
+
const shelved: { key: string; from: string; bridgeId: string; docs: Doc[] }[] = [], cut = new Set<string>(), queues = new Map<string, Queued[]>();
|
|
149
151
|
for (const [from, b] of bridges) {
|
|
150
152
|
const file = sessions.find((s) => s.id === from)?.herdrLocation?.paneId === b.pane ? canonical(b.file ?? undefined) : undefined;
|
|
151
153
|
const ref = file && [...refs.values()].find((r) => r.pane === b.pane && r.file === file);
|
|
152
154
|
if (ref) (reach.set(ref.key, { from, bridgeId: b.bridgeId }), shelved.push({ key: ref.key, from, bridgeId: b.bridgeId, docs: b.documents ?? [] }), b.docsCut && cut.add(ref.key));
|
|
155
|
+
if (ref && b.queued?.length) queues.set(ref.key, b.queued);
|
|
153
156
|
if (ref && (b.dialogs.length || b.closed.length)) bound.set(ref.key, { from, b });
|
|
154
157
|
}
|
|
155
158
|
const cards = caps.bind(shelved, new Set([...bridges].flatMap(([from, b]) => (b.documents ?? []).map((d) => `${from}\n${b.bridgeId}\n${d.id}`))));
|
|
156
159
|
shelves = new Map([...cards].flatMap(([key, docs]): [string, Shelf][] => (docs.length || cut.has(key) ? [[key, { ...(docs.length ? { docs } : {}), ...(cut.has(key) ? { docsCut: true as const } : {}) }]] : [])));
|
|
157
|
-
return { dialogsOf: (key) => bound.get(key)?.b.dialogs, merge, docsOf: (key) => shelves.get(key) };
|
|
160
|
+
return { dialogsOf: (key) => bound.get(key)?.b.dialogs, merge, docsOf: (key) => shelves.get(key), queuedOf: (key) => queues.get(key) };
|
|
158
161
|
},
|
|
159
162
|
/** How a dialog that is no longer open here ended: `accepted` for the answer that won it, else `stale` with who closed it. */
|
|
160
163
|
ended(key, dialog, answerId) {
|
package/src/gui.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { createMirrors } from "./mirror.ts";
|
|
|
15
15
|
import type { Found, Net, Ref } from "./net.ts";
|
|
16
16
|
import { qr } from "./qr.ts";
|
|
17
17
|
import { type Access, cookieFor, createAccess } from "./remote.ts";
|
|
18
|
-
import { api, type Hub as Files, watchSession, type Watch, watchWorkspace } from "./watch.ts";
|
|
18
|
+
import { api, type Hub as Files, image, watchSession, type Watch, watchWorkspace } from "./watch.ts";
|
|
19
19
|
|
|
20
20
|
// The browser view's server: serves the built page and one live stream of the net, read-only, on 127.0.0.1 only.
|
|
21
21
|
// Every URL starts with a random token (/<token>/index.html, /<token>/events) and a request without it, or with another Host
|
|
@@ -130,6 +130,8 @@ export async function startGui({ read, net, call, hub, dir = BUNDLE, port = 0, t
|
|
|
130
130
|
}
|
|
131
131
|
if ((parts[0] === "server" || parts.join("/") === "remote/on") && who.remote) return void fail(403); // only this machine stops the server or opens it to the tailnet
|
|
132
132
|
if (["sessions", "remote", "server", "dirs", "open", "close"].includes(parts[0]!)) return void control(req, who.origin, parts).then(answer, () => answer({ status: 500, body: { error: "internal", reason: "The request could not be handled." } }));
|
|
133
|
+
// An entry never changes once written, so its image is cached for a day; the token in the URL keeps it to this page.
|
|
134
|
+
if (req.method === "GET" && parts[0] === "image") return void image(files, parts.slice(1)).then((p) => (p ? res.writeHead(200, { ...HEADERS, "content-type": p.type, "cache-control": "private, max-age=86400" }).end(p.bytes) : fail(404)), () => fail(404));
|
|
133
135
|
if (req.method === "GET") return void (parts[0] === "doc" && docs ? answer(docs.text(parts[1] ?? "")) : api(files, parts, url.searchParams).then(answer, () => fail(404)));
|
|
134
136
|
}
|
|
135
137
|
if (req.method !== "GET") return void fail(403);
|
|
@@ -200,10 +202,13 @@ export function readRecord(dir: string): GuiRecord | undefined {
|
|
|
200
202
|
}
|
|
201
203
|
}
|
|
202
204
|
|
|
203
|
-
/**
|
|
204
|
-
|
|
205
|
+
/**
|
|
206
|
+
* Marks the record of the server this process runs, so the extension that loads after its /reload starts it again on the same URL.
|
|
207
|
+
* Matched by pid, not by session id: pi-intercom, loaded first, has already cleared PI_INTERCOM_SESSION_ID when this runs at shutdown.
|
|
208
|
+
*/
|
|
209
|
+
export function markReload(dir: string, pid = process.pid) {
|
|
205
210
|
const record = readRecord(dir);
|
|
206
|
-
if (record?.
|
|
211
|
+
if (record?.pid === pid) writeFileSync(join(dir, "gui.json"), JSON.stringify({ ...record, reload: true }), { mode: 0o600 });
|
|
207
212
|
}
|
|
208
213
|
|
|
209
214
|
/** Asks a recorded server to stop, as its own page would, and waits until it is gone; false when it refused (a server from before 0.11.0) or stayed up. */
|
package/src/index.ts
CHANGED
|
@@ -565,7 +565,7 @@ export function createStrawBoss({ run = herdrRun, api = herdrApi(), call = herdr
|
|
|
565
565
|
pi.on("session_shutdown", async (event) => {
|
|
566
566
|
// A closed session, and a tower that quits however it was asked, take their pane with them (and an emptied tab); a /reload, /new, resume or fork keeps it.
|
|
567
567
|
if ((closing ? !closing.keepPane : isTower) && event.reason === "quit" && env.HERDR_PANE_ID) later(process.pid, ["pane", "close", env.HERDR_PANE_ID]);
|
|
568
|
-
if (gui && event.reason !== "quit") markReload(guiDir
|
|
568
|
+
if (gui && event.reason !== "quit") markReload(guiDir); // a /reload, /new, or /resume starts it again in this process
|
|
569
569
|
if (gui) await switchRemote(gui, false, guiDir, ts).catch(() => {});
|
|
570
570
|
await gui?.stop();
|
|
571
571
|
gui = undefined;
|
package/src/net.ts
CHANGED
|
@@ -10,10 +10,12 @@ import { canonical } from "./history.ts";
|
|
|
10
10
|
// and subagents (linked to their launcher the way the tower dashboard links them), and sub workspaces as outposts.
|
|
11
11
|
|
|
12
12
|
/** `key` names the unit in routes and the API; `control` says a live pi pane backs it. `outside` units are pi panes the net does not hold (D1). */
|
|
13
|
-
|
|
13
|
+
/** A message typed while the agent works, waiting in pi's queue: `steer` reaches it at its next turn, `followUp` when the run ends. */
|
|
14
|
+
export interface Queued { text: string; as: "steer" | "followUp" }
|
|
15
|
+
export interface Unit extends Shelf { queued?: Queued[]; id: string; key: string; control: boolean; name: string; role: "main" | "member" | "subagent" | "outside"; mark: Mark; note?: string; subs: Unit[]; pending?: Pending }
|
|
14
16
|
export interface Tab { id: string; label: string; units: Unit[] }
|
|
15
17
|
export interface Outpost { id: string; label: string; mark: Mark }
|
|
16
|
-
export interface Base { id: string; label: string; mark: Mark; head: boolean; tower: ({ name: string; mark: Mark; key: string; control: boolean; pending?: Pending } & Shelf) | null; tabs: Tab[]; outposts: Outpost[]; outside: Unit[] }
|
|
18
|
+
export interface Base { id: string; label: string; mark: Mark; head: boolean; tower: ({ name: string; mark: Mark; key: string; control: boolean; pending?: Pending; queued?: Queued[] } & Shelf) | null; tabs: Tab[]; outposts: Outpost[]; outside: Unit[] }
|
|
17
19
|
export interface Net { bases: Base[] }
|
|
18
20
|
/** What the server may read for a key: the registry entry is the allow list, and paths never come from the browser. */
|
|
19
21
|
export interface Ref { key: string; base: string; name: string; role: string; file?: string; pane?: string }
|
package/src/watch.ts
CHANGED
|
@@ -75,6 +75,22 @@ export function watchWorkspace(hub: Hub, id: string, send: Send): Watch {
|
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
/**
|
|
79
|
+
* GET /api/image/<key>/<entry id>/<n>: the entry's n-th image (png, jpeg, gif, or webp; items.ts drops other types), as its bytes, so the
|
|
80
|
+
* page shows it with <img> instead of carrying base64 in the history.
|
|
81
|
+
*/
|
|
82
|
+
export async function image(hub: Hub, [key, id, n]: string[]): Promise<{ type: string; bytes: Buffer } | undefined> {
|
|
83
|
+
const found = key ? hub.lookup(key) : undefined, i = Number(n);
|
|
84
|
+
if (!found?.file || !id || !Number.isInteger(i) || i < 0) return undefined;
|
|
85
|
+
const reader = hub.readers.acquire(found.file);
|
|
86
|
+
try {
|
|
87
|
+
const pic = (await reader.entry(id))?.pics?.[i], hit = pic && /^data:(image\/(?:png|jpeg|jpg|gif|webp));base64,(.*)$/s.exec(pic);
|
|
88
|
+
return hit ? { type: hit[1]!, bytes: Buffer.from(hit[2]!, "base64") } : undefined;
|
|
89
|
+
} finally {
|
|
90
|
+
hub.readers.release(found.file);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
78
94
|
/** GET /api/history/<key>?before=<entry id>&limit=<n> and GET /api/entry/<key>/<entry id>. */
|
|
79
95
|
export async function api(hub: Hub, [kind, key, id]: string[], query: URLSearchParams): Promise<{ status: number; body: unknown }> {
|
|
80
96
|
const found = key ? hub.lookup(key) : undefined;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{M as e,d as t,n}from"./index-BVodxW0J.js";import{t as r}from"./dom-BaTXH9WU.js";import{n as i,t as a}from"./views-C4HEP3AY.js";var o=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),s=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),c=e=>`context compacted · ${e?.tokens} tokens summarized`,l=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,u=((t,n={})=>(n.locale??e())===`zh-TW`?l(t):c(t)),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),f=e=>`exit ${e?.code}`,p=e=>`結束碼 ${e?.code}`,m=((t,n={})=>(n.locale??e())===`zh-TW`?p(t):f(t)),h=e=>`${e?.count} image(s)`,g=e=>`${e?.count} 張圖片`,_=((t,n={})=>(n.locale??e())===`zh-TW`?g(t):h(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),y=e=>`${e?.count} new`,b=e=>`${e?.count} 則新訊息`,x=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),M=e=>`show all (${e?.size})`,N=e=>`顯示全部(${e?.size})`,P=((t,n={})=>(n.locale??e())===`zh-TW`?N(t):M(t)),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),I=e=>`◇ thought · ${e?.count} chars`,L=e=>`◇ 思考 · ${e?.count} 字元`,R=((t,n={})=>(n.locale??e())===`zh-TW`?L(t):I(t)),z=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),B=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function H(){let e=!0,t=0;return{get pinned(){return e},scrolled(n){e=n,n&&(t=0)},hold:()=>void(e=!1),arrived(n){return e||(t+=n),e},jump:()=>void(e=!0,t=0),button:n=>e&&!n?void 0:t&&!n?x({count:t}):v()}}async function U(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 W(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 te=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,ne=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,re={intercom_message:T,subagent_result:k,subagent_ping:O,subagent_status:A,"pi-loop-monitor":D,"memory-context":E,"doc-review":w},G=e=>{let r=t(`<span class="ava"><svg><use/></svg></span>`);return r.querySelector(`use`).setAttribute(`href`,`#i-${n[e]??e}`),r};function ie(e){let t=[],n=0;for(let i of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))t.push(e.slice(n,i.index),r(`a`,{href:i[0],rel:`noopener noreferrer`,target:`_blank`},i[0])),n=i.index+i[0].length;return[...t,e.slice(n)]}function K(e,t,{who:n,link:c,docFor:l}){let f=W(),p=new Map,h=new Set,g=()=>h.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>l?.(e))):e.shown&&h.delete(e)),v=r(`div`,{class:`chat-list`}),y=r(`div`,{class:`chat-top`}),b=r(`div`,{class:`chat-live`}),x=r(`button`,{class:`chat-pill`,type:`button`,hidden:``}),w=r(`p`,{class:`chat-empty`},S()),T=r(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":s()},y,v,b);e.replaceChildren(T,x);let E=H(),D=!1,O=!1,k,A,M=0,N=()=>T.scrollHeight-T.scrollTop-T.clientHeight<80,I=(e=E.button(f.detached))=>(x.hidden=!e,x.textContent=e??``),L=()=>(E.jump(),A=void 0,T.scrollTop=T.scrollHeight,I());async function K(e){D=!0;let n=await U(f,t,e,e=>(X(e),Z(e))).finally(()=>D=!1),r=p.get(e);if(k===e){if(!n||!r)return L();E.hold(),A=r,r.scrollIntoView({block:`center`}),r.classList.remove(`lit`),r.offsetWidth,r.classList.add(`lit`),clearTimeout(M),M=window.setTimeout(()=>(A=void 0,r.classList.remove(`lit`)),2e3),I()}}let q=()=>k?void K(k):L(),J=(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=B());n.textContent=r,e.remove()},()=>e.textContent=B())};function ae(e,t){let n=f.result(e.id),i=r(`pre`,{class:`out`},n?.text??``),a=r(`pre`,{class:`args`},e.args??``),o=e.cut?r(`button`,{class:`more`,type:`button`},F()):null;o?.addEventListener(`click`,()=>J(o,a,t,t=>(e=>e&&`${e.args??``}${e.cut?`\n${d()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=n?.more?r(`button`,{class:`more`,type:`button`},P({size:ne(n.bytes??0)})):null;s?.addEventListener(`click`,()=>J(s,i,n.id,e=>e.text));let c=e.name===`show_doc`&&l?r(`button`,{class:`more open`,type:`button`,hidden:``},j()):null;return c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>l?.(e)?.()))),c&&h.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(g),r(`details`,{class:`act`},r(`summary`,{"data-mark":n?n.isError?`error`:`done`:`working`},r(`b`,{class:`badge`}),r(`code`,null,e.name),r(`span`,{class:`sum`},e.summary),c),a,o,n&&r(`div`,{class:`result`},n.images?r(`em`,null,_({count:n.images})):null,i,s))}function Y(e){let t=r(`time`,null,te(e.at));switch(e.kind){case`user`:return r(`article`,{class:`tx you`},r(`header`,null,t,r(`b`,null,V()),G(`user`)),r(`div`,{class:`bubble`},...ie(e.text??``),e.images?r(`em`,null,` · ${_({count:e.images})}`):null));case`assistant`:{let o=n(),s=r(`pre`,{class:`thought-text`}),c=e.thought?r(`button`,{class:`thought`,type:`button`},e.thought<0?z():R({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>J(c,s,e.id,e=>e.thoughtText)),r(`article`,{class:`tx in`},G(o.role),r(`div`,{class:`tx-body`},r(`header`,null,r(`b`,null,o.name),e.model?r(`span`,null,e.model):null,t,e.stop?r(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,s,e.text?r(`div`,{class:`md`},a(i(e.text))):null,e.error?r(`p`,{class:`fault`},e.error):null,...(e.tools??[]).map(t=>ae(t,e.id))))}case`bash`:return r(`article`,{class:`tx sys`},r(`details`,{class:`act`},r(`summary`,{"data-mark":e.exit?`error`:`done`},r(`b`,{class:`badge`}),r(`code`,null,`shell`),r(`span`,{class:`sum`},`! ${e.command}`),e.exit?r(`span`,{class:`stop`,"data-mark":`error`},m({code:e.exit})):null),e.text?r(`pre`,{class:`out`},e.text):null));case`notice`:return r(`article`,{class:`tx sys`},r(`details`,{class:`notice`},r(`summary`,null,G(`comms`),r(`em`,null,ee()),re[e.type??``]?.()??e.type??C(),` `,e.from&&c(e.from)||(e.from??``),t),r(`pre`,null,e.text??``)));case`divider`:return r(`article`,{class:`tx rule`},r(`details`,null,r(`summary`,null,e.type===`compaction`?u({tokens:(e.tokens??0).toLocaleString()}):o()),r(`pre`,null,e.text??``)));default:return r(`article`,{class:`tx note`},e.text??``,` `,t)}}function X(e){e.rebuild&&(p.clear(),v.replaceChildren());for(let t of e.dropped)p.get(t)?.remove(),p.delete(t);let t=e.added.map(e=>(p.set(e.id,Y(e)),p.get(e.id)));e.front?v.prepend(...t):v.append(...t),O&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),w.remove(),f.items.length||v.append(w),y.hidden=!f.before}let Z=e=>e.touched.forEach(e=>{let t=p.get(e),n=f.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),p.set(e,r)}}),Q=async()=>{if(!D&&f.before&&O){D=!0;try{let e=T.scrollHeight,n=f.prepend(await t.older(f.before));X(n),Z(n),T.scrollTop+=T.scrollHeight-e}finally{D=!1}f.before&&T.clientHeight&&y.getBoundingClientRect().bottom>=T.getBoundingClientRect().top&&Q()}};new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void Q(),{root:T}).observe(y),x.addEventListener(`click`,()=>{k=void 0,f.detached?t.latest().then(e=>(X(f.reset(e)),L())):L()}),T.addEventListener(`scroll`,()=>(E.scrolled(N()),I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])T.addEventListener(e,()=>A=k=void 0,{passive:!0});let $=new ResizeObserver(()=>E.pinned&&!f.detached?T.scrollTop=T.scrollHeight:A?.scrollIntoView({block:`center`}));return $.observe(v),$.observe(T),{log:T,docs:g,apply(e){if(e.reset)X(f.reset({items:e.items??[],before:e.before})),O=!0,q();else if(e.items?.length){let t=f.append(e.items);X(t),Z(t),E.arrived(t.added.length)&&!f.detached?L():I()}},reveal(e){k=e,O&&q()},setLive(e,t){b.dataset.mark=t,b.lastChild?.textContent!==e&&b.replaceChildren(...e?[r(`b`,{class:`badge`}),r(`span`,null,e)]:[])}}}export{K as mountChat};
|
|
@@ -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`))},D=(e,t)=>e?e.startsWith(`tool:`)?Sn({tool:e.slice(5)}):Object.hasOwn(Vn,e)?Vn[e]():e:S[t](),O=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,b(t)||`./`),e.setAttribute(`data-route`,b(t)))},Wn=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function Gn(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 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>${Wn}<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`,Un(t.mark)),E(e,t.mark),Gn(e.querySelector(`.plate`),t.role,t.mark,t.docs),T(e,`.name`,t.name),T(e,`.role`,Hn(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`?Ut():Wt())&&(e.textContent=r===`main`?Ut():Wt())}function N(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 Kn=()=>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 qn(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),N(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})),N(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 Jn(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 Yn(){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&&Jn(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,Kn,qn),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 Xn=45e3,Zn=1e3,Qn=3e4,$n=(e,t)=>Math.min(Qn,Zn*2**(e-1))*(.8+.4*t);function er(e){try{return JSON.parse(e)}catch{return}}function tr(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(),Xn),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,$n(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:Jt()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:er(e)??Yt()}),l())}),r=e.setTimeout(()=>u(),Xn)};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 nr=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),rr=function(e,t){return new URL(e,t).href},ir={},ar=function(e){return e.pathname.endsWith(`.css`)},or=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},P=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=rr(t,n);let r=s(t),i=ar(r);return or(ir,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`:nr,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 F=Yn(),I=e=>document.getElementById(e),sr=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):It(),cr,lr,L,R,z={state:`connecting`,attempt:0},B={view:`map`},ur=!1,V,dr=``,H,fr,U=e=>H?e(H):void fr?.then(e);function pr(){fr??=P(async()=>{let{mountFocus:e}=await import(`./views-C4HEP3AY.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(H=e({data:wr,restart:()=>Q.restart(),openTile:K,embedTerminal:(e,t,n)=>new Promise(r=>G(i=>r(i.terminal.embed(e,t,n)))),online:()=>z.state===`live`}),H.show(B,B),L&&H.net(L),H))}var W,mr,G=e=>{if(W)return e(W);mr??=P(async()=>{let{mountPanels:e}=await import(`./layer-BVDCWy-f.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>W=e({label:e=>L?.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:()=>dr,showTerminal:(e,t)=>(W?.stack.close(),H?.terminal(t),Er.go({view:`session`,ws:e,key:t}))})),mr.then(e)},K=(e,t)=>G(n=>n.tiles.open(e,t)),q=document.querySelector(`link[rel="icon"]`),J=q&&decodeURIComponent(q.href.slice(q.href.indexOf(`,`)+1)),hr=0;function gr(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(!q||!J||t===hr)return;hr=t;let n=`<circle cx='23' cy='9' r='9' fill='#ffd166' stroke='#0b1220' stroke-width='2'/><text x='23' y='13' text-anchor='middle' font-family='sans-serif' font-size='${t>9?9:12}' font-weight='700' fill='#06101e'>${t>9?`9+`:t}</text>`;q.href=`data:image/svg+xml,${encodeURIComponent(t?J.replace(`</svg>`,`${n}</svg>`):J)}`}function Y(e){if(L=R=e,gr(e),document.hidden)return;F.stats(e);let t=Nn(e,Date.now()),n=Pn(V,t);(n.length||W)&&G(e=>e.alerts(n,t)),V=t,F.log(jn(lr,e)),lr=e,U(t=>t.net(e)),B.view===`map`&&(F.show(e),cr=e,R=void 0)}function _r(e){let t=B,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;B=e,e.view!==`map`&&pr(),I(`map`).hidden=e.view!==`map`,I(`legend`).hidden=e.view===`session`,F.still(e.view!==`map`),U(r=>r.show(e,t,n)),e.view===`map`&&L&&L!==cr&&(Y(L),requestAnimationFrame(F.layout)),ur&&x(e)!==x(t)&&Q.restart()}function vr(e){z=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=I(`stage`).dataset.stale=String(t),I(`link`).dataset.state=e.state,I(`link-text`).textContent={connecting:nt,live:rt,reconnecting:at,offline:it}[e.state](),H&&L&&H.net(L),W?.stack.redraw();let n=I(`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=sr(e.lastContact),n.replaceChildren(`${r} ${ve()} `,i,_e())}function yr(e,t){try{let n=JSON.parse(t);U(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var br=document.querySelector(`meta[name="sb-build"]`)?.content,xr=e=>!!(br&&br!==JSON.parse(e).build);function Sr(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 Cr=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),X=(e,t=``)=>Cr(`history/${encodeURIComponent(e)}${t}`),Z=void 0,wr=e=>({older:t=>X(e,`?before=${encodeURIComponent(t)}`),latest:()=>X(e),entry:t=>Cr(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0)}),Tr=()=>{let e=Sr(x(B));return e.listen(`history`,e=>yr(`history`,e)),e.listen(`cards`,e=>yr(`cards`,e)),e.listen(`hello`,e=>xr(e)?location.reload():(dr=e,W?.terminal.hello())),e.listen(`mirror`,e=>W?.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=V?.get(n.key);r&&(e.preventDefault(),G(e=>e.stack.show(r)))},!0);var Er=Rn(e=>_r(e)),Q=tr({open:Tr,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:Y,onStatus:vr}),Dr=()=>Q.resume();document.addEventListener(`visibilitychange`,()=>{if(F.pause(document.hidden),document.hidden)return Q.hide();R&&Y(R),U(e=>e.wake()),Dr()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||(e.preventDefault(),!W?.stack.close()&&B.view!==`map`&&Er.go(Ln(B)))}),I(`pair`).addEventListener(`click`,()=>void P(async()=>{let{pairTile:e}=await import(`./pair-CV8iexz_.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>K(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()});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),P(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||$(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&&P(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-Dm9G4Tc4.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,L?.bases??[]);r&&K(n(r),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&Dr());vr(z),_r(Er.route()),Q.start(),ur=!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 _,O as a,Qt as b,w as c,C as d,E as f,Un as g,T as h,Wn as i,ge as j,h as k,D as l,k as m,zn as n,N as o,Hn as p,S as r,M as s,P as t,Gn 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-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%}.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-term{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-term,.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}}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-D1GkSIRb.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-CAlgsVra.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 ee,h as v,i as y,j as b,k as x,l as S,m as C,o as w,p as T,r as E,s as D,t as te,u as O,v as k,x as A,y as j}from"./index-BVodxW0J.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`),se=((e={},t={})=>(t.locale??u())===`zh-TW`?`無法取得:已不在它的 session 中開啟。`:`Unavailable: no longer open in its session.`),ce=((e={},t={})=>(t.locale??u())===`zh-TW`?`已不在清單中:已在它的 session 中關閉,或 session 已結束。`:`No longer listed: closed in its session, or the session ended.`),le=((e={},t={})=>(t.locale??u())===`zh-TW`?`已更新:此區塊顯示時會載入新版本。`:`Updated: the new version loads when this tile shows.`),ue=((e={},t={})=>(t.locale??u())===`zh-TW`?`超過轉送上限:請在終端機中閱讀。`:`More than the relay carries: read them in the terminal.`),H=e=>`${e?.command} ends this session or switches its pane to another one.`,U=e=>`${e?.command} 會結束這個 session,或把它的窗格切換到別的 session。`,W=((e,t={})=>(t.locale??u())===`zh-TW`?U(e):H(e)),G=e=>{let t=n(`en`,e?.count,{},!0);return t===`one`?`${e?.count} entry`:t===`other`?`${e?.count} entries`:`entry_count`},de=e=>`${e?.count} 筆`,fe=((e,t={})=>(t.locale??u())===`zh-TW`?de(e):G(e)),K=e=>`${e?.name} is larger than 20 MB.`,pe=e=>`${e?.name} 超過 20 MB。`,me=((e,t={})=>(t.locale??u())===`zh-TW`?pe(e):K(e)),he=((e={},t={})=>(t.locale??u())===`zh-TW`?`做完再送`:`After this`),ge=((e={},t={})=>(t.locale??u())===`zh-TW`?`載入中…`:`Loading…`),_e=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個工作區不在網中。`:`This workspace is not part of the net.`),ve=((e={},t={})=>(t.locale??u())===`zh-TW`?`訊息`:`Message`),ye=((e={},t={})=>(t.locale??u())===`zh-TW`?`新的 session`:`the new session`),be=((e={},t={})=>(t.locale??u())===`zh-TW`?`無頻道`:`no channel`),xe=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在網中`:`not in the net`),Se=((e={},t={})=>(t.locale??u())===`zh-TW`?`已不再即時;紀錄在十分鐘內仍可閱讀。`:`No longer live; its history stays readable for ten minutes.`),Ce=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在網中(可能已在十分鐘前結束)。`:`Not in the net (it may have ended more than ten minutes ago).`),we=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在終端機畫面上`:`off screen in the terminal`),Te=e=>`${e?.reason} · off screen`,Ee=e=>`${e?.reason} · 不在畫面上`,De=((e,t={})=>(t.locale??u())===`zh-TW`?Ee(e):Te(e)),Oe=((e={},t={})=>(t.locale??u())===`zh-TW`?`在新分頁開啟`:`Open in a new tab`),ke=((e={},t={})=>(t.locale??u())===`zh-TW`?`正在開啟頻道…`:`Opening the channel…`),Ae=((e={},t={})=>(t.locale??u())===`zh-TW`?`網外`:`Outside the net`),je=((e={},t={})=>(t.locale??u())===`zh-TW`?`未編入的 pi 窗格`:`unaligned pi panes`),Me=e=>`Message ${e?.name}`,Ne=e=>`傳訊息給 ${e?.name}`,Pe=((e,t={})=>(t.locale??u())===`zh-TW`?Ne(e):Me(e)),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`),q=((e={},t={})=>(t.locale??u())===`zh-TW`?`未確認。再次送出前請先查看終端機。`:`Not confirmed. Check the terminal before sending again.`),bt=((e={},t={})=>(t.locale??u())===`zh-TW`?`上傳中…`:`Uploading…`),xt=((e={},t={})=>(t.locale??u())===`zh-TW`?`等待網的資料…`:`Waiting for the net…`),St=((e={},t={})=>(t.locale??u())===`zh-TW`?`原文已送到 session;這裡是你編輯過、尚未送出的副本。`:`The original already went to the session; what is here is your edited copy, unsent.`),J=(e,t,n)=>({tag:e,kids:t,attrs:n}),Ct=/^(?:https?:\/\/|mailto:)[^\s\u0000-\u001f]+$/i,wt=(e,t)=>J(`a`,t,{href:e,rel:`noopener noreferrer`,target:`_blank`}),Tt=/(`+)([^`]|[^`][^]{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 Y(e){let t=[],n=0;for(let r of e.matchAll(Tt))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(J(`em`,Y(r[5]??r[6]))):r[7]===void 0?t.push(wt(r[9],[r[9]])):t.push(Ct.test(r[8])?wt(r[8],Y(r[7])):r[0]):t.push(J(`del`,Y(r[4]))):t.push(J(`strong`,Y(r[3]))):t.push(J(`code`,[r[2]]));return n<e.length&&t.push(e.slice(n)),t}var X=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,Et=/^\s*([-*_])(\s*\1){2,}\s*$/,Dt=/^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?\s*$/,Ot=e=>e.trim().replace(/^\|/,``).replace(/\|$/,``).split(`|`).map(e=>e.trim()),kt=(e,t)=>/^\s*(`{3,}|~{3,}|#{1,6}\s|>)/.test(e)||Et.test(e)||X.test(e)||e.includes(`|`)&&t!==void 0&&Dt.test(t)&&t.includes(`-`);function At(e,t=0){if(t>=16)return[J(`p`,[e])];let n=e.replace(/\r\n?/g,`
|
|
3
|
-
`).split(`
|
|
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(X);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(J(`pre`,[J(`code`,[t.join(`
|
|
5
|
-
`)],o[2]?{"data-lang":o[2]}:void 0)]))}else if(s)r.push(J(`h${s[1].length}`,Y(s[2]))),e++;else if(Et.test(i))r.push(J(`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(J(`blockquote`,At(i.join(`
|
|
6
|
-
`),t+1)))}else if(i.includes(`|`)&&a!==void 0&&Dt.test(a)&&a.includes(`-`)){let t=[];for(e+=2;e<n.length&&n[e].trim()&&n[e].includes(`|`);e++)t.push(Ot(n[e]));r.push(J(`table`,[J(`thead`,[J(`tr`,Ot(i).map(e=>J(`th`,Y(e))))]),J(`tbody`,t.map(e=>J(`tr`,e.map(e=>J(`td`,Y(e))))))]))}else if(c){let i=c[1].length,a=[];for(;e<n.length;){let r=n[e].match(X);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=At(o.join(`
|
|
7
|
-
`),t+1),u=l[0],d=s?.[1]!==` `;s&&(typeof u==`object`&&u.tag===`p`?u.kids:l).unshift(J(`i`,d?[`✓`]:[],{class:`check`,"data-done":String(d),"aria-label":d?it():at()})),a.push(J(`li`,l,s?{class:`task`}:void 0)),!n[e]?.trim()&&n[e+1]?.match(X)?.[1]?.length===i&&e++}r.push(J(/\d/.test(c[2])?`ol`:`ul`,a))}else{let t=[i];for(e++;e<n.length&&n[e].trim()&&!kt(n[e],n[e+1]);e++)t.push(n[e]);r.push(J(`p`,Y(t.join(`
|
|
8
|
-
`))))}}return r}function jt(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 Mt=e=>/^\/(\S{0,64})$/.exec(e)?.[1],Nt=(e,t,n)=>(e+n+t)%t;function Pt(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=Mt(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=Nt(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 Ft=16384,It=/^\s*\/(quit|exit|new|resume|fork|clone|import|reload)(?=\s|$)/,Z=new Map,Lt=e=>(n,r)=>t(`sessions/${encodeURIComponent(e)}/${n}`,r);function Rt(e,t,n){if(!e.ok)return[`error`,e.status===504?q():e.body.reason??h({status:e.status})];if(t&&!t.startsWith(n))return[`ok`,St()]}var zt=e=>{try{return e?.startsWith(`[`)?JSON.parse(e):e?[`error`,e]:void 0}catch{return[`error`,e]}},Bt=(e,t)=>e!==``&&!e.startsWith(t)?Be():``,Vt=(e,t)=>e.startsWith(t)?e.slice(t.length).replace(/^\n/,``):e;function Ht(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 Ut(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(Ft),"aria-label":ve(),enterkeyhint:l?`enter`:`send`}),d=M(`button`,{type:`submit`,class:`cmp-send`},Ie()),f=M(`button`,{type:`button`,class:`cmp-alt`},he()),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`}),ee=Pt(u,e=>r(`commands`,{prefix:e})),v=M(`form`,{class:`composer`},ee,M(`div`,{class:`cmp-row`},g,m,u,M(`div`,{class:`cmp-acts`},d,f,p)),M(`div`,{class:`cmp-foot`},_));t.replaceChildren(v);let y={name:``,control:!1,live:!1,mark:`unknown`,online:!1},b=!1,x=!1,S=e=>{try{e()}catch{}};S(()=>u.value=sessionStorage.getItem(c)??``);let C=()=>S(()=>u.value?sessionStorage.setItem(c,u.value):sessionStorage.removeItem(c)),w=()=>(u.style.height=`auto`,u.style.height=`${Math.min(u.scrollHeight,220)}px`),T=(e,t=``,...n)=>(_.dataset.tone=t,_.replaceChildren(e,...n)),E=(e,t,n)=>{let r=M(`button`,{type:`button`,class:`cmp-yes`},t),i=M(`button`,{type:`button`,class:`cmp-link`},o());x=!0,r.onclick=()=>(x=!1,n()),i.onclick=()=>(x=!1,T(``),u.focus()),T(e,`ask`,r,i),r.focus()},[D,te]=[`${c}:note`,()=>{try{return sessionStorage.getItem(c)??``}catch{return}}],O=e=>S(()=>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`,q()]),Z.set(n,a),a.answer.then(e=>{let t=te();e.ok&&t!==void 0&&S(()=>sessionStorage.setItem(c,Vt(t,i))),O(Rt(e,t,i))},()=>O([`error`,q()]))),A(a)}async function A(e,{sent:t}=e){b=!0,x=!1,P(),T(t===void 0?``:i());try{let n=await e.answer;if(!v.isConnected)return;if(!n.ok)return n.status===504||O(),T(n.body.reason??h({status:n.status}),`error`);if(t===void 0)return T(``);O();let r=Bt(u.value,t);u.value=Vt(u.value,t),C(),w(),T(r,`ok`)}catch{T(q(),`error`)}finally{Z.get(n)===e&&Z.delete(n),b=!1,P()}}function j(e,t){let n=u.value,r=Ht(y),i=t===n;if(b||x||!n.trim())return;if(r)return T(r,`error`);if(new TextEncoder().encode(n).length>16384)return T(mt(),`error`);let a=!i&&n.match(It)?.[0].trim();if(a)return E(W({command:a}),ze({command:a}),()=>j(e,n));k(`input`,{text:n,as:e,confirmed:i},n)}function P(){let e=Ht(y),t=y.mark===`working`;u.placeholder=e??Pe({name:y.name}),d.disabled=b||!!e||!u.value.trim(),f.hidden=p.hidden=!t||!!e,f.disabled=p.disabled=b}async function F(e){if(!e.length||b)return;let t=Ht(y);if(t)return T(t,`error`);T(bt(),``);for(let t of e){if(t.size>20971520)return T(me({name:t.name}),`error`);let e=await a(t).catch(()=>void 0);if(!e?.ok||typeof e.body.path!=`string`)return T(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}T(``),C(),w(),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))}),v.addEventListener(`dragover`,e=>e.dataTransfer?.types.includes(`Files`)&&e.preventDefault()),v.addEventListener(`drop`,e=>{let t=[...e.dataTransfer?.files??[]];t.length&&(e.preventDefault(),F(t))}),v.addEventListener(`submit`,e=>(e.preventDefault(),j(`send`))),f.onclick=()=>j(`followUp`),p.onclick=()=>E(nt(),tt(),()=>void(b||k(`keys`,{keys:[`esc`]}))),u.addEventListener(`input`,()=>(C(),w(),P())),v.addEventListener(`keydown`,e=>{e.key===`Escape`&&!e.isComposing&&(x||e.target===u&&u.value)&&(e.preventDefault(),x&&(x=!1,T(``),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()),w(),Z.has(n)?A(Z.get(n)):S(()=>{let e=zt(sessionStorage.getItem(D));sessionStorage.removeItem(D),e&&T(e[1],e[0])}),{box:u,update:e=>(y=e,P()),ready:()=>!Ht(y)}}var Wt=`allow-forms allow-popups allow-popups-to-escape-sandbox`,Gt={},Kt=new Map;function qt(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 Jt=(e,t,n)=>e?.find(e=>qt(e.display,t)===qt(n,t));function Yt(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),Xt=(e,t)=>(e.failed=!0,Q(e,t,`error`)),Zt=e=>Gt.src?.(e)??`doc/${encodeURIComponent(e)}/`;function Qt(e){if([e.loaded,e.failed]=[e.card.revision,!1],Q(e,``),e.frame)return void(e.frame.src=Zt(e.card.cap));let t=e.card.cap,n=/\.(md|markdown)$/i.test(e.card.display),i=++e.seq;(Gt.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`},jt(At(t.text))):M(`pre`,{class:`doc-pre`},t.text)):Xt(e,se())),()=>e.seq!==i||Xt(e,r()))}function $t(e,t){let n=Kt.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:Wt,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:Zt(t.cap),target:`_blank`,rel:`noopener noreferrer`},Oe()),s=i??M(`div`,{class:`doc-text`},M(`p`,{class:`chat-empty`},ge())),c=M(`span`,{class:`term-state`,role:`status`}),l=M(`em`,{class:`doc-off`},we()),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)&&Qt(p))),f={id:`doc:${t.cap}`,title:`${r} · ${e}`,icon:`i-doc`,body:()=>u,closed:()=>(Kt.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&&Qt(p),l.hidden=t.onScreen,d.observe(u),Qt(p),Kt.set(t.cap,p),f}function en(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 Yt(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);tn(i)}function tn(e){for(let t of Kt.values()){let n=e.get(t.card.cap);if(!n){t.gone||Q(t,ce(),`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?Qt(t):n.revision!==t.loaded&&Q(t,le()))}}function nn(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:De({reason:e.reason})));return t.onclick=()=>r(e),t})),e.querySelector(`.d-docs-cut`).hidden=!n}var rn=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 an=()=>g(`<a class="token">${y}<span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></a>`);function on(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&&ee(t.mark)),_(e,t.mark),O(e.querySelector(`.plate`),t.role,t.mark,t.docs),v(e,`.name`,t.name),v(e,`.role`,T(t.role)),v(e,`.note`,S(t.note,t.mark))}var sn=()=>g(`<div class="col"><a class="token">${y}<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>`),cn=()=>`<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>${Ae()}</b><small>${je()}</small></h3><div class="formation"></div></section></div><p class="lost" hidden></p></div>`,ln=()=>`<div class="dossier-in"><span class="tag">${vt()}</span><div class="portrait">${y}</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-term" type="button" hidden>${ot()}</button><button class="cmp-link d-close" type="button" data-close="unit" hidden>${x()}</button><div class="d-docs" hidden><h4>${c()}</h4><div class="d-doc-list"></div><p class="d-docs-cut" hidden>${ue()}</p></div><div class="d-drones" hidden><h4>${V()}</h4><div class="formation"></div></div></div>`,un=()=>`<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><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 dn({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,y={},x,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`,b()));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(cn()));let e=s.firstElementChild,t=h?.bases.find(e=>e.id===R()),n=e.querySelector(`.lost`);if(n.hidden=!!t,n.textContent=h?_e():xt(),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&&ee(t.tower.mark))),v(e,`h2`,t.label),D(e.querySelector(`.spawn-btns button`),t),w(e.querySelector(`header .close-x`),t),v(e,`.title p`,t.tower?d({state:E[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),on(e.querySelector(`.token`),n,t.id);let r=e.querySelector(`.say`),i=y[n.key]??``;r.hidden=!i,v(r,`p`,i),C(e.querySelector(`.drones`),n.subs,an,(e,n)=>(e.classList.add(`drone`),on(e,n,t.id)))};C(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)=>{w(e.querySelector(`h3 .close-x`),t,n),v(e,`h3 b`,$e({label:n.label})),D(e.querySelector(`.tab-add`),t,n.id);let r=n.units.flatMap(e=>[e,...e.subs]);v(e,`h3 small`,_t({count:r.length})),_(e,[`waiting`,`error`,`working`].find(e=>r.some(t=>t.mark===e))??`idle`),C(e.querySelector(`.formation`),n.units,sn,o)});let c=(n,r)=>{let i=e.querySelector(`[data-group="${n}"]`);i.hidden=!r.length,C(i.querySelector(`.formation`),r,an,(e,n)=>on(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(ln()));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),v(e,`h3`,r?.name??M?.name??u.key),v(e,`.role`,T(r?.role??M?.role??`session`)),v(e,`.state`,r?S(r.note,a):xe());let o=e.querySelector(`.d-note`),s=M?.state;o.hidden=s!==`recent`&&s!==`unknown`,o.replaceChildren(s===`unknown`?Ce():Se()),M?.successor&&o.append(` ${rt()} `,z({view:`session`,ws:R(),key:M.successor},$(h,M.successor)?.u.name??ye()));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?fe({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=e.querySelector(`.d-term`),p=u.key,m=r?.name??M?.name??p;[f.hidden,f.onclick]=[!r?.control,()=>G(`term`)],c.querySelector(`.modes`)?.toggleAttribute(`hidden`,!r?.control);let y=e.querySelector(`.d-close`);Object.assign(y.dataset,{key:p,name:m,role:r?.role??``}),y.hidden=!r?.control||r.role===`subagent`,nn(e.querySelector(`.d-docs`),r?.docs,r?.docsCut,e=>n($t(m,e))),x?.docs();let b=e.querySelector(`.d-drones`);b.hidden=!r?.subs.length,C(b.querySelector(`.formation`),(r?.subs??[]).map(e=>({...e,id:e.key})),an,(e,t)=>(e.classList.add(`drone`),on(e,t,R())));let w=c.querySelector(`.comms-head`);if(w){v(w,`h2 span`,r?.name??M?.name??``),v(w,`p`,[t?.base.label,t?.squad&&$e({label:t.squad})].filter(Boolean).join(` · `));let e=w.querySelector(`.chan`),n=s===`live`||!s&&r;e.dataset.state=n?`live`:`closed`,v(e,`b`,n?re():s===`recent`?ne():be()),e.title=e.querySelector(`b`).textContent??``;let i=w.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`}ue(M?.todos),x?.setLive(a===`working`?`${S(r.note,a)}`:ee(a)?E[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 se=()=>setTimeout(()=>u.view===`session`&&(document.activeElement??document.body)===document.body&&(matchMedia(`(pointer: fine)`).matches&&I?.ready()?I.box:x?.log)?.focus({preventScroll:!0}));async function ce(t){let r=++F,{mountChat:i}=await te(async()=>{let{mountChat:e}=await import(`./chat-DD_Z_8cn.js`);return{mountChat:e}},__vite__mapDeps([0]),import.meta.url);if(r!==F||u.view!==`session`)return;c.replaceChildren(g(un()));let o=()=>$(h,t)?.u??{key:t,name:M?.name??t,role:M?.role??`member`,mark:`unknown`};x=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=Jt($(h,t)?.u.docs,M?.header?.cwd,e))=>r&&(()=>n($t(o().name,r)))});let s=e(t).post??Lt(t);[I,L]=[Ut(c.querySelector(`.composer-root`),t,s),a(c.querySelector(`.ask-root`),s,void 0,()=>G(`term`))],c.querySelectorAll(`.modes button`).forEach(e=>e.onclick=()=>G(e.dataset.mode)),U===`term`&&G(`term`),U=void 0,x.reveal(u.at),k.splice(0).forEach(le),V(),se()}function le(e){x?.apply(e);for(let t of e.items??[])t.kind===`assistant`&&([N,P]=[t.model??N,t.ctx??P])}function ue(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`);v(t,`summary b`,lt({done:n,total:e.length})),v(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 H,U,W=0;function G(e){if(u.view!==`session`)return;let t=u.key,n=c.querySelector(`.comms-in`);if(!n)return void(U=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`),H?.(),H=void 0,e!==`term`)return se();let a=++W;r(t,$(h,t)?.u.name??M?.name??t,i).then(e=>a===W&&u.view===`session`&&u.key===t?H=e:e())}let de=()=>(W++,H?.(),H=void 0),K=()=>(ie(),u.view===`workspace`?B():V());return{terminal(e){u.view===`session`&&u.key===e?G(`term`):U=`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)&&(y={}),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?([x,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">${ke()}</p>`)),ce(e.key)):e.view===`session`&&e.at!==i?(x?.reveal(e.at),se()):e.view!==`session`&&(F++,x=I=L=void 0),K(),e!==t&&oe(e,t,n)},net(e){h=e,en(e,j,u.view===`session`?u.key:void 0,(e,t)=>n($t(e,t),!1)),u.view!==`map`&&K()},cards(e){y={...y,...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<rn?void k.push(e):void(A=!0);x?le(e):k.push(e),V()}},wake(){if(A)return A=!1,k=[],t();k.splice(0).forEach(e=>x&&le(e)),K()}}}export{dn as mountFocus,At as n,jt as t};
|