pi-straw-boss 0.43.2 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +7 -2
  2. package/README.zh-TW.md +3 -0
  3. package/dist/gui/assets/ask-87CEae19.js +1 -0
  4. package/dist/gui/assets/chat-YJh7eBNK.js +2 -0
  5. package/dist/gui/assets/drawer-xwDrm4Ic.js +1 -0
  6. package/dist/gui/assets/index-D9X5KUWx.css +1 -0
  7. package/dist/gui/assets/index-DXzYIOEk.js +1 -0
  8. package/dist/gui/assets/layer-BftPkkIR.js +3 -0
  9. package/dist/gui/assets/lightbox-E36JAY2U.js +1 -0
  10. package/dist/gui/assets/link-txZQw2rn.js +1 -0
  11. package/dist/gui/assets/open_main_title-Ccbha5pD.js +1 -0
  12. package/dist/gui/assets/pair-CKNaA6Dw.js +1 -0
  13. package/dist/gui/assets/picker-lrLxTm02.js +1 -0
  14. package/dist/gui/assets/refusal--wJ5SRx-.js +1 -0
  15. package/dist/gui/assets/rolldown-runtime-DK3Fl9T5.js +1 -0
  16. package/dist/gui/assets/runtime-ZX6HkxDa.js +1 -0
  17. package/dist/gui/assets/sending-aEpvzoz2.js +1 -0
  18. package/dist/gui/assets/spawn-DNvhBds9.js +1 -0
  19. package/dist/gui/assets/trust-B4Mz7ezm.js +1 -0
  20. package/dist/gui/assets/unit_count-DTUtsZm9.js +1 -0
  21. package/dist/gui/assets/views-DYGKQ7zU.js +7 -0
  22. package/dist/gui/index.html +5 -2
  23. package/dist/server/chunk-KDUVK2ET.mjs +2029 -0
  24. package/dist/server/cli.mjs +335 -0
  25. package/dist/server/main.mjs +838 -0
  26. package/package.json +9 -2
  27. package/prompts/main.md +1 -0
  28. package/prompts/tower.md +1 -0
  29. package/src/activity.ts +1 -1
  30. package/src/agent/cli.ts +11 -8
  31. package/src/agent/config.ts +22 -0
  32. package/src/agent/sidecar.ts +20 -19
  33. package/src/ask.ts +5 -3
  34. package/src/balance.mjs +2 -2
  35. package/src/board.ts +159 -0
  36. package/src/boardread.ts +43 -0
  37. package/src/boardset.ts +35 -0
  38. package/src/boss.ts +6 -3
  39. package/src/bridge.ts +54 -6
  40. package/src/closemain.ts +1 -1
  41. package/src/closer.ts +3 -0
  42. package/src/closing.ts +4 -2
  43. package/src/control.ts +85 -10
  44. package/src/dashboard.ts +2 -127
  45. package/src/deploy.ts +45 -9
  46. package/src/dequeuebind.ts +61 -0
  47. package/src/dequeuekey.ts +18 -0
  48. package/src/devices.ts +10 -2
  49. package/src/dialogs.ts +21 -7
  50. package/src/exe.d.mts +12 -0
  51. package/src/exe.mjs +125 -0
  52. package/src/gui.ts +14 -8
  53. package/src/handover.ts +6 -10
  54. package/src/herdr.ts +2 -2
  55. package/src/hidden.ts +9 -1
  56. package/src/host.ts +14 -3
  57. package/src/index.ts +9 -5
  58. package/src/keys.ts +29 -13
  59. package/src/link/admin.ts +534 -0
  60. package/src/link/allow.ts +4 -4
  61. package/src/link/approval.ts +95 -0
  62. package/src/link/boardtargets.ts +30 -0
  63. package/src/link/config.ts +29 -2
  64. package/src/link/holder.ts +271 -9
  65. package/src/link/hooks.ts +12 -5
  66. package/src/link/join.ts +11 -2
  67. package/src/link/kinds.ts +71 -6
  68. package/src/link/request.ts +220 -0
  69. package/src/link/runtime.ts +158 -15
  70. package/src/link/store.ts +64 -0
  71. package/src/link/wire.ts +2 -0
  72. package/src/net.ts +10 -6
  73. package/src/netdata.ts +137 -0
  74. package/src/opener.ts +13 -7
  75. package/src/order.ts +1 -1
  76. package/src/orphan.ts +1 -1
  77. package/src/owners.ts +8 -4
  78. package/src/pairing.ts +8 -4
  79. package/src/pull.ts +40 -0
  80. package/src/reach.ts +14 -8
  81. package/src/remote.ts +3 -3
  82. package/src/semver.ts +6 -0
  83. package/src/server/acl.ts +398 -0
  84. package/src/server/breakaway.ts +251 -0
  85. package/src/server/cli.ts +306 -0
  86. package/src/server/client.ts +642 -0
  87. package/src/server/intercom.ts +102 -0
  88. package/src/server/log.ts +135 -0
  89. package/src/server/main.ts +383 -0
  90. package/src/server/record.ts +391 -0
  91. package/src/server/socket.ts +220 -0
  92. package/src/server/version.ts +22 -0
  93. package/src/server/winprep.ts +297 -0
  94. package/src/server-look.ts +190 -0
  95. package/src/session.ts +9 -1
  96. package/src/spawn.ts +19 -8
  97. package/src/startof.ts +53 -12
  98. package/src/stash.ts +10 -5
  99. package/src/stashing.ts +2 -1
  100. package/src/state.ts +7 -4
  101. package/src/tools.ts +72 -4
  102. package/src/towertab.ts +17 -8
  103. package/src/trust/ask.ts +182 -0
  104. package/src/trust/files.ts +159 -0
  105. package/src/trust/found.ts +103 -0
  106. package/src/trust/serve.ts +110 -0
  107. package/src/trust/settings.ts +160 -0
  108. package/src/trust/types.ts +15 -0
  109. package/src/trust/wait.ts +28 -0
  110. package/src/winpath.ts +24 -0
  111. package/dist/gui/assets/ask-Cpx1ZrOo.js +0 -1
  112. package/dist/gui/assets/chat-lTr41tWz.js +0 -2
  113. package/dist/gui/assets/drawer-Dz330I78.js +0 -1
  114. package/dist/gui/assets/index-BjtXXg-H.js +0 -1
  115. package/dist/gui/assets/index-CHw4SzTz.css +0 -1
  116. package/dist/gui/assets/layer-CgS0W5EQ.js +0 -3
  117. package/dist/gui/assets/lightbox-BzsLPapn.js +0 -1
  118. package/dist/gui/assets/open_main_title-BQxujifY.js +0 -1
  119. package/dist/gui/assets/pair-BOOPf2JJ.js +0 -1
  120. package/dist/gui/assets/post-UHMNmNgA.js +0 -1
  121. package/dist/gui/assets/spawn-BLCk6GvO.js +0 -1
  122. package/dist/gui/assets/unit_count-BQFdNCeW.js +0 -1
  123. package/dist/gui/assets/views-B4sYxrpa.js +0 -7
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{t}from"./picker-lrLxTm02.js";import{C as n,D as r,E as i,H as a,J as o,K as s,O as c,T as l,Y as ee,q as te,z as u}from"./index-DXzYIOEk.js";import{square as ne}from"./pair-CKNaA6Dw.js";var re=((t={},n={})=>(n.locale??e())===`zh-TW`?`核准`:`Approve`),ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`有人值守`:`attended`),d=e=>`The camera could not be used: ${e?.reason}`,f=e=>`無法使用相機:${e?.reason}`,ae=((t,n={})=>(n.locale??e())===`zh-TW`?f(t):d(t)),oe=((t={},n={})=>(n.locale??e())===`zh-TW`?`取消邀請`:`Cancel invite`),se=((t={},n={})=>(n.locale??e())===`zh-TW`?`裝置`:`Device`),ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`類型`:`Kind`),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`角色`:`Role`),ue=((t={},n={})=>(n.locale??e())===`zh-TW`?`最後在線`:`Last presence`),de=((t={},n={})=>(n.locale??e())===`zh-TW`?`信任`:`Trust`),fe=((t={},n={})=>(n.locale??e())===`zh-TW`?`已複製`:`Copied`),pe=((t={},n={})=>(n.locale??e())===`zh-TW`?`複製`:`Copy`),me=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法複製;文字已選取,請自行複製`:`Could not copy; the text is selected, copy it yourself`),he=((t={},n={})=>(n.locale??e())===`zh-TW`?`建立團隊`:`Create team`),ge=((t={},n={})=>(n.locale??e())===`zh-TW`?`中繼站的管理者會給你一次性的團隊 token。這台電腦會成為團隊的第一位管理員。`:`The relay's operator gives you a one-time team token. This computer becomes the team's first admin.`),_e=((t={},n={})=>(n.locale??e())===`zh-TW`?`建立團隊`:`Create a team`),p=e=>`Team ${e?.name} created`,m=e=>`團隊 ${e?.name} 已建立`,ve=((t,n={})=>(n.locale??e())===`zh-TW`?m(t):p(t)),ye=((t={},n={})=>(n.locale??e())===`zh-TW`?`裝置 id`:`Device id`),be=((t={},n={})=>(n.locale??e())===`zh-TW`?`裝置 id`:`device id`),xe=((t={},n={})=>(n.locale??e())===`zh-TW`?`26 個字元的裝置 id`:`26-character device id`),Se=((t={},n={})=>(n.locale??e())===`zh-TW`?`與另一台裝置同名`:`same label as another device`),h=e=>`key ${e?.n}`,g=e=>`金鑰 ${e?.n}`,Ce=((t,n={})=>(n.locale??e())===`zh-TW`?g(t):h(t)),we=((t={},n={})=>(n.locale??e())===`zh-TW`?`邀請電腦`:`Invite a computer`),Te=((t={},n={})=>(n.locale??e())===`zh-TW`?`用新電腦的相機掃描,或把文字貼到那邊。只能用一次。新電腦會顯示四個單字:在這裡點選同一組。`:`Scan it with the new computer's camera, or paste the text there. It works once. The new computer shows four words: tap the same set here.`),Ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`這張邀請已失效`:`This invite has lapsed`),_=e=>`Lapses in ${e?.time}`,v=e=>`${e?.time} 後失效`,De=((t,n={})=>(n.locale??e())===`zh-TW`?v(t):_(t)),Oe=((t={},n={})=>(n.locale??e())===`zh-TW`?`邀請`:`Invite`),y=e=>`Invite for unattended device ${e?.device}`,b=e=>`邀請無人值守裝置 ${e?.device}`,x=((t,n={})=>(n.locale??e())===`zh-TW`?b(t):y(t)),ke=((t={},n={})=>(n.locale??e())===`zh-TW`?`邀請文字`:`Invite text`),S=e=>`Invite to ${e?.team}`,C=e=>`邀請加入 ${e?.team}`,w=((t,n={})=>(n.locale??e())===`zh-TW`?C(t):S(t)),Ae=((t={},n={})=>(n.locale??e())===`zh-TW`?`邀請無人值守裝置`:`Invite an unattended device`),je=((t={},n={})=>(n.locale??e())===`zh-TW`?`取消`:`Cancel`),Me=((t={},n={})=>(n.locale??e())===`zh-TW`?`已加入。團隊在「團隊」裡。`:`Joined. The team is under Teams.`),Ne=((t={},n={})=>(n.locale??e())===`zh-TW`?`加入`:`Join`),Pe=((t={},n={})=>(n.locale??e())===`zh-TW`?`貼上邀請文字,或掃描它的 QR code。畫面會顯示四個單字,請念給邀請人聽,由他點選同一組。`:`Paste the invite text, or scan its QR code. You are shown four words to read to the inviter, who taps the same set.`),Fe=((t={},n={})=>(n.locale??e())===`zh-TW`?`你已加入。請選擇專案資料夾,再按使用:`:`You are added. Pick the project folder, then use it:`),Ie=((t={},n={})=>(n.locale??e())===`zh-TW`?`專案資料夾已設定,正在完成…`:`Project folder set. Finishing…`),Le=((t={},n={})=>(n.locale??e())===`zh-TW`?`加入團隊`:`Join a team`),T=e=>`Waiting for the inviter to confirm. The invite lapses in ${e?.time}.`,E=e=>`等待邀請人確認。邀請將在 ${e?.time} 後失效。`,Re=((t,n={})=>(n.locale??e())===`zh-TW`?E(t):T(t)),ze=((t={},n={})=>(n.locale??e())===`zh-TW`?`等待邀請人核准這台裝置。`:`Waiting for the inviter to approve this device.`),Be=((t={},n={})=>(n.locale??e())===`zh-TW`?`請把這四個單字告訴邀請人:`:`Tell the inviter these words:`),D=((t={},n={})=>(n.locale??e())===`zh-TW`?`這台電腦的名稱`:`This computer's label`),Ve=((t={},n={})=>(n.locale??e())===`zh-TW`?`這裡讀不到名稱`:`label unreadable here`),O=((t={},n={})=>(n.locale??e())===`zh-TW`?`離開`:`Leave`),He=((t={},n={})=>(n.locale??e())===`zh-TW`?`離開?你是唯一的管理員,離開後沒有人能移除裝置或輪換金鑰。再按一次仍要離開`:`Leave? You are the only admin: nobody can remove a device or rotate the key afterwards. Press again to leave anyway`),k=((t={},n={})=>(n.locale??e())===`zh-TW`?`離開?再按一次`:`Leave? Press again`),A=((t={},n={})=>(n.locale??e(),`dispatch`)),j=((t={},n={})=>(n.locale??e(),`forward`)),M=((t={},n={})=>(n.locale??e(),`reply`)),Ue=((t={},n={})=>(n.locale??e())===`zh-TW`?`設為管理員`:`Make admin`),N=e=>`Make ${e?.name} an admin`,We=e=>`讓 ${e?.name} 成為管理員`,Ge=((t,n={})=>(n.locale??e())===`zh-TW`?We(t):N(t)),Ke=((t={},n={})=>(n.locale??e())===`zh-TW`?`設為成員`:`Make member`),qe=((t={},n={})=>(n.locale??e())===`zh-TW`?`沒有專案`:`no project`),Je=((t={},n={})=>(n.locale??e())===`zh-TW`?`這台電腦還沒有團隊。建立一個,或用邀請加入。`:`No teams on this computer yet. Create one, or join with an invite.`),Ye=((t={},n={})=>(n.locale??e())===`zh-TW`?`都不是:拒絕`:`None of these: refuse`),Xe=((t={},n={})=>(n.locale??e())===`zh-TW`?`尚未使用的邀請`:`Open invites`),Ze=((t={},n={})=>(n.locale??e())===`zh-TW`?`邀請文字`:`Invite text`),P=e=>`An agent asked for this screen: ${e?.reason}`,F=e=>`有 agent 要求開啟這個畫面:${e?.reason}`,Qe=((t,n={})=>(n.locale??e())===`zh-TW`?F(t):P(t)),$e=((t={},n={})=>(n.locale??e())===`zh-TW`?`專案資料夾(訊息會送到開在這個資料夾上的塔台):`:`Project folder (messages go to a tower open on it):`),et=((t={},n={})=>(n.locale??e())===`zh-TW`?`拒絕`:`Refuse`),tt=((t={},n={})=>(n.locale??e())===`zh-TW`?`中繼站網址`:`Relay URL`),nt=((t={},n={})=>(n.locale??e())===`zh-TW`?`移除`:`Remove`),rt=((t={},n={})=>(n.locale??e())===`zh-TW`?`移除?再按一次`:`Remove? Press again`),I=((t={},n={})=>(n.locale??e())===`zh-TW`?`管理員`:`admin`),L=((t={},n={})=>(n.locale??e())===`zh-TW`?`成員`:`member`),it=((t={},n={})=>(n.locale??e())===`zh-TW`?`輪換金鑰`:`Rotate key`),at=((t={},n={})=>(n.locale??e())===`zh-TW`?`輪換?再按一次`:`Rotate? Press again`),ot=((t={},n={})=>(n.locale??e())===`zh-TW`?`用相機掃描`:`Scan with the camera`),st=((t={},n={})=>(n.locale??e())===`zh-TW`?`這台電腦是團隊唯一有人值守的管理員。它一旦遺失,就沒有人能移除裝置或輪換金鑰。請再指定一位有人值守的管理員:`:`This computer is the team's only attended admin. If it is lost, nobody can remove a device or rotate the key. Make a second attended admin:`),ct=((t={},n={})=>(n.locale??e())===`zh-TW`?`設定 Straw Link`:`Set up Straw Link`),lt=((t={},n={})=>(n.locale??e())===`zh-TW`?`Straw Link 尚未在這台電腦啟動。設定後會在其中一個 pi 工作階段(塔台或已加入的工作階段)啟動連線持有者。`:`Straw Link has not started on this computer. Setting it up starts a link holder in one of its pi sessions (a tower or a joined session).`),ut=((t={},n={})=>(n.locale??e())===`zh-TW`?`啟動中,需要幾秒鐘。`:`Starting. This takes a few seconds.`),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`分享`:`Share`),dt=((t={},n={})=>(n.locale??e())===`zh-TW`?`只分享在線`:`shares presence`),ft=((t={},n={})=>(n.locale??e())===`zh-TW`?`只分享我在線`:`Share only that I am online`),pt=((t={},n={})=>(n.locale??e())===`zh-TW`?`分享狀態`:`shares status`),mt=((t={},n={})=>(n.locale??e())===`zh-TW`?`分享我的塔台與分頁狀態`:`Share my towers' and tabs' states`),ht=((t={},n={})=>(n.locale??e())===`zh-TW`?`顯示`:`Show`),z=((t={},n={})=>(n.locale??e())===`zh-TW`?`團隊`:`Teams`),gt=((t={},n={})=>(n.locale??e())===`zh-TW`?`團隊 token`:`Team token`),B=e=>`Trust for ${e?.name}`,V=e=>`${e?.name} 的信任等級`,_t=((t,n={})=>(n.locale??e())===`zh-TW`?V(t):B(t)),vt=((t={},n={})=>(n.locale??e())===`zh-TW`?`這台裝置傳來的訊息能做什麼。reply:允許清單內的唯讀工具直接執行,其餘在這裡問你。forward:同上,但其餘改問對方電腦上的人。dispatch:像你自己送的訊息一樣執行,仍受這台電腦自己的防護限制。`:`What a message from this device may do. reply: the allowed read-only tools run; anything else asks you here. forward: the same, but anything else asks that device's owner on their computer. dispatch: runs as a message from you would, under this computer's own guards.`),yt=((t={},n={})=>(n.locale??e())===`zh-TW`?`無人值守`:`unattended`),bt=((t={},n={})=>(n.locale??e())===`zh-TW`?`這台裝置沒有人在操作。邀請裡的裝置 id 取代了單字比對。`:`This device has no one at it. The id in your invite stands in for the words.`),xt=((t={},n={})=>(n.locale??e())===`zh-TW`?`使用這個資料夾`:`Use this folder`),H=e=>`Look at ${e?.label}'s screen. Tap the set of four words it shows. A wrong tap ends the invite.`,U=e=>`看 ${e?.label} 的螢幕,點選它顯示的那一組四個單字。點錯會結束這張邀請。`,St=((t,n={})=>(n.locale??e())===`zh-TW`?U(t):H(t)),Ct=((t={},n={})=>(n.locale??e())===`zh-TW`?`(這台電腦)`:`(this computer)`),wt=2e3,Tt=()=>globalThis.BarcodeDetector,W=e=>e.body.reason??u({status:e.status}),Et=e=>e===`admin`?I():L(),Dt=e=>({reply:M,forward:j,dispatch:A})[e]();function G(){return{id:`link`,title:z(),icon:`i-tower`,body:K}}function K(){let e=r(`div`,{class:`teams-tile`}),u=r(`p`,{class:`link-status`,role:`status`}),d=r(`div`,{class:`link-head`}),f=r(`div`,{class:`link-requests`}),p=r(`div`,{class:`link-teams`}),m=r(`div`,{class:`link-invites`}),h,g=``,_=``,v=new Map,y=async(e,t={})=>{let r=await n(`link/${e}`,t).catch(()=>({ok:!1,status:0,body:{reason:a()}}));return r.ok?u.textContent=``:u.textContent=W(r),$(),r},b=(e,t,n=`later`)=>{let i=r(`button`,{type:`button`,class:n},e);return i.onclick=()=>{i.disabled=!0,Promise.resolve(t()).finally(()=>i.disabled=!1)},i},S=(e,t,n)=>{let i=r(`button`,{type:`button`,class:`later`},e),a;return i.onclick=()=>{a?(clearTimeout(a),a=void 0,i.disabled=!0,Promise.resolve(n()).finally(()=>(i.disabled=!1,i.textContent=e,delete i.dataset.armed))):(i.textContent=t,i.dataset.armed=`true`,a=setTimeout(()=>(a=void 0,i.textContent=e,delete i.dataset.armed),5e3))},i},C=r(`div`,{class:`link-invite`,hidden:``}),T,E=``,A=()=>{clearInterval(T),C.hidden=!0,C.replaceChildren(),E=``},j=(e,t)=>{let n=e.body;if(!n.text||!n.rows||!n.expires)return;clearInterval(T),E=n.hash??``;let i=r(`b`,{class:`link-count`}),a=r(`textarea`,{readonly:``,rows:`4`,"aria-label":ke()});a.value=n.text;let o=b(pe(),async()=>{await navigator.clipboard?.writeText(n.text).then(()=>u.textContent=fe(),()=>(a.select(),u.textContent=me()))}),s=b(oe(),async()=>{await y(`invite-cancel`,{hash:n.hash}),A()}),c=()=>{let e=n.expires-Date.now();i.textContent=e>0?De({time:l(e)}):Ee(),C.dataset.lapsed=String(e<=0)};c(),T=setInterval(c,1e3),C.hidden=!1,C.replaceChildren(r(`h4`,null,t),ne(n.rows),i,r(`p`,null,Te()),a,r(`div`,{class:`devices-acts`},o,s))},M=e=>{let t=r(`div`,{class:`link-request`});if(t.append(r(`b`,null,e.unattended?te({label:e.label,short:e.short,team:e.teamName}):o({label:e.label,short:e.short,team:e.teamName}))),e.unattended)return t.append(r(`p`,null,bt()),r(`div`,{class:`devices-acts`},b(re(),()=>y(`decide`,{id:e.id,approve:!0})),b(et(),()=>y(`decide`,{id:e.id,approve:!1})))),t;t.append(r(`p`,null,St({label:e.label})));let n=r(`div`,{class:`link-words`});for(let[t,r]of e.sets.entries())n.append(b(r.join(` `),()=>y(`decide`,{id:e.id,pick:t}),`later link-set`));return t.append(n,r(`div`,{class:`devices-acts`},b(Ye(),()=>y(`decide`,{id:e.id,approve:!1})))),t},N=(e,t)=>{let n=r(`tr`,{"data-self":String(t.self),"data-online":String(t.online)}),a=r(`td`,null,r(`b`,null,t.label),` `,r(`small`,{class:`link-short`,title:t.id},t.short),t.duplicate&&r(`em`,{class:`link-dup`},Se()),!t.labelKnown&&r(`em`,{class:`link-dup`},Ve()),t.self&&r(`em`,null,Ct())),o=r(`select`,{"aria-label":_t({name:t.label}),title:vt()});for(let e of[`reply`,`forward`,`dispatch`])o.append(new Option(Dt(e),e,!1,e===t.trust));o.onchange=()=>void y(`trust`,{device:t.id,level:o.value});let s=e.self.role===`admin`&&!t.self;return n.append(a,r(`td`,{class:`nw`},Et(t.role)),r(`td`,{class:`nw`},t.attended?ie():yt()),r(`td`,null,t.self?``:i(t.seenAgoMs,t.online)),r(`td`,null,t.self?``:o),r(`td`,{class:`link-acts`},...c(s&&t.attended&&b(t.role===`admin`?Ke():Ue(),()=>y(`role`,{team:e.team,device:t.id,role:t.role===`admin`?`member`:`admin`})),s&&S(nt(),rt(),()=>y(`remove`,{team:e.team,device:t.id}))))),n},We=e=>{let t=r(`section`,{class:`link-team`,"data-status":e.status});if(t.append(r(`h3`,null,e.name,` `,r(`small`,null,e.team.slice(0,6))),r(`p`,{class:`link-meta`},`${e.project||qe()} · ${e.relay||`?`} · ${e.share===`status`?pt():dt()} · ${Ce({n:String(e.epoch)})}`)),e.status===`stopped`)return t.append(r(`p`,{class:`link-warn`},ee({team:e.name,reason:e.stoppedWhy??``})),S(O(),k(),()=>y(`leave`,{team:e.team,force:!0}))),t;e.relayDown&&t.append(r(`p`,{class:`link-warn`},s({team:e.name,minutes:`2`}))),e.secondAdmin.length&&t.append(r(`div`,{class:`link-warn`},r(`p`,null,st()),r(`div`,{class:`devices-acts`},...e.secondAdmin.map(t=>{let n=e.members.find(e=>e.id===t);return b(Ge({name:n.label}),()=>y(`role`,{team:e.team,device:t,role:`admin`}))}))));let n=r(`table`,{class:`link-roster`},r(`thead`,null,r(`tr`,null,...[se(),le(),ce(),ue(),de(),``].map(e=>r(`th`,null,e)))),r(`tbody`,null,...e.members.map(t=>N(e,t)))),i=r(`input`,{type:`text`,maxlength:`26`,placeholder:xe(),"aria-label":ye()}),a=v.get(e.team)??{open:!1,text:``};i.value=a.text,i.oninput=()=>v.set(e.team,{open:!o.hidden,text:i.value});let o=r(`form`,{class:`link-inline`,...a.open?{}:{hidden:``}},i,b(Oe(),()=>P(e,i.value.trim()),`go`));o.onsubmit=t=>(t.preventDefault(),void P(e,i.value.trim()));let l=r(`div`,{class:`devices-acts`},...c(b(we(),()=>P(e)),b(Ae(),()=>void(o.hidden=!o.hidden,v.set(e.team,{open:!o.hidden,text:i.value}),i.focus())),e.self.role===`admin`&&S(it(),at(),()=>y(`rotate`,{team:e.team})),S(O(),e.onlyAdmin&&e.members.length>1?He():k(),()=>y(`leave`,{team:e.team,force:e.onlyAdmin}))));return t.append(n,l,o),t},P=async(e,t)=>{let n=await y(`invite`,{team:e.team,...t?{forDevice:t}:{}});n.ok&&j(n,t?x({device:t.slice(0,6)}):w({team:e.name}))},F=r(`input`,{type:`url`,"aria-label":tt()}),I=r(`input`,{type:`password`,autocomplete:`off`,"aria-label":gt()}),L=r(`input`,{type:`text`,maxlength:`40`,"aria-label":D()}),z=r(`select`,{"aria-label":R()});z.append(new Option(mt(),`status`),new Option(ft(),`presence`));let B=``,V=t({},e=>B=e,()=>{}),H=r(`button`,{type:`button`,class:`go`},he());H.onclick=()=>{H.disabled=!0,y(`create`,{relay:F.value.trim(),token:I.value.trim(),project:B,share:z.value,...L.value.trim()?{label:L.value.trim()}:{}}).then(e=>{H.disabled=!1,e.ok&&(I.value=``,u.textContent=ve({name:String(e.body.name)}),U.open=!1)})};let U=r(`details`,{class:`link-form`},r(`summary`,null,_e()),r(`p`,null,ge()),r(`label`,null,tt(),F),r(`label`,null,gt(),I),r(`label`,null,D(),L),r(`label`,null,R(),z),r(`p`,null,$e()),V.el,H),G=r(`textarea`,{rows:`3`,placeholder:`strawlink1:…`,"aria-label":Ze()}),K=r(`input`,{type:`text`,maxlength:`40`,"aria-label":D()}),q=r(`select`,{"aria-label":R()});q.append(new Option(mt(),`status`),new Option(ft(),`presence`));let J=r(`div`,{class:`link-join-progress`}),Y=``,Ot=t({},e=>Y=e,()=>{}),kt=b(xt(),async()=>{Y&&await y(`join-project`,{project:Y,share:q.value})},`go`),X=r(`button`,{type:`button`,class:`go`},Ne());X.onclick=()=>{X.disabled=!0,y(`join-start`,{text:G.value.trim(),...K.value.trim()?{label:K.value.trim()}:{}}).then(e=>{X.disabled=!1,e.ok&&Y&&y(`join-project`,{project:Y,share:q.value})})};let Z=r(`div`,{class:`link-scan`,hidden:``}),Q,At=b(ot(),async()=>{let e=Tt();if(!e||!navigator.mediaDevices?.getUserMedia)return;if(Q)return Q();let t=r(`video`,{playsinline:``,muted:``,"aria-label":ot()});try{let n=await navigator.mediaDevices.getUserMedia({video:{facingMode:`environment`}}),r=new e({formats:[`qr_code`]});t.srcObject=n,await t.play(),Z.hidden=!1,Z.replaceChildren(t);let i=setInterval(()=>void r.detect(t).then(e=>{let t=e.map(e=>e.rawValue).find(e=>e.trim().startsWith(`strawlink1:`));t&&(Q?.(),G.value=t.trim())},()=>{}),300);Q=()=>{clearInterval(i);for(let e of n.getTracks())e.stop();Z.hidden=!0,Z.replaceChildren(),Q=void 0}}catch(e){u.textContent=ae({reason:e.message})}});At.hidden=!Tt();let jt=r(`details`,{class:`link-form`},r(`summary`,null,Le()),r(`p`,null,Pe()),G,At,Z,r(`label`,null,D(),K),r(`label`,null,R(),q),r(`p`,null,$e()),Ot.el,X,J),Mt=e=>{if(!e)return void J.replaceChildren();let t=[];e.state===`failed`?t.push(r(`p`,{class:`link-warn`},e.error??``)):e.state===`done`?t.push(r(`p`,null,Me())):(t.push(r(`p`,null,Be()),r(`p`,{class:`link-bigwords`},e.words.join(` `)),r(`p`,null,e.pinned?ze():Re({time:l(e.expires-Date.now())}))),e.needsProject?t.push(r(`p`,null,Fe()),kt):t.push(r(`p`,null,Ie()))),e.state!==`done`&&t.push(b(je(),()=>y(`join-cancel`))),J.replaceChildren(...t)},Nt=()=>{let e=b(ct(),async()=>{let e=await n(`link/enable`,{}).catch(()=>void 0);u.textContent=e?.ok?ut():e?W(e):a()},`go`);d.replaceChildren(r(`p`,null,lt()),e),f.replaceChildren(),p.replaceChildren()},Pt=e=>{h=e;let t=JSON.stringify([e.label,e.deviceId,e.relay,e.teams.map(e=>[{...e,members:e.members.map(e=>({...e,seenAgoMs:e.seenAgoMs===null?null:Math.floor(e.seenAgoMs/6e4)}))}]),e.joinRequests,e.invites,e.alerts.map(e=>e.id)]);if(u.textContent===ut()&&(u.textContent=``),E&&!e.invites.some(e=>e.hash===E)&&A(),e.join?Mt(e.join):J.replaceChildren(),e.prefill&&_!==JSON.stringify(e.prefill)&&(_=JSON.stringify(e.prefill),e.prefill.kind===`join`?(e.prefill.text&&(G.value=e.prefill.text),e.prefill.project&&Ot.picker.go(e.prefill.project),e.prefill.label&&(K.value=e.prefill.label),e.prefill.share&&(q.value=e.prefill.share),jt.open=!0):(e.prefill.relay&&(F.value=e.prefill.relay),e.prefill.project&&V.picker.go(e.prefill.project),e.prefill.share&&(z.value=e.prefill.share),e.prefill.label&&(L.value=e.prefill.label),U.open=!0),u.textContent=Qe({reason:e.prefill.reason}),n(`link/prefill-clear`,{}).catch(()=>{})),!F.value&&e.relay&&(F.value=e.relay),K.placeholder=L.placeholder=e.label,t===g)return;g=t,d.replaceChildren(r(`p`,null,r(`b`,null,e.label),` `,r(`small`,{class:`link-short`,title:e.deviceId},e.short),` · `,be(),` `,r(`code`,null,e.deviceId))),f.replaceChildren(...e.joinRequests.map(M)),p.replaceChildren(...e.teams.length?e.teams.map(We):[r(`p`,{class:`chat-empty`},Je())]);let i=e.invites.filter(e=>e.hash!==E);m.replaceChildren(...c(i.length>0&&r(`h4`,null,Xe()),...i.map(e=>{let t=r(`div`,{class:`link-open-invite`},r(`span`,null,`${e.teamName}${e.forDevice?` · ${e.forDevice.slice(0,6)}`:``} · ${l(e.expires-Date.now())}`));return t.append(b(ht(),async()=>{let t=await y(`invite-text`,{hash:e.hash});t.ok&&j(t,e.forDevice?x({device:e.forDevice.slice(0,6)}):w({team:e.teamName}))}),b(oe(),()=>y(`invite-cancel`,{hash:e.hash}))),t})))};async function $(){if(!e.isConnected&&h)return;let t=await n(`link/state`,{}).catch(()=>void 0);if(t){if(t.ok)return Pt(t.body.view);if(t.body.error===`no_holder`)return Nt();u.textContent=W(t)}}let Ft=setInterval(()=>e.isConnected?void $():clearInterval(Ft),wt);return e.append(d,u,f,p,C,m,U,jt),$(),e}export{G as linkTile};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";var t=e=>`New main agent in ${e?.base}`,n=e=>`在 ${e?.base} 開新的主智慧體`,r=((r,i={})=>(i.locale??e())===`zh-TW`?n(r):t(r));export{r as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{C as t,D as n,G as r,H as i,O as a,z as o}from"./index-DXzYIOEk.js";var s=((t={},n={})=>(n.locale??e())===`zh-TW`?`正在取得配對碼…`:`Asking for a pairing code…`),c=((t={},n={})=>(n.locale??e())===`zh-TW`?`未知的裝置`:`Unknown device`),l=e=>`Paired ${e?.paired} · last used ${e?.seen}`,u=e=>`配對於 ${e?.paired}・最後使用 ${e?.seen}`,d=((t,n={})=>(n.locale??e())===`zh-TW`?u(t):l(t)),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`沒有已配對的裝置。`:`No device is paired.`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`已配對的裝置`:`Paired devices`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`新的配對碼`:`New code`),h=((t={},n={})=>(n.locale??e())===`zh-TW`?`配對 QR code`:`Pairing QR code`),g=((t={},n={})=>(n.locale??e())===`zh-TW`?`用以本機使用者身分登入 Tailscale 的手機掃描。只能用一次,十分鐘內有效。`:`Scan it with a phone signed in to Tailscale as this machine's user. It works once, within ten minutes.`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`配對手機`:`Pair a phone`),v=((t={},n={})=>(n.locale??e())===`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.`),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`關閉遠端存取不會刪除已配對的裝置;要結束某個裝置的配對,請按它的「解除配對」。`:`Turning remote access off keeps the paired devices. Unpair a device to end its pairing.`),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`關閉遠端存取`:`Turn off remote access`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`開啟遠端存取`:`Turn on remote access`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`正在開啟遠端存取…`:`Turning remote access on…`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`解除配對`:`Unpair`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`全部解除配對`:`Unpair all`),T=e=>`Unpair ${e?.name}`,E=e=>`解除 ${e?.name} 的配對`,D=((t,n={})=>(n.locale??e())===`zh-TW`?E(t):T(t)),O=e=>e?new Date(e).toLocaleString([],{hour12:!1,dateStyle:`medium`,timeStyle:`short`}):r();function k(e){let r=n(`div`,{class:`devices`}),s=n(`p`,{class:`chat-empty`,role:`status`}),l=(e,t,r)=>{let i=n(`button`,{type:`button`,class:`later`,"aria-label":t},e);return i.onclick=()=>(i.disabled=!0,void r().finally(()=>(i.disabled=!1,void m()))),i},u=(e,n={})=>t(e,n).then(e=>e.ok?s.replaceChildren():s.replaceChildren(e.body.reason??o({status:e.status})),()=>s.replaceChildren(i()));async function m(){let o=await t(`remote/devices`,{}).catch(()=>void 0),m=o?.ok?o.body.devices:[];if(!o?.ok)return void r.replaceChildren(n(`p`,{class:`chat-empty`},o?.body.reason??i()));let h=m.map(e=>n(`li`,null,n(`span`,null,n(`b`,null,e.label||c()),n(`small`,null,d({paired:O(e.paired),seen:O(e.seen)}))),l(C(),D({name:e.label||c()}),()=>u(`remote/unpair`,{id:e.id})))),g=o.body.on===!0&&l(b(),b(),()=>u(`remote/off`).then(e));r.replaceChildren(...a(n(`h4`,null,p()),m.length?n(`ul`,null,...h):n(`p`,{class:`chat-empty`},f()),s,n(`div`,{class:`devices-acts`},m.length>1&&l(w(),w(),()=>u(`remote/unpair-all`)),g),g&&n(`small`,null,y())))}return m(),{box:r,refresh:m}}var A=`http://www.w3.org/2000/svg`;function j(e){let t=e.length,n=document.createElementNS(A,`svg`),r=document.createElementNS(A,`rect`),i=document.createElementNS(A,`path`);n.setAttribute(`viewBox`,`-4 -4 ${t+8} ${t+8}`),n.setAttribute(`class`,`qr`),n.setAttribute(`role`,`img`),n.setAttribute(`aria-label`,h());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 M(){return{id:`pair`,title:_(),body:()=>{let e=n(`div`,{class:`pair`}),r=n(`button`,{type:`button`,class:`later`},m()),a=n(`button`,{type:`button`,class:`pair-btn`},x()),c=(c=`remote/pair`,u=s())=>{e.replaceChildren(n(`p`,{class:`chat-empty`},u)),t(c,{}).then(t=>{l.refresh();let i=t.body.rows,s=String(t.body.url??``);if(t.body.error===`remote_off`)return e.replaceChildren(n(`p`,null,v()),a);if(!t.ok||!Array.isArray(i))return e.replaceChildren(n(`p`,null,t.body.reason??o({status:t.status})),c===`remote/on`?a:r);e.replaceChildren(j(i.map(String)),n(`p`,null,g()),n(`p`,null,n(`code`,null,new URL(s).host)),r)},()=>e.replaceChildren(n(`p`,null,i()),r))};a.onclick=()=>c(`remote/on`,S()),r.onclick=()=>c();let l=k(()=>e.replaceChildren(n(`p`,null,v()),a));return c(),n(`div`,{class:`pair`},e,l.box)}}}export{M as pairTile,j as square};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{C as t,D as n,H as r,z as i}from"./index-DXzYIOEk.js";var a=((t={},n={})=>(n.locale??e())===`zh-TW`?`只顯示前 500 個資料夾。`:`Showing the first 500 folders.`),o=((t={},n={})=>(n.locale??e())===`zh-TW`?`這裡沒有資料夾。`:`No folders here.`),s=((t={},n={})=>(n.locale??e())===`zh-TW`?`資料夾:`:`Folder:`),c=((t={},n={})=>(n.locale??e())===`zh-TW`?`新資料夾`:`New folder`),l=((t={},n={})=>(n.locale??e())===`zh-TW`?`新資料夾的名稱`:`Name of the new folder`),u=((t={},n={})=>(n.locale??e())===`zh-TW`?`上一步`:`Back`),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`桌面`:`Desktop`),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`文件`:`Documents`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`下一步`:`Forward`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`家目錄`:`Home`),h=((t={},n={})=>(n.locale??e())===`zh-TW`?`資料夾`:`Folders`),g=((t={},n={})=>(n.locale??e())===`zh-TW`?`路徑`:`Path`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`位置`:`Places`),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`最近`:`Recent`),y=(e,t)=>e===t?``:e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1),b=(e,t,n)=>(e.endsWith(n)?e:e+n)+t;function x({list:e,make:t}){let n=new Map,r=[],i=[],a=[],o=0,s=-1,c=``,l=`/`,u,d,f=0,p=()=>i.forEach(e=>e()),m=e=>{r[s]!==e&&(r.splice(s+1,r.length,e),s=r.length-1)},h=async t=>{let r=t===void 0?void 0:n.get(t);if(r)return r;let i=await e(t);return n.set(i.path,i),t!==void 0&&n.set(t,i),[c,l]=[i.home,i.sep],i},g=async e=>{let t=e.path===e.home||!e.path.startsWith(e.home)?[]:e.path.slice(e.home.length).split(e.sep).filter(Boolean),n=t.reduce((t,n)=>[...t,b(t.at(-1),n,e.sep)],[e.home]);return(await Promise.all(n.map(t=>t===e.path?e:h(t)))).map((e,n)=>({path:e.path,dirs:e.dirs,truncated:e.truncated,...t[n]!==void 0&&{pick:t[n]}}))};async function _(e,t=!0){let n=++f;try{let r=await h(e),i=await g(r);if(n!==f)return;[a,u,d]=[i,r.path,void 0],o=Math.max(0,a.length-2),t&&m(u)}catch(e){n===f&&(d=e.message)}p()}async function v(e,t){let n=b(a[e].path,t,l),r=++f;[a,o,u,d]=[[...a.slice(0,e+1).map((n,r)=>r===e?{...n,pick:t}:n)],e,n,void 0],p();try{let e=await h(n);if(r!==f)return;if(e.path!==n)return void await _(e.path);a=[...a,{path:e.path,dirs:e.dirs,truncated:e.truncated}],m(n)}catch(e){r===f&&(d=e.message)}p()}let x=e=>e>=0&&e<r.length?(s=e,_(r[s],!1)):Promise.resolve();return{state:()=>({path:u,home:c,sep:l,cols:a,focus:o,error:d,back:s>0,forward:s<r.length-1,crumbs:a.map((e,t)=>({path:e.path,name:t===0?``:y(e.path)}))}),on:e=>void i.push(e),start:e=>_(e),go:e=>_(e),pick:v,back:()=>x(s-1),forward:()=>x(s+1),async make(e){if(u!==void 0)try{let r=await t(u,e);n.delete(u),await _(r)}catch(e){d=e.message,p()}},async key(e){let t=a[o];if(!t)return!1;if(e===`Enter`)return u!==void 0&&`chosen`;if(e===`ArrowLeft`){if(o===0)return!0;let e=o-1;return[a,o,u]=[a.slice(0,o+1).map((e,t)=>t===o?{path:e.path,dirs:e.dirs,truncated:e.truncated}:e),e,a[o].path],m(u),p(),!0}if(e===`ArrowRight`){let e=a[o+1];return e?.dirs.length&&(o++,e.pick===void 0?await v(o,e.dirs[0]):p()),!0}if(!t.dirs.length)return!0;let n=t.pick===void 0?-1:t.dirs.indexOf(t.pick);return await v(o,t.dirs[Math.min(t.dirs.length-1,Math.max(0,e===`ArrowDown`?n+1:n<0?t.dirs.length-1:n-1))]),!0}}}var S=new Set([`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`,`Enter`]),C=e=>Error(e.body.reason??i({status:e.status}));function w(e,i,y){let b=x({list:async n=>{let i=await t(`dirs`,n?{path:n}:e).catch(()=>Promise.reject(Error(r())));return i.ok?i.body:Promise.reject(C(i))},make:async(e,n)=>{let i=await t(`dirs/new`,{path:e,name:n}).catch(()=>Promise.reject(Error(r())));return i.ok?i.body.path:Promise.reject(C(i))}}),w=n(`button`,{type:`button`,class:`later`,"aria-label":u(),title:u()},`←`),T=n(`button`,{type:`button`,class:`later`,"aria-label":p(),title:p()},`→`),E=n(`nav`,{class:`picker-crumbs`,"aria-label":g()}),D=n(`button`,{type:`button`,class:`later`},`+ ${c()}`),O=n(`input`,{type:`text`,maxlength:`255`,placeholder:l(),"aria-label":l()}),k=n(`div`,{class:`picker-places`,role:`group`,"aria-label":_()}),A=n(`div`,{class:`picker-cols`,tabindex:`0`,role:`group`,"aria-label":h()}),j=n(`code`,{class:`spawn-path`}),M=n(`p`,{class:`chat-empty`,role:`status`});O.hidden=!0;let N;b.on(()=>{let e=b.state();[w.disabled,T.disabled]=[!e.back,!e.forward],E.replaceChildren(...e.crumbs.map((t,r)=>{let i=n(`button`,{type:`button`,"aria-current":String(r===e.crumbs.length-1)},t.name||m());return[i.title,i.onclick]=[t.name||t.path,()=>void b.go(t.path)],i})),A.replaceChildren(...e.cols.map((t,r)=>{let i=t.dirs.map(e=>{let i=n(`button`,{type:`button`,class:`pitem`,role:`option`,tabindex:`-1`,"aria-selected":String(t.pick===e),title:e},e);return i.onclick=()=>(A.focus(),void b.pick(r,e)),i}),s=n(`div`,{class:`pcol`,role:`listbox`,"data-focus":String(r===e.focus)},...i,!t.dirs.length&&n(`p`,{class:`pempty`},o()),t.truncated&&n(`p`,{class:`pempty`},a())),c=i.find(e=>e.getAttribute(`aria-selected`)===`true`);return c&&requestAnimationFrame(()=>s.scrollTop=Math.max(0,c.offsetTop-s.clientHeight/2)),s})),requestAnimationFrame(()=>{let e=Math.max(1,Math.floor(A.clientWidth/176)),t=A.clientWidth/e,n=A.children.length;A.style.setProperty(`--pw`,`${t}px`),[A.scrollLeft,E.scrollLeft]=[Math.max(0,n-e)*t,E.scrollWidth]}),j.textContent=j.title=e.path??``,M.textContent=e.error??``,e.path!==void 0&&e.path!==N&&i(N=e.path,e.home)}),w.onclick=()=>void b.back(),T.onclick=()=>void b.forward();let P=()=>{if(O.hidden)return void(O.hidden=!1,O.focus());b.make(O.value).then(()=>{b.state().error||(O.value=``,O.hidden=!0,A.focus())})};return D.onclick=P,O.addEventListener(`keydown`,e=>e.key===`Enter`&&(e.preventDefault(),P())),O.addEventListener(`keydown`,e=>e.key===`Escape`&&O.value===``&&!O.hidden&&(e.stopPropagation(),O.hidden=!0,A.focus())),A.addEventListener(`keydown`,e=>{!S.has(e.key)||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.preventDefault(),b.key(e.key).then(e=>e===`chosen`&&y()))}),t(`dirs/places`,{}).then(e=>{if(!e.ok)return;let t=e.body,r=(e,t)=>{let r=n(`button`,{type:`button`,title:t},e);return r.onclick=()=>void b.go(t),r},i=e=>t.places.find(t=>t.name===e);k.replaceChildren(r(m(),t.home),...[`Desktop`,`Documents`].flatMap(e=>(t=>t?[r(e===`Desktop`?d():f(),t.path)]:[])(i(e))),...t.recent.length?[n(`b`,null,v()),...t.recent.map(e=>r(e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1),e))]:[])},()=>{}),b.start(),{picker:b,el:n(`div`,{class:`picker`},n(`div`,{class:`picker-bar`},w,T,E,D),O,n(`div`,{class:`picker-body`},k,A),n(`p`,{class:`spawn-at`},s(),` `,j),M)}}export{y as n,w as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./rolldown-runtime-DK3Fl9T5.js";import{t}from"./runtime-ZX6HkxDa.js";var n=e=>`Not started: ${e?.path} is over the ${e?.limit} KB limit. pi reads it whole when it starts. Make it smaller or remove it, then try again.`,r=e=>`沒有啟動:${e?.path} 超過 ${e?.limit} KB 的上限。pi 一啟動就會整個讀進去。請縮小或移除,再試一次。`,i=((e,i={})=>(i.locale??t())===`zh-TW`?r(e):n(e)),a=e=>`Not started: ${e?.path} is not a plain file (a device, pipe or socket, or a link to one). pi reads it whole when it starts and could hang. Make it a plain file or remove it, then try again.`,o=e=>`沒有啟動:${e?.path} 不是一般檔案(是裝置、管線或 socket,或連到這類檔案的連結)。pi 一啟動就會整個讀進去,可能卡住。請改成一般檔案或移除,再試一次。`,s=((e,n={})=>(n.locale??t())===`zh-TW`?o(e):a(e)),c=e=>`Not started: ${e?.path} could not be checked in time${e?.code}. pi reads it whole when it starts. Try again, or make it a plain file or remove it.`,l=e=>`沒有啟動:${e?.path} 在時限內沒能檢查完${e?.code}。pi 一啟動就會整個讀進去。請再試一次,或改成一般檔案或移除。`,u=((e,n={})=>(n.locale??t())===`zh-TW`?l(e):c(e)),d=e=>`Not started: ${e?.path} cannot be read${e?.code}. Fix it or remove it, then try again.`,f=e=>`沒有啟動:讀不到 ${e?.path}${e?.code}。請修好或移除,再試一次。`,p=((e,n={})=>(n.locale??t())===`zh-TW`?f(e):d(e)),m=e({reasonOf:()=>g}),h=e=>e.replace(/[\u0000-\u001f\u007f-\u009f]/g,``).replace(/\p{Cf}/gu,`�`),g=(e,t)=>{let n=t;if(!n)return e;let r=h(n.path);return n.why===`special`?s({path:r}):n.why===`large`?i({path:r,limit:String(Math.floor((n.limit??0)/1024))}):(n.why===`unchecked`?u:p)({path:r,code:n.code?` (${n.code})`:``})};export{m as n,g as t};
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};export{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=D(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(k(t)&&O.has(t)){let e=O.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=D(window.location.href));for(let t of c)if(t===`baseLocale`)continue;else if(k(t)&&O.has(t)){let n=O.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 _(){return 0}function v(e){return i}function y(e,t){return e.exec(t.href)}var b=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:^|;\\s*)${b}=([^;]*)`);function x(e){return S(e)}function S(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 C=-1,w,T;function E(e){if(i.length===0)return;let t=typeof e==`string`?e:e.href,n=_();if(w===t&&C===n)return T;let r=h(new URL(t,`http://example.com`)),a=x(r),o=a.href===r.href?[r]:[r,a],s;for(let e of o){for(let t of v(e))if(y(g(t.match,e),e)){s=t;break}if(s)break}return C=n,w=t,T=s,s}function D(e){let t=E(e);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:r}var O=new Map;function k(e){return typeof e==`string`&&/^custom-[A-Za-z0-9_-]+$/.test(e)}export{p as i,t as n,l as r,s as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";var t=((t={},n={})=>(n.locale??e())===`zh-TW`?`另一個答案正在送出;請查看終端機。`:`Another answer is on its way; check the terminal.`),n=((t={},n={})=>(n.locale??e())===`zh-TW`?`已回答。`:`Answered.`),r=((t={},n={})=>(n.locale??e())===`zh-TW`?`再次確認`:`Check again`),i=((t={},n={})=>(n.locale??e())===`zh-TW`?`未確認。請查看終端機。`:`Not confirmed. Check the terminal.`),a=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出中…`:`Sending…`);export{t as a,n as i,i as n,r,a as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{t}from"./refusal--wJ5SRx-.js";import{n,t as r}from"./picker-lrLxTm02.js";import{t as i}from"./open_main_title-Ccbha5pD.js";import{t as a}from"./trust-B4Mz7ezm.js";import{C as o,D as s,H as c,L as l,R as u,j as d,z as f}from"./index-DXzYIOEk.js";var p=((t={},n={})=>(n.locale??e())===`zh-TW`?`基地名稱`:`Base name`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`部署進度`:`Deployment progress`),h=((t={},n={})=>(n.locale??e())===`zh-TW`?`回到表單`:`Back to the form`),g=((t={},n={})=>(n.locale??e())===`zh-TW`?`建立基地`:`Create the base`),_=((t={},n={})=>(n.locale??e())===`zh-TW`?`分割窗格`:`Split a pane`),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`開啟分頁`:`Open a tab`),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`交付任務`:`Deliver the task`),b=e=>`Failed at “${e?.step}”.`,x=e=>`在「${e?.step}」失敗:`,S=((t,n={})=>(n.locale??e())===`zh-TW`?x(t):b(t)),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`加入稻草網`:`Join the Straw Net`),w=((t={},n={})=>(n.locale??e())===`zh-TW`?`基地`:`base`),T=((t={},n={})=>(n.locale??e())===`zh-TW`?`單位就緒`:`Unit ready`),E=((t={},n={})=>(n.locale??e())===`zh-TW`?`啟動智慧體`:`Start the agent`),D=e=>`No answer after ${e?.seconds} s. The unit may still open; check the map.`,O=e=>`${e?.seconds} 秒內沒有回應。單位可能仍會開好,請看地圖確認。`,k=((t,n={})=>(n.locale??e())===`zh-TW`?O(t):D(t)),A=e=>`Deploying ${e?.kind} · ${e?.name}`,j=e=>`部署${e?.kind} · ${e?.name}`,M=((t,n={})=>(n.locale??e())===`zh-TW`?j(t):A(t)),N=((t={},n={})=>(n.locale??e())===`zh-TW`?`等你確認是否信任這個資料夾`:`Waiting for your OK to trust this folder`),P=((t={},n={})=>(n.locale??e())===`zh-TW`?`第一句指令(選填)`:`First message (optional)`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`在這裡開基地`:`Open the base here`),I=((t={},n={})=>(n.locale??e())===`zh-TW`?`開新基地`:`New base`),L=((t={},n={})=>(n.locale??e())===`zh-TW`?`在這裡開主智慧體`:`Open the main here`),R=((t={},n={})=>(n.locale??e())===`zh-TW`?`加入成員`:`Add the member`),z=e=>`New member in squad ${e?.tab}`,B=e=>`在小隊 ${e?.tab} 加一位成員`,V=((t,n={})=>(n.locale??e())===`zh-TW`?B(t):z(t)),H=e=>`New member in ${e?.base}`,U=e=>`在 ${e?.base} 加一位成員`,W=((t,n={})=>(n.locale??e())===`zh-TW`?U(t):H(t)),G=((t={},n={})=>(n.locale??e())===`zh-TW`?`基地已經開好,第一位成員已就位。`:`The base is open with its first member.`),K=e=>`The main is open in a new squad of ${e?.base}.`,q=e=>`已在 ${e?.base} 的新小隊開好主智慧體。`,J=((t,n={})=>(n.locale??e())===`zh-TW`?q(t):K(t)),Y=e=>`The member is open in ${e?.base}.`,X=e=>`已在 ${e?.base} 加好成員。`,Z=((t,n={})=>(n.locale??e())===`zh-TW`?X(t):Y(t)),Q=500,$=12e4,ee={now:()=>Date.now(),every:(e,t)=>(e=>()=>clearInterval(e))(setInterval(e,t)),after:(e,t)=>(e=>()=>clearTimeout(e))(setTimeout(e,t))},te=e=>`${String(Math.floor(e/6e4)).padStart(2,`0`)}:${String(Math.floor(e/1e3)%60).padStart(2,`0`)}`,ne=e=>{let t=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`),n=document.createElementNS(`http://www.w3.org/2000/svg`,`use`);return n.setAttribute(`href`,`#i-${e}`),t.append(n),t},re=e=>[`create`,`start`,`join`,...e?[`deliver`]:[]];function ie(e){let n=e.clock??ee,r=`deploy-${crypto.randomUUID()}`,i=t=>({create:e.kind===`base`?g():e.split?_():v(),start:E(),trust:N(),join:C(),deliver:y()})[t],o=re(e.hasPrompt).map(e=>({id:e,state:`pending`,ms:0,since:0})),p=`running`,b=!1,x=!1,D=!1,O=``,A=()=>{},j=s(`span`,{class:`deploy-fill`}),P=s(`span`,{class:`deploy-count`}),F=s(`ol`,{class:`deploy-steps`}),I=s(`p`,{class:`deploy-note`,"aria-live":`polite`}),L=s(`button`,{type:`button`,class:`later`},h()),R=s(`h3`,{class:`deploy-title`},ne(e.kind===`main`?`main`:`member`),M({kind:e.kind===`base`?w():e.kind===`main`?u():l(),name:e.name})),z=s(`div`,{class:`deploy-trust`}),B=s(`div`,{class:`deploy`,role:`status`,"aria-label":m()},R,s(`div`,{class:`deploy-bar`},j),P,F,z,I,L),V;d.add(r);let H=t=>{if(!t)return void(V&&=(z.replaceChildren(),void 0));let n=!V;V||z.replaceChildren(V=a(t=>e.trust?.(t)??Promise.reject(Error(`no route`)))),V.update(t),n&&z.scrollIntoView?.({block:`end`,behavior:`smooth`})};L.onclick=()=>e.back();let U=new Map,W=()=>{let e=o.filter(e=>e.state===`done`).length;B.dataset.state=p,j.style.setProperty(`--done`,String(e)),j.style.setProperty(`--of`,String(o.length)),P.textContent=`${e}/${o.length}`,o.map(e=>e.id).join()!==[...U.keys()].join()&&(U.clear(),F.replaceChildren(...o.map(e=>{let t=s(`time`,{class:`deploy-time`}),n=s(`li`,{"data-step":e.id},s(`i`,{class:`deploy-mark`}),s(`span`,null,i(e.id)),t);return U.set(e.id,{li:n,at:t}),n})));for(let e of o){let t=U.get(e.id),r=e.state===`active`?n.now()-e.since:e.ms;t.li.dataset.state=e.state,t.at.textContent=e.state===`pending`||e.state===`done`&&r<1e3?``:te(r)}},G=k({seconds:$/1e3}),K=()=>o.some(e=>e.id===`trust`&&e.state===`active`)?(Z(),Z=n.after(K,$)):J(void 0,G),q=()=>(d.delete(r),X(),Z()),J=(e,t)=>{if(p!==`running`)return;p=`failed`,q(),D=e===void 0&&t===G;let r=o.find(t=>t.id===e)??o.find(e=>e.state===`active`)??o[0];o=o.map(e=>e===r?{...e,state:`failed`,ms:e.state===`active`?n.now()-e.since:e.ms}:e.state===`active`?{...e,state:`pending`}:e),I.setAttribute(`role`,`alert`),I.textContent=`${S({step:i(r.id)})} ${t}`,W(),L.focus?.()},Y=e=>{if(p===`running`){if(o=e.steps.map(e=>({id:e.id,state:e.state,ms:e.ms,since:n.now()-e.ms})),H(e.trust),e.failed)return J(e.failed.step,t(e.failed.reason,e.failed.settings));W()}},X=n.every(()=>{W(),!b&&(b=!0,e.progress(r).then(e=>{if(!e.ok||p!==`running`)return;let t=JSON.stringify(e.body);t!==O&&(O=t,Z(),Z=n.after(K,$)),Y(e.body)},()=>{}).finally(()=>b=!1))},Q),Z=n.after(K,$);return e.open(r).then(r=>{if(!(x||p!==`running`&&!(p===`failed`&&D&&r.ok))){if(!r.ok)return J(r.body.step,t(r.body.reason,r.body.settings)??f({status:r.status}));p=`ready`,q(),I.setAttribute(`role`,`status`),I.textContent=T(),o=o.map(e=>({...e,state:`done`,ms:e.state===`active`?n.now()-e.since:e.ms})),W(),e.chime?.(),A=n.after(()=>e.ready(r.body),matchMedia(`(prefers-reduced-motion: reduce)`).matches?600:1500)}},()=>J(void 0,c())),W(),Object.assign(B,{close:()=>(x=!0,q(),A())})}function ae(e,t,a){let c=e.kind===`base`?void 0:e.base,l=e.kind===`base`?void 0:e.tab,u=e.kind===`base`?I():e.kind===`main`?i({base:c.label}):l?V({tab:l.label}):W({base:c.label}),d=`open-${e.kind}-${c?.id??``}-${l?.id??``}`,f;return{id:d,title:u,closed:()=>f?.close(),body:()=>{let i=s(`button`,{type:`button`,class:`go`,disabled:``},e.kind===`base`?F():e.kind===`main`?L():R()),u=s(`textarea`,{rows:`3`,placeholder:P()}),m=s(`input`,{type:`text`,maxlength:`64`,placeholder:p(),"aria-label":p()}),h,g=``,_=!1;m.addEventListener(`input`,()=>_=!0);let v=r(c?{workspace:c.id,...l&&{tab:l.id}}:{},(e,t)=>{[h,g,i.disabled]=[e,t,!1],_||(m.value=n(e,t))},()=>(e.kind===`base`?m:u).focus());i.onclick=()=>{if(h===void 0)return;let r=h,i=u.value,s=m.value.trim()||n(r,g),p=e.kind===`base`?{dir:r,label:m.value,prompt:i}:{workspace:c.id,...l&&{tab:l.id},dir:r,prompt:i};x.replaceChildren(f=ie({kind:e.kind,split:e.kind===`member`&&!!l,hasPrompt:!!i.trim(),name:e.kind===`base`?s:n(r,g)||r,chime:a,open:t=>o(`open/${e.kind}`,{...p,deploy:t}),progress:e=>o(`open/progress`,{id:e}),trust:e=>o(`trust/answer`,e),back:()=>x.replaceChildren(...b),ready:n=>{if(u.value=m.value=``,_=!1,x.replaceChildren(...b),t&&typeof n.session==`string`)return t(n.workspace,n.session,d);y.textContent=e.kind===`base`?G():e.kind===`main`?J({base:c.label}):Z({base:c.label})}}))};let y=s(`p`,{class:`chat-empty`}),b=[v.el,...e.kind===`base`?[s(`label`,{class:`spawn-name`},p(),m)]:[],u,y,i],x=s(`div`,{class:`spawn`},...b);return x}}}function oe(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{oe as openingOf,ae as spawnTile};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{a as t,i as n,n as r,r as i,t as a}from"./sending-aEpvzoz2.js";import{D as o,p as s,z as c}from"./index-DXzYIOEk.js";var l=((t={},n={})=>(n.locale??e())===`zh-TW`?`信任後,智慧體會載入這個資料夾的設定、擴充、技能、提示、佈景主題與 MCP 伺服器,並安裝設定裡列出的套件。擴充與 MCP 伺服器會在這台電腦上當成程式執行。不認得來源的資料夾,請不要信任。`:`Trusting lets the agent load this folder's settings, extensions, skills, prompts, themes, and MCP servers, and install the packages its settings name. Extensions and MCP servers run as programs on this computer. Don't trust a folder you don't know the origin of.`),u=((t={},n={})=>(n.locale??e())===`zh-TW`?`問題已變動或已關閉,請重新閱讀。`:`The question changed or is closed; read it again.`),d=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個問題已關閉。`:`This question is closed.`),f=((t={},n={})=>(n.locale??e())===`zh-TW`?`問題顯示後資料夾又變了,所以沒有採用你的答案。請看新的問題再回答一次。`:`The folder changed after the question was shown, so your answer was not used. Read the new question and answer again.`),p=((t={},n={})=>(n.locale??e())===`zh-TW`?`會載入的內容`:`What it would load`),m=((t={},n={})=>(n.locale??e())===`zh-TW`?`代理在答案送達前已結束,沒有做任何決定。`:`The agent ended before the answer arrived; nothing was decided.`),h=e=>`and ${e?.count} more`,g=e=>`還有 ${e?.count} 項`,_=((t,n={})=>(n.locale??e())===`zh-TW`?g(t):h(t)),v=((t={},n={})=>(n.locale??e())===`zh-TW`?`不信任`:`Don't trust`),y=((t={},n={})=>(n.locale??e())===`zh-TW`?`只信任這一次`:`Trust this time`),b=((t={},n={})=>(n.locale??e())===`zh-TW`?`已在終端機回答。`:`Answered in the terminal.`),x=((t={},n={})=>(n.locale??e())===`zh-TW`?`智慧體的終端機也可以回答,以先到的答案為準。`:`The agent's terminal can answer too; the first answer counts.`),S=((t={},n={})=>(n.locale??e())===`zh-TW`?`信任這個資料夾`:`Trust`),C=((t={},n={})=>(n.locale??e())===`zh-TW`?`讀不出來`:`could not be read`),w=e=>`${e?.count} agents`,T=e=>`${e?.count} 個智慧體`,E=((t,n={})=>(n.locale??e())===`zh-TW`?T(t):w(t)),D=e=>`${e?.role} in ${e?.base}`,O=e=>`${e?.base}的${e?.role}`,k=((t,n={})=>(n.locale??e())===`zh-TW`?O(t):D(t)),A=5,j=[[`trust`,S],[`once`,y],[`no`,v]],M=e=>e.agents.length===1?k({role:e.agents[0].role===`none`?s(`session`):s(e.agents[0].role),base:e.agents[0].base||`?`}):E({count:e.agents.length});function N(e){let i=e?.body.outcome;return i===`accepted`?{tone:`ok`,text:n(),done:!0,again:!1}:i===`stale`?{tone:`error`,text:e?.body.by===`gone`?m():e?.body.by===`changed`?f():b(),done:!0,again:!1}:i===`busy`?{tone:`error`,text:t(),done:!0,again:!1}:i===`unknown`||e?.status===504||!e?{tone:`error`,text:r(),done:!0,again:!0}:e.status===409?{tone:`error`,text:u(),done:!0,again:!1}:{tone:`error`,text:String(e.body.reason??c({status:e.status})),done:!1,again:!1}}function P(e,t){let n=o(`p`,{class:`ask-note`,role:`status`,"aria-live":`polite`}),r=o(`div`,{class:`trust-found`}),s=o(`p`,{class:`trust-folder`}),c=j.map(([e,t])=>Object.assign(o(`button`,{type:`button`,class:e===`trust`?`ask-send`:`cmp-alt`,"data-choice":e},t()),{choice:e})),u=o(`section`,{class:`ask trust`},s,o(`p`,{class:`ask-why`},l()),o(`h4`,null,p()),r,o(`div`,{class:`ask-acts`},...c),o(`p`,{class:`ask-term`},x()),n),f,m=!0,h=!1,g=!1,v=!1,y=()=>c.forEach(e=>e.disabled=!f||!m||h||g),b=(e,t,...r)=>(n.dataset.tone=e,n.replaceChildren(t,...r));async function S(n,r){if(!f)return;[g,h]=[!0,!1],y(),b(``,a());let s=await e({id:f.id,digest:f.digest,choice:n,answerId:r}).catch(()=>void 0),c=N(s);g=!1,h=c.done;let l=o(`button`,{type:`button`,class:`cmp-link`},i());l.onclick=()=>void S(n,r),v=s?.body.by===`changed`,b(c.tone,c.text,...c.again?[l]:[]),y(),t&&s?.body.outcome===`accepted`&&setTimeout(t,1200)}for(let e of c)e.onclick=()=>void S(e.choice,crypto.randomUUID().replaceAll(`-`,``));let w=e=>r.replaceChildren(...e.found.map(e=>{let t=Math.max(0,e.items.length-A)+e.more;return o(`div`,{class:`trust-group`},o(`b`,null,e.path),e.unreadable?o(`small`,null,C()):o(`ul`,null,...e.items.slice(0,A).map(e=>o(`li`,null,e)),t>0&&o(`li`,{class:`trust-more`},_({count:t}))))}));return Object.assign(u,{update(e,t=!0){m=t,e&&(e.id!==f?.id||e.digest!==f.digest)&&(s.replaceChildren(e.folder),w(e),h=!1,v?v=!1:b(``,``)),f=e??f,!e&&!h&&(b(`error`,d()),h=!0),y()}})}export{M as n,P as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{t}from"./registry-Bx4Ukv2M.js";var n=((t={},n={})=>(n.locale??e())===`zh-TW`?`網外`:`Outside the net`),r=e=>{let n=t(`en`,e?.count,{},!0);return n===`one`?`${e?.count} unit`:n===`other`?`${e?.count} units`:`unit_count`},i=e=>`${e?.count} 個單位`,a=((t,n={})=>(n.locale??e())===`zh-TW`?i(t):r(t));export{n,a as t};
@@ -0,0 +1,7 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-D9X5KUWx.css"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./runtime-ZX6HkxDa.js";import{t}from"./sending-aEpvzoz2.js";import{n,t as r}from"./ask-87CEae19.js";import{t as i}from"./registry-Bx4Ukv2M.js";import{t as a}from"./open_main_title-Ccbha5pD.js";import{n as o,t as s}from"./unit_count-DTUtsZm9.js";import{$ as c,B as l,C as u,D as d,F as f,H as p,I as m,Q as h,S as g,V as _,W as v,X as y,Z as b,_ as x,a as S,c as C,d as w,et as ee,f as T,g as E,h as D,i as O,k as te,l as k,m as A,o as j,p as M,r as ne,t as N,tt as re,v as P,w as ie,z as ae}from"./index-DXzYIOEk.js";var oe=((t={},n={})=>(n.locale??e())===`zh-TW`?`附加檔案`:`Attach files`),F=((t={},n={})=>(n.locale??e())===`zh-TW`?`返回`:`Back`),I=e=>`This is a ${e?.agent} session. It is in the net, but this page cannot type into it or show its log: use its own terminal.`,se=e=>`這是 ${e?.agent} 工作階段。它在 net 裡,但這個頁面無法對它輸入,也看不到它的紀錄,請到它自己的終端機操作。`,ce=((t,n={})=>(n.locale??e())===`zh-TW`?se(t):I(t)),le=((t={},n={})=>(n.locale??e())===`zh-TW`?`它在等待對話框:請在上方或它的終端機中回答。`:`It waits on a dialog: answer it above, or in its terminal.`),ue=((t={},n={})=>(n.locale??e())===`zh-TW`?`它在等待對話框;請在它的終端機中回答。`:`It waits on a dialog; answer it in its terminal.`),de=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個 session 已不再即時;紀錄仍可閱讀。`:`This session is no longer live; its history stays readable.`),fe=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個單位沒有即時的 pi 窗格,無處可輸入。`:`No live pi pane backs this unit, so there is nothing to type into.`),pe=((t={},n={})=>(n.locale??e())===`zh-TW`?`串流中斷;要等它恢復才能送出。`:`The stream is down; sending waits for it to come back.`),me=((t={},n={})=>(n.locale??e())===`zh-TW`?`頻道關閉`:`channel closed`),he=((t={},n={})=>(n.locale??e())===`zh-TW`?`頻道開啟`:`channel open`),ge=((t={},n={})=>(n.locale??e())===`zh-TW`?`指令`:`Commands`),_e=((t={},n={})=>(n.locale??e())===`zh-TW`?`通訊`:`comms`),ve=((t={},n={})=>(n.locale??e())===`zh-TW`?`已派出`:`Dispatched`),ye=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法取得:已不在它的 session 中開啟。`:`Unavailable: no longer open in its session.`),be=((t={},n={})=>(n.locale??e())===`zh-TW`?`已不在清單中:已在它的 session 中關閉,或 session 已結束。`:`No longer listed: closed in its session, or the session ended.`),xe=((t={},n={})=>(n.locale??e())===`zh-TW`?`已更新:此區塊顯示時會載入新版本。`:`Updated: the new version loads when this tile shows.`),Se=((t={},n={})=>(n.locale??e())===`zh-TW`?`超過轉送上限:請在終端機中閱讀。`:`More than the relay carries: read them in the terminal.`),Ce=((t={},n={})=>(n.locale??e())===`zh-TW`?`再取一次`:`Fetch again`),we=((t={},n={})=>(n.locale??e())===`zh-TW`?`已經沒有排隊的訊息了:它們已送達,或在終端機的輸入框裡。`:`Nothing is queued any more: the messages were delivered, or they are in the terminal’s editor.`),Te=((t={},n={})=>(n.locale??e())===`zh-TW`?`排隊中的訊息已放進輸入框,改完再送出。`:`The queued messages are in the box. Edit them and send.`),Ee=((t={},n={})=>(n.locale??e())===`zh-TW`?`正在取回排隊中的訊息…`:`Taking the queued messages back…`),De=((t={},n={})=>(n.locale??e())===`zh-TW`?`未確認。若訊息已被取回,請再取一次;否則它們仍在終端機裡。`:`Not confirmed. If the messages were taken back, fetch them again; otherwise they are still in the terminal.`),Oe=e=>`${e?.command} ends this session or switches its pane to another one.`,ke=e=>`${e?.command} 會結束這個 session,或把它的窗格切換到別的 session。`,Ae=((t,n={})=>(n.locale??e())===`zh-TW`?ke(t):Oe(t)),je=e=>{let t=i(`en`,e?.count,{},!0);return t===`one`?`${e?.count} entry`:t===`other`?`${e?.count} entries`:`entry_count`},Me=e=>`${e?.count} 筆`,Ne=((t,n={})=>(n.locale??e())===`zh-TW`?Me(t):je(t)),Pe=e=>`${e?.name} is larger than 20 MB.`,Fe=e=>`${e?.name} 超過 20 MB。`,Ie=((t,n={})=>(n.locale??e())===`zh-TW`?Fe(t):Pe(t)),Le=((t={},n={})=>(n.locale??e())===`zh-TW`?`做完再送`:`After this`),Re=((t={},n={})=>(n.locale??e())===`zh-TW`?`資料`:`Info`),ze=((t={},n={})=>(n.locale??e())===`zh-TW`?`載入中…`:`Loading…`),Be=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個工作區不在網中。`:`This workspace is not part of the net.`),Ve=((t={},n={})=>(n.locale??e())===`zh-TW`?`訊息`:`Message`),He=e=>`exit ${e?.code}`,Ue=e=>`結束碼 ${e?.code}`,We=((t,n={})=>(n.locale??e())===`zh-TW`?Ue(t):He(t)),Ge=e=>`${e?.count} lines`,Ke=e=>`${e?.count} 行`,qe=((t,n={})=>(n.locale??e())===`zh-TW`?Ke(t):Ge(t)),Je=((t={},n={})=>(n.locale??e())===`zh-TW`?`完成`:`finished`),Ye=((t={},n={})=>(n.locale??e())===`zh-TW`?`出錯`:`failed`),Xe=((t={},n={})=>(n.locale??e())===`zh-TW`?`執行中`:`running`),Ze=((t={},n={})=>(n.locale??e())===`zh-TW`?`太久沒輸出,已停止`:`no output, stopped`),Qe=((t={},n={})=>(n.locale??e())===`zh-TW`?`已停止`:`stopped`),$e=e=>`${e?.count} failed`,et=e=>`${e?.count} 個出錯`,tt=((t,n={})=>(n.locale??e())===`zh-TW`?et(t):$e(t)),nt=e=>`${e?.count} running`,rt=e=>`${e?.count} 個執行中`,it=((t,n={})=>(n.locale??e())===`zh-TW`?rt(t):nt(t)),at=((t={},n={})=>(n.locale??e())===`zh-TW`?`Monitor`:`Monitors`),ot=((t={},n={})=>(n.locale??e())===`zh-TW`?`新的 session`:`the new session`),st=((t={},n={})=>(n.locale??e())===`zh-TW`?`無頻道`:`no channel`),ct=((t={},n={})=>(n.locale??e())===`zh-TW`?`不在網中`:`not in the net`),lt=((t={},n={})=>(n.locale??e())===`zh-TW`?`已不再即時;紀錄在十分鐘內仍可閱讀。`:`No longer live; its history stays readable for ten minutes.`),ut=((t={},n={})=>(n.locale??e())===`zh-TW`?`不在網中(可能已在十分鐘前結束)。`:`Not in the net (it may have ended more than ten minutes ago).`),dt=((t={},n={})=>(n.locale??e())===`zh-TW`?`不在終端機畫面上`:`off screen in the terminal`),ft=e=>`${e?.reason} · off screen`,pt=e=>`${e?.reason} · 不在畫面上`,mt=((t,n={})=>(n.locale??e())===`zh-TW`?pt(t):ft(t)),ht=((t={},n={})=>(n.locale??e())===`zh-TW`?`在新分頁開啟`:`Open in a new tab`),gt=((t={},n={})=>(n.locale??e())===`zh-TW`?`正在開啟頻道…`:`Opening the channel…`),_t=((t={},n={})=>(n.locale??e())===`zh-TW`?`未編入的 pi 窗格`:`unaligned pi panes`),vt=e=>`Message ${e?.name}`,yt=e=>`傳訊息給 ${e?.name}`,bt=((t,n={})=>(n.locale??e())===`zh-TW`?yt(t):vt(t)),xt=((t={},n={})=>(n.locale??e())===`zh-TW`?`編輯`:`Edit`),St=((t={},n={})=>(n.locale??e())===`zh-TW`?`排隊中的訊息會全部取回,插話與做完再送併成一段文字;已經送達的那則收不回來。`:`All queued messages come back together, steers and follow-ups merged into one text. One already delivered can’t be recalled.`),Ct=((t={},n={})=>(n.locale??e())===`zh-TW`?`排隊中・做完再送`:`Queued · follow-up`),wt=((t={},n={})=>(n.locale??e())===`zh-TW`?`排隊中・插話`:`Queued · steer`),Tt=((t={},n={})=>(n.locale??e())===`zh-TW`?`重新載入`:`Reload`),Et=((t={},n={})=>(n.locale??e())===`zh-TW`?`送出`:`Send`),Dt=e=>`Send ${e?.command}`,Ot=e=>`送出 ${e?.command}`,kt=((t,n={})=>(n.locale??e())===`zh-TW`?Ot(t):Dt(t)),At=((t={},n={})=>(n.locale??e())===`zh-TW`?`已照原文送出;你的修改留在這裡,尚未送出。`:`Sent as it was; your edits stayed here, unsent.`),jt=e=>`${e?.display}, shown by ${e?.unit}`,Mt=e=>`${e?.display},由 ${e?.unit} 顯示`,Nt=((t,n={})=>(n.locale??e())===`zh-TW`?Mt(t):jt(t)),Pt=((t={},n={})=>(n.locale??e())===`zh-TW`?`基地`:`base`),Ft=((t={},n={})=>(n.locale??e())===`zh-TW`?`上下文`:`context`),It=((t={},n={})=>(n.locale??e())===`zh-TW`?`目錄`:`directory`),Lt=((t={},n={})=>(n.locale??e())===`zh-TW`?`啟動者`:`launcher`),Rt=((t={},n={})=>(n.locale??e())===`zh-TW`?`模型`:`model`),zt=((t={},n={})=>(n.locale??e())===`zh-TW`?`小隊`:`squad`),Bt=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法讀取`:`unreadable`),Vt=e=>`squad ${e?.label}`,Ht=e=>`小隊 ${e?.label}`,Ut=((t,n={})=>(n.locale??e())===`zh-TW`?Ht(t):Vt(t)),Wt=((t={},n={})=>(n.locale??e())===`zh-TW`?`小隊`:`Squads`),Gt=((t={},n={})=>(n.locale??e())===`zh-TW`?`停止`:`Stop`),Kt=((t={},n={})=>(n.locale??e())===`zh-TW`?`要停止目前的任務嗎?佇列中的訊息會退回它的終端機編輯器。`:`Stop the current task? Queued messages go back to its terminal editor.`),qt=((t={},n={})=>(n.locale??e())===`zh-TW`?`現在:`:`Now:`),Jt=((t={},n={})=>(n.locale??e())===`zh-TW`?`它在等待對話框:請在終端機中回答。`:`It is waiting on a dialog: answer it in the terminal.`),Yt=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個 session 上還有另一個輸入在途中。`:`Another input to this session is still on its way.`),Xt=((t={},n={})=>(n.locale??e())===`zh-TW`?`終端機的輸入框裡除了排隊中的訊息與草稿,還有其他內容(期間有人輸入,或 pi 展開了訊息)。訊息在輸入框裡,請查看終端機。`:`The terminal’s editor holds something other than the queued messages and the draft (typed meanwhile, or a message pi expanded). The messages are in it; check the terminal.`),Zt=((t={},n={})=>(n.locale??e())===`zh-TW`?`它在等待連結請求時,配對裝置只能送出 Escape。請在這台電腦的頁面或終端機核准。`:`While it waits on a link request, a paired device can only send Escape. Approve it on this computer’s own page or terminal.`),Qt=((t={},n={})=>(n.locale??e())===`zh-TW`?`這個 session 沒有輸入框,無法把訊息取回。`:`This session has no editor to take the messages back into.`),$t=((t={},n={})=>(n.locale??e())===`zh-TW`?`pi 的取回按鍵(keybindings.json 裡的 app.message.dequeue)不是這個頁面能送出的按鍵。請在終端機裡按。`:`pi’s dequeue key (app.message.dequeue in its keybindings.json) is not one this page can send. Press it in the terminal.`),en=((t={},n={})=>(n.locale??e())===`zh-TW`?`無法清掉終端機輸入框裡的訊息。它們在那裡,不在這裡。`:`The messages could not be cleared from the terminal’s editor. They are there, not here.`),tn=e=>`pi did not take its queue back; its dequeue key may not be ${e?.key}. Check the terminal.`,nn=e=>`pi 沒有取回它的佇列;它的取回按鍵可能不是 ${e?.key}。請查看終端機。`,rn=((t,n={})=>(n.locale??e())===`zh-TW`?nn(t):tn(t)),an=((t={},n={})=>(n.locale??e())===`zh-TW`?`一次按太多鍵了。請一秒後再試。`:`Too many keys at once. Try again in a second.`),on=((t={},n={})=>(n.locale??e())===`zh-TW`?`取回逾時,或按鍵送出後 session 已有變動:訊息在終端機的輸入框裡,不在這裡。`:`The take-back timed out, or the session changed, after the key went: the messages are in the terminal’s editor, not here.`),sn=((t={},n={})=>(n.locale??e())===`zh-TW`?`排隊中的訊息太長,帶不回這裡。它們在終端機的輸入框裡。`:`The queued messages are too long to bring here. They are in the terminal’s editor.`),cn=((t={},n={})=>(n.locale??e())===`zh-TW`?`已完成`:`done`),ln=((t={},n={})=>(n.locale??e())===`zh-TW`?`未完成`:`not done`),un=((t={},n={})=>(n.locale??e())===`zh-TW`?`終端機`:`Terminal`),dn=e=>`Todos ${e?.done}/${e?.total}`,fn=e=>`待辦 ${e?.done}/${e?.total}`,pn=((t,n={})=>(n.locale??e())===`zh-TW`?fn(t):dn(t)),mn=((t={},n={})=>(n.locale??e())===`zh-TW`?`全部完成`:`All done`),hn=e=>`${e?.count} tokens`,gn=e=>`${e?.count} tokens`,_n=((t,n={})=>(n.locale??e())===`zh-TW`?gn(t):hn(t)),vn=((t={},n={})=>(n.locale??e())===`zh-TW`?`文字超過 16 KB,請縮短。`:`The text is longer than 16 KB; shorten it.`),yn=((t={},n={})=>(n.locale??e())===`zh-TW`?`下屬`:`Under this tower`),bn=((t={},n={})=>(n.locale??e())===`zh-TW`?`單位檔案`:`unit dossier`),xn=((t={},n={})=>(n.locale??e())===`zh-TW`?`單位`:`Units`),L=((t={},n={})=>(n.locale??e())===`zh-TW`?`未確認。再次送出前請先查看終端機。`:`Not confirmed. Check the terminal before sending again.`),Sn=((t={},n={})=>(n.locale??e())===`zh-TW`?`上傳中…`:`Uploading…`),Cn=((t={},n={})=>(n.locale??e())===`zh-TW`?`等待網的資料…`:`Waiting for the net…`),wn=((t={},n={})=>(n.locale??e())===`zh-TW`?`原文已送到 session;這裡是你編輯過、尚未送出的副本。`:`The original already went to the session; what is here is your edited copy, unsent.`),R=(e,t,n)=>({tag:e,kids:t,attrs:n}),Tn=/^(?:https?:\/\/|mailto:)[^\s\u0000-\u001f]+$/i,En=(e,t)=>R(`a`,t,{href:e,rel:`noopener noreferrer`,target:`_blank`}),Dn=/(`+)([^`]|[^`][^]{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 z(e){let t=[],n=0;for(let r of e.matchAll(Dn))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(R(`em`,z(r[5]??r[6]))):r[7]===void 0?t.push(En(r[9],[r[9]])):t.push(Tn.test(r[8])?En(r[8],z(r[7])):r[0]):t.push(R(`del`,z(r[4]))):t.push(R(`strong`,z(r[3]))):t.push(R(`code`,[r[2]]));return n<e.length&&t.push(e.slice(n)),t}var On=e=>e.search(/\S/),B=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,kn=/^\s*([-*_])(\s*\1){2,}\s*$/,An=/^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?\s*$/,jn=e=>e.trim().replace(/^\|/,``).replace(/\|$/,``).split(`|`).map(e=>e.trim()),Mn=(e,t)=>/^\s*(`{3,}|~{3,}|#{1,6}\s|>)/.test(e)||kn.test(e)||B.test(e)||e.includes(`|`)&&t!==void 0&&An.test(t)&&t.includes(`-`);function V(e,t=0,n=e.replace(/\r\n?/g,`
3
+ `).split(`
4
+ `),r=n.map(On)){if(t>=16)return[R(`p`,[n.join(`
5
+ `)])];let i=[];for(let e=0;e<n.length;){let a=n[e],o=n[e+1],s=a.match(/^\s*(`{3,}|~{3,})\s*([\w+-]*)/),c=a.match(/^\s*(#{1,6})\s+(.*?)\s*#*\s*$/),l=a.match(B);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(R(`pre`,[R(`code`,[t.join(`
6
+ `)],s[2]?{"data-lang":s[2]}:void 0)]))}else if(c)i.push(R(`h${c[1].length}`,z(c[2]))),e++;else if(kn.test(a))i.push(R(`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(R(`blockquote`,V(``,t+1,r,r.map(On))))}else if(a.includes(`|`)&&o!==void 0&&An.test(o)&&o.includes(`-`)){let t=[];for(e+=2;e<n.length&&n[e].trim()&&n[e].includes(`|`);e++)t.push(jn(n[e]));i.push(R(`table`,[R(`thead`,[R(`tr`,jn(a).map(e=>R(`th`,z(e))))]),R(`tbody`,t.map(e=>R(`tr`,e.map(e=>R(`td`,z(e))))))]))}else if(l){let a=l[1].length,o=[],s=a+2;for(;e<n.length;){let i=n[e].match(B);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=[On(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=V(``,t+1,c,d),p=f[0],m=u?.[1]!==` `;u&&(typeof p==`object`&&p.tag===`p`?p.kids:f).unshift(R(`i`,m?[`✓`]:[],{class:`check`,"data-done":String(m),"aria-label":m?cn():ln()})),o.push(R(`li`,f,u?{class:`task`}:void 0)),!n[e]?.trim()&&n[e+1]?.match(B)?.[1]?.length===a&&e++}i.push(R(/\d/.test(l[2])?`ol`:`ul`,o))}else{let t=[a];for(e++;e<n.length&&n[e].trim()&&!Mn(n[e],n[e+1]);e++)t.push(n[e]);i.push(R(`p`,z(t.join(`
7
+ `))))}}return i}function Nn(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 Pn=`allow-forms allow-popups allow-popups-to-escape-sandbox`,Fn={},H=new Map;function In(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 Ln=(e,t,n)=>e?.find(e=>In(e.display,t)===In(n,t));function Rn(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 U=(e,t,n=``)=>(e.state.dataset.tone=n,e.state.textContent=t),zn=(e,t)=>(e.failed=!0,U(e,t,`error`)),Bn=e=>Fn.src?.(e)??`doc/${encodeURIComponent(e)}/`;function Vn(e){if([e.loaded,e.failed]=[e.card.revision,!1],U(e,``),e.frame)return void(e.frame.src=Bn(e.card.cap));let t=e.card.cap,r=/\.(md|markdown)$/i.test(e.card.display),i=++e.seq;(Fn.load?.(t)??fetch(`api/doc/${encodeURIComponent(t)}`,{cache:`no-store`}).then(e=>e.ok?e.json():void 0)).then(t=>e.seq!==i||(t?e.body.replaceChildren(r?d(`div`,{class:`md`},Nn(V(t.text))):d(`pre`,{class:`doc-pre`},t.text)):zn(e,ye())),()=>e.seq!==i||zn(e,n()))}function Hn(e,t){let n=H.get(t.cap);if(n)return n.tile;let r=t.display.split(`/`).pop()||t.display,i=t.kind===`html`?d(`iframe`,{class:`doc-frame`,sandbox:Pn,referrerpolicy:`no-referrer`,title:Nt({display:t.display,unit:e})}):void 0,a=d(`button`,{type:`button`,class:`cmp-link`},Tt()),o=i&&d(`a`,{class:`cmp-link`,href:Bn(t.cap),target:`_blank`,rel:`noopener noreferrer`},ht()),s=i??d(`div`,{class:`doc-text`},d(`p`,{class:`chat-empty`},ze())),c=d(`span`,{class:`term-state`,role:`status`}),l=d(`em`,{class:`doc-off`},dt()),u=d(`div`,{class:`doc-tile`},d(`div`,{class:`term-bar doc-bar`},d(`span`,{class:`doc-why`},t.reason),l,c,d(`span`,{class:`doc-acts`},a,o)),s),f=new IntersectionObserver(([e])=>(m.shown=!!e?.isIntersecting,m.shown&&!m.gone&&(m.failed||m.loaded!==m.card.revision)&&Vn(m))),p={id:`doc:${t.cap}`,title:`${r} · ${e}`,icon:`i-doc`,body:()=>u,closed:()=>(H.delete(t.cap),f.disconnect())},m={card:t,tile:p,loaded:0,seq:0,shown:!1,gone:!1,body:s,state:c,off:l,...i&&{frame:i}};return a.onclick=()=>!m.gone&&Vn(m),l.hidden=t.onScreen,f.observe(u),Vn(m),H.set(t.cap,m),p}function Un(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.tower.subs]:[],...[...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 Rn(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);Wn(i)}function Wn(e){for(let t of H.values()){let n=e.get(t.card.cap);if(!n){t.gone||U(t,be(),`error`),t.gone=!0;continue}let r=t.gone&&(U(t,``),t.failed);[t.card,t.gone,t.off.hidden]=[n,!1,n.onScreen],(n.revision!==t.loaded||r)&&(t.shown?Vn(t):n.revision!==t.loaded&&U(t,xe()))}}function Gn(e,t,n,r){e.hidden=!t?.length&&!n,e.querySelector(`.d-doc-list`).replaceChildren(...(t??[]).map(e=>{let t=d(`button`,{type:`button`,class:`d-doc`,title:e.reason},d(`b`,null,e.display),d(`small`,null,e.onScreen?e.reason:mt({reason:e.reason})));return t.onclick=()=>r(e),t})),e.querySelector(`.d-docs-cut`).hidden=!n}var W=e=>e.route.view===`map`?``:e.route.ws;function G(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:n.tower.subs},base:n};for(let[e,r]of[...n.tabs.map(e=>[e.label,e.units]),[void 0,n.outside],[void 0,n.tower?.subs??[]]])for(let i of r){if(i.key===t)return{u:i,base:n,squad:e};let r=i.subs.find(e=>e.key===t);if(r)return{u:r,base:n,squad:e,launcher:i}}}}var Kn=e=>e?.u.role===`tower`&&e.base.tower?.key===e.u.key?e.base:void 0,qn=(e,t)=>(t?t!==`live`:!e)||!(!e?.ended||e.control);function Jn(e){if(e.route.view!==`session`)return;let t=e.route.key,n=G(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 K=()=>w(`<a class="token">${O}<span class="name"></span><span class="line"><em class="role"></em><em class="agent"></em><span class="note"></span></span></a>`);function q(e,t,n){S(e,t.key?{view:`session`,ws:n,key:t.key}:void 0),e.toggleAttribute(`hidden`,!1),e.toggleAttribute(`data-alert`,!!t.key&&x(t.mark)),T(e,t.mark),k(e.querySelector(`.plate`),t.role,t.mark,t.docs),E(e,`.name`,t.name),E(e,`.role`,M(t.role)),E(e,`.agent`,t.agent?N[t.agent]:``),A(e,`.note`,t.note,t.mark)}var J=(e,t)=>{let n=document.createElement(`a`);return S(n,e),n.textContent=t,n},Yn=()=>`<div class="dossier-in"><span class="tag">${bn()}</span><button class="x d-x" type="button" aria-label="${c()}">×</button><div class="portrait">${O}</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>${b()}</h4><div class="d-doc-list"></div><p class="d-docs-cut" hidden>${Se()}</p></div><div class="d-drones" hidden><h4>${ve()}</h4><div class="formation"></div></div><div class="d-squads" hidden><h4>${yn()}</h4><div class="d-squad-list"></div></div></div>`,Xn=e=>e.classList.add(`drone`);function Zn(e,t,{openTile:n,fullScreen:r}){return function({key:i,hit:a,u:o,mk:s,state:c,name:l}){e.firstElementChild||(e.append(w(Yn())),e.querySelector(`.d-x`).onclick=()=>r(!1));let u=e.firstElementChild,{net:d,info:f,model:p,ctx:m}=t,h=W(t);T(u,s),k(u.querySelector(`.plate`),o?.role??f?.role??`member`,s),E(u,`h3`,l),E(u,`.role`,M(o?.role??f?.role??`session`)),A(u,`.state`,o?.note,s,o?void 0:ct());let g=u.querySelector(`.d-note`);g.hidden=c!==`recent`&&c!==`unknown`,g.replaceChildren(c===`unknown`?ut():lt()),f?.successor&&g.append(` ${qt()} `,J({view:`session`,ws:h,key:f.successor},G(d,f.successor)?.u.name??ot()));let _=[[Rt(),p],[Ft(),m?_n({count:m.toLocaleString()}):void 0],[It(),f?.header?.cwd],[Pt(),a&&J({view:`workspace`,ws:a.base.id},a.base.label)],[zt(),a?.squad],[Lt(),a?.launcher&&J({view:`session`,ws:a.base.id,key:a.launcher.key},a.launcher.name)],[Bt(),f?.unreadable?Ne({count:f.unreadable}):void 0]];u.querySelector(`.specs`).replaceChildren(..._.filter(([,e])=>e).map(([e,t])=>{let n=w(`<div><dt></dt><dd></dd></div>`);return n.firstElementChild.textContent=e,n.lastElementChild.append(t),n})),Gn(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,D(v.querySelector(`.formation`),(o?.subs??[]).map(e=>({...e,id:e.key})),K,(e,t)=>(Xn(e),q(e,t,h)));let y=u.querySelector(`.d-squads`),b=o?.role===`tower`?a?.base:void 0;y.hidden=!b?.tabs.length,D(y.querySelector(`.d-squad-list`),b?.tabs??[],()=>w(`<div class="d-squad"><small></small><div class="formation"></div></div>`),(e,t)=>(E(e,`small`,Ut({label:t.label})),D(e.querySelector(`.formation`),t.units.flatMap(e=>[e,...e.subs]).map(e=>({...e,id:e.key})),K,(e,t)=>(Xn(e),q(e,t,b.id)))))}}function Qn(e){let t=(e,t,n)=>{let r=document.createElement(e);return r.textContent=t,n&&S(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`,re()));let o=i?.bases.find(e=>e.id===r.ws)?.label??r.ws,s=r.view===`session`?G(i,r.key)?.u.name??a?.name??r.key:``,c=[];for(let e=r.view===`session`?G(i,r.key):void 0,t=0;e?.launcher&&t<8;e=G(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 $n(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`),te(a,i),setTimeout(()=>a.classList.remove(i),700)}}var er=new Map;function tr(e,t,n=``){let r=e.querySelector(`.queue-list`);if(!r)return;r.hidden=!t?.length;let i=e.querySelector(`.queue-act`);i&&(i.hidden=!t?.length);let a=e=>Object.assign(document.createElement(`b`),{textContent:e.as===`steer`?wt():Ct()}),o=new Set,s=er.get(n)??new Set,c=new Map;er.set(n,s),r.replaceChildren(...(t??[]).map(e=>{let t=Object.assign(document.createElement(`p`),{title:e.text}),n=document.createElement(`span`),r=`${e.as}\n${e.text}`,i=c.get(r)??0,l=`${r}\n${i}`;c.set(r,i+1),o.add(l),n.append(a(e),e.text),t.append(n);let u=()=>{let e=s.has(l);if(e?t.setAttribute?.(`data-open`,``):t.removeAttribute?.(`data-open`),!(e||n.scrollHeight>n.clientHeight+1))return t.removeAttribute?.(`role`),t.removeAttribute?.(`tabindex`),t.removeAttribute?.(`aria-expanded`);t.setAttribute?.(`role`,`button`),t.setAttribute?.(`tabindex`,`0`),t.setAttribute?.(`aria-expanded`,String(e))},d=()=>(s.has(l)?s.delete(l):s.add(l),u());return t.addEventListener?.(`click`,()=>t.getAttribute?.(`role`)&&d()),t.addEventListener?.(`keydown`,e=>{let n=e;(n.key===`Enter`||n.key===` `)&&t.getAttribute?.(`role`)&&(n.preventDefault(),d())}),typeof requestAnimationFrame==`function`&&requestAnimationFrame(()=>(u(),typeof ResizeObserver==`function`&&new ResizeObserver(u).observe(t))),t}));for(let e of s)o.has(e)||s.delete(e);t?.length||er.delete(n)}function nr(e,t){let n=e.querySelector(`.queue-act button`);n&&(n.onclick=()=>{n.disabled=!0,t().finally(()=>n.disabled=!1)})}function rr(e,t){let n=e.querySelector(`.todos`);if(!n||(n.hidden=!t?.length,!t?.length))return;let r=t.filter(e=>e.status===`completed`).length,i=t.find(e=>e.status===`in_progress`);E(n,`summary b`,pn({done:r,total:t.length})),E(n,`summary span`,i?i.activeForm??i.subject:r===t.length?mn():``),n.querySelector(`ol`).replaceChildren(...t.map(e=>Object.assign(document.createElement(`li`),{textContent:e.subject,className:e.status})))}function ir(e,t){let n=e.querySelector(`.monitors`);if(!n||(n.hidden=!t?.length,!t?.length))return;let r=t.filter(e=>e.status===`running`),i=t.filter(e=>e.status===`error`||e.status===`stale`).length;n.dataset.failed=String(i>0),E(n,`summary b`,[at(),r.length&&it({count:r.length}),i&&tt({count:i})].filter(Boolean).join(` · `)),E(n,`summary span`,r[0]?r[0].last??r[0].what:``);let a={running:Xe,done:Je,error:Ye,stale:Ze,stopped:Qe};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&&We({code:e.exit}),qe({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 ar=e=>/^\/(\S{0,64})$/.exec(e)?.[1],or=(e,t,n)=>(e+n+t)%t;function sr(e,t){let n=d(`ul`,{class:`slash`,id:`slash`,role:`listbox`,"aria-label":ge()}),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=d(`li`,{id:`slash-${t}`,role:`option`,"aria-selected":String(t===i)},d(`b`,null,`/${e.name}`),e.description&&d(`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=ar(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=or(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 cr=16384,lr=/^\s*\/(quit|exit|new|resume|fork|clone|import|reload)(?=\s|$)/,Y=new Map,ur=e=>(t,n)=>u(`sessions/${encodeURIComponent(e)}/${t}`,n);function dr(e,t,n){if(!e.ok)return[`error`,e.status===504?L():e.body.reason??ae({status:e.status})];if(t&&!t.startsWith(n))return[`ok`,wn()]}var fr=e=>{try{return e?.startsWith(`[`)?JSON.parse(e):e?[`error`,e]:void 0}catch{return[`error`,e]}},pr=(e,t)=>e!==``&&!e.startsWith(t)?At():``,mr=(e,t)=>e.startsWith(t)?e.slice(t.length).replace(/^\n/,``):e,X=(e,t)=>t.trim()?`${e}\n\n${t}`:e,Z=new Map,hr=54e4,gr=new Map,Q=new Map,_r=e=>`sb-draft:${e}:take`;function vr(e,t=Date.now()){let n=gr.get(e);if(!n)try{let[t,r]=(sessionStorage.getItem(_r(e))??``).split(`:`);r&&Number(t)>0&&gr.set(e,n={id:r,at:Number(t)})}catch{}return n&&t-n.at>=hr&&(br(e),n=void 0),n?.id}function yr(e,t=Date.now()){let n=Array.from(crypto.getRandomValues(new Uint8Array(16)),e=>e.toString(16).padStart(2,`0`)).join(``);gr.set(e,{id:n,at:t});try{sessionStorage.setItem(_r(e),`${t}:${n}`)}catch{}return n}function br(e){gr.delete(e);try{sessionStorage.removeItem(_r(e))}catch{}}function xr(e,t){let n=`sb-draft:${e}`;try{sessionStorage.setItem(n,X(t,sessionStorage.getItem(n)??``)),sessionStorage.setItem(`${n}:note`,JSON.stringify([`ok`,Te()]))}catch{Q.set(e,X(t,Q.get(e)??``))}}function Sr(e,t){let n=Q.get(e);return Q.delete(e),n===void 0?t:X(n,t)}var Cr=[`no_editor`,`stale`,`not_taken`,`changed`,`too_large`,`not_cleared`,`no_key`];function wr(e,t){let n=t?{locale:t}:void 0,r=typeof e.body.label==`string`?e.body.label:`?`;return e.status>=400&&e.status!==504?{no_key:()=>$t({},n),no_editor:()=>Qt({},n),stale:()=>on({},n),not_taken:()=>rn({key:r},n),changed:()=>Xt({},n),too_large:()=>sn({},n),not_cleared:()=>en({},n),blocked:()=>Jt({},n),local_only:()=>Zt({},n),rate:()=>an({},n),busy:()=>Yt({},n)}[e.body.error??``]?.():void 0}function Tr(e,t,n){t.ok&&typeof t.body.text==`string`&&(n?(n.box.value=X(t.body.text,n.box.value),n.save()):xr(e,t.body.text)),(t.ok||t.status===400||t.status===409&&Cr.includes(t.body.error??``))&&br(e)}function $(e){if(!e.online)return pe();if(!e.live)return de();if(!e.control)return e.agent?ce({agent:N[e.agent]}):fe();if(e.mark===`waiting`)return e.answerable?le():ue()}function Er(e,n,r,i=e=>ie(`sessions/${encodeURIComponent(n)}/upload`,e)){let a=`sb-draft:${n}`,o=matchMedia(`(pointer: coarse)`).matches,s=d(`textarea`,{rows:`1`,maxlength:String(cr),"aria-label":Ve(),enterkeyhint:o?`enter`:`send`}),c=d(`button`,{type:`submit`,class:`cmp-send`},Et()),l=d(`button`,{type:`button`,class:`cmp-alt`},Le()),u=d(`button`,{type:`button`,class:`cmp-alt cmp-stop`},Gt()),f=d(`input`,{type:`file`,multiple:``,hidden:``}),m=d(`button`,{type:`button`,class:`cmp-alt`,"aria-label":oe()},`+`),h=d(`p`,{class:`cmp-note`,role:`status`,"aria-live":`polite`}),g=sr(s,e=>r(`commands`,{prefix:e})),_=d(`form`,{class:`composer`},g,d(`div`,{class:`cmp-row`},m,f,s,d(`div`,{class:`cmp-acts`},c,l,u)),d(`div`,{class:`cmp-foot`},h));e.replaceChildren(_);let v={name:``,control:!1,live:!1,mark:`unknown`,online:!1},y=!1,b=!1,x=e=>{try{e()}catch{}};x(()=>s.value=sessionStorage.getItem(a)??``),s.value=Sr(n,s.value);let S=()=>x(()=>s.value?sessionStorage.setItem(a,s.value):sessionStorage.removeItem(a)),C=CSS.supports(`field-sizing`,`content`)?()=>{}:()=>(s.style.height=`auto`,s.style.height=`${Math.min(s.scrollHeight,220)}px`),w=(e,t=``,...n)=>(h.dataset.tone=t,h.replaceChildren(e,...n)),T=(e,t,n)=>{let r=d(`button`,{type:`button`,class:`cmp-yes`},t),i=d(`button`,{type:`button`,class:`cmp-link`},ee());b=!0,r.onclick=()=>(b=!1,n()),i.onclick=()=>(b=!1,w(``),s.focus()),w(e,`ask`,r,i),r.focus()},[E,D]=[`${a}:note`,()=>{try{return sessionStorage.getItem(a)??``}catch{return}}],O=e=>x(()=>e?sessionStorage.setItem(E,JSON.stringify(e)):sessionStorage.removeItem(E));function te(e,t,i){let o={sent:i,answer:r(e,t)};return i!==void 0&&(O([`error`,L()]),Y.set(n,o),o.answer.then(e=>{let t=D();e.ok&&t!==void 0&&x(()=>sessionStorage.setItem(a,mr(t,i))),O(dr(e,t,i))},()=>O([`error`,L()]))),k(o)}async function k(e,{sent:r}=e){y=!0,b=!1,j(),w(r===void 0?``:t());try{let t=await e.answer;if(!_.isConnected)return;if(!t.ok)return t.status===504||O(),w(t.body.reason??ae({status:t.status}),`error`);if(r===void 0)return w(``);O();let n=pr(s.value,r);s.value=mr(s.value,r),S(),C(),w(n,`ok`)}catch{w(L(),`error`)}finally{Y.get(n)===e&&Y.delete(n),y=!1,j()}}function A(e,t){let n=s.value,r=$(v),i=t===n;if(y||b||!n.trim())return;if(r)return w(r,`error`);if(new TextEncoder().encode(n).length>16384)return w(vn(),`error`);let a=!i&&n.match(lr)?.[0].trim();if(a)return T(Ae({command:a}),kt({command:a}),()=>A(e,n));te(`input`,{text:n,as:e,confirmed:i},n)}function j(){let e=$(v),t=v.mark===`working`;s.placeholder=e??bt({name:v.name}),s.disabled=m.disabled=!v.live,c.disabled=y||!!e||!s.value.trim(),l.hidden=u.hidden=!t||!!e,[l.disabled,u.disabled]=[c.disabled,y]}let M=()=>{let e=d(`button`,{type:`button`,class:`cmp-yes`},Ce());e.onclick=()=>void N(),w(De(),`error`,e)};function ne(){return r(`dequeue`,{take:vr(n)??yr(n)}).then(e=>(Tr(n,e,_.isConnected?{box:s,save:S}:void 0),e),()=>void 0)}async function N(){if(y||b||Z.has(n))return;let e=$(v);if(e)return w(e,`error`);let t=ne();Z.set(n,t),await re(t)}async function re(e){y=!0,j(),w(Ee());try{let t=await e;if(!_.isConnected)return;if(!t||t.status===504)return M();if(!t.ok)return w(wr(t)??t.body.reason??ae({status:t.status}),`error`);if(typeof t.body.text!=`string`)return w(we());let r=D();r!==void 0&&r!==s.value&&(s.value=r),s.value=Sr(n,s.value),S(),O(),C(),s.focus(),s.selectionStart=s.selectionEnd=s.value.length,w(Te(),`ok`)}finally{Z.get(n)===e&&Z.delete(n),y=!1,j()}}async function P(e){if(!e.length||y)return;let t=$(v);if(t)return w(t,`error`);w(Sn(),``);for(let t of e){if(t.size>20971520)return w(Ie({name:t.name}),`error`);let e=await i(t).catch(()=>void 0);if(!e?.ok||typeof e.body.path!=`string`)return w(e?.body.reason??p(),`error`);let n=s.selectionStart??s.value.length,r=s.value.slice(0,n),a=s.value.slice(s.selectionEnd??n),o=`${r&&!/\s$/.test(r)?` `:``}${e.body.path}${/^\s/.test(a)?``:` `}`;s.value=r+o+a,s.selectionStart=s.selectionEnd=n+o.length}w(``),S(),C(),j(),s.focus()}m.onclick=()=>f.click(),f.onchange=()=>void P([...f.files??[]]).finally(()=>f.value=``),s.addEventListener(`paste`,e=>{let t=[...e.clipboardData?.files??[]];t.length&&(e.preventDefault(),P(t))}),_.addEventListener(`dragover`,e=>e.dataTransfer?.types.includes(`Files`)&&e.preventDefault()),_.addEventListener(`drop`,e=>{let t=[...e.dataTransfer?.files??[]];t.length&&(e.preventDefault(),P(t))}),_.addEventListener(`submit`,e=>(e.preventDefault(),A(`send`))),l.onclick=()=>A(`followUp`),u.onclick=()=>T(Kt(),Gt(),()=>void(y||te(`keys`,{keys:[`esc`]}))),s.addEventListener(`input`,()=>(S(),C(),j())),_.addEventListener(`keydown`,e=>{e.key===`Escape`&&!e.isComposing&&(b||e.target===s&&s.value)&&(e.preventDefault(),b&&(b=!1,w(``),s.focus()))}),s.addEventListener(`keydown`,e=>{e.isComposing||e.keyCode===229||e.key!==`Enter`||e.shiftKey||o&&!e.altKey||(e.preventDefault(),A(e.altKey?`followUp`:`send`))});let F=window.visualViewport,I=()=>[[`--vvh`,F.height],[`--vvt`,F.offsetTop]].forEach(([e,t])=>document.documentElement.style.setProperty(e,`${t}px`));return F&&(F.addEventListener(`resize`,I),F.addEventListener(`scroll`,I),I()),C(),Y.has(n)?k(Y.get(n)):Z.has(n)?re(Z.get(n)):x(()=>{let e=fr(sessionStorage.getItem(E));sessionStorage.removeItem(E),e?w(e[1],e[0]):vr(n)&&M()}),{box:s,update:e=>(v=e,j()),ready:()=>!$(v),takeQueue:N}}var Dr=()=>`<div class="comms-in"><header class="comms-head"><a class="head-back" data-back aria-label="${F()}">‹</a><span class="logo"><svg><use href="#i-comms"/></svg></span><div class="head-id"><h2><small>${_e()}</small> <span></span></h2><p></p></div><div class="modes" role="group"><button type="button" data-mode="chat" aria-pressed="true">${_e()}</button><button type="button" data-mode="term" aria-pressed="false">${un()}</button></div><span class="chan link" data-state="live"><i></i><b>${he()}</b></span><button type="button" class="pair-btn head-main" hidden></button><button type="button" class="pair-btn head-info">${Re()}</button><button type="button" class="quit-btn head-quit" data-close="unit" hidden></button></header><div class="chat-root"></div><div class="queue-list" hidden></div><div class="queue-act" hidden><span>${St()}</span><button type="button" class="cmp-alt">${xt()}</button></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 Or(e,{view:t,data:n,openTile:i,embedTerminal:o,online:s,fullScreen:c,opened:l}){let u,d,f,p=0,m,h,_=0,v=()=>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 y(a){let o=++p,{mountChat:s}=await g(async()=>{let{mountChat:e}=await import(`./chat-YJh7eBNK.js`);return{mountChat:e}},__vite__mapDeps([0]),import.meta.url);if(o!==p||e.route.view!==`session`)return;t.replaceChildren(w(Dr()));let m=()=>G(e.net,a)?.u??{key:a,name:e.info?.name??a,role:e.info?.role??`member`,mark:`unknown`};u=s(t.querySelector(`.chat-root`),n(a),{who:m,link:t=>{let n=G(e.net,a)?.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&&J({view:`session`,ws:G(e.net,n.key)?.base.id??W(e),key:n.key},t)},docFor:(t,n=Ln(G(e.net,a)?.u.docs,e.info?.header?.cwd,t))=>n&&(()=>i(Hn(m().name,n)))});let _=n(a).post??ur(a);[d,f]=[Er(t.querySelector(`.composer-root`),a,_),r(t.querySelector(`.ask-root`),_,void 0,()=>b(`term`))],nr(t,()=>d?.takeQueue()??Promise.resolve()),t.querySelectorAll(`.modes button`).forEach(e=>e.onclick=()=>b(e.dataset.mode)),t.querySelector(`.head-info`).onclick=()=>c(!0),h===`term`&&b(`term`),h=void 0,u.reveal(e.route.at),l(),v()}function b(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 a=i.querySelector(`.term-root`);if(a.hidden=n!==`term`,i.classList.toggle(`in-term`,n===`term`),m?.(),m=void 0,n!==`term`)return v();let s=++_;o(r,G(e.net,r)?.u.name??e.info?.name??r,a).then(t=>s===_&&e.route.view===`session`&&e.route.key===r?(m=t,a.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(w(`<p class="lost">${gt()}</p>`)),y(e)},close(){p++,u=d=f=void 0,t.replaceChildren()},reveal(e){u?.reveal(e),v()},leaveMode:()=>(_++,m?.(),m=void 0),terminal(t){e.route.view===`session`&&e.route.key===t?b(`term`):h=`term`},draw({u:n,hit:r,mk:i,state:o,name:c}){t.querySelector(`.modes`)?.toggleAttribute(`hidden`,!n?.control),u?.docs();let l=t.querySelector(`.comms-head`);if(l){T(l,i),E(l,`h2 span`,n?.name??e.info?.name??``),E(l,`p`,[r?.base.label,r?.squad&&Ut({label:r.squad})].filter(Boolean).join(` · `));let t=l.querySelector(`.chan`),s=!qn(n,o);t.dataset.state=s?`live`:`closed`,E(t,`b`,s?he():o===`recent`||n?.ended?me():st()),t.title=t.querySelector(`b`).textContent??``;let c=l.querySelector(`.head-main`),u=Kn(r);c.hidden=!u,u&&(j(c,u),c.title=a({base:u.label})),P(l.querySelector(`.head-quit`),r),S(l.querySelector(`.head-back`),{view:`workspace`,ws:W(e)})}rr(t,e.info?.todos),ir(t,n?.monitors),tr(t,n?.queued,n?.key),u?.setLive(i===`working`||i===`commanding`?`${C(n.note,i)}`:x(i)?ne[i]():``,i),d?.update({name:c,control:!!n?.control,agent:n?.agent,live:!qn(n,o),mark:i,online:s(),answerable:!!n?.pending?.answer}),f?.update(n?.pending,i===`waiting`&&!!n?.control&&s())}}}var kr=()=>w(`<div class="col"><a class="token">${O}<span class="name"></span><span class="line"><em class="role"></em><em class="agent"></em><span class="note"></span></span></a><div class="say"><p></p></div><div class="drones"></div></div>`),Ar=()=>`<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>${y()}</span><h2></h2><p></p></div><dl class="tally"><div><dt>${Wt()}</dt><dd></dd></div><div><dt>${xn()}</dt><dd></dd></div><div data-mark="working"><dt>${f()}</dt><dd></dd></div><div data-mark="waiting"><dt>${m()}</dt><dd></dd></div></dl></header><div class="drones tower-drones"></div><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>${l()}</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>${o()}</b><small>${_t()}</small></h3><div class="formation"></div></section></div><p class="lost" hidden></p></div>`;function jr(e,t){e.firstElementChild||e.append(w(Ar()));let{net:n,cards:r}=t,i=e.firstElementChild,a=n?.bases.find(e=>e.id===W(t)),o=i.querySelector(`.lost`);if(o.hidden=!!a,o.textContent=n?Be():Cn(),i.classList.toggle(`void`,!a),!a)return;let c=i.querySelector(`.keep`);T(c,a.mark),c.classList.toggle(`head`,a.head);let l=i.querySelector(`.tower`);l.classList.toggle(`ghost`,!a.tower),T(l,a.tower?.mark??`unknown`),S(l,a.tower?{view:`session`,ws:a.id,key:a.tower.key}:void 0),l.toggleAttribute(`hidden`,!1),l.toggleAttribute(`data-alert`,!!(a.tower&&x(a.tower.mark))),E(i,`h2`,a.label),j(i.querySelector(`.spawn-btns button`),a),E(i,`.title p`,a.tower?h({state:ne[a.tower.mark]()}):_()),D(i.querySelector(`.tower-drones`),a.tower?.subs??[],K,(e,t)=>(e.classList.add(`drone`),q(e,t,a.id)));let u=[...a.tower?.subs??[],...a.tabs.flatMap(e=>e.units.flatMap(e=>[e,...e.subs]))];[a.tabs.length,u.length,u.filter(e=>e.mark===`working`).length,u.filter(e=>e.mark===`waiting`).length].forEach((e,t)=>i.querySelectorAll(`dd`)[t].textContent=String(e));let d=(e,t)=>{T(e,t.mark),q(e.querySelector(`.token`),t,a.id);let n=e.querySelector(`.say`),i=r[t.key]??``;n.hidden=!i,E(n,`p`,i),D(e.querySelector(`.drones`),t.subs,K,(e,t)=>(e.classList.add(`drone`),q(e,t,a.id)))};D(i.querySelector(`.squads`),a.tabs,()=>w(`<section class="tab squad"><h3><i class="flag"></i><b></b><small></small><button type="button" class="tab-add"></button></h3><div class="formation"></div></section>`),(e,t)=>{E(e,`h3 b`,Ut({label:t.label})),j(e.querySelector(`.tab-add`),a,t.id);let n=t.units.flatMap(e=>[e,...e.subs]);E(e,`h3 small`,s({count:n.length})),T(e,[`waiting`,`error`,`working`].find(e=>n.some(t=>t.mark===e||e===`working`&&t.mark===`commanding`))??`idle`),D(e.querySelector(`.formation`),t.units,kr,d)});let f=(e,t)=>{let n=i.querySelector(`[data-group="${e}"]`);n.hidden=!t.length,D(n.querySelector(`.formation`),t,K,(e,t)=>q(e,t,a.id))};f(`outposts`,a.outposts.map(e=>({id:e.id,name:e.label,role:`outpost`,mark:e.mark,note:e.mark===`unknown`?v():void 0}))),f(`outside`,a.outside)}var Mr=200;function Nr({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=Zn(s,c,{openTile:n,fullScreen:f}),m=Or(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=Jn(c);e&&(p(e),m.draw(e))}let _=()=>(Qn(c),c.route.view===`workspace`?jr(a,c):g());return{terminal:m.terminal,locate:e=>G(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&&$n(e,t,n)},net(e){c.net=e,Un(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`&&jr(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<Mr?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{Nr as mountFocus,V as n,Nn as t};
@@ -14,8 +14,8 @@
14
14
  <meta name="apple-mobile-web-app-title" content="Straw Net">
15
15
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
16
16
  <link rel="icon" type="image/svg+xml" href="./icon.svg">
17
- <script type="module" crossorigin src="./assets/index-BjtXXg-H.js"></script>
18
- <link rel="stylesheet" crossorigin href="./assets/index-CHw4SzTz.css">
17
+ <script type="module" crossorigin src="./assets/index-DXzYIOEk.js"></script>
18
+ <link rel="stylesheet" crossorigin href="./assets/index-D9X5KUWx.css">
19
19
  </head>
20
20
  <body>
21
21
  <!-- Icons: game-icons.net, CC BY 3.0 (Lorc, Delapouite); see gui/ICONS.md -->
@@ -47,12 +47,15 @@
47
47
  <div class="alert-row">
48
48
  <button class="alerts" id="alerts" type="button" data-mark="unknown" aria-label="Alerts" data-m-label="alerts" disabled><span class="faces" id="alert-faces"></span><span class="count"><b id="alert-count">0</b><small id="alert-text" data-m="no_alerts">no alerts</small></span></button>
49
49
  <button class="pair-btn tog done-btn" id="done" type="button" data-state="done" popovertarget="done-pop" aria-haspopup="dialog" hidden></button>
50
+ <button class="pair-btn tog done-btn" id="link-alerts" type="button" data-state="error" popovertarget="link-alerts-pop" aria-haspopup="dialog" hidden></button>
50
51
  </div>
51
52
  <div class="hud-pop done-pop" id="done-pop" popover><ul id="done-list"></ul><button class="pair-btn" id="done-clear" type="button"></button></div>
53
+ <div class="hud-pop done-pop link-pop" id="link-alerts-pop" popover><ul id="link-alerts-list"></ul></div>
52
54
  <button class="pair-btn prefs-btn" id="prefs" type="button" popovertarget="prefs-pop" aria-haspopup="dialog" aria-label="Settings" data-m-label="settings" data-m-title="settings"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M19.4 13a7.6 7.6 0 0 0 0-2l2.1-1.6-2-3.5-2.5 1a7.4 7.4 0 0 0-1.7-1L15 3.3h-4l-.4 2.6a7.4 7.4 0 0 0-1.7 1l-2.5-1-2 3.5L6.6 11a7.6 7.6 0 0 0 0 2l-2.1 1.6 2 3.5 2.5-1a7.4 7.4 0 0 0 1.7 1l.4 2.6h4l.4-2.6a7.4 7.4 0 0 0 1.7-1l2.5 1 2-3.5zM12 15.5a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7z"/></svg></button>
53
55
  <!-- Settings a person sets once: the reminder and sound switches, pairing a phone, the language. The sound panel hangs under the last row. -->
54
56
  <div class="hud-pop prefs-pop" id="prefs-pop" popover>
55
57
  <button class="pair-btn tog" id="remind" type="button" aria-pressed="true"></button>
58
+ <button class="pair-btn" id="teams" type="button" title="Straw Link: teams across computers" data-m="link_button" data-m-title="link_button_title">Teams</button>
56
59
  <button class="pair-btn" id="pair" type="button" title="Pair a phone over Tailscale (/boss gui remote turns remote access on)" data-m="pair_button" data-m-title="pair_title">Phone</button>
57
60
  <select class="pair-btn lang" id="lang" aria-label="Language" data-m-label="language"></select>
58
61
  <button class="pair-btn tog" id="sound" type="button" popovertarget="sound-pop" aria-haspopup="dialog"></button>