pi-straw-boss 0.29.3 → 0.29.5

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.
@@ -0,0 +1 @@
1
+ import{C as e,F as t,_ as n}from"./index-D-LVSW44.js";var r=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案正在送出;請查看終端機。`:`Another answer is on its way; check the terminal.`),i=((e={},n={})=>(n.locale??t())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),a=((e={},n={})=>(n.locale??t())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),o=((e={},n={})=>(n.locale??t())===`zh-TW`?`已回答。`:`Answered.`),s=((e={},n={})=>(n.locale??t())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),c=((e={},n={})=>(n.locale??t())===`zh-TW`?`可以複選。`:`It takes several choices.`),l=((e={},n={})=>(n.locale??t())===`zh-TW`?`再次確認`:`Check again`),u=((e={},n={})=>(n.locale??t())===`zh-TW`?`選擇`:`Choices`),d=((e={},n={})=>(n.locale??t())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),f=((e={},n={})=>(n.locale??t())===`zh-TW`?`確認對話框只能在終端機,或在執行 GUI 的那台電腦的頁面上回答,已配對的裝置不能回答。這個頁面只能查看。`:`A confirmation can be answered only in the terminal or on the page of the computer the GUI runs on, not from a paired device. This page shows it read-only.`),p=((e={},n={})=>(n.locale??t())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),m=((e={},n={})=>(n.locale??t())===`zh-TW`?`複製指令`:`Copy command`);function h(e,t,n,r){if(typeof t!=`string`||n!==void 0&&!r)return new e(t,n);let i=h;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 g(e,t,n,r=!1){return h(Intl.PluralRules,e,n,r).select(Number(t)-Number(n?.offset??0))}var _=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),v=((e={},n={})=>(n.locale??t())===`zh-TW`?`未確認。請查看終端機。`:`Not confirmed. Check the terminal.`),y=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註`:`Note`),ee=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註(選填)`:`Note (optional)`),b=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,x=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,S=((e,n={})=>(n.locale??t())===`zh-TW`?x(e):b(e)),C=((e={},n={})=>(n.locale??t())===`zh-TW`?`選項`:`Options`),w=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),T=((e={},n={})=>(n.locale??t())===`zh-TW`?`你的答案`:`Your own answer`),E=((e={},n={})=>(n.locale??t())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),D=((e={},n={})=>(n.locale??t())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),O=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),k=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),A=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),j=((e={},n={})=>(n.locale??t())===`zh-TW`?`安全考量,遠端不支援輸入機密。請到執行 GUI 的那台電腦的終端機中回答。`:`For security, entering a secret is not supported remotely. Answer it in the terminal on the computer the GUI runs on.`),M=((e={},n={})=>(n.locale??t())===`zh-TW`?`機密內容只能在終端機輸入,這裡不接受。請到執行 GUI 的那台電腦的終端機中回答。`:`A secret is entered in the terminal only, not here. Answer it in the terminal on the computer the GUI runs on.`),N=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出答案`:`Send answer`),P=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出中…`:`Sending…`),F=((e={},n={})=>(n.locale??t())===`zh-TW`?`顯示終端機`:`Show terminal`),I=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),L=((e={},n={})=>(n.locale??t())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),R=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),z=((e={},n={})=>(n.locale??t())===`zh-TW`?`連不上伺服器。`:`The server could not be reached.`),B=((e={},n={})=>(n.locale??t())===`zh-TW`?`它在等待對話框。`:`It waits on a dialog.`),V={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1};function H(e,t,n,r,i){let{q:a}=n,o=r[a],s=V[e]??0,c=e===`ArrowUp`,l=c||e===`ArrowDown`,u=()=>({to:r.map((e,t)=>({q:(a+1+t)%r.length,part:`opt`})).find(e=>e.q!==a&&!i[e.q])??`send`});if(e===`Tab`)return t?n.part===`opt`&&a>0?{to:{q:a-1,part:`opt`}}:void 0:a<r.length-1?{to:{q:a+1,part:`opt`}}:void 0;if(!t){if(n.part===`opt`){let t=n.o+s;if(s)return t>=0&&t<o.options?{to:{q:a,part:`opt`,o:t},...o.multiple?{}:{pick:t}}:{to:s>0&&o.own?{q:a,part:`own`}:n};if(e===`Enter`||e===` `&&!o.multiple)return{...u(),...o.multiple?{}:{pick:n.o}}}else if(n.part===`own`){if(e===`Enter`)return u();if(l)return{to:c?{q:a,part:`opt`,o:o.options-1}:{q:a,part:`note`}}}else if(c)return{to:{q:a,part:`own`}}}}function U(e,t,n){let r=e=>Math.max(0,e.opts.findIndex(e=>e.getAttribute(`aria-checked`)===`true`)),i=(e,t)=>e.opts.forEach((e,n)=>e.setAttribute(`tabindex`,n===t?`0`:`-1`)),a=e=>{for(let[n,r]of t.entries()){let t=r.opts.indexOf(e);if(t>=0)return{q:n,part:`opt`,o:t};if(e===r.own||e===r.note)return{q:n,part:e===r.own?`own`:`note`}}};t.forEach(e=>i(e,r(e)));let o=e=>{let n=a(e.target);n?.part===`opt`&&i(t[n.q],n.o)};e.addEventListener(`focusin`,o),e.addEventListener(`click`,o);let s=!1;return e.addEventListener(`keydown`,e=>{let i=a(e.target);if(!i||e.ctrlKey||e.altKey||e.metaKey||e.isComposing)return;let o=e.target;if(i.part!==`opt`&&(e.key===`ArrowUp`?o.selectionStart!==0:e.key===`ArrowDown`&&o.selectionEnd!==o.value.length))return;let c=H(e.key,e.shiftKey,i,t.map(e=>({options:e.opts.length,multiple:e.multiple,own:!!e.own})),t.map(e=>e.answered()));if(!c||(e.preventDefault(),e.repeat&&[`Enter`,` `].includes(e.key)))return;if(s=e.key===` `,c.pick!==void 0){let e=t[i.q].opts[c.pick];e.getAttribute(`aria-checked`)!==`true`&&e.click()}let l=c.to===`send`?void 0:t[c.to.q],u=c.to===`send`?n():c.to.part===`opt`?l.opts[c.to.o??r(l)]:c.to.part===`own`?l.own:l.note;u&&!u.disabled&&u.focus()}),e.addEventListener(`keyup`,e=>s&&e.key===` `&&(s=!1,e.preventDefault())),()=>t[0]?.opts[r(t[0])]}var W=e=>e.multiple?c():e.freeform&&e.options.length?s():``,G=(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":C()},...e.options.map(e=>n(`li`,{class:`ask-opt`},n(`b`,null,e.title),e.description&&n(`small`,null,e.description)))),t&&W(e)&&n(`small`,{class:`ask-how`},W(e))),K=e=>e.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f\p{Cf}]/gu,`�`),q=(e,t)=>(e.select?.choices??[]).map((e,t)=>({...e,i:t})).filter(e=>!(t&&e.localOnly)),J=(e,t,n)=>({...e.size?{choices:[...e].sort((e,t)=>e-t)}:{},...t.trim()?{text:t}:{},...n.trim()?{note:n}:{}}),Y=(e,t)=>!!(t&&e?.select?.confirm),X=(e,t,n)=>({dialog:e.dialog,digest:e.digest,answerId:n,...t}),Z={digest:D,"not-allowed":k,malformed:O};function Q(t){let{outcome:n,reason:i,by:a}=t.body;return n===`accepted`?[`ok`,o()]:n===`stale`?[`error`,a===`local`?R():a===`cancel`?I():L()]:n===`rejected`?[`error`,(Object.hasOwn(Z,String(i))?Z[String(i)]:A)()]:n===`busy`?[`error`,r()]:n===`unknown`||t.status===504?[`error`,v(),!0]:[`error`,i??e({status:t.status})]}var te=e=>[`accepted`,`stale`,`busy`,`unknown`].includes(String(e.body.outcome))||e.status===504,$=e=>e.answer?`d\n${e.answer.dialog}\n${e.answer.digest}`:`c\n${e.callId}\n${e.why??``}`;function ne(e,t,r=location.hostname!==`127.0.0.1`,o,s){let c,h,g,b=!1,x=!1,D;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>h&&!h.el.contains(e.target)&&(h.lost=void 0));let O=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),k=()=>{if(!h)return;let e=document.activeElement;e&&e!==document.body&&e!==h.lost&&(h.lost=void 0),h.controls.forEach(e=>e.disabled=!b||x||h.done),h.send&&(h.send.disabled=!b||x||h.done||!h.pick()),e&&h.el.contains(e)&&e.disabled&&(h.lost=e);let t=h.lost;t&&!t.disabled&&h.el.contains(t)&&(!document.activeElement||document.activeElement===document.body)&&(t.focus(),h.lost=void 0)};async function A(e,r){[e.sending,x,e.spell]=[!0,!0,!1],k(),O(e.note,``,P());let i=await t(`answer`,r).catch(()=>void 0),a=n(`button`,{type:`button`,class:`cmp-link`},l());a.onclick=()=>void A(e,r);let[o,c,u]=i?Q(i):[`error`,v(),!0];[e.done,e.sending,x,e.busy]=[!i||te(i),!1,!1,i?.body.outcome===`busy`],O(e.note,o,c,...u?[a]:[]),k(),e.note.scrollIntoView?.({block:`nearest`}),s&&i?.body.outcome===`accepted`&&setTimeout(s,1200)}let I=(e,t,r,i,a)=>{let o=n(`button`,{type:`button`,class:`ask-opt`,role:e,"aria-checked":`false`},n(`b`,a?{"data-n":String(a)}:null,t),...r.filter(Boolean).map(e=>n(`small`,null,e)));return o.onclick=i,o};function L(e,t){let i,a=q(t,r).map(e=>I(`radio`,K(e.label),[e.note&&K(e.note)],()=>(i=e.i,a.forEach((n,i)=>n.setAttribute(`aria-checked`,String(q(t,r)[i].i===e.i))),k()),e.i+1)),o=t.select?.copy!==void 0&&n(`button`,{type:`button`,class:`cmp-link`},m());return o&&(o.disabled=!navigator.clipboard,o.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>O(e.note,`ok`,p()),()=>O(e.note,`error`,d()))),e.pick=()=>i===void 0?void 0:{choice:i},e.first=U(e.el,[{opts:a,multiple:!1,answered:()=>i!==void 0}],()=>e.send),e.controls=a,[n(`pre`,{class:`ask-title`},K(t.select.title)),n(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":u()},...a),n(`div`,{class:`ask-acts`},e.send,o)]}function R(e,t){let r=t.questions.map(()=>({picks:new Set,text:n(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:E(),"aria-label":T()}),note:n(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:ee(),"aria-label":y()})})),i=[],a=t.questions.map((t,a)=>{let o=r[a],s=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>I(s,e.title,[e.description,e.preview&&_()],()=>{t.multiple||(o.picks.clear(),o.text.value=``),o.picks.has(n)?o.picks.delete(n):o.picks.add(n),c.forEach((e,t)=>e.setAttribute(`aria-checked`,String(o.picks.has(t)))),k()}));return o.text.oninput=()=>(t.multiple||(o.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),k()),e.controls.push(...c,o.text,o.note),i.push({opts:c,multiple:!!t.multiple,own:o.text,note:o.note,answered:()=>o.picks.size>0||o.text.value.trim()!==``}),n(`div`,{class:`ask-one`},t.header&&n(`b`,{class:`ask-head`},t.header),n(`p`,{class:`ask-q`},t.question),n(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":C()},...c),o.text,o.note)});return e.pick=()=>r.every(e=>e.picks.size||e.text.value.trim())?{answers:r.map(e=>J(e.picks,e.text.value,e.note.value))}:void 0,e.first=U(e.el,i,()=>e.send),[...a,n(`div`,{class:`ask-acts`},e.send)]}function z(e){let t=e.asks??(e.ask?[e.ask]:[]),s=t.length>1,c=Y(e.answer,r)?void 0:e.answer,l={key:$(e),el:n(`section`,{class:`ask`}),note:n(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};c&&((l.send=n(`button`,{type:`button`,class:`ask-send`},N())).onclick=()=>void(l.pick()&&A(l,X(c,l.pick(),crypto.randomUUID()))));let u=e.tool===`secret_drop`,d=n(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${s?a():i()} ${s||!t[0]?``:W(t[0])}`.trim()),p=o&&e.tool!==`secret_drop`&&n(`button`,{type:`button`,class:`cmp-link`},F());p&&(p.onclick=o);let m=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[n(`p`,{class:`ask-why`},S({tool:e.tool}))]:[];return l.el.append(...m,...c&&!u?c.select?L(l,c):R(l,c):[...t.length?t.map(e=>G(e,s)):e.answer?.select?[n(`pre`,{class:`ask-title`},K(e.answer.select.title)),n(`p`,{class:`ask-why`},f())]:[n(`p`,{class:`ask-why`},u?r?j():M():e.why??B())],n(`div`,{class:`ask-acts`},u?n(`p`,{class:`ask-term`},i()):d,p)],l.note),l}let V=(t,n)=>{let r=document.activeElement;h&&h!==n&&(h.focus=h.el.contains(r)?r:void 0),[c,h,g]=[t,n,n?.send?n:g],e.replaceChildren(...n?[n.el]:[]),k(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=h&&!h.done?h.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},update(e,t){b=t,e&&(D=void clearTimeout(D)),!e&&(h?.done||h?.sending)?D??=setTimeout(()=>(D=void 0,V()),6e3):e?h&&($(e)===h.key||!e.answer&&(h.done||h.sending)&&e.callId===c?.callId)?((h.busy||h.sending)&&!e.answer?h.spell=!0:h.busy&&h.spell&&e.answer&&([h.done,h.busy]=[!1,!1],O(h.note,``,w())),c=e):V(e,g?.key===$(e)&&!g.done?g:z(e)):V(),k()}}}export{g as a,P as i,Y as n,z as r,ne as t};
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-Br2ViD0U.css"])))=>i.map(i=>d[i]);
2
- import{F as e,_ as t,g as n,t as r,u as i,v as a}from"./index-DS51Ucw0.js";import{n as o,t as s}from"./views-Br67IVc3.js";var c=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),u=e=>`context compacted · ${e?.tokens} tokens summarized`,d=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,f=((t,n={})=>(n.locale??e())===`zh-TW`?d(t):u(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,te=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),h=e=>`Image ${e?.n}`,g=e=>`圖片 ${e?.n}`,_=((t,n={})=>(n.locale??e())===`zh-TW`?g(t):h(t)),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),y=e=>`${e?.count} image(s)`,b=e=>`${e?.count} 張圖片`,ne=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),re=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),S=e=>`${e?.count} new`,C=e=>`${e?.count} 則新訊息`,w=((t,n={})=>(n.locale??e())===`zh-TW`?C(t):S(t)),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),N=e=>`Open image ${e?.n}`,P=e=>`打開圖片 ${e?.n}`,oe=((t,n={})=>(n.locale??e())===`zh-TW`?P(t):N(t)),F=e=>`show all (${e?.size})`,I=e=>`顯示全部(${e?.size})`,L=((t,n={})=>(n.locale??e())===`zh-TW`?I(t):F(t)),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),z=e=>`◇ thought · ${e?.count} chars`,B=e=>`◇ 思考 · ${e?.count} 字元`,se=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function ue(){let e=!0,t=0;return{get pinned(){return e},scrolled(n){e=n,n&&(t=0)},hold:()=>void(e=!1),arrived(n){return e||(t+=n),e},jump:()=>void(e=!0,t=0),button:n=>e&&!n?void 0:t&&!n?w({count:t}):x()}}async function de(e,t,n,r){let i=()=>e.items.some(e=>e.id===n);for(;!i()&&e.before;)r(e.prepend(await t.older(e.before)));return i()?!0:(r(e.reset(await t.latest())),!1)}function fe(e=600){let t=[],n,r=!1,i=new Set,a=new Map,o=new Map,s=e=>e.forEach(e=>(i.delete(e.id),e.tools?.forEach(e=>(o.delete(e.id),a.delete(e.id)))));function c(e,t){let n=[];for(let r of e)i.has(r.id)||(i.add(r.id),r.kind===`result`&&r.callId?(a.set(r.callId,r),o.has(r.callId)&&t.add(o.get(r.callId))):(r.tools?.forEach(e=>o.set(e.id,r.id)),n.push(r)));return n}let l=e=>({rebuild:!1,added:[],touched:[],dropped:[],front:!1,...e});return{get items(){return t},get before(){return n},get detached(){return r},result:e=>a.get(e),reset(e){return[t,n,r]=[[],e.before,!1],i.clear(),a.clear(),o.clear(),t=c(e.items,new Set),l({rebuild:!0,added:t})},append(i){if(r)return l({});let a=new Set,o=c(i,a);t.push(...o);let u=t.length>e?t.splice(0,t.length-e):[];return s(u),u.length&&(n=t[0].id),l({added:o,touched:[...a],dropped:u.map(e=>e.id)})},prepend(i){let a=new Set,o=c(i.items,a);t.unshift(...o),n=i.before;let u=t.length>e?t.splice(e):[];return s(u),u.length&&(r=!0),l({added:o,touched:[...a],dropped:u.map(e=>e.id),front:!0})}}}var pe=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,me=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,he={intercom_message:D,subagent_result:j,subagent_ping:A,subagent_status:M,"pi-loop-monitor":k,"memory-context":O,"doc-review":E},H=e=>{let t=i(`<span class="ava"><svg><use/></svg></span>`);return t.querySelector(`use`).setAttribute(`href`,`#i-${r[e]??e}`),t};function ge(e){let n=[],r=0;for(let i of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))n.push(e.slice(r,i.index),t(`a`,{href:i[0],rel:`noopener noreferrer`,target:`_blank`},i[0])),r=i.index+i[0].length;return[...n,e.slice(r)]}function U(e,r,{who:i,link:u,docFor:d}){let p=fe(),m=new Map,h=new Set,g=()=>h.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>d?.(e))):e.shown&&h.delete(e)),y=t(`div`,{class:`chat-list`}),b=t(`div`,{class:`chat-top`}),x=t(`div`,{class:`chat-live`}),S=t(`div`,{class:`chat-end`}),C=t(`button`,{class:`chat-pill`,type:`button`,hidden:``}),w=t(`p`,{class:`chat-empty`},T()),E=t(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":l()},b,y,x,S);e.replaceChildren(E,C);let D=ue(),O=!1,k=!1,A,j,M=0,N=!1,P,F=()=>N||P!==void 0,I=()=>(clearTimeout(P),P=setTimeout(()=>(P=void 0,D.pinned&&!p.detached&&B()),250)),z=(e=D.button(p.detached))=>(C.hidden=!e,C.textContent=e??``),B=()=>(D.jump(),j=void 0,E.scrollTop=E.scrollHeight,z());async function U(e){O=!0;let t=await de(p,r,e,e=>(J(e),Y(e))).finally(()=>O=!1),n=m.get(e);if(A===e){if(!t||!n)return B();D.hold(),j=n,n.scrollIntoView({block:`center`}),a(n,`lit`),clearTimeout(M),M=window.setTimeout(()=>(j=void 0,n.classList.remove(`lit`)),2e3),z()}}let W=()=>A?void U(A):B(),G=(e,t,n,i)=>{e.disabled=!0,r.entry(n).then(n=>{let r=n&&i(n);if(r===void 0)return void(e.textContent=V());t.textContent=r,e.remove()},()=>e.textContent=V())};function K(e,i=0){if(!i||!r.pic)return null;let a=Array.from({length:i},(t,n)=>r.pic(e,n));return t(`div`,{class:`pics`},...a.map((e,r)=>{let i=t(`img`,{src:e,alt:_({n:r+1}),loading:`lazy`,decoding:`async`}),o=t(`button`,{type:`button`,class:`pic`,"aria-label":oe({n:r+1})},i);return i.addEventListener(`error`,()=>o.replaceWith(t(`em`,{class:`pic-gone`},v()))),o.addEventListener(`click`,()=>void n(async()=>{let{lightbox:e}=await import(`./lightbox-cl8f6APW.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,r))),o}))}function _e(e,n){let r=p.result(e.id),i=t(`pre`,{class:`out`},r?.text??``),a=t(`pre`,{class:`args`},e.args??``),o=e.cut?t(`button`,{class:`more`,type:`button`},R()):null;o?.addEventListener(`click`,()=>G(o,a,n,t=>(e=>e&&`${e.args??``}${e.cut?`\n${ee()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=r?.more?t(`button`,{class:`more`,type:`button`},L({size:me(r.bytes??0)})):null;s?.addEventListener(`click`,()=>G(s,i,r.id,e=>e.text));let c=e.name===`show_doc`&&d?t(`button`,{class:`more open`,type:`button`,hidden:``},ae()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>d?.(e)?.()))),c&&h.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(g);let l=t(`details`,{class:`act`},t(`summary`,{"data-mark":r?r.isError?`error`:`done`:`working`},t(`b`,{class:`badge`}),t(`code`,null,e.name),t(`span`,{class:`sum`},e.summary),c),a,o,r&&t(`div`,{class:`result`},r.images?t(`em`,null,ne({count:r.images})):null,i,s)),u=r&&K(r.id,r.images);return u?[l,u]:[l]}function q(e){let n=t(`time`,null,pe(e.at));switch(e.kind){case`user`:return t(`article`,{class:`tx you`},t(`header`,null,n,t(`b`,null,le()),H(`user`)),t(`div`,{class:`bubble`},...ge(e.text??``),K(e.id,e.images)));case`assistant`:{let r=i(),a=t(`pre`,{class:`thought-text`}),c=e.thought?t(`button`,{class:`thought`,type:`button`},e.thought<0?ce():se({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>G(c,a,e.id,e=>e.thoughtText)),t(`article`,{class:`tx in`},H(r.role),t(`div`,{class:`tx-body`},t(`header`,null,t(`b`,null,r.name),e.model?t(`span`,null,e.model):null,n,e.stop?t(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,a,e.text?t(`div`,{class:`md`},s(o(e.text))):null,e.error?t(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>_e(t,e.id))))}case`bash`:return t(`article`,{class:`tx sys`},t(`details`,{class:`act`},t(`summary`,{"data-mark":e.exit?`error`:`done`},t(`b`,{class:`badge`}),t(`code`,null,`shell`),t(`span`,{class:`sum`},`! ${e.command}`),e.exit?t(`span`,{class:`stop`,"data-mark":`error`},te({code:e.exit})):null),e.text?t(`pre`,{class:`out`},e.text):null));case`notice`:return t(`article`,{class:`tx sys`},t(`details`,{class:`notice`},t(`summary`,null,H(`comms`),t(`em`,null,re()),he[e.type??``]?.()??e.type??ie(),` `,e.from&&u(e.from)||(e.from??``),n),t(`pre`,null,e.text??``)));case`divider`:return t(`article`,{class:`tx rule`},t(`details`,null,t(`summary`,null,e.type===`compaction`?f({tokens:(e.tokens??0).toLocaleString()}):c()),t(`pre`,null,e.text??``)));default:return t(`article`,{class:`tx note`},e.text??``,` `,n)}}function J(e){e.rebuild&&(m.clear(),y.replaceChildren());for(let t of e.dropped)m.get(t)?.remove(),m.delete(t);let t=e.added.map(e=>(m.set(e.id,q(e)),m.get(e.id)));e.front?y.prepend(...t):y.append(...t),k&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),w.remove(),p.items.length||y.append(w),b.hidden=!p.before}let Y=e=>e.touched.forEach(e=>{let t=m.get(e),n=p.items.find(t=>t.id===e);if(t&&n){let r=q(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),m.set(e,r)}}),X=async()=>{if(!O&&p.before&&k){O=!0;try{let e=E.scrollHeight,t=p.prepend(await r.older(p.before));J(t),Y(t),E.scrollTop+=E.scrollHeight-e}finally{O=!1}p.before&&E.clientHeight&&b.getBoundingClientRect().bottom>=E.getBoundingClientRect().top&&X()}};C.addEventListener(`click`,()=>{A=void 0,p.detached?r.latest().then(e=>(J(p.reset(e)),B())):B()});let Z=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void X(),{root:E}),new IntersectionObserver(e=>E.clientHeight&&(D.scrolled(e.at(-1).isIntersecting),z()),{root:E,rootMargin:`0px 0px 67px`})],Q,ve=()=>(Q??(Z[0].observe(b),Z[1].observe(S)),clearTimeout(Q),Q=setTimeout(()=>(Q=void 0,Z.forEach(e=>e.disconnect())),600));E.addEventListener(`scroll`,()=>(ve(),!N&&P!==void 0&&I()),{passive:!0}),E.addEventListener(`touchstart`,()=>(N=!0,clearTimeout(P),P=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])E.addEventListener(e,()=>(N=!1,I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])E.addEventListener(e,()=>j=A=void 0,{passive:!0});let $=new ResizeObserver(()=>F()?void 0:D.pinned&&!p.detached?E.scrollTop=E.scrollHeight:j?.scrollIntoView({block:`center`}));return $.observe(y),$.observe(E),{log:E,docs:g,apply(e){if(e.reset)J(p.reset({items:e.items??[],before:e.before})),k=!0,W();else if(e.items?.length){let t=p.append(e.items);J(t),Y(t),D.arrived(t.added.length)&&!p.detached&&!F()?B():z()}},reveal(e){A=e,k&&W()},setLive(e,n){x.dataset.mark=n,x.lastChild?.textContent!==e&&x.replaceChildren(...e?[t(`b`,{class:`badge`}),t(`span`,null,e)]:[])}}}export{U as mountChat,_ as t};
2
+ import{F as e,_ as t,g as n,t as r,u as i,v as a}from"./index-D-LVSW44.js";import{n as o,t as s}from"./views-Bcg0APim.js";var c=((t={},n={})=>(n.locale??e())===`zh-TW`?`分支摘要`:`branch summary`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊紀錄`:`Comms log`),u=e=>`context compacted · ${e?.tokens} tokens summarized`,d=e=>`上下文已壓縮 · 摘要了 ${e?.tokens} tokens`,f=((t,n={})=>(n.locale??e())===`zh-TW`?d(t):u(t)),ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`…(於 1 MB 截斷)`:`… (cut at 1 MB)`),p=e=>`exit ${e?.code}`,m=e=>`結束碼 ${e?.code}`,te=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),h=e=>`Image ${e?.n}`,g=e=>`圖片 ${e?.n}`,_=((t,n={})=>(n.locale??e())===`zh-TW`?g(t):h(t)),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`圖片無法讀取`:`Image unavailable`),y=e=>`${e?.count} image(s)`,b=e=>`${e?.count} 張圖片`,ne=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),re=((t={},n={})=>(n.locale??e())===`zh-TW`?`收到`:`incoming`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`跳到最新`:`jump to latest`),S=e=>`${e?.count} new`,C=e=>`${e?.count} 則新訊息`,w=((t,n={})=>(n.locale??e())===`zh-TW`?C(t):S(t)),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`還沒有通訊。`:`No transmissions yet.`),ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`通知`:`notice`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`表單回覆`:`form answers`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息,來自`:`message from`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`記憶`:`memory`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`監看`:`monitor`),A=((t={},n={})=>(n.locale??e())===`zh-TW`?`提問,來自`:`question from`),j=((t={},n={})=>(n.locale??e())===`zh-TW`?`回報,來自`:`report from`),M=((t={},n={})=>(n.locale??e())===`zh-TW`?`狀態:`:`status of`),ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`在旁開啟`:`open beside`),N=e=>`Open image ${e?.n}`,P=e=>`打開圖片 ${e?.n}`,oe=((t,n={})=>(n.locale??e())===`zh-TW`?P(t):N(t)),F=e=>`show all (${e?.size})`,I=e=>`顯示全部(${e?.size})`,L=((t,n={})=>(n.locale??e())===`zh-TW`?I(t):F(t)),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示全部參數`:`show all arguments`),z=e=>`◇ thought · ${e?.count} chars`,B=e=>`◇ 思考 · ${e?.count} 字元`,se=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`◇ 思考 · 已遮蔽`:`◇ thought · redacted`),V=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得`:`unavailable`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`你`:`you`);function ue(){let e=!0,t=0;return{get pinned(){return e},scrolled(n){e=n,n&&(t=0)},hold:()=>void(e=!1),arrived(n){return e||(t+=n),e},jump:()=>void(e=!0,t=0),button:n=>e&&!n?void 0:t&&!n?w({count:t}):x()}}async function de(e,t,n,r){let i=()=>e.items.some(e=>e.id===n);for(;!i()&&e.before;)r(e.prepend(await t.older(e.before)));return i()?!0:(r(e.reset(await t.latest())),!1)}function fe(e=600){let t=[],n,r=!1,i=new Set,a=new Map,o=new Map,s=e=>e.forEach(e=>(i.delete(e.id),e.tools?.forEach(e=>(o.delete(e.id),a.delete(e.id)))));function c(e,t){let n=[];for(let r of e)i.has(r.id)||(i.add(r.id),r.kind===`result`&&r.callId?(a.set(r.callId,r),o.has(r.callId)&&t.add(o.get(r.callId))):(r.tools?.forEach(e=>o.set(e.id,r.id)),n.push(r)));return n}let l=e=>({rebuild:!1,added:[],touched:[],dropped:[],front:!1,...e});return{get items(){return t},get before(){return n},get detached(){return r},result:e=>a.get(e),reset(e){return[t,n,r]=[[],e.before,!1],i.clear(),a.clear(),o.clear(),t=c(e.items,new Set),l({rebuild:!0,added:t})},append(i){if(r)return l({});let a=new Set,o=c(i,a);t.push(...o);let u=t.length>e?t.splice(0,t.length-e):[];return s(u),u.length&&(n=t[0].id),l({added:o,touched:[...a],dropped:u.map(e=>e.id)})},prepend(i){let a=new Set,o=c(i.items,a);t.unshift(...o),n=i.before;let u=t.length>e?t.splice(e):[];return s(u),u.length&&(r=!0),l({added:o,touched:[...a],dropped:u.map(e=>e.id),front:!0})}}}var pe=e=>e?new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``,me=e=>e>=1024?`${(e/1024).toFixed(e>=10240?0:1)} KB`:`${e} B`,he={intercom_message:D,subagent_result:j,subagent_ping:A,subagent_status:M,"pi-loop-monitor":k,"memory-context":O,"doc-review":E},H=e=>{let t=i(`<span class="ava"><svg><use/></svg></span>`);return t.querySelector(`use`).setAttribute(`href`,`#i-${r[e]??e}`),t};function ge(e){let n=[],r=0;for(let i of e.matchAll(/https?:\/\/[^\s<>)\]]+/g))n.push(e.slice(r,i.index),t(`a`,{href:i[0],rel:`noopener noreferrer`,target:`_blank`},i[0])),r=i.index+i[0].length;return[...n,e.slice(r)]}function U(e,r,{who:i,link:u,docFor:d}){let p=fe(),m=new Map,h=new Set,g=()=>h.forEach(e=>e.button.isConnected?(e.shown=!0,e.button.hidden=!e.paths.some(e=>d?.(e))):e.shown&&h.delete(e)),y=t(`div`,{class:`chat-list`}),b=t(`div`,{class:`chat-top`}),x=t(`div`,{class:`chat-live`}),S=t(`div`,{class:`chat-end`}),C=t(`button`,{class:`chat-pill`,type:`button`,hidden:``}),w=t(`p`,{class:`chat-empty`},T()),E=t(`div`,{class:`chat-scroll`,tabindex:`-1`,"aria-label":l()},b,y,x,S);e.replaceChildren(E,C);let D=ue(),O=!1,k=!1,A,j,M=0,N=!1,P,F=()=>N||P!==void 0,I=()=>(clearTimeout(P),P=setTimeout(()=>(P=void 0,D.pinned&&!p.detached&&B()),250)),z=(e=D.button(p.detached))=>(C.hidden=!e,C.textContent=e??``),B=()=>(D.jump(),j=void 0,E.scrollTop=E.scrollHeight,z());async function U(e){O=!0;let t=await de(p,r,e,e=>(J(e),Y(e))).finally(()=>O=!1),n=m.get(e);if(A===e){if(!t||!n)return B();D.hold(),j=n,n.scrollIntoView({block:`center`}),a(n,`lit`),clearTimeout(M),M=window.setTimeout(()=>(j=void 0,n.classList.remove(`lit`)),2e3),z()}}let W=()=>A?void U(A):B(),G=(e,t,n,i)=>{e.disabled=!0,r.entry(n).then(n=>{let r=n&&i(n);if(r===void 0)return void(e.textContent=V());t.textContent=r,e.remove()},()=>e.textContent=V())};function K(e,i=0){if(!i||!r.pic)return null;let a=Array.from({length:i},(t,n)=>r.pic(e,n));return t(`div`,{class:`pics`},...a.map((e,r)=>{let i=t(`img`,{src:e,alt:_({n:r+1}),loading:`lazy`,decoding:`async`}),o=t(`button`,{type:`button`,class:`pic`,"aria-label":oe({n:r+1})},i);return i.addEventListener(`error`,()=>o.replaceWith(t(`em`,{class:`pic-gone`},v()))),o.addEventListener(`click`,()=>void n(async()=>{let{lightbox:e}=await import(`./lightbox-Dt6sU9So.js`);return{lightbox:e}},__vite__mapDeps([0]),import.meta.url).then(({lightbox:e})=>e(a,r))),o}))}function _e(e,n){let r=p.result(e.id),i=t(`pre`,{class:`out`},r?.text??``),a=t(`pre`,{class:`args`},e.args??``),o=e.cut?t(`button`,{class:`more`,type:`button`},R()):null;o?.addEventListener(`click`,()=>G(o,a,n,t=>(e=>e&&`${e.args??``}${e.cut?`\n${ee()}`:``}`)(t.tools?.find(t=>t.id===e.id))));let s=r?.more?t(`button`,{class:`more`,type:`button`},L({size:me(r.bytes??0)})):null;s?.addEventListener(`click`,()=>G(s,i,r.id,e=>e.text));let c=e.name===`show_doc`&&d?t(`button`,{class:`more open`,type:`button`,hidden:``},ae()):null;c?.addEventListener(`click`,t=>(t.preventDefault(),e.summary.split(`, `).forEach(e=>d?.(e)?.()))),c&&h.add({paths:e.summary.split(`, `),button:c}),c&&queueMicrotask(g);let l=t(`details`,{class:`act`},t(`summary`,{"data-mark":r?r.isError?`error`:`done`:`working`},t(`b`,{class:`badge`}),t(`code`,null,e.name),t(`span`,{class:`sum`},e.summary),c),a,o,r&&t(`div`,{class:`result`},r.images?t(`em`,null,ne({count:r.images})):null,i,s)),u=r&&K(r.id,r.images);return u?[l,u]:[l]}function q(e){let n=t(`time`,null,pe(e.at));switch(e.kind){case`user`:return t(`article`,{class:`tx you`},t(`header`,null,n,t(`b`,null,le()),H(`user`)),t(`div`,{class:`bubble`},...ge(e.text??``),K(e.id,e.images)));case`assistant`:{let r=i(),a=t(`pre`,{class:`thought-text`}),c=e.thought?t(`button`,{class:`thought`,type:`button`},e.thought<0?ce():se({count:e.thought.toLocaleString()})):null;return e.thought&&e.thought>0&&c?.addEventListener(`click`,()=>G(c,a,e.id,e=>e.thoughtText)),t(`article`,{class:`tx in`},H(r.role),t(`div`,{class:`tx-body`},t(`header`,null,t(`b`,null,r.name),e.model?t(`span`,null,e.model):null,n,e.stop?t(`span`,{class:`stop`,"data-mark":`error`},e.stop):null),c,a,e.text?t(`div`,{class:`md`},s(o(e.text))):null,e.error?t(`p`,{class:`fault`},e.error):null,...(e.tools??[]).flatMap(t=>_e(t,e.id))))}case`bash`:return t(`article`,{class:`tx sys`},t(`details`,{class:`act`},t(`summary`,{"data-mark":e.exit?`error`:`done`},t(`b`,{class:`badge`}),t(`code`,null,`shell`),t(`span`,{class:`sum`},`! ${e.command}`),e.exit?t(`span`,{class:`stop`,"data-mark":`error`},te({code:e.exit})):null),e.text?t(`pre`,{class:`out`},e.text):null));case`notice`:return t(`article`,{class:`tx sys`},t(`details`,{class:`notice`},t(`summary`,null,H(`comms`),t(`em`,null,re()),he[e.type??``]?.()??e.type??ie(),` `,e.from&&u(e.from)||(e.from??``),n),t(`pre`,null,e.text??``)));case`divider`:return t(`article`,{class:`tx rule`},t(`details`,null,t(`summary`,null,e.type===`compaction`?f({tokens:(e.tokens??0).toLocaleString()}):c()),t(`pre`,null,e.text??``)));default:return t(`article`,{class:`tx note`},e.text??``,` `,n)}}function J(e){e.rebuild&&(m.clear(),y.replaceChildren());for(let t of e.dropped)m.get(t)?.remove(),m.delete(t);let t=e.added.map(e=>(m.set(e.id,q(e)),m.get(e.id)));e.front?y.prepend(...t):y.append(...t),k&&!e.front&&!e.rebuild&&t.forEach(e=>(e.classList.add(`fresh`),e.dataset.born=String(Date.now()))),w.remove(),p.items.length||y.append(w),b.hidden=!p.before}let Y=e=>e.touched.forEach(e=>{let t=m.get(e),n=p.items.find(t=>t.id===e);if(t&&n){let r=q(n);t.classList.contains(`fresh`)&&Date.now()-Number(t.dataset.born??0)<400&&r.classList.add(`fresh`),t.replaceWith(r),m.set(e,r)}}),X=async()=>{if(!O&&p.before&&k){O=!0;try{let e=E.scrollHeight,t=p.prepend(await r.older(p.before));J(t),Y(t),E.scrollTop+=E.scrollHeight-e}finally{O=!1}p.before&&E.clientHeight&&b.getBoundingClientRect().bottom>=E.getBoundingClientRect().top&&X()}};C.addEventListener(`click`,()=>{A=void 0,p.detached?r.latest().then(e=>(J(p.reset(e)),B())):B()});let Z=[new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&void X(),{root:E}),new IntersectionObserver(e=>E.clientHeight&&(D.scrolled(e.at(-1).isIntersecting),z()),{root:E,rootMargin:`0px 0px 67px`})],Q,ve=()=>(Q??(Z[0].observe(b),Z[1].observe(S)),clearTimeout(Q),Q=setTimeout(()=>(Q=void 0,Z.forEach(e=>e.disconnect())),600));E.addEventListener(`scroll`,()=>(ve(),!N&&P!==void 0&&I()),{passive:!0}),E.addEventListener(`touchstart`,()=>(N=!0,clearTimeout(P),P=void 0),{passive:!0});for(let e of[`touchend`,`touchcancel`])E.addEventListener(e,()=>(N=!1,I()),{passive:!0});for(let e of[`wheel`,`touchstart`,`pointerdown`,`keydown`])E.addEventListener(e,()=>j=A=void 0,{passive:!0});let $=new ResizeObserver(()=>F()?void 0:D.pinned&&!p.detached?E.scrollTop=E.scrollHeight:j?.scrollIntoView({block:`center`}));return $.observe(y),$.observe(E),{log:E,docs:g,apply(e){if(e.reset)J(p.reset({items:e.items??[],before:e.before})),k=!0,W();else if(e.items?.length){let t=p.append(e.items);J(t),Y(t),D.arrived(t.added.length)&&!p.detached&&!F()?B():z()}},reveal(e){A=e,k&&W()},setLive(e,n){x.dataset.mark=n,x.lastChild?.textContent!==e&&x.replaceChildren(...e?[t(`b`,{class:`badge`}),t(`span`,null,e)]:[])}}}export{U as mountChat,_ as t};
@@ -0,0 +1 @@
1
+ var e={},t=[`en`,`zh-TW`],n=`PARAGLIDE_LOCALE`,r=[`baseLocale`],i=[],a=typeof window>`u`;globalThis.__paraglide=globalThis.__paraglide??{},globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};var o=!1,s=()=>{let e=r;!a&&typeof window<`u`&&window.location?.href&&(e=ue(window.location.href));let t=c(e,typeof window<`u`?window.location?.href:void 0);if(t)return o||(o=!0,d(t,{reload:!1})),t;throw Error(`No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found`)};function c(e,t){let n;for(let t of e){if(t===`baseLocale`)n=`en`;else if(de(t)&&_.has(t)){let e=_.get(t);if(e){let t=e.getLocale();if(t instanceof Promise)continue;if(t!==void 0)return m(t)}}let e=p(n);if(e)return e}}var l=e=>{s=e},u=e=>{e?window.location.href=e:window.location.reload()},d=(e,t)=>{let n={reload:!0,...t},i;try{i=s()}catch{}let o=[],c=r;!a&&typeof window<`u`&&window.location?.href&&(c=ue(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(de(t)&&_.has(t)){let n=_.get(t);if(n){let r=n.setLocale(e);r instanceof Promise&&(r=r.catch(e=>{throw Error(`Custom strategy "${t}" setLocale failed.`,{cause:e})}),o.push(r))}}let l=()=>{!a&&n.reload&&window.location&&e!==i&&u(void 0)};if(o.length)return Promise.all(o).then(()=>{l()});l()},f=()=>typeof window<`u`?window.location.origin:`http://fallback.com`;function p(e){if(typeof e!=`string`)return;let n=e.toLowerCase();for(let e of t)if(e.toLowerCase()===n)return e}function m(e){let n=p(e);if(n)return n;throw Error(`Invalid locale: ${e}. Expected one of: ${t.join(`, `)}`)}function h(e){return e}function g(t,n){return new e(t,n.href)}function ee(){return 0}function te(e){return i}function ne(e,t){return e.exec(t.href)}var re=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${re}=([^;]*)`);function ie(e){return ae(e)}function ae(e){let t=h(typeof e==`string`?new URL(e,f()):new URL(e.href)),n=t.pathname.replace(/^\/+/,``).split(`/`);return n.length>0&&p(n[0])&&(t.pathname=`/`+n.slice(1).join(`/`)),h(t)}var oe=-1,se,ce;function le(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=ee();if(se===t&&oe===n)return ce;let r=h(new URL(t,`http://example.com`)),a=ie(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of te(e))if(ne(g(t.match,e),e)){s=t;break}if(s)break}return oe=n,se=t,ce=s,s}function ue(e){let t=le(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var _=new Map;function de(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}var fe=((e={},t={})=>(t.locale??s())===`zh-TW`?`警示`:`Alerts`),pe=((e={},t={})=>(t.locale??s())===`zh-TW`?`所有基地`:`all bases`),me=((e={},t={})=>(t.locale??s())===`zh-TW`?``:`.`),he=((e={},t={})=>(t.locale??s())===`zh-TW`?`最後更新:`:`Last update`),ge=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,_e=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,ve=((e,t={})=>(t.locale??s())===`zh-TW`?_e(e):ge(e)),ye=e=>`The server is up but cannot read the net: ${e?.problem}`,be=e=>`伺服器正常,但讀不到網:${e?.problem}`,xe=((e,t={})=>(t.locale??s())===`zh-TW`?be(e):ye(e)),Se=((e={},t={})=>(t.locale??s())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),Ce=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,we=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,Te=((e,t={})=>(t.locale??s())===`zh-TW`?we(e):Ce(e)),Ee=((e={},t={})=>(t.locale??s())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),De=((e={},t={})=>(t.locale??s())===`zh-TW`?`取消`:`Cancel`),Oe=((e={},t={})=>(t.locale??s())===`zh-TW`?`關閉`:`Close`),ke=e=>`Quit base ${e?.name}`,Ae=e=>`關掉基地 ${e?.name}`,je=((e,t={})=>(t.locale??s())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Quit base ${e?.name}? Every agent in it and its tower quit.`,Ne=e=>`要關掉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。`,Pe=((e,t={})=>(t.locale??s())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Quit squad ${e?.name}`,Ie=e=>`關掉小隊 ${e?.name}`,Le=((e,t={})=>(t.locale??s())===`zh-TW`?Ie(e):Fe(e)),Re=e=>`Quit squad ${e?.name}? Every agent in it quits.`,ze=e=>`要關掉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,Be=((e,t={})=>(t.locale??s())===`zh-TW`?ze(e):Re(e)),Ve=e=>`Quit the tower ${e?.name}? The base's mains become members again.`,He=e=>`要關掉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Ue=((e,t={})=>(t.locale??s())===`zh-TW`?He(e):Ve(e)),We=e=>`Quit ${e?.name}`,Ge=e=>`關掉 ${e?.name}`,Ke=((e,t={})=>(t.locale??s())===`zh-TW`?Ge(e):We(e)),qe=e=>`Quit ${e?.name}? It quits pi and its pane closes.`,Je=e=>`要關掉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Ye=((e,t={})=>(t.locale??s())===`zh-TW`?Je(e):qe(e)),Xe=e=>`control tower · ${e?.state}`,Ze=e=>`塔台 · ${e?.state}`,Qe=((e,t={})=>(t.locale??s())===`zh-TW`?Ze(e):Xe(e)),$e=((e={},t={})=>(t.locale??s())===`zh-TW`?`圖示來自 game-icons.net(Lorc、Delapouite),CC BY 3.0。`:`Icons from game-icons.net by Lorc and Delapouite, CC BY 3.0.`),et=((e={},t={})=>(t.locale??s())===`zh-TW`?`移除`:`Dismiss`),tt=e=>`Dismiss ${e?.name}`,nt=e=>`從畫面移除 ${e?.name}`,rt=((e,t={})=>(t.locale??s())===`zh-TW`?nt(e):tt(e)),it=((e={},t={})=>(t.locale??s())===`zh-TW`?`文件`:`Documents`),at=((e={},t={})=>(t.locale??s())===`zh-TW`?`總塔台`:`head tower`),ot=((e={},t={})=>(t.locale??s())===`zh-TW`?`語言`:`Language`),st=((e={},t={})=>(t.locale??s())===`zh-TW`?`連線中`:`connecting`),ct=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時`:`live`),lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`離線`:`offline`),ut=((e={},t={})=>(t.locale??s())===`zh-TW`?`重新連線中`:`reconnecting`),dt=((e={},t={})=>(t.locale??s())===`zh-TW`?`正體中文`:`English`),ft=((e={},t={})=>(t.locale??s())===`zh-TW`?`位置`:`Location`),pt=e=>`${e?.name} finished`,mt=e=>`${e?.name} 已完成`,ht=((e,t={})=>(t.locale??s())===`zh-TW`?mt(e):pt(e)),gt=e=>`${e?.name} hit an error`,_t=e=>`${e?.name} 發生錯誤`,vt=((e,t={})=>(t.locale??s())===`zh-TW`?_t(e):gt(e)),yt=e=>`${e?.name} went idle`,bt=e=>`${e?.name} 轉為閒置`,xt=((e,t={})=>(t.locale??s())===`zh-TW`?bt(e):yt(e)),St=e=>`${e?.name} joined`,Ct=e=>`${e?.name} 加入`,wt=((e,t={})=>(t.locale??s())===`zh-TW`?Ct(e):St(e)),Tt=e=>`${e?.name} left`,Et=e=>`${e?.name} 離開`,Dt=((e,t={})=>(t.locale??s())===`zh-TW`?Et(e):Tt(e)),Ot=e=>`${e?.name} lost its status`,kt=e=>`${e?.name} 失去狀態`,At=((e,t={})=>(t.locale??s())===`zh-TW`?kt(e):Ot(e)),jt=e=>`${e?.name} is waiting on a question`,Mt=e=>`${e?.name} 正在等待回答`,Nt=((e,t={})=>(t.locale??s())===`zh-TW`?Mt(e):jt(e)),Pt=e=>`${e?.name} started working`,Ft=e=>`${e?.name} 開始工作`,It=((e,t={})=>(t.locale??s())===`zh-TW`?Ft(e):Pt(e)),v=((e={},t={})=>(t.locale??s())===`zh-TW`?`已完成`:`finished`),Lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`錯誤`:`error`),y=((e={},t={})=>(t.locale??s())===`zh-TW`?`閒置`:`idle`),Rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無狀態`:`no status`),b=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待回答`:`waiting on a question`),zt=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`working`),Bt=e=>`Monitor failed: ${e?.what}`,Vt=e=>`Monitor 出錯:${e?.what}`,Ht=((e,t={})=>(t.locale??s())===`zh-TW`?Vt(e):Bt(e)),Ut=e=>`Monitor went quiet and stopped: ${e?.what}`,Wt=e=>`Monitor 太久沒輸出,已停止:${e?.what}`,Gt=((e,t={})=>(t.locale??s())===`zh-TW`?Wt(e):Ut(e)),Kt=((e={},t={})=>(t.locale??s(),`Logs`)),qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`從未`:`never`),Jt=((e={},t={})=>(t.locale??s())===`zh-TW`?`+新基地`:`+ New base`),Yt=((e={},t={})=>(t.locale??s())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),Xt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無警示`:`no alerts`),Zt=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),Qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`尚無塔台`:`no tower yet`),$t=((e={},t={})=>(t.locale??s())===`zh-TW`?`監看中`:`Watching a monitor`),en=((e={},t={})=>(t.locale??s())===`zh-TW`?`思考中`:`thinking`),tn=e=>`Finished ${e?.note}`,nn=e=>`完成了 ${e?.note}`,rn=((e,t={})=>(t.locale??s())===`zh-TW`?nn(e):tn(e)),an=e=>`Failed ${e?.note}`,on=e=>`出錯了 ${e?.note}`,sn=((e,t={})=>(t.locale??s())===`zh-TW`?on(e):an(e)),cn=e=>`Waiting on you ${e?.note}`,ln=e=>`等你回答 ${e?.note}`,un=((e,t={})=>(t.locale??s())===`zh-TW`?ln(e):cn(e)),dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`+主智慧體`:`+ Main`),fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`+成員`:`+ Member`),pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`Outposts`),mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`手機`:`Phone`),hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),gn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),_n=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),x=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉`:`Quit`),vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉塔台`:`Quit tower`),yn=e=>`Refused (${e?.status}).`,bn=e=>`已拒絕(${e?.status})。`,S=((e,t={})=>(t.locale??s())===`zh-TW`?bn(e):yn(e)),xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒`:`Remind`),Sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),Cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已關`:`Reminders off`),Tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已開:分頁不在前景時,單位等你回答、完成或出錯會跳系統通知`:`Reminders on: while the page is in the background, a unit waiting on you, finishing, or failing raises a system notification`),En=((e={},t={})=>(t.locale??s())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),Dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`主智慧體`:`main`),On=((e={},t={})=>(t.locale??s())===`zh-TW`?`成員`:`member`),kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`outpost`),An=((e={},t={})=>(t.locale??s())===`zh-TW`?`未編入`:`unaligned`),jn=((e={},t={})=>(t.locale??s(),`session`)),Mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`子智慧體`:`subagent`),Nn=((e={},t={})=>(t.locale??s())===`zh-TW`?`塔台`:`tower`),Pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效`:`Sound`),Fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已關`:`Sounds off`),In=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已開`:`Sounds on`),Ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效:開關、音量與試聽`:`Sounds: on or off, volume, and a try`),Rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`▶ 試聽`:`▶ Try`),zn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音量`:`Volume`),Bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`智慧體`:`Agents`),Vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`基地`:`Bases`),Hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待中`:`Waiting`),Un=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`Working`),Wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`狀態`:`States`),Gn=e=>`tab ${e?.label}`,Kn=e=>`分頁 ${e?.label}`,qn=((e,t={})=>(t.locale??s())===`zh-TW`?Kn(e):Gn(e)),Jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),Yn=((e={},t={})=>(t.locale??s())===`zh-TW`?`網的總計`:`Net totals`),Xn=e=>`${e?.label} tower`,Zn=e=>`${e?.label} 塔台`,Qn=((e,t={})=>(t.locale??s())===`zh-TW`?Zn(e):Xn(e)),$n=e=>`using ${e?.tool}`,er=e=>`使用 ${e?.tool}`,tr=((e,t={})=>(t.locale??s())===`zh-TW`?er(e):$n(e)),nr=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待變化…`:`Waiting for changes…`),rr=`sb-locale`;function ir(e){let t=/^zh\b/i.test(e)&&(/-(hant|tw|hk|mo)\b/i.test(e)?`zh-TW`:/-(hans|cn|sg|my)\b/i.test(e)?`zh-CN`:void 0);return p(e)??(t?p(t):void 0)??p(e.split(`-`)[0])}function ar(e,t){return p(e)??t.map(ir).find(Boolean)??`en`}var or={brand_label:Ee,tagline:Jn,totals_label:Yn,stat_bases:Vn,stat_agents:Bn,stat_working:Un,stat_waiting:Hn,alerts:fe,no_alerts:Xt,pair_button:mn,pair_title:hn,link_connecting:st,location:ft,all_bases:pe,documents:it,net_log:Kt,states:Wn,mark_working:zt,mark_waiting:b,mark_idle:y,mark_done:v,mark_error:Lt,credit:$e,language:ot,waiting_changes:nr,new_base:Jt};Object.keys(or);function sr(){let e=null;try{e=localStorage.getItem(rr)}catch{}let n=ar(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,or[e.dataset[t]]?.()??e.dataset[t]);let i=document.getElementById(`lang`);i.replaceChildren(...t.map(e=>new Option(dt({},{locale:e}),e,!1,e===n))),i.onchange=()=>{try{localStorage.setItem(rr,i.value),location.reload()}catch{i.value=n}}}var cr={working:It,waiting:Nt,idle:xt,done:ht,error:vt,unknown:At};function lr(e){let t=new Map;for(let n of e.bases){n.tower&&t.set(`tower:${n.id}`,{name:Qn({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 ur(e,t){if(!e)return[];let[n,r]=[lr(e),lr(t)],i=[];for(let[e,t]of r){let r=n.get(e);r?r.mark!==t.mark&&i.push({text:cr[t.mark]({name:t.name}),mark:t.mark}):i.push({text:wt({name:t.name}),mark:t.mark})}for(let[e,t]of n)r.has(e)||i.push({text:Dt({name:t.name}),mark:`idle`});return i}var dr=e=>e.unit??e.key,fr=e=>e===`waiting`||e===`error`?0:1;function pr(e,t){let n=new Map;for(let r of e.bases)for(let e of[...r.tower?[{...r.tower,role:`tower`}]:[],...[...r.tabs.flatMap(e=>e.units),...r.outside].flatMap(e=>[e,...e.subs])]){n.set(e.key,{key:e.key,ws:r.id,name:e.name,role:e.role,mark:e.mark,note:e.note,at:t,pending:e.pending,closed:!e.control||!!e.ended});for(let i of e.monitors??[])(i.status===`error`||i.status===`stale`)&&(a=>n.set(a,{key:a,unit:e.key,ws:r.id,name:e.name,role:e.role,mark:`error`,note:`monitor:${i.status}:${i.what}`,at:t}))(`${e.key}\u001fmonitor:${i.id}:${i.at}`)}return n}function mr(e,t){return[...t.values()].filter(t=>e?.get(t.key)?.mark!==t.mark&&(fr(t.mark)===0||e!==void 0&&t.mark===`done`))}var hr=`input, textarea, select, [role=textbox], [role=combobox], [role=listbox], .term-scroll`,gr=`button, a, summary, [role=button], [role=link]`,_r=`.ask-opt, [role=radio], [role=checkbox]`,vr=`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`;function yr(e,t,n=!1){if(t||e.defaultPrevented||e.isComposing||e.ctrlKey||e.altKey||e.metaKey)return;let r=e.target;if(!(r?.isContentEditable||r?.closest?.(hr))){if(e.key===`f`||e.key===`F`)return`zoom`;if(e.key===` `&&!r?.closest?.(_r)&&(n||!r?.closest?.(gr)))return`next`}}function br(e,t=()=>document.querySelector(vr)!==null,n=window){let r,i=!1,a=null;n.addEventListener(`pointerdown`,()=>i=!0,!0),n.addEventListener(`focusin`,e=>a=i?e.target:null,!0),n.addEventListener(`keydown`,n=>{let o=n.target===a;i=!1;let s=yr(n,t(),o);if(s){if(n.repeat)return r===s?n.preventDefault():void 0;e(s)&&(r=s,n.preventDefault())}}),n.addEventListener(`keyup`,e=>{r===`next`&&e.key===` `&&e.preventDefault(),r=void 0})}var xr=3e4,Sr=[`pointermove`,`pointerdown`,`keydown`,`wheel`,`touchstart`];function Cr(e=document.documentElement){if(matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=Date.now(),n,r=()=>{let i=t+xr-Date.now();i>0?n=setTimeout(r,i):(n=void 0,e.toggleAttribute(`data-calm`,!0))},i=()=>{t=Date.now(),n===void 0&&(e.toggleAttribute(`data-calm`,!1),n=setTimeout(r,xr))};for(let e of Sr)addEventListener(e,i,{capture:!0,passive:!0});document.addEventListener(`visibilitychange`,()=>document.hidden||i()),i()}var wr=(...e)=>e.filter(e=>e!==!1&&e!=null),Tr=(e,t)=>(e.classList.add(t),e.classList.toggle(`flip`));function Er(e,t,...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t??{}))r.setAttribute(e,n);return r.append(...wr(...n)),r}function Dr({x1:e,y1:t,x2:n,y2:r,mid:i},a=64){let o=Array.from({length:201},(a,o)=>{let s=o/200,c=1-s;return[c**3*e+3*c*c*s*i+3*c*s*s*i+s**3*n,c**3*t+3*c*c*s*t+3*c*s*s*r+s**3*r]}),s=o.reduce((e,t,n)=>(e.push(n?e[n-1]+Math.hypot(t[0]-o[n-1][0],t[1]-o[n-1][1]):0),e),[]);return Array.from({length:a+1},(e,t)=>{let n=t/a*s.at(-1),r=Math.max(1,s.findIndex(e=>e>=n)),[i,c]=[o[r-1],o[r]],l=s[r]>s[r-1]?(n-s[r-1])/(s[r]-s[r-1]):0;return[i[0]+(c[0]-i[0])*l,i[1]+(c[1]-i[1])*l]})}function Or(e,t){if(t||!e.length)return[];let n=document.createElement(`style`);return n.textContent=e.map((e,t)=>`@keyframes pk${t}{${Dr(e).map(([e,t],n,r)=>`${(n/(r.length-1)*100).toFixed(2)}%{transform:translate(${e.toFixed(1)}px,${t.toFixed(1)}px)}`).join(``)}}`).join(``),[n,...e.map((e,t)=>(e=>(e.className=`packet`,e.style.animationName=`pk${t}`,e))(document.createElement(`i`)))]}var kr=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Ar=function(e,t){return new URL(e,t).href},jr={},Mr=function(e){return e.pathname.endsWith(`.css`)},Nr=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},C=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=Ar(t,n);let r=s(t),i=Mr(r);return Nr(jr,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`:kr,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function w(e,t,n,r,i=!1){Object.assign(e.dataset,t),[e.hidden,e.textContent]=[i,n],r&&e.setAttribute(`aria-label`,r)}var Pr=(e,t)=>t.role===`subagent`&&t.ended&&t.key?w(e,{close:`dismiss`,key:t.key,name:t.name,role:t.role},et(),rt({name:t.name})):w(e,{close:`unit`,key:t.key??``,name:t.name,role:t.role},x(),Ke({name:t.name}),!(t.control&&t.key)||t.role===`subagent`),Fr=(e,t)=>w(e,{key:t?.key??``,name:t?.name??``,role:`tower`},vn(),void 0,!t?.control),Ir=(e,t)=>w(e,{ws:t.id,name:t.label},x(),je({name:t.label})),Lr=(e,t,n)=>w(e,{ws:t.id,name:n.label,tab:n.id},x(),Le({name:n.label})),T=(e,t)=>new Promise(n=>{let r=document.createElement(`dialog`),i=document.createElement(`p`),a=document.createElement(`div`),o=(e,t,i)=>Object.assign(document.createElement(`button`),{type:`button`,className:t,textContent:e,onclick:()=>(r.close(),n(i))});[r.className,i.textContent,a.className]=[`sheet`,e,`sheet-row`],a.append(...t?[o(De(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(Oe(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()});function Rr(e,{route:t,net:n,go:r}){let i=t();if(i.view===`map`)return;if(e.close===`base`)return void(i.ws===e.ws&&r({view:`map`}));let a=e=>e.flatMap(e=>[e.key,...a(e.subs)]),o=e.close===`tab`&&i.ws===e.ws?n()?.bases.find(t=>t.id===e.ws)?.tabs.find(t=>t.id===e.tab):void 0;i.view===`session`&&(e.close===`unit`?i.key===e.key:o&&a(o.units).includes(i.key))&&r({view:`workspace`,ws:i.ws})}function zr(e){document.addEventListener(`click`,t=>{let n=t.target?.closest?.(`button[data-close]`),r=n?.dataset;if(n&&r){if(t.preventDefault(),r.close===`dismiss`)return void C(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`dismiss`,{key:r.key})).then(e=>e.ok||T(e.body.reason??S({status:e.status})),()=>T(Zt()));T((r.close===`base`?Pe:r.close===`tab`?Be:r.role===`tower`?Ue:Ye)({name:r.name??``}),x()).then(t=>{t&&(n.toggleAttribute(`disabled`,!0),C(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/${r.close}`,r.close===`unit`?{key:r.key}:{workspace:r.ws,...r.tab&&{tab:r.tab}})).then(t=>t.ok?Rr(r,e):T(t.body.reason??S({status:t.status})),()=>T(Zt())).finally(()=>n.toggleAttribute(`disabled`,!1)))})}})}var Br=e=>{try{return decodeURIComponent(e)}catch{return e}},E=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function D(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(Br);if(r!==`w`||!i)return{view:`map`};if(a!==`s`||!o)return{view:`workspace`,ws:i};let s=new URLSearchParams(n).get(`at`);return s?{view:`session`,ws:i,key:o,at:s}:{view:`session`,ws:i,key:o}}var O=e=>e.view===`map`?``:e.view===`workspace`?`w/${E(e.ws)}`:`w/${E(e.ws)}/s/${E(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,Vr=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},k=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null;function Hr(e,t=new URL(document.baseURI).pathname){let n=()=>D(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>O(e)||`./`,go(n){let r=t+O(n);location.pathname+location.search!==r&&history.pushState(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(D(t.getAttribute(`data-route`))))}),r}var Ur={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},A={working:zt,waiting:b,idle:y,done:v,error:Lt,unknown:Rt},Wr={main:Dn,member:On,subagent:Mn,tower:Nn,outpost:kn,outside:An,session:jn},Gr={thinking:en,"watching a monitor":$t,idle:y,"waiting on a question":b,finished:v},Kr=e=>Object.hasOwn(Wr,e)?Wr[e]():e,qr=e=>e===`waiting`||e===`error`,j=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)},M=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},N=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},P=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&Tr(e,`flash`)},Jr=e=>(t=>(e.slice(8,t)===`stale`?Gt:Ht)({what:e.slice(t+1)}))(e.indexOf(`:`,8)),F=(e,t)=>e?e.startsWith(`tool:`)?tr({tool:e.slice(5)}):e.startsWith(`monitor:`)?Jr(e):Object.hasOwn(Gr,e)?Gr[e]():e:A[t](),I=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,O(t)||`./`),e.setAttribute(`data-route`,O(t)))},Yr=(e,t)=>{let n=t.getBoundingClientRect(),r=e.offsetWidth;e.style.top=`${n.bottom+8}px`,e.style.left=`${Math.max(8,Math.min(n.right-r,innerWidth-r-8))}px`},Xr=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function Zr(e,t,n,r){P(e,n);let i=e.querySelector(`use`),a=`#i-${Ur[t]??`member`}`,o=r?.filter(e=>e.onScreen).length;i.getAttribute(`href`)!==a&&i.setAttribute(`href`,a),o?e.dataset.docs=String(o):delete e.dataset.docs}function L(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 R=()=>j(`<div class="unit"><div class="card"><a class="hit"></a>${Xr}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button></div><div class="subs"></div></div>`);function z(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);I(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${F(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,qr(t.mark)),P(e,t.mark),Zr(e.querySelector(`.plate`),t.role,t.mark,t.docs),N(e,`.name`,t.name),N(e,`.role`,Kr(t.role)),N(e,`.note`,F(t.note,t.mark)),Pr(e.querySelector(`:scope > .card > .quit-btn`),t),L(e.querySelector(`.subs`),t.subs??[],R,z)}function B(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`?dn():fn())&&(e.textContent=r===`main`?dn():fn())}var Qr=()=>j(`<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>${at()}</span><h2><a class="enter-base"></a></h2><p></p><button type="button" class="quit-btn tower-quit" data-close="unit" hidden></button></div><button type="button" class="quit-btn" data-close="base"></button></header><div class="spawn-btns"><button type="button" class="pair-btn"></button></div><div class="tabs"></div><div class="outposts" data-label="${pn()}"></div></section>`);function $r(e,t){P(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),P(n,t.tower?.mark??`unknown`),N(e,`h2 a`,t.label),I(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),N(e,`.title p`,t.tower?Qe({state:A[t.tower.mark]()}):Qt()),B(e.querySelector(`.spawn-btns button`),t),Ir(e.querySelector(`header > .quit-btn`),t),Fr(e.querySelector(`.tower-quit`),t.tower),L(e.querySelector(`.tabs`),t.tabs,()=>j(`<div class="tab"><h3><span></span><button type="button" class="tab-add"></button><button type="button" class="quit-btn" data-close="tab"></button></h3><div class="units"></div></div>`),(e,n)=>{N(e,`h3 span`,qn({label:n.label})),Lr(e.querySelector(`.quit-btn`),t,n),B(e.querySelector(`.tab-add`),t,n.id),L(e.querySelector(`.units`),n.units,R,z)}),L(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?Yt():void 0})),R,z)}function ei(e,t,n,r){let i=[...e.querySelectorAll(`.base:not(.leaving) .tower`)],a=e.querySelector(`.base.head:not(.leaving) .tower`),o=e.getBoundingClientRect(),s=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-o.x),Math.round(t.y+t.height/2-o.y)]},c=a?i.filter(e=>e!==a):[],l=c.map(e=>{let[[t,n],[r,i]]=[s(a),s(e)];return{x1:t,y1:n,x2:r,y2:i,mid:Math.round((t+r)/2)}}),u=l.map(({x1:e,y1:t,x2:n,y2:r,mid:i})=>`M${e} ${t}C${i} ${t} ${i} ${r} ${n} ${r}`),d=u.join(`|`);t.dataset.sig!==d&&(t.dataset.sig=d,t.replaceChildren(...u.map(e=>(t=>(t.setAttribute(`class`,`wire`),t.setAttribute(`d`,e),t))(document.createElementNS(`http://www.w3.org/2000/svg`,`path`)))),n.replaceChildren(...Or(l,r))),n.querySelectorAll(`.packet`).forEach((e,t)=>e.toggleAttribute(`data-live`,a.dataset.mark===`working`||c[t].dataset.mark===`working`))}function ti(){let[e,t,n,r,i]=[M(`map`,HTMLElement),M(`bases`,HTMLElement),M(`links`,SVGSVGElement),M(`packets`,HTMLElement),M(`log`,HTMLElement)],a=matchMedia(`(prefers-reduced-motion: reduce)`).matches,o=()=>!e.hidden&&ei(e,n,r,a);return new ResizeObserver(o).observe(e),Cr(),{layout:o,stats(e){let t=e.bases.flatMap(e=>e.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))),n=e=>String(t.filter(t=>!e||t.mark===e).length);for(let[t,r]of[[`s-bases`,String(e.bases.length)],[`s-agents`,n()],[`s-working`,n(`working`)],[`s-waiting`,n(`waiting`)]])M(t,HTMLElement).textContent=r},show(e){L(t,e.bases,Qr,$r),requestAnimationFrame(o)},log(e){let t=new Date().toLocaleTimeString([],{hour12:!1});for(let n of e){let e=j(`<li><span></span><time></time></li>`);e.dataset.mark=n.mark,N(e,`span`,n.text),N(e,`time`,t),i.prepend(e)}for(;i.children.length>12;)i.lastElementChild.remove()},pause(e){document.documentElement.classList.toggle(`paused`,e)}}}var ni=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,ri=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,ii={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:ri,done:ni},ai=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,oi=(e,t)=>{try{return localStorage.getItem(e)??t}catch{return t}},si=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function ci(e){let t=e=>document.getElementById(e),n=t(`remind`),r=t(`sound`),i=t(`sound-pop`),a=t(`sound-on`),o=t(`sound-vol`),s=t(`sound-vol-out`),c=typeof Notification<`u`,l=oi(`sb.remind`,`1`)===`1`,u=oi(`sb.sound`,`0`)===`1`,d=Math.min(100,Math.max(0,Number(oi(`sb.volume`,`60`))||0)),f,p,m=new Map,h=()=>{let e=c?Notification.permission:`denied`;n.setAttribute(`aria-pressed`,String(l)),n.dataset.state=l?e===`granted`?`on`:e===`denied`?`blocked`:`ask`:`off`,n.title=c?l?e===`granted`?Tn():e===`denied`?Cn():Sn():wn():En(),r.dataset.state=u?`on`:`off`,r.setAttribute(`aria-label`,u?In():Fn()),a.checked=u,o.value=s.value=String(d),p&&(p.gain.value=(d/100)**2)};n.textContent=xn(),r.textContent=Pn(),r.title=Ln(),t(`sound-on-label`).textContent=Pn(),t(`sound-vol-label`).textContent=zn(),t(`sound-try`).textContent=Rn(),n.onclick=async()=>{l&&c&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):si(`sb.remind`,(l=!l)?`1`:`0`),h()},i.addEventListener(`toggle`,e=>e.newState===`open`&&Yr(i,r)),a.onchange=()=>{si(`sb.sound`,(u=a.checked)?`1`:`0`),h(),u&&g(`done`)},o.oninput=()=>(si(`sb.volume`,String(d=Number(o.value))),h()),o.onchange=()=>g(`done`),t(`sound-try`).onclick=()=>g(`done`);function g(e){f??=new AudioContext,p||((p=f.createGain()).connect(f.destination),h());let t=f,n=p;m.has(e)||m.set(e,fetch(ii[e]).then(e=>e.arrayBuffer()).then(e=>t.decodeAudioData(e))),Promise.all([t.resume(),m.get(e)]).then(([,e])=>{let r=t.createBufferSource();r.buffer=e,r.connect(n),r.start()}).catch(()=>m.delete(e))}return h(),{signal(t){let n=t.flatMap(e=>(t=>t?[{a:e,k:t}]:[])(ai(e)));if(n.length&&(u&&g([`waiting`,`error`,`done`].find(e=>n.some(t=>t.k===e))),l&&c&&Notification.permission===`granted`&&(document.hidden||!document.hasFocus())))for(let{a:t,k:r}of n){let n=new Notification(t.name,{body:{waiting:un,error:sn,done:rn}[r]({note:t.note??``}).trim(),tag:t.key,icon:document.querySelector(`link[rel="icon"]`)?.href});n.onclick=()=>(window.focus(),n.close(),e(t))}}}}var li=45e3,ui=1e3,di=3e4,fi=(e,t)=>Math.min(di,ui*2**(e-1))*(.8+.4*t);function pi(e){try{return JSON.parse(e)}catch{return}}function mi(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(),li),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,fi(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=pi(r);i&&e.onNet(i),o({problem:i?void 0:gn()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:pi(e)??_n()}),l())}),r=e.setTimeout(()=>u(),li)};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()}}}sr();var V=ti(),H=e=>document.getElementById(e),hi=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):qt(),gi,_i,U,W,vi={state:`connecting`,attempt:0},G={view:`map`},yi=!1,bi,xi=``,K,Si,q=e=>K?e(K):void Si?.then(e);function Ci(){Si??=C(async()=>{let{mountFocus:e}=await import(`./views-Bcg0APim.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(K=e({data:zi,restart:()=>$.restart(),openTile:Ti,embedTerminal:(e,t,n)=>new Promise(r=>Y(i=>r(i.terminal.embed(e,t,n)))),online:()=>vi.state===`live`}),K.show(G,G),U&&K.net(U),K))}var J,wi,Y=e=>{if(J)return e(J);wi??=C(async()=>{let{mountPanels:e}=await import(`./layer-BCHLWC4K.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>J=e({label:e=>U?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(Z?Z.data(e).latest():Ri(e,`?limit=12`))).items,post:e=>Z&&((t,n)=>Z.data(e).post(t,n)),stream:()=>xi,showTerminal:(e,t)=>(J?.stack.close(),K?.terminal(t),Q.go({view:`session`,ws:e,key:t}))})),wi.then(e)},Ti=(e,t)=>Y(n=>n.tiles.open(e,t)),X=document.querySelector(`link[rel="icon"]`),Ei=X&&decodeURIComponent(X.href.slice(X.href.indexOf(`,`)+1)),Di=0;function Oi(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(!X||!Ei||t===Di)return;Di=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>`;X.href=`data:image/svg+xml,${encodeURIComponent(t?Ei.replace(`</svg>`,`${n}</svg>`):Ei)}`}var ki;function Ai(e){U=W=e,Oi(e);let t=pr(e,Date.now());if(ki&&Vi.signal(mr(ki,t)),ki=t,document.hidden)return;V.stats(e);let n=mr(bi,t);(n.length||J)&&Y(e=>e.alerts(n,t)),bi=t,V.log(ur(_i,e)),_i=e,q(t=>t.net(e)),G.view===`map`&&(V.show(e),gi=e,W=void 0)}function ji(e){let t=G,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;G=e,e.view!==`map`&&Ci(),H(`map`).hidden=e.view!==`map`,H(`legend`).hidden=e.view===`session`,q(r=>r.show(e,t,n)),e.view===`map`&&U&&U!==gi&&(Ai(U),requestAnimationFrame(V.layout)),yi&&k(e)!==k(t)&&$.restart()}function Mi(e){vi=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=H(`stage`).dataset.stale=String(t),H(`link`).dataset.state=e.state,H(`link-text`).textContent={connecting:st,live:ct,reconnecting:ut,offline:lt}[e.state](),K&&U&&K.net(U),J?.stack.redraw();let n=H(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?ve({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?Te({attempt:e.attempt}):Se():xe({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=hi(e.lastContact),n.replaceChildren(`${r} ${he()} `,i,me())}function Ni(e,t){try{let n=JSON.parse(t);q(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var Pi=document.querySelector(`meta[name="sb-build"]`)?.content,Fi=e=>!!(Pi&&Pi!==JSON.parse(e).build);function Ii(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 Li=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),Ri=(e,t=``)=>Li(`history/${encodeURIComponent(e)}${t}`),Z=void 0,zi=e=>({older:t=>Ri(e,`?before=${encodeURIComponent(t)}`),latest:()=>Ri(e),entry:t=>Li(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),Bi=()=>{let e=Ii(k(G));return e.listen(`history`,e=>Ni(`history`,e)),e.listen(`cards`,e=>Ni(`cards`,e)),e.listen(`hello`,e=>Fi(e)?location.reload():(xi=e,J?.terminal.hello())),e.listen(`mirror`,e=>J?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&D(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=bi?.get(n.key);r&&(e.preventDefault(),Y(e=>e.stack.show(r)))},!0);var Q=Hr(e=>ji(e)),Vi=ci(e=>Q.go({view:`session`,ws:e.ws,key:dr(e)})),$=mi({open:Bi,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:Ai,onStatus:Mi}),Hi=()=>$.resume();document.addEventListener(`visibilitychange`,()=>{if(V.pause(document.hidden),document.hidden)return $.hide();W&&Ai(W),q(e=>e.wake()),Hi()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(e.preventDefault(),!J?.stack.close()&&G.view!==`map`&&Q.go(Vr(G)))}),br(e=>J?.hotkey(e)??!1),H(`pair`).hidden=location.hostname!==`127.0.0.1`,H(`pair`).addEventListener(`click`,()=>void C(async()=>{let{pairTile:e}=await import(`./pair-BIsl9hN1.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>Ti(e(),!0))),zr({route:()=>G,net:()=>U,go:e=>Q.go(e)}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&C(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-CDSkJCMN.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,U?.bases??[]);r&&Ti(n(r,(e,t,n)=>(J?.tiles.close(n),Q.go({view:`session`,ws:e,key:t}))),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&Hi());Mi(vi),ji(Q.route()),$.start(),yi=!0;export{it as A,S as C,Xt as D,Zt as E,s as F,Oe as M,De as N,Yt as O,pe as P,Hn as S,Qt as T,Er as _,B as a,dr as b,Zr as c,P as d,Kr as f,C as g,qr as h,I as i,Qe as j,at as k,Yr as l,N as m,A as n,M as o,L as p,Xr as r,F as s,Ur as t,j as u,Tr as v,pn as w,Un as x,fr as y};
@@ -1,3 +1,3 @@
1
- import{t as e}from"./post-UHMNmNgA.js";import{a as t,r as n,t as r}from"./ask-B8exEH0h.js";import{C as i,D as a,F as o,M as s,N as c,_ as l,b as u,c as d,d as f,f as p,i as m,l as h,m as g,o as _,p as v,r as y,s as b,u as x,v as S,y as C}from"./index-DS51Ucw0.js";var w=e=>`Alerts: ${e?.tally} (Space opens the next)`,T=e=>`警示:${e?.tally}(空白鍵開下一則)`,E=((e,t={})=>(t.locale??o())===`zh-TW`?T(e):w(e)),D=e=>`Also queued: ${e?.tally}`,O=e=>`佇列中還有:${e?.tally}`,ee=((e,t={})=>(t.locale??o())===`zh-TW`?O(e):D(e)),te=((e={},t={})=>(t.locale??o())===`zh-TW`?`全部清除`:`Clear all`),k=((e={},t={})=>(t.locale??o())===`zh-TW`?`關閉文件`:`Close document`),A=e=>`Close ${e?.title}`,j=e=>`關閉 ${e?.title}`,ne=((e,t={})=>(t.locale??o())===`zh-TW`?j(e):A(e)),M=((e={},t={})=>(t.locale??o())===`zh-TW`?`連線中…`:`Connecting…`),N=((e={},t={})=>(t.locale??o())===`zh-TW`?`警示`:`alert`),re=((e={},t={})=>(t.locale??o())===`zh-TW`?`放大(F)`:`Enlarge (F)`),ie=((e={},t={})=>(t.locale??o())===`zh-TW`?`縮小(F)`:`Shrink (F)`),ae=((e={},t={})=>(t.locale??o())===`zh-TW`?`完成`:`Done`),P=((e={},t={})=>(t.locale??o())===`zh-TW`?`已完成的單位:點一列打開它的通訊並清掉,或全部清除`:`Finished units: a row opens its comms and clears it, or clear them all`),F=((e={},t={})=>(t.locale??o())===`zh-TW`?`符合寬度`:`Fit width`),oe=((e={},t={})=>(t.locale??o())===`zh-TW`?`無法取得紀錄。`:`History unavailable.`),I=((e={},t={})=>(t.locale??o())===`zh-TW`?`退格鍵`:`Backspace`),L=((e={},t={})=>(t.locale??o())===`zh-TW`?`下`:`Down`),R=((e={},t={})=>(t.locale??o(),`End`)),z=((e={},t={})=>(t.locale??o(),`Enter`)),B=((e={},t={})=>(t.locale??o(),`Escape`)),se=((e={},t={})=>(t.locale??o(),`Home`)),ce=((e={},t={})=>(t.locale??o())===`zh-TW`?`左`:`Left`),V=((e={},t={})=>(t.locale??o())===`zh-TW`?`下一頁`:`Page down`),H=((e={},t={})=>(t.locale??o())===`zh-TW`?`上一頁`:`Page up`),U=((e={},t={})=>(t.locale??o())===`zh-TW`?`右`:`Right`),W=((e={},t={})=>(t.locale??o(),`Shift+Tab`)),G=((e={},t={})=>(t.locale??o())===`zh-TW`?`空白鍵`:`Space`),le=((e={},t={})=>(t.locale??o(),`Tab`)),ue=((e={},t={})=>(t.locale??o())===`zh-TW`?`上`:`Up`),de=e=>`Keys for ${e?.name}`,fe=e=>`${e?.name} 的按鍵`,pe=((e,t={})=>(t.locale??o())===`zh-TW`?fe(e):de(e)),me=((e={},t={})=>(t.locale??o())===`zh-TW`?`最後一則通訊`:`Last transmission`),he=((e={},t={})=>(t.locale??o())===`zh-TW`?`稍後`:`Later`),ge=((e={},t={})=>(t.locale??o())===`zh-TW`?`已離開網`:`left the net`),_e=e=>`The mirror ended: ${e?.why}`,ve=e=>`鏡像已結束:${e?.why}`,ye=((e,t={})=>(t.locale??o())===`zh-TW`?ve(e):_e(e)),be=((e={},t={})=>(t.locale??o())===`zh-TW`?`等待輸入密碼時隱藏;請在終端機中輸入。`:`Hidden while it waits for a secret; type it in the terminal.`),xe=e=>`Live · ${e?.cols}×${e?.rows}`,Se=e=>`即時 · ${e?.cols}×${e?.rows}`,Ce=((e,t={})=>(t.locale??o())===`zh-TW`?Se(e):xe(e)),we=((e={},t={})=>(t.locale??o())===`zh-TW`?`還沒有訊息。`:`No messages yet.`),Te=((e={},t={})=>(t.locale??o())===`zh-TW`?`開啟通訊`:`Open comms`),Ee=((e={},t={})=>(t.locale??o())===`zh-TW`?`此分頁隱藏時暫停。`:`Paused while this tab is hidden.`),De=e=>`${e?.why} Open the terminal again to retry.`,Oe=e=>`${e?.why} 重新開啟終端機即可重試。`,ke=((e,t={})=>(t.locale??o())===`zh-TW`?Oe(e):De(e)),Ae=((e={},t={})=>(t.locale??o())===`zh-TW`?`送出 Enter`:`Send Enter`),je=((e={},t={})=>(t.locale??o())===`zh-TW`?`送出 Escape`:`Send Escape`),Me=e=>`Send ${e?.key}`,Ne=e=>`送出 ${e?.key}`,Pe=((e,t={})=>(t.locale??o())===`zh-TW`?Ne(e):Me(e)),Fe=((e={},t={})=>(t.locale??o())===`zh-TW`?`錯誤`:`error`),Ie=((e={},t={})=>(t.locale??o())===`zh-TW`?`已完成`:`finished`),Le=((e={},t={})=>(t.locale??o())===`zh-TW`?`已離開`:`gone`),Re=((e={},t={})=>(t.locale??o())===`zh-TW`?`提問`:`question`),ze=((e={},t={})=>(t.locale??o())===`zh-TW`?`更新`:`update`),Be=e=>`${e?.count} finished`,Ve=e=>`${e?.count} 個已完成`,He=((e,t={})=>(t.locale??o())===`zh-TW`?Ve(e):Be(e)),Ue=e=>{let n=t(`en`,e?.count,{},!0);return n===`one`?`${e?.count} needs you`:n===`other`?`${e?.count} need you`:`tally_need`},We=e=>`${e?.count} 個需要你`,Ge=((e,t={})=>(t.locale??o())===`zh-TW`?We(e):Ue(e)),Ke=e=>`Terminal of ${e?.name}, read only`,qe=e=>`${e?.name} 的終端機,唯讀`,Je=((e,t={})=>(t.locale??o())===`zh-TW`?qe(e):Ke(e)),Ye=e=>`Terminal · ${e?.name}`,Xe=e=>`終端機 · ${e?.name}`,Ze=((e,t={})=>(t.locale??o())===`zh-TW`?Xe(e):Ye(e)),Qe=((e={},t={})=>(t.locale??o())===`zh-TW`?`◉ 鍵盤直送中 · 點外面結束`:`◉ Keyboard goes to the pane · click outside to stop`),K=((e={},t={})=>(t.locale??o())===`zh-TW`?`點這裡後,鍵盤直接送進終端機(Ctrl、Alt、⌘ 組合鍵除外)`:`Click here and the keyboard goes straight to the terminal (except Ctrl, Alt, and ⌘ combinations)`),$e=((e={},t={})=>(t.locale??o())===`zh-TW`?`等待`:`waiting on`),et=[[[`esc`,`esc`,B],[`tab`,`tab`,le],[`up`,`↑`,ue],[`enter`,`enter`,z]],[[`shift+tab`,`⇧tab`,W],[`left`,`←`,ce],[`down`,`↓`,L],[`right`,`→`,U]],[[`space`,`space`,G],[`backspace`,`⌫`,I],[`home`,`home`,se],[`end`,`end`,R],[`pageup`,`pgup`,H],[`pagedown`,`pgdn`,V]]],tt=`123456789`.split(``),nt={ArrowUp:`up`,ArrowDown:`down`,ArrowLeft:`left`,ArrowRight:`right`,Enter:`enter`,Escape:`esc`,Backspace:`backspace`,Home:`home`,End:`end`,PageUp:`pageup`,PageDown:`pagedown`},rt=130,it=64,q=4e3,at=typeof navigator<`u`&&/Mac|iPhone|iPad/.test(navigator.platform),ot=e=>e.split(`+`).map(e=>e.length===1?e.toUpperCase():e[0].toUpperCase()+e.slice(1)).join(`+`);function st({name:e,state:t,post:r,stream:a,blip:o}){let s=[],u=l(`p`,{class:`pad-note`,role:`status`}),d=!1,f=([e,t,n])=>{let r=l(`button`,{type:`button`,class:`pad-key`,"data-key":e,"aria-label":n()},t);return r.onclick=t=>t.isTrusted&&(v.push({key:e}),x()),s.push(r),r},p=l(`details`,{class:`pad-digits`},l(`summary`,null,`1–9`),l(`div`,{class:`pad-row`},...tt.map(e=>f([e,e,()=>e])))),m=l(`div`,{class:`pad`,role:`group`,"aria-label":pe({name:e})},...et.map(e=>l(`div`,{class:`pad-row`},...e.map(f))),p,u),h=(e,t=``)=>(u.dataset.tone=t,u.replaceChildren(e)),g=(e,t,n)=>{let r=l(`button`,{type:`button`,class:`pad-yes`},e===`enter`?Ae():e===`esc`?je():Pe({key:ot(e)})),i=l(`button`,{type:`button`,class:`cmp-link`},c());r.onclick=t=>t.isTrusted&&!d&&void _({key:e},n),i.onclick=()=>h(``),u.dataset.tone=`ask`,u.replaceChildren(l(`span`,null,t),r,i),i.focus()};async function _(e,t){d=!0,D(),h(``),y=Date.now();try{let n=await r(`keys`,{...e,stream:a(),...t?{confirmed:t}:{}});n.status===409&&n.body.error===`confirm`&&typeof n.body.confirm==`string`&&`key`in e?(v=[],g(e.key,String(n.body.reason??``),n.body.confirm)):n.ok||(v=[],h(n.body.reason??i({status:n.status}),`error`))}catch{v=[],h(n(),`error`)}finally{d=!1,D(),x()}}let v=[],y=0,b;function x(){if(d||b||!v.length)return;let e=y+rt-Date.now();if(e>0)return void(b=setTimeout(()=>(b=void 0,x()),e));_(v.shift())}let S=e=>{if(e.ctrlKey===e.altKey||e.shiftKey)return;let t=e.ctrlKey?`ctrl`:`alt`,n=/^Key([A-Z])$/.exec(e.code)?.[1].toLowerCase();if(at||t!==`ctrl`||n!==`v`&&(n!==`c`||getSelection()?.isCollapsed))return n?`${t}+${n}`:{Enter:t===`alt`?`alt+enter`:void 0,Backspace:t===`alt`?`alt+backspace`:void 0,ArrowLeft:`${t}+left`,ArrowRight:`${t}+right`}[e.key]},C=e=>(t=>t===`live`||t===`hidden`&&e===`esc`)(t());function w(e){if(e.metaKey||e.isComposing||e.key===`Process`)return!1;let t=e.ctrlKey||e.altKey?S(e):e.key===`Tab`?e.shiftKey?`shift+tab`:`tab`:e.key===`Delete`?`delete`:nt[e.key];return t?(!C(t)||e.repeat&&(v.length||![`up`,`down`,`left`,`right`,`backspace`,`delete`].includes(t))||(v.push({key:t}),o?.(),x()),!0):!1}function T(e){let t=[...e.replace(/[\u0000-\u001f\u007f-\u009f]/g,``)];if(t.length&&C()){for(let e of t){let t=v.at(-1);t&&`text`in t&&[...t.text].length<it?t.text+=e:v.push({text:e})}o?.(),x()}}function E(e){let t=[...e.replace(/\r\n?/g,`
1
+ import{t as e}from"./post-UHMNmNgA.js";import{a as t,r as n,t as r}from"./ask-DIr7mep4.js";import{C as i,D as a,F as o,M as s,N as c,_ as l,b as u,c as d,d as f,f as p,i as m,l as h,m as g,o as _,p as v,r as y,s as b,u as x,v as S,y as C}from"./index-D-LVSW44.js";var w=e=>`Alerts: ${e?.tally} (Space opens the next)`,T=e=>`警示:${e?.tally}(空白鍵開下一則)`,E=((e,t={})=>(t.locale??o())===`zh-TW`?T(e):w(e)),D=e=>`Also queued: ${e?.tally}`,O=e=>`佇列中還有:${e?.tally}`,ee=((e,t={})=>(t.locale??o())===`zh-TW`?O(e):D(e)),te=((e={},t={})=>(t.locale??o())===`zh-TW`?`全部清除`:`Clear all`),k=((e={},t={})=>(t.locale??o())===`zh-TW`?`關閉文件`:`Close document`),A=e=>`Close ${e?.title}`,j=e=>`關閉 ${e?.title}`,ne=((e,t={})=>(t.locale??o())===`zh-TW`?j(e):A(e)),M=((e={},t={})=>(t.locale??o())===`zh-TW`?`連線中…`:`Connecting…`),N=((e={},t={})=>(t.locale??o())===`zh-TW`?`警示`:`alert`),re=((e={},t={})=>(t.locale??o())===`zh-TW`?`放大(F)`:`Enlarge (F)`),ie=((e={},t={})=>(t.locale??o())===`zh-TW`?`縮小(F)`:`Shrink (F)`),ae=((e={},t={})=>(t.locale??o())===`zh-TW`?`完成`:`Done`),P=((e={},t={})=>(t.locale??o())===`zh-TW`?`已完成的單位:點一列打開它的通訊並清掉,或全部清除`:`Finished units: a row opens its comms and clears it, or clear them all`),F=((e={},t={})=>(t.locale??o())===`zh-TW`?`符合寬度`:`Fit width`),oe=((e={},t={})=>(t.locale??o())===`zh-TW`?`無法取得紀錄。`:`History unavailable.`),I=((e={},t={})=>(t.locale??o())===`zh-TW`?`退格鍵`:`Backspace`),L=((e={},t={})=>(t.locale??o())===`zh-TW`?`下`:`Down`),R=((e={},t={})=>(t.locale??o(),`End`)),z=((e={},t={})=>(t.locale??o(),`Enter`)),B=((e={},t={})=>(t.locale??o(),`Escape`)),se=((e={},t={})=>(t.locale??o(),`Home`)),ce=((e={},t={})=>(t.locale??o())===`zh-TW`?`左`:`Left`),V=((e={},t={})=>(t.locale??o())===`zh-TW`?`下一頁`:`Page down`),H=((e={},t={})=>(t.locale??o())===`zh-TW`?`上一頁`:`Page up`),U=((e={},t={})=>(t.locale??o())===`zh-TW`?`右`:`Right`),W=((e={},t={})=>(t.locale??o(),`Shift+Tab`)),G=((e={},t={})=>(t.locale??o())===`zh-TW`?`空白鍵`:`Space`),le=((e={},t={})=>(t.locale??o(),`Tab`)),ue=((e={},t={})=>(t.locale??o())===`zh-TW`?`上`:`Up`),de=e=>`Keys for ${e?.name}`,fe=e=>`${e?.name} 的按鍵`,pe=((e,t={})=>(t.locale??o())===`zh-TW`?fe(e):de(e)),me=((e={},t={})=>(t.locale??o())===`zh-TW`?`最後一則通訊`:`Last transmission`),he=((e={},t={})=>(t.locale??o())===`zh-TW`?`稍後`:`Later`),ge=((e={},t={})=>(t.locale??o())===`zh-TW`?`已離開網`:`left the net`),_e=e=>`The mirror ended: ${e?.why}`,ve=e=>`鏡像已結束:${e?.why}`,ye=((e,t={})=>(t.locale??o())===`zh-TW`?ve(e):_e(e)),be=((e={},t={})=>(t.locale??o())===`zh-TW`?`等待輸入密碼時隱藏;請在終端機中輸入。`:`Hidden while it waits for a secret; type it in the terminal.`),xe=e=>`Live · ${e?.cols}×${e?.rows}`,Se=e=>`即時 · ${e?.cols}×${e?.rows}`,Ce=((e,t={})=>(t.locale??o())===`zh-TW`?Se(e):xe(e)),we=((e={},t={})=>(t.locale??o())===`zh-TW`?`還沒有訊息。`:`No messages yet.`),Te=((e={},t={})=>(t.locale??o())===`zh-TW`?`開啟通訊`:`Open comms`),Ee=((e={},t={})=>(t.locale??o())===`zh-TW`?`此分頁隱藏時暫停。`:`Paused while this tab is hidden.`),De=e=>`${e?.why} Open the terminal again to retry.`,Oe=e=>`${e?.why} 重新開啟終端機即可重試。`,ke=((e,t={})=>(t.locale??o())===`zh-TW`?Oe(e):De(e)),Ae=((e={},t={})=>(t.locale??o())===`zh-TW`?`送出 Enter`:`Send Enter`),je=((e={},t={})=>(t.locale??o())===`zh-TW`?`送出 Escape`:`Send Escape`),Me=e=>`Send ${e?.key}`,Ne=e=>`送出 ${e?.key}`,Pe=((e,t={})=>(t.locale??o())===`zh-TW`?Ne(e):Me(e)),Fe=((e={},t={})=>(t.locale??o())===`zh-TW`?`錯誤`:`error`),Ie=((e={},t={})=>(t.locale??o())===`zh-TW`?`已完成`:`finished`),Le=((e={},t={})=>(t.locale??o())===`zh-TW`?`已離開`:`gone`),Re=((e={},t={})=>(t.locale??o())===`zh-TW`?`提問`:`question`),ze=((e={},t={})=>(t.locale??o())===`zh-TW`?`更新`:`update`),Be=e=>`${e?.count} finished`,Ve=e=>`${e?.count} 個已完成`,He=((e,t={})=>(t.locale??o())===`zh-TW`?Ve(e):Be(e)),Ue=e=>{let n=t(`en`,e?.count,{},!0);return n===`one`?`${e?.count} needs you`:n===`other`?`${e?.count} need you`:`tally_need`},We=e=>`${e?.count} 個需要你`,Ge=((e,t={})=>(t.locale??o())===`zh-TW`?We(e):Ue(e)),Ke=e=>`Terminal of ${e?.name}, read only`,qe=e=>`${e?.name} 的終端機,唯讀`,Je=((e,t={})=>(t.locale??o())===`zh-TW`?qe(e):Ke(e)),Ye=e=>`Terminal · ${e?.name}`,Xe=e=>`終端機 · ${e?.name}`,Ze=((e,t={})=>(t.locale??o())===`zh-TW`?Xe(e):Ye(e)),Qe=((e={},t={})=>(t.locale??o())===`zh-TW`?`◉ 鍵盤直送中 · 點外面結束`:`◉ Keyboard goes to the pane · click outside to stop`),K=((e={},t={})=>(t.locale??o())===`zh-TW`?`點這裡後,鍵盤直接送進終端機(Ctrl、Alt、⌘ 組合鍵除外)`:`Click here and the keyboard goes straight to the terminal (except Ctrl, Alt, and ⌘ combinations)`),$e=((e={},t={})=>(t.locale??o())===`zh-TW`?`等待`:`waiting on`),et=[[[`esc`,`esc`,B],[`tab`,`tab`,le],[`up`,`↑`,ue],[`enter`,`enter`,z]],[[`shift+tab`,`⇧tab`,W],[`left`,`←`,ce],[`down`,`↓`,L],[`right`,`→`,U]],[[`space`,`space`,G],[`backspace`,`⌫`,I],[`home`,`home`,se],[`end`,`end`,R],[`pageup`,`pgup`,H],[`pagedown`,`pgdn`,V]]],tt=`123456789`.split(``),nt={ArrowUp:`up`,ArrowDown:`down`,ArrowLeft:`left`,ArrowRight:`right`,Enter:`enter`,Escape:`esc`,Backspace:`backspace`,Home:`home`,End:`end`,PageUp:`pageup`,PageDown:`pagedown`},rt=130,it=64,q=4e3,at=typeof navigator<`u`&&/Mac|iPhone|iPad/.test(navigator.platform),ot=e=>e.split(`+`).map(e=>e.length===1?e.toUpperCase():e[0].toUpperCase()+e.slice(1)).join(`+`);function st({name:e,state:t,post:r,stream:a,blip:o}){let s=[],u=l(`p`,{class:`pad-note`,role:`status`}),d=!1,f=([e,t,n])=>{let r=l(`button`,{type:`button`,class:`pad-key`,"data-key":e,"aria-label":n()},t);return r.onclick=t=>t.isTrusted&&(v.push({key:e}),x()),s.push(r),r},p=l(`details`,{class:`pad-digits`},l(`summary`,null,`1–9`),l(`div`,{class:`pad-row`},...tt.map(e=>f([e,e,()=>e])))),m=l(`div`,{class:`pad`,role:`group`,"aria-label":pe({name:e})},...et.map(e=>l(`div`,{class:`pad-row`},...e.map(f))),p,u),h=(e,t=``)=>(u.dataset.tone=t,u.replaceChildren(e)),g=(e,t,n)=>{let r=l(`button`,{type:`button`,class:`pad-yes`},e===`enter`?Ae():e===`esc`?je():Pe({key:ot(e)})),i=l(`button`,{type:`button`,class:`cmp-link`},c());r.onclick=t=>t.isTrusted&&!d&&void _({key:e},n),i.onclick=()=>h(``),u.dataset.tone=`ask`,u.replaceChildren(l(`span`,null,t),r,i),i.focus()};async function _(e,t){d=!0,D(),h(``),y=Date.now();try{let n=await r(`keys`,{...e,stream:a(),...t?{confirmed:t}:{}});n.status===409&&n.body.error===`confirm`&&typeof n.body.confirm==`string`&&`key`in e?(v=[],g(e.key,String(n.body.reason??``),n.body.confirm)):n.ok||(v=[],h(n.body.reason??i({status:n.status}),`error`))}catch{v=[],h(n(),`error`)}finally{d=!1,D(),x()}}let v=[],y=0,b;function x(){if(d||b||!v.length)return;let e=y+rt-Date.now();if(e>0)return void(b=setTimeout(()=>(b=void 0,x()),e));_(v.shift())}let S=e=>{if(e.ctrlKey===e.altKey||e.shiftKey)return;let t=e.ctrlKey?`ctrl`:`alt`,n=/^Key([A-Z])$/.exec(e.code)?.[1].toLowerCase();if(at||t!==`ctrl`||n!==`v`&&(n!==`c`||getSelection()?.isCollapsed))return n?`${t}+${n}`:{Enter:t===`alt`?`alt+enter`:void 0,Backspace:t===`alt`?`alt+backspace`:void 0,ArrowLeft:`${t}+left`,ArrowRight:`${t}+right`}[e.key]},C=e=>(t=>t===`live`||t===`hidden`&&e===`esc`)(t());function w(e){if(e.metaKey||e.isComposing||e.key===`Process`)return!1;let t=e.ctrlKey||e.altKey?S(e):e.key===`Tab`?e.shiftKey?`shift+tab`:`tab`:e.key===`Delete`?`delete`:nt[e.key];return t?(!C(t)||e.repeat&&(v.length||![`up`,`down`,`left`,`right`,`backspace`,`delete`].includes(t))||(v.push({key:t}),o?.(),x()),!0):!1}function T(e){let t=[...e.replace(/[\u0000-\u001f\u007f-\u009f]/g,``)];if(t.length&&C()){for(let e of t){let t=v.at(-1);t&&`text`in t&&[...t.text].length<it?t.text+=e:v.push({text:e})}o?.(),x()}}function E(e){let t=[...e.replace(/\r\n?/g,`
2
2
  `).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g,``)];if(t.length&&C()){for(let e=0;e<t.length;e+=q)v.push({paste:t.slice(e,e+q).join(``)});o?.(),x()}}function D(){let e=t();for(let t of s)t.disabled=e===`off`||e===`hidden`&&t.dataset.key!==`esc`}return D(),{el:m,update:D,type:w,text:T,paste:E}}var J=[0,95,135,175,215,255],ct=120,lt=5e3,ut=3e3,Y=e=>Number.isInteger(e)&&e>=0&&e<=255,dt=e=>Y(e)?e<16?e:e<232?`rgb(${J[Math.floor((e-16)/36)]},${J[Math.floor((e-16)/6)%6]},${J[(e-16)%6]})`:`rgb(${8+10*(e-232)},${8+10*(e-232)},${8+10*(e-232)})`:void 0,ft=([e,t,n])=>[e,t,n].every(e=>Y(e))?`rgb(${e},${t},${n})`:void 0;function pt(e,t){let n={...e},r=t.split(`;`);for(let e=0;e<r.length;e++){let t=r[e].split(`:`).map(e=>e===``?0:Number(e)),i=t[0];if(i===38||i===48||i===58){let a=t.length>1?t[1]:Number(r[e+1]),o=t.length>1?t.slice(2):r.slice(e+2,e+(a===5?3:5)).map(Number);t.length===1&&(e+=a===5?2:a===2?4:1);let s=a===5?dt(o[0]):a===2?ft(o.slice(-3)):void 0;s!==void 0&&i!==58&&(n[i===38?`fg`:`bg`]=s)}else if(i===0)for(let e of Object.keys(n))delete n[e];else i===1||i===2?n[i===1?`b`:`d`]=!0:i===22?n.b=n.d=!1:i===3||i===23?n.i=i===3:i===4||i===21||i===24?n.u=i!==24&&t[1]!==0:i===7||i===27?n.v=i===7:i===9||i===29?n.s=i===9:i>=30&&i<=37||i>=90&&i<=97?n.fg=i-(i<90?30:82):i>=40&&i<=47||i>=100&&i<=107?n.bg=i-(i<100?40:92):(i===39||i===49)&&delete n[i===39?`fg`:`bg`]}return n}function mt(e){let t=[],n={},r=0,i=e=>{let r=e.replace(/\x1b(\[[0-?]*[ -/]*[@-~]?)?|[\u0000-\u001f\u007f-\u009f]/g,``);if(!r)return;let[i,a]=n.v?[n.bg??`z`,n.fg??`z`]:[n.fg,n.bg],o=[typeof i==`number`||i===`z`?`c${i}`:``,typeof a==`number`||a===`z`?`k${a}`:``,...[`b`,`d`,`i`,`u`,`s`].filter(e=>n[e]).map(e=>`t${e}`)].filter(Boolean).join(` `);t.push({text:r,cls:o,...typeof i==`string`&&i!==`z`&&{fg:i},...typeof a==`string`&&a!==`z`&&{bg:a}})};for(let t of e.matchAll(/\x1b\[([0-9;:]{0,64})m/g))i(e.slice(r,t.index)),n=pt(n,t[1]),r=t.index+t[0].length;return i(e.slice(r)),t}function X(e,t){let n=Math.min(Math.max(0,Number(t.rows)||0),ct);for(;e.children.length<n;)e.append(l(`div`,{class:`tr`}));for(;e.children.length>n;)e.lastElementChild.remove();for(let[r,i]of Array.isArray(t.set)?t.set:[])!Number.isInteger(r)||r<0||r>=n||typeof i!=`string`||e.children[r].replaceChildren(...mt(i).map(e=>{if(!e.cls&&!e.fg&&!e.bg)return e.text;let t=l(`span`,e.cls?{class:e.cls}:null,e.text);return e.fg&&(t.style.color=e.fg),e.bg&&(t.style.backgroundColor=e.bg),t}))}function Z({tiles:e,post:t,stream:r,pad:a}){let o=new Map,s,c=()=>{try{return String(JSON.parse(r()).stream??``)}catch{return``}},u=(e,t,n=``)=>(e.pad?.update(),(e.state.textContent!==t||e.state.dataset.tone!==n)&&(e.state.dataset.tone=n,e.state.textContent=t)),d=(e,t)=>(e.ended=!0,u(e,ke({why:t}),`error`)),f=(e,t,r=c())=>r&&void(e.queue=e.queue.then(()=>e.post(`mirror`,{stream:r,on:t}).then(n=>t&&!n.ok&&d(e,n.body.reason??i({status:n.status})),()=>t&&d(e,n())))),p=(e,t=Math.max(e.cols,...[...e.box.children].map(e=>e.textContent?.length??0)))=>e.box.style.fontSize=e.fit.getAttribute(`aria-pressed`)===`true`&&t?`${Math.max(6,Math.floor((e.scroll.clientWidth-20)/(t*.6)))}px`:``,m=e=>Date.now()-e.seen>ut,h=()=>(clearInterval(s),s=o.size&&!document.hidden?setInterval(()=>o.forEach(e=>(e.box.classList.toggle(`stale`,m(e)),e.pad?.update())),1e3):void 0);document.addEventListener(`visibilitychange`,()=>(h(),o.forEach(e=>{clearTimeout(e.away),document.hidden?e.away=setTimeout(()=>(e.parked=!0,f(e,!1),u(e,Ee())),lt):e.parked&&(e.parked=!1,f(e,!0))})));let g=(e,n)=>{let r={key:e,box:l(`div`,{class:`term`,role:`group`,"aria-label":Je({name:n})}),scroll:l(`div`,{class:`term-scroll`,tabindex:`0`}),state:l(`p`,{class:`term-state`,role:`status`},M()),fit:l(`button`,{type:`button`,class:`cmp-link`,"aria-pressed":`false`},F()),typing:l(`span`,{class:`term-typing`,hidden:``},Qe()),sink:l(`textarea`,{class:`term-sink`,rows:`1`,"aria-label":K(),autocomplete:`off`,autocapitalize:`off`,autocorrect:`off`,spellcheck:`false`}),post:t(e),cols:0,seen:0,parked:!1,first:!0,ended:!1,queue:Promise.resolve()};if(r.fit.onclick=()=>(r.fit.setAttribute(`aria-pressed`,String(r.fit.getAttribute(`aria-pressed`)!==`true`)),p(r),requestAnimationFrame(()=>r.scroll.scrollTop=r.scroll.scrollHeight)),r.scroll.append(r.box),globalThis.matchMedia?.(`(pointer: fine)`).matches){let{sink:e}=r,t=()=>(t=>(e.value=``,t&&r.pad?.text?.(t)))(e.value);r.scroll.title=K(),r.scroll.addEventListener(`click`,()=>getSelection()?.isCollapsed!==!1&&e.focus({preventScroll:!0})),e.addEventListener(`keydown`,e=>r.pad?.type?.(e)&&e.preventDefault()),e.addEventListener(`input`,e=>!e.isComposing&&t()),e.addEventListener(`compositionend`,t),e.addEventListener(`paste`,e=>(e.preventDefault(),r.pad?.paste?.(e.clipboardData?.getData(`text/plain`)??``))),e.addEventListener(`focus`,()=>{let t=r.scroll.getBoundingClientRect();Object.assign(e.style,{left:`${t.left+12}px`,top:`${Math.min(t.bottom,innerHeight)-28}px`}),r.typing.hidden=!1,r.scroll.classList.add(`typing`,`engage`)}),e.addEventListener(`blur`,()=>(r.typing.hidden=!0,r.scroll.classList.remove(`typing`,`engage`,`blip`),t())),r.scroll.addEventListener(`animationend`,e=>r.scroll.classList.remove(e.animationName===`term-engage`?`engage`:`blip`))}return new ResizeObserver(()=>p(r)).observe(r.scroll),o.set(e,r),f(r,!0),h(),r.pad=a?.({name:n,state:()=>r.parked||r.ended||m(r)?`off`:r.box.classList.contains(`hidden`)?`hidden`:`live`,post:r.post,stream:c,blip:()=>S(r.scroll,`blip`)}),r.tile={id:`term:${e}`,title:Ze({name:n}),icon:`i-comms`,body:()=>l(`div`,{class:`term-tile`},l(`div`,{class:`term-bar`},r.state,r.typing,r.fit),r.scroll,r.sink,r.pad?.el),closed:()=>(clearTimeout(r.away),f(r,!1),o.delete(e),h())}};return{open(t,n){let r=o.get(t);r?.ended&&(r.ended=!1,u(r,M()),f(r,!0)),e.open(r?.tile??g(t,n),!0)},embed(e,t,n){let r=o.get(e);r?.ended&&(r.ended=!1,u(r,M()),f(r,!0));let i=r?.tile??g(e,t);return n.replaceChildren(i.body()),()=>(i.closed?.(),n.replaceChildren())},hello:()=>o.forEach(e=>!e.parked&&!e.ended&&f(e,!0)),frame(e){let t;try{t=JSON.parse(e)}catch{return}let n=o.get(t.key);if(n){if(n.box.classList.toggle(`hidden`,!!(t.hidden||t.ended)),t.ended)return d(n,ye({why:t.ended}));if([n.seen,n.ended]=[Date.now(),!1],n.box.classList.remove(`stale`),t.hidden)return X(n.box,{key:n.key,rows:0}),u(n,be());X(n.box,t),(t.whole||t.cols&&t.cols!==n.cols)&&(n.cols=t.cols||n.cols,p(n)),u(n,Ce({cols:n.cols,rows:n.box.children.length}),`ok`),n.first&&t.whole&&(n.first=!1,requestAnimationFrame(()=>n.scroll.scrollTop=n.scroll.scrollHeight))}}}}var Q=(e,t)=>C(e.mark)-C(t.mark)||e.at-t.at,$=e=>{let t=e.filter(e=>C(e.mark)===0).length,n=e.length-t;return[t&&Ge({count:t}),n&&He({count:n})].filter(Boolean).join(` · `)};function ht(e){let t=[],n=[],r=()=>e.render(t.map(e=>e.alert),n),i=(i,a,o=!0)=>{let s=t.findIndex(e=>e.alert.key===i.key);if(s>=0&&!o)return;let c=s>=0?t.splice(s,1)[0]:{alert:i,back:a,raised:i.mark};!o&&t.length?t.splice(t.length-1,0,c):t.push(c),n=n.filter(e=>e.key!==i.key),r(),o&&e.enter(c.alert)};return{get open(){return t.map(e=>e.alert)},get queue(){return n},arrive(e){let i=t.find(t=>t.alert.key===e.key);if(i)[i.alert,i.raised]=[{...e,at:i.alert.at},e.mark];else{let t=n.find(t=>t.key===e.key);n=[...n.filter(t=>t.key!==e.key),t&&t.mark===e.mark?t:e].sort(Q)}r()},prune(e){n=n.filter(t=>(e=>e?.mark===t.mark&&!(C(t.mark)!==0&&e.closed))(e(t.key)));for(let n of t){let t=e(n.alert.key);n.alert=t?{...n.alert,...t,gone:void 0,at:n.alert.at}:{...n.alert,mark:`unknown`,note:void 0,pending:void 0,gone:!0}}r()},redraw:r,show:(t,n=!0)=>i(t,e.focused(),n),raise(n){let r=t.find(e=>e.alert.key===n);r&&r!==t.at(-1)&&i(r.alert,e.focused())},next(){let t=n.find(e=>C(e.mark)===0);t&&i(t,e.focused())},resolve(e){n=n.filter(t=>C(t.mark)===0||!e.includes(t.key)),r()},close(a=`close`){let o=t.pop();if(!o)return!1;let s=t.at(-1),c=a===`close`?n.find(e=>C(e.mark)===0):void 0;return a===`later`&&o.alert.mark===o.raised&&C(o.raised)===0&&(n=[...n,o.alert].sort(Q)),!s&&c?(i(c,o.back),!0):(r(),!e.restore(o.back)&&s&&e.enter(s.alert),!0)}}}var gt=`a, button, input, textarea, select, summary, label, [role=button]`;function _t(e){let t=[],n,r=()=>e.render(t,n);return{get tiles(){return t},get active(){return n},open(i,a=!0){if(!a&&t.length>=4&&!t.some(e=>e.id===i.id))return void i.closed?.();t.some(e=>e.id===i.id)||(t=[...t,i]).slice(0,-4).forEach(e=>e.closed?.()),t=t.slice(-4),(a||!t.some(e=>e.id===n))&&(n=i.id),r(),a&&e.enter(t.find(e=>e.id===i.id))},close(e){let i=t.findIndex(t=>t.id===e);i<0||(t[i].closed?.(),t=t.filter(t=>t.id!==e),n===e&&(n=(t[i]??t[i-1])?.id),r())},activate(e){n=e,r()}}}function vt(e){let t=new Set(e.flatMap(e=>e.kind===`result`&&e.callId?[e.callId]:[])),n=e.filter(e=>e.kind===`assistant`),r=n.at(-1),i=r?.tools?.find(e=>!t.has(e.id));return{said:(n.findLast(e=>e.text?.trim())?.text?.trim().split(`
3
- `).filter(Boolean).at(-1))?.slice(0,280),pending:i&&`${i.name} · ${i.summary}`.slice(0,200),at:(r??e.findLast(e=>e.kind!==`result`))?.id}}var yt=()=>x(`<section class="dialog" role="dialog" aria-modal="false" tabindex="-1"><header><b class="tag">${N()}</b><span class="where"></span><button class="zoom" type="button"></button><button class="x" type="button" aria-label="${s()}">×</button></header><div class="who">${y}<div><h3></h3><p><em class="role"></em> <span class="state"></span></p></div></div><div class="intel"><h4>${me()}</h4><p class="said">…</p><p class="pending" hidden><b>${$e()}</b> <span></span></p></div><div class="ask-root"></div><footer><a class="go">${Te()}</a><button class="later" type="button">${he()}</button><span class="queued"></span></footer></section>`),bt=()=>x(`<li><a class="done-go">${y}<span><b class="name"></b><small></small></span></a></li>`),xt=()=>x(`<section class="tile" tabindex="-1"><header><svg><use href="#i-doc"/></svg><b></b><button class="x" type="button" aria-label="${k()}">×</button></header><div class="tile-body"></div></section>`);function St(t){let[n,i,o,s,c]=[_(`dock`,HTMLElement),_(`work`,HTMLElement),_(`tiles`,HTMLElement),_(`tile-tabs`,HTMLElement),_(`alerts`,HTMLButtonElement)],l=new Map,S=(e,t,n=l.get(t.key))=>{let r=e.dataset.gone===`true`;g(e,`.said`,n?.failed?oe():n?.said??we()),e.querySelector(`.pending`).hidden=!n?.pending||r,g(e,`.pending span`,n?.pending??``),m(e.querySelector(`.go`),r?void 0:{view:`session`,ws:t.ws,key:u(t),...n?.at&&{at:n.at}})},w=(e,r={said:`…`})=>{l.set(e.key,r),t.recent(u(e)).then(vt,()=>({failed:!0})).then(t=>{let i=l.get(e.key)===r&&(l.set(e.key,t),n.querySelector(`.dialog[data-key="${CSS.escape(e.key)}"]`));i&&S(i,e),e.mark===`done`&&N(L.queue)})},T=()=>n.classList.contains(`wide`),D=e=>{n.classList.toggle(`wide`,e);try{localStorage.setItem(`sb.dialog-wide`,e?`1`:`0`)}catch{}for(let e of n.querySelectorAll(`.zoom`))O(e)},O=e=>{e.textContent=T()?`⤡`:`⤢`,e.setAttribute(`aria-pressed`,String(T())),e.setAttribute(`aria-label`,T()?ie():re()),e.title=e.getAttribute(`aria-label`)};try{n.classList.toggle(`wide`,localStorage.getItem(`sb.dialog-wide`)===`1`)}catch{}let k=(e,n,i,a)=>{f(e,n.mark),O(e.querySelector(`.zoom`)),e.dataset.gone=String(!!n.gone),e.style.transform=i?`translateY(${-12*i}px) scale(${1-.06*i})`:``,e.style.opacity=String(Math.max(0,1-.3*i)),e.toggleAttribute(`inert`,i>0),e.setAttribute(`aria-label`,`${n.name}: ${b(n.note,n.mark)}`),d(e.querySelector(`.plate`),n.role,n.mark),g(e,`h3`,n.name),g(e,`.role`,p(n.role)),g(e,`.state`,n.gone?ge():b(n.note,n.mark)),g(e,`.where`,t.label(n.ws)),g(e,`.tag`,n.gone?Le():({waiting:Re,error:Fe,done:Ie}[n.mark]??ze)()),g(e,`.queued`,a.length?ee({tally:$(a)}):``),e.querySelector(`.later`).hidden=C(n.mark)!==0,l.has(n.key)||w(n),S(e,n);let o=F.get(e);o||F.set(e,o=r(e.querySelector(`.ask-root`),I(u(n)),void 0,()=>t.showTerminal(n.ws,u(n)))),o.update(n.pending,n.mark===`waiting`&&document.body.dataset.stale!==`true`)},[A,j,M]=[_(`done`,HTMLButtonElement),_(`done-pop`,HTMLElement),_(`done-list`,HTMLElement)],N=e=>{let n=e.filter(e=>C(e.mark)!==0);A.hidden=!n.length,A.textContent=`${ae()} ${n.length}`,A.title=P(),!n.length&&j.matches(`:popover-open`)&&j.hidePopover(),v(M,n.map(e=>({...e,id:e.key})),bt,(e,n)=>{let r=l.get(n.key);d(e.querySelector(`.plate`),n.role,n.mark),g(e,`.name`,n.name),g(e,`small`,`${t.label(n.ws)} · ${r?.said??b(n.note,n.mark)}`),m(e.querySelector(`.done-go`),{view:`session`,ws:n.ws,key:u(n),...r?.at&&{at:r.at}})})};_(`done-clear`,HTMLButtonElement).textContent=te(),j.setAttribute(`aria-label`,P()),j.addEventListener(`toggle`,e=>e.newState===`open`&&h(j,A)),M.addEventListener(`click`,e=>{let t=e.target.closest(`li[data-key]`);t&&queueMicrotask(()=>(L.resolve([t.dataset.key]),j.hidePopover()))}),_(`done-clear`,HTMLButtonElement).addEventListener(`click`,()=>(L.resolve(L.queue.map(e=>e.key)),j.hidePopover()));let F=new WeakMap,I=n=>t.post?.(n)??((t,r)=>e(`sessions/${encodeURIComponent(n)}/${t}`,r)),L=ht({render(e,t){v(n,e.map(e=>({...e,id:e.key})),yt,(n,r)=>k(n,r,e.length-1-e.findIndex(e=>e.key===r.key),t));let r=t.filter(e=>C(e.mark)===0),i=r[0];c.disabled=!i,c.dataset.mark=i?.mark??`unknown`,g(c,`#alert-count`,String(r.length)),c.title=r.length?E({tally:$(r)}):``,g(c,`#alert-text`,i?`${i.name} · ${b(i.note,i.mark)}`:a()),v(c.querySelector(`.faces`),r.slice(0,3).map(e=>({...e,id:e.key})),()=>x(y),(e,t)=>d(e,t.role,t.mark)),N(t)},enter(e){let t=n.querySelector(`[data-key="${CSS.escape(e.key)}"]`);t&&!F.get(t)?.enter()&&t.querySelector(`.go`)?.focus()},focused:()=>document.activeElement instanceof HTMLElement&&document.activeElement!==document.body?document.activeElement:void 0,restore:e=>!!(e?.isConnected&&!e.closest(`[inert]`)&&(e.focus(),document.activeElement===e))});c.addEventListener(`click`,()=>L.next()),document.addEventListener(`click`,e=>{let t=t=>{let n=t.getBoundingClientRect();return e.clientX>=n.left&&e.clientX<=n.right&&e.clientY>=n.top&&e.clientY<=n.bottom},r=[...n.querySelectorAll(`.dialog:not(.leaving)`)],i=r.slice(0,-1).reverse().find(t);e.defaultPrevented||!i||!r.length||t(r.at(-1))||e.target?.closest?.(gt)||(e.preventDefault(),e.stopPropagation(),L.raise(i.dataset.key))},!0),n.addEventListener(`click`,e=>{let t=e.target;t.closest(`.zoom`)?D(!T()):t.closest(`.x`)?L.close():t.closest(`.later`)?L.close(`later`):t.closest(`.go`)&&queueMicrotask(()=>void L.close(`go`))});let R=0,z=()=>o.classList.toggle(`tabbed`,B.tiles.length>1&&i.clientWidth<460+B.tiles.length*400),B=_t({render(e,t){o.hidden=!e.length,v(o,e,e=>{let t=xt();return t.querySelector(`use`).setAttribute(`href`,`#${e.icon??`i-doc`}`),t.querySelector(`.x`).setAttribute(`aria-label`,ne({title:e.title})),t.querySelector(`.tile-body`).append(e.body()),t.querySelector(`.x`).addEventListener(`click`,()=>B.close(e.id)),t},(e,n)=>{g(e,`header b`,n.title),e.classList.toggle(`active`,n.id===t)}),v(s,e,()=>x(`<button type="button" class="tab-btn"></button>`),(e,n)=>{e.textContent=n.title,e.classList.toggle(`active`,n.id===t),e.onclick=()=>B.activate(n.id)}),o.prepend(s),e.length!==R&&(R=e.length,z())},enter:e=>requestAnimationFrame(()=>o.querySelector(`.tile[data-key="${CSS.escape(e.id)}"]`)?.focus())});return new ResizeObserver(z).observe(i),{tiles:B,stack:L,terminal:Z({tiles:B,post:I,stream:t.stream,pad:st}),hotkey(e){if(e===`next`)return!c.disabled&&(L.next(),!0);let t=[...n.querySelectorAll(`.dialog:not(.leaving) .zoom`)].at(-1);return t?.getClientRects().length?(t.click(),!0):!1},alerts(e,t){for(let t of e)w(t),L.arrive(t);L.prune(e=>t.get(e))}}}export{St as mountPanels};
3
+ `).filter(Boolean).at(-1))?.slice(0,280),pending:i&&`${i.name} · ${i.summary}`.slice(0,200),at:(r??e.findLast(e=>e.kind!==`result`))?.id}}var yt=()=>x(`<section class="dialog" role="dialog" aria-modal="false" tabindex="-1"><header><b class="tag">${N()}</b><span class="where"></span><button class="zoom" type="button"></button><button class="x" type="button" aria-label="${s()}">×</button></header><div class="who">${y}<div><h3></h3><p><em class="role"></em> <span class="state"></span></p></div></div><div class="intel"><h4>${me()}</h4><p class="said">…</p><p class="pending" hidden><b>${$e()}</b> <span></span></p></div><div class="ask-root"></div><footer><a class="go">${Te()}</a><button class="later" type="button">${he()}</button><span class="queued"></span></footer></section>`),bt=()=>x(`<li><a class="done-go">${y}<span><b class="name"></b><small></small></span></a></li>`),xt=()=>x(`<section class="tile" tabindex="-1"><header><svg><use href="#i-doc"/></svg><b></b><button class="x" type="button" aria-label="${k()}">×</button></header><div class="tile-body"></div></section>`);function St(t){let[n,i,o,s,c]=[_(`dock`,HTMLElement),_(`work`,HTMLElement),_(`tiles`,HTMLElement),_(`tile-tabs`,HTMLElement),_(`alerts`,HTMLButtonElement)],l=new Map,S=(e,t,n=l.get(t.key))=>{let r=e.dataset.gone===`true`;g(e,`.said`,n?.failed?oe():n?.said??we()),e.querySelector(`.pending`).hidden=!n?.pending||r,g(e,`.pending span`,n?.pending??``),m(e.querySelector(`.go`),r?void 0:{view:`session`,ws:t.ws,key:u(t),...n?.at&&{at:n.at}})},w=(e,r={said:`…`})=>{l.set(e.key,r),t.recent(u(e)).then(vt,()=>({failed:!0})).then(t=>{let i=l.get(e.key)===r&&(l.set(e.key,t),n.querySelector(`.dialog[data-key="${CSS.escape(e.key)}"]`));i&&S(i,e),e.mark===`done`&&N(L.queue)})},T=()=>n.classList.contains(`wide`),D=e=>{n.classList.toggle(`wide`,e);try{localStorage.setItem(`sb.dialog-wide`,e?`1`:`0`)}catch{}for(let e of n.querySelectorAll(`.zoom`))O(e)},O=e=>{e.textContent=T()?`⤡`:`⤢`,e.setAttribute(`aria-pressed`,String(T())),e.setAttribute(`aria-label`,T()?ie():re()),e.title=e.getAttribute(`aria-label`)};try{n.classList.toggle(`wide`,localStorage.getItem(`sb.dialog-wide`)===`1`)}catch{}let k=(e,n,i,a)=>{f(e,n.mark),O(e.querySelector(`.zoom`)),e.dataset.gone=String(!!n.gone),e.style.transform=i?`translateY(${-12*i}px) scale(${1-.06*i})`:``,e.style.opacity=String(Math.max(0,1-.3*i)),e.toggleAttribute(`inert`,i>0),e.setAttribute(`aria-label`,`${n.name}: ${b(n.note,n.mark)}`),d(e.querySelector(`.plate`),n.role,n.mark),g(e,`h3`,n.name),g(e,`.role`,p(n.role)),g(e,`.state`,n.gone?ge():b(n.note,n.mark)),g(e,`.where`,t.label(n.ws)),g(e,`.tag`,n.gone?Le():({waiting:Re,error:Fe,done:Ie}[n.mark]??ze)()),g(e,`.queued`,a.length?ee({tally:$(a)}):``),e.querySelector(`.later`).hidden=C(n.mark)!==0,l.has(n.key)||w(n),S(e,n);let o=F.get(e);o||F.set(e,o=r(e.querySelector(`.ask-root`),I(u(n)),void 0,()=>t.showTerminal(n.ws,u(n)),()=>e.isConnected&&!e.classList.contains(`leaving`)&&(L.raise(e.dataset.key),L.close()))),o.update(n.pending,n.mark===`waiting`&&document.body.dataset.stale!==`true`)},[A,j,M]=[_(`done`,HTMLButtonElement),_(`done-pop`,HTMLElement),_(`done-list`,HTMLElement)],N=e=>{let n=e.filter(e=>C(e.mark)!==0);A.hidden=!n.length,A.textContent=`${ae()} ${n.length}`,A.title=P(),!n.length&&j.matches(`:popover-open`)&&j.hidePopover(),v(M,n.map(e=>({...e,id:e.key})),bt,(e,n)=>{let r=l.get(n.key);d(e.querySelector(`.plate`),n.role,n.mark),g(e,`.name`,n.name),g(e,`small`,`${t.label(n.ws)} · ${r?.said??b(n.note,n.mark)}`),m(e.querySelector(`.done-go`),{view:`session`,ws:n.ws,key:u(n),...r?.at&&{at:r.at}})})};_(`done-clear`,HTMLButtonElement).textContent=te(),j.setAttribute(`aria-label`,P()),j.addEventListener(`toggle`,e=>e.newState===`open`&&h(j,A)),M.addEventListener(`click`,e=>{let t=e.target.closest(`li[data-key]`);t&&queueMicrotask(()=>(L.resolve([t.dataset.key]),j.hidePopover()))}),_(`done-clear`,HTMLButtonElement).addEventListener(`click`,()=>(L.resolve(L.queue.map(e=>e.key)),j.hidePopover()));let F=new WeakMap,I=n=>t.post?.(n)??((t,r)=>e(`sessions/${encodeURIComponent(n)}/${t}`,r)),L=ht({render(e,t){v(n,e.map(e=>({...e,id:e.key})),yt,(n,r)=>k(n,r,e.length-1-e.findIndex(e=>e.key===r.key),t));let r=t.filter(e=>C(e.mark)===0),i=r[0];c.disabled=!i,c.dataset.mark=i?.mark??`unknown`,g(c,`#alert-count`,String(r.length)),c.title=r.length?E({tally:$(r)}):``,g(c,`#alert-text`,i?`${i.name} · ${b(i.note,i.mark)}`:a()),v(c.querySelector(`.faces`),r.slice(0,3).map(e=>({...e,id:e.key})),()=>x(y),(e,t)=>d(e,t.role,t.mark)),N(t)},enter(e){let t=n.querySelector(`[data-key="${CSS.escape(e.key)}"]`);t&&!F.get(t)?.enter()&&t.querySelector(`.go`)?.focus()},focused:()=>document.activeElement instanceof HTMLElement&&document.activeElement!==document.body?document.activeElement:void 0,restore:e=>!!(e?.isConnected&&!e.closest(`[inert]`)&&(e.focus(),document.activeElement===e))});c.addEventListener(`click`,()=>L.next()),document.addEventListener(`click`,e=>{let t=t=>{let n=t.getBoundingClientRect();return e.clientX>=n.left&&e.clientX<=n.right&&e.clientY>=n.top&&e.clientY<=n.bottom},r=[...n.querySelectorAll(`.dialog:not(.leaving)`)],i=r.slice(0,-1).reverse().find(t);e.defaultPrevented||!i||!r.length||t(r.at(-1))||e.target?.closest?.(gt)||(e.preventDefault(),e.stopPropagation(),L.raise(i.dataset.key))},!0),n.addEventListener(`click`,e=>{let t=e.target;t.closest(`.zoom`)?D(!T()):t.closest(`.x`)?L.close():t.closest(`.later`)?L.close(`later`):t.closest(`.go`)&&queueMicrotask(()=>void L.close(`go`))});let R=0,z=()=>o.classList.toggle(`tabbed`,B.tiles.length>1&&i.clientWidth<460+B.tiles.length*400),B=_t({render(e,t){o.hidden=!e.length,v(o,e,e=>{let t=xt();return t.querySelector(`use`).setAttribute(`href`,`#${e.icon??`i-doc`}`),t.querySelector(`.x`).setAttribute(`aria-label`,ne({title:e.title})),t.querySelector(`.tile-body`).append(e.body()),t.querySelector(`.x`).addEventListener(`click`,()=>B.close(e.id)),t},(e,n)=>{g(e,`header b`,n.title),e.classList.toggle(`active`,n.id===t)}),v(s,e,()=>x(`<button type="button" class="tab-btn"></button>`),(e,n)=>{e.textContent=n.title,e.classList.toggle(`active`,n.id===t),e.onclick=()=>B.activate(n.id)}),o.prepend(s),e.length!==R&&(R=e.length,z())},enter:e=>requestAnimationFrame(()=>o.querySelector(`.tile[data-key="${CSS.escape(e.id)}"]`)?.focus())});return new ResizeObserver(z).observe(i),{tiles:B,stack:L,terminal:Z({tiles:B,post:I,stream:t.stream,pad:st}),hotkey(e){if(e===`next`)return!c.disabled&&(L.next(),!0);let t=[...n.querySelectorAll(`.dialog:not(.leaving) .zoom`)].at(-1);return t?.getClientRects().length?(t.click(),!0):!1},alerts(e,t){for(let t of e)w(t),L.arrive(t);L.prune(e=>t.get(e))}}}export{St as mountPanels};
@@ -1 +1 @@
1
- import{F as e,M as t,_ as n}from"./index-DS51Ucw0.js";import{t as r}from"./chat-KoGBDMyY.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
+ import{F as e,M as t,_ as n}from"./index-D-LVSW44.js";import{t as r}from"./chat-Xv1V3Ep2.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,E as n,F as r,_ as i}from"./index-DS51Ucw0.js";var a=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在取得配對碼…`:`Asking for a pairing code…`),o=((e={},t={})=>(t.locale??r())===`zh-TW`?`新的配對碼`:`New code`),s=((e={},t={})=>(t.locale??r())===`zh-TW`?`配對 QR code`:`Pairing QR code`),c=((e={},t={})=>(t.locale??r())===`zh-TW`?`用以本機使用者身分登入 Tailscale 的手機掃描。只能用一次,十分鐘內有效。`:`Scan it with a phone signed in to Tailscale as this machine's user. It works once, within ten minutes.`),l=((e={},t={})=>(t.locale??r())===`zh-TW`?`配對手機`:`Pair a phone`),u=((e={},t={})=>(t.locale??r())===`zh-TW`?`遠端存取還沒開啟。要開啟,讓你 tailnet 上的手機可以開這個頁面嗎?只有用這台電腦的 Tailscale 帳號登入的裝置能配對,絕不使用 Funnel。`:`Remote access is off. Turn it on so a phone on your tailnet can open this page? Only devices signed in to Tailscale as this machine's user can pair; Funnel is never used.`),d=((e={},t={})=>(t.locale??r())===`zh-TW`?`開啟遠端存取`:`Turn on remote access`),f=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在開啟遠端存取…`:`Turning remote access on…`),p=`http://www.w3.org/2000/svg`;function m(e){let t=e.length,n=document.createElementNS(p,`svg`),r=document.createElementNS(p,`rect`),i=document.createElementNS(p,`path`);n.setAttribute(`viewBox`,`-4 -4 ${t+8} ${t+8}`),n.setAttribute(`class`,`qr`),n.setAttribute(`role`,`img`),n.setAttribute(`aria-label`,s());for(let[e,n]of Object.entries({x:`-4`,y:`-4`,width:String(t+8),height:String(t+8),fill:`#fff`}))r.setAttribute(e,n);return i.setAttribute(`d`,e.flatMap((e,t)=>[...e].flatMap((e,n)=>e===`1`?[`M${n} ${t}h1v1h-1z`]:[])).join(``)),i.setAttribute(`fill`,`#06101e`),n.append(r,i),n}function h(){return{id:`pair`,title:l(),body:()=>{let r=i(`div`,{class:`pair`}),s=i(`button`,{type:`button`,class:`later`},o()),l=i(`button`,{type:`button`,class:`pair-btn`},d()),p=(o=`remote/pair`,d=a())=>{r.replaceChildren(i(`p`,{class:`chat-empty`},d)),e(o,{}).then(e=>{let n=e.body.rows,a=String(e.body.url??``);if(e.body.error===`remote_off`)return r.replaceChildren(i(`p`,null,u()),l);if(!e.ok||!Array.isArray(n))return r.replaceChildren(i(`p`,null,e.body.reason??t({status:e.status})),o===`remote/on`?l:s);r.replaceChildren(m(n.map(String)),i(`p`,null,c()),i(`p`,null,i(`code`,null,new URL(a).host)),s)},()=>r.replaceChildren(i(`p`,null,n()),s))};return l.onclick=()=>p(`remote/on`,f()),s.onclick=()=>p(),p(),r}}}export{h as pairTile};
1
+ import{t as e}from"./post-UHMNmNgA.js";import{C as t,E as n,F as r,_ as i}from"./index-D-LVSW44.js";var a=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在取得配對碼…`:`Asking for a pairing code…`),o=((e={},t={})=>(t.locale??r())===`zh-TW`?`新的配對碼`:`New code`),s=((e={},t={})=>(t.locale??r())===`zh-TW`?`配對 QR code`:`Pairing QR code`),c=((e={},t={})=>(t.locale??r())===`zh-TW`?`用以本機使用者身分登入 Tailscale 的手機掃描。只能用一次,十分鐘內有效。`:`Scan it with a phone signed in to Tailscale as this machine's user. It works once, within ten minutes.`),l=((e={},t={})=>(t.locale??r())===`zh-TW`?`配對手機`:`Pair a phone`),u=((e={},t={})=>(t.locale??r())===`zh-TW`?`遠端存取還沒開啟。要開啟,讓你 tailnet 上的手機可以開這個頁面嗎?只有用這台電腦的 Tailscale 帳號登入的裝置能配對,絕不使用 Funnel。`:`Remote access is off. Turn it on so a phone on your tailnet can open this page? Only devices signed in to Tailscale as this machine's user can pair; Funnel is never used.`),d=((e={},t={})=>(t.locale??r())===`zh-TW`?`開啟遠端存取`:`Turn on remote access`),f=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在開啟遠端存取…`:`Turning remote access on…`),p=`http://www.w3.org/2000/svg`;function m(e){let t=e.length,n=document.createElementNS(p,`svg`),r=document.createElementNS(p,`rect`),i=document.createElementNS(p,`path`);n.setAttribute(`viewBox`,`-4 -4 ${t+8} ${t+8}`),n.setAttribute(`class`,`qr`),n.setAttribute(`role`,`img`),n.setAttribute(`aria-label`,s());for(let[e,n]of Object.entries({x:`-4`,y:`-4`,width:String(t+8),height:String(t+8),fill:`#fff`}))r.setAttribute(e,n);return i.setAttribute(`d`,e.flatMap((e,t)=>[...e].flatMap((e,n)=>e===`1`?[`M${n} ${t}h1v1h-1z`]:[])).join(``)),i.setAttribute(`fill`,`#06101e`),n.append(r,i),n}function h(){return{id:`pair`,title:l(),body:()=>{let r=i(`div`,{class:`pair`}),s=i(`button`,{type:`button`,class:`later`},o()),l=i(`button`,{type:`button`,class:`pair-btn`},d()),p=(o=`remote/pair`,d=a())=>{r.replaceChildren(i(`p`,{class:`chat-empty`},d)),e(o,{}).then(e=>{let n=e.body.rows,a=String(e.body.url??``);if(e.body.error===`remote_off`)return r.replaceChildren(i(`p`,null,u()),l);if(!e.ok||!Array.isArray(n))return r.replaceChildren(i(`p`,null,e.body.reason??t({status:e.status})),o===`remote/on`?l:s);r.replaceChildren(m(n.map(String)),i(`p`,null,c()),i(`p`,null,i(`code`,null,new URL(a).host)),s)},()=>r.replaceChildren(i(`p`,null,n()),s))};return l.onclick=()=>p(`remote/on`,f()),s.onclick=()=>p(),p(),r}}}export{h as pairTile};
@@ -1 +1 @@
1
- import{t as e}from"./post-UHMNmNgA.js";import{C as t,E as n,F as r,_ as i}from"./index-DS51Ucw0.js";var a=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在讀取資料夾…`:`Reading folders…`),o=((e={},t={})=>(t.locale??r())===`zh-TW`?`基地名稱`:`Base name`),s=((e={},t={})=>(t.locale??r())===`zh-TW`?`第一句指令(選填)`:`First message (optional)`),c=((e={},t={})=>(t.locale??r())===`zh-TW`?`只顯示前 500 個資料夾。`:`Showing the first 500 folders.`),l=((e={},t={})=>(t.locale??r())===`zh-TW`?`這裡沒有資料夾。`:`No folders here.`),u=((e={},t={})=>(t.locale??r())===`zh-TW`?`資料夾:`:`Folder:`),d=((e={},t={})=>(t.locale??r())===`zh-TW`?`上一層`:`Up`),f=((e={},t={})=>(t.locale??r())===`zh-TW`?`在這裡開基地`:`Open the base here`),p=((e={},t={})=>(t.locale??r())===`zh-TW`?`開新基地`:`New base`),m=((e={},t={})=>(t.locale??r())===`zh-TW`?`在這裡開主智慧體`:`Open the main here`),h=e=>`New main agent in ${e?.base}`,g=e=>`在 ${e?.base} 開新的主智慧體`,_=((e,t={})=>(t.locale??r())===`zh-TW`?g(e):h(e)),v=((e={},t={})=>(t.locale??r())===`zh-TW`?`加入成員`:`Add the member`),y=e=>`New member in squad ${e?.tab}`,b=e=>`在小隊 ${e?.tab} 加一位成員`,x=((e,t={})=>(t.locale??r())===`zh-TW`?b(e):y(e)),S=e=>`New member in ${e?.base}`,C=e=>`在 ${e?.base} 加一位成員`,w=((e,t={})=>(t.locale??r())===`zh-TW`?C(e):S(e)),T=((e={},t={})=>(t.locale??r())===`zh-TW`?`基地已經開好,第一位成員已就位。`:`The base is open with its first member.`),E=e=>`The main is open in a new squad of ${e?.base}.`,D=e=>`已在 ${e?.base} 的新小隊開好主智慧體。`,O=((e,t={})=>(t.locale??r())===`zh-TW`?D(e):E(e)),k=e=>`The member is open in ${e?.base}.`,A=e=>`已在 ${e?.base} 加好成員。`,j=((e,t={})=>(t.locale??r())===`zh-TW`?A(e):k(e)),M=((e={},t={})=>(t.locale??r())===`zh-TW`?`開啟中…最多可能要一分鐘。`:`Opening… this can take up to a minute.`);function N(r,h){let g=r.kind===`base`?void 0:r.base,y=r.kind===`base`?void 0:r.tab,b=r.kind===`base`?p():r.kind===`main`?_({base:g.label}):y?x({tab:y.label}):w({base:g.label}),S=`open-${r.kind}-${g?.id??``}-${y?.id??``}`;return{id:S,title:b,body:()=>{let p=i(`code`,{class:`spawn-path`}),_=i(`button`,{type:`button`,class:`later`},d()),b=i(`div`,{class:`spawn-dirs`}),x=i(`p`,{class:`chat-empty`}),C=i(`button`,{type:`button`,class:`go`},r.kind===`base`?f():r.kind===`main`?m():v()),w=i(`textarea`,{rows:`3`,placeholder:s()}),E=i(`input`,{type:`text`,maxlength:`64`,placeholder:o()}),D,k=!1;E.addEventListener(`input`,()=>k=!0);let A=e=>x.textContent=e,N=r=>{A(a()),e(`dirs`,r?{path:r}:g?{workspace:g.id,...y&&{tab:y.id}}:{}).then(e=>{if(!e.ok)return A(e.body.reason??t({status:e.status}));D=e.body;let n=D.path===D.home?`~`:D.path.startsWith(`${D.home}/`)?`~/${D.path.slice(D.home.length+1)}`:D.path;p.textContent=n,_.disabled=!D.parent,b.replaceChildren(...D.dirs.map(e=>{let t=i(`button`,{type:`button`,class:`spawn-dir`},`${e}/`);return t.onclick=()=>N(`${D.path}/${e}`),t})),k||(E.value=D.path===D.home?``:D.path.slice(D.path.lastIndexOf(`/`)+1)),A(D.dirs.length?D.truncated?c():``:l())},()=>A(n()))};return _.onclick=()=>D?.parent&&N(D.parent),C.onclick=()=>{if(!D)return;let i=D.path,a=w.value,o=r.kind===`base`?{dir:i,label:E.value,prompt:a}:{workspace:g.id,...y&&{tab:y.id},dir:i,prompt:a};C.disabled=!0,A(M()),e(`open/${r.kind}`,o).then(e=>{if(!e.ok)return A(e.body.reason??t({status:e.status}));if(w.value=E.value=``,k=!1,h&&typeof e.body.session==`string`)return h(e.body.workspace,e.body.session,S);A(r.kind===`base`?T():r.kind===`main`?O({base:g.label}):j({base:g.label}))},()=>A(n())).finally(()=>C.disabled=!1)},N(),i(`div`,{class:`spawn`},i(`p`,{class:`spawn-at`},u(),` `,p,` `,_),b,x,...r.kind===`base`?[E]:[],w,C)}}}function P(e,t){let n=e.dataset.open;if(n===`base`)return{kind:n};let r=t.find(t=>t.id===e.dataset.ws),i=e.dataset.tab?r?.tabs.find(t=>t.id===e.dataset.tab):void 0;if(!(n!==`main`&&n!==`member`||!r||e.dataset.tab&&!i))return{kind:n,base:{id:r.id,label:r.label},...i&&{tab:{id:i.id,label:i.label}}}}export{P as openingOf,N as spawnTile};
1
+ import{t as e}from"./post-UHMNmNgA.js";import{C as t,E as n,F as r,_ as i}from"./index-D-LVSW44.js";var a=((e={},t={})=>(t.locale??r())===`zh-TW`?`正在讀取資料夾…`:`Reading folders…`),o=((e={},t={})=>(t.locale??r())===`zh-TW`?`基地名稱`:`Base name`),s=((e={},t={})=>(t.locale??r())===`zh-TW`?`第一句指令(選填)`:`First message (optional)`),c=((e={},t={})=>(t.locale??r())===`zh-TW`?`只顯示前 500 個資料夾。`:`Showing the first 500 folders.`),l=((e={},t={})=>(t.locale??r())===`zh-TW`?`這裡沒有資料夾。`:`No folders here.`),u=((e={},t={})=>(t.locale??r())===`zh-TW`?`資料夾:`:`Folder:`),d=((e={},t={})=>(t.locale??r())===`zh-TW`?`上一層`:`Up`),f=((e={},t={})=>(t.locale??r())===`zh-TW`?`在這裡開基地`:`Open the base here`),p=((e={},t={})=>(t.locale??r())===`zh-TW`?`開新基地`:`New base`),m=((e={},t={})=>(t.locale??r())===`zh-TW`?`在這裡開主智慧體`:`Open the main here`),h=e=>`New main agent in ${e?.base}`,g=e=>`在 ${e?.base} 開新的主智慧體`,_=((e,t={})=>(t.locale??r())===`zh-TW`?g(e):h(e)),v=((e={},t={})=>(t.locale??r())===`zh-TW`?`加入成員`:`Add the member`),y=e=>`New member in squad ${e?.tab}`,b=e=>`在小隊 ${e?.tab} 加一位成員`,x=((e,t={})=>(t.locale??r())===`zh-TW`?b(e):y(e)),S=e=>`New member in ${e?.base}`,C=e=>`在 ${e?.base} 加一位成員`,w=((e,t={})=>(t.locale??r())===`zh-TW`?C(e):S(e)),T=((e={},t={})=>(t.locale??r())===`zh-TW`?`基地已經開好,第一位成員已就位。`:`The base is open with its first member.`),E=e=>`The main is open in a new squad of ${e?.base}.`,D=e=>`已在 ${e?.base} 的新小隊開好主智慧體。`,O=((e,t={})=>(t.locale??r())===`zh-TW`?D(e):E(e)),k=e=>`The member is open in ${e?.base}.`,A=e=>`已在 ${e?.base} 加好成員。`,j=((e,t={})=>(t.locale??r())===`zh-TW`?A(e):k(e)),M=((e={},t={})=>(t.locale??r())===`zh-TW`?`開啟中…最多可能要一分鐘。`:`Opening… this can take up to a minute.`);function N(r,h){let g=r.kind===`base`?void 0:r.base,y=r.kind===`base`?void 0:r.tab,b=r.kind===`base`?p():r.kind===`main`?_({base:g.label}):y?x({tab:y.label}):w({base:g.label}),S=`open-${r.kind}-${g?.id??``}-${y?.id??``}`;return{id:S,title:b,body:()=>{let p=i(`code`,{class:`spawn-path`}),_=i(`button`,{type:`button`,class:`later`},d()),b=i(`div`,{class:`spawn-dirs`}),x=i(`p`,{class:`chat-empty`}),C=i(`button`,{type:`button`,class:`go`},r.kind===`base`?f():r.kind===`main`?m():v()),w=i(`textarea`,{rows:`3`,placeholder:s()}),E=i(`input`,{type:`text`,maxlength:`64`,placeholder:o()}),D,k=!1;E.addEventListener(`input`,()=>k=!0);let A=e=>x.textContent=e,N=r=>{A(a()),e(`dirs`,r?{path:r}:g?{workspace:g.id,...y&&{tab:y.id}}:{}).then(e=>{if(!e.ok)return A(e.body.reason??t({status:e.status}));D=e.body;let n=D.path===D.home?`~`:D.path.startsWith(`${D.home}/`)?`~/${D.path.slice(D.home.length+1)}`:D.path;p.textContent=n,_.disabled=!D.parent,b.replaceChildren(...D.dirs.map(e=>{let t=i(`button`,{type:`button`,class:`spawn-dir`},`${e}/`);return t.onclick=()=>N(`${D.path}/${e}`),t})),k||(E.value=D.path===D.home?``:D.path.slice(D.path.lastIndexOf(`/`)+1)),A(D.dirs.length?D.truncated?c():``:l())},()=>A(n()))};return _.onclick=()=>D?.parent&&N(D.parent),C.onclick=()=>{if(!D)return;let i=D.path,a=w.value,o=r.kind===`base`?{dir:i,label:E.value,prompt:a}:{workspace:g.id,...y&&{tab:y.id},dir:i,prompt:a};C.disabled=!0,A(M()),e(`open/${r.kind}`,o).then(e=>{if(!e.ok)return A(e.body.reason??t({status:e.status}));if(w.value=E.value=``,k=!1,h&&typeof e.body.session==`string`)return h(e.body.workspace,e.body.session,S);A(r.kind===`base`?T():r.kind===`main`?O({base:g.label}):j({base:g.label}))},()=>A(n())).finally(()=>C.disabled=!1)},N(),i(`div`,{class:`spawn`},i(`p`,{class:`spawn-at`},u(),` `,p,` `,_),b,x,...r.kind===`base`?[E]:[],w,C)}}}function P(e,t){let n=e.dataset.open;if(n===`base`)return{kind:n};let r=t.find(t=>t.id===e.dataset.ws),i=e.dataset.tab?r?.tabs.find(t=>t.id===e.dataset.tab):void 0;if(!(n!==`main`&&n!==`member`||!r||e.dataset.tab&&!i))return{kind:n,base:{id:r.id,label:r.label},...i&&{tab:{id:i.id,label:i.label}}}}export{P as openingOf,N as spawnTile};
@@ -1,7 +1,7 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-Br2ViD0U.css"])))=>i.map(i=>d[i]);
2
- import{r as e,t}from"./post-UHMNmNgA.js";import{a as n,i as r,n as i,r as a,t as o}from"./ask-B8exEH0h.js";import{A as s,C as c,E as l,F as u,M as d,N as f,O as p,P as m,S as h,T as g,_,a as v,c as y,d as b,f as x,g as S,h as C,i as w,j as T,k as E,m as D,n as O,p as k,r as A,s as j,u as M,v as ee,w as N,x as P}from"./index-DS51Ucw0.js";var te=((e={},t={})=>(t.locale??u())===`zh-TW`?`附加檔案`:`Attach files`),F=((e={},t={})=>(t.locale??u())===`zh-TW`?`返回`:`Back`),I=((e={},t={})=>(t.locale??u())===`zh-TW`?`它在等待對話框:請在上方或它的終端機中回答。`:`It waits on a dialog: answer it above, or in its terminal.`),L=((e={},t={})=>(t.locale??u())===`zh-TW`?`它在等待對話框;請在它的終端機中回答。`:`It waits on a dialog; answer it in its terminal.`),ne=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個 session 已不再即時;紀錄仍可閱讀。`:`This session is no longer live; its history stays readable.`),re=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個單位沒有即時的 pi 窗格,無處可輸入。`:`No live pi pane backs this unit, so there is nothing to type into.`),ie=((e={},t={})=>(t.locale??u())===`zh-TW`?`串流中斷;要等它恢復才能送出。`:`The stream is down; sending waits for it to come back.`),ae=((e={},t={})=>(t.locale??u())===`zh-TW`?`頻道關閉`:`channel closed`),oe=((e={},t={})=>(t.locale??u())===`zh-TW`?`頻道開啟`:`channel open`),se=((e={},t={})=>(t.locale??u())===`zh-TW`?`指令`:`Commands`),ce=((e={},t={})=>(t.locale??u())===`zh-TW`?`通訊`:`comms`),le=((e={},t={})=>(t.locale??u())===`zh-TW`?`已派出`:`Dispatched`),ue=((e={},t={})=>(t.locale??u())===`zh-TW`?`無法取得:已不在它的 session 中開啟。`:`Unavailable: no longer open in its session.`),de=((e={},t={})=>(t.locale??u())===`zh-TW`?`已不在清單中:已在它的 session 中關閉,或 session 已結束。`:`No longer listed: closed in its session, or the session ended.`),fe=((e={},t={})=>(t.locale??u())===`zh-TW`?`已更新:此區塊顯示時會載入新版本。`:`Updated: the new version loads when this tile shows.`),pe=((e={},t={})=>(t.locale??u())===`zh-TW`?`超過轉送上限:請在終端機中閱讀。`:`More than the relay carries: read them in the terminal.`),me=e=>`${e?.command} ends this session or switches its pane to another one.`,he=e=>`${e?.command} 會結束這個 session,或把它的窗格切換到別的 session。`,ge=((e,t={})=>(t.locale??u())===`zh-TW`?he(e):me(e)),_e=e=>{let t=n(`en`,e?.count,{},!0);return t===`one`?`${e?.count} entry`:t===`other`?`${e?.count} entries`:`entry_count`},ve=e=>`${e?.count} 筆`,ye=((e,t={})=>(t.locale??u())===`zh-TW`?ve(e):_e(e)),be=e=>`${e?.name} is larger than 20 MB.`,xe=e=>`${e?.name} 超過 20 MB。`,Se=((e,t={})=>(t.locale??u())===`zh-TW`?xe(e):be(e)),Ce=((e={},t={})=>(t.locale??u())===`zh-TW`?`做完再送`:`After this`),we=((e={},t={})=>(t.locale??u())===`zh-TW`?`資料`:`Info`),Te=((e={},t={})=>(t.locale??u())===`zh-TW`?`載入中…`:`Loading…`),Ee=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個工作區不在網中。`:`This workspace is not part of the net.`),De=((e={},t={})=>(t.locale??u())===`zh-TW`?`訊息`:`Message`),Oe=e=>`exit ${e?.code}`,ke=e=>`結束碼 ${e?.code}`,Ae=((e,t={})=>(t.locale??u())===`zh-TW`?ke(e):Oe(e)),je=e=>`${e?.count} lines`,Me=e=>`${e?.count} 行`,Ne=((e,t={})=>(t.locale??u())===`zh-TW`?Me(e):je(e)),Pe=((e={},t={})=>(t.locale??u())===`zh-TW`?`完成`:`finished`),Fe=((e={},t={})=>(t.locale??u())===`zh-TW`?`出錯`:`failed`),Ie=((e={},t={})=>(t.locale??u())===`zh-TW`?`執行中`:`running`),Le=((e={},t={})=>(t.locale??u())===`zh-TW`?`太久沒輸出,已停止`:`no output, stopped`),Re=((e={},t={})=>(t.locale??u())===`zh-TW`?`已停止`:`stopped`),ze=e=>`${e?.count} failed`,Be=e=>`${e?.count} 個出錯`,Ve=((e,t={})=>(t.locale??u())===`zh-TW`?Be(e):ze(e)),He=e=>`${e?.count} running`,Ue=e=>`${e?.count} 個執行中`,We=((e,t={})=>(t.locale??u())===`zh-TW`?Ue(e):He(e)),Ge=((e={},t={})=>(t.locale??u())===`zh-TW`?`Monitor`:`Monitors`),Ke=((e={},t={})=>(t.locale??u())===`zh-TW`?`新的 session`:`the new session`),qe=((e={},t={})=>(t.locale??u())===`zh-TW`?`無頻道`:`no channel`),Je=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在網中`:`not in the net`),Ye=((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).`),Ze=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在終端機畫面上`:`off screen in the terminal`),Qe=e=>`${e?.reason} · off screen`,$e=e=>`${e?.reason} · 不在畫面上`,et=((e,t={})=>(t.locale??u())===`zh-TW`?$e(e):Qe(e)),tt=((e={},t={})=>(t.locale??u())===`zh-TW`?`在新分頁開啟`:`Open in a new tab`),nt=((e={},t={})=>(t.locale??u())===`zh-TW`?`正在開啟頻道…`:`Opening the channel…`),rt=((e={},t={})=>(t.locale??u())===`zh-TW`?`網外`:`Outside the net`),it=((e={},t={})=>(t.locale??u())===`zh-TW`?`未編入的 pi 窗格`:`unaligned pi panes`),at=e=>`Message ${e?.name}`,ot=e=>`傳訊息給 ${e?.name}`,st=((e,t={})=>(t.locale??u())===`zh-TW`?ot(e):at(e)),ct=((e={},t={})=>(t.locale??u())===`zh-TW`?`排隊中・做完再送`:`Queued · follow-up`),lt=((e={},t={})=>(t.locale??u())===`zh-TW`?`排隊中・插話`:`Queued · steer`),ut=((e={},t={})=>(t.locale??u())===`zh-TW`?`重新載入`:`Reload`),dt=((e={},t={})=>(t.locale??u())===`zh-TW`?`送出`:`Send`),ft=e=>`Send ${e?.command}`,pt=e=>`送出 ${e?.command}`,mt=((e,t={})=>(t.locale??u())===`zh-TW`?pt(e):ft(e)),ht=((e={},t={})=>(t.locale??u())===`zh-TW`?`已照原文送出;你的修改留在這裡,尚未送出。`:`Sent as it was; your edits stayed here, unsent.`),gt=e=>`${e?.display}, shown by ${e?.unit}`,_t=e=>`${e?.display},由 ${e?.unit} 顯示`,vt=((e,t={})=>(t.locale??u())===`zh-TW`?_t(e):gt(e)),yt=((e={},t={})=>(t.locale??u())===`zh-TW`?`基地`:`base`),bt=((e={},t={})=>(t.locale??u())===`zh-TW`?`上下文`:`context`),xt=((e={},t={})=>(t.locale??u())===`zh-TW`?`目錄`:`directory`),St=((e={},t={})=>(t.locale??u())===`zh-TW`?`啟動者`:`launcher`),Ct=((e={},t={})=>(t.locale??u())===`zh-TW`?`模型`:`model`),wt=((e={},t={})=>(t.locale??u())===`zh-TW`?`小隊`:`squad`),Tt=((e={},t={})=>(t.locale??u())===`zh-TW`?`無法讀取`:`unreadable`),Et=e=>`squad ${e?.label}`,Dt=e=>`小隊 ${e?.label}`,R=((e,t={})=>(t.locale??u())===`zh-TW`?Dt(e):Et(e)),Ot=((e={},t={})=>(t.locale??u())===`zh-TW`?`小隊`:`Squads`),kt=((e={},t={})=>(t.locale??u())===`zh-TW`?`停止`:`Stop`),At=((e={},t={})=>(t.locale??u())===`zh-TW`?`要停止目前的任務嗎?佇列中的訊息會退回它的終端機編輯器。`:`Stop the current task? Queued messages go back to its terminal editor.`),jt=((e={},t={})=>(t.locale??u())===`zh-TW`?`現在:`:`Now:`),Mt=((e={},t={})=>(t.locale??u())===`zh-TW`?`已完成`:`done`),Nt=((e={},t={})=>(t.locale??u())===`zh-TW`?`未完成`:`not done`),Pt=((e={},t={})=>(t.locale??u())===`zh-TW`?`終端機`:`Terminal`),Ft=e=>`Todos ${e?.done}/${e?.total}`,It=e=>`待辦 ${e?.done}/${e?.total}`,Lt=((e,t={})=>(t.locale??u())===`zh-TW`?It(e):Ft(e)),Rt=((e={},t={})=>(t.locale??u())===`zh-TW`?`全部完成`:`All done`),zt=e=>`${e?.count} tokens`,Bt=e=>`${e?.count} tokens`,Vt=((e,t={})=>(t.locale??u())===`zh-TW`?Bt(e):zt(e)),Ht=((e={},t={})=>(t.locale??u())===`zh-TW`?`文字超過 16 KB,請縮短。`:`The text is longer than 16 KB; shorten it.`),Ut=((e={},t={})=>(t.locale??u())===`zh-TW`?`下屬`:`Under this tower`),Wt=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} 個單位`,Kt=((e,t={})=>(t.locale??u())===`zh-TW`?Gt(e):Wt(e)),qt=((e={},t={})=>(t.locale??u())===`zh-TW`?`單位檔案`:`unit dossier`),Jt=((e={},t={})=>(t.locale??u())===`zh-TW`?`單位`:`Units`),z=((e={},t={})=>(t.locale??u())===`zh-TW`?`未確認。再次送出前請先查看終端機。`:`Not confirmed. Check the terminal before sending again.`),Yt=((e={},t={})=>(t.locale??u())===`zh-TW`?`上傳中…`:`Uploading…`),Xt=((e={},t={})=>(t.locale??u())===`zh-TW`?`等待網的資料…`:`Waiting for the net…`),Zt=((e={},t={})=>(t.locale??u())===`zh-TW`?`原文已送到 session;這裡是你編輯過、尚未送出的副本。`:`The original already went to the session; what is here is your edited copy, unsent.`),B=(e,t,n)=>({tag:e,kids:t,attrs:n}),Qt=/^(?:https?:\/\/|mailto:)[^\s\u0000-\u001f]+$/i,$t=(e,t)=>B(`a`,t,{href:e,rel:`noopener noreferrer`,target:`_blank`}),en=/(`+)([^`]|[^`][^]{0,1000}?[^`])\1(?!`)|\*\*([^*][^]{0,1000}?)\*\*|~~([^~][^]{0,1000}?)~~|\*([^\s*][^*]{0,500}?)\*|(?<![\w])_([^\s_][^_]{0,500}?)_(?![\w])|\[([^\]]{1,500})\]\(([^)\s]{1,2000})(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)\]]+)/g;function V(e){let t=[],n=0;for(let r of e.matchAll(en))r.index>n&&t.push(e.slice(n,r.index)),n=r.index+r[0].length,r[2]===void 0?r[3]===void 0?r[4]===void 0?r[5]!==void 0||r[6]!==void 0?t.push(B(`em`,V(r[5]??r[6]))):r[7]===void 0?t.push($t(r[9],[r[9]])):t.push(Qt.test(r[8])?$t(r[8],V(r[7])):r[0]):t.push(B(`del`,V(r[4]))):t.push(B(`strong`,V(r[3]))):t.push(B(`code`,[r[2]]));return n<e.length&&t.push(e.slice(n)),t}var tn=e=>e.search(/\S/),H=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,nn=/^\s*([-*_])(\s*\1){2,}\s*$/,rn=/^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?\s*$/,an=e=>e.trim().replace(/^\|/,``).replace(/\|$/,``).split(`|`).map(e=>e.trim()),on=(e,t)=>/^\s*(`{3,}|~{3,}|#{1,6}\s|>)/.test(e)||nn.test(e)||H.test(e)||e.includes(`|`)&&t!==void 0&&rn.test(t)&&t.includes(`-`);function U(e,t=0,n=e.replace(/\r\n?/g,`
2
+ import{r as e,t}from"./post-UHMNmNgA.js";import{a as n,i as r,n as i,r as a,t as o}from"./ask-DIr7mep4.js";import{A as s,C as c,E as l,F as u,M as d,N as f,O as p,P as m,S as h,T as g,_,a as v,c as y,d as b,f as x,g as S,h as C,i as w,j as T,k as E,m as D,n as O,p as k,r as A,s as j,u as M,v as ee,w as N,x as P}from"./index-D-LVSW44.js";var te=((e={},t={})=>(t.locale??u())===`zh-TW`?`附加檔案`:`Attach files`),F=((e={},t={})=>(t.locale??u())===`zh-TW`?`返回`:`Back`),I=((e={},t={})=>(t.locale??u())===`zh-TW`?`它在等待對話框:請在上方或它的終端機中回答。`:`It waits on a dialog: answer it above, or in its terminal.`),L=((e={},t={})=>(t.locale??u())===`zh-TW`?`它在等待對話框;請在它的終端機中回答。`:`It waits on a dialog; answer it in its terminal.`),ne=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個 session 已不再即時;紀錄仍可閱讀。`:`This session is no longer live; its history stays readable.`),re=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個單位沒有即時的 pi 窗格,無處可輸入。`:`No live pi pane backs this unit, so there is nothing to type into.`),ie=((e={},t={})=>(t.locale??u())===`zh-TW`?`串流中斷;要等它恢復才能送出。`:`The stream is down; sending waits for it to come back.`),ae=((e={},t={})=>(t.locale??u())===`zh-TW`?`頻道關閉`:`channel closed`),oe=((e={},t={})=>(t.locale??u())===`zh-TW`?`頻道開啟`:`channel open`),se=((e={},t={})=>(t.locale??u())===`zh-TW`?`指令`:`Commands`),ce=((e={},t={})=>(t.locale??u())===`zh-TW`?`通訊`:`comms`),le=((e={},t={})=>(t.locale??u())===`zh-TW`?`已派出`:`Dispatched`),ue=((e={},t={})=>(t.locale??u())===`zh-TW`?`無法取得:已不在它的 session 中開啟。`:`Unavailable: no longer open in its session.`),de=((e={},t={})=>(t.locale??u())===`zh-TW`?`已不在清單中:已在它的 session 中關閉,或 session 已結束。`:`No longer listed: closed in its session, or the session ended.`),fe=((e={},t={})=>(t.locale??u())===`zh-TW`?`已更新:此區塊顯示時會載入新版本。`:`Updated: the new version loads when this tile shows.`),pe=((e={},t={})=>(t.locale??u())===`zh-TW`?`超過轉送上限:請在終端機中閱讀。`:`More than the relay carries: read them in the terminal.`),me=e=>`${e?.command} ends this session or switches its pane to another one.`,he=e=>`${e?.command} 會結束這個 session,或把它的窗格切換到別的 session。`,ge=((e,t={})=>(t.locale??u())===`zh-TW`?he(e):me(e)),_e=e=>{let t=n(`en`,e?.count,{},!0);return t===`one`?`${e?.count} entry`:t===`other`?`${e?.count} entries`:`entry_count`},ve=e=>`${e?.count} 筆`,ye=((e,t={})=>(t.locale??u())===`zh-TW`?ve(e):_e(e)),be=e=>`${e?.name} is larger than 20 MB.`,xe=e=>`${e?.name} 超過 20 MB。`,Se=((e,t={})=>(t.locale??u())===`zh-TW`?xe(e):be(e)),Ce=((e={},t={})=>(t.locale??u())===`zh-TW`?`做完再送`:`After this`),we=((e={},t={})=>(t.locale??u())===`zh-TW`?`資料`:`Info`),Te=((e={},t={})=>(t.locale??u())===`zh-TW`?`載入中…`:`Loading…`),Ee=((e={},t={})=>(t.locale??u())===`zh-TW`?`這個工作區不在網中。`:`This workspace is not part of the net.`),De=((e={},t={})=>(t.locale??u())===`zh-TW`?`訊息`:`Message`),Oe=e=>`exit ${e?.code}`,ke=e=>`結束碼 ${e?.code}`,Ae=((e,t={})=>(t.locale??u())===`zh-TW`?ke(e):Oe(e)),je=e=>`${e?.count} lines`,Me=e=>`${e?.count} 行`,Ne=((e,t={})=>(t.locale??u())===`zh-TW`?Me(e):je(e)),Pe=((e={},t={})=>(t.locale??u())===`zh-TW`?`完成`:`finished`),Fe=((e={},t={})=>(t.locale??u())===`zh-TW`?`出錯`:`failed`),Ie=((e={},t={})=>(t.locale??u())===`zh-TW`?`執行中`:`running`),Le=((e={},t={})=>(t.locale??u())===`zh-TW`?`太久沒輸出,已停止`:`no output, stopped`),Re=((e={},t={})=>(t.locale??u())===`zh-TW`?`已停止`:`stopped`),ze=e=>`${e?.count} failed`,Be=e=>`${e?.count} 個出錯`,Ve=((e,t={})=>(t.locale??u())===`zh-TW`?Be(e):ze(e)),He=e=>`${e?.count} running`,Ue=e=>`${e?.count} 個執行中`,We=((e,t={})=>(t.locale??u())===`zh-TW`?Ue(e):He(e)),Ge=((e={},t={})=>(t.locale??u())===`zh-TW`?`Monitor`:`Monitors`),Ke=((e={},t={})=>(t.locale??u())===`zh-TW`?`新的 session`:`the new session`),qe=((e={},t={})=>(t.locale??u())===`zh-TW`?`無頻道`:`no channel`),Je=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在網中`:`not in the net`),Ye=((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).`),Ze=((e={},t={})=>(t.locale??u())===`zh-TW`?`不在終端機畫面上`:`off screen in the terminal`),Qe=e=>`${e?.reason} · off screen`,$e=e=>`${e?.reason} · 不在畫面上`,et=((e,t={})=>(t.locale??u())===`zh-TW`?$e(e):Qe(e)),tt=((e={},t={})=>(t.locale??u())===`zh-TW`?`在新分頁開啟`:`Open in a new tab`),nt=((e={},t={})=>(t.locale??u())===`zh-TW`?`正在開啟頻道…`:`Opening the channel…`),rt=((e={},t={})=>(t.locale??u())===`zh-TW`?`網外`:`Outside the net`),it=((e={},t={})=>(t.locale??u())===`zh-TW`?`未編入的 pi 窗格`:`unaligned pi panes`),at=e=>`Message ${e?.name}`,ot=e=>`傳訊息給 ${e?.name}`,st=((e,t={})=>(t.locale??u())===`zh-TW`?ot(e):at(e)),ct=((e={},t={})=>(t.locale??u())===`zh-TW`?`排隊中・做完再送`:`Queued · follow-up`),lt=((e={},t={})=>(t.locale??u())===`zh-TW`?`排隊中・插話`:`Queued · steer`),ut=((e={},t={})=>(t.locale??u())===`zh-TW`?`重新載入`:`Reload`),dt=((e={},t={})=>(t.locale??u())===`zh-TW`?`送出`:`Send`),ft=e=>`Send ${e?.command}`,pt=e=>`送出 ${e?.command}`,mt=((e,t={})=>(t.locale??u())===`zh-TW`?pt(e):ft(e)),ht=((e={},t={})=>(t.locale??u())===`zh-TW`?`已照原文送出;你的修改留在這裡,尚未送出。`:`Sent as it was; your edits stayed here, unsent.`),gt=e=>`${e?.display}, shown by ${e?.unit}`,_t=e=>`${e?.display},由 ${e?.unit} 顯示`,vt=((e,t={})=>(t.locale??u())===`zh-TW`?_t(e):gt(e)),yt=((e={},t={})=>(t.locale??u())===`zh-TW`?`基地`:`base`),bt=((e={},t={})=>(t.locale??u())===`zh-TW`?`上下文`:`context`),xt=((e={},t={})=>(t.locale??u())===`zh-TW`?`目錄`:`directory`),St=((e={},t={})=>(t.locale??u())===`zh-TW`?`啟動者`:`launcher`),Ct=((e={},t={})=>(t.locale??u())===`zh-TW`?`模型`:`model`),wt=((e={},t={})=>(t.locale??u())===`zh-TW`?`小隊`:`squad`),Tt=((e={},t={})=>(t.locale??u())===`zh-TW`?`無法讀取`:`unreadable`),Et=e=>`squad ${e?.label}`,Dt=e=>`小隊 ${e?.label}`,R=((e,t={})=>(t.locale??u())===`zh-TW`?Dt(e):Et(e)),Ot=((e={},t={})=>(t.locale??u())===`zh-TW`?`小隊`:`Squads`),kt=((e={},t={})=>(t.locale??u())===`zh-TW`?`停止`:`Stop`),At=((e={},t={})=>(t.locale??u())===`zh-TW`?`要停止目前的任務嗎?佇列中的訊息會退回它的終端機編輯器。`:`Stop the current task? Queued messages go back to its terminal editor.`),jt=((e={},t={})=>(t.locale??u())===`zh-TW`?`現在:`:`Now:`),Mt=((e={},t={})=>(t.locale??u())===`zh-TW`?`已完成`:`done`),Nt=((e={},t={})=>(t.locale??u())===`zh-TW`?`未完成`:`not done`),Pt=((e={},t={})=>(t.locale??u())===`zh-TW`?`終端機`:`Terminal`),Ft=e=>`Todos ${e?.done}/${e?.total}`,It=e=>`待辦 ${e?.done}/${e?.total}`,Lt=((e,t={})=>(t.locale??u())===`zh-TW`?It(e):Ft(e)),Rt=((e={},t={})=>(t.locale??u())===`zh-TW`?`全部完成`:`All done`),zt=e=>`${e?.count} tokens`,Bt=e=>`${e?.count} tokens`,Vt=((e,t={})=>(t.locale??u())===`zh-TW`?Bt(e):zt(e)),Ht=((e={},t={})=>(t.locale??u())===`zh-TW`?`文字超過 16 KB,請縮短。`:`The text is longer than 16 KB; shorten it.`),Ut=((e={},t={})=>(t.locale??u())===`zh-TW`?`下屬`:`Under this tower`),Wt=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} 個單位`,Kt=((e,t={})=>(t.locale??u())===`zh-TW`?Gt(e):Wt(e)),qt=((e={},t={})=>(t.locale??u())===`zh-TW`?`單位檔案`:`unit dossier`),Jt=((e={},t={})=>(t.locale??u())===`zh-TW`?`單位`:`Units`),z=((e={},t={})=>(t.locale??u())===`zh-TW`?`未確認。再次送出前請先查看終端機。`:`Not confirmed. Check the terminal before sending again.`),Yt=((e={},t={})=>(t.locale??u())===`zh-TW`?`上傳中…`:`Uploading…`),Xt=((e={},t={})=>(t.locale??u())===`zh-TW`?`等待網的資料…`:`Waiting for the net…`),Zt=((e={},t={})=>(t.locale??u())===`zh-TW`?`原文已送到 session;這裡是你編輯過、尚未送出的副本。`:`The original already went to the session; what is here is your edited copy, unsent.`),B=(e,t,n)=>({tag:e,kids:t,attrs:n}),Qt=/^(?:https?:\/\/|mailto:)[^\s\u0000-\u001f]+$/i,$t=(e,t)=>B(`a`,t,{href:e,rel:`noopener noreferrer`,target:`_blank`}),en=/(`+)([^`]|[^`][^]{0,1000}?[^`])\1(?!`)|\*\*([^*][^]{0,1000}?)\*\*|~~([^~][^]{0,1000}?)~~|\*([^\s*][^*]{0,500}?)\*|(?<![\w])_([^\s_][^_]{0,500}?)_(?![\w])|\[([^\]]{1,500})\]\(([^)\s]{1,2000})(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)\]]+)/g;function V(e){let t=[],n=0;for(let r of e.matchAll(en))r.index>n&&t.push(e.slice(n,r.index)),n=r.index+r[0].length,r[2]===void 0?r[3]===void 0?r[4]===void 0?r[5]!==void 0||r[6]!==void 0?t.push(B(`em`,V(r[5]??r[6]))):r[7]===void 0?t.push($t(r[9],[r[9]])):t.push(Qt.test(r[8])?$t(r[8],V(r[7])):r[0]):t.push(B(`del`,V(r[4]))):t.push(B(`strong`,V(r[3]))):t.push(B(`code`,[r[2]]));return n<e.length&&t.push(e.slice(n)),t}var tn=e=>e.search(/\S/),H=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,nn=/^\s*([-*_])(\s*\1){2,}\s*$/,rn=/^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?\s*$/,an=e=>e.trim().replace(/^\|/,``).replace(/\|$/,``).split(`|`).map(e=>e.trim()),on=(e,t)=>/^\s*(`{3,}|~{3,}|#{1,6}\s|>)/.test(e)||nn.test(e)||H.test(e)||e.includes(`|`)&&t!==void 0&&rn.test(t)&&t.includes(`-`);function U(e,t=0,n=e.replace(/\r\n?/g,`
3
3
  `).split(`
4
4
  `),r=n.map(tn)){if(t>=16)return[B(`p`,[n.join(`
5
5
  `)])];let i=[];for(let e=0;e<n.length;){let a=n[e],o=n[e+1],s=a.match(/^\s*(`{3,}|~{3,})\s*([\w+-]*)/),c=a.match(/^\s*(#{1,6})\s+(.*?)\s*#*\s*$/),l=a.match(H);if(r[e]<0)e++;else if(s){let t=[];for(e++;e<n.length&&!n[e].trim().startsWith(s[1]);e++)t.push(n[e]);e++,i.push(B(`pre`,[B(`code`,[t.join(`
6
6
  `)],s[2]?{"data-lang":s[2]}:void 0)]))}else if(c)i.push(B(`h${c[1].length}`,V(c[2]))),e++;else if(nn.test(a))i.push(B(`hr`,[])),e++;else if(/^\s*>/.test(a)){let r=[];for(;e<n.length&&/^\s*>/.test(n[e]);e++)r.push(n[e].replace(/^\s*> ?/,``));i.push(B(`blockquote`,U(``,t+1,r,r.map(tn))))}else if(a.includes(`|`)&&o!==void 0&&rn.test(o)&&o.includes(`-`)){let t=[];for(e+=2;e<n.length&&n[e].trim()&&n[e].includes(`|`);e++)t.push(an(n[e]));i.push(B(`table`,[B(`thead`,[B(`tr`,an(a).map(e=>B(`th`,V(e))))]),B(`tbody`,t.map(e=>B(`tr`,e.map(e=>B(`td`,V(e))))))]))}else if(l){let a=l[1].length,o=[],s=a+2;for(;e<n.length;){let i=n[e].match(H);if(!i||i[1].length!==a||/\d/.test(i[2])!==/\d/.test(l[2]))break;let c=[i[3]],u=i[3].match(/^\[([ xX])\]\s+(.*)$/);u&&(c[0]=u[2]);let d=[tn(c[0])];for(e++;e<n.length&&r[e]>a;e++){let t=n[e],i=0;for(;i<s&&t.charCodeAt(i)===32;)i++;c.push(i?t.slice(i):t),d.push(r[e]-i)}let f=U(``,t+1,c,d),p=f[0],m=u?.[1]!==` `;u&&(typeof p==`object`&&p.tag===`p`?p.kids:f).unshift(B(`i`,m?[`✓`]:[],{class:`check`,"data-done":String(m),"aria-label":m?Mt():Nt()})),o.push(B(`li`,f,u?{class:`task`}:void 0)),!n[e]?.trim()&&n[e+1]?.match(H)?.[1]?.length===a&&e++}i.push(B(/\d/.test(l[2])?`ol`:`ul`,o))}else{let t=[a];for(e++;e<n.length&&n[e].trim()&&!on(n[e],n[e+1]);e++)t.push(n[e]);i.push(B(`p`,V(t.join(`
7
- `))))}}return i}function sn(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 cn=`allow-forms allow-popups allow-popups-to-escape-sandbox`,ln={},W=new Map;function un(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 dn=(e,t,n)=>e?.find(e=>un(e.display,t)===un(n,t));function fn(e,t,n=[]){let r=e.get(t);return e.set(t,new Set(n.map(e=>e.display))),r?n.filter(e=>!r.has(e.display)):[]}var G=(e,t,n=``)=>(e.state.dataset.tone=n,e.state.textContent=t),pn=(e,t)=>(e.failed=!0,G(e,t,`error`)),mn=e=>ln.src?.(e)??`doc/${encodeURIComponent(e)}/`;function K(e){if([e.loaded,e.failed]=[e.card.revision,!1],G(e,``),e.frame)return void(e.frame.src=mn(e.card.cap));let t=e.card.cap,n=/\.(md|markdown)$/i.test(e.card.display),r=++e.seq;(ln.load?.(t)??fetch(`api/doc/${encodeURIComponent(t)}`,{cache:`no-store`}).then(e=>e.ok?e.json():void 0)).then(t=>e.seq!==r||(t?e.body.replaceChildren(n?_(`div`,{class:`md`},sn(U(t.text))):_(`pre`,{class:`doc-pre`},t.text)):pn(e,ue())),()=>e.seq!==r||pn(e,a()))}function hn(e,t){let n=W.get(t.cap);if(n)return n.tile;let r=t.display.split(`/`).pop()||t.display,i=t.kind===`html`?_(`iframe`,{class:`doc-frame`,sandbox:cn,referrerpolicy:`no-referrer`,title:vt({display:t.display,unit:e})}):void 0,a=_(`button`,{type:`button`,class:`cmp-link`},ut()),o=i&&_(`a`,{class:`cmp-link`,href:mn(t.cap),target:`_blank`,rel:`noopener noreferrer`},tt()),s=i??_(`div`,{class:`doc-text`},_(`p`,{class:`chat-empty`},Te())),c=_(`span`,{class:`term-state`,role:`status`}),l=_(`em`,{class:`doc-off`},Ze()),u=_(`div`,{class:`doc-tile`},_(`div`,{class:`term-bar doc-bar`},_(`span`,{class:`doc-why`},t.reason),l,c,_(`span`,{class:`doc-acts`},a,o)),s),d=new IntersectionObserver(([e])=>(p.shown=!!e?.isIntersecting,p.shown&&!p.gone&&(p.failed||p.loaded!==p.card.revision)&&K(p))),f={id:`doc:${t.cap}`,title:`${r} · ${e}`,icon:`i-doc`,body:()=>u,closed:()=>(W.delete(t.cap),d.disconnect())},p={card:t,tile:f,loaded:0,seq:0,shown:!1,gone:!1,body:s,state:c,off:l,...i&&{frame:i}};return a.onclick=()=>!p.gone&&K(p),l.hidden=t.onScreen,d.observe(u),K(p),W.set(t.cap,p),f}function gn(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 fn(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);_n(i)}function _n(e){for(let t of W.values()){let n=e.get(t.card.cap);if(!n){t.gone||G(t,de(),`error`),t.gone=!0;continue}let r=t.gone&&(G(t,``),t.failed);[t.card,t.gone,t.off.hidden]=[n,!1,n.onScreen],(n.revision!==t.loaded||r)&&(t.shown?K(t):n.revision!==t.loaded&&G(t,fe()))}}function vn(e,t,n,r){e.hidden=!t?.length&&!n,e.querySelector(`.d-doc-list`).replaceChildren(...(t??[]).map(e=>{let t=_(`button`,{type:`button`,class:`d-doc`,title:e.reason},_(`b`,null,e.display),_(`small`,null,e.onScreen?e.reason:et({reason:e.reason})));return t.onclick=()=>r(e),t})),e.querySelector(`.d-docs-cut`).hidden=!n}var q=e=>e.route.view===`map`?``:e.route.ws;function J(e,t){for(let n of e?.bases??[]){if(n.tower?.key===t)return{u:{key:t,name:n.tower.name,role:`tower`,mark:n.tower.mark,control:n.tower.control,pending:n.tower.pending,docs:n.tower.docs,docsCut:n.tower.docsCut,subs:[]},base:n};for(let[e,r]of[...n.tabs.map(e=>[e.label,e.units]),[void 0,n.outside]])for(let i of r){if(i.key===t)return{u:i,base:n,squad:e};let r=i.subs.find(e=>e.key===t);if(r)return{u:r,base:n,squad:e,launcher:i}}}}function yn(e){if(e.route.view!==`session`)return;let t=e.route.key,n=J(e.net,t),r=n?.u;return{key:t,hit:n,u:r,mk:r?.mark??`unknown`,state:e.info?.state,name:r?.name??e.info?.name??t}}var Y=()=>M(`<a class="token">${A}<span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></a>`);function X(e,t,n){w(e,t.key?{view:`session`,ws:n,key:t.key}:void 0),e.toggleAttribute(`hidden`,!1),e.toggleAttribute(`data-alert`,!!t.key&&C(t.mark)),b(e,t.mark),y(e.querySelector(`.plate`),t.role,t.mark,t.docs),D(e,`.name`,t.name),D(e,`.role`,x(t.role)),D(e,`.note`,j(t.note,t.mark))}var Z=(e,t)=>{let n=document.createElement(`a`);return w(n,e),n.textContent=t,n},bn=()=>`<div class="dossier-in"><span class="tag">${qt()}</span><button class="x d-x" type="button" aria-label="${d()}">×</button><div class="portrait">${A}</div><h3></h3><p class="d-line"><em class="role"></em> <span class="state"></span></p><p class="d-note" hidden></p><dl class="specs"></dl><div class="d-docs" hidden><h4>${s()}</h4><div class="d-doc-list"></div><p class="d-docs-cut" hidden>${pe()}</p></div><div class="d-drones" hidden><h4>${le()}</h4><div class="formation"></div></div><div class="d-squads" hidden><h4>${Ut()}</h4><div class="d-squad-list"></div></div></div>`,xn=e=>e.classList.add(`drone`);function Sn(e,t,{openTile:n,fullScreen:r}){return function({key:i,hit:a,u:o,mk:s,state:c,name:l}){e.firstElementChild||(e.append(M(bn())),e.querySelector(`.d-x`).onclick=()=>r(!1));let u=e.firstElementChild,{net:d,info:f,model:p,ctx:m}=t,h=q(t);b(u,s),y(u.querySelector(`.plate`),o?.role??f?.role??`member`,s),D(u,`h3`,l),D(u,`.role`,x(o?.role??f?.role??`session`)),D(u,`.state`,o?j(o.note,s):Je());let g=u.querySelector(`.d-note`);g.hidden=c!==`recent`&&c!==`unknown`,g.replaceChildren(c===`unknown`?Xe():Ye()),f?.successor&&g.append(` ${jt()} `,Z({view:`session`,ws:h,key:f.successor},J(d,f.successor)?.u.name??Ke()));let _=[[Ct(),p],[bt(),m?Vt({count:m.toLocaleString()}):void 0],[xt(),f?.header?.cwd],[yt(),a&&Z({view:`workspace`,ws:a.base.id},a.base.label)],[wt(),a?.squad],[St(),a?.launcher&&Z({view:`session`,ws:a.base.id,key:a.launcher.key},a.launcher.name)],[Tt(),f?.unreadable?ye({count:f.unreadable}):void 0]];u.querySelector(`.specs`).replaceChildren(..._.filter(([,e])=>e).map(([e,t])=>{let n=M(`<div><dt></dt><dd></dd></div>`);return n.firstElementChild.textContent=e,n.lastElementChild.append(t),n})),vn(u.querySelector(`.d-docs`),o?.docs,o?.docsCut,e=>(r(!1),n(hn(l,e))));let v=u.querySelector(`.d-drones`);v.hidden=!o?.subs.length,k(v.querySelector(`.formation`),(o?.subs??[]).map(e=>({...e,id:e.key})),Y,(e,t)=>(xn(e),X(e,t,h)));let S=u.querySelector(`.d-squads`),C=o?.role===`tower`?a?.base:void 0;S.hidden=!C?.tabs.length,k(S.querySelector(`.d-squad-list`),C?.tabs??[],()=>M(`<div class="d-squad"><small></small><div class="formation"></div></div>`),(e,t)=>(D(e,`small`,R({label:t.label})),k(e.querySelector(`.formation`),t.units.flatMap(e=>[e,...e.subs]).map(e=>({...e,id:e.key})),Y,(e,t)=>(xn(e),X(e,t,C.id)))))}}function Cn(e){let t=(e,t,n)=>{let r=document.createElement(e);return r.textContent=t,n&&w(r,n),r},n=document.getElementById(`crumbs`),{route:r,net:i,info:a}=e;if(r.view===`map`)return n.replaceChildren(t(`b`,`Straw Net`),t(`span`,m()));let o=i?.bases.find(e=>e.id===r.ws)?.label??r.ws,s=r.view===`session`?J(i,r.key)?.u.name??a?.name??r.key:``,c=[];for(let e=r.view===`session`?J(i,r.key):void 0,t=0;e?.launcher&&t<8;e=J(i,e.launcher.key),t++)c.unshift(e.launcher);let l=[t(`a`,`Straw Net`,{view:`map`}),r.view===`workspace`?t(`b`,o):t(`a`,o,{view:`workspace`,ws:r.ws}),...c.map(e=>t(`a`,e.name,{view:`session`,ws:r.ws,key:e.key})),...s?[t(`b`,s)]:[]];l.slice(1,-2).forEach(e=>e.classList.add(`mid`));let u=l.length>3?[Object.assign(t(`span`,`…`),{className:`crumb-more`,role:`button`,tabIndex:0,onclick:()=>n.classList.toggle(`open`)})]:[];n.classList.remove(`open`),n.replaceChildren(l[0],...u,...l.slice(1))}function wn(e,t,n){let r=e=>[`map`,`workspace`,`session`].indexOf(e.view),i=r(e)<r(t)?`enter-back`:e.view===`workspace`&&n?`enter-zoom`:e.view===`session`&&t.view!==`session`?`enter-slide`:``,a=document.getElementById({map:`map`,workspace:`ws-view`,session:`session-view`}[e.view]);if(i){if(n){let e=a.getBoundingClientRect();a.style.setProperty(`--ox`,`${Math.round(n.x+n.width/2-e.x)}px`),a.style.setProperty(`--oy`,`${Math.round(n.y+n.height/2-e.y)}px`)}a.classList.remove(`enter-zoom`,`enter-slide`,`enter-back`),ee(a,i),setTimeout(()=>a.classList.remove(i),700)}}function Tn(e,t){let n=e.querySelector(`.queue-list`);if(!n)return;n.hidden=!t?.length;let r=e=>Object.assign(document.createElement(`b`),{textContent:e.as===`steer`?lt():ct()});n.replaceChildren(...(t??[]).map(e=>{let t=document.createElement(`p`);return t.append(r(e),document.createTextNode(e.text)),t}))}function En(e,t){let n=e.querySelector(`.todos`);if(!n||(n.hidden=!t?.length,!t?.length))return;let r=t.filter(e=>e.status===`completed`).length,i=t.find(e=>e.status===`in_progress`);D(n,`summary b`,Lt({done:r,total:t.length})),D(n,`summary span`,i?i.activeForm??i.subject:r===t.length?Rt():``),n.querySelector(`ol`).replaceChildren(...t.map(e=>Object.assign(document.createElement(`li`),{textContent:e.subject,className:e.status})))}function Dn(e,t){let n=e.querySelector(`.monitors`);if(!n||(n.hidden=!t?.length,!t?.length))return;let r=t.filter(e=>e.status===`running`),i=t.filter(e=>e.status===`error`||e.status===`stale`).length;n.dataset.failed=String(i>0),D(n,`summary b`,[Ge(),r.length&&We({count:r.length}),i&&Ve({count:i})].filter(Boolean).join(` · `)),D(n,`summary span`,r[0]?r[0].last??r[0].what:``);let a={running:Ie,done:Pe,error:Fe,stale:Le,stopped:Re};n.querySelector(`ul`).replaceChildren(...t.map(e=>{let t=Object.assign(document.createElement(`li`),{className:e.status}),n=[a[e.status](),e.exit!==void 0&&Ae({code:e.exit}),Ne({count:e.lines})].filter(Boolean).join(` · `);return t.append(Object.assign(document.createElement(`b`),{textContent:e.what}),Object.assign(document.createElement(`small`),{textContent:n})),e.last&&t.append(Object.assign(document.createElement(`code`),{textContent:e.last})),t}))}var On=e=>/^\/(\S{0,64})$/.exec(e)?.[1],kn=(e,t,n)=>(e+n+t)%t;function An(e,t){let n=_(`ul`,{class:`slash`,id:`slash`,role:`listbox`,"aria-label":se()}),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=_(`li`,{id:`slash-${t}`,role:`option`,"aria-selected":String(t===i)},_(`b`,null,`/${e.name}`),e.description&&_(`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=On(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=kn(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 jn=16384,Mn=/^\s*\/(quit|exit|new|resume|fork|clone|import|reload)(?=\s|$)/,Q=new Map,Nn=e=>(n,r)=>t(`sessions/${encodeURIComponent(e)}/${n}`,r);function Pn(e,t,n){if(!e.ok)return[`error`,e.status===504?z():e.body.reason??c({status:e.status})];if(t&&!t.startsWith(n))return[`ok`,Zt()]}var Fn=e=>{try{return e?.startsWith(`[`)?JSON.parse(e):e?[`error`,e]:void 0}catch{return[`error`,e]}},In=(e,t)=>e!==``&&!e.startsWith(t)?ht():``,Ln=(e,t)=>e.startsWith(t)?e.slice(t.length).replace(/^\n/,``):e;function $(e){if(!e.online)return ie();if(!e.live)return ne();if(!e.control)return re();if(e.mark===`waiting`)return e.answerable?I():L()}function Rn(t,n,i,a=t=>e(`sessions/${encodeURIComponent(n)}/upload`,t)){let o=`sb-draft:${n}`,s=matchMedia(`(pointer: coarse)`).matches,u=_(`textarea`,{rows:`1`,maxlength:String(jn),"aria-label":De(),enterkeyhint:s?`enter`:`send`}),d=_(`button`,{type:`submit`,class:`cmp-send`},dt()),p=_(`button`,{type:`button`,class:`cmp-alt`},Ce()),m=_(`button`,{type:`button`,class:`cmp-alt cmp-stop`},kt()),h=_(`input`,{type:`file`,multiple:``,hidden:``}),g=_(`button`,{type:`button`,class:`cmp-alt`,"aria-label":te()},`+`),v=_(`p`,{class:`cmp-note`,role:`status`,"aria-live":`polite`}),y=An(u,e=>i(`commands`,{prefix:e})),b=_(`form`,{class:`composer`},y,_(`div`,{class:`cmp-row`},g,h,u,_(`div`,{class:`cmp-acts`},d,p,m)),_(`div`,{class:`cmp-foot`},v));t.replaceChildren(b);let x={name:``,control:!1,live:!1,mark:`unknown`,online:!1},S=!1,C=!1,w=e=>{try{e()}catch{}};w(()=>u.value=sessionStorage.getItem(o)??``);let T=()=>w(()=>u.value?sessionStorage.setItem(o,u.value):sessionStorage.removeItem(o)),E=CSS.supports(`field-sizing`,`content`)?()=>{}:()=>(u.style.height=`auto`,u.style.height=`${Math.min(u.scrollHeight,220)}px`),D=(e,t=``,...n)=>(v.dataset.tone=t,v.replaceChildren(e,...n)),O=(e,t,n)=>{let r=_(`button`,{type:`button`,class:`cmp-yes`},t),i=_(`button`,{type:`button`,class:`cmp-link`},f());C=!0,r.onclick=()=>(C=!1,n()),i.onclick=()=>(C=!1,D(``),u.focus()),D(e,`ask`,r,i),r.focus()},[k,A]=[`${o}:note`,()=>{try{return sessionStorage.getItem(o)??``}catch{return}}],j=e=>w(()=>e?sessionStorage.setItem(k,JSON.stringify(e)):sessionStorage.removeItem(k));function M(e,t,r){let a={sent:r,answer:i(e,t)};return r!==void 0&&(j([`error`,z()]),Q.set(n,a),a.answer.then(e=>{let t=A();e.ok&&t!==void 0&&w(()=>sessionStorage.setItem(o,Ln(t,r))),j(Pn(e,t,r))},()=>j([`error`,z()]))),ee(a)}async function ee(e,{sent:t}=e){S=!0,C=!1,P(),D(t===void 0?``:r());try{let n=await e.answer;if(!b.isConnected)return;if(!n.ok)return n.status===504||j(),D(n.body.reason??c({status:n.status}),`error`);if(t===void 0)return D(``);j();let r=In(u.value,t);u.value=Ln(u.value,t),T(),E(),D(r,`ok`)}catch{D(z(),`error`)}finally{Q.get(n)===e&&Q.delete(n),S=!1,P()}}function N(e,t){let n=u.value,r=$(x),i=t===n;if(S||C||!n.trim())return;if(r)return D(r,`error`);if(new TextEncoder().encode(n).length>16384)return D(Ht(),`error`);let a=!i&&n.match(Mn)?.[0].trim();if(a)return O(ge({command:a}),mt({command:a}),()=>N(e,n));M(`input`,{text:n,as:e,confirmed:i},n)}function P(){let e=$(x),t=x.mark===`working`;u.placeholder=e??st({name:x.name}),d.disabled=S||!!e||!u.value.trim(),p.hidden=m.hidden=!t||!!e,[p.disabled,m.disabled]=[d.disabled,S]}async function F(e){if(!e.length||S)return;let t=$(x);if(t)return D(t,`error`);D(Yt(),``);for(let t of e){if(t.size>20971520)return D(Se({name:t.name}),`error`);let e=await a(t).catch(()=>void 0);if(!e?.ok||typeof e.body.path!=`string`)return D(e?.body.reason??l(),`error`);let n=u.selectionStart??u.value.length,r=u.value.slice(0,n),i=u.value.slice(u.selectionEnd??n),o=`${r&&!/\s$/.test(r)?` `:``}${e.body.path}${/^\s/.test(i)?``:` `}`;u.value=r+o+i,u.selectionStart=u.selectionEnd=n+o.length}D(``),T(),E(),P(),u.focus()}g.onclick=()=>h.click(),h.onchange=()=>void F([...h.files??[]]).finally(()=>h.value=``),u.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.files??[]];t.length&&(e.preventDefault(),F(t))}),b.addEventListener(`dragover`,e=>e.dataTransfer?.types.includes(`Files`)&&e.preventDefault()),b.addEventListener(`drop`,e=>{let t=[...e.dataTransfer?.files??[]];t.length&&(e.preventDefault(),F(t))}),b.addEventListener(`submit`,e=>(e.preventDefault(),N(`send`))),p.onclick=()=>N(`followUp`),m.onclick=()=>O(At(),kt(),()=>void(S||M(`keys`,{keys:[`esc`]}))),u.addEventListener(`input`,()=>(T(),E(),P())),b.addEventListener(`keydown`,e=>{e.key===`Escape`&&!e.isComposing&&(C||e.target===u&&u.value)&&(e.preventDefault(),C&&(C=!1,D(``),u.focus()))}),u.addEventListener(`keydown`,e=>{e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||s&&!e.altKey||(e.preventDefault(),N(e.altKey?`followUp`:`send`))});let I=window.visualViewport,L=()=>[[`--vvh`,I.height],[`--vvt`,I.offsetTop]].forEach(([e,t])=>document.documentElement.style.setProperty(e,`${t}px`));return I&&(I.addEventListener(`resize`,L),I.addEventListener(`scroll`,L),L()),E(),Q.has(n)?ee(Q.get(n)):w(()=>{let e=Fn(sessionStorage.getItem(k));sessionStorage.removeItem(k),e&&D(e[1],e[0])}),{box:u,update:e=>(x=e,P()),ready:()=>!$(x)}}var zn=()=>`<div class="comms-in"><header class="comms-head"><a class="head-back" aria-label="${F()}">‹</a><span class="logo"><svg><use href="#i-comms"/></svg></span><div class="head-id"><h2><small>${ce()}</small> <span></span></h2><p></p></div><div class="modes" role="group"><button type="button" data-mode="chat" aria-pressed="true">${ce()}</button><button type="button" data-mode="term" aria-pressed="false">${Pt()}</button></div><span class="chan link" data-state="live"><i></i><b>${oe()}</b></span><button type="button" class="pair-btn head-info">${we()}</button></header><div class="chat-root"></div><div class="queue-list" hidden></div><details class="todos" hidden><summary><b></b><span></span></summary><ol></ol></details><details class="monitors" hidden><summary><b></b><span></span></summary><ul></ul></details><div class="ask-root"></div><div class="composer-root"></div><div class="term-root" hidden></div></div>`;function Bn(e,{view:t,data:n,openTile:r,embedTerminal:a,online:s,fullScreen:c,opened:l}){let u,d,f,p=0,m,h,g=0,_=()=>setTimeout(()=>e.route.view===`session`&&(document.activeElement??document.body)===document.body&&(matchMedia(`(pointer: fine)`).matches&&d?.ready()?d.box:u?.log)?.focus({preventScroll:!0}));async function v(i){let a=++p,{mountChat:s}=await S(async()=>{let{mountChat:e}=await import(`./chat-KoGBDMyY.js`);return{mountChat:e}},__vite__mapDeps([0]),import.meta.url);if(a!==p||e.route.view!==`session`)return;t.replaceChildren(M(zn()));let m=()=>J(e.net,i)?.u??{key:i,name:e.info?.name??i,role:e.info?.role??`member`,mark:`unknown`};u=s(t.querySelector(`.chat-root`),n(i),{who:m,link:t=>{let n=J(e.net,i)?.u.subs.find(e=>e.name===t)??e.net?.bases.flatMap(e=>[...e.tabs.flatMap(e=>e.units),...e.outside]).find(e=>e.name===t);return n&&Z({view:`session`,ws:J(e.net,n.key)?.base.id??q(e),key:n.key},t)},docFor:(t,n=dn(J(e.net,i)?.u.docs,e.info?.header?.cwd,t))=>n&&(()=>r(hn(m().name,n)))});let g=n(i).post??Nn(i);[d,f]=[Rn(t.querySelector(`.composer-root`),i,g),o(t.querySelector(`.ask-root`),g,void 0,()=>y(`term`))],t.querySelectorAll(`.modes button`).forEach(e=>e.onclick=()=>y(e.dataset.mode)),t.querySelector(`.head-info`).onclick=()=>c(!0),h===`term`&&y(`term`),h=void 0,u.reveal(e.route.at),l(),_()}function y(n){if(e.route.view!==`session`)return;let r=e.route.key,i=t.querySelector(`.comms-in`);if(!i)return void(h=n===`term`?`term`:void 0);i.querySelectorAll(`.modes button`).forEach(e=>e.setAttribute(`aria-pressed`,String(e.dataset.mode===n)));for(let e of[`.chat-root`,`.ask-root`,`.composer-root`])i.querySelector(e).hidden=n===`term`;let o=i.querySelector(`.term-root`);if(o.hidden=n!==`term`,i.classList.toggle(`in-term`,n===`term`),m?.(),m=void 0,n!==`term`)return _();let s=++g;a(r,J(e.net,r)?.u.name??e.info?.name??r,o).then(t=>s===g&&e.route.view===`session`&&e.route.key===r?(m=t,o.querySelector(`.term-sink`)?.focus({preventScroll:!0})):t())}return{get chat(){return u},open(e){[u,d,f]=[void 0,void 0,void 0],t.replaceChildren(M(`<p class="lost">${nt()}</p>`)),v(e)},close(){p++,u=d=f=void 0,t.replaceChildren()},reveal(e){u?.reveal(e),_()},leaveMode:()=>(g++,m?.(),m=void 0),terminal(t){e.route.view===`session`&&e.route.key===t?y(`term`):h=`term`},draw({u:n,hit:r,mk:a,state:o,name:c}){t.querySelector(`.modes`)?.toggleAttribute(`hidden`,!n?.control),u?.docs();let l=t.querySelector(`.comms-head`);if(l){D(l,`h2 span`,n?.name??e.info?.name??``),D(l,`p`,[r?.base.label,r?.squad&&R({label:r.squad})].filter(Boolean).join(` · `));let t=l.querySelector(`.chan`),i=o===`live`||!o&&n;t.dataset.state=i?`live`:`closed`,D(t,`b`,i?oe():o===`recent`?ae():qe()),t.title=t.querySelector(`b`).textContent??``,w(l.querySelector(`.head-back`),{view:`workspace`,ws:q(e)})}En(t,e.info?.todos),Dn(t,n?.monitors),Tn(t,n?.queued),u?.setLive(a===`working`?`${j(n.note,a)}`:C(a)?O[a]():``,a),d?.update({name:c,control:!!n?.control,live:o?o===`live`:!!n,mark:a,online:s(),answerable:!!n?.pending?.answer&&!i(n?.pending?.answer,location.hostname!==`127.0.0.1`)}),f?.update(n?.pending,a===`waiting`&&!!n?.control&&s())}}}var Vn=()=>M(`<div class="col"><a class="token">${A}<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>`),Hn=()=>`<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>${E()}</span><h2></h2><p></p></div><dl class="tally"><div><dt>${Ot()}</dt><dd></dd></div><div><dt>${Jt()}</dt><dd></dd></div><div data-mark="working"><dt>${P()}</dt><dd></dd></div><div data-mark="waiting"><dt>${h()}</dt><dd></dd></div></dl></header><div class="spawn-btns"><button type="button" class="pair-btn"></button></div><div class="squads"></div><div class="camps"><section class="tab squad camp" data-group="outposts"><h3><svg><use href="#i-outpost"/></svg><b>${N()}</b><small></small></h3><div class="formation"></div></section><section class="tab squad camp" data-group="outside"><h3><svg><use href="#i-outside"/></svg><b>${rt()}</b><small>${it()}</small></h3><div class="formation"></div></section></div><p class="lost" hidden></p></div>`;function Un(e,t){e.firstElementChild||e.append(M(Hn()));let{net:n,cards:r}=t,i=e.firstElementChild,a=n?.bases.find(e=>e.id===q(t)),o=i.querySelector(`.lost`);if(o.hidden=!!a,o.textContent=n?Ee():Xt(),i.classList.toggle(`void`,!a),!a)return;let s=i.querySelector(`.keep`);b(s,a.mark),s.classList.toggle(`head`,a.head);let c=i.querySelector(`.tower`);c.classList.toggle(`ghost`,!a.tower),b(c,a.tower?.mark??`unknown`),w(c,a.tower?{view:`session`,ws:a.id,key:a.tower.key}:void 0),c.toggleAttribute(`hidden`,!1),c.toggleAttribute(`data-alert`,!!(a.tower&&C(a.tower.mark))),D(i,`h2`,a.label),v(i.querySelector(`.spawn-btns button`),a),D(i,`.title p`,a.tower?T({state:O[a.tower.mark]()}):g());let l=a.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]));[a.tabs.length,l.length,l.filter(e=>e.mark===`working`).length,l.filter(e=>e.mark===`waiting`).length].forEach((e,t)=>i.querySelectorAll(`dd`)[t].textContent=String(e));let u=(e,t)=>{b(e,t.mark),X(e.querySelector(`.token`),t,a.id);let n=e.querySelector(`.say`),i=r[t.key]??``;n.hidden=!i,D(n,`p`,i),k(e.querySelector(`.drones`),t.subs,Y,(e,t)=>(e.classList.add(`drone`),X(e,t,a.id)))};k(i.querySelector(`.squads`),a.tabs,()=>M(`<section class="tab squad"><h3><i class="flag"></i><b></b><small></small><button type="button" class="tab-add"></button></h3><div class="formation"></div></section>`),(e,t)=>{D(e,`h3 b`,R({label:t.label})),v(e.querySelector(`.tab-add`),a,t.id);let n=t.units.flatMap(e=>[e,...e.subs]);D(e,`h3 small`,Kt({count:n.length})),b(e,[`waiting`,`error`,`working`].find(e=>n.some(t=>t.mark===e))??`idle`),k(e.querySelector(`.formation`),t.units,Vn,u)});let d=(e,t)=>{let n=i.querySelector(`[data-group="${e}"]`);n.hidden=!t.length,k(n.querySelector(`.formation`),t,Y,(e,t)=>X(e,t,a.id))};d(`outposts`,a.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?p():void 0}))),d(`outside`,a.outside)}var Wn=200;function Gn({data:e,restart:t,openTile:n,embedTerminal:r,online:i}){let[a,o,s]=[`ws-view`,`session-view`,`dossier`].map(e=>document.getElementById(e)),c={route:{view:`map`},cards:{}},l=[],u=!1,d=new Map,f=e=>s.classList.toggle(`full`,e),p=Sn(s,c,{openTile:n,fullScreen:f}),m=Bn(c,{view:o,data:e,openTile:n,embedTerminal:r,online:i,fullScreen:f,opened:()=>(l.splice(0).forEach(h),g())});function h(e){m.chat?.apply(e);for(let t of e.items??[])t.kind===`assistant`&&([c.model,c.ctx]=[t.model??c.model,t.ctx??c.ctx])}function g(){let e=yn(c);e&&(p(e),m.draw(e))}let _=()=>(Cn(c),c.route.view===`workspace`?Un(a,c):g());return{terminal:m.terminal,locate:e=>J(c.net,e),show(e,t,n){let[r,i]=c.route.view===`session`?[c.route.key,c.route.at]:[];(e.view!==`workspace`||c.route.view!==`workspace`||e.ws!==c.route.ws)&&(c.cards={}),c.route=e,a.hidden=e.view!==`workspace`,o.hidden=s.hidden=e.view!==`session`,f(!1),(e.view!==`session`||e.key!==r)&&m.leaveMode(),e.view===`session`&&e.key!==r?([c.info,c.model,c.ctx,l,u]=[void 0,void 0,void 0,[],!1],m.open(e.key)):e.view===`session`&&e.at!==i?m.reveal(e.at):e.view!==`session`&&m.close(),_(),e!==t&&wn(e,t,n)},net(e){c.net=e,gn(e,d,c.route.view===`session`?c.route.key:void 0,(e,t)=>n(hn(e,t),!1)),c.route.view!==`map`&&_()},cards(e){c.cards={...c.cards,...e},c.route.view===`workspace`&&Un(a,c)},history(e){if(c.route.view===`session`&&e.key===c.route.key){if(c.info={...c.info,...e,items:void 0},e.reset&&([c.model,c.ctx]=[void 0,void 0]),document.hidden)return l.length<Wn?void l.push(e):void(u=!0);m.chat?h(e):l.push(e),g()}},wake(){if(u)return u=!1,l=[],t();l.splice(0).forEach(e=>m.chat&&h(e)),_()}}}export{Gn as mountFocus,U as n,sn as t};
7
+ `))))}}return i}function sn(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 cn=`allow-forms allow-popups allow-popups-to-escape-sandbox`,ln={},W=new Map;function un(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 dn=(e,t,n)=>e?.find(e=>un(e.display,t)===un(n,t));function fn(e,t,n=[]){let r=e.get(t);return e.set(t,new Set(n.map(e=>e.display))),r?n.filter(e=>!r.has(e.display)):[]}var G=(e,t,n=``)=>(e.state.dataset.tone=n,e.state.textContent=t),pn=(e,t)=>(e.failed=!0,G(e,t,`error`)),mn=e=>ln.src?.(e)??`doc/${encodeURIComponent(e)}/`;function K(e){if([e.loaded,e.failed]=[e.card.revision,!1],G(e,``),e.frame)return void(e.frame.src=mn(e.card.cap));let t=e.card.cap,n=/\.(md|markdown)$/i.test(e.card.display),r=++e.seq;(ln.load?.(t)??fetch(`api/doc/${encodeURIComponent(t)}`,{cache:`no-store`}).then(e=>e.ok?e.json():void 0)).then(t=>e.seq!==r||(t?e.body.replaceChildren(n?_(`div`,{class:`md`},sn(U(t.text))):_(`pre`,{class:`doc-pre`},t.text)):pn(e,ue())),()=>e.seq!==r||pn(e,a()))}function hn(e,t){let n=W.get(t.cap);if(n)return n.tile;let r=t.display.split(`/`).pop()||t.display,i=t.kind===`html`?_(`iframe`,{class:`doc-frame`,sandbox:cn,referrerpolicy:`no-referrer`,title:vt({display:t.display,unit:e})}):void 0,a=_(`button`,{type:`button`,class:`cmp-link`},ut()),o=i&&_(`a`,{class:`cmp-link`,href:mn(t.cap),target:`_blank`,rel:`noopener noreferrer`},tt()),s=i??_(`div`,{class:`doc-text`},_(`p`,{class:`chat-empty`},Te())),c=_(`span`,{class:`term-state`,role:`status`}),l=_(`em`,{class:`doc-off`},Ze()),u=_(`div`,{class:`doc-tile`},_(`div`,{class:`term-bar doc-bar`},_(`span`,{class:`doc-why`},t.reason),l,c,_(`span`,{class:`doc-acts`},a,o)),s),d=new IntersectionObserver(([e])=>(p.shown=!!e?.isIntersecting,p.shown&&!p.gone&&(p.failed||p.loaded!==p.card.revision)&&K(p))),f={id:`doc:${t.cap}`,title:`${r} · ${e}`,icon:`i-doc`,body:()=>u,closed:()=>(W.delete(t.cap),d.disconnect())},p={card:t,tile:f,loaded:0,seq:0,shown:!1,gone:!1,body:s,state:c,off:l,...i&&{frame:i}};return a.onclick=()=>!p.gone&&K(p),l.hidden=t.onScreen,d.observe(u),K(p),W.set(t.cap,p),f}function gn(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 fn(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);_n(i)}function _n(e){for(let t of W.values()){let n=e.get(t.card.cap);if(!n){t.gone||G(t,de(),`error`),t.gone=!0;continue}let r=t.gone&&(G(t,``),t.failed);[t.card,t.gone,t.off.hidden]=[n,!1,n.onScreen],(n.revision!==t.loaded||r)&&(t.shown?K(t):n.revision!==t.loaded&&G(t,fe()))}}function vn(e,t,n,r){e.hidden=!t?.length&&!n,e.querySelector(`.d-doc-list`).replaceChildren(...(t??[]).map(e=>{let t=_(`button`,{type:`button`,class:`d-doc`,title:e.reason},_(`b`,null,e.display),_(`small`,null,e.onScreen?e.reason:et({reason:e.reason})));return t.onclick=()=>r(e),t})),e.querySelector(`.d-docs-cut`).hidden=!n}var q=e=>e.route.view===`map`?``:e.route.ws;function J(e,t){for(let n of e?.bases??[]){if(n.tower?.key===t)return{u:{key:t,name:n.tower.name,role:`tower`,mark:n.tower.mark,control:n.tower.control,pending:n.tower.pending,docs:n.tower.docs,docsCut:n.tower.docsCut,subs:[]},base:n};for(let[e,r]of[...n.tabs.map(e=>[e.label,e.units]),[void 0,n.outside]])for(let i of r){if(i.key===t)return{u:i,base:n,squad:e};let r=i.subs.find(e=>e.key===t);if(r)return{u:r,base:n,squad:e,launcher:i}}}}function yn(e){if(e.route.view!==`session`)return;let t=e.route.key,n=J(e.net,t),r=n?.u;return{key:t,hit:n,u:r,mk:r?.mark??`unknown`,state:e.info?.state,name:r?.name??e.info?.name??t}}var Y=()=>M(`<a class="token">${A}<span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></a>`);function X(e,t,n){w(e,t.key?{view:`session`,ws:n,key:t.key}:void 0),e.toggleAttribute(`hidden`,!1),e.toggleAttribute(`data-alert`,!!t.key&&C(t.mark)),b(e,t.mark),y(e.querySelector(`.plate`),t.role,t.mark,t.docs),D(e,`.name`,t.name),D(e,`.role`,x(t.role)),D(e,`.note`,j(t.note,t.mark))}var Z=(e,t)=>{let n=document.createElement(`a`);return w(n,e),n.textContent=t,n},bn=()=>`<div class="dossier-in"><span class="tag">${qt()}</span><button class="x d-x" type="button" aria-label="${d()}">×</button><div class="portrait">${A}</div><h3></h3><p class="d-line"><em class="role"></em> <span class="state"></span></p><p class="d-note" hidden></p><dl class="specs"></dl><div class="d-docs" hidden><h4>${s()}</h4><div class="d-doc-list"></div><p class="d-docs-cut" hidden>${pe()}</p></div><div class="d-drones" hidden><h4>${le()}</h4><div class="formation"></div></div><div class="d-squads" hidden><h4>${Ut()}</h4><div class="d-squad-list"></div></div></div>`,xn=e=>e.classList.add(`drone`);function Sn(e,t,{openTile:n,fullScreen:r}){return function({key:i,hit:a,u:o,mk:s,state:c,name:l}){e.firstElementChild||(e.append(M(bn())),e.querySelector(`.d-x`).onclick=()=>r(!1));let u=e.firstElementChild,{net:d,info:f,model:p,ctx:m}=t,h=q(t);b(u,s),y(u.querySelector(`.plate`),o?.role??f?.role??`member`,s),D(u,`h3`,l),D(u,`.role`,x(o?.role??f?.role??`session`)),D(u,`.state`,o?j(o.note,s):Je());let g=u.querySelector(`.d-note`);g.hidden=c!==`recent`&&c!==`unknown`,g.replaceChildren(c===`unknown`?Xe():Ye()),f?.successor&&g.append(` ${jt()} `,Z({view:`session`,ws:h,key:f.successor},J(d,f.successor)?.u.name??Ke()));let _=[[Ct(),p],[bt(),m?Vt({count:m.toLocaleString()}):void 0],[xt(),f?.header?.cwd],[yt(),a&&Z({view:`workspace`,ws:a.base.id},a.base.label)],[wt(),a?.squad],[St(),a?.launcher&&Z({view:`session`,ws:a.base.id,key:a.launcher.key},a.launcher.name)],[Tt(),f?.unreadable?ye({count:f.unreadable}):void 0]];u.querySelector(`.specs`).replaceChildren(..._.filter(([,e])=>e).map(([e,t])=>{let n=M(`<div><dt></dt><dd></dd></div>`);return n.firstElementChild.textContent=e,n.lastElementChild.append(t),n})),vn(u.querySelector(`.d-docs`),o?.docs,o?.docsCut,e=>(r(!1),n(hn(l,e))));let v=u.querySelector(`.d-drones`);v.hidden=!o?.subs.length,k(v.querySelector(`.formation`),(o?.subs??[]).map(e=>({...e,id:e.key})),Y,(e,t)=>(xn(e),X(e,t,h)));let S=u.querySelector(`.d-squads`),C=o?.role===`tower`?a?.base:void 0;S.hidden=!C?.tabs.length,k(S.querySelector(`.d-squad-list`),C?.tabs??[],()=>M(`<div class="d-squad"><small></small><div class="formation"></div></div>`),(e,t)=>(D(e,`small`,R({label:t.label})),k(e.querySelector(`.formation`),t.units.flatMap(e=>[e,...e.subs]).map(e=>({...e,id:e.key})),Y,(e,t)=>(xn(e),X(e,t,C.id)))))}}function Cn(e){let t=(e,t,n)=>{let r=document.createElement(e);return r.textContent=t,n&&w(r,n),r},n=document.getElementById(`crumbs`),{route:r,net:i,info:a}=e;if(r.view===`map`)return n.replaceChildren(t(`b`,`Straw Net`),t(`span`,m()));let o=i?.bases.find(e=>e.id===r.ws)?.label??r.ws,s=r.view===`session`?J(i,r.key)?.u.name??a?.name??r.key:``,c=[];for(let e=r.view===`session`?J(i,r.key):void 0,t=0;e?.launcher&&t<8;e=J(i,e.launcher.key),t++)c.unshift(e.launcher);let l=[t(`a`,`Straw Net`,{view:`map`}),r.view===`workspace`?t(`b`,o):t(`a`,o,{view:`workspace`,ws:r.ws}),...c.map(e=>t(`a`,e.name,{view:`session`,ws:r.ws,key:e.key})),...s?[t(`b`,s)]:[]];l.slice(1,-2).forEach(e=>e.classList.add(`mid`));let u=l.length>3?[Object.assign(t(`span`,`…`),{className:`crumb-more`,role:`button`,tabIndex:0,onclick:()=>n.classList.toggle(`open`)})]:[];n.classList.remove(`open`),n.replaceChildren(l[0],...u,...l.slice(1))}function wn(e,t,n){let r=e=>[`map`,`workspace`,`session`].indexOf(e.view),i=r(e)<r(t)?`enter-back`:e.view===`workspace`&&n?`enter-zoom`:e.view===`session`&&t.view!==`session`?`enter-slide`:``,a=document.getElementById({map:`map`,workspace:`ws-view`,session:`session-view`}[e.view]);if(i){if(n){let e=a.getBoundingClientRect();a.style.setProperty(`--ox`,`${Math.round(n.x+n.width/2-e.x)}px`),a.style.setProperty(`--oy`,`${Math.round(n.y+n.height/2-e.y)}px`)}a.classList.remove(`enter-zoom`,`enter-slide`,`enter-back`),ee(a,i),setTimeout(()=>a.classList.remove(i),700)}}function Tn(e,t){let n=e.querySelector(`.queue-list`);if(!n)return;n.hidden=!t?.length;let r=e=>Object.assign(document.createElement(`b`),{textContent:e.as===`steer`?lt():ct()});n.replaceChildren(...(t??[]).map(e=>{let t=document.createElement(`p`);return t.append(r(e),document.createTextNode(e.text)),t}))}function En(e,t){let n=e.querySelector(`.todos`);if(!n||(n.hidden=!t?.length,!t?.length))return;let r=t.filter(e=>e.status===`completed`).length,i=t.find(e=>e.status===`in_progress`);D(n,`summary b`,Lt({done:r,total:t.length})),D(n,`summary span`,i?i.activeForm??i.subject:r===t.length?Rt():``),n.querySelector(`ol`).replaceChildren(...t.map(e=>Object.assign(document.createElement(`li`),{textContent:e.subject,className:e.status})))}function Dn(e,t){let n=e.querySelector(`.monitors`);if(!n||(n.hidden=!t?.length,!t?.length))return;let r=t.filter(e=>e.status===`running`),i=t.filter(e=>e.status===`error`||e.status===`stale`).length;n.dataset.failed=String(i>0),D(n,`summary b`,[Ge(),r.length&&We({count:r.length}),i&&Ve({count:i})].filter(Boolean).join(` · `)),D(n,`summary span`,r[0]?r[0].last??r[0].what:``);let a={running:Ie,done:Pe,error:Fe,stale:Le,stopped:Re};n.querySelector(`ul`).replaceChildren(...t.map(e=>{let t=Object.assign(document.createElement(`li`),{className:e.status}),n=[a[e.status](),e.exit!==void 0&&Ae({code:e.exit}),Ne({count:e.lines})].filter(Boolean).join(` · `);return t.append(Object.assign(document.createElement(`b`),{textContent:e.what}),Object.assign(document.createElement(`small`),{textContent:n})),e.last&&t.append(Object.assign(document.createElement(`code`),{textContent:e.last})),t}))}var On=e=>/^\/(\S{0,64})$/.exec(e)?.[1],kn=(e,t,n)=>(e+n+t)%t;function An(e,t){let n=_(`ul`,{class:`slash`,id:`slash`,role:`listbox`,"aria-label":se()}),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=_(`li`,{id:`slash-${t}`,role:`option`,"aria-selected":String(t===i)},_(`b`,null,`/${e.name}`),e.description&&_(`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=On(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=kn(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 jn=16384,Mn=/^\s*\/(quit|exit|new|resume|fork|clone|import|reload)(?=\s|$)/,Q=new Map,Nn=e=>(n,r)=>t(`sessions/${encodeURIComponent(e)}/${n}`,r);function Pn(e,t,n){if(!e.ok)return[`error`,e.status===504?z():e.body.reason??c({status:e.status})];if(t&&!t.startsWith(n))return[`ok`,Zt()]}var Fn=e=>{try{return e?.startsWith(`[`)?JSON.parse(e):e?[`error`,e]:void 0}catch{return[`error`,e]}},In=(e,t)=>e!==``&&!e.startsWith(t)?ht():``,Ln=(e,t)=>e.startsWith(t)?e.slice(t.length).replace(/^\n/,``):e;function $(e){if(!e.online)return ie();if(!e.live)return ne();if(!e.control)return re();if(e.mark===`waiting`)return e.answerable?I():L()}function Rn(t,n,i,a=t=>e(`sessions/${encodeURIComponent(n)}/upload`,t)){let o=`sb-draft:${n}`,s=matchMedia(`(pointer: coarse)`).matches,u=_(`textarea`,{rows:`1`,maxlength:String(jn),"aria-label":De(),enterkeyhint:s?`enter`:`send`}),d=_(`button`,{type:`submit`,class:`cmp-send`},dt()),p=_(`button`,{type:`button`,class:`cmp-alt`},Ce()),m=_(`button`,{type:`button`,class:`cmp-alt cmp-stop`},kt()),h=_(`input`,{type:`file`,multiple:``,hidden:``}),g=_(`button`,{type:`button`,class:`cmp-alt`,"aria-label":te()},`+`),v=_(`p`,{class:`cmp-note`,role:`status`,"aria-live":`polite`}),y=An(u,e=>i(`commands`,{prefix:e})),b=_(`form`,{class:`composer`},y,_(`div`,{class:`cmp-row`},g,h,u,_(`div`,{class:`cmp-acts`},d,p,m)),_(`div`,{class:`cmp-foot`},v));t.replaceChildren(b);let x={name:``,control:!1,live:!1,mark:`unknown`,online:!1},S=!1,C=!1,w=e=>{try{e()}catch{}};w(()=>u.value=sessionStorage.getItem(o)??``);let T=()=>w(()=>u.value?sessionStorage.setItem(o,u.value):sessionStorage.removeItem(o)),E=CSS.supports(`field-sizing`,`content`)?()=>{}:()=>(u.style.height=`auto`,u.style.height=`${Math.min(u.scrollHeight,220)}px`),D=(e,t=``,...n)=>(v.dataset.tone=t,v.replaceChildren(e,...n)),O=(e,t,n)=>{let r=_(`button`,{type:`button`,class:`cmp-yes`},t),i=_(`button`,{type:`button`,class:`cmp-link`},f());C=!0,r.onclick=()=>(C=!1,n()),i.onclick=()=>(C=!1,D(``),u.focus()),D(e,`ask`,r,i),r.focus()},[k,A]=[`${o}:note`,()=>{try{return sessionStorage.getItem(o)??``}catch{return}}],j=e=>w(()=>e?sessionStorage.setItem(k,JSON.stringify(e)):sessionStorage.removeItem(k));function M(e,t,r){let a={sent:r,answer:i(e,t)};return r!==void 0&&(j([`error`,z()]),Q.set(n,a),a.answer.then(e=>{let t=A();e.ok&&t!==void 0&&w(()=>sessionStorage.setItem(o,Ln(t,r))),j(Pn(e,t,r))},()=>j([`error`,z()]))),ee(a)}async function ee(e,{sent:t}=e){S=!0,C=!1,P(),D(t===void 0?``:r());try{let n=await e.answer;if(!b.isConnected)return;if(!n.ok)return n.status===504||j(),D(n.body.reason??c({status:n.status}),`error`);if(t===void 0)return D(``);j();let r=In(u.value,t);u.value=Ln(u.value,t),T(),E(),D(r,`ok`)}catch{D(z(),`error`)}finally{Q.get(n)===e&&Q.delete(n),S=!1,P()}}function N(e,t){let n=u.value,r=$(x),i=t===n;if(S||C||!n.trim())return;if(r)return D(r,`error`);if(new TextEncoder().encode(n).length>16384)return D(Ht(),`error`);let a=!i&&n.match(Mn)?.[0].trim();if(a)return O(ge({command:a}),mt({command:a}),()=>N(e,n));M(`input`,{text:n,as:e,confirmed:i},n)}function P(){let e=$(x),t=x.mark===`working`;u.placeholder=e??st({name:x.name}),d.disabled=S||!!e||!u.value.trim(),p.hidden=m.hidden=!t||!!e,[p.disabled,m.disabled]=[d.disabled,S]}async function F(e){if(!e.length||S)return;let t=$(x);if(t)return D(t,`error`);D(Yt(),``);for(let t of e){if(t.size>20971520)return D(Se({name:t.name}),`error`);let e=await a(t).catch(()=>void 0);if(!e?.ok||typeof e.body.path!=`string`)return D(e?.body.reason??l(),`error`);let n=u.selectionStart??u.value.length,r=u.value.slice(0,n),i=u.value.slice(u.selectionEnd??n),o=`${r&&!/\s$/.test(r)?` `:``}${e.body.path}${/^\s/.test(i)?``:` `}`;u.value=r+o+i,u.selectionStart=u.selectionEnd=n+o.length}D(``),T(),E(),P(),u.focus()}g.onclick=()=>h.click(),h.onchange=()=>void F([...h.files??[]]).finally(()=>h.value=``),u.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.files??[]];t.length&&(e.preventDefault(),F(t))}),b.addEventListener(`dragover`,e=>e.dataTransfer?.types.includes(`Files`)&&e.preventDefault()),b.addEventListener(`drop`,e=>{let t=[...e.dataTransfer?.files??[]];t.length&&(e.preventDefault(),F(t))}),b.addEventListener(`submit`,e=>(e.preventDefault(),N(`send`))),p.onclick=()=>N(`followUp`),m.onclick=()=>O(At(),kt(),()=>void(S||M(`keys`,{keys:[`esc`]}))),u.addEventListener(`input`,()=>(T(),E(),P())),b.addEventListener(`keydown`,e=>{e.key===`Escape`&&!e.isComposing&&(C||e.target===u&&u.value)&&(e.preventDefault(),C&&(C=!1,D(``),u.focus()))}),u.addEventListener(`keydown`,e=>{e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||s&&!e.altKey||(e.preventDefault(),N(e.altKey?`followUp`:`send`))});let I=window.visualViewport,L=()=>[[`--vvh`,I.height],[`--vvt`,I.offsetTop]].forEach(([e,t])=>document.documentElement.style.setProperty(e,`${t}px`));return I&&(I.addEventListener(`resize`,L),I.addEventListener(`scroll`,L),L()),E(),Q.has(n)?ee(Q.get(n)):w(()=>{let e=Fn(sessionStorage.getItem(k));sessionStorage.removeItem(k),e&&D(e[1],e[0])}),{box:u,update:e=>(x=e,P()),ready:()=>!$(x)}}var zn=()=>`<div class="comms-in"><header class="comms-head"><a class="head-back" aria-label="${F()}">‹</a><span class="logo"><svg><use href="#i-comms"/></svg></span><div class="head-id"><h2><small>${ce()}</small> <span></span></h2><p></p></div><div class="modes" role="group"><button type="button" data-mode="chat" aria-pressed="true">${ce()}</button><button type="button" data-mode="term" aria-pressed="false">${Pt()}</button></div><span class="chan link" data-state="live"><i></i><b>${oe()}</b></span><button type="button" class="pair-btn head-info">${we()}</button></header><div class="chat-root"></div><div class="queue-list" hidden></div><details class="todos" hidden><summary><b></b><span></span></summary><ol></ol></details><details class="monitors" hidden><summary><b></b><span></span></summary><ul></ul></details><div class="ask-root"></div><div class="composer-root"></div><div class="term-root" hidden></div></div>`;function Bn(e,{view:t,data:n,openTile:r,embedTerminal:a,online:s,fullScreen:c,opened:l}){let u,d,f,p=0,m,h,g=0,_=()=>setTimeout(()=>e.route.view===`session`&&(document.activeElement??document.body)===document.body&&(matchMedia(`(pointer: fine)`).matches&&d?.ready()?d.box:u?.log)?.focus({preventScroll:!0}));async function v(i){let a=++p,{mountChat:s}=await S(async()=>{let{mountChat:e}=await import(`./chat-Xv1V3Ep2.js`);return{mountChat:e}},__vite__mapDeps([0]),import.meta.url);if(a!==p||e.route.view!==`session`)return;t.replaceChildren(M(zn()));let m=()=>J(e.net,i)?.u??{key:i,name:e.info?.name??i,role:e.info?.role??`member`,mark:`unknown`};u=s(t.querySelector(`.chat-root`),n(i),{who:m,link:t=>{let n=J(e.net,i)?.u.subs.find(e=>e.name===t)??e.net?.bases.flatMap(e=>[...e.tabs.flatMap(e=>e.units),...e.outside]).find(e=>e.name===t);return n&&Z({view:`session`,ws:J(e.net,n.key)?.base.id??q(e),key:n.key},t)},docFor:(t,n=dn(J(e.net,i)?.u.docs,e.info?.header?.cwd,t))=>n&&(()=>r(hn(m().name,n)))});let g=n(i).post??Nn(i);[d,f]=[Rn(t.querySelector(`.composer-root`),i,g),o(t.querySelector(`.ask-root`),g,void 0,()=>y(`term`))],t.querySelectorAll(`.modes button`).forEach(e=>e.onclick=()=>y(e.dataset.mode)),t.querySelector(`.head-info`).onclick=()=>c(!0),h===`term`&&y(`term`),h=void 0,u.reveal(e.route.at),l(),_()}function y(n){if(e.route.view!==`session`)return;let r=e.route.key,i=t.querySelector(`.comms-in`);if(!i)return void(h=n===`term`?`term`:void 0);i.querySelectorAll(`.modes button`).forEach(e=>e.setAttribute(`aria-pressed`,String(e.dataset.mode===n)));for(let e of[`.chat-root`,`.ask-root`,`.composer-root`])i.querySelector(e).hidden=n===`term`;let o=i.querySelector(`.term-root`);if(o.hidden=n!==`term`,i.classList.toggle(`in-term`,n===`term`),m?.(),m=void 0,n!==`term`)return _();let s=++g;a(r,J(e.net,r)?.u.name??e.info?.name??r,o).then(t=>s===g&&e.route.view===`session`&&e.route.key===r?(m=t,o.querySelector(`.term-sink`)?.focus({preventScroll:!0})):t())}return{get chat(){return u},open(e){[u,d,f]=[void 0,void 0,void 0],t.replaceChildren(M(`<p class="lost">${nt()}</p>`)),v(e)},close(){p++,u=d=f=void 0,t.replaceChildren()},reveal(e){u?.reveal(e),_()},leaveMode:()=>(g++,m?.(),m=void 0),terminal(t){e.route.view===`session`&&e.route.key===t?y(`term`):h=`term`},draw({u:n,hit:r,mk:a,state:o,name:c}){t.querySelector(`.modes`)?.toggleAttribute(`hidden`,!n?.control),u?.docs();let l=t.querySelector(`.comms-head`);if(l){D(l,`h2 span`,n?.name??e.info?.name??``),D(l,`p`,[r?.base.label,r?.squad&&R({label:r.squad})].filter(Boolean).join(` · `));let t=l.querySelector(`.chan`),i=o===`live`||!o&&n;t.dataset.state=i?`live`:`closed`,D(t,`b`,i?oe():o===`recent`?ae():qe()),t.title=t.querySelector(`b`).textContent??``,w(l.querySelector(`.head-back`),{view:`workspace`,ws:q(e)})}En(t,e.info?.todos),Dn(t,n?.monitors),Tn(t,n?.queued),u?.setLive(a===`working`?`${j(n.note,a)}`:C(a)?O[a]():``,a),d?.update({name:c,control:!!n?.control,live:o?o===`live`:!!n,mark:a,online:s(),answerable:!!n?.pending?.answer&&!i(n?.pending?.answer,location.hostname!==`127.0.0.1`)}),f?.update(n?.pending,a===`waiting`&&!!n?.control&&s())}}}var Vn=()=>M(`<div class="col"><a class="token">${A}<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>`),Hn=()=>`<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>${E()}</span><h2></h2><p></p></div><dl class="tally"><div><dt>${Ot()}</dt><dd></dd></div><div><dt>${Jt()}</dt><dd></dd></div><div data-mark="working"><dt>${P()}</dt><dd></dd></div><div data-mark="waiting"><dt>${h()}</dt><dd></dd></div></dl></header><div class="spawn-btns"><button type="button" class="pair-btn"></button></div><div class="squads"></div><div class="camps"><section class="tab squad camp" data-group="outposts"><h3><svg><use href="#i-outpost"/></svg><b>${N()}</b><small></small></h3><div class="formation"></div></section><section class="tab squad camp" data-group="outside"><h3><svg><use href="#i-outside"/></svg><b>${rt()}</b><small>${it()}</small></h3><div class="formation"></div></section></div><p class="lost" hidden></p></div>`;function Un(e,t){e.firstElementChild||e.append(M(Hn()));let{net:n,cards:r}=t,i=e.firstElementChild,a=n?.bases.find(e=>e.id===q(t)),o=i.querySelector(`.lost`);if(o.hidden=!!a,o.textContent=n?Ee():Xt(),i.classList.toggle(`void`,!a),!a)return;let s=i.querySelector(`.keep`);b(s,a.mark),s.classList.toggle(`head`,a.head);let c=i.querySelector(`.tower`);c.classList.toggle(`ghost`,!a.tower),b(c,a.tower?.mark??`unknown`),w(c,a.tower?{view:`session`,ws:a.id,key:a.tower.key}:void 0),c.toggleAttribute(`hidden`,!1),c.toggleAttribute(`data-alert`,!!(a.tower&&C(a.tower.mark))),D(i,`h2`,a.label),v(i.querySelector(`.spawn-btns button`),a),D(i,`.title p`,a.tower?T({state:O[a.tower.mark]()}):g());let l=a.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]));[a.tabs.length,l.length,l.filter(e=>e.mark===`working`).length,l.filter(e=>e.mark===`waiting`).length].forEach((e,t)=>i.querySelectorAll(`dd`)[t].textContent=String(e));let u=(e,t)=>{b(e,t.mark),X(e.querySelector(`.token`),t,a.id);let n=e.querySelector(`.say`),i=r[t.key]??``;n.hidden=!i,D(n,`p`,i),k(e.querySelector(`.drones`),t.subs,Y,(e,t)=>(e.classList.add(`drone`),X(e,t,a.id)))};k(i.querySelector(`.squads`),a.tabs,()=>M(`<section class="tab squad"><h3><i class="flag"></i><b></b><small></small><button type="button" class="tab-add"></button></h3><div class="formation"></div></section>`),(e,t)=>{D(e,`h3 b`,R({label:t.label})),v(e.querySelector(`.tab-add`),a,t.id);let n=t.units.flatMap(e=>[e,...e.subs]);D(e,`h3 small`,Kt({count:n.length})),b(e,[`waiting`,`error`,`working`].find(e=>n.some(t=>t.mark===e))??`idle`),k(e.querySelector(`.formation`),t.units,Vn,u)});let d=(e,t)=>{let n=i.querySelector(`[data-group="${e}"]`);n.hidden=!t.length,k(n.querySelector(`.formation`),t,Y,(e,t)=>X(e,t,a.id))};d(`outposts`,a.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?p():void 0}))),d(`outside`,a.outside)}var Wn=200;function Gn({data:e,restart:t,openTile:n,embedTerminal:r,online:i}){let[a,o,s]=[`ws-view`,`session-view`,`dossier`].map(e=>document.getElementById(e)),c={route:{view:`map`},cards:{}},l=[],u=!1,d=new Map,f=e=>s.classList.toggle(`full`,e),p=Sn(s,c,{openTile:n,fullScreen:f}),m=Bn(c,{view:o,data:e,openTile:n,embedTerminal:r,online:i,fullScreen:f,opened:()=>(l.splice(0).forEach(h),g())});function h(e){m.chat?.apply(e);for(let t of e.items??[])t.kind===`assistant`&&([c.model,c.ctx]=[t.model??c.model,t.ctx??c.ctx])}function g(){let e=yn(c);e&&(p(e),m.draw(e))}let _=()=>(Cn(c),c.route.view===`workspace`?Un(a,c):g());return{terminal:m.terminal,locate:e=>J(c.net,e),show(e,t,n){let[r,i]=c.route.view===`session`?[c.route.key,c.route.at]:[];(e.view!==`workspace`||c.route.view!==`workspace`||e.ws!==c.route.ws)&&(c.cards={}),c.route=e,a.hidden=e.view!==`workspace`,o.hidden=s.hidden=e.view!==`session`,f(!1),(e.view!==`session`||e.key!==r)&&m.leaveMode(),e.view===`session`&&e.key!==r?([c.info,c.model,c.ctx,l,u]=[void 0,void 0,void 0,[],!1],m.open(e.key)):e.view===`session`&&e.at!==i?m.reveal(e.at):e.view!==`session`&&m.close(),_(),e!==t&&wn(e,t,n)},net(e){c.net=e,gn(e,d,c.route.view===`session`?c.route.key:void 0,(e,t)=>n(hn(e,t),!1)),c.route.view!==`map`&&_()},cards(e){c.cards={...c.cards,...e},c.route.view===`workspace`&&Un(a,c)},history(e){if(c.route.view===`session`&&e.key===c.route.key){if(c.info={...c.info,...e,items:void 0},e.reset&&([c.model,c.ctx]=[void 0,void 0]),document.hidden)return l.length<Wn?void l.push(e):void(u=!0);m.chat?h(e):l.push(e),g()}},wake(){if(u)return u=!1,l=[],t();l.splice(0).forEach(e=>m.chat&&h(e)),_()}}}export{Gn as mountFocus,U as n,sn as t};
@@ -6,7 +6,7 @@
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-DS51Ucw0.js"></script>
9
+ <script type="module" crossorigin src="./assets/index-D-LVSW44.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="./assets/index-Br2ViD0U.css">
11
11
  </head>
12
12
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-straw-boss",
3
- "version": "0.29.3",
3
+ "version": "0.29.5",
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/control.ts CHANGED
@@ -33,7 +33,7 @@ export { ENDING };
33
33
 
34
34
  export interface Reply { status: number; body: unknown }
35
35
  /** `answers.target` reads the net afresh, so the binding and the dialog are checked again for every answer. */
36
- export interface ControlDeps { lookup(key: string): Found | undefined; call?: HerdrCall; csrf: string; canonical(file?: string): string | undefined; pair?(): { url: string; rows: string[] } | undefined; remoteOn?(): Promise<void>; spawn?(parts: string[], json: Record<string, unknown>): Promise<Reply>; close?(kind: string, json: Record<string, unknown>): Promise<Reply>; stop?(asked: Asked): void; mirrors?: Pick<ReturnType<typeof createMirrors>, "toggle" | "fresh">; secret?(file: string): Promise<boolean>; answers?: Pick<Hub, "replay" | "ended" | "send" | "probe" | "commands"> & { target(key: string): Promise<Target | undefined> } }
36
+ export interface ControlDeps { lookup(key: string): Found | undefined; call?: HerdrCall; csrf: string; canonical(file?: string): string | undefined; pair?(): { url: string; rows: string[] } | undefined; remoteOn?(): Promise<void>; spawn?(parts: string[], json: Record<string, unknown>): Promise<Reply>; close?(kind: string, json: Record<string, unknown>): Promise<Reply>; dismiss?(key: unknown): Promise<boolean>; stop?(asked: Asked): void; mirrors?: Pick<ReturnType<typeof createMirrors>, "toggle" | "fresh">; secret?(file: string): Promise<boolean>; answers?: Pick<Hub, "replay" | "ended" | "send" | "probe" | "commands"> & { target(key: string): Promise<Target | undefined> } }
37
37
 
38
38
  const no = (status: number, error: string, reason: string): Reply => ({ status, body: { error, reason } });
39
39
  const same = (a: string, b: string) => a.length === b.length && timingSafeEqual(Buffer.from(a), Buffer.from(b));
@@ -74,7 +74,7 @@ export function checkText(text: unknown): string | Reply {
74
74
  return typed;
75
75
  }
76
76
 
77
- export function createControl({ lookup, call, csrf, canonical, pair, remoteOn, spawn, close, stop, mirrors, secret = async () => true, answers }: ControlDeps) {
77
+ export function createControl({ lookup, call, csrf, canonical, pair, remoteOn, spawn, close, dismiss, stop, mirrors, secret = async () => true, answers }: ControlDeps) {
78
78
  const busy = new Set<string>();
79
79
  const pad = createKeys({ fresh: (id, key, pane) => mirrors?.fresh(id, key, pane) ?? false, secret, answerable: async (key) => Boolean(await answers?.target(key)), probe: async (key) => answers?.probe(key) });
80
80
  /** The origin checks, then the session checks, then one Herdr call. `parts` is the path after api/: sessions/<key>/<action>, remote/pair, or server/stop. */
@@ -93,6 +93,7 @@ export function createControl({ lookup, call, csrf, canonical, pair, remoteOn, s
93
93
  if (key !== "stop" || action || !stop) return no(404, "not_found", "No such action.");
94
94
  return typeof by === "string" && by.length <= 200 && typeof take === "boolean" ? (stop({ by, take }), { status: 202, body: { stopping: true } }) : no(400, "bad_request", "A stop names who asks.");
95
95
  }
96
+ if (scope === "dismiss" && !key) return (await dismiss?.(read.json.key)) ? { status: 200, body: {} } : no(404, "not_found", "Only a finished subagent on the net can be dismissed.");
96
97
  if (scope === "close") return close && !action ? close(key, read.json) : no(close ? 404 : 503, close ? "not_found" : "unavailable", close ? "No such action." : "This server closes nothing.");
97
98
  if (scope === "dirs" || scope === "open") return spawn && !action ? spawn([scope, key], read.json) : no(spawn ? 404 : 503, spawn ? "not_found" : "unavailable", spawn ? "No such action." : "This server opens nothing.");
98
99
  if (scope === "remote" && key === "on" && !action) {
package/src/gui.ts CHANGED
@@ -44,11 +44,11 @@ export interface Gui { url: string; port: number; remotePort: number; token: str
44
44
  /** `net` is the registry behind the net reading (the allow list of session keys); without it no session can be watched. `call` reaches Herdr for input. */
45
45
  /** `hub` carries answers to the dialogs bridges relay (dialogs.ts); it runs exactly as long as the server. */
46
46
  /** `onRemote` turns remote access on from the page, in the session that runs the server. `onStop` takes another session's stop request (requestStop), so the owner also takes its remote entry down; without it the server stops itself. */
47
- export interface GuiOptions { read(): Promise<Net>; net?: { lookup(key: string): Found | undefined; workspace(id: string): Ref[] }; call?: HerdrCall; hub?: Hub; dir?: string; port?: number; remotePort?: number; token?: string; csrf?: string; pollMs?: number; pingMs?: number; onStop?(asked: Asked): void; onRemote?(): Promise<void>; spawn?: ControlDeps["spawn"]; close?: ControlDeps["close"] }
47
+ export interface GuiOptions { read(): Promise<Net>; net?: { lookup(key: string): Found | undefined; workspace(id: string): Ref[]; dismiss?(key: string): boolean }; call?: HerdrCall; hub?: Hub; dir?: string; paired?: string; port?: number; remotePort?: number; token?: string; csrf?: string; pollMs?: number; pingMs?: number; onStop?(asked: Asked): void; onRemote?(): Promise<void>; spawn?: ControlDeps["spawn"]; close?: ControlDeps["close"] }
48
48
  export interface Asked { by: string; take: boolean }
49
49
 
50
50
  /** Starts the server. A preferred `port` and `remotePort` (with the `token` and `csrf`) are reused when free, so a restarted server keeps the URL and the page an open tab already has. */
51
- export async function startGui({ read, net, call, hub, dir = BUNDLE, port = 0, remotePort = 0, token = randomBytes(16).toString("hex"), csrf = randomBytes(16).toString("hex"), pollMs = 2000, pingMs = 15_000, onStop, onRemote, spawn, close }: GuiOptions): Promise<Gui> {
51
+ export async function startGui({ read, net, call, hub, dir = BUNDLE, paired, port = 0, remotePort = 0, token = randomBytes(16).toString("hex"), csrf = randomBytes(16).toString("hex"), pollMs = 2000, pingMs = 15_000, onStop, onRemote, spawn, close }: GuiOptions): Promise<Gui> {
52
52
  try {
53
53
  if (!statSync(join(dir, "index.html")).isFile()) throw new Error();
54
54
  } catch {
@@ -61,11 +61,11 @@ export async function startGui({ read, net, call, hub, dir = BUNDLE, port = 0, r
61
61
  const page = html.toString("utf8").replace("<head>", `<head>\n<base href="/${token}/">\n<meta name="sb-csrf" content="${csrf}">\n<meta name="sb-build" content="${build}">`);
62
62
  const files: Files = { lookup: (key) => net?.lookup(key), workspace: (id) => net?.workspace(id) ?? [], readers: readers() };
63
63
  // Turning remote access off ends the streams of remote pages; their next request finds the cookie void.
64
- const clients = new Map<ServerResponse, Watch | undefined>(), remotes = new Set<ServerResponse>(), access = createAccess(token, () => remotes.forEach((c) => c.end()));
64
+ const clients = new Map<ServerResponse, Watch | undefined>(), remotes = new Set<ServerResponse>(), access = createAccess(token, () => remotes.forEach((c) => c.end()), paired);
65
65
  const pair = (code = access.pair(), host = access.remote?.host, url = `https://${host}/${token}/pair/${code}`) => (code && host ? { url, rows: qr(url).map((row) => row.map(Number).join("")) } : undefined);
66
66
  const mirrors = createMirrors({ call, lookup: (key) => net?.lookup(key), secret: waitsForSecret, canonical }), docs = hub && createDocs(hub, (key) => net?.lookup(key)?.name ?? key);
67
67
  const stop = (asked: Asked) => void setTimeout(() => (onStop ? onStop(asked) : void halt()), 10); // after the reply has gone out
68
- const control = createControl({ lookup: (key) => net?.lookup(key), call, csrf, canonical, pair, remoteOn: onRemote, spawn, close: close && (async (kind, json) => (await tick(), close(kind, json))), mirrors, stop, secret: waitsForSecret, answers: hub && { replay: hub.replay, ended: hub.ended, send: hub.send, probe: hub.probe, commands: hub.commands, target: async (key) => (await tick(), hub.target(key)) } });
68
+ const control = createControl({ lookup: (key) => net?.lookup(key), call, csrf, canonical, pair, remoteOn: onRemote, spawn, close: close && (async (kind, json) => (await tick(), close(kind, json))), dismiss: async (key) => typeof key === "string" && Boolean(net?.dismiss?.(key)) && (await tick(), true), mirrors, stop, secret: waitsForSecret, answers: hub && { replay: hub.replay, ended: hub.ended, send: hub.send, probe: hub.probe, commands: hub.commands, target: async (key) => (await tick(), hub.target(key)) } });
69
69
  let last: string | undefined, problem: string | undefined, inflight: Promise<void> | undefined;
70
70
  let poll: ReturnType<typeof setInterval> | undefined, beat: ReturnType<typeof setInterval> | undefined;
71
71
  const send = (to: ServerResponse, data: string, event?: string) => to.writableEnded || to.write(`${event ? `event: ${event}\n` : ""}data: ${data}\n\n`); // a reading in flight at stop ends after the streams
@@ -132,7 +132,7 @@ export async function startGui({ read, net, call, hub, dir = BUNDLE, port = 0, r
132
132
  return void fail(404);
133
133
  }
134
134
  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
135
- 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." } }));
135
+ if (["sessions", "remote", "server", "dirs", "open", "close", "dismiss"].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." } }));
136
136
  // An entry never changes once written, so its image is cached for a day; the token in the URL keeps it to this page.
137
137
  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));
138
138
  if (req.method === "GET") return void (parts[0] === "doc" && docs ? answer(docs.text(parts[1] ?? "")) : api(files, parts, url.searchParams).then(answer, () => fail(404)));
package/src/handover.ts CHANGED
@@ -9,7 +9,7 @@ import { type Asked, type Gui, VERSION } from "./gui.ts";
9
9
  // the running one: it asks it to stop (requestStop), or takes it over, stopping it and starting its own on the same URL. A session whose
10
10
  // pi-straw-boss is newer takes it over unasked, so an update reaches every open page once one session has reloaded.
11
11
  /** `ownerSession` is the owner's intercom session id: bridges follow it to the server's dialog channel. `reload` marks a server its owner's /reload stopped. */
12
- export interface GuiRecord { pid: number; port: number; remotePort?: number; token: string; csrf?: string; owner: string; ownerSession?: string; version?: string; reload?: boolean }
12
+ export interface GuiRecord { pid: number; port: number; remotePort?: number; token: string; csrf?: string; owner: string; ownerSession?: string; version?: string; reload?: boolean; remote?: boolean }
13
13
  /** `stale`: the running server is older and could not be taken over. */
14
14
  export interface Shared { url: string; owner: string; mine?: Gui; stale?: boolean }
15
15
 
@@ -33,9 +33,9 @@ export function readRecord(dir: string): GuiRecord | undefined {
33
33
  * Marks the record of the server this process runs, so the extension that loads after its /reload starts it again on the same URL.
34
34
  * Matched by pid, not by session id: pi-intercom, loaded first, has already cleared PI_INTERCOM_SESSION_ID when this runs at shutdown.
35
35
  */
36
- export function markReload(dir: string, pid = process.pid) {
36
+ export function markReload(dir: string, remote = false, pid = process.pid) {
37
37
  const record = readRecord(dir);
38
- if (record?.pid === pid) writeFileSync(join(dir, "gui.json"), JSON.stringify({ ...record, reload: true }), { mode: 0o600 });
38
+ if (record?.pid === pid) writeFileSync(join(dir, "gui.json"), JSON.stringify({ ...record, reload: true, remote }), { mode: 0o600 });
39
39
  }
40
40
 
41
41
  /** 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/host.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { join } from "node:path";
1
2
  import type { Bridge } from "./bridge.ts";
2
3
  import { createCloser } from "./closer.ts";
3
4
  import { createHub } from "./dialogs.ts";
@@ -42,7 +43,7 @@ export function createHost({ pi, cfg, s, guiDir, me, tell }: Kit, { bridge, conn
42
43
  const share = (take = false, remote = false) =>
43
44
  (opening ??= (async () => {
44
45
  if (s.gui) return { url: s.gui.url, owner: label(), mine: s.gui };
45
- const start = (prefer: { port?: number; remotePort?: number; token?: string; csrf?: string }, net = netSource({ run, world, sessions, hub: (s.hub = s.hub?.me === me() ? s.hub : createHub(pi, me(), bridge)) })) => startGui({ read: net.read, net, call, hub: s.hub, dir: bundle, ...prefer, onStop: (asked) => void stopOwn(asked), onRemote: async () => tell((await switchRemote(s.gui!, true, guiDir, ts)).text), spawn: createSpawn({ run, sleep, call, live: async (id) => (await sessions()).some((x) => x.id === id), sessionAt: async (pane) => (await sessions()).find((x) => x.herdrLocation?.paneId === pane)?.id }), close: createCloser({ run, sleep, me, sessions, ask: async (key, keepPane) => s.hub?.close(key, keepPane) }) });
46
+ const start = (prefer: { port?: number; remotePort?: number; token?: string; csrf?: string }, net = netSource({ run, world, sessions, hub: (s.hub = s.hub?.me === me() ? s.hub : createHub(pi, me(), bridge)) })) => startGui({ read: net.read, net, call, hub: s.hub, dir: bundle, paired: join(guiDir, "paired.json"), ...prefer, onStop: (asked) => void stopOwn(asked), onRemote: async () => tell((await switchRemote(s.gui!, true, guiDir, ts)).text), spawn: createSpawn({ run, sleep, call, live: async (id) => (await sessions()).some((x) => x.id === id), sessionAt: async (pane) => (await sessions()).find((x) => x.herdrLocation?.paneId === pane)?.id }), close: createCloser({ run, sleep, me, sessions, ask: async (key, keepPane) => s.hub?.close(key, keepPane) }) });
46
47
  const shared = await sharedGui(guiDir, [label(), me()], start, sleep, { version, take });
47
48
  if ((s.gui = shared.mine) && !remote) await switchRemote(s.gui, false, guiDir, ts).catch(() => {});
48
49
  return shared;
@@ -51,6 +52,11 @@ export function createHost({ pi, cfg, s, guiDir, me, tell }: Kit, { bridge, conn
51
52
  return {
52
53
  sessions,
53
54
  share,
55
+ /** The server again after a /reload, with remote access back on when it was on (its paired devices kept their cookies). */
56
+ async restore(remote: boolean) {
57
+ await share(false, remote);
58
+ if (remote && s.gui) tell((await switchRemote(s.gui, true, guiDir, ts)).text);
59
+ },
54
60
  /** `mode` is "", "stop", "remote", or "remote off", and works from any session: remote access (remote.ts) goes with the server, so a session takes it over first. */
55
61
  async command(mode: string) {
56
62
  if (mode === "stop") {
@@ -73,8 +79,8 @@ export function createHost({ pi, cfg, s, guiDir, me, tell }: Kit, { bridge, conn
73
79
  },
74
80
  /** The session ends: a /reload, /new, or /resume (`reload`) marks the server to start again in this process, and the server stops with its remote entry. */
75
81
  async release(reload: boolean) {
76
- if (s.gui && reload) markReload(guiDir); // a /reload, /new, or /resume starts it again in this process
77
- if (s.gui) await switchRemote(s.gui, false, guiDir, ts).catch(() => {});
82
+ if (s.gui && reload) markReload(guiDir, Boolean(s.gui.access.remote)); // a /reload, /new, or /resume starts it again in this process, remote and paired devices too
83
+ if (s.gui) await switchRemote(s.gui, false, guiDir, ts, reload).catch(() => {});
78
84
  await s.gui?.stop();
79
85
  s.gui = undefined;
80
86
  },
package/src/net.ts CHANGED
@@ -95,10 +95,14 @@ export async function collectNet({ run, world = worldOf(run), sessions, now = Da
95
95
  */
96
96
  export function netSource(env: { run: HerdrRun; world?: HerdrWorld; sessions(): Promise<Session[]>; sessionDir?: string; hub?: { relayed(sessions: Session[], refs: Map<string, Ref>): Relayed } }) {
97
97
  let refs = new Map<string, Ref>(), live: Session[] = [];
98
- const gone = new Map<string, { ref: Ref; at: number }>(), sessions = async () => (live = await env.sessions());
98
+ const gone = new Map<string, { ref: Ref; at: number }>(), sessions = async () => (live = await env.sessions()), dismissed = new Set<string>(), ended = new Set<string>();
99
+ const drop = (u: Unit) => (u.subs.forEach((c) => c.ended && ended.add(c.key)), (u.subs = u.subs.filter((c) => !(c.ended && dismissed.has(c.key))))); // finished subagents the page dismissed
99
100
  return {
100
101
  async read(): Promise<Net> {
101
102
  const next = new Map<string, Ref>(), at = Date.now(), net = await collectNet({ ...env, sessions, refs: next });
103
+ ended.clear();
104
+ net.bases.forEach((b) => [...b.tabs.flatMap((t) => t.units), ...b.outside].forEach(drop));
105
+ for (const key of dismissed) if (!next.has(key)) dismissed.delete(key); // gone from the net: nothing left to hide
102
106
  await withPending(net, (key) => next.get(key)?.file, env.hub?.relayed(live, next)); // what waiting units wait on, and the dialogs bridges relay
103
107
  for (const [key, ref] of refs) if (!next.has(key)) gone.set(key, { ref, at });
104
108
  for (const [key, old] of gone) if (next.has(key) || at - old.at > RECENT_MS) gone.delete(key);
@@ -111,5 +115,7 @@ export function netSource(env: { run: HerdrRun; world?: HerdrWorld; sessions():
111
115
  return old && { ...old, live: false, successor: old.pane ? [...refs.values()].find((r) => r.pane === old.pane)?.key : undefined };
112
116
  },
113
117
  workspace: (id: string): Ref[] => [...refs.values()].filter((r) => r.base === id),
118
+ /** Hides a finished subagent from every page until it leaves the net; false for anything else. */
119
+ dismiss: (key: string) => ended.has(key) && Boolean(dismissed.add(key)),
114
120
  };
115
121
  }
package/src/remote.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { execFile, execFileSync } from "node:child_process";
2
- import { randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
3
3
  import { readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
4
4
  import type { IncomingMessage } from "node:http";
5
5
  import { join } from "node:path";
@@ -78,22 +78,32 @@ export async function serveOff(run: Run, host: string, targets: (string | undefi
78
78
  return true;
79
79
  }
80
80
 
81
- /** Who may in: the local page as today, and while remote is on, paired devices of this machine's Tailscale user. */
82
- export function createAccess(token: string, ended: () => void = () => {}) {
83
- let remote: Identity | undefined;
84
- const codes = new Map<string, number>(), sessions = new Map<string, number>();
81
+ /** Who may in: the local page as today, and while remote is on, paired devices of this machine's Tailscale user. `file` keeps the paired
82
+ * devices (each cookie's SHA-256 and expiry, with the identity that paired them) across a restart in this process, so a /reload keeps them. */
83
+ export function createAccess(token: string, ended: () => void = () => {}, file?: string) {
84
+ let remote: Identity | undefined, kept: Identity | undefined;
85
+ const codes = new Map<string, number>(), sessions = new Map<string, number>(), hash = (c: string) => createHash("sha256").update(c).digest("hex");
86
+ try {
87
+ const saved = file && JSON.parse(readFileSync(file, "utf8"));
88
+ if (saved?.host && saved.login) [kept] = [{ host: String(saved.host), login: String(saved.login) }];
89
+ for (const [h, until] of Object.entries(saved?.sessions ?? {})) if (typeof until === "number" && until > Date.now()) sessions.set(h, until);
90
+ } catch {} // none saved
91
+ const save = () => file && (remote && sessions.size ? writeFileSync(file, JSON.stringify({ ...remote, sessions: Object.fromEntries(sessions) }), { mode: 0o600 }) : rmSync(file, { force: true }));
85
92
  const same = (a: string, b: string) => a.length === b.length && timingSafeEqual(Buffer.from(a), Buffer.from(b));
86
93
  return {
87
94
  get remote() { return remote; },
88
95
  enable(id: Identity) {
89
96
  // Another identity voids what the old one paired, and ends its streams.
90
- if (remote?.host !== id.host || remote.login !== id.login) (remote && ended(), codes.clear(), sessions.clear());
91
- remote = id;
97
+ const was = remote ?? kept;
98
+ if (was?.host !== id.host || was.login !== id.login) (remote && ended(), codes.clear(), sessions.clear());
99
+ [remote, kept] = [id, undefined];
100
+ save();
92
101
  },
93
- disable() {
102
+ /** `keep` (a /reload) leaves the paired devices saved for the server that starts next; otherwise they are forgotten. */
103
+ disable(keep = false) {
94
104
  remote = undefined;
95
105
  codes.clear();
96
- sessions.clear();
106
+ if (!keep) (sessions.clear(), save()); // with remote gone, save removes the file
97
107
  ended();
98
108
  },
99
109
  /** A one-time pairing code (128 bits, ten minutes); expired codes go first, and past sixteen waiting the oldest goes. */
@@ -121,11 +131,12 @@ export function createAccess(token: string, ended: () => void = () => {}) {
121
131
  codes.delete(path[1]!);
122
132
  if (until < now) return { status: 403 };
123
133
  const cookie = randomBytes(32).toString("hex");
124
- sessions.set(cookie, now + SESSION_MS);
134
+ sessions.set(hash(cookie), now + SESSION_MS);
135
+ save();
125
136
  return { cookie };
126
137
  }
127
138
  const cookie = /(?:^|;\s*)sb_remote=([0-9a-f]{64})(?:;|$)/.exec(h.cookie ?? "")?.[1]; // a document's own requests (/doc/) come without it from Chrome's sandboxed frame: docs.ts takes the capability instead
128
- return (cookie && (sessions.get(cookie) ?? 0) > now) || path[0] === "doc" ? { origin: `https://${remote.host}`, remote: true } : { status: 401 };
139
+ return (cookie && (sessions.get(hash(cookie)) ?? 0) > now) || path[0] === "doc" ? { origin: `https://${remote.host}`, remote: true } : { status: 401 };
129
140
  },
130
141
  };
131
142
  }
@@ -163,7 +174,7 @@ export const cookieFor = (token: string, value: string) => `sb_remote=${value};
163
174
  * the remote listener, also over an entry that still points at this server's local port), then a pairing QR. Off: the entry goes and every
164
175
  * remote session ends. `dir` holds remote.json, the entry's target while it is on.
165
176
  */
166
- export async function switchRemote(gui: { port: number; remotePort: number; token: string; access: Access }, on: boolean, dir: string, run: Run = tailscale): Promise<{ text: string; lines?: string[]; link?: () => string; changed: boolean }> {
177
+ export async function switchRemote(gui: { port: number; remotePort: number; token: string; access: Access }, on: boolean, dir: string, run: Run = tailscale, keep = false): Promise<{ text: string; lines?: string[]; link?: () => string; changed: boolean }> {
167
178
  // An entry from before the remote listener points at the local port; it is this server's own, so it is repointed or removed like a recorded one.
168
179
  const target = `http://127.0.0.1:${gui.remotePort}`, old = `http://127.0.0.1:${gui.port}`, file = join(dir, "remote.json");
169
180
  let stale: string | undefined;
@@ -174,7 +185,7 @@ export async function switchRemote(gui: { port: number; remotePort: number; toke
174
185
  if (!on) {
175
186
  // An entry a crashed session left (recorded in remote.json) is cleaned up too, while it still points where it was recorded.
176
187
  const was = gui.access.remote;
177
- gui.access.disable();
188
+ gui.access.disable(keep);
178
189
  const id = was ?? (stale ? await identity(run).catch(() => undefined) : undefined);
179
190
  if (!id) return { text: "Remote access is off", changed: false };
180
191
  const removed = await serveOff(run, id.host, [was && target, stale, old]);
package/src/session.ts CHANGED
@@ -85,7 +85,7 @@ export function registerSession(kit: Kit, { briefing, presence, membership, guar
85
85
  const record = readRecord(guiDir), back = record?.reload && record.pid === process.pid && event.reason !== "startup";
86
86
  const ready = () => Boolean(me()) && (!back || event.reason === "reload" || me() !== record!.ownerSession);
87
87
  if (back || (record && newer(version, record.version))) void (async () => {
88
- if ((await waitFor(cfg.sleep, ready, CONNECT_MS)) && (back || (await answers(record!)))) await host.share();
88
+ if ((await waitFor(cfg.sleep, ready, CONNECT_MS)) && (back || (await answers(record!)))) await host.restore(Boolean(back && record!.remote));
89
89
  })().catch(() => {});
90
90
  });
91
91
 
@@ -1 +0,0 @@
1
- import{C as e,F as t,_ as n}from"./index-DS51Ucw0.js";var r=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案正在送出;請查看終端機。`:`Another answer is on its way; check the terminal.`),i=((e={},n={})=>(n.locale??t())===`zh-TW`?`請在終端機中回答。`:`Answer it in the terminal.`),a=((e={},n={})=>(n.locale??t())===`zh-TW`?`請在終端機中回答。`:`Answer them in the terminal.`),o=((e={},n={})=>(n.locale??t())===`zh-TW`?`已回答。`:`Answered.`),s=((e={},n={})=>(n.locale??t())===`zh-TW`?`也可以自己輸入答案。`:`It also takes your own words.`),c=((e={},n={})=>(n.locale??t())===`zh-TW`?`可以複選。`:`It takes several choices.`),l=((e={},n={})=>(n.locale??t())===`zh-TW`?`再次確認`:`Check again`),u=((e={},n={})=>(n.locale??t())===`zh-TW`?`選擇`:`Choices`),d=((e={},n={})=>(n.locale??t())===`zh-TW`?`瀏覽器拒絕存取剪貼簿。`:`The browser refused the clipboard.`),f=((e={},n={})=>(n.locale??t())===`zh-TW`?`確認對話框只能在終端機,或在執行 GUI 的那台電腦的頁面上回答,已配對的裝置不能回答。這個頁面只能查看。`:`A confirmation can be answered only in the terminal or on the page of the computer the GUI runs on, not from a paired device. This page shows it read-only.`),p=((e={},n={})=>(n.locale??t())===`zh-TW`?`已複製到這台裝置的剪貼簿。`:`Copied to this device's clipboard.`),m=((e={},n={})=>(n.locale??t())===`zh-TW`?`複製指令`:`Copy command`);function h(e,t,n,r){if(typeof t!=`string`||n!==void 0&&!r)return new e(t,n);let i=h;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 g(e,t,n,r=!1){return h(Intl.PluralRules,e,n,r).select(Number(t)-Number(n?.offset??0))}var _=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個選項有預覽;請在終端機中查看。`:`It has a preview; see it in the terminal.`),v=((e={},n={})=>(n.locale??t())===`zh-TW`?`未確認。請查看終端機。`:`Not confirmed. Check the terminal.`),y=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註`:`Note`),b=((e={},n={})=>(n.locale??t())===`zh-TW`?`備註(選填)`:`Note (optional)`),x=e=>`Opened while ${e?.tool} was running; it may not be about that call.`,S=e=>`在 ${e?.tool} 執行時開啟,不一定與該呼叫有關。`,C=((e,n={})=>(n.locale??t())===`zh-TW`?S(e):x(e)),w=((e={},n={})=>(n.locale??t())===`zh-TW`?`選項`:`Options`),T=((e={},n={})=>(n.locale??t())===`zh-TW`?`另一個答案沒有被採用;這個可以送出。`:`The other answer was not taken; this one can go.`),E=((e={},n={})=>(n.locale??t())===`zh-TW`?`你的答案`:`Your own answer`),D=((e={},n={})=>(n.locale??t())===`zh-TW`?`或自己輸入答案`:`Or type your own answer`),O=((e={},n={})=>(n.locale??t())===`zh-TW`?`問題已變更,請重新閱讀。`:`The question changed; read it again.`),k=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 讀不懂這個答案。`:`The session could not read that answer.`),A=((e={},n={})=>(n.locale??t())===`zh-TW`?`這個答案不符合問題。`:`That answer does not fit the question.`),j=((e={},n={})=>(n.locale??t())===`zh-TW`?`session 拒絕了這個答案。`:`The session refused that answer.`),M=((e={},n={})=>(n.locale??t())===`zh-TW`?`安全考量,遠端不支援輸入機密。請到執行 GUI 的那台電腦的終端機中回答。`:`For security, entering a secret is not supported remotely. Answer it in the terminal on the computer the GUI runs on.`),N=((e={},n={})=>(n.locale??t())===`zh-TW`?`機密內容只能在終端機輸入,這裡不接受。請到執行 GUI 的那台電腦的終端機中回答。`:`A secret is entered in the terminal only, not here. Answer it in the terminal on the computer the GUI runs on.`),P=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出答案`:`Send answer`),F=((e={},n={})=>(n.locale??t())===`zh-TW`?`送出中…`:`Sending…`),ee=((e={},n={})=>(n.locale??t())===`zh-TW`?`顯示終端機`:`Show terminal`),I=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中關閉。`:`It was dismissed in the terminal.`),L=((e={},n={})=>(n.locale??t())===`zh-TW`?`它已不再開啟。`:`It is no longer open.`),R=((e={},n={})=>(n.locale??t())===`zh-TW`?`已在終端機中回答。`:`It was already answered in the terminal.`),z=((e={},n={})=>(n.locale??t())===`zh-TW`?`連不上伺服器。`:`The server could not be reached.`),B=((e={},n={})=>(n.locale??t())===`zh-TW`?`它在等待對話框。`:`It waits on a dialog.`),V={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1};function H(e,t,n,r,i){let{q:a}=n,o=r[a],s=V[e]??0,c=e===`ArrowUp`,l=c||e===`ArrowDown`,u=()=>({to:r.map((e,t)=>({q:(a+1+t)%r.length,part:`opt`})).find(e=>e.q!==a&&!i[e.q])??`send`});if(e===`Tab`)return t?n.part===`opt`&&a>0?{to:{q:a-1,part:`opt`}}:void 0:a<r.length-1?{to:{q:a+1,part:`opt`}}:void 0;if(!t){if(n.part===`opt`){let t=n.o+s;if(s)return t>=0&&t<o.options?{to:{q:a,part:`opt`,o:t},...o.multiple?{}:{pick:t}}:{to:s>0&&o.own?{q:a,part:`own`}:n};if(e===`Enter`||e===` `&&!o.multiple)return{...u(),...o.multiple?{}:{pick:n.o}}}else if(n.part===`own`){if(e===`Enter`)return u();if(l)return{to:c?{q:a,part:`opt`,o:o.options-1}:{q:a,part:`note`}}}else if(c)return{to:{q:a,part:`own`}}}}function U(e,t,n){let r=e=>Math.max(0,e.opts.findIndex(e=>e.getAttribute(`aria-checked`)===`true`)),i=(e,t)=>e.opts.forEach((e,n)=>e.setAttribute(`tabindex`,n===t?`0`:`-1`)),a=e=>{for(let[n,r]of t.entries()){let t=r.opts.indexOf(e);if(t>=0)return{q:n,part:`opt`,o:t};if(e===r.own||e===r.note)return{q:n,part:e===r.own?`own`:`note`}}};t.forEach(e=>i(e,r(e)));let o=e=>{let n=a(e.target);n?.part===`opt`&&i(t[n.q],n.o)};e.addEventListener(`focusin`,o),e.addEventListener(`click`,o);let s=!1;return e.addEventListener(`keydown`,e=>{let i=a(e.target);if(!i||e.ctrlKey||e.altKey||e.metaKey||e.isComposing)return;let o=e.target;if(i.part!==`opt`&&(e.key===`ArrowUp`?o.selectionStart!==0:e.key===`ArrowDown`&&o.selectionEnd!==o.value.length))return;let c=H(e.key,e.shiftKey,i,t.map(e=>({options:e.opts.length,multiple:e.multiple,own:!!e.own})),t.map(e=>e.answered()));if(!c||(e.preventDefault(),e.repeat&&[`Enter`,` `].includes(e.key)))return;if(s=e.key===` `,c.pick!==void 0){let e=t[i.q].opts[c.pick];e.getAttribute(`aria-checked`)!==`true`&&e.click()}let l=c.to===`send`?void 0:t[c.to.q],u=c.to===`send`?n():c.to.part===`opt`?l.opts[c.to.o??r(l)]:c.to.part===`own`?l.own:l.note;u&&!u.disabled&&u.focus()}),e.addEventListener(`keyup`,e=>s&&e.key===` `&&(s=!1,e.preventDefault())),()=>t[0]?.opts[r(t[0])]}var W=e=>e.multiple?c():e.freeform&&e.options.length?s():``,G=(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":w()},...e.options.map(e=>n(`li`,{class:`ask-opt`},n(`b`,null,e.title),e.description&&n(`small`,null,e.description)))),t&&W(e)&&n(`small`,{class:`ask-how`},W(e))),K=e=>e.replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f\p{Cf}]/gu,`�`),q=(e,t)=>(e.select?.choices??[]).map((e,t)=>({...e,i:t})).filter(e=>!(t&&e.localOnly)),J=(e,t,n)=>({...e.size?{choices:[...e].sort((e,t)=>e-t)}:{},...t.trim()?{text:t}:{},...n.trim()?{note:n}:{}}),Y=(e,t)=>!!(t&&e?.select?.confirm),X=(e,t,n)=>({dialog:e.dialog,digest:e.digest,answerId:n,...t}),Z={digest:O,"not-allowed":A,malformed:k};function Q(t){let{outcome:n,reason:i,by:a}=t.body;return n===`accepted`?[`ok`,o()]:n===`stale`?[`error`,a===`local`?R():a===`cancel`?I():L()]:n===`rejected`?[`error`,(Object.hasOwn(Z,String(i))?Z[String(i)]:j)()]:n===`busy`?[`error`,r()]:n===`unknown`||t.status===504?[`error`,v(),!0]:[`error`,i??e({status:t.status})]}var te=e=>[`accepted`,`stale`,`busy`,`unknown`].includes(String(e.body.outcome))||e.status===504,$=e=>e.answer?`d\n${e.answer.dialog}\n${e.answer.digest}`:`c\n${e.callId}\n${e.why??``}`;function ne(e,t,r=location.hostname!==`127.0.0.1`,o){let s,c,h,g=!1,x=!1,S;for(let e of[`focusin`,`pointerdown`])document.addEventListener(e,e=>c&&!c.el.contains(e.target)&&(c.lost=void 0));let O=(e,t,n,...r)=>(e.dataset.tone=t,e.replaceChildren(n,...r)),k=()=>{if(!c)return;let e=document.activeElement;e&&e!==document.body&&e!==c.lost&&(c.lost=void 0),c.controls.forEach(e=>e.disabled=!g||x||c.done),c.send&&(c.send.disabled=!g||x||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 A(e,r){[e.sending,x,e.spell]=[!0,!0,!1],k(),O(e.note,``,F());let i=await t(`answer`,r).catch(()=>void 0),a=n(`button`,{type:`button`,class:`cmp-link`},l());a.onclick=()=>void A(e,r);let[o,s,c]=i?Q(i):[`error`,v(),!0];[e.done,e.sending,x,e.busy]=[!i||te(i),!1,!1,i?.body.outcome===`busy`],O(e.note,o,s,...c?[a]:[]),k(),e.note.scrollIntoView?.({block:`nearest`})}let j=(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 I(e,t){let i,a=q(t,r).map(e=>j(`radio`,K(e.label),[e.note&&K(e.note)],()=>(i=e.i,a.forEach((n,i)=>n.setAttribute(`aria-checked`,String(q(t,r)[i].i===e.i))),k()),e.i+1)),o=t.select?.copy!==void 0&&n(`button`,{type:`button`,class:`cmp-link`},m());return o&&(o.disabled=!navigator.clipboard,o.onclick=()=>void navigator.clipboard.writeText(t.select.copy).then(()=>O(e.note,`ok`,p()),()=>O(e.note,`error`,d()))),e.pick=()=>i===void 0?void 0:{choice:i},e.first=U(e.el,[{opts:a,multiple:!1,answered:()=>i!==void 0}],()=>e.send),e.controls=a,[n(`pre`,{class:`ask-title`},K(t.select.title)),n(`div`,{class:`ask-opts`,role:`radiogroup`,"aria-label":u()},...a),n(`div`,{class:`ask-acts`},e.send,o)]}function L(e,t){let r=t.questions.map(()=>({picks:new Set,text:n(`textarea`,{rows:`1`,maxlength:`8192`,class:`ask-own`,placeholder:D(),"aria-label":E()}),note:n(`input`,{type:`text`,maxlength:`2048`,class:`ask-own ask-memo`,placeholder:b(),"aria-label":y()})})),i=[],a=t.questions.map((t,a)=>{let o=r[a],s=t.multiple?`checkbox`:`radio`,c=t.options.map((e,n)=>j(s,e.title,[e.description,e.preview&&_()],()=>{t.multiple||(o.picks.clear(),o.text.value=``),o.picks.has(n)?o.picks.delete(n):o.picks.add(n),c.forEach((e,t)=>e.setAttribute(`aria-checked`,String(o.picks.has(t)))),k()}));return o.text.oninput=()=>(t.multiple||(o.picks.clear(),c.forEach(e=>e.setAttribute(`aria-checked`,`false`))),k()),e.controls.push(...c,o.text,o.note),i.push({opts:c,multiple:!!t.multiple,own:o.text,note:o.note,answered:()=>o.picks.size>0||o.text.value.trim()!==``}),n(`div`,{class:`ask-one`},t.header&&n(`b`,{class:`ask-head`},t.header),n(`p`,{class:`ask-q`},t.question),n(`div`,{class:`ask-opts`,role:t.multiple?`group`:`radiogroup`,"aria-label":w()},...c),o.text,o.note)});return e.pick=()=>r.every(e=>e.picks.size||e.text.value.trim())?{answers:r.map(e=>J(e.picks,e.text.value,e.note.value))}:void 0,e.first=U(e.el,i,()=>e.send),[...a,n(`div`,{class:`ask-acts`},e.send)]}function R(e){let t=e.asks??(e.ask?[e.ask]:[]),s=t.length>1,c=Y(e.answer,r)?void 0:e.answer,l={key:$(e),el:n(`section`,{class:`ask`}),note:n(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),controls:[],pick:()=>void 0,done:!1,sending:!1};c&&((l.send=n(`button`,{type:`button`,class:`ask-send`},P())).onclick=()=>void(l.pick()&&A(l,X(c,l.pick(),crypto.randomUUID()))));let u=e.tool===`secret_drop`,d=n(`p`,{class:`ask-term`},e.why&&t.length?e.why:`${s?a():i()} ${s||!t[0]?``:W(t[0])}`.trim()),p=o&&e.tool!==`secret_drop`&&n(`button`,{type:`button`,class:`cmp-link`},ee());p&&(p.onclick=o);let m=e.answer?.twin&&e.tool&&e.tool!==`dialog`?[n(`p`,{class:`ask-why`},C({tool:e.tool}))]:[];return l.el.append(...m,...c&&!u?c.select?I(l,c):L(l,c):[...t.length?t.map(e=>G(e,s)):e.answer?.select?[n(`pre`,{class:`ask-title`},K(e.answer.select.title)),n(`p`,{class:`ask-why`},f())]:[n(`p`,{class:`ask-why`},u?r?M():N():e.why??B())],n(`div`,{class:`ask-acts`},u?n(`p`,{class:`ask-term`},i()):d,p)],l.note),l}let z=(t,n)=>{let r=document.activeElement;c&&c!==n&&(c.focus=c.el.contains(r)?r:void 0),[s,c,h]=[t,n,n?.send?n:h],e.replaceChildren(...n?[n.el]:[]),k(),n?.focus&&(!document.activeElement||document.activeElement===document.body)&&n.focus.focus()};return{enter(){let e=c&&!c.done?c.first?.():void 0;return!!(e&&!e.disabled&&(e.focus(),1))},update(e,t){g=t,e&&(S=void clearTimeout(S)),!e&&(c?.done||c?.sending)?S??=setTimeout(()=>(S=void 0,z()),6e3):e?c&&($(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],O(c.note,``,T())),s=e):z(e,h?.key===$(e)&&!h.done?h:R(e)):z(),k()}}}export{g as a,F as i,Y as n,z as r,ne as t};
@@ -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=ue(window.location.href));let t=c(e,typeof window<`u`?window.location?.href:void 0);if(t)return o||(o=!0,d(t,{reload:!1})),t;throw Error(`No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found`)};function c(e,t){let n;for(let t of e){if(t===`baseLocale`)n=`en`;else if(de(t)&&_.has(t)){let e=_.get(t);if(e){let t=e.getLocale();if(t instanceof Promise)continue;if(t!==void 0)return m(t)}}let e=p(n);if(e)return e}}var l=e=>{s=e},u=e=>{e?window.location.href=e:window.location.reload()},d=(e,t)=>{let n={reload:!0,...t},i;try{i=s()}catch{}let o=[],c=r;!a&&typeof window<`u`&&window.location?.href&&(c=ue(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(de(t)&&_.has(t)){let n=_.get(t);if(n){let r=n.setLocale(e);r instanceof Promise&&(r=r.catch(e=>{throw Error(`Custom strategy "${t}" setLocale failed.`,{cause:e})}),o.push(r))}}let l=()=>{!a&&n.reload&&window.location&&e!==i&&u(void 0)};if(o.length)return Promise.all(o).then(()=>{l()});l()},f=()=>typeof window<`u`?window.location.origin:`http://fallback.com`;function p(e){if(typeof e!=`string`)return;let n=e.toLowerCase();for(let e of t)if(e.toLowerCase()===n)return e}function m(e){let n=p(e);if(n)return n;throw Error(`Invalid locale: ${e}. Expected one of: ${t.join(`, `)}`)}function h(e){return e}function g(t,n){return new e(t,n.href)}function ee(){return 0}function te(e){return i}function ne(e,t){return e.exec(t.href)}var re=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${re}=([^;]*)`);function ie(e){return ae(e)}function ae(e){let t=h(typeof e==`string`?new URL(e,f()):new URL(e.href)),n=t.pathname.replace(/^\/+/,``).split(`/`);return n.length>0&&p(n[0])&&(t.pathname=`/`+n.slice(1).join(`/`)),h(t)}var oe=-1,se,ce;function le(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=ee();if(se===t&&oe===n)return ce;let r=h(new URL(t,`http://example.com`)),a=ie(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of te(e))if(ne(g(t.match,e),e)){s=t;break}if(s)break}return oe=n,se=t,ce=s,s}function ue(e){let t=le(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var _=new Map;function de(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}var fe=((e={},t={})=>(t.locale??s())===`zh-TW`?`警示`:`Alerts`),pe=((e={},t={})=>(t.locale??s())===`zh-TW`?`所有基地`:`all bases`),me=((e={},t={})=>(t.locale??s())===`zh-TW`?``:`.`),he=((e={},t={})=>(t.locale??s())===`zh-TW`?`最後更新:`:`Last update`),ge=e=>`Disconnected. Gave up after ${e?.tries} tries; it reconnects when you return to this tab.`,_e=e=>`連線中斷。重試 ${e?.tries} 次後放棄;回到此分頁時會重新連線。`,ve=((e,t={})=>(t.locale??s())===`zh-TW`?_e(e):ge(e)),ye=e=>`The server is up but cannot read the net: ${e?.problem}`,be=e=>`伺服器正常,但讀不到網:${e?.problem}`,xe=((e,t={})=>(t.locale??s())===`zh-TW`?be(e):ye(e)),Se=((e={},t={})=>(t.locale??s())===`zh-TW`?`與稻草網的連線中斷,正在重新連線…畫面顯示的是最後已知狀態。`:`Disconnected from the straw net. Reconnecting… The view shows the last known state.`),Ce=e=>`Disconnected from the straw net. Reconnecting (try ${e?.attempt})… The view shows the last known state.`,we=e=>`與稻草網的連線中斷,正在重新連線(第 ${e?.attempt} 次)…畫面顯示的是最後已知狀態。`,Te=((e,t={})=>(t.locale??s())===`zh-TW`?we(e):Ce(e)),Ee=((e={},t={})=>(t.locale??s())===`zh-TW`?`Straw Net:所有基地`:`Straw Net: all bases`),De=((e={},t={})=>(t.locale??s())===`zh-TW`?`取消`:`Cancel`),Oe=((e={},t={})=>(t.locale??s())===`zh-TW`?`關閉`:`Close`),ke=e=>`Quit base ${e?.name}`,Ae=e=>`關掉基地 ${e?.name}`,je=((e,t={})=>(t.locale??s())===`zh-TW`?Ae(e):ke(e)),Me=e=>`Quit base ${e?.name}? Every agent in it and its tower quit.`,Ne=e=>`要關掉基地 ${e?.name} 嗎?裡面所有 agent 和塔台都會退出。`,Pe=((e,t={})=>(t.locale??s())===`zh-TW`?Ne(e):Me(e)),Fe=e=>`Quit squad ${e?.name}`,Ie=e=>`關掉小隊 ${e?.name}`,Le=((e,t={})=>(t.locale??s())===`zh-TW`?Ie(e):Fe(e)),Re=e=>`Quit squad ${e?.name}? Every agent in it quits.`,ze=e=>`要關掉小隊 ${e?.name} 嗎?裡面所有 agent 都會退出。`,Be=((e,t={})=>(t.locale??s())===`zh-TW`?ze(e):Re(e)),Ve=e=>`Quit the tower ${e?.name}? The base's mains become members again.`,He=e=>`要關掉塔台 ${e?.name} 嗎?這個基地的主智慧體都會降格成成員。`,Ue=((e,t={})=>(t.locale??s())===`zh-TW`?He(e):Ve(e)),We=e=>`Quit ${e?.name}`,Ge=e=>`關掉 ${e?.name}`,Ke=((e,t={})=>(t.locale??s())===`zh-TW`?Ge(e):We(e)),qe=e=>`Quit ${e?.name}? It quits pi and its pane closes.`,Je=e=>`要關掉 ${e?.name} 嗎?它會退出 pi,窗格也會關掉。`,Ye=((e,t={})=>(t.locale??s())===`zh-TW`?Je(e):qe(e)),Xe=e=>`control tower · ${e?.state}`,Ze=e=>`塔台 · ${e?.state}`,Qe=((e,t={})=>(t.locale??s())===`zh-TW`?Ze(e):Xe(e)),$e=((e={},t={})=>(t.locale??s())===`zh-TW`?`圖示來自 game-icons.net(Lorc、Delapouite),CC BY 3.0。`:`Icons from game-icons.net by Lorc and Delapouite, CC BY 3.0.`),et=((e={},t={})=>(t.locale??s())===`zh-TW`?`文件`:`Documents`),tt=((e={},t={})=>(t.locale??s())===`zh-TW`?`總塔台`:`head tower`),nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`語言`:`Language`),rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`連線中`:`connecting`),it=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時`:`live`),at=((e={},t={})=>(t.locale??s())===`zh-TW`?`離線`:`offline`),ot=((e={},t={})=>(t.locale??s())===`zh-TW`?`重新連線中`:`reconnecting`),st=((e={},t={})=>(t.locale??s())===`zh-TW`?`正體中文`:`English`),ct=((e={},t={})=>(t.locale??s())===`zh-TW`?`位置`:`Location`),lt=e=>`${e?.name} finished`,ut=e=>`${e?.name} 已完成`,dt=((e,t={})=>(t.locale??s())===`zh-TW`?ut(e):lt(e)),ft=e=>`${e?.name} hit an error`,pt=e=>`${e?.name} 發生錯誤`,mt=((e,t={})=>(t.locale??s())===`zh-TW`?pt(e):ft(e)),ht=e=>`${e?.name} went idle`,gt=e=>`${e?.name} 轉為閒置`,_t=((e,t={})=>(t.locale??s())===`zh-TW`?gt(e):ht(e)),vt=e=>`${e?.name} joined`,yt=e=>`${e?.name} 加入`,bt=((e,t={})=>(t.locale??s())===`zh-TW`?yt(e):vt(e)),xt=e=>`${e?.name} left`,St=e=>`${e?.name} 離開`,Ct=((e,t={})=>(t.locale??s())===`zh-TW`?St(e):xt(e)),wt=e=>`${e?.name} lost its status`,Tt=e=>`${e?.name} 失去狀態`,Et=((e,t={})=>(t.locale??s())===`zh-TW`?Tt(e):wt(e)),Dt=e=>`${e?.name} is waiting on a question`,Ot=e=>`${e?.name} 正在等待回答`,kt=((e,t={})=>(t.locale??s())===`zh-TW`?Ot(e):Dt(e)),At=e=>`${e?.name} started working`,jt=e=>`${e?.name} 開始工作`,Mt=((e,t={})=>(t.locale??s())===`zh-TW`?jt(e):At(e)),Nt=((e={},t={})=>(t.locale??s())===`zh-TW`?`已完成`:`finished`),Pt=((e={},t={})=>(t.locale??s())===`zh-TW`?`錯誤`:`error`),Ft=((e={},t={})=>(t.locale??s())===`zh-TW`?`閒置`:`idle`),It=((e={},t={})=>(t.locale??s())===`zh-TW`?`無狀態`:`no status`),Lt=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待回答`:`waiting on a question`),Rt=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`working`),zt=e=>`Monitor failed: ${e?.what}`,Bt=e=>`Monitor 出錯:${e?.what}`,Vt=((e,t={})=>(t.locale??s())===`zh-TW`?Bt(e):zt(e)),Ht=e=>`Monitor went quiet and stopped: ${e?.what}`,Ut=e=>`Monitor 太久沒輸出,已停止:${e?.what}`,Wt=((e,t={})=>(t.locale??s())===`zh-TW`?Ut(e):Ht(e)),Gt=((e={},t={})=>(t.locale??s(),`Logs`)),Kt=((e={},t={})=>(t.locale??s())===`zh-TW`?`從未`:`never`),qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`+新基地`:`+ New base`),Jt=((e={},t={})=>(t.locale??s())===`zh-TW`?`沒有執行中的智慧體`:`no agent running`),Yt=((e={},t={})=>(t.locale??s())===`zh-TW`?`無警示`:`no alerts`),Xt=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器沒有回應。`:`The server did not answer.`),Zt=((e={},t={})=>(t.locale??s())===`zh-TW`?`尚無塔台`:`no tower yet`),Qt=((e={},t={})=>(t.locale??s())===`zh-TW`?`監看中`:`Watching a monitor`),$t=((e={},t={})=>(t.locale??s())===`zh-TW`?`思考中`:`thinking`),en=e=>`Finished ${e?.note}`,tn=e=>`完成了 ${e?.note}`,nn=((e,t={})=>(t.locale??s())===`zh-TW`?tn(e):en(e)),rn=e=>`Failed ${e?.note}`,an=e=>`出錯了 ${e?.note}`,on=((e,t={})=>(t.locale??s())===`zh-TW`?an(e):rn(e)),sn=e=>`Waiting on you ${e?.note}`,cn=e=>`等你回答 ${e?.note}`,ln=((e,t={})=>(t.locale??s())===`zh-TW`?cn(e):sn(e)),un=((e={},t={})=>(t.locale??s())===`zh-TW`?`+主智慧體`:`+ Main`),dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`+成員`:`+ Member`),fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`Outposts`),pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`手機`:`Phone`),mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`透過 Tailscale 配對手機`:`Pair a phone over Tailscale`),hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器送來的快照,頁面無法讀取`:`the server sent a snapshot the page cannot read`),gn=((e={},t={})=>(t.locale??s())===`zh-TW`?`伺服器回報了頁面無法讀取的問題`:`the server reported a problem the page cannot read`),v=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉`:`Quit`),_n=((e={},t={})=>(t.locale??s())===`zh-TW`?`關掉塔台`:`Quit tower`),vn=e=>`Refused (${e?.status}).`,yn=e=>`已拒絕(${e?.status})。`,bn=((e,t={})=>(t.locale??s())===`zh-TW`?yn(e):vn(e)),xn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒`:`Remind`),Sn=((e={},t={})=>(t.locale??s())===`zh-TW`?`點一下允許瀏覽器通知`:`Press to allow browser notifications`),Cn=((e={},t={})=>(t.locale??s())===`zh-TW`?`瀏覽器已封鎖通知,要到網站設定裡允許`:`The browser blocks notifications; allow them in the site settings`),wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已關`:`Reminders off`),Tn=((e={},t={})=>(t.locale??s())===`zh-TW`?`提醒已開:分頁不在前景時,單位等你回答、完成或出錯會跳系統通知`:`Reminders on: while the page is in the background, a unit waiting on you, finishing, or failing raises a system notification`),En=((e={},t={})=>(t.locale??s())===`zh-TW`?`這個瀏覽器不支援通知`:`This browser has no notifications`),Dn=((e={},t={})=>(t.locale??s())===`zh-TW`?`主智慧體`:`main`),On=((e={},t={})=>(t.locale??s())===`zh-TW`?`成員`:`member`),kn=((e={},t={})=>(t.locale??s())===`zh-TW`?`前哨`:`outpost`),An=((e={},t={})=>(t.locale??s())===`zh-TW`?`未編入`:`unaligned`),jn=((e={},t={})=>(t.locale??s(),`session`)),Mn=((e={},t={})=>(t.locale??s())===`zh-TW`?`子智慧體`:`subagent`),Nn=((e={},t={})=>(t.locale??s())===`zh-TW`?`塔台`:`tower`),Pn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效`:`Sound`),Fn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已關`:`Sounds off`),In=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效已開`:`Sounds on`),Ln=((e={},t={})=>(t.locale??s())===`zh-TW`?`音效:開關、音量與試聽`:`Sounds: on or off, volume, and a try`),Rn=((e={},t={})=>(t.locale??s())===`zh-TW`?`▶ 試聽`:`▶ Try`),zn=((e={},t={})=>(t.locale??s())===`zh-TW`?`音量`:`Volume`),Bn=((e={},t={})=>(t.locale??s())===`zh-TW`?`智慧體`:`Agents`),Vn=((e={},t={})=>(t.locale??s())===`zh-TW`?`基地`:`Bases`),Hn=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待中`:`Waiting`),Un=((e={},t={})=>(t.locale??s())===`zh-TW`?`工作中`:`Working`),Wn=((e={},t={})=>(t.locale??s())===`zh-TW`?`狀態`:`States`),Gn=e=>`tab ${e?.label}`,Kn=e=>`分頁 ${e?.label}`,qn=((e,t={})=>(t.locale??s())===`zh-TW`?Kn(e):Gn(e)),Jn=((e={},t={})=>(t.locale??s())===`zh-TW`?`即時網況 · 通訊`:`live net · comms`),Yn=((e={},t={})=>(t.locale??s())===`zh-TW`?`網的總計`:`Net totals`),Xn=e=>`${e?.label} tower`,Zn=e=>`${e?.label} 塔台`,Qn=((e,t={})=>(t.locale??s())===`zh-TW`?Zn(e):Xn(e)),$n=e=>`using ${e?.tool}`,er=e=>`使用 ${e?.tool}`,tr=((e,t={})=>(t.locale??s())===`zh-TW`?er(e):$n(e)),nr=((e={},t={})=>(t.locale??s())===`zh-TW`?`等待變化…`:`Waiting for changes…`),rr=`sb-locale`;function ir(e){let t=/^zh\b/i.test(e)&&(/-(hant|tw|hk|mo)\b/i.test(e)?`zh-TW`:/-(hans|cn|sg|my)\b/i.test(e)?`zh-CN`:void 0);return p(e)??(t?p(t):void 0)??p(e.split(`-`)[0])}function ar(e,t){return p(e)??t.map(ir).find(Boolean)??`en`}var or={brand_label:Ee,tagline:Jn,totals_label:Yn,stat_bases:Vn,stat_agents:Bn,stat_working:Un,stat_waiting:Hn,alerts:fe,no_alerts:Yt,pair_button:pn,pair_title:mn,link_connecting:rt,location:ct,all_bases:pe,documents:et,net_log:Gt,states:Wn,mark_working:Rt,mark_waiting:Lt,mark_idle:Ft,mark_done:Nt,mark_error:Pt,credit:$e,language:nt,waiting_changes:nr,new_base:qt};Object.keys(or);function sr(){let e=null;try{e=localStorage.getItem(rr)}catch{}let n=ar(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,or[e.dataset[t]]?.()??e.dataset[t]);let i=document.getElementById(`lang`);i.replaceChildren(...t.map(e=>new Option(st({},{locale:e}),e,!1,e===n))),i.onchange=()=>{try{localStorage.setItem(rr,i.value),location.reload()}catch{i.value=n}}}var cr={working:Mt,waiting:kt,idle:_t,done:dt,error:mt,unknown:Et};function lr(e){let t=new Map;for(let n of e.bases){n.tower&&t.set(`tower:${n.id}`,{name:Qn({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 ur(e,t){if(!e)return[];let[n,r]=[lr(e),lr(t)],i=[];for(let[e,t]of r){let r=n.get(e);r?r.mark!==t.mark&&i.push({text:cr[t.mark]({name:t.name}),mark:t.mark}):i.push({text:bt({name:t.name}),mark:t.mark})}for(let[e,t]of n)r.has(e)||i.push({text:Ct({name:t.name}),mark:`idle`});return i}var dr=e=>e.unit??e.key,fr=e=>e===`waiting`||e===`error`?0:1;function pr(e,t){let n=new Map;for(let r of e.bases)for(let e of[...r.tower?[{...r.tower,role:`tower`}]:[],...[...r.tabs.flatMap(e=>e.units),...r.outside].flatMap(e=>[e,...e.subs])]){n.set(e.key,{key:e.key,ws:r.id,name:e.name,role:e.role,mark:e.mark,note:e.note,at:t,pending:e.pending,closed:!e.control||!!e.ended});for(let i of e.monitors??[])(i.status===`error`||i.status===`stale`)&&(a=>n.set(a,{key:a,unit:e.key,ws:r.id,name:e.name,role:e.role,mark:`error`,note:`monitor:${i.status}:${i.what}`,at:t}))(`${e.key}\u001fmonitor:${i.id}:${i.at}`)}return n}function mr(e,t){return[...t.values()].filter(t=>e?.get(t.key)?.mark!==t.mark&&(fr(t.mark)===0||e!==void 0&&t.mark===`done`))}var hr=`input, textarea, select, [role=textbox], [role=combobox], [role=listbox], .term-scroll`,gr=`button, a, summary, [role=button], [role=link]`,_r=`.ask-opt, [role=radio], [role=checkbox]`,vr=`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`;function yr(e,t,n=!1){if(t||e.defaultPrevented||e.isComposing||e.ctrlKey||e.altKey||e.metaKey)return;let r=e.target;if(!(r?.isContentEditable||r?.closest?.(hr))){if(e.key===`f`||e.key===`F`)return`zoom`;if(e.key===` `&&!r?.closest?.(_r)&&(n||!r?.closest?.(gr)))return`next`}}function br(e,t=()=>document.querySelector(vr)!==null,n=window){let r,i=!1,a=null;n.addEventListener(`pointerdown`,()=>i=!0,!0),n.addEventListener(`focusin`,e=>a=i?e.target:null,!0),n.addEventListener(`keydown`,n=>{let o=n.target===a;i=!1;let s=yr(n,t(),o);if(s){if(n.repeat)return r===s?n.preventDefault():void 0;e(s)&&(r=s,n.preventDefault())}}),n.addEventListener(`keyup`,e=>{r===`next`&&e.key===` `&&e.preventDefault(),r=void 0})}var xr=3e4,Sr=[`pointermove`,`pointerdown`,`keydown`,`wheel`,`touchstart`];function Cr(e=document.documentElement){if(matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=Date.now(),n,r=()=>{let i=t+xr-Date.now();i>0?n=setTimeout(r,i):(n=void 0,e.toggleAttribute(`data-calm`,!0))},i=()=>{t=Date.now(),n===void 0&&(e.toggleAttribute(`data-calm`,!1),n=setTimeout(r,xr))};for(let e of Sr)addEventListener(e,i,{capture:!0,passive:!0});document.addEventListener(`visibilitychange`,()=>document.hidden||i()),i()}var wr=(...e)=>e.filter(e=>e!==!1&&e!=null),Tr=(e,t)=>(e.classList.add(t),e.classList.toggle(`flip`));function Er(e,t,...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t??{}))r.setAttribute(e,n);return r.append(...wr(...n)),r}function Dr({x1:e,y1:t,x2:n,y2:r,mid:i},a=64){let o=Array.from({length:201},(a,o)=>{let s=o/200,c=1-s;return[c**3*e+3*c*c*s*i+3*c*s*s*i+s**3*n,c**3*t+3*c*c*s*t+3*c*s*s*r+s**3*r]}),s=o.reduce((e,t,n)=>(e.push(n?e[n-1]+Math.hypot(t[0]-o[n-1][0],t[1]-o[n-1][1]):0),e),[]);return Array.from({length:a+1},(e,t)=>{let n=t/a*s.at(-1),r=Math.max(1,s.findIndex(e=>e>=n)),[i,c]=[o[r-1],o[r]],l=s[r]>s[r-1]?(n-s[r-1])/(s[r]-s[r-1]):0;return[i[0]+(c[0]-i[0])*l,i[1]+(c[1]-i[1])*l]})}function Or(e,t){if(t||!e.length)return[];let n=document.createElement(`style`);return n.textContent=e.map((e,t)=>`@keyframes pk${t}{${Dr(e).map(([e,t],n,r)=>`${(n/(r.length-1)*100).toFixed(2)}%{transform:translate(${e.toFixed(1)}px,${t.toFixed(1)}px)}`).join(``)}}`).join(``),[n,...e.map((e,t)=>(e=>(e.className=`packet`,e.style.animationName=`pk${t}`,e))(document.createElement(`i`)))]}var kr=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Ar=function(e,t){return new URL(e,t).href},jr={},Mr=function(e){return e.pathname.endsWith(`.css`)},Nr=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},y=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=Ar(t,n);let r=s(t),i=Mr(r);return Nr(jr,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`:kr,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function b(e,t,n,r,i=!1){Object.assign(e.dataset,t),[e.hidden,e.textContent]=[i,n],r&&e.setAttribute(`aria-label`,r)}var Pr=(e,t)=>b(e,{key:t.key??``,name:t.name,role:t.role},v(),Ke({name:t.name}),!(t.control&&t.key)||t.role===`subagent`),Fr=(e,t)=>b(e,{key:t?.key??``,name:t?.name??``,role:`tower`},_n(),void 0,!t?.control),Ir=(e,t)=>b(e,{ws:t.id,name:t.label},v(),je({name:t.label})),Lr=(e,t,n)=>b(e,{ws:t.id,name:n.label,tab:n.id},v(),Le({name:n.label})),x=(e,t)=>new Promise(n=>{let r=document.createElement(`dialog`),i=document.createElement(`p`),a=document.createElement(`div`),o=(e,t,i)=>Object.assign(document.createElement(`button`),{type:`button`,className:t,textContent:e,onclick:()=>(r.close(),n(i))});[r.className,i.textContent,a.className]=[`sheet`,e,`sheet-row`],a.append(...t?[o(De(),`later`,!1),o(t,`sheet-yes`,!0)]:[o(Oe(),`later`,!1)]),r.append(i,a),r.addEventListener(`close`,()=>(r.remove(),n(!1))),document.body.append(r),r.showModal()});function Rr(e,{route:t,net:n,go:r}){let i=t();if(i.view===`map`)return;if(e.close===`base`)return void(i.ws===e.ws&&r({view:`map`}));let a=e=>e.flatMap(e=>[e.key,...a(e.subs)]),o=e.close===`tab`&&i.ws===e.ws?n()?.bases.find(t=>t.id===e.ws)?.tabs.find(t=>t.id===e.tab):void 0;i.view===`session`&&(e.close===`unit`?i.key===e.key:o&&a(o.units).includes(i.key))&&r({view:`workspace`,ws:i.ws})}function zr(e){document.addEventListener(`click`,t=>{let n=t.target?.closest?.(`button[data-close]`),r=n?.dataset;n&&r&&(t.preventDefault(),x((r.close===`base`?Pe:r.close===`tab`?Be:r.role===`tower`?Ue:Ye)({name:r.name??``}),v()).then(t=>{t&&(n.toggleAttribute(`disabled`,!0),y(async()=>{let{post:e}=await import(`./post-UHMNmNgA.js`).then(e=>e.n);return{post:e}},[],import.meta.url).then(({post:e})=>e(`close/${r.close}`,r.close===`unit`?{key:r.key}:{workspace:r.ws,...r.tab&&{tab:r.tab}})).then(t=>t.ok?Rr(r,e):x(t.body.reason??bn({status:t.status})),()=>x(Xt())).finally(()=>n.toggleAttribute(`disabled`,!1)))}))})}var Br=e=>{try{return decodeURIComponent(e)}catch{return e}},S=e=>/^\.+$/.test(e)?e.replaceAll(`.`,`%2E`):encodeURIComponent(e);function C(e){let[t,n]=e.split(`#`)[0].split(`?`),[r,i,a,o]=t.replace(/^\/+|\/+$/g,``).split(`/`).map(Br);if(r!==`w`||!i)return{view:`map`};if(a!==`s`||!o)return{view:`workspace`,ws:i};let s=new URLSearchParams(n).get(`at`);return s?{view:`session`,ws:i,key:o,at:s}:{view:`session`,ws:i,key:o}}var w=e=>e.view===`map`?``:e.view===`workspace`?`w/${S(e.ws)}`:`w/${S(e.ws)}/s/${S(e.key)}${e.at?`?at=${encodeURIComponent(e.at)}`:``}`,Vr=e=>e.view===`session`?{view:`workspace`,ws:e.ws}:{view:`map`},T=e=>e.view===`session`?e.key:e.view===`workspace`?`w:${e.ws}`:null;function Hr(e,t=new URL(document.baseURI).pathname){let n=()=>C(location.pathname.slice(t.length)+location.search),r={route:n,href:e=>w(e)||`./`,go(n){let r=t+w(n);location.pathname+location.search!==r&&history.pushState(null,``,r),e(n)}};return addEventListener(`popstate`,()=>e(n())),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-route]`);!t||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||(e.preventDefault(),r.go(C(t.getAttribute(`data-route`))))}),r}var Ur={main:`main`,member:`member`,subagent:`subagent`,outpost:`outpost`,outside:`outside`,tower:`tower`},E={working:Rt,waiting:Lt,idle:Ft,done:Nt,error:Pt,unknown:It},Wr={main:Dn,member:On,subagent:Mn,tower:Nn,outpost:kn,outside:An,session:jn},Gr={thinking:$t,"watching a monitor":Qt,idle:Ft,"waiting on a question":Lt,finished:Nt},Kr=e=>Object.hasOwn(Wr,e)?Wr[e]():e,qr=e=>e===`waiting`||e===`error`,D=e=>{let t=new DOMParser().parseFromString(e.trim(),`text/html`).body.firstElementChild;if(!(t instanceof HTMLElement))throw Error(`bad template`);return document.importNode(t,!0)},O=(e,t)=>{let n=document.getElementById(e);if(!(n instanceof t))throw Error(`#${e} is missing from the page`);return n},k=(e,t,n)=>{let r=e.querySelector(t);r.textContent!==n&&(r.textContent=n)},A=(e,t)=>{if(e.dataset.mark===t)return;let n=e.dataset.mark!==void 0;e.dataset.mark=t,n&&Tr(e,`flash`)},Jr=e=>(t=>(e.slice(8,t)===`stale`?Wt:Vt)({what:e.slice(t+1)}))(e.indexOf(`:`,8)),j=(e,t)=>e?e.startsWith(`tool:`)?tr({tool:e.slice(5)}):e.startsWith(`monitor:`)?Jr(e):Object.hasOwn(Gr,e)?Gr[e]():e:E[t](),M=(e,t)=>{e.toggleAttribute(`hidden`,!t),t&&(e.setAttribute(`href`,w(t)||`./`),e.setAttribute(`data-route`,w(t)))},Yr=(e,t)=>{let n=t.getBoundingClientRect(),r=e.offsetWidth;e.style.top=`${n.bottom+8}px`,e.style.left=`${Math.max(8,Math.min(n.right-r,innerWidth-r-8))}px`},Xr=`<div class="plate"><i class="ring"></i><svg><use href="#i-main"/></svg><b class="badge"></b></div>`;function Zr(e,t,n,r){A(e,n);let i=e.querySelector(`use`),a=`#i-${Ur[t]??`member`}`,o=r?.filter(e=>e.onScreen).length;i.getAttribute(`href`)!==a&&i.setAttribute(`href`,a),o?e.dataset.docs=String(o):delete e.dataset.docs}function N(e,t,n,r){let i=new Map;for(let t of e.children)!t.classList.contains(`leaving`)&&t.dataset.key&&i.set(t.dataset.key,t);let a=e.firstElementChild;for(let o of t){let t=i.get(o.id);for(t||(t=n(o),t.dataset.key=o.id,t.classList.add(`enter`),setTimeout(()=>t.classList.remove(`enter`),600)),i.delete(o.id);a?.classList.contains(`leaving`);)a=a.nextElementSibling;t===a?a=a.nextElementSibling:e.insertBefore(t,a),r(t,o)}for(let e of i.values())e.classList.add(`leaving`),setTimeout(()=>e.remove(),400)}var P=()=>D(`<div class="unit"><div class="card"><a class="hit"></a>${Xr}<div class="meta"><span class="name"></span><span class="line"><em class="role"></em><span class="note"></span></span></div><button type="button" class="quit-btn" data-close="unit" hidden></button></div><div class="subs"></div></div>`);function F(e,t){let n=e.closest(`.base`)?.dataset.key,r=e.querySelector(`.hit`);M(r,t.key&&n?{view:`session`,ws:n,key:t.key}:void 0),r.setAttribute(`aria-label`,`${t.name}: ${j(t.note,t.mark)}`),r.toggleAttribute(`data-alert`,qr(t.mark)),A(e,t.mark),Zr(e.querySelector(`.plate`),t.role,t.mark,t.docs),k(e,`.name`,t.name),k(e,`.role`,Kr(t.role)),k(e,`.note`,j(t.note,t.mark)),Pr(e.querySelector(`:scope > .card > .quit-btn`),t),N(e.querySelector(`.subs`),t.subs??[],P,F)}function I(e,t,n){let r=t.tower?`main`:`member`;e.hidden=!!(n&&t.tower),e.dataset.open=r,e.dataset.ws=t.id,n&&(e.dataset.tab=n),e.textContent!==(r===`main`?un():dn())&&(e.textContent=r===`main`?un():dn())}var Qr=()=>D(`<section class="base"><header><div class="tower"><i class="sweep"></i><i class="pulse"></i><svg><use href="#i-tower"/></svg><b class="badge"></b></div><div class="title"><span class="crown"><svg><use href="#i-crown"/></svg>${tt()}</span><h2><a class="enter-base"></a></h2><p></p><button type="button" class="quit-btn tower-quit" data-close="unit" hidden></button></div><button type="button" class="quit-btn" data-close="base"></button></header><div class="spawn-btns"><button type="button" class="pair-btn"></button></div><div class="tabs"></div><div class="outposts" data-label="${fn()}"></div></section>`);function $r(e,t){A(e,t.mark),e.classList.toggle(`head`,t.head);let n=e.querySelector(`.tower`);n.classList.toggle(`ghost`,!t.tower),A(n,t.tower?.mark??`unknown`),k(e,`h2 a`,t.label),M(e.querySelector(`h2 a`),{view:`workspace`,ws:t.id}),k(e,`.title p`,t.tower?Qe({state:E[t.tower.mark]()}):Zt()),I(e.querySelector(`.spawn-btns button`),t),Ir(e.querySelector(`header > .quit-btn`),t),Fr(e.querySelector(`.tower-quit`),t.tower),N(e.querySelector(`.tabs`),t.tabs,()=>D(`<div class="tab"><h3><span></span><button type="button" class="tab-add"></button><button type="button" class="quit-btn" data-close="tab"></button></h3><div class="units"></div></div>`),(e,n)=>{k(e,`h3 span`,qn({label:n.label})),Lr(e.querySelector(`.quit-btn`),t,n),I(e.querySelector(`.tab-add`),t,n.id),N(e.querySelector(`.units`),n.units,P,F)}),N(e.querySelector(`.outposts`),t.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?Jt():void 0})),P,F)}function ei(e,t,n,r){let i=[...e.querySelectorAll(`.base:not(.leaving) .tower`)],a=e.querySelector(`.base.head:not(.leaving) .tower`),o=e.getBoundingClientRect(),s=e=>{let t=e.getBoundingClientRect();return[Math.round(t.x+t.width/2-o.x),Math.round(t.y+t.height/2-o.y)]},c=a?i.filter(e=>e!==a):[],l=c.map(e=>{let[[t,n],[r,i]]=[s(a),s(e)];return{x1:t,y1:n,x2:r,y2:i,mid:Math.round((t+r)/2)}}),u=l.map(({x1:e,y1:t,x2:n,y2:r,mid:i})=>`M${e} ${t}C${i} ${t} ${i} ${r} ${n} ${r}`),d=u.join(`|`);t.dataset.sig!==d&&(t.dataset.sig=d,t.replaceChildren(...u.map(e=>(t=>(t.setAttribute(`class`,`wire`),t.setAttribute(`d`,e),t))(document.createElementNS(`http://www.w3.org/2000/svg`,`path`)))),n.replaceChildren(...Or(l,r))),n.querySelectorAll(`.packet`).forEach((e,t)=>e.toggleAttribute(`data-live`,a.dataset.mark===`working`||c[t].dataset.mark===`working`))}function ti(){let[e,t,n,r,i]=[O(`map`,HTMLElement),O(`bases`,HTMLElement),O(`links`,SVGSVGElement),O(`packets`,HTMLElement),O(`log`,HTMLElement)],a=matchMedia(`(prefers-reduced-motion: reduce)`).matches,o=()=>!e.hidden&&ei(e,n,r,a);return new ResizeObserver(o).observe(e),Cr(),{layout:o,stats(e){let t=e.bases.flatMap(e=>e.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))),n=e=>String(t.filter(t=>!e||t.mark===e).length);for(let[t,r]of[[`s-bases`,String(e.bases.length)],[`s-agents`,n()],[`s-working`,n(`working`)],[`s-waiting`,n(`waiting`)]])O(t,HTMLElement).textContent=r},show(e){N(t,e.bases,Qr,$r),requestAnimationFrame(o)},log(e){let t=new Date().toLocaleTimeString([],{hour12:!1});for(let n of e){let e=D(`<li><span></span><time></time></li>`);e.dataset.mark=n.mark,k(e,`span`,n.text),k(e,`time`,t),i.prepend(e)}for(;i.children.length>12;)i.lastElementChild.remove()},pause(e){document.documentElement.classList.toggle(`paused`,e)}}}var ni=new URL(`done-jqKY4qf5.mp3`,import.meta.url).href,ri=new URL(`error-DdTLgPEw.mp3`,import.meta.url).href,ii={waiting:new URL(`waiting-DOg8-8gu.mp3`,import.meta.url).href,error:ri,done:ni},ai=e=>e.mark===`waiting`||e.pending?`waiting`:e.mark===`error`?`error`:e.mark===`done`?`done`:void 0,L=(e,t)=>{try{return localStorage.getItem(e)??t}catch{return t}},R=(e,t)=>{try{localStorage.setItem(e,t)}catch{}};function oi(e){let t=e=>document.getElementById(e),n=t(`remind`),r=t(`sound`),i=t(`sound-pop`),a=t(`sound-on`),o=t(`sound-vol`),s=t(`sound-vol-out`),c=typeof Notification<`u`,l=L(`sb.remind`,`1`)===`1`,u=L(`sb.sound`,`0`)===`1`,d=Math.min(100,Math.max(0,Number(L(`sb.volume`,`60`))||0)),f,p,m=new Map,h=()=>{let e=c?Notification.permission:`denied`;n.setAttribute(`aria-pressed`,String(l)),n.dataset.state=l?e===`granted`?`on`:e===`denied`?`blocked`:`ask`:`off`,n.title=c?l?e===`granted`?Tn():e===`denied`?Cn():Sn():wn():En(),r.dataset.state=u?`on`:`off`,r.setAttribute(`aria-label`,u?In():Fn()),a.checked=u,o.value=s.value=String(d),p&&(p.gain.value=(d/100)**2)};n.textContent=xn(),r.textContent=Pn(),r.title=Ln(),t(`sound-on-label`).textContent=Pn(),t(`sound-vol-label`).textContent=zn(),t(`sound-try`).textContent=Rn(),n.onclick=async()=>{l&&c&&Notification.permission==="default"?await Notification.requestPermission().catch(()=>{}):R(`sb.remind`,(l=!l)?`1`:`0`),h()},i.addEventListener(`toggle`,e=>e.newState===`open`&&Yr(i,r)),a.onchange=()=>{R(`sb.sound`,(u=a.checked)?`1`:`0`),h(),u&&g(`done`)},o.oninput=()=>(R(`sb.volume`,String(d=Number(o.value))),h()),o.onchange=()=>g(`done`),t(`sound-try`).onclick=()=>g(`done`);function g(e){f??=new AudioContext,p||((p=f.createGain()).connect(f.destination),h());let t=f,n=p;m.has(e)||m.set(e,fetch(ii[e]).then(e=>e.arrayBuffer()).then(e=>t.decodeAudioData(e))),Promise.all([t.resume(),m.get(e)]).then(([,e])=>{let r=t.createBufferSource();r.buffer=e,r.connect(n),r.start()}).catch(()=>m.delete(e))}return h(),{signal(t){let n=t.flatMap(e=>(t=>t?[{a:e,k:t}]:[])(ai(e)));if(n.length&&(u&&g([`waiting`,`error`,`done`].find(e=>n.some(t=>t.k===e))),l&&c&&Notification.permission===`granted`&&(document.hidden||!document.hasFocus())))for(let{a:t,k:r}of n){let n=new Notification(t.name,{body:{waiting:ln,error:on,done:nn}[r]({note:t.note??``}).trim(),tag:t.key,icon:document.querySelector(`link[rel="icon"]`)?.href});n.onclick=()=>(window.focus(),n.close(),e(t))}}}}var si=45e3,ci=1e3,li=3e4,ui=(e,t)=>Math.min(li,ci*2**(e-1))*(.8+.4*t);function di(e){try{return JSON.parse(e)}catch{return}}function fi(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(),si),o({state:`live`,attempt:0,lastContact:e.now()})},u=()=>{c(),s();let t=a.attempt+1;if(t>8)return o({state:`offline`,attempt:t});o({state:`reconnecting`,attempt:t}),e.hidden()||(n=e.setTimeout(d,ui(t,e.random())))},d=()=>{c(),s(),i=e.now();let n=t=e.open();n.onError(()=>t===n&&u()),n.listen(`message`,r=>{if(t!==n)return;let i=di(r);i&&e.onNet(i),o({problem:i?void 0:hn()}),l()}),n.listen(`ping`,()=>t===n&&l()),n.listen(`problem`,e=>{t===n&&(o({problem:di(e)??gn()}),l())}),r=e.setTimeout(()=>u(),si)};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()}}}sr();var z=ti(),B=e=>document.getElementById(e),pi=e=>e?new Date(e).toLocaleTimeString([],{hour12:!1}):Kt(),mi,hi,V,H,gi={state:`connecting`,attempt:0},U={view:`map`},_i=!1,vi,yi=``,W,bi,G=e=>W?e(W):void bi?.then(e);function xi(){bi??=y(async()=>{let{mountFocus:e}=await import(`./views-Br67IVc3.js`);return{mountFocus:e}},[],import.meta.url).then(({mountFocus:e})=>(W=e({data:Fi,restart:()=>$.restart(),openTile:J,embedTerminal:(e,t,n)=>new Promise(r=>q(i=>r(i.terminal.embed(e,t,n)))),online:()=>gi.state===`live`}),W.show(U,U),V&&W.net(V),W))}var K,Si,q=e=>{if(K)return e(K);Si??=y(async()=>{let{mountPanels:e}=await import(`./layer-96B1N8D-.js`);return{mountPanels:e}},[],import.meta.url).then(({mountPanels:e})=>K=e({label:e=>V?.bases.find(t=>t.id===e)?.label??e,recent:async e=>(await(Z?Z.data(e).latest():X(e,`?limit=12`))).items,post:e=>Z&&((t,n)=>Z.data(e).post(t,n)),stream:()=>yi,showTerminal:(e,t)=>(K?.stack.close(),W?.terminal(t),Q.go({view:`session`,ws:e,key:t}))})),Si.then(e)},J=(e,t)=>q(n=>n.tiles.open(e,t)),Y=document.querySelector(`link[rel="icon"]`),Ci=Y&&decodeURIComponent(Y.href.slice(Y.href.indexOf(`,`)+1)),wi=0;function Ti(e){let t=e.bases.flatMap(e=>[...e.tower?[e.tower]:[],...[...e.tabs.flatMap(e=>e.units),...e.outside].flatMap(e=>[e,...e.subs])]).filter(e=>e.mark===`waiting`||e.pending).length;if(!Y||!Ci||t===wi)return;wi=t;let n=`<circle cx='23' cy='9' r='9' fill='#ffd166' stroke='#0b1220' stroke-width='2'/><text x='23' y='13' text-anchor='middle' font-family='sans-serif' font-size='${t>9?9:12}' font-weight='700' fill='#06101e'>${t>9?`9+`:t}</text>`;Y.href=`data:image/svg+xml,${encodeURIComponent(t?Ci.replace(`</svg>`,`${n}</svg>`):Ci)}`}var Ei;function Di(e){V=H=e,Ti(e);let t=pr(e,Date.now());if(Ei&&Li.signal(mr(Ei,t)),Ei=t,document.hidden)return;z.stats(e);let n=mr(vi,t);(n.length||K)&&q(e=>e.alerts(n,t)),vi=t,z.log(ur(hi,e)),hi=e,G(t=>t.net(e)),U.view===`map`&&(z.show(e),mi=e,H=void 0)}function Oi(e){let t=U,n=e.view===`workspace`&&t.view===`map`?document.querySelector(`#bases [data-key="${CSS.escape(e.ws)}"]`)?.getBoundingClientRect():void 0;U=e,e.view!==`map`&&xi(),B(`map`).hidden=e.view!==`map`,B(`legend`).hidden=e.view===`session`,G(r=>r.show(e,t,n)),e.view===`map`&&V&&V!==mi&&(Di(V),requestAnimationFrame(z.layout)),_i&&T(e)!==T(t)&&$.restart()}function ki(e){gi=e;let t=e.state===`reconnecting`||e.state===`offline`;document.body.dataset.stale=B(`stage`).dataset.stale=String(t),B(`link`).dataset.state=e.state,B(`link-text`).textContent={connecting:rt,live:it,reconnecting:ot,offline:at}[e.state](),W&&V&&W.net(V),K?.stack.redraw();let n=B(`banner`);n.hidden=!t&&!e.problem;let r=e.state===`offline`?ve({tries:e.attempt-1}):e.state===`reconnecting`?e.attempt?Te({attempt:e.attempt}):Se():xe({problem:e.problem??``}),i=document.createElement(`b`);i.textContent=pi(e.lastContact),n.replaceChildren(`${r} ${he()} `,i,me())}function Ai(e,t){try{let n=JSON.parse(t);G(t=>e===`history`?t.history(n):t.cards(n))}catch{}}var ji=document.querySelector(`meta[name="sb-build"]`)?.content,Mi=e=>!!(ji&&ji!==JSON.parse(e).build);function Ni(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 Pi=e=>fetch(`api/${e}`,{cache:`no-store`}).then(e=>e.ok?e.json():Promise.reject(Error(String(e.status)))),X=(e,t=``)=>Pi(`history/${encodeURIComponent(e)}${t}`),Z=void 0,Fi=e=>({older:t=>X(e,`?before=${encodeURIComponent(t)}`),latest:()=>X(e),entry:t=>Pi(`entry/${encodeURIComponent(e)}/${encodeURIComponent(t)}`).catch(()=>void 0),pic:(t,n)=>`api/image/${encodeURIComponent(e)}/${encodeURIComponent(t)}/${n}`}),Ii=()=>{let e=Ni(T(U));return e.listen(`history`,e=>Ai(`history`,e)),e.listen(`cards`,e=>Ai(`cards`,e)),e.listen(`hello`,e=>Mi(e)?location.reload():(yi=e,K?.terminal.hello())),e.listen(`mirror`,e=>K?.terminal.frame(e)),e};document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[data-alert]`),n=t&&C(t.getAttribute(`data-route`)??``);if(!n||n.view!==`session`||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let r=vi?.get(n.key);r&&(e.preventDefault(),q(e=>e.stack.show(r)))},!0);var Q=Hr(e=>Oi(e)),Li=oi(e=>Q.go({view:`session`,ws:e.ws,key:dr(e)})),$=fi({open:Ii,now:Date.now,setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),random:Math.random,hidden:()=>document.hidden,onNet:Di,onStatus:ki}),Ri=()=>$.resume();document.addEventListener(`visibilitychange`,()=>{if(z.pause(document.hidden),document.hidden)return $.hide();H&&Di(H),G(e=>e.wake()),Ri()}),addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||document.querySelector(`dialog.sheet[open], dialog.lightbox[open], [popover]:popover-open`)||(e.preventDefault(),!K?.stack.close()&&U.view!==`map`&&Q.go(Vr(U)))}),br(e=>K?.hotkey(e)??!1),B(`pair`).hidden=location.hostname!==`127.0.0.1`,B(`pair`).addEventListener(`click`,()=>void y(async()=>{let{pairTile:e}=await import(`./pair-_jZG7meU.js`);return{pairTile:e}},[],import.meta.url).then(({pairTile:e})=>J(e(),!0))),zr({route:()=>U,net:()=>V,go:e=>Q.go(e)}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`button[data-open]`);t&&y(async()=>{let{openingOf:e,spawnTile:t}=await import(`./spawn-Boo6LL4j.js`);return{openingOf:e,spawnTile:t}},[],import.meta.url).then(({openingOf:e,spawnTile:n})=>{let r=e(t,V?.bases??[]);r&&J(n(r,(e,t,n)=>(K?.tiles.close(n),Q.go({view:`session`,ws:e,key:t}))),!0)})});for(let e of[`focus`,`pageshow`,`online`])window.addEventListener(e,()=>!document.hidden&&Ri());ki(gi),Oi(Q.route()),$.start(),_i=!0;export{et as A,bn as C,Yt as D,Xt as E,s as F,Oe as M,De as N,Jt as O,pe as P,Hn as S,Zt as T,Er as _,I as a,dr as b,Zr as c,A as d,Kr as f,y as g,qr as h,M as i,Qe as j,tt as k,Yr as l,k as m,E as n,O as o,N as p,Xr as r,j as s,Ur as t,D as u,Tr as v,fn as w,Un as x,fr as y};