droidsembly 0.0.0-stage → 0.4.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.it.md +184 -0
- package/README.md +184 -3
- package/bin/cubefarm.js +297 -0
- package/bin/distribution.d.ts +3 -0
- package/bin/distribution.js +48 -0
- package/dist/THIRD_PARTY_LICENSES.txt +2542 -0
- package/dist/assets/AccessibilitySettings-DSmFk9JC.js +30 -0
- package/dist/assets/AccessibilitySettings-HrzBDUTN.css +1 -0
- package/dist/assets/AppViewer-alNn4TBB.js +5 -0
- package/dist/assets/Balloon-UTs7npGo.js +1 -0
- package/dist/assets/Batched-BOgjreKO.js +45 -0
- package/dist/assets/Birds-BA2HM-AD.js +1 -0
- package/dist/assets/Blimp-CTykuz6B.js +1 -0
- package/dist/assets/BufferGeometryUtils-BsmWvcA2.js +1 -0
- package/dist/assets/Duck-DH63jUrP.js +1 -0
- package/dist/assets/Effects-CNyhhFkE.js +65 -0
- package/dist/assets/Fireworks-CJfDJOeb.js +33 -0
- package/dist/assets/Helicopter-CW_SP7xP.js +1 -0
- package/dist/assets/Hurricane-9WqZGyZg.js +33 -0
- package/dist/assets/Kaiju-SpSi_jBg.js +1 -0
- package/dist/assets/Meteors-DvjhLfbF.js +1 -0
- package/dist/assets/MissionConsole-BEP5CdC8.js +1 -0
- package/dist/assets/Office-BBnd6tyn.js +563 -0
- package/dist/assets/Office-DMOP02gg.css +1 -0
- package/dist/assets/PhotoPanel-DehErnsv.js +1 -0
- package/dist/assets/PhotoPanel-v4ANHBsO.css +1 -0
- package/dist/assets/PhotoScene-Ce-dzToM.js +115 -0
- package/dist/assets/Plane-0nfvzL_c.js +1 -0
- package/dist/assets/Pocket-CBoyL0ra.js +2 -0
- package/dist/assets/Rainbow-CdcWsmW8.js +28 -0
- package/dist/assets/Roof-mkMKniSZ.js +34 -0
- package/dist/assets/Shell-BmnZn4UL.js +13 -0
- package/dist/assets/Skywriting-06dZPAfg.js +1 -0
- package/dist/assets/TerminalView-BrP-ENHg.css +1 -0
- package/dist/assets/TerminalView-wlhSixSH.js +17 -0
- package/dist/assets/ToyWorld-Cuu9aW-K.js +1 -0
- package/dist/assets/Ufo-iHaoe5t1.js +1 -0
- package/dist/assets/Whale-DZg88zIX.js +1 -0
- package/dist/assets/all-CYErCTCA.js +11 -0
- package/dist/assets/billboardLayout-DSKGXPIM.js +1 -0
- package/dist/assets/bloomMarks-DariC6lY.js +4231 -0
- package/dist/assets/cheerRules-CZGSrxOB.js +1 -0
- package/dist/assets/cityLayout-7ckfe3wf.js +1 -0
- package/dist/assets/director-CrzFgnoP.js +1 -0
- package/dist/assets/dogState-DiOvoobI.js +1 -0
- package/dist/assets/doors-BHKj8tkO.js +1 -0
- package/dist/assets/gallery-ColCPQQE.js +1 -0
- package/dist/assets/gate-BplJKcLG.js +2 -0
- package/dist/assets/index-B6qvKFYN.js +10 -0
- package/dist/assets/index-COpmc42S.css +1 -0
- package/dist/assets/instantReplay-DGiLgvkQ.js +1 -0
- package/dist/assets/interact-0qw7BGhL.js +1 -0
- package/dist/assets/jsx-runtime-BFUkm7bt.js +1 -0
- package/dist/assets/jukeboxSongs-CjbAzAeb.js +1 -0
- package/dist/assets/kit-C6ByUQ-Y.js +2 -0
- package/dist/assets/mic-B316hcCe.js +1 -0
- package/dist/assets/news-CrPol-gz.js +1 -0
- package/dist/assets/paint.worker-D95XJ3xX.js +1 -0
- package/dist/assets/photoMode-CYxQfgUF.js +1 -0
- package/dist/assets/pipeline-BOTOZ69L.js +1215 -0
- package/dist/assets/rapier-CXAOW8OC.js +1 -0
- package/dist/assets/rig-wAyl3G1G.js +1 -0
- package/dist/assets/speechLanguage-BtfdhZNI.js +1 -0
- package/dist/assets/store-FA83kfnc.js +5 -0
- package/dist/assets/useDayTime-0XsqM14Q.js +1 -0
- package/dist/assets/useGraphics-Cif18p7Q.js +1 -0
- package/dist/assets/voiceMessages-DtNmUazr.js +1 -0
- package/dist/assets/weatherState-ExG1doW-.js +1 -0
- package/dist/icons/Sora-OFL.txt +93 -0
- package/dist/icons/apple-touch-icon.png +0 -0
- package/dist/icons/badge-96.png +0 -0
- package/dist/icons/badge.svg +1 -0
- package/dist/icons/droid-antenna.svg +29 -0
- package/dist/icons/droid-eyes.svg +29 -0
- package/dist/icons/droid-shell.svg +29 -0
- package/dist/icons/droid-spark.svg +29 -0
- package/dist/icons/droid-wire.svg +29 -0
- package/dist/icons/favicon-16.png +0 -0
- package/dist/icons/favicon-32.png +0 -0
- package/dist/icons/favicon.svg +1 -0
- package/dist/icons/icon-192.png +0 -0
- package/dist/icons/icon-512.png +0 -0
- package/dist/icons/icon-maskable-512.png +0 -0
- package/dist/icons/icon.svg +29 -0
- package/dist/icons/logo-dark.svg +29 -0
- package/dist/icons/logo-light.svg +29 -0
- package/dist/icons/sora-400.ttf +0 -0
- package/dist/icons/sora-700.ttf +0 -0
- package/dist/index.html +26 -0
- package/dist/manifest.webmanifest +19 -0
- package/dist/third-party-licenses.json +1106 -0
- package/dist-server/browser-init.js +24 -0
- package/dist-server/index.js +20049 -0
- package/dist-server/index.js.map +7 -0
- package/dist-server/ptyHost.js +234 -0
- package/dist-server/ptyHost.js.map +7 -0
- package/package.json +98 -6
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/voiceMessages-DtNmUazr.js","assets/index-B6qvKFYN.js","assets/jsx-runtime-BFUkm7bt.js","assets/index-COpmc42S.css","assets/mic-B316hcCe.js","assets/jukeboxSongs-CjbAzAeb.js","assets/speechLanguage-BtfdhZNI.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a as e,n as t,s as n,u as r}from"./jsx-runtime-BFUkm7bt.js";var i=[`standard`,`deuteranopia`,`protanopia`,`tritanopia`],a={standard:`Standard`,deuteranopia:`Deuteranopia (green-weak)`,protanopia:`Protanopia (red-weak)`,tritanopia:`Tritanopia (blue-yellow)`},o=[`idle`,`waiting`,`busy`,`ok`,`attention`,`bad`],s={idle:`○`,waiting:`⏳`,busy:`▶`,ok:`✓`,attention:`!`,bad:`✕`},c={idle:`idle`,waiting:`waiting`,busy:`busy`,ok:`done`,attention:`needs attention`,bad:`failed`},l={idle:`idle`,unconfigured:`idle`,stopped:`idle`,preparing:`waiting`,installing:`waiting`,starting:`waiting`,queued:`waiting`,working:`busy`,testing:`busy`,fixing:`busy`,done:`ok`,running:`ok`,passed:`ok`,"needs-human":`attention`,error:`bad`,failed:`bad`},u={good:`ok`,warn:`attention`,bad:`bad`},d={idle:{fill:`#d9d9d9`,strong:`#8c8c8c`},waiting:{fill:`#f3e3a1`,strong:`#c49a6c`},busy:{fill:`#a9d4f5`,strong:`#56b4e9`},ok:{fill:`#6aa7e0`,strong:`#0060b0`},attention:{fill:`#ffd94a`,strong:`#f0c800`},bad:{fill:`#e89a5c`,strong:`#a34400`}},f={deuteranopia:d,protanopia:{...d,bad:{fill:`#f0a070`,strong:`#b84a00`}},tritanopia:{idle:{fill:`#d9d9d9`,strong:`#8c8c8c`},waiting:{fill:`#ffd3a8`,strong:`#9a5a20`},busy:{fill:`#8fd6d6`,strong:`#008c8c`},ok:{fill:`#2fa58a`,strong:`#004d3c`},attention:{fill:`#ff9ec8`,strong:`#e0408a`},bad:{fill:`#ff7a6e`,strong:`#c4161c`}}},p={idle:`#e9ecef`,unconfigured:`#e9ecef`,stopped:`#dee2e6`,preparing:`#ffe066`,installing:`#ffe066`,starting:`#ffe066`,queued:`#ffe066`,working:`#74c0fc`,testing:`#74c0fc`,fixing:`#74c0fc`,done:`#8ce99a`,running:`#8ce99a`,passed:`#8ce99a`,"needs-human":`#ffa8a8`,error:`#ffa8a8`,failed:`#ffa8a8`},m={idle:`#adb5bd`,waiting:`#fab005`,busy:`#339af0`,ok:`#2dc653`,attention:`#ffb703`,bad:`#ef476f`},h={card:{warn:`#fff3d6`,bad:`#ffe0e6`,good:`#e3fbe7`},board:{warn:`#ffd8a8`,bad:`#ffc9c9`,good:`#d8f9df`}};function ee(e,t){return t===`standard`?p[e]:f[t][l[e]].fill}function g(e,t){return t===`standard`?m[e]:f[t][e].strong}function _(e,t,n){return t===`standard`?h[n][e]:f[t][u[e]].fill}var v={palette:`standard`,shapes:!1};function te(e){if(e===`standard`)return{};let t={};for(let n of Object.keys(l))t[`--st-${n}`]=ee(n,e);for(let n of Object.keys(u))t[`--tone-${n}`]=_(n,e,`card`);for(let n of o)t[`--kind-${n}`]=g(n,e);return t[`--good`]=g(`ok`,e),t[`--bad`]=g(`bad`,e),t[`--warn`]=g(`attention`,e),t}var ne=Object.keys(te(`deuteranopia`)),re=e(()=>({polite:``,assertive:``})),y=[];typeof window<`u`&&Object.defineProperty(window,"__swarmAnnounce",{value:y,configurable:!0,enumerable:!1});var ie={},ae={};function oe(e,t=`polite`){let n=e.replace(/\s+/g,` `).trim();n&&(y.push({text:n,urgency:t,at:Date.now()}),y.length>30&&y.splice(0,y.length-30),ae[t]=ae[t]?`${ae[t]} ${n}`:n,re.setState({[t]:``}),clearTimeout(ie[t]),ie[t]=setTimeout(()=>{re.setState({[t]:ae[t]??``}),ae[t]=``},60))}var se=`Biscuit`,ce=`Installing dependencies`,le=1500,ue=`Hi! This is how I'll sound when I message you from the office.`,de=/[\p{Extended_Pictographic}\p{Regional_Indicator}\u{1F3FB}-\u{1F3FF}︎️⃣]/gu,fe=/\b(?:https?:\/\/|www\.)[^\s<>()]+[^\s<>().,;:!?'"]/gi;function pe(e,t=le){let n=e.replace(/\r\n?/g,`
|
|
3
|
+
`);n=n.replace(/```[\s\S]*?(```|$)/g,`
|
|
4
|
+
`),n=n.replace(/`([^`\n]*)`/g,`$1`),n=n.replace(/!\[([^\]]*)\]\([^)]*\)/g,`$1`),n=n.replace(/\[([^\]]+)\]\([^)]*\)/g,`$1`),n=n.replace(/<(https?:[^>\s]+)>/g,`$1`),n=n.replace(/<\/?[a-z][^>]*>/gi,``),n=n.replace(fe,`a link`),n=n.replace(de,``),n=n.replace(/(\*\*|__)(.+?)\1/g,`$2`),n=n.replace(/(^|[^\w*])\*(?!\s)([^*\n]+?)\*(?!\w)/g,`$1$2`),n=n.replace(/(^|[^\w])_(?!\s)([^_\n]+?)_(?!\w)/g,`$1$2`),n=n.replace(/~~(.+?)~~/g,`$1`),n=n.replace(/#(\d+)\b/g,`number $1`);let r=[];for(let e of n.split(`
|
|
5
|
+
`))e=e.replace(/^\s*#{1,6}\s+/,``).replace(/^\s*>+\s?/,``).replace(/^\s*[-*+•]\s+/,``).replace(/^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)*\|?\s*$/,``).replace(/^\s*([-*_]\s*){3,}$/,``).replace(/\s*\|\s*/g,`, `).replace(/^[,\s]+|[,\s]+$/g,``).replace(/\s+/g,` `).trim(),e&&r.push(/[.!?:;,…]$/.test(e)?e:`${e}.`);return me(r.join(` `).replace(/\s+([.,!?;:])/g,`$1`),t)}function me(e,t){if(e.length<=t)return e;let n=[...e.slice(0,t+1).matchAll(/[.!?…](?=\s|$)/g)],r=n.length?n[n.length-1].index+1:-1;if(r>=t/2)return e.slice(0,r);let i=e.lastIndexOf(` `,t);return`${e.slice(0,i>0?i:t).replace(/[,;:\s]+$/,``)}…`}var he=e=>e>=5&&e<12?`morning`:e>=12&&e<17?`afternoon`:`evening`,ge=[`no`,`one`,`two`,`three`,`four`,`five`,`six`,`seven`,`eight`,`nine`],_e={morning:`Morning`,afternoon:`Afternoon`,evening:`Evening`};function ve(e,t){let n=Math.max(1,Math.floor(e)),r=n<ge.length?ge[n]:`a pile of`;return`${_e[t]} team, ${r} new feature${n===1?``:`s`} today!`}var ye={"Look around":`Guardati intorno`,"Pull out your phone":`Apri il telefono`,"Visit the CEO":`Visita il CEO`,"New agents":`Nuovi agenti`,"Go upstairs":`Sali al piano`,"The whiteboard":`La lavagna`,"Watch the team":`Osserva il team`,"Your office":`Il tuo ufficio`,"Click the view to grab the mouse and look around, then walk with":`Fai clic nella visuale per catturare il mouse e guardarti intorno, poi cammina con`,Hold:`Tieni premuto`,"to run.":`per correre.`,"gives you the mouse back.":`libera il mouse.`,"shows the whole floor from above.":`mostra tutto il piano dall’alto.`,Press:`Premi`,". Your phone is how you talk to {name} from anywhere in the building.":`. Il telefono ti permette di parlare con {name} da qualsiasi punto dell’edificio.`,"💬 {name} texts you here, and you can text back.":`💬 {name} ti scrive qui e puoi rispondere.`,"shows the CEO’s team changes waiting for your OK.":`mostra le modifiche al team proposte dal CEO in attesa della tua approvazione.`,"is every project at a glance. Put it away with":`mostra tutti i progetti a colpo d’occhio. Riponi il telefono con`,"{name}’s corner office is at the back right of the lobby, under the purple sign. Walk in and press":`L’ufficio di {name} è in fondo a destra nella hall, sotto l’insegna viola. Entra e premi`,"or click the desk to see what {name} is up to.":`oppure fai clic sulla scrivania per vedere cosa sta facendo {name}.`,"When {name} wants a bigger team, each new agent waits on the green chairs along the east wall. Press":`Quando {name} propone di ampliare il team, i nuovi agenti aspettano sulle sedie verdi lungo la parete est. Premi`,"or click one to see why, change their coding agent, model or effort if you like, then hire or decline. It all works from your phone too.":`oppure fai clic su un agente per conoscere il motivo, modificarne strumento di sviluppo, modello o ragionamento e poi assumerlo o rifiutare. Puoi farlo anche dal telefono.`,"{repo} has its own floor. Walk into the elevator in the middle of the south wall and press":`{repo} ha un piano dedicato. Entra nell’ascensore al centro della parete sud e premi`,"on its panel, or press":`sul pannello, oppure premi`,"or click the directory beside it.":`oppure fai clic sull’elenco accanto all’ascensore.`,"Every project gets its own floor. Add one in your office (the glass room at the back left), then take the elevator in the middle of the south wall.":`Ogni progetto ha un piano dedicato. Aggiungine uno dal tuo ufficio (la stanza a vetri in fondo a sinistra), poi prendi l’ascensore al centro della parete sud.`,"The whiteboard at the front of every floor is its Kanban board. Press":`La lavagna nella parte anteriore di ogni piano è la sua bacheca Kanban. Premi`,"or click it to hand out issues, send pull requests to QA and merge them.":`oppure fai clic per assegnare issue, inviare pull request al QA ed eseguirne il merge.`,"Walk up behind anyone to watch their screen, or press":`Avvicinati alle spalle di un agente per guardare lo schermo, oppure premi`,"or click a desk for their full terminal. Every pull request is tested by an agent before you merge it.":`oppure fai clic su una postazione per aprire il terminale completo. Ogni pull request viene verificata da un agente prima del merge.`,"Your glass office in the lobby (back left) has the manager’s console: projects, the team, and the CEO’s settings. Press":`Il tuo ufficio a vetri nella hall (in fondo a sinistra) contiene la console del manager: progetti, team e impostazioni del CEO. Premi`,"any time for help. Enjoy running {company}!":`in qualsiasi momento per l’aiuto. Buona gestione di {company}!`,"🧭 Tour":`🧭 Visita guidata`,"Skip tour":`Salta la visita`,"← Back":`← Indietro`,"the company":`l’azienda`,"Finish the tour":`Termina la visita`,"Skip this step":`Salta questo passaggio`,"Next →":`Avanti →`,"✏️ manager-requested changes":`✏️ modifiche richieste dal manager`,"QA ✓ · conflicts":`QA ✓ · conflitti`,"QA ✓ · CI failing":`QA ✓ · CI fallita`,"QA ✓ · waiting for checks":`QA ✓ · controlli in attesa`,"🧭 CEO is looking":`🧭 Il CEO sta esaminando`,"⚠️ needs you":`⚠️ richiede te`,"🔧 back to the developer":`🔧 rinviata allo sviluppatore`,"🔧 fixing · round {number}":`🔧 correzione · ciclo {number}`,"🔍 testing · round {number}":`🔍 verifica · ciclo {number}`,"waiting for QA":`in attesa del QA`,"not tested yet":`non ancora verificata`,"finished · no PR":`completato · nessuna PR`,"⏸ paced":`⏸ rallentato`,"⏸ PR #{number} closed · assign by hand":`⏸ PR #{number} chiusa · assegna manualmente`,"⏳ after #{numbers}":`⏳ dopo #{numbers}`,"Up to date":`Aggiornato`,"{count} update ready":`{count} aggiornamento pronto`,"{count} updates ready":`{count} aggiornamenti pronti`,"An update is ready":`È disponibile un aggiornamento`,"Waiting for {count} session to finish":`In attesa della fine di {count} sessione`,"Waiting for {count} sessions to finish":`In attesa della fine di {count} sessioni`,"Updating shortly…":`Aggiornamento a breve…`,"Updating…":`Aggiornamento…`,"Last update failed: {detail}":`Ultimo aggiornamento fallito: {detail}`,"unknown error":`errore sconosciuto`,"⟳ Updating the office…":`⟳ Aggiornamento dell’ufficio…`,"⟳ Updating the office after {count} session finishes":`⟳ L’ufficio si aggiornerà al termine di {count} sessione`,"⟳ Updating the office after {count} sessions finish":`⟳ L’ufficio si aggiornerà al termine di {count} sessioni`,"⟳ Updating the office shortly":`⟳ Aggiornamento dell’ufficio a breve`,"⟳ The office is restarting…":`⟳ Riavvio dell’ufficio…`,None:`Nessuno`,Stubble:`Barba corta`,Beard:`Barba`,Moustache:`Baffi`,Round:`Rotondi`,Square:`Quadrati`,Beanie:`Berretto`,Cap:`Cappellino`,Slim:`Snella`,Average:`Media`,Broad:`Robusta`,"Put {name} on GitHub?":`Pubblicare {name} su GitHub?`,"This creates a":`Questa azione crea un repository GitHub`,private:`privato`,public:`pubblico`,"GitHub repo called":`chiamato`,"and pushes what’s already committed. Nothing uncommitted leaves your computer.":`e pubblica i commit già presenti. Le modifiche senza commit non lasciano il computer.`," An empty folder gets a starter README first.":` Le cartelle vuote ricevono prima un README iniziale.`,"New projects are created in {path}.":`I nuovi progetti vengono creati in {path}.`,"Use {path} instead":`Usa invece {path}`,"Looking through {path}…":`Ricerca in {path}…`,"your projects folder":`la cartella dei tuoi progetti`,"No folders here.":`Nessuna cartella qui.`,"No matching folders here.":`Nessuna cartella corrispondente.`,"not on GitHub":`non su GitHub`,"no git yet":`Git non ancora configurato`,"in the office":`nell’ufficio`,"The office never touches your work in progress: after a merge it only fast-forwards your folder when it’s on the default branch with no local changes (and runs npm install if dependencies changed). Each agent works in its own git worktree of it, kept outside your project (so your dev server and linters never see them).":`L’ufficio non tocca il lavoro in corso: dopo un merge aggiorna la cartella solo con fast-forward, se è sul branch predefinito senza modifiche locali (ed esegue npm install se sono cambiate le dipendenze). Ogni agente lavora in un proprio worktree Git esterno al progetto, invisibile al server di sviluppo e ai linter.`,"Asking GitHub for your repos…":`Recupero dei repository da GitHub…`,"No matching repos.":`Nessun repository corrispondente.`,"…or type owner/name":`…oppure scrivi proprietario/nome`,"If it’s already in {path}, that folder is used. Otherwise it’s cloned to {destination}.":`Se si trova già in {path}, verrà usata quella cartella. Altrimenti verrà clonato in {destination}.`,"Project name, e.g. island-bakery":`Nome del progetto, es. island-bakery`,"One-line description (optional)":`Descrizione breve (facoltativa)`,Private:`Privato`,Public:`Pubblico`,"Creating…":`Creazione…`,"Create project":`Crea progetto`,Creates:`Crea`,"with a README and pushes it to a new {visibility} GitHub repo. Give the CEO a brief below and they’ll plan the first milestone.":`con un README e lo pubblica in un nuovo repository GitHub {visibility}. Fornisci un obiettivo al CEO qui sotto per pianificare la prima milestone.`,"⏳ QA queued":`⏳ QA in coda`,"🔍 QA testing":`🔍 Verifica QA`,"✅ QA passed":`✅ QA superato`,"❌ QA failed":`❌ QA fallito`,"🔧 being fixed":`🔧 In correzione`,"🙋 needs you":`🙋 Richiede te`,"{count} agent":`{count} agente`,"{count} turn":`{count} turno`,"{count} new agent waiting in the lobby":`{count} nuovo agente in attesa nella hall`,"{count} decision waiting on you":`{count} decisione attende il tuo intervento`,"{count} device signed up.":`{count} dispositivo registrato.`,"{count} pull request passed QA and is ready for you to merge ({projects}).":`{count} pull request ha superato il QA ed è pronta per il merge ({projects}).`,"{count} pull request needs your call: the team can’t move it on alone.":`{count} pull request richiede una tua decisione: il team non può procedere da solo.`,"{count} team change is waiting in Team.":`{count} modifica al team attende nella scheda Team.`,"{count} session is running right now.":`{count} sessione è attiva.`,"not set up":`non configurata`,"checking out":`preparazione del checkout`,installing:`installazione`,starting:`avvio`,error:`errore`,"Check out the code":`Prepara il codice`,"Install dependencies":`Installa le dipendenze`,"Start the app":`Avvia l’app`,"Run command":`Comando di avvio`,"e.g. python -m http.server {port}":`es. python -m http.server {port}`,"Auto-detected: npm run dev, else npm start, else npm run preview":`Rilevamento automatico: npm run dev, poi npm start, poi npm run preview`,"Environment (KEY=value, one per line)":`Ambiente (KEY=value, una variabile per riga)`,"Runs from the repo root in the floor’s own preview worktree.":`Eseguito dalla radice del repository nel worktree dedicato all’anteprima del piano.`,"is this floor’s port ({port}) and":`è la porta del piano ({port}) e`,"is always set;":`è sempre impostata;`,"is a scratch folder.":`è una cartella temporanea.`," Leave the command empty to use the auto-detected npm script.":` Lascia vuoto il comando per usare lo script npm rilevato automaticamente.`,"Environment: {count} of {max} characters (each variable counts as KEY=value).":`Ambiente: {count} caratteri su {max} (ogni variabile conta come KEY=value).`,"Undo changes":`Annulla le modifiche`,"{repo} app ({label})":`App {repo} ({label})`,"The app isn’t showing up here.":`L’app non viene visualizzata qui.`,"It may refuse to be shown inside another page (X-Frame-Options or a CSP frame-ancestors rule).":`Potrebbe impedire la visualizzazione dentro un’altra pagina (X-Frame-Options o regola CSP frame-ancestors).`,"Open it in a new tab ↗":`Aprila in una nuova scheda ↗`,"Starting {label}…":`Avvio di {label}…`," on port {port}":` sulla porta {port}`,"⚠️ {label} didn’t run":`⚠️ {label} non si è avviata`,"The app stopped unexpectedly.":`L’app si è fermata in modo inatteso.`,"Last output":`Ultimo output`,"(no output)":`(nessun output)`,"↻ Try again":`↻ Riprova`,"⚙️ Run settings":`⚙️ Impostazioni di avvio`,"🛠️ How should the office run this app?":`🛠️ Come deve avviare questa app l’ufficio?`,"This floor has no package.json to fall back on.":`Questo piano non ha un package.json da usare come riferimento.`,"Give it a command that serves the app on the floor’s port.":`Specifica un comando che avvii l’app sulla porta del piano.`,"Save & start":`Salva e avvia`,"{label} isn’t running":`{label} non è in esecuzione`,"Start it to try the PR’s head right here, beside {branch}. It runs from a worktree of its own and stops after a while unwatched.":`Avviala per provare l’ultimo commit della PR qui, accanto a {branch}. Usa un worktree dedicato e si ferma dopo un periodo senza spettatori.`,"Start it to use it right here. It runs from the floor’s own preview worktree on port {port}.":`Avviala per usarla qui. Usa il worktree di anteprima del piano sulla porta {port}.`,"▶ Start {label}":`▶ Avvia {label}`,Channels:`Canali`,"The floor’s app on {branch}":`App del piano su {branch}`,"No open PRs: each one gets a channel here, to try it running beside {branch}.":`Nessuna PR aperta: ciascuna avrà un canale qui per provarla accanto a {branch}.`,"✅ passing":`✅ superati`,"❌ failing":`❌ falliti`,"⏳ running":`⏳ in corso`,none:`nessuno`,draft:`bozza`,"Checks:":`Controlli:`,"PR #{number}: checks and QA":`PR #{number}: controlli e QA`,"Full report ↗":`Rapporto completo ↗`,"QA is testing it now.":`Il QA la sta verificando.`,"No QA report yet.":`Nessun rapporto QA.`,"QA hasn’t tested this PR yet.":`Il QA non ha ancora verificato questa PR.`,pass:`superato`,fail:`fallito`,skip:`saltato`,Path:`Percorso`,"Path to open on both sides":`Percorso da aprire su entrambi i lati`,"Open on both":`Apri su entrambi`,"Shows each side through the office so it can follow the other’s scrolling and links. Works for plain web pages that scroll the page itself.":`Mostra entrambi i lati tramite l’ufficio per sincronizzare scorrimento e link. Funziona per pagine web che scorrono nella finestra principale.`,"Sync scrolling":`Sincronizza scorrimento`,"⇅ synced":`⇅ sincronizzato`,"the PR":`la PR`,"App controls":`Comandi dell’app`,"Restart {label}":`Riavvia {label}`,"Restart {label} from the PR’s latest commit":`Riavvia {label} dall’ultimo commit della PR`,"↻ Restart":`↻ Riavvia`,"{branch} on the left, PR #{number} on the right":`{branch} a sinistra, PR #{number} a destra`,"⇆ Compare with {branch}":`⇆ Confronta con {branch}`,"Reload the app":`Ricarica l’app`,"⟳ Reload":`⟳ Ricarica`,"Viewport width":`Larghezza della visualizzazione`,"390px wide":`Larghezza 390 px`,"📱 Phone":`📱 Telefono`,"Open in new tab ↗":`Apri in una nuova scheda ↗`,"Open in new tab":`Apri in una nuova scheda`,"Blank, or “refused to connect”? The app may block being framed: use":`Pagina vuota o “connessione rifiutata”? L’app potrebbe impedire l’incorporamento: usa`,"Keys typed in the app stay in the app, so":`I tasti premuti nell’app restano nell’app, quindi`,"only closes this panel when focus is outside it;":`chiude il pannello solo quando la selezione è esterna;`,"always does.":`lo chiude sempre.`," A PR preview stops after a while with nobody watching it, and when its PR merges or closes.":` L’anteprima di una PR si ferma dopo un periodo senza spettatori e quando la PR viene integrata o chiusa.`,"Optional note for whoever fixes it":`Nota facoltativa per chi applicherà la correzione`,"“{title}” will be closed without merging. The branch stays on GitHub.":`“{title}” verrà chiusa senza merge. Il branch resterà su GitHub.`,"by {name}":`di {name}`,"Nothing waits on you. The team carries on, and your phone hears when that changes.":`Nessuna decisione in attesa. Il team continua e il telefono ti avviserà quando servirà il tuo intervento.`,"👥 Team changes":`👥 Modifiche al team`,"⚠️ Pull requests that need you":`⚠️ Pull request che richiedono il tuo intervento`,Standard:`Standard`,"Deuteranopia (green-weak)":`Deuteranopia (ridotta percezione del verde)`,"Protanopia (red-weak)":`Protanopia (ridotta percezione del rosso)`,"Tritanopia (blue-yellow)":`Tritanopia (blu-giallo)`,idle:`inattivo`,waiting:`in attesa`,busy:`impegnato`,"needs attention":`richiede attenzione`,failed:`fallito`,Idle:`Inattivo`,"Setting up":`In preparazione`,Working:`Al lavoro`,Finished:`Completato`,"Needs help":`Serve aiuto`,Stopped:`Fermato`,Free:`Libero`,"Free for a chat":`Disponibile per la chat`,"Read-only analysis":`Analisi in sola lettura`,Testing:`Verifica`,"Fixing PR #{number}":`Correzione della PR #{number}`,"Needs you to sign in":`Richiede il tuo accesso`,"Waiting for {provider} to be signed in":`In attesa dell’accesso a {provider}`,Christmas:`Natale`,"New Year's Eve":`Capodanno`,"Valentine's Day":`San Valentino`,Easter:`Pasqua`,"Your birthday":`Il tuo compleanno`,Halloween:`Halloween`,"24–31 Oct":`24–31 ott`,"1–26 Dec":`1–26 dic`,"31 Dec–1 Jan":`31 dic–1 gen`,"12–14 Feb":`12–14 feb`,"Good Friday to Easter Monday":`Dal Venerdì Santo a Pasquetta`,"on the day you set":`nel giorno impostato`,"A pull request needs me":`Una pull request richiede il mio intervento`,"A message from the CEO":`Un messaggio dal CEO`,"A team change waits for my decision":`Una modifica al team attende la mia decisione`,"Someone is stuck in an error for over 10 minutes":`Un agente è bloccato da un errore da oltre 10 minuti`,"Claude's usage limit pauses or paces the office":`Il limite di utilizzo di Claude sospende o rallenta l’ufficio`,"Every merge":`Ogni merge`,"Nobody works here yet.":`Non lavora ancora nessuno qui.`,Agent:`Agente`,Status:`Stato`,Doing:`Attività`,Actions:`Azioni`,"Open {name}’s terminal":`Apri il terminale di {name}`,"Sign {name}’s {provider} in, in their terminal":`Accedi a {provider} per {name} nel suo terminale`,"👥 Floor {floor}: {repo}":`👥 Piano {floor}: {repo}`,"👥 Lobby":`👥 Hall`,Lobby:`Hall`,"🛗 Go there":`🛗 Vai lì`,"🖥️ App":`🖥️ App`,Floors:`Piani`,"{people} people, {busy} busy · {issues} open issues · {qa} in QA · {ready} ready to merge":`{people} persone, {busy} al lavoro · {issues} issue aperte · {qa} in QA · {ready} pronte al merge`," · {count} need you":` · {count} richiedono il tuo intervento`,"Who is on floor {floor}":`Chi si trova al piano {floor}`,"Who is in the lobby":`Chi si trova nella hall`,"{people} people, {working} working":`{people} persone, {working} al lavoro`,Building:`Sviluppo`,Fixing:`Correzione`,"Needs you":`Richiede te`,"📡 Reconnecting to the office…":`📡 Riconnessione all’ufficio…`,"📡 Connecting to the office…":`📡 Connessione all’ufficio…`,"⏸ Claude’s usage limit was reached: no new work starts":`⏸ Limite di utilizzo di Claude raggiunto: non parte nuovo lavoro`,"🐢 Pacing new work after a usage warning":`🐢 Nuovo lavoro rallentato dopo un avviso di utilizzo`," until {time}":` fino alle {time}`,"{count} decisions waiting on you":`{count} decisioni attendono il tuo intervento`,"Approvals →":`Approvazioni →`,"Next: {job}":`Prossimo: {job}`,"No projects yet. Connect a repo from the manager’s console in the 3D office.":`Nessun progetto. Collega un repository dalla console del manager nell’ufficio 3D.`,"Floor {floor} pipeline":`Flusso di lavoro del piano {floor}`,"👥 {team} · {busy} busy · 📋 {backlog} in backlog":`👥 {team} · {busy} al lavoro · 📋 {backlog} nel backlog`,Board:`Bacheca`,"No projects yet.":`Nessun progetto.`,"📱 Pocket mode":`📱 Modalità tascabile`,"This is the office without the 3D building, for phones and touch screens. It’s picked on its own on small or touch screens; this device remembers what you last chose. To reach the office from your phone safely, see":`È l’ufficio senza l’edificio 3D, per telefoni e schermi touch. Viene scelto automaticamente su schermi piccoli o touch; il dispositivo ricorda l’ultima scelta. Per accedere in sicurezza dal telefono, vedi`,Connected:`Connesso`,"Not connected":`Non connesso`,"⏸ paused":`⏸ in pausa`,"🐢 pacing":`🐢 rallentato`,"The office isn’t set up yet. Finish the setup in the 3D office (on a computer is easiest), then come back.":`L’ufficio non è ancora configurato. Completa la configurazione nell’ufficio 3D (è più semplice da un computer), poi torna qui.`,"Pocket office":`Ufficio tascabile`,"Pick an issue or a PR…":`Scegli un’issue o una PR…`,"🔍 Test":`🔍 Verifica`,"▶ Start":`▶ Avvia`,"💬 Message":`💬 Scrivi`,"Give {name} an issue or a pull request to test":`Assegna a {name} un’issue o una pull request da verificare`,"Ask {name} for a follow-up…":`Chiedi un approfondimento a {name}…`,"Up next: {jobs}":`In coda: {jobs}`,"No floors yet, so no team.":`Nessun piano, quindi nessun team.`,"{count} agents":`{count} agenti`,"its default model":`modello predefinito`,"The Agent SDK runs Claude Code for every agent (Settings → How agents run)":`L’Agent SDK esegue Claude Code per tutti gli agenti (Impostazioni → Esecuzione degli agenti)`,"Empty: the default for their coding agent":`Vuoto: valore predefinito dello strumento di sviluppo`,"✅ hired":`✅ assunto`,"👋 left":`👋 rimosso`,"✋ declined":`✋ rifiutato`,"🤝 kept":`🤝 confermato`,"A new agent":`Un nuovo agente`,"Leaving the team":`Uscita dal team`,"removed floor":`piano rimosso`,Done:`Fatto`,Change:`Modifica`,"Your note: “{note}”":`La tua nota: “{note}”`,Decline:`Rifiuta`,"Keep them":`Conferma nel team`,"Hire {name}":`Assumi {name}`,Keep:`Conferma`,"Why not? (optional, the CEO reads it)":`Perché no? (facoltativo, il CEO lo leggerà)`,"{count} new agents waiting in the lobby":`{count} nuovi agenti in attesa nella hall`,"Meet them":`Incontrali`,"👥 Waiting on you":`👥 In attesa di te`,"Nothing waiting. When the CEO wants a floor’s team to grow or shrink, the change shows up here for your OK.":`Nessuna richiesta. Quando il CEO propone di ampliare o ridurre un team, la modifica compare qui per la tua approvazione.`,"👥 Grow a floor":`👥 Amplia un team`,"✉️ Shrink a floor":`✉️ Riduci un team`,Earlier:`Precedenti`,"Audio no longer saved":`Audio non più disponibile`,"Stop this message":`Interrompi questo messaggio`,"Play this message":`Riproduci questo messaggio`,"Hands-free is on: after {name}’s spoken reply the phone listens for up to 8 s and sends what you say. Esc or M closes the mic.":`Vivavoce attivo: dopo la risposta vocale di {name}, il telefono ascolta fino a 8 secondi e invia ciò che dici. Esc o M chiude il microfono.`,"Hands-free: talk with {name} without touching anything":`Vivavoce: parla con {name} senza toccare nulla`,"Hands-free on":`Vivavoce attivo`,"Hands-free":`Vivavoce`,"typing…":`sta scrivendo…`,"busy: {job}":`impegnato: {job}`,"will reply when a session slot frees up ({running}/{max} busy)":`risponderà quando si libera una sessione ({running}/{max} occupate)`,"reading your message…":`sta leggendo il messaggio…`,"next up: {job}":`prossimo: {job}`,available:`disponibile`,"Messages with {name}":`Messaggi con {name}`,"Say hi to {name}. Ask how things are going, hand over a project brief, or ask whether a team should grow. Replies land here, and the phone buzzes when {name} needs you.":`Saluta {name}. Chiedi come procede, invia un obiettivo di progetto o chiedi se ampliare un team. Le risposte arrivano qui e il telefono vibra quando {name} ha bisogno di te.`,"{count} pull requests passed QA and are ready for you to merge ({projects}).":`{count} pull request hanno superato il QA e sono pronte per il merge ({projects}).`,"{count} pull requests need your call: the team can’t move them on alone.":`{count} pull request richiedono una tua decisione: il team non può procedere da solo.`,"{count} team changes are waiting in Team.":`{count} modifiche al team attendono nella scheda Team.`,"{running} of {max} session slots are busy right now.":`{running} sessioni su {max} sono occupate.`,"Nobody is working at the moment ({max} session slots free).":`Nessun agente sta lavorando ({max} sessioni libere).`,"{count} sessions are running right now.":`{count} sessioni sono attive.`,"Nobody is working at the moment.":`Nessun agente sta lavorando al momento.`,"{repo} has {count} open issues and free agents, but auto-assign is off.":`{repo} ha {count} issue aperte e agenti liberi, ma l’assegnazione automatica è disattivata.`,"Most work in flight: {repo} ({issues} issues, {pulls} PRs).":`Più lavoro in corso: {repo} ({issues} issue, {pulls} PR).`,"{name} is {job}.":`{name}: {job}.`,"{name} reviews the company next at {time}.":`{name} rivedrà l’azienda alle {time}.`,"{name}’s periodic reviews are off.":`Le revisioni periodiche di {name} sono disattivate.`,"No projects yet. Connect a repo in the manager’s office (lobby, back left) and the CEO will staff it.":`Nessun progetto. Collega un repository nell’ufficio del manager (in fondo a sinistra nella hall); il CEO proporrà il team.`,"Open a panel":`Apri un pannello`,"🧑💼 Console":`🧑💼 Console`,"👥 Floor list":`👥 Elenco piani`,"❓ Help":`❓ Aiuto`,project:`progetto`,projects:`progetti`,"open issues":`issue aperte`,"open PRs":`PR aperte`,"on staff":`nel team`,"working now":`al lavoro`,"Today’s report":`Rapporto di oggi`,Projects:`Progetti`,Go:`Vai`," ({count} busy)":` ({count} al lavoro)`,Phone:`Telefono`," (not installed)":` (non installato)`," (incompatible version)":` (versione incompatibile)`,"Move {name} to the cloud?":`Spostare {name} nel cloud?`,"Move {name} back to this computer?":`Riportare {name} su questo computer?`,"Their local machine is removed (work that isn’t on GitHub is saved to leftovers first), and their next session starts fresh in an Upstash Box of their own.":`La macchina locale viene rimossa (il lavoro non pubblicato su GitHub viene prima salvato in leftovers) e la prossima sessione partirà da zero in un Upstash Box dedicato.`,"Their cloud machine is removed (work that isn’t on GitHub is saved to leftovers first), and their next session starts fresh.":`La macchina cloud viene rimossa (il lavoro non pubblicato su GitHub viene prima salvato in leftovers) e la prossima sessione partirà da zero.`,Move:`Sposta`,"Move them once their task is done":`Sposta l’agente al termine dell’incarico`,"Where they work":`Dove lavora`,"Works on":`Lavora su`," (connect Upstash in Settings first)":` (collega prima Upstash nelle Impostazioni)`," (OpenCode can’t run there)":` (OpenCode non può essere eseguito qui)`,"no Box yet":`nessun Box`,"creating their Box…":`creazione del Box…`,"setting up their Box…":`configurazione del Box…`,"Box ready":`Box pronto`,"Box paused (wakes for their next task)":`Box in pausa (si riattiva al prossimo incarico)`,"reconnecting to their Box…":`riconnessione al Box…`,"their Box couldn't be set up":`impossibile configurare il Box`,"agent default":`valore predefinito dell’agente`,"OpenCode model: provider/model#variant (empty = OpenCode default)":`Modello OpenCode: provider/model#variant (vuoto = predefinito di OpenCode)`,"The CEO’s model":`Modello del CEO`,"Their model (empty = the default for their coding agent)":`Modello dell’agente (vuoto = predefinito del suo strumento)`,"The CEO’s effort":`Ragionamento del CEO`,"Their effort":`Ragionamento dell’agente`,"default ({effort})":`predefinito ({effort})`,"Character look":`Aspetto del personaggio`,Look:`Aspetto`,"{name} as they’ll look":`Anteprima dell’aspetto di {name}`,Hair:`Capelli`,"Facial hair":`Barba e baffi`,Glasses:`Occhiali`,Headwear:`Copricapo`,"A hat doesn’t fit over {hair} hair":`Il cappello non è compatibile con i capelli {hair}`,Outfit:`Abbigliamento`,"Blazer and lanyard (uniform)":`Giacca e laccetto (divisa)`,Build:`Corporatura`,"Hair colour":`Colore dei capelli`,"Skin tone":`Tonalità della pelle`,"Accent colour":`Colore di dettaglio`,"🎲 Shuffle":`🎲 Casuale`,"↺ Back to their seeded look":`↺ Ripristina l’aspetto originale`,"Accent: glasses frames, hats and the stripe.":`Dettagli: montature degli occhiali, cappelli e striscia.`,"Short crop":`Corti`,Long:`Lunghi`,Ponytail:`Coda`,Bun:`Chignon`,Quiff:`Ciuffo`,Afro:`Afro`,"Side part":`Riga laterale`,"Buzz cut":`Rasati`,Bald:`Calvo`,Curls:`Ricci`,Bob:`Caschetto`,Mohawk:`Cresta`,Locs:`Dreadlock`,"T-shirt":`Maglietta`,Hoodie:`Felpa con cappuccio`,"Striped tee":`Maglietta a righe`,Sweater:`Maglione`,Cardigan:`Cardigan`,Turtleneck:`Dolcevita`,"What they’re told":`Istruzioni ricevute`,"Couldn’t load their prompt.":`Impossibile caricare il prompt.`,"The CEO’s instructions for every job. They’re all the office’s own.":`Le istruzioni del CEO per ogni incarico, definite dall’ufficio.`,"The office’s workflow and safety rules for each kind of task, the same for every agent and sent with every session; <placeholders> are filled in per task.":`Flusso di lavoro e regole di sicurezza per ogni tipo di incarico, uguali per tutti gli agenti e inviati a ogni sessione; i <placeholders> vengono compilati per l’incarico.`,"{count} characters":`{count} caratteri`,"{name}’s prompt: {label}":`Prompt di {name}: {label}`,"{name}’s setup":`Configurazione di {name}`,"Applies from their next task":`Vale dal prossimo incarico`,"Name and model save when you leave them; the rest, and looks, as you pick them. Running sessions aren’t restarted.":`Nome e modello vengono salvati uscendo dal campo; le altre impostazioni e l’aspetto si salvano alla selezione. Le sessioni attive non vengono riavviate.`,Copied:`Copiato`,Copy:`Copia`,saved:`salvato`,"Remove the {label}?":`Rimuovere {label}?`,"It’s deleted from the office. Cloud agents that need it can’t sign in until you add it again.":`Viene eliminato dall’ufficio. Gli agenti cloud che ne hanno bisogno non potranno accedere finché non lo aggiungerai di nuovo.`,"Not set up yet":`Non ancora configurato`,"✓ Connected":`✓ Connesso`,"{total} Boxes on your account · this office: {running} running, {paused} paused":`{total} Box nel tuo account · questo ufficio: {running} attivi, {paused} in pausa`,"Boxes not counted yet.":`Box non ancora conteggiati.`,"Delete {count} orphaned Boxes?":`Eliminare {count} Box senza agente?`,"Boxes of this office whose agent is gone. They’re deleted for good in your Upstash account.":`Box di questo ufficio il cui agente è stato rimosso. Verranno eliminati definitivamente dal tuo account Upstash.`,Delete:`Elimina`,"Delete {count} orphans":`Elimina {count} Box senza agente`,"☁️ Cloud agents":`☁️ Agenti cloud`,"Run agents in":`Esegui gli agenti in`,"instead of on this computer. A cloud agent keeps working on its task when you close the office or shut your laptop, and the office catches up when it’s back. Agents on this computer stay the default.":`anziché su questo computer. Un agente cloud continua l’incarico quando chiudi l’ufficio o il portatile; l’ufficio si aggiorna alla riapertura. Gli agenti locali restano l’opzione predefinita.`,"Upstash account":`Account Upstash`,"Upstash Box API key":`Chiave API Upstash Box`,"Any text works in the demo":`Nella demo va bene qualsiasi testo`,"Your Box API key":`La tua chiave API Box`,"Create one in the Upstash console (console.upstash.com → Box → API Keys). It stays on the office’s computer.":`Creala nella console Upstash (console.upstash.com → Box → API Keys). Resta sul computer dell’ufficio.`,"Where new agents work":`Dove lavorano i nuovi agenti`,"🖥️ This computer":`🖥️ Questo computer`,"☁️ An Upstash Box each":`☁️ Un Upstash Box ciascuno`," (save your API key first)":` (salva prima la chiave API)`,"New hires work here; the lobby lets you pick for each one. Move an agent from their settings when they have no task.":`I nuovi agenti lavorano qui; puoi scegliere per ciascuno nella hall. Sposta un agente dalle sue impostazioni quando non ha incarichi.`,"Box size":`Dimensione del Box`,"per active CPU hour":`per ora di CPU attiva`,"Your plan’s Box limit":`Limite di Box del tuo piano`,"How cloud agents sign in":`Accesso degli agenti cloud`,"GitHub is set up once for every Box. Coding agents sign in with your own subscription in each cloud agent’s terminal, once per cloud machine, unless you give them a key here.":`GitHub viene configurato una volta per ogni Box. Gli strumenti di sviluppo accedono con il tuo abbonamento nel terminale di ogni agente cloud, una volta per macchina, a meno che tu non fornisca una chiave qui.`,"Your gh login":`Il tuo accesso gh`,"A token you saved":`Un token salvato`,"Your gh login is used unless you save a fine-grained token for your floors’ repos (Contents, Pull requests and Issues: read and write), which is safer.":`Viene usato il tuo accesso gh, salvo che tu salvi un token con permessi granulari per i repository dei piani (Contents, Pull requests e Issues: lettura e scrittura), opzione più sicura.`,"GitHub token":`Token GitHub`,"Your subscription, per agent":`Il tuo abbonamento, per agente`,"Your Claude subscription (CUBEFARM_CLAUDE_TOKEN)":`Il tuo abbonamento Claude (CUBEFARM_CLAUDE_TOKEN)`,"An Anthropic API key":`Una chiave API Anthropic`,"With your Claude subscription (Pro or Max), each cloud agent signs in once, in their own terminal. When one needs it, their desk shows a 🔑 note and their card a 🔑 Sign in: open the link in their terminal, approve it and paste the code back there. Their cloud machine keeps the sign-in; if it ever expires, the same steps sign them in again.":`Con il tuo abbonamento Claude (Pro o Max), ogni agente cloud accede una volta nel proprio terminale. Quando serve, la postazione mostra un avviso 🔑 e la scheda il comando 🔑 Accedi: apri il link nel terminale, autorizza e incolla lì il codice. La macchina cloud conserva l’accesso; se scade, ripeti gli stessi passaggi.`,"Or pay per token with an API key, which every cloud agent then uses instead:":`Oppure paga per token con una chiave API, che verrà usata da tutti gli agenti cloud:`,"Anthropic API key":`Chiave API Anthropic`,"Or one subscription token for every cloud agent":`Oppure un token di abbonamento per tutti gli agenti cloud`,"In a terminal:":`In un terminale:`,"and approve it in your browser. It prints a token that lasts a year.":`e autorizza nel browser. Verrà mostrato un token valido per un anno.`,"Keep it in your environment as":`Conservalo nell’ambiente come`,"macOS or Linux: add":`macOS o Linux: aggiungi`,"to your shell profile.":`al profilo della shell.`,"Restart the office.":`Riavvia l’ufficio.`,"The office never writes it down: Anthropic’s terms keep apps like this one from storing Claude tokens.":`L’ufficio non lo salva mai: le condizioni di Anthropic vietano ad app come questa di conservare token Claude.`,"Your ChatGPT plan, per agent":`Il tuo piano ChatGPT, per agente`,"An OpenAI API key":`Una chiave API OpenAI`,"With your ChatGPT plan, each cloud agent signs in once in their own terminal: open the link it shows and enter its one-time code. Or an OpenAI API key works in every Box:":`Con il tuo piano ChatGPT, ogni agente cloud accede una volta nel proprio terminale: apri il link mostrato e inserisci il codice monouso. In alternativa, una chiave API OpenAI funziona in tutti i Box:`,"OpenAI API key":`Chiave API OpenAI`,"Try what happens when a cloud agent’s sign-in runs out: every Box is signed out, and its agent asks to be signed in again.":`Prova cosa succede quando scade l’accesso di un agente cloud: tutti i Box vengono disconnessi e gli agenti richiedono un nuovo accesso.`,"🔑 Expire sign-ins (demo)":`🔑 Fai scadere gli accessi (demo)`,"Boxes cost what their CPU does while they work (paused Boxes cost nothing but their disk), and the free plan allows 10 Boxes. Setup, costs and what keeps going while the office is closed:":`Il costo dei Box dipende dall’uso della CPU durante il lavoro (in pausa si paga solo il disco); il piano gratuito consente 10 Box. Configurazione, costi e attività che continuano a ufficio chiuso:`,"🔔 Notifications":`🔔 Notifiche`,"What the office tells you when you’re not looking. At most one of each kind a minute; a burst arrives as one summary.":`Gli avvisi dell’ufficio quando non lo stai guardando. Al massimo uno per tipo al minuto; gli avvisi ravvicinati vengono riassunti.`,"Tell me when":`Avvisami quando`,"Office address for links (optional)":`Indirizzo dell’ufficio per i link (facoltativo)`,"This device":`Questo dispositivo`,"Phone app":`App per il telefono`,On:`Attivo`,"🔑 Saved":`🔑 Salvato`,"Sending…":`Invio…`,"Saving…":`Salvataggio…`,"✓ Sent":`✓ Inviato`,"Remove the {service} settings?":`Rimuovere le impostazioni di {service}?`,"They are deleted from the office. Nothing more is sent there until you add them again.":`Vengono eliminate dall’ufficio. Non verrà più inviato nulla finché non le aggiungerai di nuovo.`,"Pick a long, hard-to-guess topic and subscribe to it in the ntfy app. Anyone who knows the topic can read it.":`Scegli un argomento lungo e difficile da indovinare e iscriviti tramite l’app ntfy. Chiunque conosca l’argomento può leggerlo.`,"Topic URL":`URL dell’argomento`,"Access token (optional)":`Token di accesso (facoltativo)`,"Desktop notifications":`Notifiche desktop`,"From any browser with the office open in a background tab.":`Da qualsiasi browser con l’ufficio aperto in una scheda in secondo piano.`,"✓ Allowed in this browser":`✓ Consentite in questo browser`,"Blocked in this browser: allow notifications for this site in its settings.":`Bloccate in questo browser: autorizza le notifiche per questo sito nelle impostazioni.`,"This browser can’t show notifications.":`Questo browser non può mostrare notifiche.`,"Allow in this browser":`Consenti in questo browser`,"Push to my devices":`Notifiche push ai miei dispositivi`,"Reaches a phone or PC even with the office closed.":`Raggiunge telefono o PC anche con l’ufficio chiuso.`,"{count} devices signed up.":`{count} dispositivi registrati.`,"No devices signed up yet.":`Nessun dispositivo registrato.`,"Push needs HTTPS (or localhost on the office’s own PC). Open the office through an HTTPS address such as Tailscale Serve: see":`Le notifiche push richiedono HTTPS (o localhost sul PC dell’ufficio). Apri l’ufficio tramite un indirizzo HTTPS, ad esempio Tailscale Serve: vedi`,"This browser has no Web Push. On an iPhone, add the office to the home screen first, then turn push on from there.":`Questo browser non supporta Web Push. Su iPhone, aggiungi prima l’ufficio alla schermata Home e attiva le notifiche da lì.`,"Push works in a built office (npm run build), not under the dev server.":`Le notifiche push funzionano dopo la build (npm run build), non con il server di sviluppo.`,"Stop push to this device":`Disattiva le notifiche push su questo dispositivo`,"Signing up…":`Registrazione…`,"Push to this device":`Notifiche push su questo dispositivo`,"Send test":`Invia prova`,"The topic and token stay on the office’s PC and are never shown again. Setup for each, and how to reach the office from your phone safely:":`Argomento e token restano sul PC dell’ufficio e non vengono più mostrati. Configurazione e accesso sicuro dal telefono:`,"🔑 Key saved":`🔑 Chiave salvata`,"Remove the ElevenLabs key?":`Rimuovere la chiave ElevenLabs?`,"It is deleted from this PC. Messages are not read aloud by ElevenLabs until you add a key again.":`Viene eliminata da questo PC. ElevenLabs non leggerà più i messaggi finché non aggiungerai una nuova chiave.`,"Stop the preview of {name}":`Interrompi l’anteprima di {name}`,"Preview {name}":`Anteprima di {name}`,"Says the test line in this voice":`Legge la frase di prova con questa voce`,"▶ Preview":`▶ Anteprima`,"Couldn’t load the voices.":`Impossibile caricare le voci.`,"Loading the voices…":`Caricamento delle voci…`,"Search voices":`Cerca voci`,"Search by name, accent, age…":`Cerca per nome, accento, età…`,"ElevenLabs voices":`Voci ElevenLabs`,"⭐ Recommended":`⭐ Consigliate`,"All voices":`Tutte le voci`,"No voice matches “{query}”.":`Nessuna voce corrisponde a “{query}”.`,"This browser can’t speak. Try Chrome or Edge, or pick ElevenLabs.":`Questo browser non può leggere i messaggi. Prova Chrome o Edge, oppure scegli ElevenLabs.`,"The browser’s default":`Valore predefinito del browser`,"The browser hasn’t listed its voices yet; its default voice is used.":`Il browser non ha ancora elencato le voci; viene usata quella predefinita.`,"Clear saved clips?":`Eliminare le registrazioni salvate?`,"Messages read by ElevenLabs can’t be replayed from the phone after this. New messages are saved again as they arrive.":`I messaggi letti da ElevenLabs non potranno più essere riascoltati dal telefono. I nuovi messaggi verranno salvati al loro arrivo.`,"Keep voice clips for":`Conserva le registrazioni vocali per`,days:`giorni`,"the newest 20 CEO messages always keep theirs, so ▶ on the phone replays them for free":`le registrazioni degli ultimi 20 messaggi del CEO vengono sempre conservate e ▶ sul telefono le riproduce gratuitamente`,"Clear saved clips":`Elimina le registrazioni salvate`,"Get a key at":`Ottieni una chiave su`,"(Developers → API Keys). It stays on this PC and is never shown again. Costs and voice tips are in":`(Developers → API Keys). Resta su questo PC e non verrà più mostrata. Costi e suggerimenti sulle voci sono in`,"Also speak office alerts":`Leggi anche gli avvisi dell’ufficio`,"Save a key and pick a voice first":`Salva prima una chiave e scegli una voce`,"Previews and tests play at your volume; M mutes them.":`Anteprime e prove usano il tuo volume; M le silenzia.`,"What you say is recorded in this browser (60 seconds at most) and sent through the office to ElevenLabs, which charges by the length of the audio. A restricted key needs the Speech to Text permission.":`La voce viene registrata nel browser (massimo 60 secondi) e inviata tramite l’ufficio a ElevenLabs, che addebita in base alla durata dell’audio. Una chiave con restrizioni richiede il permesso Speech to Text.`,"Needs {name}’s voice: pick one under Speak messages":`Richiede la voce di {name}: scegline una in Leggi i messaggi`,"Hands-free on the phone: after {name}’s spoken reply, listen for up to 8 s and send what I say":`Vivavoce sul telefono: dopo la risposta vocale di {name}, ascolta fino a 8 secondi e invia ciò che dico`,"(needs Speak messages above)":`(richiede Leggi i messaggi qui sopra)`,"the CEO":`il CEO`,"🌦️ Weather":`🌦️ Meteo`,"Where the weather comes from":`Origine del meteo`,"Calm cycle":`Ciclo tranquillo`,"a gentle, mostly fair day of its own, different every date":`un ciclo giornaliero tranquillo e prevalentemente sereno, diverso ogni giorno`,"always clear":`sempre sereno`,"My real weather":`Meteo reale`,"your city's current weather":`il meteo attuale della tua città`,"Your city":`La tua città`,"Cape Town, South Africa (or -33.92, 18.42)":`Roma, Italia (oppure 41.90, 12.50)`,"☀️ clear":`☀️ sereno`,"☁️ cloudy":`☁️ nuvoloso`,"🌦️ light rain":`🌦️ pioggia leggera`,"🌧️ heavy rain":`🌧️ pioggia intensa`,"⛈️ thunderstorm":`⛈️ temporale`,"🌫️ fog":`🌫️ nebbia`,"🌨️ snow":`🌨️ neve`,"just now":`adesso`,"{count} min ago":`{count} min fa`,"{count} h ago":`{count} ore fa`,": {weather}, read {ago}":`: {weather}, rilevato {ago}`,": looking it up…":`: ricerca in corso…`,"The office’s server looks the city up once with Open-Meteo’s free geocoder, then sends only its coordinates (to about a kilometre) every 15 minutes. While it’s offline the office shows the calm cycle.":`Il server cerca la città una volta con il geocodificatore gratuito di Open-Meteo, poi invia solo le coordinate (con una precisione di circa un chilometro) ogni 15 minuti. Quando è offline, l’ufficio mostra il ciclo tranquillo.`,"🛸 World events":`🛸 Eventi esterni`,"Now and then something happens outside: a plane, a blimp with the office’s news, fireworks at night, a UFO… and very rarely a friendly kaiju. Idle agents run to the windows to watch.":`Ogni tanto succede qualcosa fuori: un aereo, un dirigibile con le notizie dell’ufficio, fuochi d’artificio notturni, un UFO… e molto raramente un kaiju amichevole. Gli agenti liberi corrono alle finestre a guardare.`,"How often":`Frequenza`,"Rare (every half hour or so)":`Raro (circa ogni mezz’ora)`,"Normal (every 6–20 minutes)":`Normale (ogni 6–20 minuti)`,"Chaos (every minute or two)":`Caos (ogni uno o due minuti)`,"Keep it calm":`Mantieni la calma`,": no kaiju, giant rubber duck, whale airship or hurricane":`: niente kaiju, papere giganti, dirigibili a forma di balena o uragani`,"🎉 Themes":`🎉 Temi`,"The office dresses up for the holidays: decorations, costumes, music and a few surprises.":`L’ufficio si veste a festa: decorazioni, costumi, musica e qualche sorpresa.`,"by date":`in base alla data`,forced:`imposto`,"from the address bar":`dalla barra degli indirizzi`,"No theme today.":`Nessun tema oggi.`,"Holiday themes":`Temi delle festività`,"By date":`In base alla data`,"each holiday on its own days":`ogni festività nei suoi giorni`,"no themes at all":`nessun tema`,Always:`Sempre`,"Theme to show":`Tema da mostrare`,"Celebrate (by date)":`Festeggia (in base alla data)`,"Your birthday (the team throws a party; it beats any other theme that day)":`Il tuo compleanno (il team organizza una festa, che ha priorità sugli altri temi)`,"Birthday month":`Mese del compleanno`,"Birthday day":`Giorno del compleanno`,"Month…":`Mese…`,"Day…":`Giorno…`,Clear:`Svuota`,January:`Gennaio`,February:`Febbraio`,March:`Marzo`,April:`Aprile`,May:`Maggio`,June:`Giugno`,July:`Luglio`,August:`Agosto`,September:`Settembre`,October:`Ottobre`,November:`Novembre`,December:`Dicembre`,"Preview any theme with":`Visualizza un tema con`,"in the address bar (or":`nella barra degli indirizzi (oppure`,"to pretend it’s another day).":`per simulare un’altra data).`,Reset:`Ripristina`,"Reset {label}":`Ripristina {label}`,"How statuses look":`Aspetto degli stati`,"Follow my system setting":`Segui l’impostazione di sistema`,"Always reduce motion":`Riduci sempre le animazioni`,"Full motion":`Animazioni complete`,"💬 Captions":`💬 Sottotitoli`,"Show captions":`Mostra i sottotitoli`,"The CEO’s messages written out as they’re read aloud, and short captions for important sounds (the gong, a merge cheer, alarms, the jukebox) with an arrow towards where they came from.":`Mostra i messaggi del CEO mentre vengono letti e brevi descrizioni dei suoni importanti (gong, festeggiamenti per un merge, allarmi, jukebox), con una freccia che ne indica la provenienza.`,"Caption size":`Dimensione dei sottotitoli`,"Caption background":`Sfondo dei sottotitoli`,"PR number 12 is ready to merge.":`La PR numero 12 è pronta per il merge.`,"🎨 Colour and status":`🎨 Colori e stati`,"Status colours":`Colori degli stati`,"Always on with a colour-blind palette.":`Sempre attivo con una palette per daltonismo.`,"On name tags, the whiteboard, Kanban cards, status pills and toasts.":`Su cartellini, lavagna, schede Kanban, indicatori di stato e notifiche.`,"Shapes beside status colours (✓ ✕ ! ⏳)":`Simboli accanto ai colori degli stati (✓ ✕ ! ⏳)`,"🌀 Motion":`🌀 Movimento`,"Field of view":`Campo visivo`,narrower:`più stretto`,wider:`più ampio`,normal:`normale`,"Head bob while walking":`Oscillazione della testa mentre cammini`,"The view tipping back when you sip a coffee, and any screen shake.":`Inclinazione della visuale quando bevi un caffè e vibrazioni dello schermo.`,"Camera sway and shake":`Oscillazioni e vibrazioni della telecamera`,"Reduce motion":`Riduci le animazioni`,"(your system asks for less motion)":`(il sistema richiede animazioni ridotte)`,"(your system doesn’t ask for less motion)":`(il sistema non richiede animazioni ridotte)`,"Reduced motion: confetti bursts become a glow, the elevator doors cut to a fade, and panels, toasts and badges appear without moving.":`Con le animazioni ridotte, i coriandoli diventano un bagliore, le porte dell’ascensore una dissolvenza e pannelli, notifiche e badge compaiono senza muoversi.`,"On now.":`Attivo ora.`,"Off now.":`Disattivato ora.`,"A dot fixed in the middle of the view, which helps some people with motion sickness.":`Un punto fisso al centro della visuale, utile per alcune persone che soffrono di nausea da movimento.`,"Centre dot":`Punto centrale`,"🔎 Size and readability":`🔎 Dimensioni e leggibilità`,"UI scale":`Scala dell’interfaccia`,"The HUD, the phone, the console and every panel, from 80% to 150%.":`HUD, telefono, console e tutti i pannelli, dall’80% al 150%.`,"Verdana, with wider letter, word and line spacing, as dyslexia style guides recommend.":`Verdana, con maggiore spazio tra lettere, parole e righe, come raccomandato dalle guide per la dislessia.`,"Dyslexia-friendly font":`Carattere adatto alla dislessia`,"Plain white panels, darker grey text, heavier borders and focus rings.":`Pannelli bianchi, testo grigio più scuro, bordi e indicatori di selezione più marcati.`,"High-contrast panels":`Pannelli ad alto contrasto`,"⌨️ Keyboard and screen readers":`⌨️ Tastiera e lettori di schermo`,"opens your phone from anywhere: its":`apre il telefono ovunque: la scheda`,"tab opens the console, this floor’s Kanban, the floor list, help and these settings.":`apre console, Kanban del piano, elenco piani, aiuto e queste impostazioni.`,"opens help. In any panel,":`apre l’aiuto. In ogni pannello,`,and:`e`,"move between controls,":`consentono di spostarsi tra i controlli,`,or:`oppure`,"uses one and":`attiva il controllo e`,"closes it; focus goes back where it was. Screen readers hear the CEO’s messages and alarms as they happen.":`lo chiude, riportando la selezione alla posizione precedente. I lettori di schermo annunciano i messaggi del CEO e gli allarmi quando arrivano.`,"👥 List view of this floor":`👥 Elenco di questo piano`,"Reset accessibility settings":`Ripristina le impostazioni di accessibilità`,"👤 Profile":`👤 Profilo`,"Everyone else with the office open sees you walk about as a visitor, with this name and colour on your tag and lanyard. Each browser is its own visitor.":`Chi ha aperto l’ufficio ti vede camminare come visitatore, con questo nome e colore sul cartellino e sul laccetto. Ogni browser è un visitatore distinto.`,Visitor:`Visitatore`,"Your colour":`Il tuo colore`,"Colour {colour}":`Colore {colour}`,"Any colour":`Qualsiasi colore`,"Appear to others":`Mostrati agli altri`,": off, you still see everyone, but nobody sees you, your emotes or your pings.":`: se disattivato, continui a vedere tutti, ma nessuno vede te, le tue espressioni o le tue segnalazioni.`,"Issue title, e.g. Add a dark mode toggle":`Titolo dell’issue, es. Add a dark mode toggle`,"Issue title":`Titolo dell’issue`,"Issue description":`Descrizione dell’issue`,"Describe what you want. Acceptance criteria help the agent who builds it and the one who tests it a lot.":`Descrivi il risultato desiderato. I criteri di accettazione aiutano sia l’agente che sviluppa sia quello che verifica.`,"Who works on it":`Chi ci lavora`,"Leave in backlog (auto-assign picks it up if enabled)":`Lascia nel backlog (l’assegnazione automatica la prenderà in carico, se attiva)`,"Give it to {name} right away":`Assegna subito a {name}`,"Filing…":`Creazione…`,"File issue on GitHub":`Crea issue su GitHub`,"QA report ↗":`Rapporto QA ↗`,"This floor no longer exists.":`Questo piano non esiste più.`,"Merge PR #{number}?":`Eseguire il merge della PR #{number}?`,"“{title}” passed QA. It will be squash-merged into {branch}.":`“{title}” ha superato il QA. Verrà integrata in {branch} con squash merge.`,"Squash & merge":`Squash e merge`,"Merge PR #{number} without QA?":`Eseguire il merge della PR #{number} senza QA?`,"“{title}” has not passed QA yet. Merge it into {branch} anyway?":`“{title}” non ha ancora superato il QA. Integrarla comunque in {branch}?`,"Merge anyway":`Esegui comunque il merge`,Merge:`Esegui merge`,"Send PR #{number} back for a fix?":`Rinviare la PR #{number} per una correzione?`,"Its author, or any free agent, fixes it with QA’s findings, then it’s tested once more.":`L’autore o un agente libero applicherà le correzioni indicate dal QA, poi la PR verrà verificata di nuovo.`,"Optional note, e.g. merge main and keep both e2e tests":`Nota facoltativa, es. integra main e conserva entrambi i test e2e`,"Note for whoever fixes it":`Nota per chi applicherà la correzione`,"Send back":`Rinvia`,"Close PR #{number}?":`Chiudere la PR #{number}?`,"“{title}” will be closed without merging, and any QA or fix work on it stops. Its issue stays open and waits for you to assign it again. The branch stays on GitHub.":`“{title}” verrà chiusa senza merge e ogni attività di QA o correzione verrà fermata. L’issue resterà aperta in attesa di una nuova assegnazione. Il branch rimarrà su GitHub.`,"Close PR":`Chiudi PR`,"Run PR #{number} beside {branch} and open it in the app viewer":`Avvia la PR #{number} accanto a {branch} e aprila nel visualizzatore dell’app`,"+ New issue":`+ Nuova issue`,"⚡ Auto-assign work to free agents":`⚡ Assegna automaticamente il lavoro agli agenti liberi`,"🔀 Auto-merge when QA and checks pass":`🔀 Merge automatico dopo QA e controlli superati`,"Open this floor’s running app":`Apri l’app in esecuzione su questo piano`,"🖥️ View app":`🖥️ Visualizza app`,"Synced {time}":`Sincronizzato alle {time}`,"Syncing…":`Sincronizzazione…`,"⟳ Sync":`⟳ Sincronizza`,"📋 Backlog":`📋 Backlog`,"🔨 In progress":`🔨 In lavorazione`,"🔍 In QA":`🔍 In verifica QA`,"✅ Ready to merge":`✅ Pronte al merge`,"🎉 Merged":`🎉 Integrate`,"Assign to…":`Assegna a…`,"Everyone is busy":`Tutti gli agenti sono impegnati`,"No open issues. File one above!":`Nessuna issue aperta. Creane una qui sopra!`,"Nobody is coding right now.":`Nessun agente sta sviluppando al momento.`,"Retry QA":`Riprova QA`,"Send to QA":`Invia al QA`,"Hand it to its author, or any free agent, with QA’s findings and your note, without another QA round first":`Affidala all’autore o a un agente libero con le indicazioni del QA e la tua nota, senza un altro QA preliminare`,"Send back for a fix":`Rinvia per correzione`,"Nothing waiting for testing.":`Nessuna PR in attesa di verifica.`,"No tested pull requests yet.":`Nessuna pull request verificata.`,"Nothing merged yet.":`Nessun merge effettuato.`,"That agent has left the building.":`L’agente ha lasciato l’ufficio.`,"Their coding agent":`Il suo agente di sviluppo`,"Waiting for you to sign {provider} in, in their terminal":`In attesa del tuo accesso a {provider} nel terminale dell’agente`,"🔑 needs sign-in":`🔑 accesso richiesto`,"Trail {name} with the camera wherever they go (a movement key or Esc gives you the controls back)":`Segui {name} con la telecamera (un tasto di movimento o Esc ti restituisce i comandi)`,"{name}’s career on the team":`Carriera di {name} nel team`,"{name}’s name, look, coding agent, model and effort":`Nome, aspetto, agente di sviluppo, modello e ragionamento di {name}`,"Testing PR #{number}":`Verifica della PR #{number}`,"Fixing PR #{number} after QA":`Correzione della PR #{number} dopo il QA`,"Issue #{number}":`Issue #{number}`,"round {number}":`ciclo {number}`,"model variant":`variante del modello`,"{effort} effort":`ragionamento {effort}`,"{count} turns":`{count} turni`,"API-equivalent cost reported by the coding agent; subscription usage is billed by plan":`Costo API equivalente riportato dall’agente; l’utilizzo in abbonamento è fatturato secondo il piano`,"🔑 Sign {name}’s {provider} in":`🔑 Accedi a {provider} per {name}`,"Open the link in their terminal, sign in to ChatGPT there and enter the one-time code the terminal shows.":`Apri il link nel terminale, accedi a ChatGPT e inserisci il codice monouso mostrato nel terminale.`,"Open the link in their terminal, approve it with your Claude account, then paste the code the page gives you into the terminal and press Enter.":`Apri il link nel terminale, autorizza con il tuo account Claude, poi incolla il codice della pagina nel terminale e premi Invio.`,"Their cloud machine keeps the sign-in.":`La macchina cloud conserva l’accesso.`,"Their cloud machine keeps the sign-in, and their task starts once it’s done.":`La macchina cloud conserva l’accesso e l’incarico parte dopo il completamento.`,"Close this sign-in and show a new link":`Chiudi questo accesso e mostra un nuovo link`,"↻ Start over":`↻ Ricomincia`,"(no output yet)":`(nessun output)`,"Setting up worktree":`Preparazione del worktree`,Thinking:`Ragionamento`,"Latest browser screenshot from the agent":`Ultimo screenshot del browser dell’agente`,"Latest Playwright screenshot":`Ultimo screenshot Playwright`,"Tell {name} something while they work…":`Scrivi a {name} mentre lavora…`,"Tell {name} something while they work (typed into their terminal)…":`Scrivi a {name} mentre lavora (nel suo terminale)…`,"Ask {name} for a follow-up (resumes their session)…":`Chiedi un approfondimento a {name} (riprende la sessione)…`,"Give {name} an issue or a PR to test to get them started":`Assegna a {name} un’issue o una PR da verificare per iniziare`,"Work to give them":`Lavoro da assegnare`,"Pick an issue to build or a PR to test…":`Scegli un’issue da sviluppare o una PR da verificare…`,"Pull requests to test":`Pull request da verificare`,"Issues to build":`Issue da sviluppare`,Office:`Ufficio`,running:`in esecuzione`,"an unknown commit":`un commit sconosciuto`,"Update now":`Aggiorna ora`,Later:`Più tardi`,"Update automatically":`Aggiorna automaticamente`,"Start the office with npm run dev or npm start so it can install updates and restart itself.":`Avvia l’ufficio con npm run dev oppure npm start per consentirgli di installare gli aggiornamenti e riavviarsi.`,"Start nothing new, let running sessions finish, then update and restart the office":`Non avviare nuove attività, attendi la fine delle sessioni attive, poi aggiorna e riavvia l’ufficio`,"Keep working; ask again in 2 hours or when a newer commit lands":`Continua a lavorare; chiedi di nuovo tra 2 ore o quando arriva un nuovo commit`,"When an update is ready, start nothing new, let running sessions finish, then update and restart the office":`Quando un aggiornamento è pronto, non avviare nuove attività, attendi la fine delle sessioni attive, poi aggiorna e riavvia l’ufficio`,"Sessions still running at {time} are stopped, and their work goes back to the queue.":`Le sessioni ancora attive alle {time} vengono fermate e il loro lavoro torna in coda.`,"{agents} agents · {issues} open issues · {pulls} open PRs · default branch":`{agents} agenti · {issues} issue aperte · {pulls} PR aperte · branch predefinito`,"Your own project folder":`La tua cartella del progetto`,"A clone the office manages":`Un clone gestito dall’ufficio`," · the office’s own folder, updated from the Office row":` · cartella dell’ufficio, aggiornata dalla riga Ufficio`,"Fast-forward it to GitHub’s default branch, when that’s safe":`Aggiorna al branch predefinito di GitHub tramite fast-forward, quando è sicuro`,"clone failed:":`clonazione fallita:`,"sync failed:":`sincronizzazione fallita:`,"Floor colour":`Colore del piano`,"Floor {floor} colour":`Colore del piano {floor}`,"Merge a PR as soon as QA has signed off on its latest commit and GitHub’s checks are green":`Esegui il merge della PR quando il QA ha approvato l’ultimo commit e i controlli GitHub sono superati`,"Disconnect {repo}?":`Scollegare {repo}?`,"Everyone on this floor is let go. Nothing is deleted on GitHub, and your folder stays exactly as it is.":`Tutti gli agenti di questo piano vengono rimossi dal team. Nulla viene eliminato da GitHub e la tua cartella rimane invariata.`,"Everyone on this floor is let go. Nothing is deleted on GitHub, and the local clone stays on disk.":`Tutti gli agenti di questo piano vengono rimossi dal team. Nulla viene eliminato da GitHub e il clone locale rimane sul disco.`,"🔗 Agents here may read:":`🔗 Gli agenti di questo piano possono leggere:`,"🖥️ App preview ·":`🖥️ Anteprima app ·`,"auto-detected command":`comando rilevato automaticamente`,"Open the app viewer":`Apri il visualizzatore dell’app`,"🏢 Floors":`🏢 Piani`,"No floors yet. Add a project →":`Nessun piano. Aggiungi un progetto →`,"➕ Add a project":`➕ Aggiungi un progetto`,"The CEO has not studied this floor yet.":`Il CEO non ha ancora studiato questo piano.`,"Study the repo again and rethink the plan and the team’s size":`Studia di nuovo il repository e rivedi il piano e le dimensioni del team`,"Brief: what should this floor build next? The CEO turns it into issues and a team size.":`Obiettivo: che cosa deve sviluppare questo piano? Il CEO lo traduce in issue e dimensioni del team.`," (none yet)":` (non ancora disponibile)`,"What every QA pass must check on this project.":`Che cosa deve verificare ogni controllo QA di questo progetto.`,"Model: provider/model, or provider/model#variant for reasoning. Empty uses the OpenCode default.":`Modello: provider/model, oppure provider/model#variant per il ragionamento. Lascia vuoto per il valore predefinito di OpenCode.`,"Up next:":`In coda:`,"Next company review around {time} (skipped if nothing changed).":`Prossima revisione aziendale verso le {time} (saltata se non è cambiato nulla).`,"(nothing yet)":`(ancora nulla)`,"Recent decisions":`Decisioni recenti`,"New agent’s name on floor {floor}":`Nome del nuovo agente al piano {floor}`,"New agent’s coding agent":`Agente di sviluppo del nuovo agente`,"(default)":`(predefinito)`,"New agent’s model":`Modello del nuovo agente`,"New agent’s effort":`Ragionamento del nuovo agente`,"default effort ({effort})":`ragionamento predefinito ({effort})`,"Floor {floor} has its most agents ({count}): change it in Settings → Most agents per floor":`Il piano {floor} ha raggiunto il limite di {count} agenti: modificalo in Impostazioni → Numero massimo di agenti per piano`,"+ Agent":`+ Agente`,"Connect a repo first; agents need a floor to sit on.":`Collega prima un repository: gli agenti hanno bisogno di un piano.`,"{count} of {max} agents":`{count} agenti su {max}`,"No one works here yet.":`Non lavora ancora nessuno qui.`,"Works in an Upstash Box: carries on when the office is closed":`Lavora in un Upstash Box: continua anche quando l’ufficio è chiuso`,"{name}’s look":`Aspetto di {name}`,"testing PR #{number}":`verifica della PR #{number}`,"fixing PR #{number}":`correzione della PR #{number}`,"🔑 Sign in":`🔑 Accedi`,"{name}’s cloud machine needs you to sign their coding agent in":`La macchina cloud di {name} richiede l’accesso al suo agente di sviluppo`,"Let {name} go?":`Rimuovere {name} dal team?`,"Let {name} go":`Rimuovi {name} dal team`,"Their worktree is removed. Branches they pushed stay on GitHub.":`Il worktree viene rimosso. I branch pubblicati restano su GitHub.`,"Drawn as":`Personaggio`,"📝 File a new issue":`📝 Crea una nuova issue`,Floor:`Piano`,"Floor {floor}":`Piano {floor}`,"Open issues on {repo}":`Issue aperte in {repo}`,"None. Nice.":`Nessuna. Ottimo.`,"Assign…":`Assegna…`,"Assign issue #{number}":`Assegna l’issue #{number}`,"Close it on GitHub as not planned":`Chiudila su GitHub come non pianificata`,"Close #{number}?":`Chiudere #{number}?`,"“{title}” will be closed on GitHub as not planned.":`“{title}” verrà chiusa su GitHub come non pianificata.`,"“{title}” will be closed on GitHub as not planned, and {name} stops working on it.":`“{title}” verrà chiusa su GitHub come non pianificata e {name} smetterà di lavorarci.`,"Close issue":`Chiudi issue`,"the agent’s own default":`valore predefinito dell’agente`,"No limit":`Nessun limite`,"Each agent can use their own coding agent, model and effort (Team tab); choose Claude Code or OpenCode 2 for the CEO on the CEO tab. Claude Code reports every step; Codex and OpenCode are experimental: the office sees their task rather than each step. For OpenCode, choose reasoning with provider/model#variant. They can also run a model on this computer: name it ollama/…, lmstudio/…, llamacpp/… or omlx/….":`Ogni agente può usare il proprio agente di sviluppo, modello e ragionamento (scheda Team); scegli Claude Code oppure OpenCode 2 per il CEO nella scheda CEO. Claude Code riporta ogni passaggio; Codex e OpenCode sono sperimentali: l’ufficio vede l’incarico, non ogni passaggio. Per OpenCode scegli il ragionamento con provider/model#variant. Possono anche usare un modello su questo computer: indicalo come ollama/…, lmstudio/…, llamacpp/… oppure omlx/….`,"The Agent SDK runs Claude Code. Each agent can use their own model and effort (Team tab).":`L’Agent SDK esegue Claude Code. Ogni agente può usare il proprio modello e ragionamento (scheda Team).`,"Leave empty so every agent with work runs at once. Agents on the same coding agent share its subscription’s usage limits, and each one is its own process on this PC, so set a limit if you hit either.":`Lascia vuoto per eseguire contemporaneamente tutti gli agenti con lavoro disponibile. Gli agenti che usano lo stesso strumento condividono i limiti dell’abbonamento e ciascuno è un processo separato su questo PC: imposta un limite se raggiungi una di queste soglie.`,"When Claude warns that usage is getting high, new issues only start while fewer sessions than this are running. QA, fixes and the CEO carry on.":`Quando Claude segnala un utilizzo elevato, le nuove issue partono solo se le sessioni attive sono meno di questo limite. QA, correzioni e CEO continuano.`,"At most {count}, one per desk. Adding agents past it is refused, by hand or by the CEO.":`Al massimo {count}, uno per postazione. Non è possibile aggiungerne altri, né manualmente né tramite il CEO.`,"(recommended): new agents wait in the lobby, where you can change their coding agent, model and effort before hiring them, and a let-go waits as an envelope on their desk.":`(consigliato): i nuovi agenti aspettano nella hall, dove puoi modificarne strumento, modello e ragionamento prima dell’assunzione; le richieste di rimozione arrivano come buste sulle loro scrivanie.`,", up to the most agents per floor. Idle agents leave first; busy ones finish their task.":`, fino al limite di agenti per piano. Gli agenti inattivi lasciano per primi; quelli impegnati terminano il proprio incarico.`,"A review checks team sizes, stuck PRs and floor profiles, and is skipped when nothing changed since the last one. It never files issues: new work only comes from you. The CEO’s own model and effort are on the CEO tab.":`La revisione controlla dimensioni dei team, PR bloccate e profili dei piani; viene saltata se nulla è cambiato. Non crea mai issue: il nuovo lavoro dipende solo da te. Modello e ragionamento del CEO si trovano nella scheda CEO.`,"(recommended): every agent is its actual coding agent running in its own terminal. Open a desk to watch it live or type into it.":`(consigliato): ogni agente esegue il proprio strumento di sviluppo in un terminale dedicato. Apri una postazione per seguirlo in tempo reale o scrivergli.`,": Claude Code through the Claude Agent SDK, shown as a log of its steps. Claude Code only.":`: Claude Code tramite Claude Agent SDK, mostrato come un registro dei passaggi. Solo Claude Code.`,"Agents work like your own coding agents in a terminal, with your skills, MCP servers and settings, and don’t stop to ask. The office’s workflow (branches, pull requests, QA reporting back) is in their instructions.":`Gli agenti lavorano come i tuoi strumenti di sviluppo nel terminale, con le tue skill, i server MCP e le impostazioni, senza fermarsi a chiedere conferma. Il flusso dell’ufficio (branch, pull request e rapporti QA) è definito nelle loro istruzioni.`,Boss:`Capo`,"A desk left idle this long loses its node_modules and build output to save disk space. Its next task installs them again.":`Una postazione inattiva per questo tempo perde node_modules e gli artefatti di build per liberare spazio. Verranno reinstallati al prossimo incarico.`,unknown:`sconosciuto`,"not signed in":`accesso non effettuato`,"Agents’ machines:":`Macchine degli agenti:`},be={CI:`CI`,Someone:`Un agente`,"{count} minute":`{count} minuto`,"{count} minutes":`{count} minuti`,"{count} hours":`{count} ore`,"{name} has been quiet for {duration} on {task}, even after a nudge. Stop them, or put the work back in line?":`{name} non dà segnali da {duration} su {task}, anche dopo un sollecito. Fermare la sessione o rimettere il lavoro in coda?`,"{name} has been setting up a desk for {task} for {duration}. Put the work back in line?":`{name} sta preparando la postazione per {task} da {duration}. Rimettere il lavoro in coda?`,"{name}’s last task {task} is already merged. Clear the desk?":`L’ultimo incarico di {name}, {task}, è già integrato. Svuotare la postazione?`,"{name}’s last task {task} is already closed. Clear the desk?":`L’ultimo incarico di {name}, {task}, è già chiuso. Svuotare la postazione?`,"PR #{pr} is marked as in QA, but nobody is testing it. Test it again?":`La PR #{pr} risulta in QA, ma nessuno la sta verificando. Avviare un nuovo controllo?`,"PR #{pr} is waiting for a fix, but {name} is on something else. Hand it to a free agent?":`La PR #{pr} attende una correzione, ma {name} sta lavorando ad altro. Affidarla a un agente libero?`,"PR #{pr} is waiting for a fix, but nobody is on it. Hand it to a free agent?":`La PR #{pr} attende una correzione, ma nessuno ci sta lavorando. Affidarla a un agente libero?`,"Issue #{issue} is still open, but PR #{pr}, which closes it, was merged {duration} ago. Close it?":`L’issue #{issue} è ancora aperta, ma la PR #{pr} che la risolve è stata integrata {duration} fa. Chiuderla?`,"Resume full speed?":`Riprendere a piena velocità?`,"Claude warned that usage is getting high{warning}, so until {time} new issues only start while fewer than {count} sessions run.":`Claude ha segnalato un utilizzo elevato{warning}: fino alle {time}, le nuove issue partono solo se le sessioni attive sono meno di {count}.`,"Resume if you’ve topped up or your usage was reset. If Claude still turns a session away at the limit, the office pauses until it resets.":`Riprendi se hai aggiunto credito o se l’utilizzo è stato azzerato. Se Claude rifiuta ancora una sessione per il limite, l’ufficio resta in pausa fino all’azzeramento.`,"Resume full speed":`Riprendi a piena velocità`,"⏩ Resume full speed":`⏩ Riprendi a piena velocità`,"Until {time}, new issues only start while fewer than {count} sessions run; QA, fixes and the CEO carry on. Topped up, or was your usage reset? Resume full speed.":`Fino alle {time}, le nuove issue partono solo se le sessioni attive sono meno di {count}; QA, correzioni e CEO continuano. Hai aggiunto credito o l’utilizzo è stato azzerato? Riprendi a piena velocità.`,"Claude turned a session away at the limit, so nothing new starts until {time}. That can’t be cleared early; sessions already running carry on.":`Claude ha rifiutato una sessione per il limite: non parte nuovo lavoro fino alle {time}. La pausa non può essere rimossa in anticipo; le sessioni già attive continuano.`,"New work starts at full speed. When Claude warns that usage is getting high, the office paces itself (Settings → Sessions while pacing).":`Il nuovo lavoro parte a piena velocità. Quando Claude segnala un utilizzo elevato, l’ufficio rallenta (Impostazioni → Sessioni durante il rallentamento).`,"Observed AI usage":`Utilizzo AI osservato`,"AI usage":`Utilizzo AI`,"AI usage: open it in the console":`Utilizzo AI: apri nella console`,"AI usage: select the quota to resume":`Utilizzo AI: scegli la quota da riprendere`,"Configured selection; awaiting session telemetry":`Selezione configurata; in attesa dei dati di sessione`,"Observed connection":`Connessione osservata`,"Shared quota":`Quota condivisa`,"Latest 200 observations. Status rows are cumulative session counters, not additional consumption. Reported costs are not subscription charges or remaining quota.":`Ultime 200 osservazioni. Le righe di stato sono contatori cumulativi della sessione, non consumi aggiuntivi. I costi riportati non sono addebiti dell’abbonamento né quota residua.`,"🤖 AI usage":`🤖 Utilizzo AI`,"Confirm shared quota":`Conferma quota condivisa`,"Use the same label only when these connections share a quota. This does not change provider, model or billing mode.":`Usa la stessa etichetta solo se queste connessioni condividono la quota. Non cambia provider, modello o modalità di fatturazione.`,"Provider not reported":`Provider non comunicato`,"Model not reported":`Modello non comunicato`,"No active limit signal":`Nessun segnale di limite attivo`,"Access mode not reported":`Modalità di accesso non comunicata`,Subscription:`Abbonamento`,"Running sessions":`Sessioni attive`,"Last observation":`Ultima osservazione`,"Last quota signal":`Ultimo segnale di quota`,"Reported reset":`Azzeramento comunicato`,"Next scheduling check":`Prossimo controllo di avvio`,"Reported usage":`Utilizzo comunicato`,"Resume this quota":`Riprendi questa quota`,"Quota association":`Associazione quota`,"Without an identified account or confirmed association, limits stay isolated. OAuth alone does not identify a subscription.":`Senza account identificato o associazione confermata, i limiti restano isolati. OAuth da solo non identifica un abbonamento.`,"Confirmed shared quota label":`Etichetta della quota condivisa confermata`,"Save quota association":`Salva associazione quota`,"Resume only this quota. Hard limits cannot be cleared early; other quotas are unchanged.":`Riprendi solo questa quota. I blocchi per limite raggiunto non possono essere rimossi prima del reset; le altre quote restano invariate.`,"Limits apply only to the affected quota. Warnings pace new issues; hard limits also hold QA, fixes and CEO jobs. Running sessions continue. Missing data does not mean unlimited usage.":`I limiti riguardano solo la quota interessata. Gli avvisi rallentano i nuovi issue; i limiti raggiunti trattengono anche QA, correzioni e attività CEO. Le sessioni avviate proseguono. Dati mancanti non significano utilizzo illimitato.`,"⏸ Some AI quotas are held":`⏸ Alcune quote AI sono sospese`,"⏸ AI quota held until {time}; independent resources continue":`⏸ Quota AI sospesa fino alle {time}; le risorse indipendenti proseguono`,"🐢 AI quota paced until {time}: fewer than {count} sessions on that quota":`🐢 Quota AI rallentata fino alle {time}: meno di {count} sessioni su quella quota`,"🐢 AI quota paced until {time}: fewer than {count} session on that quota":`🐢 Quota AI rallentata fino alle {time}: meno di {count} sessione su quella quota`,"Leave empty so every agent with work runs at once. This is the office-wide session cap; quota limits are tracked separately in AI usage.":`Lascia vuoto per avviare tutti gli agenti che hanno lavoro. È il limite di sessioni dell’ufficio; i limiti di quota sono monitorati separatamente in Utilizzo AI.`,"After a usage warning, new issues start only below this session count on the affected quota. QA, fixes and the CEO continue unless that quota reaches a hard limit.":`Dopo un avviso di utilizzo, i nuovi issue partono solo sotto questo numero di sessioni sulla quota interessata. QA, correzioni e CEO proseguono finché quella quota non raggiunge un limite bloccante.`,"An AI quota is holding work back. Open Mission control":`Una quota AI trattiene attività. Apri il Centro di controllo`,"Latest 200 message observations. Reported costs are not subscription charges or remaining quota.":`Ultime 200 osservazioni dei messaggi. I costi riportati non sono addebiti dell’abbonamento né quota residua.`,"No usage observations received yet.":`Nessuna osservazione di utilizzo ricevuta.`,"Not available":`Non disponibile`,"Input tokens":`Token in ingresso`,"Output tokens":`Token in uscita`,"Reasoning tokens":`Token di ragionamento`,"Cache read / write":`Cache letta / scritta`,"Reported cost (USD)":`Costo riportato (USD)`,"Remaining quota":`Quota residua`,"🤖 Claude usage":`🤖 Utilizzo di Claude`,Paused:`In pausa`,Pacing:`Rallentato`,Normal:`Normale`,"Claude's usage":`Utilizzo di Claude`,"No usage warnings":`Nessun avviso di utilizzo`,"5-hour limit":`limite di 5 ore`,"weekly limit":`limite settimanale`,"weekly Opus limit":`limite settimanale di Opus`,"weekly Sonnet limit":`limite settimanale di Sonnet`,"A pause at the limit can’t be cleared early":`La pausa dovuta al limite non può essere rimossa in anticipo`,"Already at full speed":`Già a piena velocità`,"Stop pacing new issues now":`Interrompi il rallentamento delle nuove issue`,"Claude usage at the last warning":`Utilizzo di Claude all’ultimo avviso`," · resets {time}":` · azzeramento alle {time}`,"Simulate a usage warning":`Simula un avviso di utilizzo`,"Simulate reaching the limit":`Simula il raggiungimento del limite`,"PR #{number} needs you":`La PR #{number} richiede il tuo intervento`,"{name} is stuck on an error":`{name} è bloccato da un errore`,"since {time}":`dalle {time}`,"📋 Open the Kanban":`📋 Apri il Kanban`,"Hand it to its author, or any free agent, with QA’s findings":`Affidala all’autore o a un agente libero con le indicazioni del QA`,"PR on GitHub ↗":`PR su GitHub ↗`,"Clear their desk so they take new work":`Svuota la postazione per consentire nuovi incarichi`,"Clear desk":`Svuota postazione`,"Visit floor {floor}":`Visita il piano {floor}`,"Stop their session":`Ferma la sessione dell’agente`,"↩ Requeue":`↩ Rimetti in coda`,"Stop them and put the work back in line, without a strike":`Ferma l’agente e rimetti il lavoro in coda senza conteggiare un tentativo fallito`,"Queue the PR for a fresh QA run":`Metti la PR in coda per un nuovo QA`,"Hand the PR to its author, or any free agent":`Affida la PR all’autore o a un agente libero`,"Close the issue on GitHub as completed":`Chiudi l’issue su GitHub come completata`,"Close issue #{number}?":`Chiudere l’issue #{number}?`,"It’s closed on GitHub as completed, with a comment saying PR #{number} resolved it.":`Verrà chiusa su GitHub come completata, con un commento che indica la PR #{number} come soluzione.`,"Hide it until it goes away":`Nascondi la segnalazione finché il problema non scompare`,Ignore:`Ignora`,"🩺 Office doctor":`🩺 Diagnostica dell’ufficio`,"Nothing stuck. Every minute the watchdog nudges quiet sessions, frees stuck desks and puts orphaned work back in line by itself; what it can’t safely fix shows up here.":`Nessun blocco. Ogni minuto il watchdog sollecita le sessioni silenziose, libera le postazioni bloccate e rimette in coda il lavoro senza agente; qui compare ciò che non può risolvere in sicurezza.`,"Restart with desks gone and work finished on GitHub meanwhile":`Simula un riavvio con postazioni rimosse e lavoro nel frattempo completato su GitHub`,"Simulate a restart":`Simula un riavvio`,"Someone’s session goes quiet for 20 minutes":`Una sessione resta silenziosa per 20 minuti`,"Make a session stuck":`Simula una sessione bloccata`,"Ten more minutes pass for the stuck sessions":`Passano altri dieci minuti per le sessioni bloccate`,"10 minutes later":`Dieci minuti dopo`,"A merged PR whose issue was never closed":`Una PR integrata la cui issue non è mai stata chiusa`,"Leave an issue open":`Lascia un’issue aperta`,"Ready to start":`Pronte a partire`,"Backlog issues that can start now":`Issue nel backlog che possono partire ora`,"In QA":`In verifica QA`,"Back with an agent: QA findings, checks or a conflict":`Rinviate a un agente: indicazioni QA, controlli o conflitti`,"To merge":`Da integrare`,"🧭: the CEO is looking first":`🧭: il CEO sta esaminando prima del tuo intervento`,"Merged today":`Integrate oggi`,"{count} ({hour} last hour)":`{count} ({hour} nell’ultima ora)`,"Lead time":`Tempo di consegna`,"Median issue → merge over the last 24 hours":`Tempo mediano dall’issue al merge nelle ultime 24 ore`,"QA wait":`Attesa QA`,"Median wait for a free agent over the last 24 hours":`Attesa mediana di un agente libero nelle ultime 24 ore`,"GitHub’s checks over 7 days: pass rate · median time":`Controlli GitHub degli ultimi sette giorni: percentuale di successo · tempo mediano`,"{busy} busy · {idle} idle":`{busy} al lavoro · {idle} liberi`," · errors: {count}":` · errori: {count}`,"Cost today":`Costo di oggi`,"An estimate from finished sessions’ reported cost":`Stima ricavata dal costo riportato dalle sessioni concluse`,"All floors":`Tutti i piani`,"The CEO’s sessions today: ~{cost} (in All floors’ cost).":`Sessioni del CEO oggi: ~{cost} (incluse nel costo di Tutti i piani).`,"🚨 Needs you":`🚨 Richiede il tuo intervento`,"All clear. The beacon on the lobby’s mission control wall spins when a PR needs you or an agent has been stuck on an error for 10 minutes.":`Tutto a posto. Il segnalatore del centro di controllo nella hall si attiva quando una PR richiede il tuo intervento o un agente è bloccato da un errore da dieci minuti.`,"🛰️ The numbers":`🛰️ I numeri`,"Time-lapse":`Riepilogo della giornata`,Today:`Oggi`,"▶ Replay":`▶ Riproduci`,"🎉 {merged} merged · 🔴 {needed} needed you · 🆕 {issues} new issues":`🎉 Merge: {merged} · 🔴 Interventi richiesti: {needed} · 🆕 Nuove issue: {issues}`,"an hour in 2 minutes":`un’ora in 2 minuti`,"an hour in 30 seconds":`un’ora in 30 secondi`,"an hour in 6 seconds":`un’ora in 6 secondi`,"{hours} h {minutes} min ago":`{hours} ore e {minutes} min fa`,"{count} day ago":`{count} giorno fa`,"{count} days ago":`{count} giorni fa`,"Watch the office’s day again, right here in the 3D office: people at work and on their errands, stickies moving on the whiteboard, every merge’s gong and confetti.":`Rivivi la giornata nell’ufficio 3D: persone al lavoro e in movimento, post-it che avanzano sulla lavagna, gong e coriandoli a ogni merge.`,"Since I was last here":`Dall’ultima visita`,"since you were last here":`dall’ultima visita`,"You were away from {from} to {to} ({ago}).":`Sei stato assente dalle {from} alle {to} ({ago}).`,"Nothing to catch up on yet: once you have been away for a while, what happened meanwhile shows up here.":`Non c’è ancora nulla da recuperare: dopo un periodo di assenza, qui vedrai ciò che è successo nel frattempo.`,"▶ Catch up":`▶ Recupera`,"Loading the journal…":`Caricamento del registro…`,"Nothing recorded yet. The office keeps a journal from now on.":`Nessuna registrazione. Da ora l’ufficio conserva un registro.`,Speed:`Velocità`,"Replay speed":`Velocità di riproduzione`,"While it plays":`Durante la riproduzione`,"The office shows the recorded moment instead of the live one, down to the sky and the clocks. Assigning, messaging and merging are off. Drag along the timeline to jump: 🎉 merges, 🔴 PRs that needed you, 🆕 new issues.":`L’ufficio mostra il momento registrato anziché quello attuale, inclusi cielo e orologi. Assegnazioni, messaggi e merge sono disattivati. Trascina la linea temporale per spostarti: 🎉 merge, 🔴 PR che richiedevano il tuo intervento, 🆕 nuove issue.`,"frees the mouse, and":`libera il mouse e`,"again goes straight back to the live office.":`premuto di nuovo riporta subito all’ufficio in tempo reale.`,"The journal keeps 7 days (at most about 200 MB) in the office’s folder. Terminal output, settings and keys are never written to it.":`Il registro conserva sette giorni (massimo circa 200 MB) nella cartella dell’ufficio. Non contiene output dei terminali, impostazioni o chiavi.`,"Writes a made-up working day on these floors as yesterday’s journal":`Genera una giornata di lavoro fittizia per questi piani nel registro di ieri`,"Making…":`Generazione…`,"Make a sample day (yesterday)":`Genera una giornata di esempio (ieri)`,"Replay timeline":`Linea temporale della riproduzione`,"▶ REPLAY":`▶ RIPRODUZIONE`,Pause:`Pausa`,Play:`Riproduci`,"Play it again":`Riproduci di nuovo`,"Play / pause":`Riproduci / pausa`,"Back to the live office":`Torna all’ufficio in tempo reale`,"⏹ Live":`⏹ Tempo reale`,"Couldn’t load the journal: {error}":`Impossibile caricare il registro: {error}`,"That was the whole stretch. ↺ plays it again, Esc goes back to live.":`La registrazione è terminata. ↺ la riproduce di nuovo, Esc torna al tempo reale.`},xe={"Open the manager's console":`Apri la console del manager`,"Mission control: open it in the console":`Centro di controllo: aprilo nella console`,"Time-lapse: replay the office’s day":`Riepilogo della giornata: rivivi l’ufficio`,"Use the elevator":`Usa l’ascensore`,"Choose a floor":`Scegli un piano`,"Floor directory — take the elevator":`Elenco piani — prendi l’ascensore`,"Open the Kanban board":`Apri la bacheca Kanban`,"See every team change on your phone":`Vedi tutte le modifiche al team sul telefono`,"Add an agent at this desk":`Aggiungi un agente a questa postazione`,"Put mug under the machine":`Metti la tazza sotto la macchina`,"Brew coffee":`Prepara il caffè`,"Take a blaster":`Prendi un lanciatore`,"Pick up blaster":`Raccogli il lanciatore`,"Take a mug":`Prendi una tazza`,"Pick up mug":`Raccogli la tazza`,"Pick up ball":`Raccogli la palla`,"Play ping-pong":`Gioca a ping-pong`,"Bang the gong":`Suona il gong`,"Sit back in the deck chair":`Siediti sulla sdraio`,"Look through the telescope":`Guarda nel telescopio`,"Browse the decoration catalogue":`Sfoglia il catalogo delle decorazioni`,Follow:`Segui`,Backlog:`Backlog`,"In progress":`In lavorazione`,"Ready to merge":`Pronte al merge`,"Mouse sensitivity":`Sensibilità del mouse`,"Invert Y (push the mouse or the right stick forward to look down)":`Inverti Y (spingi il mouse o lo stick destro in avanti per guardare in basso)`,"Grab the mouse when panels close":`Cattura il mouse alla chiusura dei pannelli`,"🎮 {name} is connected":`🎮 {name} è connesso`,"🎮 No controller yet: plug one in and press a button.":`🎮 Nessun controller: collegane uno e premi un pulsante.`,"Gamepad sensitivity":`Sensibilità del gamepad`,"Left stick walks (click it to run) · right stick looks ·":`Stick sinistro per camminare (premilo per correre) · stick destro per guardare ·`,"uses (like E) ·":`interagisce (come E) ·`,"goes back (Esc) ·":`torna indietro (Esc) ·`,"picks up or drops · triggers throw and fire ·":`raccoglie o lascia · grilletti per lanciare e sparare ·`,"reloads ·":`ricarica ·`,"the phone ·":`apre il telefono ·`,"the overview (twice: the building) ·":`apre la panoramica (due volte: edificio) ·`,"turn the overview, where the left stick pans, the right stick zooms and":`ruotano la panoramica, dove lo stick sinistro sposta la visuale, il destro regola lo zoom e`,"opens what’s in the middle.":`apre ciò che si trova al centro.`,"{key} can’t be bound: it belongs to the browser (Esc always backs out).":`Non puoi assegnare {key}: è riservato al browser (Esc torna sempre indietro).`,"{key} is now {action}. It was {previous}’s, which {result}.":`{key} ora attiva {action}. Prima attivava {previous}, che {result}.`,"moved to {key}":`ora usa {key}`,"has no key now":`ora non ha un tasto`,"{key} is now {action}.":`{key} ora attiva {action}.`,"Every control is back to how it came.":`Tutti i comandi sono stati ripristinati ai valori iniziali.`,"Click a key and press the new one (Esc cancels). A key another action uses moves over, and that action gets your old key. Esc always backs out and frees the mouse.":`Fai clic su un tasto e premi quello nuovo (Esc annulla). Se il tasto è già usato da un’altra azione, le due assegnazioni vengono scambiate. Esc torna sempre indietro e libera il mouse.`,Moving:`Movimento`,Hands:`Mani`,Overview:`Panoramica`,"Overview and views":`Panoramica e visuali`,"{group} keys":`Tasti: {group}`,"{action}: {slot} {key}. Click to change":`{action}: {slot} {key}. Fai clic per cambiare`,"other key":`tasto alternativo`,key:`tasto`,"press a key…":`premi un tasto…`,"Remove this key":`Rimuovi questo tasto`,"Remove {key} from {action}":`Rimuovi {key} da {action}`,"{key} does both {first} and {second}":`{key} attiva sia {first} sia {second}`,"Give one of them another key.":`Assegna un tasto diverso a una delle due azioni.`,Mouse:`Mouse`,Gamepad:`Gamepad`,"↺ Reset to defaults":`↺ Ripristina i valori predefiniti`,"Walk forward":`Cammina avanti`,"Walk back":`Cammina indietro`,"Step left":`Spostati a sinistra`,"Step right":`Spostati a destra`,"Run (hold)":`Corri (tieni premuto)`,"Use, pick up, sip":`Interagisci, raccogli, bevi`,"Throw or fire (hold to charge)":`Lancia o spara (tieni premuto per caricare)`,Drop:`Lascia`,"Reload a blaster":`Ricarica un lanciatore`,"Jukebox softer":`Abbassa il jukebox`,"Jukebox louder":`Alza il jukebox`,Mute:`Disattiva audio`,"Who's working list":`Elenco degli agenti al lavoro`,"Overview (twice: the building)":`Panoramica (due volte: edificio)`,"Turn the overview left":`Ruota la panoramica a sinistra`,"Turn the overview right":`Ruota la panoramica a destra`,"Hold to talk (in a message box)":`Tieni premuto per parlare (nel campo del messaggio)`,"Emote wheel (hold, point, let go)":`Ruota delle espressioni (tieni premuto, punta, rilascia)`,"Ping where you aim (or middle-click)":`Segnala il punto mirato (o clic centrale)`,"Photo mode":`Modalità foto`,"Save the last 15 s (instant replay)":`Salva gli ultimi 15 s (replay istantaneo)`,Sound:`Audio`,"🎼 Soundtrack":`🎼 Colonna sonora`,Volume:`Volume`,"Volume for each kind of sound":`Volume per ogni tipo di suono`,"{sound} volume":`Volume: {sound}`,Footsteps:`Passi`,Typing:`Digitazione`,Chatter:`Chiacchiere`,Toys:`Giochi`,Alerts:`Avvisi`,Music:`Musica`,Voice:`Voce`,Outside:`Esterno`,Soundtrack:`Colonna sonora`,"The team's babble voices as they talk":`Le voci buffe del team durante le conversazioni`,"The phone, the elevator and work cues":`Telefono, ascensore e segnali di lavoro`,"Each floor's jukebox":`Il jukebox di ogni piano`,"Messages read aloud":`Messaggi letti ad alta voce`,"Wind, the city, birds and crickets, rain and thunder, and whatever is happening outside":`Vento, città, uccelli e grilli, pioggia e tuoni e tutto ciò che accade fuori`,"Quiet music that follows the office's mood, when no jukebox is playing nearby":`Musica discreta che segue l’atmosfera dell’ufficio quando non si sente un jukebox nelle vicinanze`,"Agent chatter":`Chiacchiere degli agenti`,"💬 Agent chatter":`💬 Chiacchiere degli agenti`,Quiet:`Tranquillo`,Lively:`Vivace`,"Chatter voices":`Voci delle chiacchiere`,"Their voices":`Le loro voci`,Babble:`Voci buffe`,"Silent bubbles only":`Solo fumetti silenziosi`,"Day and night":`Giorno e notte`,"30-minute day":`Giornata di 30 minuti`,"Follow my clock":`Segui il mio orologio`,"Always day":`Sempre giorno`,"Graphics quality":`Qualità grafica`,Graphics:`Grafica`,Low:`Bassa`,Medium:`Media`,High:`Alta`,Auto:`Automatica`,"Effects are off: {reason}.":`Effetti disattivati: {reason}.`,"now {quality}":`ora {quality}`,"📋 Performance report copied ({hitches} lately)":`📋 Rapporto prestazioni copiato (rallentamenti recenti: {hitches})`,"{count} hitch":`{count} rallentamento`,"{count} hitches":`{count} rallentamenti`,"no hitches":`nessun rallentamento`,"Couldn’t reach the clipboard: the report is in the browser console":`Impossibile accedere agli appunti: il rapporto è nella console del browser`,"What stalled lately (slow frames, pauses, lost keys) and what was going on, to paste into an issue":`Rallentamenti recenti (fotogrammi lenti, pause, tasti persi) e attività in corso, da incollare in un’issue`,"Copy performance report":`Copia rapporto prestazioni`,"Instant replay: keep the last 15 seconds, and save them with":`Replay istantaneo: conserva gli ultimi 15 secondi e salvali con`,"How the office works":`Come funziona l’ufficio`,"📖 The office":`📖 L’ufficio`,"🎮 Controls":`🎮 Comandi`,Controls:`Comandi`,"Moving around":`Muoversi`,Views:`Visuali`,Balls:`Palle`,"Ping-pong":`Ping-pong`,"The office dog":`Il cane dell’ufficio`,"Foam blasters":`Lanciatori di gommapiuma`,Fire:`Spara`,Reload:`Ricarica`,Coffee:`Caffè`,"The fridge":`Il frigorifero`,"Settings → Weather":`Impostazioni → Meteo`,"Settings → World events":`Impostazioni → Eventi esterni`,"The building":`L’edificio`,"Mission control":`Centro di controllo`,"Your phone":`Il tuo telefono`,"Photo mode and clips":`Modalità foto e clip`,"Who’s working":`Chi è al lavoro`,"Other visitors":`Altri visitatori`,"The CEO":`Il CEO`,"Your team":`Il tuo team`,"Coins, decorations and trophies":`Monete, decorazioni e trofei`,"Compare with main":`Confronta con main`,"♿ Accessibility settings":`♿ Impostazioni di accessibilità`,"⟳ Office restarting…":`⟳ Riavvio dell’ufficio…`,"The office is updating itself. Open the manager’s console":`L’ufficio si sta aggiornando. Apri la console del manager`,"Claude’s usage is holding new work back. Open Mission control":`L’utilizzo di Claude sta trattenendo il nuovo lavoro. Apri il Centro di controllo`,"The office doctor found something stuck. Open Mission control":`La diagnostica ha rilevato un blocco. Apri il Centro di controllo`,"🩺 {count} to check":`🩺 Segnalazioni da controllare: {count}`,"Your phone ({key})":`Il tuo telefono ({key})`,"{count} waiting":`{count} in attesa`,"{name} is working":`{name} è al lavoro`,"Photo mode ({key}). Instant replay is on: {replayKey} saves the last 15 s":`Modalità foto ({key}). Replay istantaneo attivo: {replayKey} salva gli ultimi 15 s`,"Photo mode ({key}): freeze the office, frame a shot, record a clip":`Modalità foto ({key}): congela l’ufficio, inquadra e registra una clip`,"Instant replay on":`Replay istantaneo attivo`,"Reading a message aloud. Click to stop":`Lettura di un messaggio. Fai clic per interrompere`,"Stop reading the message aloud":`Interrompi la lettura del messaggio`,"Take a bite":`Dai un morso`,"Sip coffee":`Bevi il caffè`,"Sip the {snack}":`Bevi: {snack}`,"Bite the {snack}":`Mangia: {snack}`,Overclock:`Overclock`,"sparkling water":`acqua frizzante`,"cold brew":`caffè freddo`,"mate soda":`bibita al mate`,"cold pizza":`pizza fredda`,"protein bar":`barretta proteica`,"string cheese":`formaggio`,"chocolate bar":`barretta di cioccolato`,"Roof terrace":`Terrazza sul tetto`,Roof:`Tetto`,"deck chairs, the barbecue and the telescope":`sdraio, barbecue e telescopio`,"{agents} agents · {working} working · {qa} in QA · {ready} ready to merge":`{agents} agenti · {working} al lavoro · {qa} in QA · {ready} pronte al merge`," · {count} needs you":` · {count} richiede il tuo intervento`,"{count} floor connected":`{count} piano collegato`,"{count} floors connected":`{count} piani collegati`,"▶ replay":`▶ riproduzione`,"● live":`● tempo reale`,"○ restarting":`○ riavvio`,"○ reconnecting":`○ riconnessione`,"{count} sessions":`{count} sessioni`,hold:`tieni premuto`,"take it":`raccogli`,volume:`volume`,"Click to look around":`Fai clic per guardarti intorno`,move:`muoviti`,run:`corri`,interact:`interagisci`,phone:`telefono`,emote:`espressioni`,ping:`segnala`,photo:`foto`,overview:`panoramica`,workers:`team`,mute:`silenzia`,help:`aiuto`,"free mouse":`libera il mouse`,"⏸ Paused until {time}: at Claude's usage limit, nothing new starts":`⏸ In pausa fino alle {time}: limite di utilizzo di Claude, non parte nuovo lavoro`,"🐢 Paced until {time}: new issues start when fewer than {count} session run":`🐢 Rallentato fino alle {time}: nuove issue solo con meno di {count} sessione attiva`,"🐢 Paced until {time}: new issues start when fewer than {count} sessions run":`🐢 Rallentato fino alle {time}: nuove issue solo con meno di {count} sessioni attive`,"Watch {name}’s screen":`Guarda lo schermo di {name}`,"installing dependencies…":`installazione delle dipendenze…`,"setting up the worktree…":`preparazione del worktree…`,"thinking…":`ragionamento…`,"working on {title}":`al lavoro su {title}`,"starting…":`avvio…`,HQ:`Sede centrale`,"The CEO, in the lobby":`Il CEO, nella hall`,"Floor {floor}: {repo}":`Piano {floor}: {repo}`,"Hide the list ({key})":`Nascondi l’elenco ({key})`,"Show who is working ({key})":`Mostra chi è al lavoro ({key})`,"Nobody is working right now.":`Nessuno è al lavoro in questo momento.`,"{group} · click to expand":`{group} · fai clic per espandere`,"{group} · click to collapse":`{group} · fai clic per comprimere`,"See the whole floor from above ({key}; twice for the building)":`Mostra tutto il piano dall’alto ({key}; due volte per l’edificio)`,"🎥 Following":`🎥 Stai seguendo`,"to take over":`per riprendere i comandi`,"✕ Stop":`✕ Ferma`,"Drag to pan · scroll to zoom · click someone, a desk, the whiteboard or the app screen":`Trascina per spostarti · scorri per lo zoom · fai clic su persone, postazioni, lavagna o schermo dell’app`,"Click a floor to go there · drag up and down · scroll to zoom":`Fai clic su un piano per raggiungerlo · trascina in alto o in basso · scorri per lo zoom`,"🗺️ Overview":`🗺️ Panoramica`,"🏢 The building":`🏢 L’edificio`,"Turn the view left":`Ruota la visuale a sinistra`,"Turn the view right":`Ruota la visuale a destra`,"Every floor at once ({key} twice)":`Tutti i piani insieme ({key} due volte)`,"🏢 Building":`🏢 Edificio`,"Back down to the overview of this floor":`Torna alla panoramica di questo piano`,"🗺️ This floor":`🗺️ Questo piano`,"Fly back to where you were standing":`Torna alla posizione precedente`,"✕ Back":`✕ Indietro`,"Click: {target}":`Clic: {target}`,"Everyone else viewing the office":`Le altre persone che guardano l’ufficio`,Visitors:`Visitatori`,"you: {name}":`tu: {name}`,"you: hidden":`tu: nascosto`,here:`qui`,"Stop following {name}":`Smetti di seguire {name}`,"Follow {name} with the camera":`Segui {name} con la telecamera`,"👀 Follow":`👀 Segui`,Emotes:`Espressioni`,"Point, then let go of {key}":`Punta, poi rilascia {key}`,Wave:`Saluta`,"Thumbs up":`Pollice alzato`,Clap:`Applaudi`,Point:`Indica`,Laugh:`Ridi`},Se={"Take coffee":`Prendi il caffè`,"Take mug":`Prendi la tazza`,"☕ Put a mug under the machine first":`☕ Metti prima una tazza sotto la macchina`,"☕ Your coffee is ready: take the mug":`☕ Il caffè è pronto: prendi la tazza`,"Open the fridge":`Apri il frigorifero`,"Close the fridge":`Chiudi il frigorifero`,"Grab the {snack}":`Prendi: {snack}`,"Out of {snack}":`Esaurito: {snack}`,"🥡 “{label}”. Best leave it.":`🥡 “{label}”. Meglio lasciarlo stare.`,"{emoji} One at a time: finish that one first ({key})":`{emoji} Uno alla volta: finisci prima quello che hai ({key})`,"🙌 Your hands are full":`🙌 Hai le mani occupate`,"{emoji} Out of {snack}: more comes in every few minutes":`{emoji} Esaurito: {snack}. Le scorte si rinnovano ogni pochi minuti`,"Hard drop":`Caduta immediata`,"hard drop":`caduta`,"new line":`a capo`,"to talk":`per parlare`,games:`giochi`,"to put it away":`per riporlo`,"PRs that passed QA on their first round":`PR con QA superato al primo tentativo`,Merged:`Integrate`,ntfy:`ntfy`,"Play with pet":`Gioca`,Gallery:`Galleria`,"{count} · {size} · this tab only":`{count} · {size} · solo questa scheda`,empty:`vuota`,"Download {name}":`Scarica {name}`,"Delete {name}":`Elimina {name}`,"show the panel":`mostra il pannello`,"📷 Photo mode":`📷 Modalità foto`,"Back to the office (or Esc with the mouse free)":`Torna all’ufficio (o Esc con il mouse libero)`,Leave:`Esci`,"❄ Freeze the office":`❄ Congela l’ufficio`,"Everyone holds still; the work carries on and catches up when you thaw.":`Tutti restano fermi; il lavoro continua e si riallinea quando scongeli.`,"Live: people, toys and the sky move. Good for clips.":`In tempo reale: persone, oggetti e cielo si muovono. Ideale per le clip.`,Camera:`Telecamera`,Zoom:`Zoom`,Roll:`Inclinazione`,"Depth of field":`Profondità di campo`,Focus:`Messa a fuoco`,"Focus distance":`Distanza di messa a fuoco`,Blur:`Sfocatura`,"Blur strength":`Intensità della sfocatura`,"◎ Focus on the middle":`◎ Metti a fuoco al centro`,Filter:`Filtro`,"Warm film":`Pellicola calda`,"Cool night":`Notte fredda`,"Black & white":`Bianco e nero`,Polaroid:`Polaroid`,"Comic book":`Fumetto`,"Logo stamp":`Logo`,"Floor and date":`Piano e data`,"Thirds guides":`Griglia dei terzi`,"Time of day":`Ora del giorno`,"🌇 Golden hour":`🌇 Ora dorata`,"☀️ Noon":`☀️ Mezzogiorno`,"🌆 Blue hour":`🌆 Ora blu`,"↺ As it is":`↺ Ora attuale`,Shot:`Foto`,"Shot size":`Dimensioni della foto`,"Developing…":`Sviluppo…`,"Take the shot":`Scatta la foto`,"Saves a PNG to your downloads and copies it.":`Salva un PNG nei download e lo copia negli appunti.`,Clip:`Clip`,"Cinematic orbit":`Orbita cinematografica`,"Free (fly it yourself)":`Libera (pilota tu)`,"Orbit the gong":`Orbita intorno al gong`,"Orbit the whiteboard":`Orbita intorno alla lavagna`,"Orbit {name}":`Orbita intorno a {name}`,"■ Stop recording":`■ Ferma la registrazione`,"Saving the clip…":`Salvataggio della clip…`,"⏺ Record":`⏺ Registra`,"A WebM with the office’s sound, up to a minute":`Un WebM con l’audio dell’ufficio, fino a un minuto`," (frozen: a still scene, unless the camera moves)":` (congelato: scena ferma, salvo il movimento della telecamera)`,"Instant replay":`Replay istantaneo`,"Keep the last 15 s, any time":`Conserva sempre gli ultimi 15 s`,"to save them. Off by default: it records all the time, which takes memory.":`per salvarli. Disattivato inizialmente: registra di continuo e occupa memoria.`,"Click the view to steer ·":`Clic nella visuale per orientarti ·`,fly:`vola`,"up/down":`su/giù`,faster:`più veloce`,"roll · wheel zoom ·":`inclina · rotella per lo zoom ·`,reset:`ripristina`,"hide panel":`nascondi pannello`,"frees the mouse, then leaves":`libera il mouse, poi esce`,"Nothing in the middle of the view to focus on.":`Nessun oggetto al centro della visuale da mettere a fuoco.`,"📸 Saved {name}, {width}×{height}":`📸 Salvato {name}, {width}×{height}`," ({requested}× was too big for the browser, so {actual}×)":` ({requested}× era troppo grande per il browser: usato {actual}×)`,", and copied it":`, e copiato negli appunti`,"The shot failed: {error}":`Foto non riuscita: {error}`,"The 3D view is not ready.":`La visuale 3D non è pronta.`,"This browser can't record the office (it needs MediaRecorder with WebM, as in Chrome, Edge or Firefox). Shots still work.":`Questo browser non può registrare l’ufficio (serve MediaRecorder con WebM, come in Chrome, Edge o Firefox). Le foto funzionano comunque.`,"Recording could not start: {error}":`Impossibile avviare la registrazione: {error}`,"🎬 Saved {name}, {seconds} s at {width}×{height}":`🎬 Salvato {name}, {seconds} s a {width}×{height}`,"The clip failed: {error}":`Clip non riuscita: {error}`,"Instant replay is not running.":`Il replay istantaneo non è attivo.`,"Instant replay can’t read this browser’s recording ({error}).":`Il replay istantaneo non riesce a leggere la registrazione del browser ({error}).`,"Nothing to replay yet: give it a second.":`Nulla da riprodurre: attendi un momento.`,"🎬 Saved the last {seconds} s as {name}":`🎬 Salvati gli ultimi {seconds} s come {name}`,"This browser can't record the office (it needs MediaRecorder with WebM).":`Questo browser non può registrare l’ufficio (serve MediaRecorder con WebM).`,"Instant replay stopped: the browser could not keep recording.":`Replay istantaneo fermato: il browser non è riuscito a continuare la registrazione.`,"🛍️ Decoration catalogue":`🛍️ Catalogo delle decorazioni`,"🛍️ {item} bought for floor {floor}: it’s in the 📦 decor box by their elevator":`🛍️ {item} acquistato per il piano {floor}: si trova nella scatola 📦 accanto all’ascensore`,"Connect a repo first: floors earn coins when their PRs merge, and spend them here.":`Collega prima un repository: i piani guadagnano monete con i merge delle PR e le spendono qui.`,"{count} merge":`{count} merge`,"{count} merges":`{count} merge`,"{earned} earned. A merge pays {merge}, plus {qa} if QA passed it first time, {ci} for green checks first time and {streak} for the third merge in an hour.":`{earned} guadagnate. Un merge vale {merge}, più {qa} per QA superato al primo tentativo, {ci} per controlli superati al primo tentativo e {streak} per il terzo merge in un’ora.`,"{owned} owned · {stored} in the box":`{owned} posseduti · {stored} nella scatola`,"hangs on a wall":`si appende a una parete`,"lies on the floor":`si stende sul pavimento`,"needs a big spot":`richiede uno spazio grande`,"fits a corner":`sta in un angolo`,"Every spot for this kind of decoration on this floor is spoken for":`Tutti gli spazi per questo tipo di decorazione sul piano sono occupati o riservati`,"Not enough coins yet":`Monete insufficienti`,"No room":`Nessuno spazio`,"Bought decorations wait in the floor’s 📦 decor box, next to its elevator. Take one out, walk to a glowing spot and press":`Le decorazioni acquistate aspettano nella scatola 📦 del piano, accanto all’ascensore. Prendine una, vai a un punto luminoso e premi`,": it snaps in.":`: si posiziona.`,"on a placed decoration picks it up again;":`su una decorazione collocata la raccoglie di nuovo;`,"puts it back where it was.":`la rimette dove si trovava.`,"📦 Decor box · floor {floor}":`📦 Scatola delle decorazioni · piano {floor}`,"In the box":`Nella scatola`,"Nothing in the box. Buy decorations with this floor’s coins (🪙 {coins}) at the catalogue kiosk in the lobby.":`La scatola è vuota. Acquista decorazioni con le monete del piano (🪙 {coins}) al chiosco del catalogo nella hall.`,"Carry it":`Prendi`,"On the floor":`Sul piano`,"Nothing placed yet.":`Nessuna decorazione collocata.`,"Put away":`Riponi`,"Carrying one, glowing spots show where it fits: aim at one and press":`Quando trasporti una decorazione, i punti luminosi indicano dove può stare: puntane uno e premi`,"puts it back where it came from.":`la rimette da dove proviene.`,"Coins: merges earn them, the lobby kiosk spends them on decorations":`Monete: i merge le fanno guadagnare, il chiosco nella hall le spende in decorazioni`,"Potted plant":`Pianta in vaso`,"A cheerful leafy friend for a corner.":`Un’allegra amica verde per un angolo.`,"Bean bag":`Pouf`,"For thinking very hard, horizontally.":`Per pensare intensamente, in orizzontale.`,"Fiddle-leaf fig":`Ficus lyrata`,"Big, glossy and a little dramatic.":`Grande, lucido e un po’ teatrale.`,'"Ship it" poster':`Poster “Pubblica!”`,"Framed motivation.":`Motivazione incorniciata.`,"Repo poster":`Poster del repository`,"The floor's repo, framed.":`Il repository del piano, incorniciato.`,"First PR poster":`Poster della prima PR`,"The floor's first merged PR, framed for posterity.":`La prima PR integrata del piano, incorniciata per i posteri.`,"Accent rug":`Tappeto decorativo`,"A rug in the floor's colour.":`Un tappeto del colore del piano.`,"String lights":`Filo di luci`,"Warm little bulbs along a wall.":`Piccole lampadine calde lungo una parete.`,"Neon sign":`Insegna al neon`,"The floor's name in glowing tubes.":`Il nome del piano in tubi luminosi.`,"Fish tank":`Acquario`,"A few toon fish doing laps.":`Pesciolini a cartone animato che nuotano in tondo.`,"Ping-pong table":`Tavolo da ping-pong`,"A spare one, just for show: the floor's own table is for playing.":`Un tavolo extra decorativo: per giocare usa quello del piano.`,"Arcade cabinet":`Cabinato arcade`,"Press E on it to play the phone's games.":`Premi E per aprire i giochi del telefono.`,"west wall, south of the window":`parete ovest, a sud della finestra`,"south wall, over the blasters":`parete sud, sopra i lanciatori`,"south wall, by the hoop":`parete sud, vicino al canestro`,'north wall, past the "ship it" sign':`parete nord, oltre l’insegna “ship it”`,"over the kitchenette":`sopra l’angolo cucina`,"north-east corner":`angolo nord-est`,"south-east corner":`angolo sud-est`,"by the couch":`vicino al divano`,"west wall, by the door":`parete ovest, vicino alla porta`,"west wall":`parete ovest`,"the lounge":`la zona relax`,"south wall, east of the elevator":`parete sud, a est dell’ascensore`,"under the ping-pong table":`sotto il tavolo da ping-pong`,"in front of the elevator":`davanti all’ascensore`,"Won {time}":`Ottenuto: {time}`,"First merge":`Primo merge`,"The first PR merged since the trophy shelf went up":`La prima PR integrata da quando è presente la mensola dei trofei`,"Hat trick":`Tripletta`,"Three merges on one floor within an hour":`Tre merge sullo stesso piano entro un’ora`,"Ten in a day":`Dieci in un giorno`,"Ten merges in one day":`Dieci merge in un giorno`,"Spotless day":`Giornata impeccabile`,"Five or more merges in a day without one failed QA round":`Almeno cinque merge in un giorno senza un QA fallito`,"Night owl":`Nottambulo`,"A merge between midnight and 5 am":`Un merge tra mezzanotte e le cinque`,"Full house":`Tutto esaurito`,"Everyone on a floor busy at once (four or more people)":`Tutti gli agenti di un piano impegnati insieme (almeno quattro)`,Comeback:`Rimonta`,"A PR that needed you was merged after all":`Una PR che richiedeva il tuo intervento è stata infine integrata`,"Coffee addict":`Caffè dipendente`,"You drank ten coffees":`Hai bevuto dieci caffè`,"Perfect five":`Cinquina perfetta`,"Five merges in a row without a failed QA round or check":`Cinque merge consecutivi senza QA o controlli falliti`,"Quarter century":`Quota venticinque`,"25 PRs merged":`25 PR integrate`,Century:`Centinaio`,"100 PRs merged":`100 PR integrate`,"Interior designer":`Arredatore`,"The first decoration placed":`La prima decorazione collocata`,"Fully furnished":`Completamente arredato`,"Every decoration slot on a floor filled":`Tutti gli spazi per decorazioni di un piano occupati`,Legend:`Leggenda`,Veteran:`Veterano`,Regular:`Esperto`,Rookie:`Esordiente`,"QA reviews: {count} and counting":`Verifiche QA: {count}, e non finisce qui`,"First-time QA passes: {count} in a row":`QA superati al primo tentativo: {count} consecutivi`,"Never failed QA: {count} round passed":`Nessun QA fallito: {count} ciclo superato`,"Never failed QA: {count} rounds passed":`Nessun QA fallito: {count} cicli superati`,"Clean shipper: {count} PR merged without a fix round":`Consegne pulite: {count} PR integrata senza correzioni`,"Clean shipper: {count} PRs merged without a fix round":`Consegne pulite: {count} PR integrate senza correzioni`,"Shipped {count} PR so far":`Finora {count} PR integrata`,"Shipped {count} PRs so far":`Finora {count} PR integrate`,"First PR in review, fingers crossed":`Prima PR in revisione, dita incrociate`,"Fresh on the team: first task coming up":`Appena entrato nel team: primo incarico in arrivo`,"{count} day":`{count} giorno`,"{count} days":`{count} giorni`,"{count} hour":`{count} ora`,"{count} d ago":`{count} giorni fa`,"{name}’s portrait":`Ritratto di {name}`,"{name} runs the company; their record is the whole office.":`{name} dirige l’azienda: i suoi risultati sono quelli dell’intero ufficio.`,"floor {floor}":`piano {floor}`,"⭐ 10 first-time passes":`⭐ 10 QA superati al primo tentativo`,"PRs merged":`PR integrate`,"PRs opened":`PR aperte`,"first-time QA":`QA al primo tentativo`,"QA pass rate":`Percentuale QA superati`,"{passed} of {total} QA rounds on their PRs passed":`{passed} cicli QA superati su {total} sulle proprie PR`,"fix rounds / PR":`Cicli di correzione / PR`,"QA reviews":`Verifiche QA`,"longest streak":`Serie più lunga`,"on the team":`Nel team da`,"PRs in a row that passed QA first time":`PR consecutive con QA superato al primo tentativo`,"est. cost":`Costo stimato`,turns:`Turni`,"What the coding agents report, API-equivalent; subscription usage is billed by plan":`Stima degli agenti equivalente al costo API; l’utilizzo in abbonamento segue il piano`,"Last merged":`Ultima integrata`,untitled:`senza titolo`,Opened:`Aperte`,"1st-time QA":`QA al primo tentativo`,"Pass rate":`Percentuale superati`,"Fixes / PR":`Correzioni / PR`,"Fix rounds per merged PR":`Cicli di correzione per PR integrata`,Reviews:`Verifiche`,"QA reviews done":`Verifiche QA effettuate`,Streak:`Serie`,"Longest run of PRs passing QA first time":`Serie più lunga di PR con QA superato al primo tentativo`,"This week":`Questa settimana`,"On the team":`Nel team da`,Cost:`Costo`,"Estimated, as the coding agents report it":`Stima riportata dagli agenti di sviluppo`,Turns:`Turni`,"🏅 Careers":`🏅 Carriere`,"Counted from what the office sees: PRs, QA rounds, fixes and merges. Look at a desk for a moment to see its card.":`Conteggio delle attività osservate dall’ufficio: PR, cicli QA, correzioni e merge. Guarda una postazione per vederne la scheda.`,"Open their desk":`Apri la postazione`,"Back to the games (Backspace)":`Torna ai giochi (Backspace)`,"‹ Games":`‹ Giochi`,"🎮 Games":`🎮 Giochi`,"Something to do while the team works. They pause when you put the phone away.":`Qualcosa da fare mentre il team lavora. I giochi vanno in pausa quando riponi il telefono.`,"Falling blocks (a Tetris clone)":`Blocchi che cadono (un clone di Tetris)`,"Eat the bugs (a Snake clone)":`Mangia i bug (un clone di Snake)`,"Your office pet (a Tamagotchi clone)":`Il tuo cucciolo d’ufficio (un clone di Tamagotchi)`,"Best {score}":`Record {score}`,"No best score yet":`Nessun record`,"⏸ Game paused, tap to resume":`⏸ Gioco in pausa, tocca per riprendere`,"{name} the {stage} {mood}":`{name}, {stage}, {mood}`,"is napping":`sta dormendo`,"is thrilled":`è felicissimo`,"is doing fine":`sta bene`,"is hungry":`ha fame`,"is bored":`si annoia`,"is sleepy":`ha sonno`,"is grumpy, needs you":`è scontroso e ha bisogno di te`,"📦 A delivery is waiting for you":`📦 C’è una consegna per te`,"open a game":`aprono un gioco`,"comes back here":`torna qui`,"Shipped!":`Fatto!`,"Double ship!":`Doppietta!`,"Triple ship!":`Tripletta!`,"CUBETRIS!":`CUBETRIS!`,"Level {level}!":`Livello {level}!`,NEXT:`PROSSIMI`,SCORE:`PUNTI`,LINES:`RIGHE`,LEVEL:`LIVELLO`,BEST:`RECORD`,"Space or tap to start":`Spazio o tocca per iniziare`,"Space or tap to resume":`Spazio o tocca per riprendere`,"Space or tap to play again":`Spazio o tocca per rigiocare`,"Stack the blocks.":`Impila i blocchi.`,"Fill a row to ship it!":`Completa una riga!`,"Coffee break ☕":`Pausa caffè ☕`,"Score {score}":`Punti {score}`,"Stack overflow!":`Tutto pieno!`,"🏆 New best!":`🏆 Nuovo record!`,"Go!":`Via!`,"Pause (Enter)":`Pausa (Invio)`,"Play (Space)":`Gioca (Spazio)`,"Pause (Space)":`Pausa (Spazio)`,"Cubetris board":`Campo di Cubetris`,"Move left":`Muovi a sinistra`,"Soft drop":`Discesa lenta`,"Move right":`Muovi a destra`,Rotate:`Ruota`,turn:`ruota`,down:`giù`,drop:`lascia`,pause:`pausa`,"🐛 {count} eaten":`🐛 {count} mangiati`,"SCORE {score}":`PUNTI {score}`,"BEST {score}":`RECORD {score}`,"Eat bugs 🐛, sip coffee ☕":`Mangia bug 🐛, bevi caffè ☕`,"Dodge desks, walls & yourself":`Evita scrivanie, muri e te stesso`,"Arrows, swipe or tap to start":`Frecce o tocca per iniziare`,"Unplugged!":`Scollegato!`,"Tangled up!":`Aggrovigliato!`,"Desk crash!":`Scontro con la scrivania!`,"Office wired! 🎉":`Ufficio cablato! 🎉`,"Score {score} · {length} long":`Punti {score} · Lunghezza {length}`,"Cable Snake board":`Campo di Cable Snake`,Up:`Su`,Left:`Sinistra`,Right:`Destra`,Down:`Giù`,"steer · swipe on the board ·":`guida · scorri sul campo ·`,Intern:`Stagista`,Junior:`Junior`,Senior:`Senior`,"Tech Lead":`Responsabile tecnico`,Snack:`Spuntino`,Nap:`Sonnellino`,Wake:`Sveglia`,"Wake up":`Sveglia`,Food:`Cibo`,Fun:`Divertimento`,Energy:`Energia`,EMPLOYEE:`COLLEGA`,"OF THE MONTH":`DEL MESE`,"NEW HIRE":`ASSUNTO`,"A delivery just arrived at your desk…":`È appena arrivata una consegna alla tua scrivania…`,"While you were away: {text}":`Mentre eri via: {text}`,"{count} care points":`{count} punti cura`,"{name}, your desk pet, is {mood}":`{name}, il tuo cucciolo d’ufficio: {mood}`,asleep:`addormentato`,happy:`felice`,content:`contento`,hungry:`affamato`,bored:`annoiato`,tired:`stanco`,grumpy:`scontroso`,"A delivery box":`Una scatola in consegna`,"care · click":`per le cure · clic su`,"for a pat · day {day}":`per una carezza · giorno {day}`,"📦 Unbox your desk pet":`📦 Apri la scatola del tuo cucciolo`,"Hi! I’m {name}, your new desk pet. Keep me fed, busy and rested!":`Ciao! Sono {name}, il tuo nuovo cucciolo d’ufficio. Dammi cibo, giochi e riposo!`,"Promoted to {stage}! 🎉":`Promosso a {stage}! 🎉`,"Zzz… 💤":`Zzz… 💤`,"Best. Job. Ever. ✨":`Il. Miglior. Lavoro. ✨`,"Just vibing at my desk.":`Mi godo la mia scrivania.`,"I'm hungry… got a donut? 🍩":`Ho fame… hai una ciambella? 🍩`,"I'm bored. Play with me? 🎾":`Mi annoio. Giochi con me? 🎾`,"So… sleepy… 🥱":`Che… sonno… 🥱`,"Hmph. Nobody looks after me. 😤":`Uffa. Nessuno si occupa di me. 😤`,"Five more minutes… 😒":`Ancora cinque minuti… 😒`,"Good morning! ☀️":`Buongiorno! ☀️`,"I'm not sleepy!":`Non ho sonno!`,"Nap time… 💤":`Ora del sonnellino… 💤`,"Zzz… (shh, still asleep) 💤":`Zzz… (shh, sto ancora dormendo) 💤`,"I'm stuffed! No more donuts.":`Sono pieno! Basta ciambelle.`,"Nom nom nom! 🍩":`Gnam gnam! 🍩`,"Sprinkles! My favourite.":`Zuccherini! I miei preferiti.`,"Donut-driven development!":`Sviluppo a base di ciambelle!`,"Too… much… coffee! 😵💫":`Troppo… caffè! 😵💫`,"☕ Ready to ship!":`☕ Pronto a pubblicare!`,"Caffeine: loaded.":`Caffeina: caricata.`,"Brb, refactoring everything.":`Torno subito, rifattorizzo tutto.`,"Too tired to play… 🥱":`Troppo stanco per giocare… 🥱`,"Wheee! 🎾":`Evviva! 🎾`,"Again! Again!":`Ancora! Ancora!`,"Best. Break. Ever.":`La. Miglior. Pausa.`,"Hehe ❤️":`Eheh ❤️`,"*happy wiggle*":`*si agita felice*`,"You're the best manager!":`Sei il miglior manager!`,"{count} bite left":`{count} boccone rimasto`,"{count} bites left":`{count} bocconi rimasti`," (a bit charred)":` (un po’ bruciacchiata)`,eat:`mangia`,drink:`bevi`,"{count} sip left":`{count} sorso rimasto`,"{count} sips left":`{count} sorsi rimasti`,"Overclock energy drink":`Bevanda energetica Overclock`,"Bubble Sort sparkling water":`Acqua frizzante Bubble Sort`,"Night Shift cold brew":`Caffè freddo Night Shift`,"Mate Mode yerba-mate soda":`Bibita al mate Mate Mode`,"cold leftover pizza":`Pizza fredda avanzata`,"Refactor protein bar":`Barretta proteica Refactor`,"Strung Along string cheese":`Formaggio Strung Along`,"Hotfix chocolate bar":`Barretta di cioccolato Hotfix`,"📦 Carrying the {item}":`📦 Stai trasportando: {item}`,"on a glowing spot places it":`su un punto luminoso lo colloca`,"puts it back":`lo rimette via`,"take it to a free agent’s desk to have them test it":`portala alla postazione di un agente libero per la verifica`,"take it to a free agent’s desk":`portala alla postazione di un agente libero`,"and press":`e premi`,"elsewhere puts it back":`altrove la rimette sulla lavagna`,"Empty mug":`Tazza vuota`,"throw · hold to charge":`lancia · tieni premuto per caricare`,"the moon and the constellations":`la luna e le costellazioni`,"read the billboards on the rooftops":`leggi i cartelloni sui tetti`,zoom:`zoom`,"step back":`allontanati`,"🪑 Sitting back":`🪑 Seduto in relax`,"get up":`alzati`,fire:`spara`,reload:`ricarica`,"Darts {ammo}/{max}":`Dardi {ammo}/{max}`,"Reloading…":`Ricarica…`,"Empty:":`Vuoto:`,"to reload":`per ricaricare`,"{name} is on the way…":`{name} sta arrivando…`,"Nobody's free to play right now":`Nessuno è libero per giocare adesso`,"Waiting for someone free to come and play…":`In attesa di un agente libero per giocare…`,"You win {score}!":`Hai vinto {score}!`,"{name} wins {score}!":`{name} vince {score}!`," · Click for a rematch":` · Clic per la rivincita`,"Let: serve again":`Let: ripeti il servizio`,"{name} {reason}":`{name}: {reason}`,You:`Tu`,"served a fault":`fallo al servizio`,"hit the net":`palla in rete`,"didn't clear the net":`rete non superata`,"hit it out":`palla fuori`,"missed it":`palla mancata`,"let it bounce twice":`doppio rimbalzo`," · Game point":` · Punto decisivo`,"Game point · ":`Punto decisivo · `,"Your serve: click to toss and hit":`Tocca a te: clic per alzare e colpire`,"{name} to serve":`Servizio a {name}`,"Rally {count}":`Scambi {count}`,"paddle (up: towards the net) · swing through for pace and spin":`racchetta (su: verso la rete) · colpisci per dare velocità ed effetto`,serve:`servi`,leave:`esci`},Ce={"After verifying the address, you may enter it under Notifications → Office address for links. That field only changes notification links; it does not configure remote access.":`Dopo aver verificato l’indirizzo, puoi inserirlo in Notifiche → Indirizzo dell’ufficio per i link. Quel campo cambia solo i link delle notifiche: non configura l’accesso remoto.`,"Phone access":`Accesso da telefono`,"📱 Phone access":`📱 Accesso da telefono`,"You are on the office computer. Local previews need no remote setup.":`Sei sul computer dell’ufficio. Le anteprime locali non richiedono configurazioni remote.`,"HTTPS and service workers are available in this browser. Verify the preview transport below.":`HTTPS e service worker sono disponibili in questo browser. Verifica sotto il trasporto delle anteprime.`,"Remote HTTP cannot load previews reliably. CSS and scripts may go missing. Use a private HTTPS address.":`L’accesso remoto HTTP non carica le anteprime in modo affidabile: possono mancare CSS e script. Usa un indirizzo HTTPS privato.`,"This browser cannot use the preview service worker. Check the certificate, browser support and whether an insecure page is embedding the office.":`Questo browser non può usare il service worker delle anteprime. Controlla certificato, supporto del browser e se una pagina non sicura incorpora l’ufficio.`,"Set up phone access":`Configura l’accesso da telefono`,"HTTPS encrypts the connection; it does not authorize visitors. Anyone with access to this office can control agents and run commands. Keep it private or behind authentication.":`HTTPS cifra la connessione, ma non autorizza i visitatori. Chi accede all’ufficio può controllare gli agenti ed eseguire comandi. Mantienilo privato o protetto da autenticazione.`,"This guide never changes your network, certificates, firewall or office settings. Run commands yourself on the office computer only after reviewing them.":`Questa guida non modifica rete, certificati, firewall o impostazioni dell’ufficio. Esegui tu i comandi sul computer dell’ufficio, solo dopo averli verificati.`,"The office currently listens beyond loopback. HTTPS will not close that existing access. Review the bind address and firewall separately.":`L’ufficio è attualmente in ascolto anche oltre il loopback. HTTPS non chiuderà quell’accesso esistente. Verifica separatamente indirizzo di ascolto e firewall.`,"HTTPS setup method":`Metodo di configurazione HTTPS`,"Own HTTPS proxy":`Proxy HTTPS personale`,"Install Tailscale on the office computer and phone, sign in to your tailnet, and allow only trusted users/devices in its access rules.":`Installa Tailscale sul computer dell’ufficio e sul telefono, accedi alla tua tailnet e autorizza solo utenti e dispositivi fidati nelle regole di accesso.`,"On the office computer, inspect existing Serve routes first. Do not overwrite a route used by another service.":`Sul computer dell’ufficio, controlla prima le rotte Serve esistenti. Non sovrascrivere una rotta usata da un altro servizio.`,"After reviewing the route and any HTTPS/certificate prompts, run the following command yourself. It persists across restarts.":`Dopo aver verificato la rotta e le eventuali richieste su HTTPS e certificati, esegui tu il seguente comando. La configurazione rimane attiva dopo i riavvii.`,Copied:`Copiato`,"Copy command":`Copia comando`,"Could not read the office port. Retry; no command has been generated.":`Impossibile leggere la porta dell’ufficio. Riprova: non è stato generato alcun comando.`,"This bind address is not confirmed reachable through 127.0.0.1. Review SWARM_HOST on the office computer before configuring a loopback proxy.":`Non è confermato che questo indirizzo di ascolto sia raggiungibile tramite 127.0.0.1. Verifica SWARM_HOST sul computer dell’ufficio prima di configurare un proxy loopback.`,"Reading the actual office port…":`Lettura della porta effettiva dell’ufficio…`,"Retry port check":`Riprova la lettura della porta`,"Use the HTTPS address printed by Serve on your phone. Enable HTTPS in the tailnet if Tailscale asks. Serve is private to your tailnet; do not use Funnel or open a public router port.":`Sul telefono usa l’indirizzo HTTPS mostrato da Serve. Abilita HTTPS nella tailnet se Tailscale lo richiede. Serve è privato alla tua tailnet: non usare Funnel e non aprire porte pubbliche sul router.`,"Use a trusted private proxy or an identity-aware HTTPS proxy. Put authentication/access control in front of the whole office, including API, preview and WebSocket routes; a public certificate alone is not enough.":`Usa un proxy privato fidato o un proxy HTTPS con verifica dell’identità. Proteggi l’intero ufficio con autenticazione e controllo degli accessi, incluse API, anteprime e WebSocket: un certificato pubblico da solo non basta.`,"Mount the office at the root of a dedicated HTTPS origin, not a subpath. Forward all paths unchanged, support WebSocket upgrades, and proxy to the office’s local listening port.":`Pubblica l’ufficio alla radice di un’origine HTTPS dedicata, non in un sottopercorso. Inoltra tutti i percorsi senza modificarli, supporta gli upgrade WebSocket e usa come destinazione la porta locale dell’ufficio.`,"Office listening port: {port}":`Porta di ascolto dell’ufficio: {port}`,"Use a certificate trusted by the phone. Do not bypass browser certificate warnings or disable browser security. Follow your proxy’s authentication and TLS documentation.":`Usa un certificato riconosciuto dal telefono. Non ignorare gli avvisi sui certificati e non disabilitare la sicurezza del browser. Segui la documentazione del tuo proxy per autenticazione e TLS.`,"Tailscale Serve documentation ↗":`Documentazione di Tailscale Serve ↗`,"Your private HTTPS office address":`Indirizzo HTTPS privato del tuo ufficio`,"Enter an HTTPS origin only, without a path, query, fragment or embedded credentials.":`Inserisci solo un’origine HTTPS, senza percorsi, parametri, frammenti o credenziali incorporate.`,"Open HTTPS office ↗":`Apri l’ufficio HTTPS ↗`,"Verify on the phone":`Verifica sul telefono`,"Open the private HTTPS office on your phone and run this check there. A local check does not validate the phone or your access rules.":`Apri l’ufficio HTTPS privato sul telefono ed esegui lì questa verifica. Un controllo locale non verifica il telefono né le regole di accesso.`,"Checking preview transport…":`Verifica del trasporto delle anteprime…`,"Check preview CSS and scripts":`Verifica CSS e script delle anteprime`,"The check needs a secure browser context with service workers. Reopen the office over trusted HTTPS first.":`La verifica richiede un contesto sicuro con service worker. Riapri prima l’ufficio tramite HTTPS con un certificato riconosciuto.`,"✓ The preview worker loaded the test CSS and JavaScript correctly in this browser.":`✓ Il service worker delle anteprime ha caricato correttamente CSS e JavaScript di prova in questo browser.`,"The transport check failed or timed out. Check the certificate, browser service-worker permissions and proxy routes, then retry. No project was started.":`Verifica non riuscita o scaduta. Controlla certificato, permessi dei service worker e rotte del proxy, poi riprova. Non è stato avviato alcun progetto.`,"This uses synthetic test assets only, with no AI work or dependency installs. It verifies worker/CSS/JavaScript routing, not every app’s compatibility, authentication or WebSocket connection.":`Usa solo risorse sintetiche di prova, senza lavoro AI né installazione di dipendenze. Verifica l’instradamento di service worker, CSS e JavaScript, non la compatibilità di ogni app, l’autenticazione o la connessione WebSocket.`,"Preview transport check":`Verifica del trasporto delle anteprime`,"The preview is hidden until this browser can route its assets securely. Your running app has not been stopped.":`L’anteprima è nascosta finché questo browser non può instradare le risorse in modo sicuro. L’app in esecuzione non è stata fermata.`},we=e=>e===`it`?`it`:`en`,Te=e=>we(e)===`it`?`it-IT`:`en-US`,Ee={...ye,...be,...xe,...Se,...Ce,"Shell module":`Modulo della scocca`,"Agent identity":`Identità dell’agente`,She:`Lei`,He:`Lui`,"Coordination module":`Modulo di coordinamento`,"Code module":`Modulo codice`,"Code module · reinforced":`Modulo codice · rinforzato`,"Planning module":`Modulo pianificazione`,"Planning module · reinforced":`Modulo pianificazione · rinforzato`,"Inspection module":`Modulo ispezione`,"Inspection module · reinforced":`Modulo ispezione · rinforzato`,"Robot cosmetics only: modules do not change the agent’s job.":`Solo aspetto del robot: i moduli non cambiano il lavoro dell’agente.`,"Request changes":`Richiedi modifiche`,"Manager-requested changes":`Modifiche richieste dal manager`,"Request changes on PR #{number}?":`Richiedere modifiche alla PR #{number}?`,"Required: describe the requested changes":`Obbligatorio: descrivi le modifiche richieste`,"QA passed. Describe the additional changes you want. The previous report is preserved and the changes must pass a new QA round. This starts agent work and may consume AI quota.":`Il QA è superato. Descrivi le ulteriori modifiche desiderate. Il rapporto precedente viene conservato e le modifiche dovranno superare un nuovo QA. Questa azione avvia il lavoro di un agente e può consumare quota AI.`,"Analysis result":`Risultato dell’analisi`,"Terminal and technical log":`Terminale e log tecnico`,"Saved log excerpt: older analyses did not store the full Markdown. The original output remains in the terminal.":`Estratto del log salvato: le analisi precedenti non conservavano il Markdown completo. L’output originale resta nel terminale.`,"🎧 Listening in a moment…":`🎧 Ascolto tra un istante…`,"Turning your words into text…":`Trascrizione in corso…`,"Starting the mic…":`Avvio del microfono…`,"🎧 Listening… just talk":`🎧 In ascolto… parla pure`,"Listening… stop talking or tap 🎙️ to finish":`In ascolto… smetti di parlare o premi 🎙️ per terminare`,"Listening… let go to finish":`In ascolto… rilascia per terminare`,"Listening: Esc stops":`In ascolto: Esc interrompe`,"Hold to talk (or hold {key}); tap to talk until you stop":`Tieni premuto per parlare (oppure tieni premuto {key}); un clic ascolta finché smetti di parlare`,"🎙️ Speech recognition did not start. Check microphone permissions and try Chrome (verified). Some browsers, including Brave, may expose speech recognition without a working service. You can also type or use Windows + H on Windows.":`🎙️ Il riconoscimento vocale non si è avviato. Controlla i permessi del microfono e prova Chrome (verificato). Alcuni browser, incluso Brave, possono esporre il riconoscimento senza un servizio funzionante. Puoi anche scrivere o usare Windows + H su Windows.`,"🎙️ The microphone did not start. Check microphone permissions and the selected input device, then try again.":`🎙️ Il microfono non si è avviato. Controlla i permessi e il dispositivo di ingresso selezionato, poi riprova.`,"🎙️ The microphone is blocked for the office. Allow it from the icon at the left of the address bar to talk instead of type.":`🎙️ Il microfono è bloccato per questo ufficio. Autorizzalo dall’icona a sinistra dell’indirizzo per dettare i messaggi.`,"🎙️ No microphone is working here. Plug one in (or close what's using it), or keep typing.":`🎙️ Nessun microfono funzionante. Collegane uno (o chiudi l’app che lo sta usando), oppure continua a scrivere.`,"🎙️ The browser's speech service couldn't be reached. Try again, or pick ElevenLabs in Settings → Voice.":`🎙️ Il servizio vocale del browser non è raggiungibile. Riprova oppure scegli ElevenLabs in Impostazioni → Voce.`,"🎙️ The browser can't recognise your language. Pick ElevenLabs in Settings → Voice.":`🎙️ Il browser non riconosce questa lingua. Scegli ElevenLabs in Impostazioni → Voce.`,"🎙️ Listening stopped ({code}).":`🎙️ Ascolto interrotto ({code}).`,"🎙️ This browser can't turn speech into text. Use Chrome, Edge or Safari, or pick ElevenLabs in Settings → Voice.":`🎙️ Questo browser non supporta la dettatura. Prova Chrome, Edge o Safari, oppure scegli ElevenLabs in Impostazioni → Voce.`,"🎙️ This browser can't record from a microphone, so ElevenLabs can't hear you. Use a current Chrome, Edge, Firefox or Safari.":`🎙️ Questo browser non può registrare il microfono per ElevenLabs. Usa una versione aggiornata di Chrome, Edge, Firefox o Safari.`,"🎙️ Add your ElevenLabs API key in Settings → Voice to talk instead of type.":`🎙️ Aggiungi la chiave API ElevenLabs in Impostazioni → Voce per dettare.`,"Browser dictation was verified in Chrome. Other browsers may expose recognition without a working service (observed in Brave). Microphone permission and an Internet connection may be required.":`La dettatura è stata verificata in Chrome. Altri browser possono esporre il riconoscimento senza un servizio funzionante (osservato in Brave). Possono essere necessari il permesso del microfono e una connessione Internet.`,"Yellow means starting, not listening. Wait for “Listening…” before speaking. If startup stalls, an error appears after about 10 seconds.":`Il giallo indica l’avvio, non l’ascolto. Aspetta “In ascolto…” prima di parlare. Se l’avvio si blocca, compare un errore dopo circa 10 secondi.`,"Hold the 🎙️ beside Send and speak; release to finish. A quick tap listens until you stop talking. Esc stops listening. Review the text before sending.":`Tieni premuto 🎙️ accanto a Invia e parla; rilascia per terminare. Un clic breve ascolta finché smetti di parlare. Esc interrompe l’ascolto. Controlla il testo prima di inviarlo.`,"Send automatically when I stop talking":`Invia automaticamente quando smetto di parlare`,"Sessions while pacing":`Sessioni durante il rallentamento`,"🧠 The CEO":`🧠 Il CEO`,"Team changes from the CEO":`Modifiche al team del CEO`,"I approve each one":`Approvo ogni modifica`,"Apply straight away":`Applica subito`,"Company review every (minutes, 0 = off)":`Revisione azienda ogni (minuti, 0 = disattivata)`,"⌨️ How agents run":`⌨️ Esecuzione degli agenti`,"🏢 Company":`🏢 Azienda`,"The office dog's name":`Nome del cane dell’ufficio`,"Projects folder (new projects are created here)":`Cartella progetti (qui vengono creati i nuovi progetti)`,"Free idle desks after (minutes, 0 = never)":`Libera le postazioni inattive dopo (minuti, 0 = mai)`,"🧭 Replay the tour":`🧭 Ripeti la visita guidata`,"ℹ️ Environment":`ℹ️ Ambiente`,"🏢 Projects: {projects} · Team: {staff}":`🏢 Progetti: {projects} · Team: {staff}`,"📱 Notifications: {count}. Press {key} once you enter.":`📱 Notifiche: {count}. Premi {key} dopo essere entrato.`,"📱 Press {key} anywhere for your phone.":`📱 Premi {key} ovunque per aprire il telefono.`,"Walk up behind anyone to watch their screen.":`Avvicinati a un agente per guardare il suo schermo.`,Interact:`Interagisci`,"Claude Opus 5.5 at xhigh effort: the thinking-hardest person in the building.":`Claude Opus 5.5 con ragionamento xhigh: la mente più impegnata dell’ufficio.`,"{name} studies every project, writes its QA checklist, turns the work you ask for into GitHub issues and decides how big each team should be.":`{name} studia ogni progetto, scrive la checklist QA, trasforma le tue richieste in issue GitHub e dimensiona i team.`,"(recommended). New agents wait in the lobby and on your phone.":`(consigliato). I nuovi agenti aspettano nella hall e sul telefono.`,"Let {name} change teams":`Lascia che {name} modifichi i team`,"on their own, up to {count} agents per floor.":`autonomamente, fino a {count} agenti per piano.`,"moved into floor {floor}.":`è stato collegato al piano {floor}.`,"The project is connected. CEO onboarding and automatic work follow the options you selected.":`Il progetto è collegato. Lo studio del CEO e il lavoro automatico seguono le opzioni selezionate.`,"Pick one of your project folders, a GitHub repo, or start something new. Every project needs to be on GitHub: issues and pull requests are how the team works.":`Scegli una cartella di progetto, un repository GitHub oppure crea qualcosa di nuovo. Ogni progetto deve essere su GitHub: il team lavora tramite issue e pull request.`,"{company} is open for business":`{company} è pronta a lavorare`,"Your project is connected.":`Il progetto è collegato.`,"Waiting for your first project.":`In attesa del primo progetto.`,"Team changes wait for your OK.":`Le modifiche al team attendono la tua approvazione.`,"Team changes up to {count} agents per floor go through on their own.":`Le modifiche al team sono automatiche, fino a {count} agenti per piano.`,"Open your phone:":`Apri il telefono:`,"Chat with {name}, approve team changes, and see every project at a glance.":`Scrivi a {name}, approva le modifiche al team e controlla tutti i progetti.`,"A short tour starts when you walk in.":`Entrando inizierà una breve visita guidata.`,"Welcome back, {name}.":`Bentornato, {name}.`,"A cartoon office where a team of AI coding agents works through your GitHub issues.":`Un ufficio animato dove un team di agenti AI lavora alle tue issue GitHub.`,"Loading…":`Caricamento…`,"Connecting to the swarm server…":`Connessione al server…`,"📱 Pocket mode, for phones and touch screens":`📱 Modalità tascabile, per telefoni e schermi touch`,"DEMO MODE: fake repos, fake agents":`MODALITÀ DEMO: repository e agenti simulati`,"I'll add one later":`Lo aggiungerò più tardi`,"Enter sends · Shift+Enter adds a new line":`Invio invia · Maiusc+Invio aggiunge una riga`,"⚙️ This device and notifications":`⚙️ Dispositivo e notifiche`,"Speak messages":`Leggi i messaggi`,"🔈 Test":`🔈 Prova`,"🎙️ Talk instead of type":`🎙️ Parla invece di scrivere`,"Turn speech into text with":`Trascrivi la voce con`,"Hear the CEO's messages read aloud the moment they arrive, without opening the phone.":`Ascolta i messaggi del CEO appena arrivano, senza aprire il telefono.`,"Speech follows the office language. Browser voices depend on your device; ElevenLabs requires a multilingual model and a suitable voice.":`La voce segue la lingua dell’ufficio. Le voci del browser dipendono dal dispositivo; ElevenLabs richiede un modello multilingue e una voce adatta.`,"⚡ Start work automatically: free agents pick up issues as soon as they're filed (you can switch this off per floor)":`⚡ Avvia automaticamente il lavoro: gli agenti liberi prendono in carico le nuove issue (disattivabile per piano)`,"What should the team build? e.g. A cozy 3D browser game where you run a tiny island bakery.":`Che cosa deve sviluppare il team? Es. Un gioco 3D nel browser in cui gestisci un piccolo panificio su un’isola.`,Language:`Lingua`,"Office language":`Lingua dell’ufficio`,"Language applies to this office, the CEO’s replies and speech. Code, issues and pull requests remain in English.":`La lingua si applica a questo ufficio, alle risposte del CEO e alla voce. Codice, issue e pull request restano in inglese.`,Save:`Salva`,Cancel:`Annulla`,Close:`Chiudi`,Send:`Invia`,Back:`Indietro`,Next:`Avanti`,Skip:`Salta`,Settings:`Impostazioni`,Name:`Nome`,Model:`Modello`,Effort:`Ragionamento`,Variant:`Variante`,"Coding agent":`Agente di sviluppo`,Team:`Team`,Company:`Azienda`,Games:`Giochi`,Chat:`Chat`,Approvals:`Approvazioni`,Terminal:`Terminale`,"Your phone":`Il tuo telefono`,Console:`Console`,"Floor list":`Elenco piani`,Help:`Aiuto`,Accessibility:`Accessibilità`,"Manager’s console":`Console del manager`,"🧑💼 Manager's console":`🧑💼 Console del manager`,"🏢 Floors & repos":`🏢 Piani e repository`,"🛰️ Mission control":`🛰️ Centro di controllo`,"🧠 CEO":`🧠 CEO`,"👩💻 Team":`👩💻 Team`,"📝 Issues":`📝 Issue`,"⚙️ Settings":`⚙️ Impostazioni`,"📼 Time-lapse":`📼 Riepilogo della giornata`,"♿ Accessibility":`♿ Accessibilità`,Welcome:`Benvenuto`,You:`Tu`,"Your CEO":`Il tuo CEO`,"First project":`Primo progetto`,Ready:`Pronto`,"Your own cartoon software company, staffed by AI coding agents.":`La tua azienda software in un ufficio animato, con un team di agenti AI.`,"Let's set up your company":`Configuriamo la tua azienda`,"Skip setup and use the defaults":`Salta la configurazione e usa i valori predefiniti`,"DEMO MODE":`MODALITÀ DEMO`,"Who's the boss?":`Chi dirige l’azienda?`,"That's you. You run the company; the agents do the typing.":`Tu. Tu guidi l’azienda, gli agenti scrivono il codice.`,"Your name":`Il tuo nome`,"Company name":`Nome dell’azienda`,"Suggest another name":`Suggerisci un altro nome`,"It goes on the sign in the lobby. Change either any time in the manager's console.":`Comparirà sull’insegna nella hall. Puoi modificare entrambi i nomi nella console del manager.`,"Meet your CEO":`Ti presento il tuo CEO`,"Tie colour":`Colore della cravatta`,"👩 She":`👩 Lei`,"👨 He":`👨 Lui`,"Ask me before every team change":`Chiedimi prima di ogni modifica al team`,"Your first project":`Il tuo primo progetto`,"Opening the doors…":`Apertura delle porte…`,"Enter the office":`Entra nell’ufficio`,"Skip for now":`Salta per ora`,"Loading the office…":`Caricamento dell’ufficio…`,"🏢 Every project gets its own floor, with a team of coding agents building and testing its GitHub issues.":`🏢 Ogni progetto ha un piano e un team di agenti che sviluppa e verifica le sue issue GitHub.`,"🧠 A CEO studies each project, plans the work you ask for and sizes each team. You approve every new agent.":`🧠 Il CEO studia i progetti, pianifica il lavoro richiesto e dimensiona i team. Tu approvi ogni nuovo agente.`,"📱 Your phone keeps you in the loop from anywhere in the building.":`📱 Il telefono ti tiene aggiornato da qualsiasi punto dell’edificio.`,"The corner office is empty.":`L’ufficio del CEO è vuoto.`,"Now:":`Ora:`,"Periodic reviews are off (Settings).":`Le revisioni periodiche sono disattivate (Impostazioni).`,"🔎 Review the company now":`🔎 Rivedi l’azienda ora`,"📱 Open the phone":`📱 Apri il telefono`,"■ Stop":`■ Ferma`,"📄 Team changes":`📄 Modifiche al team`,"🗺️ Project briefs":`🗺️ Obiettivi dei progetti`,"Connect a repo first.":`Collega prima un repository.`,"Re-study":`Studia di nuovo`,"Save brief":`Salva obiettivo`,"🧠 Ask the CEO to plan it":`🧠 Chiedi al CEO di pianificare`,"QA brief":`Indicazioni QA`,"None waiting. The CEO grows or shrinks a floor’s team when its work calls for it (Settings → Team changes from the CEO).":`Nessuna richiesta in attesa. Il CEO adatta il team al lavoro disponibile (Impostazioni → Modifiche al team del CEO).`,"Message {name}":`Scrivi a {name}`,"Message {name} (or press P anywhere for your phone)…":`Scrivi a {name} (oppure premi P per aprire il telefono)…`,"What's everyone working on?":`A cosa sta lavorando il team?`,"Should a team grow?":`Serve ampliare un team?`,"Plan the next milestone for the busiest floor.":`Pianifica la prossima milestone per il piano più impegnato.`,"Connect a project":`Collega un progetto`,Visit:`Visita`,Disconnect:`Scollega`,"⟳ Sync now":`⟳ Sincronizza ora`,"⚡ Auto-assign issues":`⚡ Assegna automaticamente le issue`,"🔀 Auto-merge":`🔀 Merge automatico`,"🌐 Browser testing (Playwright MCP)":`🌐 Test nel browser (Playwright MCP)`,"📁 A folder on this computer":`📁 Una cartella su questo computer`,"🐙 A GitHub repo":`🐙 Un repository GitHub`,"✨ Something new":`✨ Un nuovo progetto`,"Your projects folder":`Cartella dei tuoi progetti`,"Look here":`Cerca qui`,"Filter folders…":`Filtra cartelle…`,"Filter your repos…":`Filtra i tuoi repository…`,"Org (optional)":`Organizzazione (facoltativa)`,List:`Elenca`,"Add floor":`Aggiungi piano`,"Moving in…":`Collegamento…`,Connect:`Collega`,"Publish to GitHub":`Pubblica su GitHub`,"Publishing…":`Pubblicazione…`,"Create private repo":`Crea repository privato`,"Brief for the CEO (optional): what should the team work on next?":`Obiettivo per il CEO (facoltativo): a cosa deve lavorare il team?`,"Let the CEO study this repository and plan from the brief (turn off to skip onboarding and its AI request)":`Consenti al CEO di studiare il repository e pianificare dall’obiettivo (disattiva per saltare l’avvio e la richiesta AI)`,"Merge automatically after QA and GitHub checks pass":`Esegui il merge automaticamente dopo QA e controlli GitHub superati`,"⚡ Start work automatically: free agents pick up issues as soon as they’re filed (you can switch this off per floor)":`⚡ Avvia il lavoro automaticamente: gli agenti liberi prendono in carico le nuove issue (disattivabile per piano)`,"Name (optional)":`Nome (facoltativo)`,"default model":`modello predefinito`,"Model default":`Valore predefinito del modello`,"model default":`predefinito del modello`,"Browse OpenCode models":`Sfoglia i modelli OpenCode`,"Selected:":`Selezionato:`,"OpenCode default":`Predefinito di OpenCode`,Refresh:`Aggiorna`,"Loading models…":`Caricamento modelli…`,"Search models":`Cerca modelli`,"Search OpenCode models":`Cerca modelli OpenCode`,Provider:`Provider`,"All providers":`Tutti i provider`,"Available models ({count})":`Modelli disponibili ({count})`,"Select a model":`Seleziona un modello`,"Available OpenCode models":`Modelli OpenCode disponibili`,"OpenCode variant":`Variante OpenCode`,"OpenCode provider":`Provider OpenCode`,"Use model":`Usa modello`,"No matching models.":`Nessun modello corrispondente.`,"Project:":`Progetto:`,"Choose a model and variant, then press “Use model” to save. Changes apply to the next task. Manual entry remains available.":`Scegli modello e variante, poi premi “Usa modello” per salvare. La modifica vale dal prossimo incarico. Puoi anche inserire il modello manualmente.`,"🔎 Start read-only analysis":`🔎 Avvia analisi in sola lettura`,"Start analysis":`Avvia analisi`,"Analysis request":`Richiesta di analisi`,"🔎 Read-only analysis · no PR expected":`🔎 Analisi in sola lettura · nessuna PR richiesta`,"Reads the repository checkout without an issue, dependency installation or PR workflow. No automatic follow-up or new assignment until Clear desk. These are agent instructions, not a filesystem sandbox.":`Legge il checkout senza issue, installazioni o flusso PR. Nessun seguito o incarico automatico fino a Svuota postazione. Sono istruzioni per l’agente, non una sandbox.`,"What should this agent read and explain? No code changes, shell commands, commits or PRs.":`Che cosa deve leggere e spiegare l’agente? Niente modifiche al codice, comandi shell, commit o PR.`,"Nothing assigned":`Nessun incarico`,"Nothing to pick up":`Nessun lavoro disponibile`,"▶ Start issue":`▶ Avvia issue`,"↺ Clear desk":`↺ Svuota postazione`,"Let go":`Rimuovi dal team`,"⚙️ Setup":`⚙️ Configurazione`,"🎥 Follow":`🎥 Segui`,"🏅 Career":`🏅 Carriera`,free:`libero`,"setting up":`preparazione`,working:`al lavoro`,done:`completato`,"needs help":`serve aiuto`,stopped:`fermato`,"🧠 Agents":`🧠 Agenti`,"Default coding agent":`Agente di sviluppo predefinito`,"Default model":`Modello predefinito`,"Default effort":`Ragionamento predefinito`,"Default OpenCode variant":`Variante OpenCode predefinita`,Runtime:`Modalità di esecuzione`,"Real terminals":`Terminali reali`,Manager:`Manager`,"Most agents per floor":`Numero massimo di agenti per piano`,"Session limit":`Limite di sessioni`,"Company review every (minutes)":`Revisione azienda ogni (minuti)`,"💬 Chat":`💬 Chat`,"📊 Company":`📊 Azienda`,"👥 Team":`👥 Team`,"✋ Approvals":`✋ Approvazioni`,"📋 Kanban":`📋 Kanban`,"🏢 Open the 3D office":`🏢 Apri l’ufficio 3D`,"Settings and notifications":`Impostazioni e notifiche`,"🎧 Hands-free":`🎧 Vivavoce`,"Talk instead of type":`Parla invece di scrivere`,"Stop listening":`Interrompi ascolto`,"🔊 Voice":`🔊 Voce`,Voice:`Voce`,Listen:`Ascolto`,Off:`Disattivato`,"Browser voice":`Voce del browser`,Browser:`Browser`,"free, built in":`gratuito, integrato`,"natural voices, with your own key":`voci naturali, con la tua chiave`,"with your own key":`con la tua chiave`,"no 🎙️":`senza 🎙️`,Replace:`Sostituisci`,Remove:`Rimuovi`,Test:`Prova`,Preview:`Anteprima`,Stop:`Ferma`,"Checking…":`Verifica…`,"Save key":`Salva chiave`,"ElevenLabs API key":`Chiave API ElevenLabs`,"Paste the new key":`Incolla la nuova chiave`,"Paste your key":`Incolla la tua chiave`,"Search voices…":`Cerca voci…`,"No voices match.":`Nessuna voce corrispondente.`,"Read messages aloud":`Leggi i messaggi ad alta voce`,"Office language changed. New CEO replies and speech will use the selected language.":`Lingua dell’ufficio aggiornata. Le nuove risposte del CEO e la voce useranno la lingua scelta.`,"Analysis stopped by the restart. It will not resume automatically; send a follow-up to continue.":`Analisi interrotta dal riavvio. Non ripartirà automaticamente; invia un messaggio per continuare.`};function b(e,t,n={}){return(we(e)===`it`&&Object.hasOwn(Ee,t)?Ee[t]:t).replace(/\{(\w+)\}/g,(e,t)=>Object.hasOwn(n,t)?String(n[t]):e)}function De(e){return we(e)===`it`?`Ciao! Sono il tuo CEO. Il team è pronto e ti terrò aggiornato sui progetti.`:ue}var Oe=e=>e?.status===`needs-human`&&!e.ceoLooking;function ke(e,t,n,r){let i=(e,t)=>b(r,e,t);if(e?.managerRequested&&(e.status===`failed`||e.status===`fixing`))return{note:i(`✏️ manager-requested changes`),tone:`warn`};switch(e?.status){case`passed`:return{note:e.mergeNote?`QA ✓ · ${e.mergeNote}`:t.mergeable===`CONFLICTING`?i(`QA ✓ · conflicts`):t.checks===`failing`?i(`QA ✓ · CI failing`):n&&t.checks===`pending`?i(`QA ✓ · waiting for checks`):i(`✅ QA passed`),tone:t.mergeable===`CONFLICTING`||t.checks===`failing`?`warn`:`good`};case`needs-human`:return e.ceoLooking?{note:i(`🧭 CEO is looking`),tone:`warn`}:{note:`${i(`⚠️ needs you`)}${e.mergeNote?` · ${e.mergeNote}`:``}`,tone:`bad`};case`failed`:return{note:i(`🔧 back to the developer`),tone:`warn`};case`fixing`:return{note:i(`🔧 fixing · round {number}`,{number:e.round}),tone:`warn`};case`testing`:return{note:i(`🔍 testing · round {number}`,{number:e.round})};case`queued`:return{note:`${i(`waiting for QA`)}${e.round>1?` · ${i(`round {number}`,{number:e.round})}`:``}`};default:return{note:i(t.isDraft?`draft`:`not tested yet`),tone:`warn`}}}function Ae(e){let t=Math.floor(Math.max(0,e)/6e4);return t<1?`<1 min`:t<60?`${t} min`:`${Math.floor(t/60)} h ${t%60} min`}function je(e,t,n,r){let i=e?`🔍 ${e} · testing`:`🔍 testing`,a=n!=null&&Number.isFinite(n)&&n>0&&n<=r+6e4?Ae(r-n):null,o=t>=1?t:null;return o&&a?{who:i,meta:[`round ${o} · ${a}`,`R${o} · ${a}`,a]}:o?{who:i,meta:[`round ${o}`,`R${o}`]}:{who:i,meta:a?[a]:[]}}function Me(e,t){let n=new Set;for(let r of(e??``).matchAll(/\b(?:depends\s+on|blocked\s+by)\s*:?\s*((?:#\d+(?:\s*(?:,|and|&)\s*)?)+)/gi))for(let e of r[1].matchAll(/#(\d+)/g))t.has(Number(e[1]))&&n.add(Number(e[1]));return[...n]}function Ne(e,t){return`#${e} waits for ${t.map(e=>`#${e}`).join(`, `)}: it can start once ${t.length===1?`that is`:`those are`} closed`}var Pe=[`tool`,`text`,`thinking`,`error`,`done`,`manager`];function Fe(e,t=e.length){for(let n=e.length-1;n>=Math.max(0,e.length-t);n--){let t=e[n];if(Pe.includes(t.kind)&&t.text.trim())return t}return null}var Ie=[`clear`,`cloudy`,`light-rain`,`heavy-rain`,`storm`,`fog`,`snow`],Le={mode:`cycle`,city:``},Re={frequency:`normal`,calm:!1},ze={place:null,reading:null,error:null};function Be(e,t){let n=e?.reading;return n&&t-n.at<3e6&&t-n.at>-6e4?n:null}var Ve=[{id:`needsHuman`,label:`A pull request needs me`},{id:`ceoMessage`,label:`A message from the CEO`},{id:`hire`,label:`A team change waits for my decision`},{id:`agentError`,label:`Someone is stuck in an error for over 10 minutes`},{id:`usage`,label:`Claude's usage limit pauses or paces the office`},{id:`merge`,label:`Every merge`}],He={events:{needsHuman:!0,ceoMessage:!0,hire:!0,agentError:!0,usage:!0,merge:!1},channels:{desktop:!0,push:!0,ntfy:!0},officeUrl:``},Ue=[`small`,`medium`,`large`],We={small:{usdPerCpuHour:.1,spec:`2 vCPU · 4 GB`},medium:{usdPerCpuHour:.2,spec:`4 vCPU · 8 GB`},large:{usdPerCpuHour:.4,spec:`8 vCPU · 16 GB`}},Ge=1e3,Ke={machineKind:`local`,boxSize:`small`,boxLimit:10},qe={ready:!1,source:null,hint:``},Je={keySet:!1,keyHint:``,keyError:null,github:qe,claude:qe,codex:qe,boxes:null},Ye=e=>e.enabled&&e.hidden&&e.permission===`granted`,Xe=[];typeof window<`u`&&(window.__swarmNotify={shown:Xe});function Ze(e,t){if(typeof document>`u`)return;let n=typeof Notification>`u`?`unsupported`:Notification.permission;Ye({enabled:t,hidden:document.visibilityState!==`visible`,permission:n})&&$e(e)}function Qe(){$e({id:`test-${Date.now()}`,event:`test`,title:`🔔 Test from Droidsembly`,body:`Desktop notifications work in this browser.`,at:Date.now(),url:`/`})}function $e(e){Xe.push(e);let t={body:e.body,tag:`cubefarm-${e.id}`,icon:`/icons/icon-192.png`,data:{url:e.url}},n=()=>{try{let n=new Notification(e.title,t);n.onclick=()=>{window.focus(),window.dispatchEvent(new CustomEvent(`cubefarm:open`,{detail:e.url})),n.close()}}catch{}},r=typeof navigator<`u`?navigator.serviceWorker:void 0;if(!r)return n();r.getRegistration().then(r=>r?.active?r.showNotification(e.title,t):n()).catch(n)}function et(e,t,n=`en-US`){let r=new Date(e),i=`${String(r.getHours()).padStart(2,`0`)}:${String(r.getMinutes()).padStart(2,`0`)}`;return r.toDateString()===new Date(t).toDateString()?i:`${r.toLocaleDateString(n,{weekday:`short`})} ${i}`}var tt={ready:0,building:0,inQa:0,fixing:0,toMerge:0,needsYou:0,triage:0,mergedToday:0,mergedHour:0,spark:Array(24).fill(0),leadMs:null,qaWaitMs:null,qaPass:null,ciPass:null,ciRuns:0,ciMs:null,busy:0,idle:0,errors:0,costToday:0},nt={floors:[],total:tt,ceoCostToday:0,alarms:[]};function rt(e){if(e===null||!Number.isFinite(e))return`—`;let t=Math.round(e/1e3);if(t<60)return`${t}s`;let n=Math.round(t/60);if(n<60)return`${n}m`;let r=Math.floor(n/60);if(r<24)return n%60?`${r}h ${n%60}m`:`${r}h`;let i=Math.floor(r/24);return r%24?`${i}d ${r%24}h`:`${i}d`}var it=e=>e===null?`—`:`${Math.round(e*100)}%`,at=e=>e>=100?`$${Math.round(e)}`:`$${e.toFixed(2)}`;function ot(e,t,n,r){if(e.state===`normal`||e.until===null)return null;let i=et(e.until,n,Te(r));return e.state===`paused`?b(r,`⏸ AI quota held until {time}; independent resources continue`,{time:i}):b(r,t===1?`🐢 AI quota paced until {time}: fewer than {count} session on that quota`:`🐢 AI quota paced until {time}: fewer than {count} sessions on that quota`,{time:i,count:t})}function st(e,t,n){let r=e.warning,i=e.state===`normal`?r?.resetsAt&&r.resetsAt>t?r.resetsAt:null:e.until;return{state:b(n,e.state===`paused`?`Paused`:e.state===`pacing`?`Pacing`:`Normal`),tone:e.state===`paused`?`bad`:e.state===`pacing`?`warn`:`good`,limit:r?`${r.limit?ct(r.limit,n):b(n,`AI usage`)}${r.pct===null?``:` · ${r.pct}%`}`:b(n,`No usage warnings`),pct:r?.pct??null,resets:i?et(i,t,Te(n)):null}}function ct(e,t){return[`5-hour limit`,`weekly limit`,`weekly Opus limit`,`weekly Sonnet limit`].includes(e)?b(t,e):e}var lt=(e,t)=>t.filter(t=>!e.some(e=>e.id===t.id));function ut(e){return`🚀 ${e.mergedToday} today · ⏱ ${rt(e.leadMs)} lead · ✅ CI ${it(e.ciPass)} · 💵 ~${at(e.costToday)}`}var dt=3.6,ft=1.65,pt=.3,mt={doorHalf:1.2,cabinHalf:1.5,depth:2.6,doorHeight:2.5},ht={x:0,z:10.4,yaw:0},x=(e,t,n,r,i)=>({minX:e-n/2,maxX:e+n/2,minZ:t-r/2,maxZ:t+r/2,h:i}),S={desk:.78,seated:1.3,board:3.45,couch:.95,coffeeTable:.5,kitchen:2,cooler:1.5,bookshelf:2.2,cabinet:2.1,reception:1.13,glass:2.8,coffeeCorner:1.55},gt=[`west`,`east`],_t=e=>e===`west`?-1:1,vt=4.2,yt=e=>Math.max(0,e)*vt,bt=.3,xt=.4,St={w:4.4,h:1.8,y:1.95},Ct={half:.9,h:2.5},wt={office:{west:{door:-4.2,windows:[-8.5,0,8]},east:{door:3.55,windows:[-8,-2]}},lobby:{west:{door:4.5,windows:[0,8.5]},east:{door:2.6,windows:[-1]}}},Tt={across:2,along:1.5},C={depth:2.5,minZ:-11.2,maxZ:11.2,rail:1.05,railT:.1,slab:.25},Et=16.3,Dt=Et+C.depth,Ot=vt-C.slab,kt=gt.flatMap(e=>[-8,-2.7,2.7,8].map(t=>({side:e,x:_t(e)*(Et+C.depth/2),y:Ot-.08,z:t}))),At=(e,t,n)=>e===`west`?{minX:-n,maxX:-t}:{minX:t,maxX:n};function jt(e,t){let n=wt[e][t].door;return{...At(t,16,16.4),minZ:n-Ct.half,maxZ:n+Ct.half}}function Mt(e){let{minZ:t,maxZ:n,railT:r}=C;return[{...At(e,Dt-r,Dt),minZ:t,maxZ:n,h:Ot},{...At(e,16.2,Dt),minZ:t,maxZ:t+r,h:Ot},{...At(e,16.2,Dt),minZ:n-r,maxZ:n,h:Ot}]}var Nt={w:.55,l:1.8,h:.55},Pt={w:.6,l:1.8,h:.85};function Ft(e,t){let n=wt[e][t].door,r=At(t,Dt-C.railT-Nt.w,Dt-C.railT),i=C.maxZ-1.3,a=n-3.6*Math.sign(n||1);return{planters:[-i,i].map(e=>({...r,minZ:e-Nt.l/2,maxZ:e+Nt.l/2,h:Nt.h})),bench:{...At(t,Et,Et+Pt.w),minZ:a-Pt.l/2,maxZ:a+Pt.l/2,h:Pt.h}}}function It(e){return gt.flatMap(t=>{let{planters:n,bench:r}=Ft(e,t);return[...Mt(t),...n,r]})}var Lt=e=>Math.abs(e)<=16.15?null:e<0?`west`:`east`,Rt=(e,t)=>Math.abs(e)<=16&&Math.abs(t)<=12||Math.abs(e)<=Dt&&t>=C.minZ&&t<=C.maxZ;function zt(e,t,n,r){let i=Vt();if(t>i.minX&&t<i.maxX&&r>i.minZ-.05)return!0;let a=Math.abs(t),o=wt[e][t<0?`west`:`east`].door;return a>15.95&&a<16.45&&Math.abs(r-o)<Ct.half+.05||a>16.45&&n>C.rail+.05}function Bt(e=`office`){let t=xt,{doorHalf:n,cabinHalf:r,depth:i}=mt,a=t=>{let n=jt(e,t);return[{minX:n.minX,maxX:n.maxX,minZ:-12,maxZ:n.minZ},{minX:n.minX,maxX:n.maxX,minZ:n.maxZ,maxZ:12}]};return[{minX:-16.4,maxX:16.4,minZ:-12.4,maxZ:-12},...a(`west`),...a(`east`),{minX:-16,maxX:-n,minZ:12,maxZ:12.4},{minX:n,maxX:16,minZ:12,maxZ:12.4},{minX:-r-t,maxX:-r,minZ:12,maxZ:12+i},{minX:r,maxX:r+t,minZ:12,maxZ:12+i},{minX:-r,maxX:r,minZ:12+i,maxZ:12+i+t}]}var Vt=()=>({minX:-mt.doorHalf,maxX:mt.doorHalf,minZ:12,maxZ:12.4}),Ht=[-10.5,-3.5,3.5,10.5],Ut=[-6.2,-1.6,3],Wt=Ht.length*Ut.length,Gt={x:14,z:[-5.2,-2,1.2]},Kt=-Math.PI/2,qt=Wt+Gt.z.length,Jt={w:1.9,d:.95,h:.74},Yt=Ut.map(e=>x(0,e+.35,24.4,2.9)),Xt=e=>e%qt>=Wt;function Zt(e){let t=e%qt;if(t>=Wt)return{x:Gt.x,z:Gt.z[t-Wt]};let n=Ut.length-1-Math.floor(t/Ht.length);return{x:Ht[t%Ht.length],z:Ut[n]}}var Qt=e=>Xt(e)?Kt:0,$t={w:12,h:3,y:.45,z:-11.94},en={x:-13.7,y:2.25,w:3.2,h:1.8,bezel:.09,depth:.12},tn={officeX:-10,lobbyX:-12.9,w:1.3,d:.3,h:1.85},nn=e=>x(e,12-tn.d/2,tn.w,tn.d,tn.h),rn={officeX:-12.6,lobbyX:7,w:1,d:.6,h:1.62},an=e=>x(e,12-rn.d/2,rn.w,rn.d,rn.h),w={x:-8.85,z:-11.3,w:2.3,d:.9,h:2.35,r:.72,y:1.3},on=()=>({minX:w.x-w.w/2,maxX:w.x+w.w/2,minZ:-12,maxZ:w.z+w.d/2,h:w.h}),sn={x:w.x,z:w.z+w.d/2+.9},cn={x:-6.6,z:8.2,len:2.74,wid:1.525,top:.76,stand:.65},ln=()=>x(cn.x,cn.z,cn.len,cn.wid,cn.top),un={x:-8.4,y:1.95,w:1.5,h:1.3},T={south:0,east:Math.PI/2,north:Math.PI,west:-Math.PI/2},dn={"w-west":{x:-15.98,z:3.6,rotY:T.east,y:2.5,w:2.6,d:.1},"w-south-w":{x:-10.6,z:11.98,rotY:T.north,y:2.55,w:2.5,d:.1},"w-south-e":{x:8.4,z:11.98,rotY:T.north,y:2.45,w:2.6,d:.1},"w-north-e":{x:13.6,z:-11.98,rotY:T.south,y:2.2,w:2.8,d:.1},"w-kitchen":{x:15.98,z:6.9,rotY:T.west,y:2.45,w:2.6,d:.1},"f-ne":{x:15.2,z:-11.2,rotY:T.south,w:.9,d:.9},"f-se":{x:13.3,z:11.25,rotY:T.north,w:.9,d:.9},"f-sw":{x:-14.8,z:9.8,rotY:T.east,w:.9,d:.9},"f-west":{x:-15.25,z:-6,rotY:T.east,w:.9,d:.9},"b-west":{x:-16,z:3.6,rotY:T.east,back:!0,w:2.4,d:1.3},"b-lounge":{x:-10.9,z:6.9,rotY:T.east,w:2.4,d:1.4},"b-south":{x:7.4,z:12,rotY:T.north,back:!0,w:2.4,d:1.3},"r-lounge":{x:cn.x,z:cn.z,rotY:T.south,w:3.6,d:2.6},"r-entry":{x:0,z:8.7,rotY:T.south,w:3.2,d:2}},fn={x:3.4,z:11.7,w:.8,d:.55,h:.6},pn=()=>x(fn.x,fn.z,fn.w,fn.d,fn.h);function mn(){let e=[...Bt(`office`),...It(`office`)];for(let t=0;t<qt;t++){let{x:n,z:r}=Zt(t);Xt(t)?(e.push(x(n,r,Jt.d+.1,Jt.w+.1,S.desk)),e.push(x(n-.8,r,.6,.7,S.seated))):(e.push(x(n,r,Jt.w+.1,Jt.d+.1,S.desk)),e.push(x(n,r+.8,.7,.6,S.seated)))}e.push(x(0,-11.75,$t.w+.4,.5,S.board));let t=en;return e.push(x(t.x,-12+t.depth/2,t.w+t.bezel*2,t.depth,t.y+t.h/2+t.bezel)),e.push(x(-15.1,6.5,1.1,3.2,S.couch)),e.push(x(-13.4,6.5,.9,1.4,S.coffeeTable)),e.push(nn(tn.officeX)),e.push(an(rn.officeX)),e.push(on()),e.push(ln()),e.push(x(15.55,7.4,.9,5,S.kitchen)),e.push(x(15.5,-9.5,.7,.7,S.cooler)),e.push(pn()),e}var hn={minX:-16,maxX:-6.5,minZ:-12,maxZ:-3.5,doorMinX:-11,doorMaxX:-9.2},E={x:-11.2,z:-8.6,w:2.6,d:1.1},gn={x:3,z:-3.5,w:5,d:1.2},_n={minX:6.5,maxX:16,minZ:-12,maxZ:-3.5,doorMinX:8.2,doorMaxX:10},vn={x:12,z:-7.4},yn={x:14.6,seats:[4.7,5.65,6.6,8.5,9.45,10.4]},bn=Math.PI/2,xn={x:14.6,z:7.55,w:.62,d:.9},Sn=x(3,3,14,9),Cn={x:9.8,w:1.5,d:.9},wn=()=>x(Cn.x,12-Cn.d/2,Cn.w,Cn.d,S.coffeeCorner),Tn={x:-4.8,z:-2.2,w:.9,d:.7,h:1.75},En={x:-6,z:11.75,w:2.2,d:.5,h:2.1},D={x:-3.5,r:6.5,off:.14,colW:1.7,gap:.09,top:{y:2.5,h:1},bottom:{y:1.53,h:.82},strip:{y:3.2,w:3.6,h:.3}};function Dn(e){let t=e*(D.colW+D.gap)/D.r;return{x:D.x+D.r*Math.sin(t),z:-12+D.off+D.r*(1-Math.cos(t)),rotY:-t}}function On(){return[-1,1].map(e=>{let t=Dn(e),n=D.colW/2*Math.cos(t.rotY),r=D.colW/2*Math.abs(Math.sin(t.rotY));return{minX:t.x-n,maxX:t.x+n,minZ:-12,maxZ:t.z+r+.08,h:D.strip.y+D.strip.h/2}})}function kn(){let e=[...Bt(`lobby`),...It(`lobby`)],t=hn,n=.12;e.push({minX:t.maxX-n,maxX:t.maxX+n,minZ:t.minZ,maxZ:t.maxZ,h:S.glass}),e.push({minX:t.minX,maxX:t.doorMinX,minZ:t.maxZ-n,maxZ:t.maxZ+n,h:S.glass}),e.push({minX:t.doorMaxX,maxX:t.maxX,minZ:t.maxZ-n,maxZ:t.maxZ+n,h:S.glass});let r=_n;e.push({minX:r.minX-n,maxX:r.minX+n,minZ:r.minZ,maxZ:r.maxZ,h:S.glass}),e.push({minX:r.minX,maxX:r.doorMinX,minZ:r.maxZ-n,maxZ:r.maxZ+n,h:S.glass}),e.push({minX:r.doorMaxX,maxX:r.maxX,minZ:r.maxZ-n,maxZ:r.maxZ+n,h:S.glass}),e.push(x(vn.x,vn.z,Jt.w+.1,Jt.d+.1,S.desk)),e.push(x(vn.x,vn.z+.8,.7,.6,S.seated));for(let t of yn.seats)e.push(x(yn.x,t,.7,.7,S.seated));return e.push(x(xn.x,xn.z,xn.w,xn.d,S.coffeeTable)),e.push(x(E.x,E.z,E.w,E.d,S.desk)),e.push(x(E.x,E.z-1.1,.8,.8,S.seated)),e.push(x(-15.6,-8,.8,5,S.bookshelf)),e.push(nn(tn.lobbyX)),e.push(an(rn.lobbyX)),e.push(x(gn.x,gn.z,gn.w,gn.d,S.reception)),e.push(x(11.5,4,3.2,1,S.couch)),e.push(x(11.5,6.2,1.6,.9,S.coffeeTable)),e.push(x(12,-11.45,4.4,1.1,S.cabinet)),e.push(wn()),e.push(...On()),e.push(x(Tn.x,Tn.z,Tn.w,Tn.d,Tn.h)),e.push(x(En.x,En.z,En.w,En.d,En.h)),e}var An={x:.74,z:-.3},jn=.77;function Mn(e){let t=[{id:`corner-nw`,x:-15.98,y:dt,z:-11.98,rotY:0},{id:`corner-ne`,x:15.98,y:dt,z:-11.98,rotY:-Math.PI/2},{id:`corner-se`,x:15.98,y:dt,z:11.98,rotY:Math.PI},{id:`corner-sw`,x:-15.98,y:dt,z:11.98,rotY:Math.PI/2}],n=[-1,1].map(e=>({id:e<0?`elevator-w`:`elevator-e`,x:e*(mt.doorHalf+.95),y:0,z:11.6,rotY:Math.PI,floor:!0}));if(e===`office`){let e=Array.from({length:qt},(e,t)=>{let{x:n,z:r}=Zt(t);return Xt(t)?{id:`desk-${t}`,x:n-An.z,y:jn,z:r+An.x,rotY:Kt}:{id:`desk-${t}`,x:n+An.x,y:jn,z:r+An.z,rotY:0}}),r=gt.flatMap(e=>[-1,1].map(t=>({id:`balcony-${e[0]}-${t<0?`n`:`s`}`,x:_t(e)*(Dt-.45),y:0,z:t*(C.maxZ-2.6),rotY:-_t(e)*(Math.PI/2),floor:!0})));return[...e,...t,...n,...r]}let r=gn;return[...t,...n,{id:`reception-w`,x:r.x-r.w/2+.55,y:1.13,z:r.z+.2,rotY:0},{id:`reception-e`,x:r.x+r.w/2-.55,y:1.13,z:r.z+.2,rotY:0},{id:`lobby-feature`,x:-12.6,y:0,z:-1.5,rotY:Math.PI/4,floor:!0},{id:`patio`,x:-(16.3+C.depth/2+.1),y:0,z:-1.2,rotY:Math.PI/2,floor:!0},{id:`manager-desk`,x:E.x-.6,y:.8,z:E.z+.25,rotY:0},{id:`cabinet-top`,x:13.5,y:2.1,z:-11.45,rotY:0},{id:`banner`,x:3,y:3.25,z:.5,rotY:0}]}function Nn(e){let t=3.5,n=-11.92,r=11.92,i=-15.92,a=15.92;if(e===`office`)return[{from:[i,n],to:[a,n],y:t},{from:[i,r],to:[a,r],y:t},{from:[i,n],to:[i,r],y:t},{from:[a,n],to:[a,r],y:t}];let o=hn.maxZ+.1;return[{from:[hn.maxX+.2,n],to:[_n.minX-.2,n],y:t},{from:[i,o],to:[i,r],y:t},{from:[i,r],to:[a,r],y:t},{from:[a,o],to:[a,r],y:t}]}var Pn=e=>(Math.max(0,e)+1)*vt,Fn=(e,t)=>e===-1?Pn(t):yt(e),In={x:16.3,z:12.3,t:.3,parapet:.5,h:1.1},Ln={minX:-4.6,maxX:2.2,minZ:12,maxZ:12+mt.depth+.4,h:3.9,front:.3,stairX:-3.4},Rn={minX:2,maxX:15.7,minZ:-6.2,maxZ:8.6},O={xs:[4.4,6.9,9.4,11.9],z:-2.4,w:.72,l:1.3,h:.95},zn=e=>({x:O.xs[e],z:O.z+.05}),Bn=e=>({x:O.xs[e],z:O.z-O.l/2-.55}),Vn=[5.65,10.65].map(e=>({x:e,z:O.z-.1,r:.3})),Hn=[2.3,8.8,15.3].flatMap(e=>[{x:e,z:-5.9},{x:e,z:8.3}]),Un={r:.07,h:2.9},k={x:13.6,z:6.4,r:.42,h:.95,shelf:.72},Wn={x:7.4,z:5.4,w:2.2,d:1.9,h:.75},Gn={x:12.8,z:-8.8,r:.45,eye:1.5},Kn={x:-13.2,z:-9.2,r:1.35,legs:2.2,h:2.4},qn=[x(-7.4,-11.4,6,1.1,.6),x(-.6,-11.4,5.4,1.1,.6),x(5.6,-11.4,4.6,1.1,.6)],Jn=[{x:1.3,z:-6.8},{x:15.1,z:9.8}].map(e=>({...e,w:1.1,h:.6})),Yn={x:-8.4,z:1.2,r:4.6},Xn={x:-15.2,z:7.8,h:3.4};function Zn(){let{x:e,z:t,t:n,h:r}=In,{doorHalf:i,cabinHalf:a,depth:o}=mt,s=Ln;return[{minX:-e,maxX:e,minZ:-t,maxZ:-t+n,h:r},{minX:-e,maxX:-e+n,minZ:-t,maxZ:t,h:r},{minX:e-n,maxX:e,minZ:-t,maxZ:t,h:r},{minX:-e,maxX:s.minX,minZ:t-n,maxZ:t,h:r},{minX:s.maxX,maxX:e,minZ:t-n,maxZ:t,h:r},{minX:s.minX,maxX:-i,minZ:12,maxZ:12+s.front,h:s.h},{minX:i,maxX:s.maxX,minZ:12,maxZ:12+s.front,h:s.h},{minX:-a-xt,maxX:-a,minZ:12,maxZ:12+o},{minX:a,maxX:a+xt,minZ:12,maxZ:12+o},{minX:-a,maxX:a,minZ:12+o,maxZ:12+o+xt},x(Kn.x,Kn.z,2.7,2.7,Kn.legs+Kn.h),...qn,...Jn.map(e=>x(e.x,e.z,e.w,e.w,e.h)),...O.xs.map(e=>x(e,O.z,O.w,O.l,O.h)),...Vn.map(e=>x(e.x,e.z,e.r*2,e.r*2,.55)),...Hn.map(e=>x(e.x,e.z,Un.r*4,Un.r*4,Un.h)),{minX:k.x-k.r-.05,maxX:k.x+k.shelf+.32,minZ:k.z-k.r-.05,maxZ:k.z+k.r+.4,h:k.h},x(Wn.x,Wn.z,Wn.w,Wn.d,Wn.h),x(Gn.x,Gn.z,Gn.r*2,Gn.r*2,Gn.eye),x(Xn.x,Xn.z,.2,.2,Xn.h)]}var Qn=Yt,$n=[Sn,hn,_n];function er(e,t,n){if(n>12&&Math.abs(t)<=mt.cabinHalf)return`cabin`;if(e===`roof`)return t>=Rn.minX&&t<=Rn.maxX&&n>=Rn.minZ&&n<=Rn.maxZ?`wood`:`lobby`;if(Math.abs(t)>16)return`lobby`;for(let r of e===`lobby`?$n:Qn)if(t>=r.minX&&t<=r.maxX&&n>=r.minZ&&n<=r.maxZ)return`rug`;return e===`lobby`?`lobby`:`wood`}function tr(e,t,n,r=pt){for(let i=0;i<2;i++)for(let i of n){let n=i.minX-r,a=i.maxX+r,o=i.minZ-r,s=i.maxZ+r;if(e<=n||e>=a||t<=o||t>=s)continue;let c=[n-e,a-e,o-t,s-t],l=c.map(Math.abs),u=l.indexOf(Math.min(...l));u<2?e+=c[u]:t+=c[u]}return{x:e,z:t}}var nr=1.5;function rr(e,t){return Math.hypot(e.x-t.x,e.y-t.y,e.z-t.z)}function ir(e){return nr/(nr+2*(Math.max(e,nr)-nr))}var ar=e=>e<=16;function or(e,t,n,r){let i=t.y*n.z-t.z*n.y,a=t.z*n.x-t.x*n.z,o=t.x*n.y-t.y*n.x,s=r.x-e.x,c=r.y-e.y,l=r.z-e.z,u=Math.hypot(s,c,l)*Math.hypot(i,a,o);return u<1e-6?0:Math.max(-1,Math.min(1,(i*s+a*c+o*l)/u))}function sr(e,t,n=24){if(e.length<n)return-1;let r=-1;for(let t=0;t<e.length;t++)(r<0||e[t].loud<e[r].loud)&&(r=t);return r<0||t<=e[r].loud?-2:r}var cr=(e,t,n,r=0)=>t>=e.minX-r&&t<=e.maxX+r&&n>=e.minZ-r&&n<=e.maxZ+r,lr=(e,t)=>t>12.2&&Math.abs(e)<mt.cabinHalf+.3,ur=e=>Math.abs(e)>16+bt/2,dr={minX:12.6,maxX:16,minZ:4.5,maxZ:12};function fr(e,t,n){return lr(t,n)?`cabin`:ur(t)||e===`roof`?`outside`:e===`lobby`?cr(hn,t,n)||cr(_n,t,n)?`office`:`lobby`:cr(dr,t,n)?`kitchen`:`office`}function pr(e,t,n){return lr(t,n)?`cabin`:e===`roof`?`floor`:ur(t)?t<0?`west`:`east`:e===`lobby`&&cr(hn,t,n)?`manager`:e===`lobby`&&cr(_n,t,n)?`ceo`:`floor`}var mr={lobby:{length:2,rt60:1.4,predelay:.022,brightness:.8,early:[[.031,1.6],[.047,1.2],[.083,1]],echo:[.19,4],wet:.3},office:{length:.8,rt60:.5,predelay:.01,brightness:.3,early:[[.012,1.2],[.021,.9],[.034,.6]],wet:.13},kitchen:{length:1,rt60:.75,predelay:.004,brightness:.95,early:[[.005,2],[.009,1.6],[.013,1.3],[.019,1]],wet:.24},cabin:{length:.35,rt60:.2,predelay:.002,brightness:.6,early:[[.003,2.4],[.0047,2],[.0068,1.7],[.0091,1.4],[.012,1.1]],wet:.3},outside:{length:.75,rt60:.12,predelay:.004,brightness:.7,early:[[.006,.8]],echo:[.41,2.2],wet:.12}};function hr(e,t,n,r=2){let i=Math.max(1,Math.round(e.length*t)),a=[];for(let o=0;o<r;o++){let r=new Float32Array(i),s=Math.round(e.predelay*t),c=0;for(let a=s;a<i;a++){let i=(a-s)/t,o=Math.min(1,i/e.rt60),l=(.15+.85*e.brightness)*(1-o)+(.03+.4*e.brightness)*o;c+=l*(n()*2-1-c),r[a]=c*Math.exp(-6.91*i/e.rt60)}let l=(e,a,s,c)=>{let l=Math.round((e+o%2*6e-4)*t),u=Math.max(1,Math.round(s/1e3*t)),d=0;for(let e=0;e<u&&l+e<i;e++)d+=c*(n()*2-1-d),r[l+e]+=a*d*Math.exp(-5*e/u)/Math.sqrt(c)};for(let[t,n]of e.early)l(t,n*.35,2.5,.6+.4*e.brightness);e.echo&&l(e.echo[0],e.echo[1]*.35,30,.25);let u=0;for(let e of r)u+=e*e;let d=u>0?1/Math.sqrt(u):0;for(let e=0;e<i;e++)r[e]*=d;a.push(r)}return a}var gr={steps:1,typing:.8,babble:.7,toys:1,alerts:.5,music:.6,voice:0,outside:0,score:.35},_r=.8,vr=()=>({room:null,pending:null,since:0,fadeUntil:0});function yr(e,t,n){return e.room===null?(e.room=t,e.pending=null,t):t===e.room?(e.pending=null,null):(e.pending!==t&&(e.pending=t,e.since=n),n-e.since<.25||n<e.fadeUntil?null:(e.room=t,e.pending=null,e.fadeUntil=n+_r,t))}var br={gain:.6,cutoff:2400},xr={gain:.35,cutoff:700},Sr={gain:.8,cutoff:3600};function Cr(e,t){if(e===`floor`)return null;if(e===`west`||e===`east`){let n=Math.min(1,Math.max(0,t[e]));return{gain:xr.gain+(Sr.gain-xr.gain)*n,cutoff:xr.cutoff*(Sr.cutoff/xr.cutoff)**n}}return br}function wr(e,t,n,r){if(e===t)return null;let i=Cr(e,r),a=Cr(t,r);return{gain:(i?.gain??1)*(a?.gain??1),cutoff:Math.min(i?.cutoff??1/0,a?.cutoff??1/0)*(i&&a?.6:1)*(1-.4*Math.min(1,Math.max(0,n)/16))}}var Tr=[`steps`,`typing`,`babble`,`toys`,`alerts`,`music`,`voice`,`outside`,`score`],Er=[`off`,`quiet`,`lively`],Dr={volume:70,muted:!1,soundtrack:!0,chatter:`quiet`,silentBubbles:!1,steps:100,typing:100,babble:100,toys:100,alerts:100,music:100,voice:100,outside:100,score:30};function Or(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>=0&&e<=100?Math.round(e):t}function kr(e){let t=e&&typeof e==`object`&&!Array.isArray(e)?e:{},n={...Dr,volume:Or(t.volume,Dr.volume),muted:t.muted===!0,soundtrack:t.soundtrack!==!1,chatter:Er.includes(t.chatter)?t.chatter:Dr.chatter,silentBubbles:t.silentBubbles===!0};for(let e of Tr)n[e]=Or(t[e],Dr[e]);return n}function Ar(e){try{return kr(JSON.parse(e??`null`))}catch{return{...Dr}}}var jr=e=>(e/100)**2,Mr=`cubefarm:audio`;function Nr(){try{return Ar(localStorage.getItem(Mr))}catch{return Ar(null)}}var Pr=Nr(),Fr=new Set,A=null,Ir=null,j=null,Lr=null,Rr=null,zr=null,Br=!1,Vr={},Hr={};for(let e of Tr)Hr[e]=jr(Pr[e]);var Ur=10**(-2.81/20),Wr=10**(-8/20),Gr=10**(-15/20),Kr=!1,qr=!1,Jr=()=>Pr.muted?0:jr(Pr.volume);function Yr(){if(!Br)return null;try{if(!A){let e=window.AudioContext??window.webkitAudioContext;if(!e)return null;A=new e,Ir=A.createGain(),Ir.gain.value=Jr();let t=A.createDynamicsCompressor();t.threshold.value=-12,t.knee.value=12,t.ratio.value=4,t.attack.value=.005,t.release.value=.25;let n=A.createGain();n.gain.value=Ur,Ir.connect(t).connect(n).connect(A.destination),Rr=n,j=A.createGain(),j.connect(Ir),Lr=A.createGain();for(let e of Tr){let t=A.createGain();if(t.gain.value=Hr[e],t.connect(e===`voice`?Ir:j),Vr[e]=t,gr[e]>0){let n=A.createGain();n.gain.value=gr[e],t.connect(n).connect(Lr)}}ci()}return A.state===`suspended`&&A.resume().catch(()=>void 0),A.state===`running`&&Ir?{ctx:A,out:Ir}:null}catch{return null}}function Xr(){if(Yr(),!A||!Rr)return null;try{return zr||(zr=A.createMediaStreamDestination(),Rr.connect(zr)),zr.stream}catch{return null}}function Zr(){Br=!0,Yr()}for(let e of[`pointerdown`,`keydown`])window.addEventListener(e,Zr,{once:!0,capture:!0});var Qr=()=>Br,$r=()=>Pr;function ei(e){return Fr.add(e),()=>void Fr.delete(e)}function ti(e,t){if(A)try{e.gain.cancelScheduledValues(A.currentTime),e.gain.setTargetAtTime(t,A.currentTime,.015)}catch{}}function ni(e,t){Hr[e]=Math.max(0,Math.min(1,Number.isFinite(t)?t:1));let n=Vr[e];n&&ti(n,Hr[e]*(e===`voice`&&qr?Gr:1))}function ri(e){let t={...Pr,...e};for(let e of[`volume`,...Tr])t[e]=Math.max(0,Math.min(100,Number(t[e])));Pr=kr(t);try{localStorage.setItem(Mr,JSON.stringify(Pr))}catch{}Ir&&ti(Ir,Jr());for(let e of Tr)ni(e,jr(Pr[e]));for(let e of Fr)e()}var ii=()=>ri({muted:!Pr.muted});function ai(e){Kr=e,oi()}function oi(){if(!A||!j)return;let e=Kr||qr;try{j.gain.cancelScheduledValues(A.currentTime),j.gain.setTargetAtTime(e?Wr:1,A.currentTime,e?.06:.25)}catch{}ni(`voice`,Hr.voice)}function si(e){qr!==e&&(qr=e,oi(),!e&&na&&!ra&&(ra=setTimeout(ca,ea)))}var M={x:0,y:1.65,z:10},N={x:0,y:0,z:-1},P={x:0,y:1,z:0};function ci(){let e=A?.listener;if(e)try{e.positionX?(e.positionX.value=M.x,e.positionY.value=M.y,e.positionZ.value=M.z,e.forwardX.value=N.x,e.forwardY.value=N.y,e.forwardZ.value=N.z,e.upX.value=P.x,e.upY.value=P.y,e.upZ.value=P.z):(e.setPosition(M.x,M.y,M.z),e.setOrientation(N.x,N.y,N.z,P.x,P.y,P.z))}catch{}}function li(e,t,n,r,i,a,o,s,c){M.x=e,M.y=t,M.z=n,N.x=r,N.y=i,N.z=a,P.x=o,P.y=s,P.z=c,A?.state===`running`&&ci()}var ui=()=>M,di={fwd:N,up:P},fi=()=>di,pi=50,mi=[];typeof window<`u`&&(window.__swarmSfx=mi);var hi=null;function gi(e){hi=e}function _i(e,{group:t,pos:n,pan:r=0,peak:i,played:a,falloff:o},s=mi){let c=n?rr(M,n):0,l=n?o?o(c):ar(c)?ir(c):0:1,u={name:e,group:t??null,at:n?{x:n.x,y:n.y,z:n.z}:null,gain:i*l*(t?Hr[t]:1),pan:n?or(M,N,P,n):r,played:a??!1,t:performance.now()};return s.push(u),s.length>pi&&s.splice(0,s.length-pi),s===mi&&hi?.(u,l>0&&a!==!1),u}function vi(e){let t=Yr();return t?e&&Vr[e]||j||t.out:null}function yi(){return Yr()&&Lr&&j?{input:Lr,output:j}:null}var bi=null;function xi(e){bi=e}var Si=(e,t=rr(M,e))=>bi?.(e,t)??null;function Ci(e,t){let n=e.createPanner();return n.panningModel=`equalpower`,n.distanceModel=`inverse`,n.refDistance=nr,n.rolloffFactor=2,n.maxDistance=16,Di(n,t.x,t.y,t.z),n}var wi=null;function Ti(e){wi=e}function Ei(e,t,n,r){e.group===`alerts`&&wi?.(t,n,r)}function Di(e,t,n,r){e.positionX?(e.positionX.value=t,e.positionY.value=n,e.positionZ.value=r):e.setPosition(t,n,r)}var Oi=[];function ki(e,{name:t,group:n,pos:r,pan:i,into:a},o){let s=a??_i(t??e,{group:n,pos:r,pan:i,peak:o}),c=r?rr(M,r):0;if(r&&!ar(c))return null;let l=r?Si(r,c):null,u=l?.gain??1;l&&!s.occluded&&(s.occluded=!0,s.gain*=u);let d=o*u*(r?ir(c):1),f=Yr();if(!f)return null;let p=f.ctx.currentTime;for(let e=Oi.length-1;e>=0;e--)Oi[e].end<=p&&Oi.splice(e,1);let m=sr(Oi,d);if(m===-2)return null;if(m!==-1){let e=Oi[m];Oi.splice(m,1);try{e.env.gain.cancelScheduledValues(p),e.env.gain.setTargetAtTime(0,p,.01),e.src.stop(p+.06)}catch{}}let h=n&&Vr[n]||j||f.out;try{if(r){let e=Ci(f.ctx,r);if(e.connect(h),h=e,l){let e=f.ctx.createBiquadFilter();e.type=`lowpass`,e.frequency.value=l.cutoff,e.Q.value=.5,e.connect(h),h=e}}else if(i&&f.ctx.createStereoPanner){let e=f.ctx.createStereoPanner();e.pan.value=i,e.connect(h),h=e}}catch{return null}return s.played=!0,{a:f,dest:h,loud:d,scale:u}}function F(e){let{freq:t,to:n,type:r=`sine`,at:i=0,dur:a,peak:o,attack:s=.015}=e,c=ki(`tone`,e,o);if(!c)return;let l=c.a;try{let u=l.ctx.currentTime+i,d=l.ctx.createOscillator(),f=l.ctx.createGain();d.type=r,d.frequency.setValueAtTime(t,u),n&&d.frequency.exponentialRampToValueAtTime(n,u+a),f.gain.setValueAtTime(1e-4,u),f.gain.exponentialRampToValueAtTime(o*c.scale,u+s),f.gain.exponentialRampToValueAtTime(1e-4,u+a),d.connect(f).connect(c.dest),d.start(u),d.stop(u+a+.05),Oi.push({end:u+a+.05,loud:c.loud,env:f,src:d}),Ei(e,l.ctx,u,u+a)}catch{}}var Ai=null;function I(e){let{at:t=0,dur:n,peak:r,filter:i=`lowpass`,freq:a,to:o,q:s=1,attack:c=.005}=e,l=ki(`noise`,e,r);if(!l)return;let u=l.a;try{if(!Ai||Ai.sampleRate!==u.ctx.sampleRate){Ai=u.ctx.createBuffer(1,u.ctx.sampleRate*2,u.ctx.sampleRate);let e=Ai.getChannelData(0);for(let t=0;t<e.length;t++)e[t]=Math.random()*2-1}let d=u.ctx.currentTime+t,f=u.ctx.createBufferSource();f.buffer=Ai;let p=u.ctx.createBiquadFilter();p.type=i,p.Q.value=s,p.frequency.setValueAtTime(a,d),o&&p.frequency.exponentialRampToValueAtTime(o,d+n);let m=u.ctx.createGain();m.gain.setValueAtTime(1e-4,d),m.gain.exponentialRampToValueAtTime(r*l.scale,d+c),m.gain.exponentialRampToValueAtTime(1e-4,d+n),f.connect(p).connect(m).connect(l.dest),f.start(d,Math.random()),f.stop(d+n+.05),Oi.push({end:d+n+.05,loud:l.loud,env:m,src:f}),Ei(e,u.ctx,d,d+n)}catch{}}typeof window<`u`&&(window.__swarmSfxPing=(e,t,n)=>F({name:`ping`,group:`alerts`,pos:{x:e,y:t,z:n},freq:880,type:`triangle`,dur:.3,peak:.12}));var ji=-1/0;function Mi(e){(e?[659.25,987.77]:[783.99,587.33]).forEach((t,n)=>F({name:e?`mic:open`:`mic:close`,group:`alerts`,freq:t,type:`sine`,at:n*.12,dur:.22,peak:.07,attack:.015}))}function Ni(){performance.now()-ji<800||(ji=performance.now(),[1046.5,1568].forEach((e,t)=>F({name:`chirp`,group:`alerts`,freq:e,type:`triangle`,at:t*.11,dur:.18,peak:.12})))}function Pi(e){let t={name:`roomba:chirp`,group:`toys`,pos:e};F({...t,freq:660,to:1320,type:`square`,dur:.12,peak:.035}),F({...t,freq:1320,to:990,type:`triangle`,at:.12,dur:.1,peak:.08}),F({...t,freq:1760,type:`triangle`,at:.24,dur:.18,peak:.07})}function Fi(e){[880,1318.5].forEach((t,n)=>F({name:`ding`,group:`alerts`,pos:e,freq:t,at:n*.16,dur:1.1,peak:.18,attack:.02}))}function Ii(e=.75){I({name:`whoosh`,group:`alerts`,dur:e,peak:.1,filter:`bandpass`,freq:220,to:900,q:.8,attack:e*.45}),F({name:`whoosh`,group:`alerts`,freq:70,to:55,dur:e,peak:.05,attack:e*.4})}function Li(e,t){let n=t?`door:open`:`door:close`;I({name:n,group:`alerts`,pos:e,dur:.45,peak:.07,filter:`bandpass`,freq:t?300:1100,to:t?1300:280,q:.9,attack:.15}),t||F({name:n,group:`alerts`,pos:e,at:.4,freq:110,to:70,dur:.12,peak:.05,attack:.005})}function Ri(e){F({name:`boop`,group:`toys`,pos:e,freq:520,to:330,dur:.16,peak:.13,attack:.008}),F({name:`boop`,group:`toys`,pos:e,freq:1040,to:660,type:`triangle`,dur:.07,peak:.025,attack:.004})}function zi(e){let t={name:`roomba:slurp`,group:`toys`,pos:e};I({...t,dur:.28,peak:.07,filter:`bandpass`,freq:350,to:2400,q:2.2,attack:.05}),F({...t,freq:220,to:660,type:`triangle`,dur:.24,peak:.035,attack:.03}),I({...t,at:.24,dur:.05,peak:.05,filter:`bandpass`,freq:1800,q:1.5,attack:.002})}function Bi(){I({dur:.3,peak:.14,filter:`bandpass`,freq:5200,to:2600,q:.8,attack:.03,group:`toys`}),I({at:.18,dur:.9,peak:.05,filter:`bandpass`,freq:900,to:1500,q:.5,attack:.2,group:`toys`}),[784,988,1318.5].forEach((e,t)=>F({freq:e,type:`triangle`,at:.2+t*.08,dur:.3,peak:.06,group:`toys`}))}var Vi=-1/0,Hi=92,Ui=[[1.52,.09,5],[2.03,.08,4.6],[2.74,.065,4],[3.43,.05,3.4],[4.18,.04,2.9],[5.4,.028,2.3],[6.79,.02,1.9]];function Wi(e=1){if(qr||performance.now()-Vi<1e3)return;Vi=performance.now();let t={name:`gong`,group:`alerts`},n=Math.max(0,Math.min(1,e));F({...t,freq:150,to:62,dur:.35,peak:.12*n,attack:.004}),I({...t,dur:.14,peak:.07*n,filter:`lowpass`,freq:900,to:180,attack:.003}),F({...t,freq:Hi,type:`triangle`,dur:6.5,peak:.2*n,attack:.02}),F({...t,freq:Hi*1.008,dur:6,peak:.08*n,attack:.04});for(let[e,r,i]of Ui)F({...t,freq:Hi*e,dur:i,peak:r*n,attack:.015});F({...t,freq:Hi*8.9,type:`triangle`,at:.05,dur:4,peak:.016*n,attack:.9}),F({...t,freq:Hi*11.7,at:.05,dur:3.5,peak:.012*n,attack:1.1}),I({...t,at:.05,dur:4.5,peak:.028*n,filter:`bandpass`,freq:1800,to:3200,q:1.5,attack:1.2})}var Gi=-1/0,Ki=3e4;function qi(){if(performance.now()-Gi<Ki)return;Gi=performance.now();let e={name:`alarm`,group:`alerts`,type:`triangle`,dur:.7,peak:.1,attack:.03};for(let t of[0,1.1])F({...e,freq:659.3,at:t}),F({...e,freq:523.3,at:t+.38,dur:.9})}function Ji(e){let t={name:`fridge:open`,group:`toys`,pos:e};I({...t,dur:.12,peak:.06,filter:`lowpass`,freq:700,to:2200,attack:.01}),F({...t,freq:170,to:330,dur:.07,peak:.05,attack:.004}),F({...t,freq:3100,type:`triangle`,at:.13,dur:.05,peak:.012,attack:.002}),F({...t,freq:3500,type:`triangle`,at:.19,dur:.05,peak:.009,attack:.002})}function Yi(e){let t={name:`fridge:close`,group:`toys`,pos:e};F({...t,freq:95,to:58,dur:.16,peak:.08,attack:.004}),I({...t,dur:.1,peak:.05,filter:`lowpass`,freq:420,attack:.003}),F({...t,freq:2600,type:`triangle`,at:.05,dur:.04,peak:.008,attack:.002})}function Xi(e){for(let t of[0,.17,.34])F({name:`fridge:beep`,group:`toys`,pos:e,freq:2093,type:`triangle`,at:t,dur:.09,peak:.035,attack:.005})}var Zi=.012;function Qi(e){let t=Yr(),n=vi(`toys`);if(!t||!n)return null;try{let r=t.ctx,i=r.createGain();i.gain.value=0;let a=Ci(r,e);i.connect(a);let o=r.createOscillator();o.type=`sawtooth`,o.frequency.value=50;let s=r.createBiquadFilter();s.type=`lowpass`,s.frequency.value=240,s.Q.value=.8,o.connect(s).connect(i);let c=r.createOscillator();c.frequency.value=100;let l=r.createGain();l.gain.value=.4,c.connect(l).connect(i),o.start(),c.start();let u=!1,d=0;return _i(`fridge:hum`,{group:`toys`,pos:e,peak:Zi,played:!0}),{level(e){Math.abs(e-d)<.02||(d=e,e>0&&!u&&(a.connect(n),u=!0),i.gain.setTargetAtTime(Zi*e,r.currentTime,.25))},stop(){let e=r.currentTime;i.gain.cancelScheduledValues(e),i.gain.setTargetAtTime(0,e,.05),o.stop(e+.3),c.stop(e+.3),o.onended=()=>{try{a.disconnect(),i.disconnect()}catch{}}}}}catch{return null}}var $i={error:{rank:5,play:()=>[0,.2].forEach(e=>F({name:`cue:error`,group:`alerts`,freq:110,type:`sawtooth`,at:e,dur:.16,peak:.035,attack:.02}))},qaFailed:{rank:4,play:()=>{F({name:`cue:qaFailed`,group:`alerts`,freq:392,to:370,type:`triangle`,dur:.26,peak:.12}),F({name:`cue:qaFailed`,group:`alerts`,freq:311,to:196,type:`triangle`,at:.26,dur:.55,peak:.12})}},ready:{rank:3,play:()=>[784,988,1175,1568].forEach((e,t)=>F({name:`cue:ready`,group:`alerts`,freq:e,type:`triangle`,at:t*.07,dur:.28,peak:.09}))},merged:{rank:2,play:()=>{I({name:`cue:merged`,group:`alerts`,dur:.07,peak:.16,filter:`bandpass`,freq:1400,q:1.2,attack:.002}),F({name:`cue:merged`,group:`alerts`,freq:523,to:1046,type:`square`,at:.04,dur:.12,peak:.04}),[1046.5,1318.5,1568].forEach(e=>F({name:`cue:merged`,group:`alerts`,freq:e,type:`triangle`,at:.14,dur:.5,peak:.05})),I({name:`cue:merged`,group:`alerts`,at:.12,dur:.6,peak:.03,filter:`bandpass`,freq:2500,q:.6,attack:.08})}},welcome:{rank:1,play:()=>[659,784,1046.5].forEach((e,t)=>F({name:`cue:welcome`,group:`alerts`,freq:e,type:`sine`,at:t*.12,dur:t===2?.5:.2,peak:.12}))}},ea=150,ta=1e3,na=null,ra=null,ia=0,aa=-1/0,oa=(e,t)=>e&&$i[e].rank>=$i[t].rank?e:t;function sa(e){let t=performance.now();if(qr){na=oa(na,e);return}t-aa<ta&&$i[e].rank<=ia&&!na||(na=oa(na,e),!ra&&(ra=setTimeout(ca,Math.max(ea,aa+ta-t))))}function ca(){if(ra=null,qr)return;let e=na;na=null,e&&(aa=performance.now(),ia=$i[e].rank,$i[e].play())}var la=12e4;function ua(e,t,n){return t.provider===`off`||e.from!==`ceo`&&!(e.from===`office`&&t.speakOffice)?!1:n-e.at<=la}function da(e,t,n){return e.from===`ceo`?t?`clip`:e.voice===`browser`?n?`browser`:null:e.voice===`elevenlabs`?`gone`:null:null}function fa(e,t,n=3){if(e.some(e=>e.message.id===t.message.id))return[...e];let r=[...e,t];return r.slice(Math.max(0,r.length-n))}function pa(e,t){let n=e.filter(e=>t-e.arrived<=12e4&&t-e.message.at<=12e4);return{next:n[0]??null,rest:n.slice(1)}}function ma(e,t){let n=Math.min(...e.map(e=>e.at)),r=null;for(let i of e)i.at>=n+t||(!r||i.visible&&!r.visible||i.visible===r.visible&&i.tab<r.tab)&&(r=i);return r?.tab??null}var ha=50,ga=`${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`,_a=new Map,va=typeof document<`u`&&typeof BroadcastChannel<`u`?new BroadcastChannel(`cubefarm:voice`):null;function ya(e){let t=_a.get(e);return t||(t=[],_a.set(e,t),_a.size>ha&&_a.delete(_a.keys().next().value)),t}va?.addEventListener(`message`,e=>{let t=e.data;typeof t?.id==`number`&&typeof t.tab==`string`&&typeof t.at==`number`&&ya(t.id).push({tab:t.tab,visible:t.visible===!0,at:t.at})});function ba(e){let t={tab:ga,visible:document.visibilityState===`visible`,at:Date.now()};return ya(e).push(t),va?.postMessage({id:e,...t}),va?250:0}var xa=e=>ma(ya(e),250)===ga;function Sa(e,t){let n=new Set(e?.filter(e=>e.state===`OPEN`).map(e=>e.number));return t.filter(e=>e.state===`MERGED`&&n.has(e.number))}var Ca=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``);function wa(e,t,n,r){let i=r.filter(t=>t.repoId===e&&t.role!==`ceo`);if(n?.devAgentId&&i.some(e=>e.id===n.devAgentId))return n.devAgentId;let a=/^swarm\/issue-\d+-(.+)$/i.exec(t.headRefName);if(!a)return null;let o=Ca(a[1]);return i.find(e=>Ca(e.name)===o)?.id??null}function Ta(e,t,n,r,i){return e?Sa(t?.pulls,n.pulls).map(e=>({repoId:n.id,prNumber:e.number,agentId:wa(n.id,e,r(e.number),i)})):[]}var Ea=e=>e.hidden||e.covered?null:e.reducedMotion?`glow`:`confetti`,Da=e=>Ea(e)===`confetti`,Oa=new Map,ka=30;function Aa(e,t){Oa.delete(e),Oa.set(e,t),Oa.size>ka&&Oa.delete(Oa.keys().next().value)}var ja=e=>Oa.get(e),Ma=new Set;function Na(e){return Ma.add(e),()=>void Ma.delete(e)}function Pa(e){for(let t of Ma)t(e)}var Fa=`Visitor`,Ia=[`#ef476f`,`#f78c6b`,`#ffd166`,`#06d6a0`,`#118ab2`,`#8338ec`,`#ff70a6`,`#3a86ff`],La=[`wave`,`thumbs`,`clap`,`point`,`laugh`],Ra={wave:`👋`,thumbs:`👍`,clap:`👏`,point:`👉`,laugh:`😂`},za={wave:`Wave`,thumbs:`Thumbs up`,clap:`Clap`,point:`Point`,laugh:`Laugh`};function Ba(e,t){if(typeof e!=`string`)return``;let n=e.slice(0,t*8).normalize(`NFC`).replace(/[\p{Cc}\p{Cf}\p{Co}\p{Cs}\p{Zl}\p{Zp}]/gu,` `).replace(/(\p{M}{2})\p{M}+/gu,`$1`).replace(/\s+/g,` `).trim();return Array.from(n).slice(0,t).join(``).trim()}var Va=(e,t=Fa)=>Ba(e,24)||t,Ha=(e,t=Ia[0])=>typeof e==`string`&&/^#[0-9a-f]{6}$/i.test(e)?e.toLowerCase():t;function Ua(e){let t=e%(Math.PI*2);return t>Math.PI?t-Math.PI*2:t<=-Math.PI?t+Math.PI*2:t}var Wa=12e5;function Ga(e,t){let n=(e,n)=>b(t,e,n);switch(e.state){case`none`:return n(`Up to date`);case`available`:return e.behind>0?n(e.behind===1?`{count} update ready`:`{count} updates ready`,{count:e.behind}):n(`An update is ready`);case`waiting`:case`draining`:return e.running>0?n(e.running===1?`Waiting for {count} session to finish`:`Waiting for {count} sessions to finish`,{count:e.running}):n(`Updating shortly…`);case`updating`:return n(`Updating…`);case`failed`:return n(`Last update failed: {detail}`,{detail:e.detail||n(`unknown error`)})}}function Ka(e,t){return e?e.state===`updating`?b(t,`⟳ Updating the office…`):e.state!==`waiting`&&e.state!==`draining`?null:e.running>0?b(t,e.running===1?`⟳ Updating the office after {count} session finishes`:`⟳ Updating the office after {count} sessions finish`,{count:e.running}):b(t,`⟳ Updating the office shortly`):null}var qa=e=>e.state===`draining`&&e.drainingSince?e.drainingSince+Wa:null,Ja=e=>e.launcher&&e.behind>0&&(e.state===`available`||e.state===`waiting`||e.state===`failed`),Ya=e=>e.launcher&&(e.state===`available`||e.state===`waiting`||e.state===`draining`),Xa=e=>e?.state===`draining`||e?.state===`updating`;function Za(e,t,n){return!!e&&!!t&&e!==t&&n!==t}function Qa(e){let t=e.overlay,n=t?.kind===`terminal`?[t.agentId]:t?.kind===`manager`?[`ceo`]:[];return{floor:e.floor,agents:n,workers:e.workersOpen}}var $a=e=>({items:Array(e),next:0,total:0});function eo(e,t){e.items[e.next]=t,e.next=(e.next+1)%e.items.length,e.total++}function to(e){let t=[],n=e.items.length;for(let r=0;r<n;r++){let i=e.items[(e.next+r)%n];i!==void 0&&t.push(i)}return t}function no(e){e.items.fill(void 0),e.next=0,e.total=0}var ro=(e,t)=>!t&&Number.isFinite(e)&&e>=100;function io(e){if(e.kind!==`frame`)return e.detail;if(e.programs>0)return`shader compile (${e.programs} program${e.programs>1?`s`:``})`;let t=t=>e.notes.findLast(e=>e.kind===t),n=t(`gfx`);if(n)return`graphics tier change (${n.detail})`;let r=t(`dpr`);if(r)return`resolution change (${r.detail})`;let i=t(`chunk`);if(i)return`chunk loaded (${i.detail})`;let a=e.ws.reduce((e,t)=>!e||t.ms>e.ms?t:e,null);if(a&&(a.ms>=30||a.bytes>=65536))return`websocket ${a.type} (${Math.round(a.bytes/1024)} KB, ${Math.round(a.ms)} ms to apply)`;let o=t(`floor`);if(o)return`floor change (${o.detail})`;if(e.textures>0||e.uploads>12)return`texture uploads (${e.uploads} uploads, ${e.textures} new)`;if(e.scripts.length)return`script: ${e.scripts[0]}`;let s=e.notes.findLast(e=>e.kind===`focus`||e.kind===`visibility`||e.kind===`lock`);return s?`${s.kind} (${s.detail})`:`main thread busy (unknown)`}var ao=(e,t,n)=>e.filter(e=>e.at<=t&&e.at>=t-Math.max(n,0)-1e3),oo=e=>e.replace(/\s*\(.*$/,``);function so(e){let t={frames:0,worst:null,paused:0,input:0,stuck:0,causes:[]},n=new Map;for(let r of e){if(r.kind!==`frame`){t[r.kind]++;continue}t.frames++,(!t.worst||r.ms>t.worst.ms)&&(t.worst=r);let e=oo(r.cause);n.set(e,(n.get(e)??0)+1)}return t.causes=[...n.entries()].sort((e,t)=>t[1]-e[1]),t}function co(e){return e.frames?`${e.frames} hitch${e.frames>1?`es`:``} · worst ${Math.round(e.worst.ms)} ms (${oo(e.worst.cause)})`:`no hitches`}var lo=()=>({ms:0,reported:!1});function uo(e,t,n,r){return!t||n?(e.ms=0,e.reported=!1,!1):(e.ms+=r,e.reported||e.ms<400?!1:(e.reported=!0,!0))}var fo=$a(50),po=$a(64),mo=$a(30);function ho(e,t){let n={at:performance.now(),kind:e,detail:t};eo(po,n),(e===`dpr`||e===`gfx`)&&eo(mo,n)}var go=64,_o=new Float64Array(go),vo=new Float64Array(go),yo=new Float64Array(go),bo=Array(go).fill(``),xo=0;function So(e,t,n){_o[xo]=performance.now(),vo[xo]=t,yo[xo]=n,bo[xo]=e,xo=(xo+1)%go}function Co(e,t){let n=[];for(let r=0;r<go;r++)bo[r]&&_o[r]>e&&_o[r]<=t&&n.push({type:bo[r],bytes:vo[r],ms:Math.round(yo[r]*10)/10});return n.sort((e,t)=>t.ms-e.ms).slice(0,8)}var wo={compiles:0,uploads:0},To=null;function Eo(e){if(To===e)return;To=e;let t=e,n=(e,n)=>{let r=t[e];typeof r==`function`&&(t[e]=function(){return wo[n]++,r.apply(this,arguments)})};n(`linkProgram`,`compiles`);for(let e of[`texImage2D`,`texSubImage2D`,`texImage3D`,`texSubImage3D`,`compressedTexImage2D`,`compressedTexSubImage2D`])n(e,`uploads`)}var L=null,Do=e=>void(L=e),Oo=$a(16),ko=e=>e.split(/[?#]/)[0].split(`/`).pop()||e;function Ao(e,t){for(let n of to(Oo))if(n.end>=e&&n.start<=t&&n.scripts.length)return n.scripts;return[]}function jo(e,t,n,r,i={programs:0,textures:0,uploads:0}){let a=performance.now(),o=Q.getState(),s={kind:e,at:Math.round(a),wall:new Date().toISOString(),ms:Math.round(t),cause:``,detail:n,floor:o.floor,camera:L?.camera()??`none`,overlay:o.overlay?.kind??null,dpr:L?.dpr()??0,gfx:L?.gfx()??``,...i,ws:e===`frame`?Co(r,a):[],notes:ao(to(po),a,a-r),events:L?.events()??[],scripts:e===`frame`?Ao(r,a):[]};return s.cause=io(s),eo(fo,s),s}function Mo(e,t,n){jo(e,t,n,performance.now())}var R={last:0,resumed:!0,compiles:0,uploads:0,textures:0};function No(){let e=performance.now(),t=L?.textures()??0,n=e-R.last;R.last&&ro(n,R.resumed)&&jo(`frame`,n,``,R.last,{programs:wo.compiles-R.compiles,textures:Math.max(0,t-R.textures),uploads:wo.uploads-R.uploads}),R.last=e,R.resumed=!1,R.compiles=wo.compiles,R.uploads=wo.uploads,R.textures=t}var Po=()=>void(R.resumed=!0),Fo=null;function Io(e){R.resumed=!0,Fo&&=(Fo.h.ms=Math.round(performance.now()-Fo.from),null),e&&(Fo={h:jo(`paused`,0,e,performance.now()),from:performance.now()})}var Lo=!1;function Ro(){if(Lo||typeof window>`u`)return;Lo=!0,window.addEventListener(`blur`,()=>setTimeout(()=>ho(`focus`,`window lost focus${document.activeElement&&document.activeElement!==document.body?` to ${document.activeElement.tagName.toLowerCase()}`:``}`),0)),window.addEventListener(`focus`,()=>ho(`focus`,`window focused`)),document.addEventListener(`visibilitychange`,()=>{Po(),ho(`visibility`,document.hidden?`tab hidden`:`tab shown`)}),document.addEventListener(`pointerlockchange`,()=>ho(`lock`,document.pointerLockElement?`mouse grabbed`:`mouse let go`)),Q.subscribe((e,t)=>{e.overlay?.kind!==t.overlay?.kind&&ho(`overlay`,e.overlay?`${e.overlay.kind} opened`:`${t.overlay?.kind} closed`),e.floor!==t.floor&&ho(`floor`,`to floor ${e.floor}`),!!e.travel!=!!t.travel&&ho(`travel`,e.travel?`elevator to ${e.travel.to}`:`elevator arrived`)});let e=typeof PerformanceObserver<`u`?PerformanceObserver.supportedEntryTypes??[]:[];e.includes(`resource`)&&new PerformanceObserver(e=>{for(let t of e.getEntries())/\.(m?js|wasm)(\?|$)/.test(t.name)&&eo(po,{at:t.responseEnd||t.startTime,kind:`chunk`,detail:`${ko(t.name)}, ${Math.max(0,Math.round(t.duration))} ms`})}).observe({type:`resource`}),e.includes(`long-animation-frame`)&&new PerformanceObserver(e=>{for(let t of e.getEntries()){if(t.duration<100)continue;let e=(t.scripts??[]).slice().sort((e,t)=>t.duration-e.duration).slice(0,3).map(e=>`${e.sourceFunctionName||e.invoker||`script`} @ ${ko(e.sourceURL??``)} (${Math.round(e.duration)} ms)`),n={start:t.startTime,end:t.startTime+t.duration,scripts:e};eo(Oo,n);for(let t of to(fo))t.kind!==`frame`||t.scripts.length||!e.length||t.at<n.start||t.at-t.ms>n.end||(t.scripts=e,t.cause=io(t))}}).observe({type:`long-animation-frame`})}var zo=()=>to(fo),Bo=-1,Vo=so([]);function Ho(){return Bo!==fo.total&&(Bo=fo.total,Vo=so(to(fo))),Vo}function Uo(){try{let e=To,t=e?.getExtension(`WEBGL_debug_renderer_info`);return e&&t?String(e.getParameter(t.UNMASKED_RENDERER_WEBGL)):null}catch{return null}}function Wo(){let e=Q.getState(),t=window.__swarmGfx,n=Ho(),r={at:new Date().toISOString(),upMinutes:Math.round(performance.now()/600)/100,browser:navigator.userAgent,gpu:Uo(),screen:{width:screen.width,height:screen.height,devicePixelRatio:window.devicePixelRatio,window:`${innerWidth}x${innerHeight}`},office:{floors:e.repos.length,people:Object.keys(e.agents).length,floor:e.floor,overlay:e.overlay?.kind??null},view:L?{camera:L.camera(),dpr:L.dpr(),gfx:L.gfx(),events:L.events()}:null,graphics:t?{preset:t.preset,tier:t.tier,shown:t.shown,fps:t.fps,decisions:t.decisions}:null,gpuWork:{programsLinked:wo.compiles,textureUploads:wo.uploads},changes:to(mo).map(e=>({...e,at:Math.round(e.at)})),hitches:{frames:n.frames,worstMs:n.worst?.ms??null,worstCause:n.worst?.cause??null,causes:n.causes,paused:n.paused,input:n.input,stuck:n.stuck,total:fo.total},list:to(fo).map(e=>({...e,notes:e.notes.map(e=>({...e,at:Math.round(e.at)}))}))};return JSON.stringify(r,null,2)}typeof window<`u`&&(window.__swarmHitches={get list(){return zo()},get count(){return Ho().frames},get worst(){return Ho().worst},get summary(){return Ho()},get notes(){return to(po)},get gl(){return{...wo}},report:Wo,clear(){no(fo),Bo=-1}});var Go=0,Ko=null,qo=``;function Jo(){let e=JSON.stringify({type:`lines`,...Qa(Q.getState())});Ko?.readyState===WebSocket.OPEN&&e!==qo&&(qo=e,Ko.send(e))}var Yo=!1,Xo=!1,Zo=new Set([`notify`,`notifyChannels`,`settings`,`officeUpdate`,`clis`,`voiceKey`,`voiceCache`,`progress`,`visitors`,`visitorPose`,`visitorEmote`,`visitorPing`]),Qo=0,$o={in:0,out:0,presence:0};function es(e){if(Ko?.readyState!==WebSocket.OPEN)return!1;let t=JSON.stringify(e);return Ko.send(t),$o.out+=t.length,!0}var ts=()=>Qo;function ns(){Xo=!0,Ko?.readyState===WebSocket.OPEN&&Ko.send(JSON.stringify({type:`resync`}))}var rs=`office-swarm:reloaded-for`;function is(){try{return sessionStorage.getItem(rs)}catch{return null}}function as(e){if(!Za(Q.getState().officeCommit,e,is()))return!1;try{sessionStorage.setItem(rs,e)}catch{return!1}return location.reload(),!0}function os(){Yo||(Yo=!0,Q.subscribe(Jo));let e=location.protocol===`https:`?`wss`:`ws`,t=new WebSocket(`${e}://${location.host}/ws`);Ko=t,t.onopen=()=>{Go=0,qo=``,Qo++,Q.getState().setConnected(!0),Jo()},t.onmessage=e=>{let t=typeof e.data==`string`?e.data.length:0;$o.in+=t;let n=performance.now(),r=`other`;try{let t=JSON.parse(e.data);if(r=t.type,t.type.startsWith(`visitor`)&&($o.presence+=e.data.length),t.type===`snapshot`&&t.data.officeCommit&&as(t.data.officeCommit))return;if(!Zo.has(t.type)){if(Q.getState().replaying)return;if(Xo){if(t.type!==`snapshot`)return;Xo=!1}}Q.getState().apply(t)}catch(e){console.error(`bad server event`,e)}So(r,t,performance.now()-n)},t.onclose=()=>{let e=Q.getState();e.setConnected(!1);let t=e.restarting||Xa(e.officeUpdate);t!==e.restarting&&e.setRestarting(t),setTimeout(os,Math.min(t?2e3:8e3,500*2**Go++))}}var ss=30,cs=600;function ls(e,t,n=100){let r=e[e.length-1];r&&t.t<=r.t&&(t.t=r.t+1),r&&t.t-r.t>cs&&e.push({...r,t:t.t-n}),e.push(t),e.length>ss&&e.splice(0,e.length-ss)}var us=400,ds=()=>({offsets:[],late:0,gap:100,lastSent:null}),fs=(e,t)=>t>e?t:e+(t-e)*.05;function ps(e,t,n){let r=n-t;for(e.offsets.push({at:n,v:r});e.offsets.length>1&&n-e.offsets[0].at>3e3;)e.offsets.shift();let i=1/0;for(let t of e.offsets)i=Math.min(i,t.v);return e.late=fs(e.late,r-i),e.lastSent!==null&&t-e.lastSent<cs&&(e.gap=fs(e.gap,t-e.lastSent)),e.lastSent=t,t+i}var ms=e=>Math.min(us,Math.max(100,e.gap+e.late+20));function hs(e,t){let n=0;for(;n+1<e.length&&e[n+1].t<=t;)n++;n>0&&e.splice(0,n)}function gs(e,t,n){let r=e.length;if(!r)return null;let i=e[0],a=i;if(t>=e[r-1].t)i=a=e[r-1];else if(t>i.t){for(let n=1;n<r;n++)if(e[n].t>=t){i=e[n-1],a=e[n];break}}let o=a.t>i.t?Math.min(1,Math.max(0,(t-i.t)/(a.t-i.t))):1;return n.t=t,n.x=i.x+(a.x-i.x)*o,n.z=i.z+(a.z-i.z)*o,n.h=Ua(i.h+Ua(a.h-i.h)*o),n.p=i.p+(a.p-i.p)*o,n}var _s=e=>e?`${e.k}:${e.id}:${e.s??``}`:``;function vs(e,t){return e.f!==t.f||Math.abs(e.x-t.x)>.01||Math.abs(e.z-t.z)>.01||Math.abs(Ua(e.h-t.h))>.01||Math.abs(e.p-t.p)>.02||_s(e.held)!==_s(t.held)}function ys(e,t,n,r=100){return!e||n-e.at>=r&&vs(e.pose,t)}var bs=class{hits=[];add(e,t){this.hits.push({t,n:e}),this.trim(t)}perSecond(e){return this.trim(e),this.hits.reduce((e,t)=>e+t.n,0)/2}trim(e){let t=0;for(;t<this.hits.length&&e-this.hits[t].t>=2e3;)t++;t&&this.hits.splice(0,t)}},xs=La;function Ss(e,t,n=28){if(Math.hypot(e,t)<n)return null;let r=Math.atan2(e,-t),i=Math.PI*2/xs.length;return xs[(Math.round(r/i)%xs.length+xs.length)%xs.length]}function Cs(e,t){let n=e*Math.PI*2/xs.length;return{x:Math.sin(n)*t,y:-Math.cos(n)*t}}var ws={wave:`wave`,thumbs:`thumbs`,clap:`clap`,point:`reach`,laugh:`nod`},Ts=2400;function Es(e,t=()=>void 0){if(!e)return``;let n=e.action;switch(n.kind){case`kanban`:case`card`:return`the whiteboard`;case`terminal`:{let e=n.agentId?t(n.agentId):void 0;return e?`${e}'s desk`:`this desk`}case`hire`:return`an empty desk`;case`app`:return`the app monitor`;case`elevator`:return`the elevator`;case`manager`:return`the manager's desk`;case`coffee`:return`the coffee machine`;case`jukebox`:return`the jukebox`;case`phone`:return e.id===`ceo-visit`?`the CEO`:e.id.startsWith(`candidate-`)?`a candidate`:`this`;case`pickup`:{let e=n.toyId??``;return e.startsWith(`blaster`)?`a blaster`:e.includes(`mug`)?`a mug`:e===`basketball`?`the basketball`:e.endsWith(`ball`)?`the ${e.replace(/-ball$/,``)} ball`:`this`}case`poke`:return n.toyId===`gong`?`the gong`:n.toyId===`roomba`?`the roomba`:`this`;default:return`this`}}var Ds=[`#f1c27d`,`#e0ac69`,`#c68642`,`#8d5524`,`#ffdbac`,`#d9a066`],Os=[`#2b2118`,`#4a3123`,`#a0522d`,`#e2b866`,`#1f1d2b`,`#b55239`,`#d8d8d8`];function ks(e){let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619)>>>0;return t}function As(e){let t=ks(e);return{look:t%2?`feminine`:`masculine`,skin:Ds[(t>>>3)%Ds.length],hair:Os[(t>>>7)%Os.length]}}var js=`cubefarm:profile`;function Ms(){let e={};try{e=JSON.parse(localStorage.getItem(js)??`null`)??{}}catch{}let t=Ha(e.color,Ia[Math.floor(Math.random()*Ia.length)]),n={name:Va(e.name),color:t,appear:e.appear!==!1};return e.color!==t&&Ns(n),n}function Ns(e){try{localStorage.setItem(js,JSON.stringify(e))}catch{}}var Ps=e((e,t)=>({...Ms(),set:n=>{let r={...n};n.name!==void 0&&(r.name=Va(n.name,Fa)),n.color!==void 0&&(r.color=Ha(n.color,t().color)),e(r);let{name:i,color:a,appear:o}=t();Ns({name:i,color:a,appear:o})}})),Fs={x:0,z:12.9},Is={x:ht.x,z:ht.z},Ls=2.2,Rs=1200,zs=5e3,z=new Map,Bs=[],Vs=``,Hs=NaN,Us=[],Ws=[],Gs=0,Ks=null,qs=null,Js=0,Ys=new Set,B={posesIn:new bs,posesOut:new bs,bytesIn:new bs,bytesOut:new bs,presenceIn:new bs,seen:{in:0,out:0,presence:0}};function Xs(){Us=Zs(),Js++;for(let e of Ys)e()}function Zs(){let e=Bs.filter(e=>z.get(e)?.floor===Hs).slice(0,16),t=[...z.values()].filter(t=>t.leaving&&!e.includes(t.id)).map(e=>e.id);return[...e,...t]}function Qs(e){return Ys.add(e),()=>void Ys.delete(e)}var $s=()=>Js,ec=()=>Us,tc=e=>z.get(e),nc=()=>Ws,rc=()=>qs;function ic(e,t){cc(t),Vs=e.you;let n=performance.now(),r=new Set;for(let t of e.visitors){r.add(t.id);let e=z.get(t.id);if(!e){z.set(t.id,{...t,samples:[],clock:ds(),held:null,emote:null,leaving:null,arriving:null});continue}e.name=t.name,e.color=t.color,e.floor!==t.floor&&(e.floor===Hs?dc(e,n):t.floor===Hs&&(e.leaving=null,e.arriving=`pending`),e.samples=[],e.floor=t.floor)}for(let e of z.keys())r.has(e)||z.delete(e);Bs=e.visitors.map(e=>e.id),Xs()}function ac(e,t){cc(t);let n=z.get(e.id);if(!n||e.f!==Hs)return;let r=performance.now();B.posesIn.add(1,r);let i=!1;n.floor!==e.f&&(n.floor=e.f,n.samples=[],i=!0),n.leaving&&(n.leaving=null,i=!0),n.arriving===`pending`&&(n.arriving={at:r}),ls(n.samples,{t:ps(n.clock,e.ts,r),x:e.x,z:e.z,h:e.h,p:e.p}),_s(n.held)!==_s(e.held)&&(n.held=e.held,i=!0),i&&Xs()}function oc(e){let t=z.get(e.id);t&&(t.emote={e:e.e,at:performance.now()},Ks={id:t.id,name:t.name,e:e.e,at:Date.now()})}function sc(e){let t=z.get(e.id);lc({name:t?.name??`Someone`,color:t?.color??`#ffd166`,x:e.x,y:e.y,z:e.z,label:e.label,mine:!1})}function cc(e){if(e!==Hs){Hs=e;for(let e of z.values())e.samples=[],e.leaving=null,e.arriving=null;Ws=[],Xs()}}function lc(e){Ws=[...Ws.slice(-7),{...e,key:++Gs,at:performance.now()}],Xs()}var uc={t:0,x:0,z:0,h:0,p:0};function dc(e,t){let n=gs(e.samples,t-ms(e.clock),uc);e.leaving=n?{x:n.x,z:n.z,h:n.h,at:t}:null}function fc(e,t,n){let r=e.z>Is.z-.3?[e,Fs]:[e,Is,Fs],i=(t-e.at)/1e3*Ls;for(let t=1;t<r.length;t++){let a=r[t-1],o=r[t],s=Math.hypot(o.x-a.x,o.z-a.z);if(i<=s||t===r.length-1){let t=s>0?Math.min(1,i/s):1;return i>s+.4?null:(n.x=a.x+(o.x-a.x)*t,n.z=a.z+(o.z-a.z)*t,n.h=s>.01?Math.atan2(-(o.x-a.x),-(o.z-a.z)):e.h,n.p=0,n)}i-=s}return null}function pc(e,t,n){if(e.leaving)return fc(e.leaving,t,n);let r=t-ms(e.clock),i=gs(e.samples,r,uc);if(!i)return null;hs(e.samples,r),n.x=i.x,n.z=i.z,n.h=i.h,n.p=i.p;let a=e.arriving;if(a&&a!==`pending`){let r=(t-a.at)/Rs;if(r>=1)e.arriving=null;else{let e=r*r*(3-2*r),t=Fs.x+(i.x-Fs.x)*e,a=Fs.z+(i.z-Fs.z)*e;r<.8&&(n.h=Math.atan2(-(i.x-Fs.x),-(i.z-Fs.z))),n.x=t,n.z=a}}return n}function mc(e){let t=!1;for(let n of z.values())n.leaving&&e-n.leaving.at>9e3&&(n.leaving=null),n.leaving&&!fc(n.leaving,e,{x:0,z:0,h:0,p:0})&&(n.leaving=null,t=!0),n.emote&&e-n.emote.at>2400&&(n.emote=null);Ws.length&&e-Ws[0].at>zs&&(Ws=Ws.filter(t=>e-t.at<=zs),t=!0),t&&Xs(),B.bytesIn.add($o.in-B.seen.in,e),B.bytesOut.add($o.out-B.seen.out,e),B.presenceIn.add($o.presence-B.seen.presence,e),B.seen={...$o}}var V={socket:0,hello:``,mode:``,watching:NaN,floor:NaN,floorAt:0,last:null},hc=e=>es(e);function gc(e,t){if(V.socket!==ts()&&(V.socket=ts(),V.hello=``,V.mode=``,V.last=null),!e.started){(V.mode===`pose`||V.mode===`watch`)&&hc({type:`away`})&&(V.mode=`away`);return}let{name:n,color:r,appear:i}=Ps.getState(),a=`${n}\n${r}`;if(a!==V.hello&&hc({type:`hello`,name:n,color:r})&&(V.hello=a),e.floor!==V.floor&&(V.floor=e.floor,V.floorAt=t),!i){(V.mode!==`watch`||V.watching!==e.floor)&&hc({type:`watch`,f:e.floor})&&(V.mode=`watch`,V.watching=e.floor,V.last=null);return}t-V.floorAt<150||!e.pose||(V.mode!==`pose`&&(V.last=null),ys(V.last,e.pose,t)&&hc({type:`pose`,...e.pose})&&(V.mode=`pose`,V.last={pose:e.pose,at:t},B.posesOut.add(1,t)))}function _c(e){qs={e,at:performance.now()},Ks={id:Vs||`me`,name:Ps.getState().name,e,at:Date.now()},Ps.getState().appear&&hc({type:`emote`,e}),Xs()}function vc(e,t,n,r){let{name:i,color:a,appear:o}=Ps.getState();lc({name:i,color:a,x:e,y:t,z:n,label:r,mine:!0}),o&&hc({type:`ping`,x:e,y:t,z:n,label:r})}var yc=null;function bc(e){yc=e}var xc=e=>yc?.start(e)??!1,Sc=()=>yc?.stop(),Cc=()=>yc?.current()??null,wc=e=>Math.round(e*100)/100;typeof window<`u`&&(window.__swarmPresence={me:()=>({id:Vs,...Ps.getState(),set:void 0,mode:V.mode||`away`,floor:Hs}),roster:()=>Bs.map(e=>z.get(e)).filter(Boolean).map(e=>({id:e.id,name:e.name,color:e.color,floor:e.floor})),visible:()=>{let e=performance.now(),t={x:0,z:0,h:0,p:0};return Us.map(n=>{let r=z.get(n),i=pc(r,e,t);return{id:n,name:r.name,x:i?wc(i.x):null,z:i?wc(i.z):null,heading:i?wc(i.h):null,held:r.held,emote:r.emote?Ra[r.emote.e]:null,leaving:!!r.leaving,arriving:!!r.arriving}})},rates:()=>{let e=performance.now();return{posesInPerSec:B.posesIn.perSecond(e),posesOutPerSec:B.posesOut.perSecond(e),presenceBytesInPerSec:B.presenceIn.perSecond(e),bytesInPerSec:B.bytesIn.perSecond(e),bytesOutPerSec:B.bytesOut.perSecond(e)}},lastEmote:()=>Ks,pings:()=>Ws.map(e=>({name:e.name,label:e.label,x:e.x,y:e.y,z:e.z,mine:e.mine})),appear:e=>Ps.getState().set({appear:e}),fakes:e=>hc({type:`fakes`,n:e}),emote:e=>_c(e),ping:(e,t,n,r=``)=>vc(e,t,n,r),follow:e=>xc(e),unfollow:()=>Sc(),following:()=>Cc()});var Tc=1500,Ec=6e3,Dc=()=>({here:null,hitAt:-1/0,hits:0,celebrateRepo:null,celebrateUntil:-1/0});function Oc(e,t,{repoId:n=e.here,celebrate:r=!1}={}){return!n||n!==e.here?`absent`:(r&&(e.celebrateRepo=n,e.celebrateUntil=t+Ec),t-e.hitAt<1500?`ringing`:(e.hitAt=t,e.hits++,`boom`))}var kc=(e,t,n)=>t===e.celebrateRepo&&n<e.celebrateUntil,Ac={amp:.26,hz:.85,decay:1.5,twistAmp:.07,twistHz:2.3,twistDecay:.9,settle:6},jc=e=>e<0||e>Ac.settle?0:Ac.amp*Math.exp(-e/Ac.decay)*Math.sin(2*Math.PI*Ac.hz*e),Mc=e=>e<0||e>Ac.settle?0:Ac.twistAmp*Math.exp(-e/Ac.twistDecay)*Math.sin(2*Math.PI*Ac.twistHz*e),Nc=e=>e<0||e>Ac.settle?0:Math.min(1,Math.exp(-e/.18)+.25*Math.exp(-e/1.8)*(.5+.5*Math.sin(e*15))),Pc=2.8,Fc=1.9,Ic={take:600,windup:450,strike:300,pose:1600};function Lc(e){return!e.repoId||e.repoId!==e.here?`absent`:e.agentId&&e.present&&!e.covered&&!e.elsewhere?`run`:`solo`}var Rc=(e,t,n=!1)=>!!e&&e!==t&&!n,zc=(e,t)=>t!==e.mine,Bc=(e,t)=>e.run?.agentId===t?e.run:e.home.find(e=>e.agentId===t),Vc=()=>({queue:[],run:null,home:[]}),Hc=(e,t)=>e-t>=Tc;function Uc(e,t,n){let r=e.queue[0];return!r||e.run||!r.agentId&&!Hc(t,n)?null:e.queue.shift()}function Wc(e,t,n){return{agentId:e.agentId,celebrate:e.celebrate,beat:`run`,since:t,started:t,legs:n,leg:0}}var Gc=(e,t)=>e.beat===`run`&&t-e.started>18e3;function Kc(e,t,n){let r=t-e.since;switch(e.beat){case`take`:return r>=Ic.take?`windup`:null;case`windup`:return r>=Ic.windup&&Hc(t,n)?`strike`:null;case`strike`:return r>=Ic.strike?`pose`:null;case`pose`:return r>=Ic.pose?`back`:null;default:return null}}var qc=e=>e===`windup`||e===`strike`||e===`pose`,Jc=e=>e.run!==null||e.home.length>0||e.queue.length>0,Yc=(e,t)=>Math.atan2(-(t.x-e.x),-(t.z-e.z)),H=Dc(),Xc=1;function Zc(e){Xc=e}function Qc(e){H.here=e}var $c=new Set;function el(e){return $c.add(e),()=>void $c.delete(e)}function tl(e={}){let t=Oc(H,performance.now(),e);if(t===`boom`&&Wi(Xc),t!==`absent`&&e.celebrate&&H.celebrateRepo)for(let e of $c)e(H.celebrateRepo);return t}var nl=(e,t)=>kc(H,e,t);typeof window<`u`&&(window.__swarmGong={hit:e=>void tl({celebrate:e?.celebrate===!0}),hits:()=>H.hits});var rl=.6,il=1.1,al=.03,ol=6,sl=4,cl=14;function ll(){return{stage:`seated`,sit:1,x:0,z:0,heading:0,speed:0,phase:0,seatX:0,seatZ:0,seatHeading:0,standX:0,standZ:0,teleport:0}}function ul(e,t){let n=(t-e)%(Math.PI*2);return n>Math.PI?n-Math.PI*2:n<=-Math.PI?n+Math.PI*2:n}var dl=(e,t,n)=>{let r=ul(e,t);return ul(0,e+Math.max(-n,Math.min(n,r)))},fl=e=>e*e*(3-2*e);function pl(e,t){let n=fl(e.sit);e.x=e.standX+(e.seatX-e.standX)*n,e.z=e.standZ+(e.seatZ-e.standZ)*n,e.heading=dl(e.heading,e.seatHeading,ol*t),e.speed=0}function ml(e,t,n,r,i,a){let o=t-e.x,s=n-e.z,c=Math.hypot(o,s);e.heading=dl(e.heading,r,ol*a);let l=Math.min(i,Math.sqrt(28*c));if(e.speed+=Math.max(-14*a,Math.min(cl*a,l-e.speed)),c<1e-4)return;let u=Math.min(c,e.speed*a);e.x+=o/c*u,e.z+=s/c*u}function hl(e,t,n,r,i,a){let o=t-e.x,s=n-e.z,c=Math.hypot(o,s);if(c<al)return e.speed=Math.max(0,e.speed-8*a),e.heading=dl(e.heading,r,ol*.6*a),e.speed===0&&Math.abs(ul(e.heading,r))<.05;let l=Math.atan2(-o,-s);e.heading=dl(e.heading,l,ol*a);let u=Math.max(0,Math.cos(ul(e.heading,l))),d=Math.min(i,c*2.5)*u;e.speed+=Math.max(-8*a,Math.min(sl*a,d-e.speed));let f=Math.min(c,e.speed*a);return e.x+=o/c*f,e.z+=s/c*f,!1}function gl(e,t,n){let r=t!=null&&t.mode!==`seated`;switch(r&&t.teleport!==e.teleport&&(e.teleport=t.teleport,e.stage=`up`,e.sit=0,e.x=t.x,e.z=t.z,e.heading=t.heading,e.speed=0),e.stage){case`seated`:e.x=e.seatX,e.z=e.seatZ,e.heading=e.seatHeading,e.speed=0,r&&(e.stage=`rising`);break;case`rising`:if(!r){e.stage=`sitting`;break}e.sit=Math.max(0,e.sit-n/rl),pl(e,n),e.sit===0&&(e.stage=`up`);break;case`sitting`:if(r){e.stage=`rising`;break}e.sit=Math.min(1,e.sit+n/rl),pl(e,n),e.sit===1&&(e.stage=`seated`,e.heading=e.seatHeading);break;case`up`:r&&t.strafe?ml(e,t.x,t.z,t.heading,t.speed>0?t.speed:il,n):r?hl(e,t.x,t.z,t.heading,t.speed>0?t.speed:il,n):hl(e,e.standX,e.standZ,e.seatHeading,1.1,n)&&(e.stage=`sitting`)}return e.speed>0&&(e.phase=(e.phase+n*yl(e.speed,_l).cadence*Math.PI)%(Math.PI*2)),e}var _l={stride:0,cadence:0,bob:0,lean:0},vl=.8;function yl(e,t){let n=Math.max(0,e),r=Math.min(.95,.32+.2*n);return t.cadence=n>0?n/r:0,t.stride=Math.asin(Math.min(.9,r/(2*vl))),t.bob=.018+.012*Math.min(2,n),t.lean=.04+.05*Math.min(2.5,n),t}var bl=Math.PI*2;function xl(e){let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619);return t>>>0}function Sl(e){let t=Math.imul((e|0)^2654435769,2246822507);return t=Math.imul(t^t>>>13,3266489909),((t^t>>>16)>>>0)/4294967296}var Cl=e=>xl(e)%1e5/1e3;function wl(e,t,n,r,i){return e===`preparing`?`typing`:e===`working`?n?.startsWith(`mcp__playwright`)&&r<4e3?`browsing`:!t&&r>2500?`thinking`:`typing`:e===`error`?`slump`:i?`cheer`:`relaxed`}var Tl=e=>Math.sin(e*.8)+Math.sin(e*2.1)*.6>-.35,El=e=>Tl(e)?1:.15,Dl=e=>e===`preparing`?10:19,Ol={l:0,r:2.4},kl=(e,t,n)=>Math.max(0,Math.sin(e*t+n)),Al=5.3,jl=.93,Ml=e=>Math.sin(e*Al)>jl?.04:0;function Nl(e,t,n,r){let i=(r+(Math.floor((e*t+n-r)/bl)+1)*bl-n)/t;return i<=e&&(i+=bl/t),i}var Pl=(e,t,n)=>Nl(e,t,n,Math.PI),Fl=e=>Nl(e,Al,0,Math.asin(jl)),Il=80;function Ll(e,t){for(let n=Nl(e,Il,0,0);n<=t;n+=bl/Il)if(!Tl(n)&&Math.sin(n*1.7+.5)>.85)return n;return 1/0}function Rl(e,t,n){return n===1&&!Tl(e+bl/t)?`enter`:Sl(Math.round(e*t/bl)*2+n)<.14?`space`:`key`}var zl=(e,t,n)=>Sl(Math.round(e*t/bl)*2+n+7919),Bl={x:0,y:.8,z:.27},Vl={x:.46,y:.8,z:.29};function Hl(e,t,n,r){let i=e===`ceo`,a=i?vn:Zt(t),o=i?0:Qt(t),s=n?Vl:Bl,c=Math.cos(o),l=Math.sin(o);return r.x=a.x+s.x*c+s.z*l,r.y=s.y,r.z=a.z-s.x*l+s.z*c,r}function Ul(e,t,n,r){let i=0;for(let a=0;a<t;a++){let t=e[a];if(i<n)i++;else if(t>=e[r[i-1]])continue;let o=i-1;for(;o>0&&e[r[o-1]]>t;)r[o]=r[o-1],o--;r[o]=a}return i}function Wl(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];if(i===null)continue;let a=!1;for(let e=0;e<n;e++)t[e]===i&&(a=!0);a||(e[r]=null)}for(let r=0;r<n;r++){if(e.includes(t[r]))continue;let n=e.indexOf(null);n>=0&&(e[n]=t[r])}}var Gl=[`neutral`,`focused`,`puzzled`,`stressed`,`proud`,`joyful`,`sleepy`,`surprised`],Kl={closed:0,wide:1,happy:2},ql={frown:0,worry:1,raise:2,quirk:3,droop:4},Jl={frown:0,flat:1,grin:2,open:3,wavy:4,skew:5},Yl=e=>Object.keys(e).length,Xl={eyes:0,brows:Yl(Kl),mouth:Yl(Kl)+Yl(ql)},Zl=Xl.mouth+Yl(Jl);function Ql(e,t,n,r){for(let i in r)e[t+n[i]]=r[i]??0}function $l(e,t,n){let r=Array(Zl).fill(0);return Ql(r,Xl.eyes,Kl,e),Ql(r,Xl.brows,ql,t),Ql(r,Xl.mouth,Jl,n),r}var eu={neutral:$l({},{},{}),focused:$l({closed:.2},{frown:.7},{flat:.85}),puzzled:$l({wide:.15},{quirk:1},{skew:1}),stressed:$l({wide:.35},{worry:1},{wavy:.85,frown:.15}),proud:$l({happy:.6},{raise:.3},{grin:.35}),joyful:$l({happy:1},{raise:.6},{grin:1}),sleepy:$l({closed:.6},{droop:1},{flat:.55,open:.25}),surprised:$l({wide:1},{raise:1},{open:1})},tu=(e,t)=>e>=45||t>=180;function nu(e,t){return t&&(t.status===`needs-human`||t.round>=4&&t.status!==`passed`)?`stressed`:e===`failing`||t?.status===`failed`?`puzzled`:t?.status===`passed`?`proud`:null}function ru(e,t,n){if(e.role===`ceo`||e.task===`qa`||e.prNumber==null)return null;let r=t.find(t=>t.id===e.repoId)?.pulls.find(t=>t.number===e.prNumber);return r&&r.state!==`OPEN`?null:nu(r?.checks??null,n)}function iu(e){return e.hit?`surprised`:e.cheering?`joyful`:e.asleep?`sleepy`:e.status===`error`||e.pr===`stressed`?`stressed`:e.pr===`puzzled`?`puzzled`:e.justMerged||e.pr===`proud`?`proud`:e.drowsy?`sleepy`:e.status===`working`||e.status===`preparing`?`focused`:`neutral`}var au={slot:4,half:.075};function ou(e,t){let n=Math.floor(e/au.slot),r=Sl(n*7919+t),i=n*au.slot+.3+r*(au.slot-.9),a=Math.abs(e-i);return r>.8&&(a=Math.min(a,Math.abs(e-i-.32))),a<au.half?1-a/au.half:0}var su=15,cu=(e=`neutral`)=>({expression:e,w:Float32Array.from(eu[e])});function lu(e,t,n){e.expression=t;let r=1-Math.exp(-Math.max(0,n)*su),i=eu[t];for(let t=0;t<Zl;t++)e.w[t]+=(i[t]-e.w[t])*r;return e}var uu=new Map,U=new Map,du=new Map,fu=new Map,pu=0,mu=null,hu=e=>uu.get(e);function gu(e,t){let n=uu.get(e)??{mode:`walking`,x:0,z:0,heading:0,speed:1.1,gesture:`none`,teleport:0};uu.set(e,{...n,strafe:!1,...t})}function _u(e,t,n,r=0){gu(e,{mode:`standing`,x:t,z:n,heading:r}),uu.set(e,{...uu.get(e),teleport:++pu})}var vu=e=>void uu.delete(e);function yu(e,t,n){let r=performance.now();t?fu.set(e,{text:t,at:r,until:n?r+n*1e3:void 0}):fu.delete(e)}function bu(e){let t=fu.get(e);if(t?.until!==void 0&&performance.now()>=t.until){fu.delete(e);return}return t}function*xu(){for(let[e,t]of U)qu.has(e)||(yield t)}function Su(e,t){return U.set(e,t),()=>{U.get(e)===t&&U.delete(e)}}var Cu=()=>U,wu=e=>U.get(e);function Tu(e,t){t?du.set(e,t):du.delete(e)}var Eu=e=>du.has(e),Du=e=>du.get(e),Ou=new Set;function ku(e){return Ou.add(e),()=>void Ou.delete(e)}function Au(e){for(let t of Ou)t(e);du.delete(e),uu.delete(e)}function ju(e){return mu=e,()=>{mu===e&&(mu=null)}}var Mu=e=>!uu.has(e)&&(U.get(e)?.stage??`seated`)===`seated`,Nu=new Map,Pu=new Map,Fu=new Set,Iu=()=>{for(let e of Fu)e()};function Lu(e){return Fu.add(e),()=>void Fu.delete(e)}var Ru=e=>Nu.get(e)??null;function zu(e,t){t?Nu.set(e,t):Nu.delete(e),Iu()}function Bu(e,t=Date.now()){let n=Pu.get(e);return n&&n.until>t?n:null}function Vu(e,t,n){Pu.set(e,{...t,until:Date.now()+n*1e3}),Iu()}var Hu=new Map,Uu=new Map;function Wu(e,t){return Hu.set(e,t),()=>{Hu.get(e)===t&&Hu.delete(e)}}function Gu(e,t){let n=Uu.get(e);return n&&t>n.until&&Uu.delete(e),n&&t<=n.until?n.expression:null}var Ku=new Map,qu=new Set;function Ju(e,t){(Ku.get(e)??null)!==t&&(t?Ku.set(e,t):Ku.delete(e),Iu())}var Yu=e=>Ku.get(e)??null,Xu=new Map;function Zu(e,t){(t||Xu.has(e))&&(t?Xu.set(e,t):Xu.delete(e),Iu())}var Qu=e=>Xu.get(e)??null,$u=()=>[...Xu.keys()];function ed(e,t){t?qu.add(e):qu.delete(e)}var td=e=>qu.has(e),nd=new Map;function rd(e){let t=nd.get(e);return nd.delete(e),t}var id=e=>Math.round(e*100)/100,ad=e=>e.stage===`seated`?`seated`:e.speed>.05?`walking`:`standing`;typeof window<`u`&&(window.__swarmPeople={place:_u,walkTo(e,t,n,r=il,i){let a=U.get(e);gu(e,{mode:`walking`,x:t,z:n,speed:r,heading:i??(a?Math.atan2(-(t-a.x),-(n-a.z)):0)})},sit:vu,gesture(e,t){gu(e,{gesture:t,...uu.has(e)?{}:{mode:`standing`,...this.where(e)}})},where(e){let t=U.get(e);return t?{x:t.x,z:t.z,heading:t.heading}:{x:0,z:0,heading:0}},list(){return[...U].map(([e,t])=>({id:e,mode:ad(t),stage:t.stage,x:id(t.x),z:id(t.z),heading:id(t.heading),speed:id(t.speed),errand:du.get(e)??null,says:bu(e)?.text??null,target:uu.get(e)??null,mug:Nu.get(e)??null,deskMug:Bu(e),expression:Hu.get(e)?.expression??null,lid:id(Hu.get(e)?.lid??0),look:Hu.get(e)?.look??null,food:Ku.get(e)??null,snack:Xu.get(e)??null,hidden:qu.has(e)}))},express(e,t,n=5){if(!Gl.includes(t))throw Error(`no expression "${t}": try ${Gl.join(`, `)}`);Uu.set(e,{expression:t,until:performance.now()+n*1e3})},send(e,t){nd.set(e,t)},errands(){return mu?.()??null}});var od={queued:`⏳ QA queued`,testing:`🔍 QA testing`,passed:`✅ QA passed`,failed:`❌ QA failed`,fixing:`🔧 being fixed`,"needs-human":`🙋 needs you`},sd=e=>e?od[e.status]:``,cd=(e,t)=>e.length>t?`${e.slice(0,t-1).trimEnd()}…`:e;function ld(e,t,n=32){return[`PR #${e.number}`,cd(e.title.trim(),n),sd(t)].filter(Boolean).join(` · `)}var ud=e=>e.filter(e=>e.state===`OPEN`).sort((e,t)=>e.number-t.number);function dd(e,t){return e!=null&&t.some(t=>t.number===e&&t.state===`OPEN`)?e:null}function fd(e,t){return{status:e?.status??`stopped`,port:e?.port??0,url:e?.url??null,ref:`PR #${t}`,pr:t,commit:e?.commit??null,startedAt:e?.startedAt??null,error:e?.error??null,logTail:e?.logTail??[]}}function pd(e){return e===`running`?`live`:e===`preparing`||e===`installing`||e===`starting`?`busy`:e===`error`?`bad`:`off`}var md=(e,t,n,r)=>`/api/repos/${encodeURIComponent(e)}/pulls/${t}/qa-shots/${n}?v=${r}`;function hd(e){let t=e.trim().replace(/^https?:\/\/[^/]+/i,``);return t.startsWith(`/`)?t:`/${t}`}var gd=(e,t)=>`${e.replace(/\/+$/,``)}${hd(t)}`,_d=e=>/^(localhost|127\.0\.0\.1|\[::1\])$/i.test(e.hostname);function vd(e,t){if(_d(t))return e;let n=e.match(/^https?:\/\/(?:localhost|127\.0\.0\.1|\[::1\]):(\d+)(\/.*)?$/i);return n?`${t.origin}/preview/${n[1]}${n[2]||`/`}`:e}function yd(e,t,n=6){if(e.length<=n)return e;let r=e.slice(-n);return t!=null&&e.includes(t)&&!r.includes(t)&&(r[0]=t),r.sort((e,t)=>e-t)}function bd(e,t,n){let r=Math.min(190,(t-80-16*(e-1))/e),i=(t-(e*r+(e-1)*16))/2;return Array.from({length:e},(e,t)=>({x:i+t*(r+16),y:n-64-18,w:r,h:64}))}var xd=()=>({at:{main:null,pr:null},asked:{main:null,pr:null},relays:[]});function Sd(e,t,n,r){let i=t===`main`?`pr`:`main`;return e.at[t]=n,e.asked[t]===n?(e.asked[t]=null,!1):e.at[i]===n||(e.relays=e.relays.filter(e=>r-e<3e3),e.relays.length>=4)?!1:(e.relays.push(r),e.asked[i]=n,!0)}function Cd(e){let t=e.replace(`#`,``),n=t.length===3?[...t].map(e=>e+e).join(``):t,r=parseInt(n,16);return[r>>16&255,r>>8&255,r&255]}var wd=e=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4};function Td(e){let[t,n,r]=Cd(e).map(wd);return .2126*t+.7152*n+.0722*r}function Ed(e,t){let[n,r]=[Td(e),Td(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}var Dd=(e,t=`#1f1d2b`,n=`#ffffff`)=>Ed(t,e)>=Ed(n,e)?t:n,Od=e=>Math.floor(e/6e4)*6e4,kd=e=>new Date(e).setHours(0,0,0,0),Ad=e=>{let t=e?Date.parse(e):NaN;return Number.isFinite(t)?t:null};function jd(e,t,n,r){let i=e.filter(e=>e.state===`MERGED`&&Ad(e.mergedAt)!==null),a=i.filter(e=>Ad(e.mergedAt)>=r&&Ad(e.mergedAt)<=n),o=[];for(let e of i){let t=Ad(e.mergedAt),r=Ad(e.issueCreatedAt);r===null||t>n||n-t>864e5||r>t||o.push(t-r)}let s=0,c=0;for(let n of e){if(n.state!==`OPEN`)continue;let e=t(n.number);e?.status===`queued`&&s++,Oe(e)&&c++}return{mergedToday:a.length,more:i.length>=8&&a.length===i.length,avgMs:o.length?o.reduce((e,t)=>e+t,0)/o.length:null,queue:s,needsYou:c}}function Md(e){let t=[{text:`🎉 ${e.mergedToday}${e.more?`+`:``} merged today`},{text:`⏱ ${e.avgMs===null?`–`:Ae(e.avgMs)} issue → merge`},{text:`🔍 ${e.queue} in the QA queue`}];return e.needsYou>0&&t.push({text:`⚠️ ${e.needsYou} need${e.needsYou===1?`s`:``} you`,alarm:!0}),t}var Nd=r(n(),1),Pd=typeof Image>`u`?null:new Image,Fd=new Set,Id=!1;Pd&&(Pd.onload=()=>{Id=!0;for(let e of Fd)e()},Pd.src=`/icons/icon.svg`);var Ld=e=>(Fd.add(e),()=>{Fd.delete(e)}),Rd=()=>(0,Nd.useSyncExternalStore)(Ld,()=>Id,()=>!1);function zd(e,t,n,r){Id&&Pd&&e.drawImage(Pd,t,n,r*152/170,r)}var Bd=`"JetBrains Mono", Consolas, "Cascadia Mono", monospace`,W=`Fredoka, "Segoe UI", system-ui, sans-serif`;function G(e,t,n,r,i,a){e.beginPath(),e.roundRect(t,n,r,i,a)}function Vd(e,t,n,r){let i=t.split(/\s+/),a=[],o=``;for(let t of i){let i=o?`${o} ${t}`:t;if(e.measureText(i).width<=n)o=i;else if(o&&a.push(o),o=t,a.length===r)break}if(a.length<r&&o&&a.push(o),a.length===r&&i.join(` `).length>a.join(` `).length){let t=a[r-1];for(;t.length>1&&e.measureText(`${t}…`).width>n;)t=t.slice(0,-1);a[r-1]=`${t}…`}return a}var K={bg:`#1b1b29`,bar:`#2a2a3d`,text:`#e8e8f2`,reply:`#e8e8f2`,tool:`#8be9fd`,result:`#8d8da8`,system:`#bd93f9`,error:`#ff6b6b`,manager:`#ffb86c`,done:`#50fa7b`,thinking:`#f1fa8c`},Hd=[`·`,`✢`,`✳`,`✶`,`✻`,`✽`,`✻`,`✶`,`✳`,`✢`],Ud=[`Crafting`,`Pondering`,`Tinkering`,`Brewing`,`Noodling`,`Scheming`,`Assembling`,`Percolating`];function Wd(e){return e?e.startsWith(`mcp__playwright__`)?`Browsing`:e===`Bash`||e===`PowerShell`?`Running`:e===`Edit`||e===`Write`||e===`MultiEdit`?`Editing`:e===`Read`||e===`Grep`||e===`Glob`?`Reading`:e===`WebFetch`||e===`WebSearch`?`Researching`:e:``}function Gd(e,n,r,i,a,o,s,c,l){e.fillStyle=K.bg,e.fillRect(0,0,n,r),e.fillStyle=K.bar,e.fillRect(0,0,n,30),[`#ff5f57`,`#febc2e`,`#28c840`].forEach((t,n)=>{e.fillStyle=t,e.beginPath(),e.arc(18+n*20,15,6,0,Math.PI*2),e.fill()}),e.fillStyle=`#b8b8cc`,e.font=`600 14px ${Bd}`,e.textBaseline=`middle`;let u=i.status===`idle`?`idle`:i.role===`ceo`?(i.issueTitle??`running the company`).toLowerCase():i.task===`qa`?`testing PR #${i.prNumber}`:i.task===`fix`?`fixing PR #${i.prNumber}`:i.issueNumber?`issue #${i.issueNumber}`:`idle`,d=i.role===`ceo`?`hq`:`swarm`,f=`${i.name.toLowerCase()}@${d} — ${u} — ${l}`;e.fillText(f,84,16);let p=s?Math.round(n*.56):n;if(i.status===`idle`&&a.length<=1){Kd(e,0,30,n,r-30,i,c);return}e.font=`14px ${Bd}`;let m=e.measureText(`M`).width,h=Math.max(10,Math.floor((p-20)/m)),ee=i.status===`working`||i.status===`preparing`?28:8,g=Math.floor((r-30-10-ee)/17),_=[];for(let e=a.length-1;e>=0&&_.length<g;e--){let t=a[e],n=[],r=t.text||` `;for(let e=0;e<r.length;e+=h)n.push(r.slice(e,e+h));for(let e=n.length-1;e>=0&&_.length<g;e--)_.unshift({text:n[e],kind:t.kind})}let v=48.5;for(let t of _)t.kind===`tool`&&t.text.startsWith(`⏺`)?(e.fillStyle=K.done,e.fillText(`⏺`,10,v),e.fillStyle=K.tool,e.fillText(t.text.slice(1),10+m,v)):t.kind===`text`&&t.text.startsWith(`●`)?(e.fillStyle=`#ffffff`,e.fillText(`●`,10,v),e.fillStyle=K.text,e.fillText(t.text.slice(1),10+m,v)):(e.fillStyle=K[t.kind]??K.text,e.fillText(t.text,10,v)),v+=17;if(i.status===`working`||i.status===`preparing`){let n=Math.floor(c/120)%Hd.length,a=i.status===`preparing`?i.currentTool??`Setting up worktree`:Wd(i.currentTool)||Ud[Math.floor(c/6e3)%Ud.length],o=i.startedAt?Math.max(0,Math.floor((t()-i.startedAt)/1e3)):0,s=Math.floor(o/60);e.fillStyle=`#ff9e64`,e.font=`600 14px ${Bd}`,e.fillText(`${Hd[n]} ${a}… (${s}m ${o%60}s)`,10,r-14)}s&&qd(e,p,30,n-p,r-30,i.browserUrl,o)}function Kd(e,t,n,r,i,a,o){let s=o/1e3,c=e.createLinearGradient(t,n,t+r,n+i);c.addColorStop(0,`#26264a`),c.addColorStop(1,`#3b2a55`),e.fillStyle=c,e.fillRect(t,n,r,i);let l=t+r/2+Math.sin(s*.7)*r*.25,u=n+i/2+Math.cos(s*.9)*i*.18;e.textAlign=`center`,e.font=`64px ${W}`,zd(e,l-36,u-90,80),e.fillStyle=`#ffd6a5`,e.font=`600 26px ${W}`,e.fillText(`${a.name} is free`,l,u+34),e.fillStyle=`#b8b8dd`,e.font=`18px ${W}`,e.fillText(a.role===`ceo`?`thinking about the company…`:`waiting for work…`,l,u+62),e.textAlign=`left`}function qd(e,t,n,r,i,a,o){e.fillStyle=`#e9ecf2`,e.fillRect(t,n,r,i),e.fillStyle=`#d5d9e2`,e.fillRect(t,n,r,34),G(e,t+10,n+6,r-20,22,11),e.fillStyle=`#ffffff`,e.fill(),e.fillStyle=`#4a5160`,e.font=`13px ${W}`,e.textBaseline=`middle`;let s=(a??`about:blank`).replace(/^https?:\/\//,``);e.fillText(`🔒 ${s.length>42?`${s.slice(0,41)}…`:s}`,t+20,n+18);let c={x:t+4,y:n+38,w:r-8,h:i-42};if(o&&o.complete&&o.naturalWidth>0){let t=Math.min(c.w/o.naturalWidth,c.h/o.naturalHeight),n=o.naturalWidth*t,r=o.naturalHeight*t;e.drawImage(o,c.x+(c.w-n)/2,c.y,n,r)}else e.fillStyle=`#9aa1b2`,e.textAlign=`center`,e.font=`16px ${W}`,e.fillText(`🌐 loading page…`,c.x+c.w/2,c.y+c.h/2),e.textAlign=`left`}var Jd=[{key:`backlog`,title:`📋 Backlog`,chip:`#ffd166`,note:`#fff3b0`},{key:`progress`,title:`🔨 In progress`,chip:`#4cc9f0`,note:`#cfeefd`},{key:`qa`,title:`🔍 In QA`,chip:`#ff9f68`,note:`#ffe3cf`},{key:`ready`,title:`✅ Ready to merge`,chip:`#80ed99`,note:`#d8f9df`},{key:`merged`,title:`🎉 Merged`,chip:`#c77dff`,note:`#eadcff`}],Yd=Jd.map(e=>e.key);function Xd(e,t){let n=(t-80)/Jd.length;return{x0:40+e*n,colW:n}}var q={top:96,h:104,gap:12,perCol:2},Zd=e=>Math.floor((e-q.top-70)/(q.h+q.gap))*q.perCol;function Qd(e,t,n){let{x0:r,colW:i}=Xd(e,n),a=(i-48)/2;return{x:r+16+t%q.perCol*(a+16),y:q.top+68+Math.floor(t/q.perCol)*(q.h+q.gap),w:a,h:q.h}}var $d=e=>Jd.find(t=>t.key===e)?.note??`#fff3b0`,ef=(e,t,n=v)=>e.tone?_(e.tone,n.palette,`board`):$d(t);function tf(e,t,n,r,i,a){let o=g(i,a.palette);e.save(),e.beginPath(),e.arc(t,n,r,0,Math.PI*2),e.fillStyle=o,e.fill(),e.lineWidth=Math.max(2,r*.16),e.strokeStyle=`#1f1d2b`,e.stroke(),e.fillStyle=Dd(o),e.textAlign=`center`,e.textBaseline=`middle`,e.font=`700 ${Math.round(r*1.25)}px ${W}`,e.fillText(s[i],t,n+r*.08),e.restore()}function nf(e,t,n,r,i,a,o){e.clearRect(t,n,r,i),e.fillStyle=rf(o,-.35),e.fillRect(t,n,r,i),e.fillStyle=o,e.fillRect(t+4,n+4,r-8,i-8),e.fillStyle=`rgba(0,0,0,0.07)`,e.fillRect(t+4,n+4,r-8,i*.14),e.fillStyle=`#2d3142`,e.textAlign=`center`,e.textBaseline=`middle`,e.font=`700 ${Math.round(i*.42)}px ${W}`,e.fillText(a,t+r/2,n+i*.56,r-16),e.textAlign=`left`}function rf(e,t){let n=parseInt(e.slice(1),16),r=e=>Math.round(t<0?e*(1+t):e+(255-e)*t);return`rgb(${r(n>>16)},${r(n>>8&255)},${r(n&255)})`}function af(e,n,r,i,a,o={}){e.fillStyle=`#fbfbf8`,e.fillRect(0,0,n,r),e.fillStyle=`rgba(120,140,170,0.05)`;for(let t=0;t<6;t++)e.fillRect(t*431%n,t*97%r,260,40);e.textBaseline=`middle`;let s=o.stats?of(e,n-40,48,o.stats):n-40;e.font=`500 26px ${W}`;let c=i.lastSync?`synced ${new Date(i.lastSync).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}`:`syncing…`,l=`${i.autoAssign?`⚡ auto-assign on · `:``}${c}`,u=e.measureText(l).width;e.font=`700 46px ${W}`;let d=Math.min(e.measureText(i.fullName).width,s-40-40);e.fillStyle=`#2d3142`,e.fillText(_f(e,i.fullName,d),40,48),40+d+28+u<=s-28&&(e.font=`500 26px ${W}`,e.fillStyle=`#6c7086`,e.fillText(l,40+d+28,52));let f=q.top,p=t();Jd.forEach((t,i)=>{let{x0:s,colW:c}=Xd(i,n),l=a[t.key];G(e,s+8,f,c-16,52,26),e.fillStyle=t.chip,e.fill(),e.fillStyle=`#1f2233`,e.font=`600 30px ${W}`,e.fillText(`${t.title} ${l.length}`,s+30,f+27),i>0&&(e.strokeStyle=`#d9dbe3`,e.lineWidth=3,e.beginPath(),e.moveTo(s,f),e.lineTo(s,r-30),e.stroke());let u=Zd(r),d=l.length>u?l.slice(0,u-1):l;if(d.forEach((r,a)=>{let s=Qd(i,a,n);lf(e,s.x,s.y,s.w,s.h,r,ef(r,t.key,o.look),p,o.look)}),l.length>d.length){e.fillStyle=`#6c7086`,e.font=`600 26px ${W}`;let t=Qd(i,d.length,n);e.fillText(`+${l.length-d.length} more`,t.x+14,t.y+t.h/2)}l.length===0&&(e.fillStyle=`#b4b7c5`,e.font=`italic 500 26px ${W}`,e.fillText(t.key===`backlog`?`no open issues`:`nothing here yet`,s+30,f+110))});for(let t of o.strings??[])sf(e,n,t)}function of(e,t,n,r){e.font=`600 28px ${W}`;let i=t;for(let t of Md(r).reverse()){let r=e.measureText(t.text).width+36;i-=r,G(e,i,n-26,r,52,26),e.fillStyle=t.alarm?`#e63946`:`#eef1f7`,e.fill(),e.lineWidth=2,e.strokeStyle=t.alarm?`#b5172a`:`#d4d8e3`,e.stroke(),e.fillStyle=t.alarm?`#ffffff`:`#2d3142`,e.fillText(t.text,i+18,n+1),i-=12}return i}function sf(e,t,n){let r=e=>{let n=Qd(Yd.indexOf(e.col),e.index,t);return{x:n.x+n.w/2,y:n.y+12}},i=r(n.from),a=r(n.to),o=36+Math.hypot(a.x-i.x,a.y-i.y)*.12,s=(i.x+a.x)/2,c=Math.max(i.y,a.y)+o,l=(t,n)=>{e.beginPath(),e.moveTo(i.x+t,i.y+n),e.quadraticCurveTo(s+t,c+n,a.x+t,a.y+n)};e.lineCap=`round`,l(3,5),e.strokeStyle=`rgba(0,0,0,0.16)`,e.lineWidth=6,e.stroke(),l(0,0),e.strokeStyle=`#c1121f`,e.lineWidth=5,e.stroke(),e.setLineDash([7,9]),l(0,-1),e.strokeStyle=`#ff6b6b`,e.lineWidth=2,e.stroke(),e.setLineDash([]);for(let t of[i,a])e.fillStyle=`rgba(0,0,0,0.2)`,e.beginPath(),e.arc(t.x+2,t.y+3,10,0,Math.PI*2),e.fill(),e.fillStyle=`#d62828`,e.beginPath(),e.arc(t.x,t.y,10,0,Math.PI*2),e.fill(),e.fillStyle=`#ffadad`,e.beginPath(),e.arc(t.x-3,t.y-3,3.5,0,Math.PI*2),e.fill();e.lineCap=`butt`}function cf(e,n,r,i,a,o,s,c=v){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.save(),e.scale(s,s),n.ghost||(e.fillStyle=`rgba(0,0,0,0.28)`,G(e,o+3,o+7,i+2,a+2,6),e.fill()),lf(e,o,o,i,a,n,ef(n,r,c),t(),c),e.restore()}function lf(e,t,n,r,i,a,o,s,c=v){let l=(a.number*37%7-3)*.006,d=a.agent&&/^#[0-9a-f]{6}$/i.test(a.agent.color)?a.agent.color:`#8a8fa3`;e.save(),e.translate(t+r/2,n+i/2),e.rotate(l),e.translate(-r/2,-i/2),a.ghost?(e.fillStyle=rf(d,.86),e.fillRect(0,0,r,i),e.setLineDash([12,9]),e.strokeStyle=d,e.lineWidth=4,e.strokeRect(2,2,r-4,i-4),e.setLineDash([])):(e.fillStyle=`rgba(0,0,0,0.12)`,e.fillRect(4,6,r,i),e.fillStyle=o,e.fillRect(0,0,r,i),e.fillStyle=`rgba(0,0,0,0.06)`,e.fillRect(0,0,r,10)),e.fillStyle=`#2d3142`,e.font=`700 22px ${W}`,e.textBaseline=`top`;let f=`${a.prNumber?`PR `:``}#${a.number}`;e.fillText(f,14,12);let p=e.measureText(f).width;if(e.font=`500 19px ${W}`,Vd(e,a.title,r-28,2).forEach((t,n)=>e.fillText(t,14,38+n*21)),e.textBaseline=`middle`,a.ghost){let t=je(a.agent?.name,a.qa?.round??0,a.qa?.updatedAt,s);e.fillStyle=d,e.beginPath(),e.arc(22,i-15,8,0,Math.PI*2),e.fill(),e.fillStyle=`#2d3142`,e.font=`600 17px ${W}`,e.fillText(t.who,36,i-14,r-46),e.font=`600 15px ${W}`;let n=r-12-(14+p+12),o=t.meta.find(t=>e.measureText(t).width<=n);o&&(e.fillStyle=`#5c6078`,e.textAlign=`right`,e.fillText(o,r-12,24),e.textAlign=`left`)}else a.agent&&(e.fillStyle=a.agent.color,e.beginPath(),e.arc(22,i-15,8,0,Math.PI*2),e.fill(),e.fillStyle=`#2d3142`,e.font=`600 17px ${W}`,e.fillText(a.agent.name,36,i-14));a.note&&!a.ghost&&(e.font=`500 16px ${W}`,e.fillStyle=`#5c6078`,e.textAlign=`right`,e.fillText(a.note,r-12,i-14),e.textAlign=`left`),c.shapes&&a.tone&&!a.ghost&&tf(e,r-18,20,13,u[a.tone],c),e.restore(),e.textBaseline=`middle`}function uf(e,t,n,r,i=v){e.clearRect(0,0,t,n);let a=r.status===`working`?r.currentTool?.startsWith(`mcp__playwright`)?`🌐`:r.currentTool===`Bash`||r.currentTool===`PowerShell`?`▶️`:r.currentTool?`⌨️`:`💭`:r.status===`preparing`?`📦`:r.status===`done`?`✅`:r.status===`error`?`❗`:r.status===`stopped`?`⏸️`:r.role===`ceo`?`🏛️`:`☕`;G(e,4,4,t-8,n-8,(n-8)/2),e.fillStyle=`rgba(255,255,255,0.94)`,e.fill(),e.lineWidth=6,e.strokeStyle=r.color,e.stroke(),e.textBaseline=`middle`,e.font=`38px ${W}`,e.fillText(a,22,n/2+2),e.fillStyle=`#23263a`,e.font=`700 40px ${W}`;let o=r.status!==`idle`,s=r.role===`ceo`?`${r.name} · CEO`:o&&r.task===`fix`&&r.prNumber?`${r.name} · 🔧 PR #${r.prNumber}`:o&&r.task===`qa`&&r.prNumber?`${r.name} · 🧪 PR #${r.prNumber}`:o&&r.issueNumber?`${r.name} · #${r.issueNumber}`:r.name,c=i.shapes?n*.32:0;for(;s.length>4&&e.measureText(s).width>t-96-c*2;)s=`${s.slice(0,-2)}…`;e.fillText(s,78,n/2+2),c&&tf(e,t-14-c,n/2,c,l[r.status],i)}function df(e,t,n,r,i,a,o){e.clearRect(0,0,t,n),G(e,4,4,t-8,n-8,28),e.fillStyle=`rgba(255,255,255,0.95)`,e.fill(),e.lineWidth=6,e.strokeStyle=o,e.setLineDash([14,8]),e.stroke(),e.setLineDash([]),e.textBaseline=`middle`,e.font=`44px ${W}`,e.fillText(`📄`,20,n/2+2);let s=(t,n)=>{let r=t;for(;r.length>4&&e.measureText(r).width>n;)r=`${r.slice(0,-2)}…`;return r};e.fillStyle=`#23263a`,e.font=`700 40px ${W}`,e.fillText(s(`Candidate: ${r}`,t-100),80,n*.36),e.fillStyle=`#5c6078`,e.font=`600 28px ${W}`,e.fillText(s(`${i}${a?` · Floor ${a}`:``}`,t-100),80,n*.72)}function ff(e,t,n,r,i,a=`#ffffff`){G(e,0,0,t,n,28),e.fillStyle=i,e.fill(),e.textAlign=`center`,e.textBaseline=`middle`;let o=r.reduce((e,t)=>e+t.size*1.25,0),s=n/2-o/2;for(let n of r){s+=n.size*1.25/2,e.fillStyle=n.color??a,e.font=`${n.weight??700} ${n.size}px ${W}`;let r=n.text;for(;r.length>3&&e.measureText(r).width>t-40;)r=`${r.slice(0,-2)}…`;e.fillText(r,t/2,s),s+=n.size*1.25/2}e.textAlign=`left`}function pf(e,t,n){e.fillStyle=`rgba(205, 236, 255, 0.16)`,e.fillRect(0,0,t,n),e.fillStyle=`rgba(255, 255, 255, 0.32)`;for(let[r,i]of[[.18,.07],[.3,.025]])e.beginPath(),e.moveTo(t*r,n),e.lineTo(t*(r+i),n),e.lineTo(t*(r+i+.22),0),e.lineTo(t*(r+.22),0),e.fill()}function mf(e,t,n,r,i){e.fillStyle=`#f6ecda`,e.fillRect(0,0,t,n);let a=n*(1-r);e.fillStyle=`#dccbb0`,e.fillRect(0,0,t,a),e.fillStyle=`#b9a68a`,e.fillRect(0,a-3,t,3);let o=t*i.x0,s=t*i.x1,c=n-n*i.y1,l=n-n*i.y0;e.fillStyle=`#ffffff`,e.fillRect(o-5,c-5,s-o+10,l-c+12);let u=e.createLinearGradient(0,c,0,l);u.addColorStop(0,`#8fc9ef`),u.addColorStop(1,`#c4e6fb`),e.fillStyle=u,e.fillRect(o,c,s-o,l-c),e.fillStyle=`rgba(255, 255, 255, 0.45)`,e.beginPath(),e.moveTo(o+(s-o)*.15,l),e.lineTo(o+(s-o)*.25,l),e.lineTo(o+(s-o)*.45,c),e.lineTo(o+(s-o)*.35,c),e.fill(),e.fillStyle=`#ffffff`,e.fillRect((o+s)/2-3,c,6,l-c),e.fillStyle=`#1f1d2b`,e.fillRect(o-5,l+5,s-o+10,2)}var hf=[{status:`preparing`,label:`Checking out the code`},{status:`installing`,label:`Installing dependencies`},{status:`starting`,label:`Starting the app`}],gf={unconfigured:{text:`NOT SET UP`,bg:`#5c6078`},stopped:{text:`STOPPED`,bg:`#5c6078`},preparing:{text:`STARTING`,bg:`#f4a261`},installing:{text:`STARTING`,bg:`#f4a261`},starting:{text:`STARTING`,bg:`#f4a261`},running:{text:`● LIVE`,bg:`#ef233c`},error:{text:`ERROR`,bg:`#e63946`}};function _f(e,t,n){let r=t;for(;r.length>2&&e.measureText(r).width>n;)r=`${r.slice(0,-2)}…`;return r}var vf={live:`#7CFFB2`,busy:`#ffd166`,bad:`#ff6b6b`,off:`#6c6c88`};function yf(e,t,n,r){let i=r.preview;e.fillStyle=K.bg,e.fillRect(0,0,t,n),e.textBaseline=`middle`,e.textAlign=`left`,e.fillStyle=K.bar,e.fillRect(0,0,t,118),e.fillStyle=r.color,e.fillRect(0,112,t,6),e.font=`700 34px ${W}`;let a=`FLOOR ${r.floor}`,o=e.measureText(a).width+44;G(e,40,30,o,54,27),e.fillStyle=r.color,e.fill(),e.fillStyle=`#ffffff`,e.fillText(a,62,58);let s=gf[i.status];e.font=`700 38px ${W}`;let c=e.measureText(s.text).width+52;G(e,t-40-c,28,c,58,29),e.fillStyle=s.bg,e.fill(),e.fillStyle=`#ffffff`,e.textAlign=`center`,e.fillText(s.text,t-40-c/2,58),e.textAlign=`left`,e.font=`700 50px ${W}`;let l=40+o+26;e.fillText(_f(e,r.name,t-40-c-26-l),l,58);let u=(n,r,i,a,o=700)=>{e.font=`${o} ${i}px ${W}`,e.fillStyle=a,e.textAlign=`center`,e.fillText(_f(e,n,t-100),t/2,r),e.textAlign=`left`},d=r.channels&&r.channels.length>1?r.channels:null,f=d?200:100,p=(e,t=`#8d8da8`)=>u(e,n-f+50,32,t,600),m=118+(n-118-f)/2,h=i.ref??`the app`;if(i.status===`stopped`){let n=m-70;e.fillStyle=r.color,e.beginPath(),e.arc(t/2,n,84,0,Math.PI*2),e.fill(),e.fillStyle=`#ffffff`,e.beginPath(),e.moveTo(t/2-26,n-42),e.lineTo(t/2-26,n+42),e.lineTo(t/2+44,n),e.closePath(),e.fill(),u(`Press ${r.use} to open the app`,m+80,70,`#ffffff`),p(`The app isn't running. Start it from the viewer.`)}else if(i.status===`unconfigured`)u(`⚙️`,m-90,110,`#ffffff`,400),u(`No run command yet.`,m+40,66,`#ffffff`),u(`Set one in the manager's console.`,m+120,44,`#b8b8cc`,600),p(`Press ${r.use} to open the app`);else if(i.status===`error`){let n=(i.error??``).split(/\r?\n/).find(e=>e.trim())?.trim()||`The app stopped unexpectedly.`;e.fillStyle=`#e63946`,e.fillRect(0,m-120,t,130),e.font=`700 44px ${W}`,e.fillStyle=`#ffffff`,e.fillText(_f(e,`⚠ ${n}`,t-100),50,m-55),u(`The app couldn't start.`,m+90,52,`#ffffff`),p(`Press ${r.use} to see the log and try again`,`#ffb4ba`)}else if(i.status!==`running`){let n=Math.max(0,hf.findIndex(e=>e.status===i.status));u(`Getting ${h} ready…`,198,46,`#b8b8cc`,600),u(`${hf[n].label}…`,m-20,72,`#ffffff`);let a=(t-200-18*(hf.length-1))/hf.length;hf.forEach((t,r)=>{let i=100+r*(a+18),o=m+90;G(e,i,o,a,34,17),e.fillStyle=r<n?K.done:r===n?`#f4a261`:`#3a3a52`,e.fill(),e.font=`600 28px ${W}`,e.fillStyle=r<=n?K.text:`#6c6c88`,e.textAlign=`center`,e.fillText(`${r<n?`✓ `:``}${t.label}`,i+a/2,o+70),e.textAlign=`left`}),p(`Step ${n+1} of ${hf.length} · press ${r.use} to watch`)}else{let n=r.shot?t*.5:t-112;e.font=`600 34px ${W}`,e.fillStyle=`#b8b8cc`,e.fillText(`Serving at`,56,190),e.font=`700 50px ${Bd}`,e.fillStyle=K.tool,e.fillText(_f(e,(i.url??``).replace(/^https?:\/\//,``).replace(/\/$/,``),n),56,258),e.font=`700 42px ${W}`;let a=e.measureText(h).width+48;if(G(e,56,326,a,64,32),e.fillStyle=r.color,e.fill(),e.fillStyle=`#ffffff`,e.fillText(h,80,359),i.commit&&(e.font=`600 42px ${Bd}`,e.fillStyle=K.thinking,e.fillText(i.commit,56+a+24,359)),i.startedAt&&(e.font=`500 32px ${W}`,e.fillStyle=`#8d8da8`,e.fillText(`up since ${new Date(i.startedAt).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}`,56,448)),r.shot){let i=t-n-56-70,a=Math.round(i*.5625),o=t-40-i;e.fillStyle=`#3a3a52`,e.fillRect(o-6,162,i+12,a+12);let s=r.shot,c=Math.max(i/s.width,a/s.height);e.drawImage(s,0,0,i/c,a/c,o,168,i,a),e.font=`500 26px ${W}`,e.fillStyle=`#8d8da8`,e.fillText(_f(e,r.shotCaption??`latest agent screenshot`,i),o,168+a+36)}p(`Press ${r.use} to open the app`,K.done)}d&&bf(e,t,n,d,r.color)}function bf(e,t,n,r,i){let a=bd(r.length,t,n);e.fillStyle=K.bar,e.fillRect(0,a[0].y-16,t,n-a[0].y+16),e.textBaseline=`middle`,r.forEach((t,n)=>{let r=a[n];G(e,r.x,r.y,r.w,r.h,18),e.fillStyle=t.on?i:`#3a3a52`,e.fill(),t.on&&(e.lineWidth=4,e.strokeStyle=`#ffffff`,e.stroke()),e.fillStyle=vf[t.led],e.beginPath(),e.arc(r.x+26,r.y+r.h/2,9,0,Math.PI*2),e.fill(),e.font=`700 30px ${W}`,e.fillStyle=t.on?`#ffffff`:`#c8c8dc`,e.textAlign=`center`,e.fillText(_f(e,t.label,r.w-56),r.x+r.w/2+14,r.y+r.h/2+1),e.textAlign=`left`})}var J={standoff:.32,board:{w:1.2,h:.62,t:.05,bottom:2.56},square:{w:.48,h:.36},rim:{y:2.7,r:.23,tube:.018,gap:.15},net:{h:.42,bottomR:.14},score:{w:1.24,h:.36,bottom:3.2},bounce:{board:.6,rim:.45},ball:{r:.12,restitution:.75,density:60,damping:.5,throwSpeed:9.5}},xf={office:10.5,lobby:-9},Sf=J.standoff+J.board.t+J.rim.gap+J.rim.r,Cf=24;function wf(){let{standoff:e,board:t,rim:n,score:r,bounce:i}=J,a=e+t.t,o=r.bottom+r.h;return[{box:[Math.max(t.w,r.w)/2,(o-t.bottom)/2,a/2],at:[0,(t.bottom+o)/2,-a/2],restitution:i.board,friction:.5},{box:[.07,.013,n.gap/2],at:[0,n.y,-(a+n.gap/2)],restitution:i.rim,friction:.5},...Array.from({length:Cf},(e,t)=>{let r=t/Cf*Math.PI*2;return{ball:n.tube+.004,at:[Math.cos(r)*n.r,n.y,-Sf+Math.sin(r)*n.r],restitution:i.rim,friction:.4}})]}var Tf=e=>({x:xf[e],y:J.rim.y,z:12-Sf,r:J.rim.r}),Ef=e=>({x:xf[e],y:J.rim.y+J.square.h/2,z:12-J.standoff-J.board.t}),Df=()=>({prev:null,armed:!0}),Of=1.5;function kf(e,t,n){let r=(e.y-n.y)/(e.y-t.y),i=e.x+(t.x-e.x)*r,a=e.z+(t.z-e.z)*r;return Math.hypot(i-n.x,a-n.z)<n.r}function Af(e,t,n){let r=e.prev;if(e.prev={x:t.x,y:t.y,z:t.z},!r)return!1;if(Math.hypot(t.x-r.x,t.y-r.y,t.z-r.z)>Of)return e.armed=!0,!1;let i=r.y>n.y&&t.y<=n.y,a=r.y<=n.y&&t.y>n.y;if((i||a)&&kf(r,t,n)){let t=i&&e.armed;return e.armed=!1,t}return!e.armed&&Math.hypot(t.x-n.x,t.z-n.z)>n.r&&(e.armed=!0),!1}var jf=[{id:`plant`,name:`Potted plant`,icon:`🪴`,kind:`floor`,price:20,blurb:`A cheerful leafy friend for a corner.`},{id:`beanbag`,name:`Bean bag`,icon:`🛋️`,kind:`floor`,price:35,blurb:`For thinking very hard, horizontally.`},{id:`fig`,name:`Fiddle-leaf fig`,icon:`🌳`,kind:`floor`,price:45,blurb:`Big, glossy and a little dramatic.`},{id:`poster-ship`,name:`"Ship it" poster`,icon:`🚀`,kind:`wall`,price:25,blurb:`Framed motivation.`},{id:`poster-repo`,name:`Repo poster`,icon:`🖼️`,kind:`wall`,price:30,blurb:`The floor's repo, framed.`},{id:`poster-pr`,name:`First PR poster`,icon:`📜`,kind:`wall`,price:40,blurb:`The floor's first merged PR, framed for posterity.`},{id:`rug`,name:`Accent rug`,icon:`🟧`,kind:`rug`,price:30,blurb:`A rug in the floor's colour.`},{id:`lights`,name:`String lights`,icon:`💡`,kind:`wall`,price:50,blurb:`Warm little bulbs along a wall.`},{id:`neon`,name:`Neon sign`,icon:`🌈`,kind:`wall`,price:80,blurb:`The floor's name in glowing tubes.`},{id:`fishtank`,name:`Fish tank`,icon:`🐠`,kind:`big`,price:120,blurb:`A few toon fish doing laps.`},{id:`pingpong`,name:`Ping-pong table`,icon:`🏓`,kind:`big`,price:150,blurb:`A spare one, just for show: the floor's own table is for playing.`},{id:`arcade`,name:`Arcade cabinet`,icon:`🕹️`,kind:`big`,price:200,blurb:`Press E on it to play the phone's games.`}],Mf=e=>jf.find(t=>t.id===e);function Nf(e,t=0){let n=Mf(e)?.price??0;return Math.round(n*(1+.25*Math.max(0,t))/5)*5}var Pf=[{id:`w-west`,kind:`wall`},{id:`w-south-w`,kind:`wall`},{id:`w-south-e`,kind:`wall`},{id:`w-north-e`,kind:`wall`},{id:`w-kitchen`,kind:`wall`},{id:`f-ne`,kind:`floor`},{id:`f-se`,kind:`floor`},{id:`f-sw`,kind:`floor`},{id:`f-west`,kind:`floor`},{id:`b-west`,kind:`big`},{id:`b-lounge`,kind:`big`},{id:`b-south`,kind:`big`},{id:`r-lounge`,kind:`rug`},{id:`r-entry`,kind:`rug`}],Ff=e=>Pf.filter(t=>t.kind===e).length,If={merge:10,firstQa:5,greenCi:5,streak:10},Lf=[{id:`first-merge`,name:`First merge`,icon:`🎉`,blurb:`The first PR merged since the trophy shelf went up`},{id:`hat-trick`,name:`Hat trick`,icon:`⚡`,blurb:`Three merges on one floor within an hour`},{id:`ten-a-day`,name:`Ten in a day`,icon:`🔟`,blurb:`Ten merges in one day`},{id:`clean-day`,name:`Spotless day`,icon:`✨`,blurb:`Five or more merges in a day without one failed QA round`},{id:`night-owl`,name:`Night owl`,icon:`🦉`,blurb:`A merge between midnight and 5 am`},{id:`full-house`,name:`Full house`,icon:`🏠`,blurb:`Everyone on a floor busy at once (four or more people)`},{id:`comeback`,name:`Comeback`,icon:`🔁`,blurb:`A PR that needed you was merged after all`},{id:`coffee-addict`,name:`Coffee addict`,icon:`☕`,blurb:`You drank ten coffees`},{id:`perfect-five`,name:`Perfect five`,icon:`💎`,blurb:`Five merges in a row without a failed QA round or check`},{id:`quarter-century`,name:`Quarter century`,icon:`🥈`,blurb:`25 PRs merged`},{id:`century`,name:`Century`,icon:`🥇`,blurb:`100 PRs merged`},{id:`interior-designer`,name:`Interior designer`,icon:`🪴`,blurb:`The first decoration placed`},{id:`fully-furnished`,name:`Fully furnished`,icon:`🛋️`,blurb:`Every decoration slot on a floor filled`}],Rf=e=>Lf.find(t=>t.id===e);function zf(e,t){let n=Object.values(e.placed).filter(e=>e===t).length;return Math.max(0,(e.owned[t]??0)-n)}var Bf={plant:{w:.6,d:.6,h:1.05},fig:{w:.85,d:.85,h:2.1},beanbag:{w:.9,d:.9,h:.62},"poster-ship":{w:1,d:.05,h:1.3},"poster-repo":{w:1,d:.05,h:1.3},"poster-pr":{w:1,d:.05,h:1.3},neon:{w:2.1,d:.06,h:.62},lights:{w:2.4,d:.05,h:.45},rug:{w:0,d:0,h:0},fishtank:{w:1.4,d:.55,h:1.45},pingpong:{w:2.2,d:1.2,h:.78},arcade:{w:.8,d:.75,h:1.85}},Vf={plant:{w:.45,d:.45},fig:{w:.55,d:.55}},Hf=e=>dn[e],Uf={"w-west":`west wall, south of the window`,"w-south-w":`south wall, over the blasters`,"w-south-e":`south wall, by the hoop`,"w-north-e":`north wall, past the "ship it" sign`,"w-kitchen":`over the kitchenette`,"f-ne":`north-east corner`,"f-se":`south-east corner`,"f-sw":`by the couch`,"f-west":`west wall, by the door`,"b-west":`west wall`,"b-lounge":`the lounge`,"b-south":`south wall, east of the elevator`,"r-lounge":`under the ping-pong table`,"r-entry":`in front of the elevator`};function Wf(e,t){if(e===`rug`){let e=t?Hf(t):void 0;return{w:(e?.w??3)-.2,d:(e?.d??2)-.2,h:.01}}return Bf[e]}function Gf(e,t){let n=Hf(e);if(!n)return null;let r=Wf(t,e),i=n.back?r.d/2+.02:0;return{x:n.x+Math.sin(n.rotY)*i,y:n.y??0,z:n.z+Math.cos(n.rotY)*i,rotY:n.rotY}}function Kf(e,t,n,r,i,a){let o=Math.abs(Math.cos(i)),s=Math.abs(Math.sin(i)),c=(n*o+r*s)/2,l=(n*s+r*o)/2;return{minX:e-c,maxX:e+c,minZ:t-l,maxZ:t+l,h:a}}var qf=e=>Pf.find(t=>t.id===e)?.kind,Jf=e=>e===`floor`||e===`big`;function Yf(e,t){if(!Jf(qf(e)))return null;let n=Gf(e,t);if(!n)return null;let r=Wf(t,e),i=Vf[t]??r;return Kf(n.x,n.z,i.w,i.d,n.rotY,r.h)}function Xf(e){return Object.entries(e).map(([e,t])=>Yf(e,t)).filter(e=>!!e)}function Zf(){return Pf.filter(e=>Jf(e.kind)).map(e=>{let t=dn[e.id],n=t.back?t.d/2:0;return Kf(t.x+Math.sin(t.rotY)*n,t.z+Math.cos(t.rotY)*n,t.w,t.d,t.rotY,2.2)})}function Qf(e,t,n){let r=Mf(e)?.kind;return Pf.filter(e=>e.kind===r&&(!t[e.id]||e.id===n)).map(e=>e.id)}var Y={r:.17,h:.09,speed:.3,turnRate:1.8,backSpeed:.2,cleanMin:120,cleanMax:180,charge:30,firstCharge:6,stuckAfter:5,spin:1.3},$f={leave:1,home:2,dock:4,full:8,stuck:16,bump:32},ep={w:.44,d:.14,h:.26},tp=Y.r+.03,np=tp+.1,rp=.2,ip=.8/(Y.cleanMax+90),ap=.6,op=.6,sp=.45,cp=.995,lp={office:12.8,lobby:-3.5},up={office:[[-7.1,-11.3,1],[7.1,-11.3,1],[-15.3,11.2,1.2],[-11,-11.3,1.1],[15.3,11.3,.9]],lobby:[[-7.1,-11.4,1.1],[-15.4,-4.1,.9],[15.3,-4.2,1.1],[7.1,-4.1,.9],[15.3,11.3,1.2],[-15.3,11.3,1.2],[-3,11.4,1],[3,-11.3,.8]]};function dp(e){let t=lp[e];return{x:t,z:-12+ep.d+tp+.01,heading:-Math.PI/2,rect:{minX:t-ep.w/2,maxX:t+ep.w/2,minZ:-12,maxZ:-12+ep.d,h:ep.h}}}function fp(e){let t=(e===`office`?mn():kn()).filter(e=>Math.abs(e.minX+e.maxX)/2<16+bt);t.push(Vt());for(let n of gt)t.push(jt(e,n));for(let[n,r,i]of up[e])t.push(x(n,r,.6*i,.6*i));return t.push(dp(e).rect),e===`office`&&t.push(...Zf()),t}function pp(e,t,n,r=tp){if(Math.abs(t)>16-r||Math.abs(n)>12-r)return!1;for(let i of e)if(t>i.minX-r&&t<i.maxX+r&&n>i.minZ-r&&n<i.maxZ+r)return!1;return!0}function mp(e,{planR:t=np,lineR:n=tp+.04,greed:r=1}={}){let i=Math.round(32/rp),a=Math.round(24/rp),o=new Uint8Array(i*a);for(let n=0;n<a;n++)for(let r=0;r<i;r++)o[n*i+r]=+!pp(e,hp(r),gp(n),t);return{rects:e,cols:i,rows:a,blocked:o,planR:t,lineR:n,greed:r}}var hp=e=>-16+(e+.5)*rp,gp=e=>-12+(e+.5)*rp,_p=(e,t)=>Math.min(t-1,Math.max(0,Math.floor((e+16)/rp))),vp=(e,t)=>Math.min(t-1,Math.max(0,Math.floor((e+12)/rp)));function yp(e,t,n,r=tp+.04){let i=Math.min(t.x,n.x)-r,a=Math.max(t.x,n.x)+r,o=Math.min(t.z,n.z)-r,s=Math.max(t.z,n.z)+r,c=e.filter(e=>e.maxX>i&&e.minX<a&&e.maxZ>o&&e.minZ<s),l=Math.max(1,Math.ceil(Math.hypot(n.x-t.x,n.z-t.z)/.08)),u=1;for(;u*2<=l;)u*=2;for(let e=u;e>=1;e>>=1)for(let i=e;i<=l;i+=e)if((e===u||i%(e*2)!=0)&&!pp(c,t.x+(n.x-t.x)*i/l,t.z+(n.z-t.z)*i/l,r))return!1;return!0}function bp(e,t,n,r){let{cols:i,rows:a,blocked:o}=e;for(let e=0;e<12;e++){let s=-1,c=1/0;for(let l=-e;l<=e;l++)for(let u=-e;u<=e;u++){if(Math.max(Math.abs(u),Math.abs(l))!==e)continue;let d=t+u,f=n+l;if(d<0||f<0||d>=i||f>=a)continue;let p=f*i+d;if(o[p]||r(p))continue;let m=u*u+l*l;m<c&&(c=m,s=p)}if(s>=0)return s}return-1}function xp(e,t,n,r=null){let{cols:i,rows:a,blocked:o}=e,s=r?r.r+e.planR:0,c=e=>!!r&&Math.hypot(hp(e%i)-r.x,gp(Math.floor(e/i))-r.z)<s,l=bp(e,_p(t.x,i),vp(t.z,a),c),u=bp(e,_p(n.x,i),vp(n.z,a),()=>!1);if(l<0||u<0)return null;let d=i*a,f=new Float32Array(d).fill(1/0),p=new Int32Array(d).fill(-1),m=new Uint8Array(d),h=u%i,ee=Math.floor(u/i),g=t=>{let n=Math.abs(t%i-h),r=Math.abs(Math.floor(t/i)-ee);return e.greed*(Math.max(n,r)+(Math.SQRT2-1)*Math.min(n,r))},_=[],v=(e,t)=>{let n=[e,t],r=_.length;for(_.push(n);r>0;){let t=r-1>>1;if(_[t][0]<=e)break;_[r]=_[t],r=t}_[r]=n},te=()=>{let e=_[0],t=_.pop();if(_.length){let e=0;for(;;){let n=2*e+1,r=n+1;if(n>=_.length)break;let i=r<_.length&&_[r][0]<_[n][0]?r:n;if(_[i][0]>=t[0])break;_[e]=_[i],e=i}_[e]=t}return e[1]},ne=(e,t)=>e>=0&&t>=0&&e<i&&t<a&&!o[t*i+e]&&!c(t*i+e);f[l]=0,v(g(l),l);let re=!1;for(;_.length;){let e=te();if(m[e])continue;if(m[e]=1,e===u){re=!0;break}let t=e%i,n=Math.floor(e/i);for(let r=-1;r<=1;r++)for(let a=-1;a<=1;a++){if(!a&&!r||!ne(t+a,n+r)||a&&r&&(!ne(t+a,n)||!ne(t,n+r)))continue;let o=(n+r)*i+t+a,s=f[e]+(a&&r?Math.SQRT2:1);s<f[o]&&(f[o]=s,p[o]=e,v(s+g(o),o))}}if(!re)return null;let y=[];for(let e=u;e>=0;e=p[e])y.push({x:hp(e%i),z:gp(Math.floor(e/i))});y.reverse(),y.push({x:n.x,z:n.z});let ie=[],ae=t,oe=0;for(;oe<y.length;){let t=oe;for(let n=y.length-1;n>oe;n--)if(yp(e.rects,ae,y[n],e.lineR)){t=n;break}ae=y[t],ie.push(ae),oe=t+1}return ie}function Sp(e,t=1){let n=Y.charge-Y.firstCharge,r=.9;return{x:e.x,z:e.z,heading:e.heading,state:`charging`,move:`idle`,battery:r+.09999999999999998*n/Y.charge,stateTime:n,moveTime:0,turnLeft:0,spiralR:0,path:[],cleanFor:Y.cleanMin,chargeFrom:r,stuck:0,mark:{x:e.x,z:e.z},waited:0,spinFrom:0,resume:{move:`idle`,moveTime:0},speed:0,seed:t>>>0||1,events:0}}function Cp(e){e.seed=e.seed+1831565813>>>0;let t=e.seed;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}var wp=(e,t,n)=>t+(n-t)*Cp(e),Tp=e=>Math.atan2(Math.sin(e),Math.cos(e));function Ep(e){return e.state===`charging`?e.battery<.995?`charging`:`docked`:e.state===`returning`||e.state===`docking`?`heading home`:`cleaning`}function Dp(e){e.move!==`spin`&&(e.resume={move:e.move,moveTime:e.moveTime},e.spinFrom=e.heading,e.move=`spin`,e.moveTime=Y.spin)}function Op(e){return e.state!==`charging`||e.move===`spin`?!1:(e.stateTime=Math.max(e.stateTime,Y.charge),!0)}var kp=e=>({x:e.x-Math.cos(e.heading)*op,z:e.z-Math.sin(e.heading)*op});function Ap(e,t,n){if(e.speed=0,e.stateTime+=t,e.move===`spin`){e.moveTime-=t;let n=Math.min(1,1-e.moveTime/Y.spin);e.heading=e.spinFrom+4*Math.PI*(n*n*(3-2*n)),e.moveTime<=0&&(e.heading=e.spinFrom,e.move=e.resume.move,e.moveTime=e.resume.moveTime),e.state===`charging`&&Mp(e);return}if(e.state===`charging`){Mp(e),e.stateTime>=Y.charge&&(jp(e,`leaving`),e.events|=$f.leave,e.cleanFor=wp(e,Y.cleanMin,Y.cleanMax),e.move=`back`,e.moveTime=ap/Y.backSpeed);return}e.battery=Math.max(0,e.battery-ip*t),e.state===`cleaning`&&(e.stateTime>=e.cleanFor||e.battery<.1)&&Hp(e,n);let r=n.player;if(r){let i=r.x-e.x,a=r.z-e.z,o=Math.hypot(i,a);if(o<Y.r+.3+.02){let r=o>1e-6?-i/o:-Math.cos(e.heading),s=o>1e-6?-a/o:-Math.sin(e.heading);Fp(e,r*Y.speed*1.5*t,s*Y.speed*1.5*t,t,n),e.stuck=0;return}}switch(e.move){case`wait`:{if(e.stuck=0,e.moveTime-=t,e.moveTime>0)break;let i=r!==null&&Np(e,r);if(e.state===`cleaning`||e.state===`leaving`){i?zp(e,Math.atan2(e.z-r.z,e.x-r.x)+wp(e,-.7,.7)):e.move=`drive`;break}i?(e.waited+=.8,e.moveTime=.8,e.waited>=4&&(e.waited=0,Up(e,n,r))):(e.waited=0,e.move=e.state===`docking`?`park`:`path`);break}case`turn`:{let n=Math.sign(e.turnLeft)*Math.min(Math.abs(e.turnLeft),Y.turnRate*t);e.heading=Tp(e.heading+n),e.turnLeft-=n,Math.abs(e.turnLeft)<1e-4&&Bp(e);break}case`back`:if(e.moveTime-=t,Fp(e,-Math.cos(e.heading)*Y.backSpeed*t,-Math.sin(e.heading)*Y.backSpeed*t,t,n)&&e.moveTime>0)break;e.stuck=0,e.state===`leaving`?(jp(e,`cleaning`),zp(e,n.dock.heading+Math.PI+wp(e,-.8,.8))):e.state===`cleaning`?Rp(e,(Cp(e)<.5?1:-1)*wp(e,2,3.6)):Up(e,n,null);break;case`drive`:if(Pp(e,r))break;Ip(e,Y.speed,t,n)?Cp(e)<.02*t&&(e.move=`spiral`,e.spiralR=.15,e.moveTime=25):Lp(e);break;case`spiral`:if(e.moveTime-=t,e.heading=Tp(e.heading+Y.speed/e.spiralR*t),e.spiralR+=Y.speed*.32/(2*Math.PI*e.spiralR)*t,Pp(e,r))break;Ip(e,Y.speed,t,n)?(e.spiralR>1.4||e.moveTime<=0)&&(e.move=`drive`):Lp(e);break;case`follow`:{if(e.moveTime-=t,e.moveTime<=0){Rp(e,-wp(e,.6,1.4));break}let i=Y.speed*t,a=Math.cos(e.heading),o=Math.sin(e.heading);if(!pp(n.nav.rects,e.x+a*(i+.02),e.z+o*(i+.02))){e.heading=Tp(e.heading-Y.turnRate*t);break}if(pp(n.nav.rects,e.x-o*.12+a*.05,e.z+a*.12+o*.05)&&(e.heading=Tp(e.heading+Y.speed/.3*t)),Pp(e,r))break;Ip(e,Y.speed,t,n)||(e.heading=Tp(e.heading-Y.turnRate*t));break}case`path`:{let i=e.path[0];if(!i){jp(e,`docking`),zp(e,n.dock.heading);break}let a=i.x-e.x,o=i.z-e.z,s=Math.hypot(a,o);if(s<.04){e.path.shift();break}let c=Tp(Math.atan2(o,a)-e.heading);if(Math.abs(c)>.3){e.heading=Tp(e.heading+Math.sign(c)*Math.min(Math.abs(c),Y.turnRate*t));break}if(e.heading=Tp(e.heading+Math.sign(c)*Math.min(Math.abs(c),Y.turnRate*t)),Pp(e,r))break;Ip(e,Math.min(Y.speed,s/t),t,n)||(e.events|=$f.bump,Vp(e,.5));break}case`park`:{let i=Math.hypot(n.dock.x-e.x,n.dock.z-e.z);if(i<.005){e.x=n.dock.x,e.z=n.dock.z,e.heading=n.dock.heading,jp(e,`charging`),e.events|=$f.dock,e.move=`idle`,e.chargeFrom=e.battery;break}if(e.heading=Math.atan2(n.dock.z-e.z,n.dock.x-e.x),Pp(e,r))break;Ip(e,Math.min(.15,i/t),t,n)||(e.events|=$f.bump,Vp(e,.8));break}}Math.hypot(e.x-e.mark.x,e.z-e.mark.z)>.2?(e.mark={x:e.x,z:e.z},e.stuck=0):e.move!==`wait`&&(e.stuck+=t,e.stuck>=Y.stuckAfter&&(e.stuck=0,e.events|=$f.stuck,e.state===`docking`&&jp(e,`returning`),Vp(e,.8)))}function jp(e,t){e.state=t,e.stateTime=0}function Mp(e){let t=e.battery;e.battery=e.chargeFrom+(1-e.chargeFrom)*Math.min(1,e.stateTime/Y.charge),t<.995&&e.battery>=.995&&(e.events|=$f.full)}function Np(e,t){let n=t.x-e.x,r=t.z-e.z,i=Math.hypot(n,r);return i<Y.r+.3+sp&&(n*Math.cos(e.heading)+r*Math.sin(e.heading))/i>.35}function Pp(e,t){return!t||!Np(e,t)?!1:(e.move=`wait`,e.moveTime=.8,!0)}function Fp(e,t,n,r,i){let a=e.x+t,o=e.z+n;if(!pp(i.nav.rects,a,o))return!1;let s=i.player;if(s){let t=Y.r+pt+.08,n=Math.hypot(s.x-e.x,s.z-e.z),r=Math.hypot(s.x-a,s.z-o);if(r<t&&r<n)return!1}return e.x=a,e.z=o,e.speed=Math.hypot(t,n)/r,!0}function Ip(e,t,n,r){return Fp(e,Math.cos(e.heading)*t*n,Math.sin(e.heading)*t*n,n,r)}function Lp(e){if(e.events|=$f.bump,Cp(e)<.3){e.move=`follow`,e.moveTime=wp(e,6,14);return}Rp(e,(Cp(e)<.5?1:-1)*wp(e,Math.PI/2,Math.PI))}function Rp(e,t){e.move=`turn`,e.turnLeft=t}function zp(e,t){Rp(e,Tp(t-e.heading))}function Bp(e){e.move=e.state===`docking`?`park`:e.state===`returning`?`path`:`drive`}function Vp(e,t){e.move=`back`,e.moveTime=t}function Hp(e,t){let n=xp(t.nav,e,kp(t.dock));if(!n){e.cleanFor+=15;return}jp(e,`returning`),e.events|=$f.home,e.path=n,e.move=`path`,e.waited=0}function Up(e,t,n){e.state===`docking`&&jp(e,`returning`);let r=xp(t.nav,e,kp(t.dock),n?{...n,r:.3}:null)??xp(t.nav,e,kp(t.dock));e.path=r??[],e.move=r?`path`:`wait`,e.moveTime=.8}var Wp=pt,Gp=1.2,X=0,Kp=Math.PI/2,qp=Math.PI,Jp=-Math.PI/2,Yp=1.5;function Xp(e){let{x:t,z:n}=Zt(e);return Xt(e)?{id:`desk-${e}`,x:t-Yp,z:n,facing:X}:{id:`desk-${e}`,x:t,z:n+Yp,facing:Jp}}function Zp(){let e=2560;return Yd.map((t,n)=>{let{x0:r,colW:i}=Xd(n,e);return{id:`board-${t}`,x:-$t.w/2+(r+i/2)/e*$t.w,z:-10.9,facing:Jp}})}function Qp(e){let t=Tf(e);return{id:`hoop`,x:t.x,z:t.z-4,facing:Kp}}var $p={office:{x:9.5,z:7.2},lobby:{x:-8,z:6}},em=e=>({id:`balls`,...$p[e],facing:Kp}),tm=()=>({id:`elevator`,x:0,z:11,facing:Kp});function nm(e,t){return[...e.map((e,t)=>({id:`window-w${t}`,x:-15,z:e,facing:qp})),...t.map((e,t)=>({id:`window-e${t}`,x:15,z:e,facing:X}))]}function rm(){let e=cn,t=e.len/2+e.stand;return[{id:`pong-west`,x:e.x-t,z:e.z,facing:X},{id:`pong-east`,x:e.x+t,z:e.z,facing:qp}]}var im=e=>({id:`jukebox`,x:e,z:12-rn.d-.8,facing:Kp});function am(){return[...Zp(),{id:`coffee`,x:14.55,z:5.9,facing:X},{id:`mugs`,x:14.55,z:6.55,facing:X},{id:`coffee-line`,x:13.65,z:5.9,facing:X},{id:`coffee-line-1`,x:12.75,z:5.9,facing:X},{id:`coffee-sip-0`,x:14.55,z:7.9,facing:qp},{id:`coffee-sip-1`,x:13.5,z:7.9,facing:X},{id:`fridge`,x:14.65,z:8.6,facing:Math.PI/4},{id:`fridge-line`,x:13.75,z:8.75,facing:X},{id:`fridge-line-1`,x:12.85,z:8.6,facing:X},{id:`snack-0`,x:13.9,z:9.6,facing:qp},{id:`snack-1`,x:13.05,z:9.45,facing:X},{id:`cooler`,x:14.5,z:-9.5,facing:X},{id:`gong`,...sn,facing:Jp},{id:`couch`,x:-14.1,z:7.7,facing:qp,sit:{x:-15,z:7.3,facing:X}},Qp(`office`),em(`office`),{id:`toss-a`,x:3.8,z:8.2,facing:X},{id:`toss-b`,x:8.3,z:8.2,facing:qp},...rm(),im(rn.officeX),tm(),...nm([-8,0],[-8])]}function om(){return[{id:`ceo`,x:vn.x,z:vn.z+Yp,facing:Jp},{id:`manager`,x:E.x,z:E.z+E.d/2+.55,facing:Jp},{id:`reception`,x:gn.x,z:gn.z+gn.d/2+.6,facing:Jp},{id:`couch`,x:10.2,z:5.1,facing:Jp,sit:{x:10.6,z:4.1,facing:Kp}},{id:`coffee`,x:Cn.x+.3,z:12-Cn.d-.4,facing:Kp},{id:`mugs`,x:Cn.x-.4,z:12-Cn.d-.4,facing:Kp},Qp(`lobby`),em(`lobby`),im(rn.lobbyX),tm(),...nm([1.5,8],[-2.5,3.6])]}var sm=new Map;function cm(e){let t=sm.get(e);if(t)return t;let n=mp(fp(e),{planR:Wp+.1,lineR:Wp+.03,greed:1.3}),r=e===`office`?am():om();return t={floor:e,nav:n,spots:r,homes:e===`office`?Array.from({length:qt},(e,t)=>Xp(t)):r.filter(e=>e.id===`ceo`)},sm.set(e,t),t}function lm(e,t){return e.spots.find(e=>e.id===t)??e.homes.find(e=>e.id===t)}var um=(e,t,n)=>pp(e.nav.rects,t,n,Wp);function dm(e,t,n){return xp(e.nav,t,n)}var fm=1.8,pm=.15;function mm(e,t,n,r=()=>!0){let i=-e.dz,a=e.dx,o=t.filter(t=>t.id!==e.id).map(e=>[e,!1]);n&&o.push([n,!0]);let s=null;for(let[t,n]of o){let r=t.x-e.x,o=t.z-e.z,c=r*e.dx+o*e.dz,l=r*i+o*a,u=Wp+(n?pt:Wp)+pm;c<=0||c>fm||Math.abs(l)>=u||(!s||c<s.ahead)&&(s={ahead:c,lateral:l,min:u,player:n})}if(!s)return{speed:1,side:0,wait:!1};let c=Math.max(0,s.ahead-Math.sqrt(Math.max(0,s.min*s.min-s.lateral*s.lateral))),l=Math.min(1,c/(fm-s.min)),u=Math.abs(s.lateral)<.05?1:-Math.sign(s.lateral),d=.4;for(let t of[u,-u])if(!(t===-u&&Math.abs(s.lateral)>=.05&&!s.player)&&r(e.x+i*t*d,e.z+a*t*d))return{speed:l,side:t*.7,wait:!1};return{speed:l,side:0,wait:l===0}}var Z=Vc(),hm=.4,gm=.15,_m=0,vm={x:w.x,z:w.z+1},ym=null,bm=null,xm=()=>Z.run&&qc(Z.run.beat)?Z.run.agentId:null;function Sm(e,t){return Cm(e.repoId,e.agentId,!0,t)}function Cm(e,t,n,r){let i=typeof document<`u`&&document.hidden,a=Lc({repoId:e,here:H.here,agentId:t,present:!!t&&!!wu(t),covered:r||i,elsewhere:!!t&&Om(t)});return a===`absent`?a:(Z.queue.push({agentId:a===`run`?t:null,celebrate:n}),Lm(performance.now()),wm(),a)}function wm(){Jc(Z)&&!ym&&bm===null&&(ym=setInterval(()=>Lm(performance.now()),250))}function Tm(e,t=performance.now()){if(e){bm===null&&(bm=t),Dm();return}if(bm===null)return;let n=t-bm;bm=null;for(let e of Z.run?[Z.run,...Z.home]:Z.home)e.since+=n,e.started+=n;H.hitAt+=n,H.celebrateUntil+=n,wm()}function Em(){Z.run&&Am(Z.run);for(let e of Z.home)Am(e);Z.queue.length=0,Z.home.length=0,Z.run=null,Dm()}function Dm(){ym&&clearInterval(ym),ym=null}var Om=e=>Rc(hu(e),Bc(Z,e)?.mine,Eu(e));function km(e,t){gu(e.agentId,t),e.mine=hu(e.agentId)}function Am(e){zc(e,hu(e.agentId))||vu(e.agentId),e.mine=void 0}function jm(e,t,n){let r=e.legs[e.leg],i=e.leg===e.legs.length-1?n:Yc(e.legs[e.leg-1],r);km(e,{mode:`walking`,x:r.x,z:r.z,speed:t,heading:i,gesture:`none`})}function Mm(e,t,n,r){let i=e.legs[e.leg],a=e.leg===e.legs.length-1;return t.stage!==`up`||Math.hypot(i.x-t.x,i.z-t.z)>(a?gm:hm)?!1:a?!0:(e.leg++,jm(e,n,r),!1)}function Nm(e,t){let n=dm(cm(`office`),e,t);return n&&n.length?[e,...n]:null}function Pm(e,t){Eu(e.agentId)&&Au(e.agentId);let n=Om(e.agentId)?void 0:wu(e.agentId),r=n&&(n.stage===`seated`||n.stage===`rising`?{x:n.standX,z:n.standZ}:{x:n.x,z:n.z}),i=r&&Nm(r,sn);if(!i){Z.queue.unshift({agentId:null,celebrate:e.celebrate});return}let a=Z.home.findIndex(t=>t.agentId===e.agentId);a>=0&&Z.home.splice(a,1);let o=Wc(e,t,i);o.mine=hu(e.agentId),o.leg=1,Z.run=o,jm(o,Pc,_m)}function Fm(e,t,n){e.beat=`back`,e.since=n;let r=Nm({x:t.x,z:t.z},{x:t.standX,z:t.standZ});r?(e.legs=r,e.leg=1,jm(e,Fc,t.seatHeading)):(e.legs=[],e.leg=0,Am(e)),Z.home.push(e)}function Im(e,t){let n=wu(e.agentId),r=e.beat===`strike`||e.beat===`pose`,i=zc(e,hu(e.agentId));if(!n||i||!r&&Gc(e,t)){Z.run=null,r||Z.queue.unshift({agentId:null,celebrate:e.celebrate}),n&&!i?Fm(e,n,t):Am(e);return}if(e.beat===`run`){if(!Mm(e,n,2.8,_m))return;e.beat=`take`,e.since=t,km(e,{mode:`standing`,x:vm.x,z:vm.z,heading:_m,speed:1,gesture:`take`});return}let a=Kc(e,t,H.hitAt);a&&(e.beat=a,e.since=t,a===`windup`?km(e,{gesture:`windup`}):a===`strike`?(km(e,{gesture:`strike`}),tl({celebrate:e.celebrate})):a===`pose`?km(e,{gesture:`cheer`}):a===`back`&&(Z.run=null,Fm(e,n,t)))}function Lm(e){if(bm===null){if(!Jc(Z))return Dm();for(let e=Z.home.length-1;e>=0;e--){let t=Z.home[e],n=wu(t.agentId);!n||zc(t,hu(t.agentId))?(Am(t),Z.home.splice(e,1)):t.leg>=t.legs.length?n.stage===`seated`&&Z.home.splice(e,1):Mm(t,n,1.9,n.seatHeading)&&(Am(t),t.leg=t.legs.length)}Z.run&&Im(Z.run,e);for(let t=Uc(Z,e,H.hitAt);t;t=Uc(Z,e,H.hitAt))t.agentId?Pm(t,e):tl({celebrate:t.celebrate})}}if(typeof window<`u`){let e=window.__swarmGong;e&&Object.assign(e,{run:(e,t)=>Cm(H.here,e,t?.celebrate===!0,!1),running:()=>Jc(Z)})}var Rm=new Set;function zm(e){return Rm.add(e),()=>void Rm.delete(e)}function Bm(e){for(let t of Rm)t(e)}var Vm=`modulepreload`,Hm=function(e){return`/`+e},Um={},Wm=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Hm(t,n),t=s(t),t in Um)return;Um[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Vm,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Gm=1,Km=`cubefarm:view`;function qm(){try{let e=JSON.parse(localStorage.getItem(Km)??`null`);return e&&[e.floor,e.x,e.z,e.yaw,e.pitch].every(Number.isFinite)?e:null}catch{return null}}function Jm(e){try{localStorage.setItem(Km,JSON.stringify(e))}catch{}}var Ym=600,Q=e((e,t)=>({connected:!1,loaded:!1,user:null,ghReady:!0,demo:!1,machinesRoot:``,settings:{sessionLimit:0,defaultModel:`claude-opus-5-5`,defaultEffort:`medium`,runtime:`terminal`,defaultCli:`claude`,scaling:`approve`,maxAgents:10,ceoHeartbeatMin:60,managerName:``,companyName:``,dogName:se,projectsDir:``,setupDone:!0,tutorialStep:-1,pacingSessions:3,trimIdleDesksMin:120,voice:{provider:`off`,voiceId:``,voiceName:``,model:``,speakOffice:!1,keepDays:7},themes:{mode:`auto`,disabled:[],birthday:null},weather:Le,worldEvents:Re,listen:{provider:`off`,autoSend:!1,handsFree:!1},notify:He,cloud:Ke},clis:[],repos:[],agents:{},logs:{},latest:{},workersOpen:!1,screens:{},qa:{},prPreviews:{},requests:[],ceo:{queue:[],job:null,lastReviewAt:null,nextReviewAt:null},messages:[],phoneReadAt:0,usage:{state:`normal`,until:null,warning:null},ops:nt,doctor:[],voiceKeySet:!1,voiceKeyHint:``,voiceCache:{clips:0,bytes:0,saved:[]},progress:{floors:{},achievements:[],coffees:0,merges:0},voiceSpeaking:null,weather:ze,ticker:[],notifyChannels:{webhooks:{ntfy:{set:!1,hint:``}},pushDevices:0},cloud:Je,pong:{},restarting:!1,visitors:[],replaying:!1,floor:qm()?.floor??0,travel:null,overlay:null,focus:null,locked:!1,started:!1,toasts:[],held:null,chargeAt:null,apply(n,r){let i=t().loaded&&r!==`seek`,a=i&&!r;switch(n.type){case`snapshot`:{let r=n.data,i={},a={},o={};for(let{log:e,...t}of r.agents)i[t.id]=t,a[t.id]=e,t.screenshotAt&&(o[t.id]=t.screenshotAt);let s={};for(let e of r.qa)s[$(e.repoId,e.prNumber)]=e;let c={};for(let e of r.prPreviews??[])c[$(e.repoId,e.pr)]=e;let l=t().floor===-1||r.repos.some(e=>e.floor===t().floor);e({loaded:!0,user:r.user,ghReady:r.ghReady,ghError:r.ghError,demo:r.demo,machinesRoot:r.machinesRoot,settings:r.settings,repos:r.repos.sort((e,t)=>e.floor-t.floor),agents:i,logs:a,latest:{},screens:o,qa:s,prPreviews:c,requests:r.requests,ceo:r.ceo,messages:r.messages,phoneReadAt:r.phoneReadAt,version:r.version,officeCommit:r.officeCommit,officeUpdate:r.officeUpdate,usage:r.usage,ops:r.ops??nt,doctor:r.doctor??[],clis:r.clis??[],voiceKeySet:r.voiceKeySet??!1,voiceKeyHint:r.voiceKeyHint??``,voiceCache:r.voiceCache??{clips:0,bytes:0,saved:[]},weather:r.weather??ze,ticker:r.ticker??[],notifyChannels:r.notifyChannels??t().notifyChannels,cloud:r.cloud??Je,progress:r.progress??{floors:{},achievements:[],coffees:0,merges:0},pong:r.pong??{},restarting:!1,floor:l?t().floor:0});break}case`repo`:case`repos`:{let r=t().repos,o=[],s=Qm(t().overlay);for(let e of n.type===`repo`?[n.repo]:n.repos){let n=r.find(t=>t.id===e.id);if(!n&&e.fullName===void 0)continue;let c={...n,...e},l=Ta(i,n,c,e=>t().qa[$(c.id,e)]??ja($(c.id,e)),Object.values(t().agents));l.map(e=>Sm(e,s)).includes(`absent`)&&a&&sa(`merged`),o.push(...l),r=[...r.filter(e=>e.id!==c.id),c]}e({repos:r.sort((e,t)=>e.floor-t.floor)});for(let e of o)Pa(e);break}case`repoRemoved`:{let r=t().repos.filter(e=>e.id!==n.repoId);e({repos:r,floor:t().floor>r.length?0:t().floor});break}case`agent`:{let r=t().agents[n.agent.id];a&&!r&&n.agent.role!==`ceo`&&sa(`welcome`),a&&r&&r.status!==`error`&&n.agent.status===`error`&&sa(`error`),e({agents:{...t().agents,[n.agent.id]:n.agent}});break}case`agents`:{let r={...t().agents};for(let e of n.agents){let t=r[e.id];if(!t&&e.name===void 0)continue;let n={...t,...e};a&&!t&&n.role!==`ceo`&&sa(`welcome`),a&&t&&t.status!==`error`&&n.status===`error`&&sa(`error`),r[e.id]=n}e({agents:r});break}case`agentRemoved`:{let{[n.agentId]:r,...i}=t().agents;e({agents:i});break}case`logs`:{let r={...t().logs},i={...t().latest};for(let[e,t]of Object.entries(n.tails)){let a=n.catchUp?[]:r[e]??[],o=a.length?a[a.length-1].id:-1,s=n.catchUp?t:t.filter(e=>e.id>o);if(!s.length&&!n.catchUp)continue;let c=a.concat(s);r[e]=c.length>Ym?c.slice(-600):c;let l=Fe(s,80);l&&(i[e]=l)}e({logs:r,latest:i});break}case`latest`:e({latest:{...t().latest,...n.lines}});break;case`screen`:{let r=t().agents[n.agentId];e({screens:{...t().screens,[n.agentId]:n.at},agents:r?{...t().agents,[n.agentId]:{...r,hasScreenshot:!0,screenshotAt:n.at,browserUrl:n.url??r.browserUrl}}:t().agents});break}case`qa`:{let r=t().qa[$(n.qa.repoId,n.qa.prNumber)]?.status,i=e=>e===`failed`||e===`needs-human`;a&&n.qa.status===`passed`&&r!==`passed`&&sa(`ready`),a&&i(n.qa.status)&&!i(r)&&sa(`qaFailed`),e({qa:{...t().qa,[$(n.qa.repoId,n.qa.prNumber)]:n.qa}});break}case`qaRemoved`:{let{[$(n.repoId,n.prNumber)]:r,...i}=t().qa;r&&Aa($(n.repoId,n.prNumber),r),e({qa:i});break}case`prPreview`:e({prPreviews:{...t().prPreviews,[$(n.preview.repoId,n.preview.pr)]:n.preview}});break;case`prPreviewRemoved`:{let{[$(n.repoId,n.pr)]:r,...i}=t().prPreviews;e({prPreviews:i});break}case`settings`:e({settings:n.settings});break;case`clis`:e({clis:n.clis});break;case`request`:{let r=t().requests.find(e=>e.id===n.request.id);a&&n.request.kind===`hire`&&n.request.status===`approved`&&r?.status===`pending`&&sa(`welcome`);let i=t().requests.filter(e=>e.id!==n.request.id);i.push(n.request),e({requests:i.sort((e,t)=>e.createdAt-t.createdAt)});break}case`ceo`:e({ceo:n.ceo});break;case`message`:{if(e({messages:[...t().messages.slice(-199),n.message]}),r)break;let a=t().overlay,o=a?.kind===`phone`&&(a.tab??`chat`)===`chat`,s=i&&Qr()&&ua(n.message,t().settings.voice,Date.now());if(s){let e=Date.now(),t=ba(n.message.id);Wm(()=>import(`./voiceMessages-DtNmUazr.js`).then(r=>r.speakMessage(n.message,e,t)),__vite__mapDeps([0,1,2,3,4,5,6]))}if(i&&n.message.from===`ceo`&&oe(`Message from ${t().agents.ceo?.name??`the CEO`}: ${pe(n.message.text,600)}`),n.message.from===`ceo`&&!o){s||Ni();let e=t().agents.ceo?.name??`CEO`,r=n.message.text.replace(/\s+/g,` `);t().pushToast(`info`,`📱 ${e}: ${r.length>110?`${r.slice(0,109)}…`:r}`)}break}case`phoneRead`:e({phoneReadAt:Math.max(t().phoneReadAt,n.at)});break;case`toast`:t().pushToast(n.level,n.text);break;case`officeUpdate`:e({officeUpdate:n.officeUpdate});break;case`usage`:e({usage:n.usage});break;case`ops`:a&<(t().ops.alarms,n.ops.alarms).length&&qi(),e({ops:n.ops});break;case`doctor`:e({doctor:n.doctor});break;case`voiceKey`:e({voiceKeySet:n.voiceKeySet,voiceKeyHint:n.voiceKeyHint});break;case`voiceCache`:e({voiceCache:n.voiceCache});break;case`weather`:e({weather:n.weather});break;case`ticker`:e({ticker:[...t().ticker.slice(-119),n.item]});break;case`notifyChannels`:e({notifyChannels:n.notifyChannels});break;case`cloud`:e({cloud:n.cloud});break;case`notify`:Ze(n.note,t().settings.notify?.channels.desktop!==!1);break;case`visitors`:e({visitors:n.visitors}),ic(n,t().floor);break;case`visitorPose`:ac(n,t().floor);break;case`visitorEmote`:oc(n);break;case`visitorPing`:sc(n);break;case`progress`:e({progress:n.progress});break;case`reward`:i&&Bm(n.reward);break;case`pong`:e({pong:{...t().pong,[n.repoId]:n.board}})}},setConnected:t=>e({connected:t}),setReplaying:t=>e({replaying:t}),setRestarting:t=>e({restarting:t}),setOfficeUpdate:t=>e({officeUpdate:t}),openOverlay(n){if(n&&t().replaying&&(n.kind===`terminal`||n.kind===`app`)){t().pushToast(`info`,`▶ That shows the live office: press Esc to leave the replay first.`);return}e(n?{overlay:n,focus:null,held:null,chargeAt:null}:{overlay:n}),n&&document.pointerLockElement&&document.exitPointerLock()},setFocus:n=>{let r=t().focus;(r?.id!==n?.id||r?.label!==n?.label)&&e({focus:n})},setHeld:t=>e({held:t,chargeAt:null}),setCharge:t=>e({chargeAt:t}),setLocked:t=>e({locked:t}),setWorkersOpen:t=>e({workersOpen:t}),start:()=>e({started:!0}),goToFloor(n){if(n===t().floor||t().travel){e({overlay:null});return}e({overlay:null,held:null,chargeAt:null,travel:{to:n,phase:`closing`}})},finishTravel(n){let r=t().travel;r&&e(n===`arrived`?{floor:r.to,travel:{...r,phase:`opening`}}:{travel:null})},pushToast(n,r){n===`error`&&oe(r,`assertive`);let i=Gm++;e({toasts:[...t().toasts.slice(-4),{id:i,level:n,text:r}]}),setTimeout(()=>t().dismissToast(i),n===`error`?9e3:5e3)},dismissToast:n=>e({toasts:t().toasts.filter(e=>e.id!==n)})})),$=(e,t)=>`${e}#${t}`,Xm=(e,t)=>e.find(e=>e.floor===t)??null,Zm=(e,t)=>Object.values(e).filter(e=>e.repoId===t).sort((e,t)=>e.desk-t.desk),Qm=e=>e?.kind===`kanban`||e?.kind===`terminal`||e?.kind===`manager`,$m=e=>e.status===`preparing`||e.status===`working`,eh=(e,t)=>e.filter(e=>e.from===`ceo`&&!e.requestId&&e.at>t).length,th=e=>e.filter(e=>e.status===`pending`);function nh(){let e=Q(e=>e.requests),t=Q(e=>e.messages),n=Q(e=>e.phoneReadAt);return th(e).length+eh(t,n)}function rh(e,t,n,r,i){let a=e.pulls.filter(e=>e.state===`OPEN`),o=new Map(t.map(e=>[e.id,e])),s=t.filter(e=>e.role!==`ceo`),c=s.filter(e=>e.task!==`qa`),l=(e,t)=>c.find(t=>t.prNumber===e)??c.find(e=>e.branch&&e.branch===t),u=[];for(let e of s){if(e.issueNumber==null||e.task!==`issue`||e.status===`idle`||e.prNumber!=null)continue;let t=e.status===`preparing`?`setting up`:e.status===`working`?`working`:e.status===`error`?`needs help`:e.status===`stopped`?`stopped`:`finished · no PR`;u.push({key:`a-${e.id}`,number:e.issueNumber,title:e.issueTitle??``,agent:e,note:b(i,t),tone:e.status===`error`?`bad`:e.status===`stopped`||e.status===`done`?`warn`:void 0})}let d=[],f=[];for(let t of a){let r=n[$(e.id,t.number)],a=(r?.devAgentId?o.get(r.devAgentId):void 0)??l(t.number,t.headRefName),s=r?.qaAgentId?o.get(r.qaAgentId):void 0,c={key:`pr-${t.number}`,number:t.number,prNumber:t.number,title:t.title,url:t.url,qa:r,...ke(r,t,e.autoMerge,i)};r?.status===`passed`?f.push({...c,agent:a}):d.push({...c,agent:r?.status===`testing`?s:a})}let p=new Set([...u.map(e=>e.number),...a.flatMap(e=>e.closesIssues)]),m=new Set(e.issues.map(e=>e.number)),h=new Map((e.held??[]).map(e=>[e.issue,e.pr])),ee=r?.resources?.filter(t=>t.state!==`normal`&&t.agentIds.some(t=>s.some(n=>n.id===t&&n.repoId===e.id))),g=e.autoAssign?r?.resources?ee?.length?b(i,`⏸ Some AI quotas are held`):``:r&&r.state!==`normal`?b(i,r.state===`paused`?`⏸ paused`:`⏸ paced`):``:``;return{backlog:e.issues.filter(e=>!p.has(e.number)).map(e=>{let t=Me(e.body,m),n=e.labels.slice(0,2).join(`, `),r={key:`i-${e.number}`,number:e.number,title:e.title,url:e.url};return h.has(e.number)?{...r,note:b(i,`⏸ PR #{number} closed · assign by hand`,{number:h.get(e.number)}),tone:`warn`}:{...r,note:(t.length?b(i,`⏳ after #{numbers}`,{numbers:t.join(`, #`)}):[g,n].filter(Boolean).join(` · `))||void 0}}),progress:u,qa:d,ready:f,merged:e.pulls.filter(e=>e.state===`MERGED`).sort((e,t)=>(t.mergedAt??``).localeCompare(e.mergedAt??``)).map(e=>({key:`m-${e.number}`,number:e.number,prNumber:e.number,title:e.title,url:e.url,agent:l(e.number,e.headRefName)}))}}function ih(e,t){let n={inQa:0,ready:0,needsYou:0};for(let r of e.pulls){if(r.state!==`OPEN`)continue;let i=t[$(e.id,r.number)];i?.status===`passed`?n.ready++:n.inQa++,Oe(i)&&n.needsYou++}return n}export{Rf as $,Un as $a,ii as $i,Rl as $n,ot as $o,Mo as $r,xu as $t,up as A,fn as Aa,Qi as Ai,Wu as An,Vt as Ao,cc as Ar,l as As,Wd as At,yp as B,k as Ba,gi as Bi,Ol as Bn,Zn as Bo,Es as Br,ld as Bt,dm as C,tn as Ca,Ni as Ci,Zu as Cn,tr as Co,xc as Cr,oe as Cs,Gd as Ct,cm as D,Cn as Da,ai as Di,rd as Dn,Mn as Do,pc as Dr,i as Ds,$d as Dt,mm as E,_n as Ea,Li as Ei,Lu as En,Nn as Eo,vc as Er,c as Es,Xd as Et,dp as F,ft as Fa,ui as Fi,iu as Fn,Dn as Fo,mc as Fr,kd as Ft,Xf as G,Sn as Ga,li as Gi,Tl as Gn,zt as Go,ns as Gr,dd as Gt,Dp as H,rn as Ha,yi as Hi,El as Hn,jt as Ho,Ss as Hr,ud as Ht,mp as I,vt as Ia,fi as Ii,tu as In,mn as Io,Ps as Ir,Od as It,Gf as J,Wt as Ja,Di as Ji,Ul as Jn,nt as Jo,ho as Jr,fd as Jt,Wf as K,E as Ka,si as Ki,Hl as Kn,Fn as Ko,wo as Kr,xd as Kt,xp as L,qn as La,I as Li,cu as Ln,Lt as Lo,ws as Lr,Md as Lt,$f as M,Yt as Ma,$r as Mi,Zl as Mn,Rt as Mo,Sc as Mr,g as Ms,zd as Mt,pp as N,Tt as Na,vi as Ni,Xl as Nn,Xt as No,Qs as Nr,te as Ns,Rd as Nt,ep as O,Rn as Oa,Xi as Oi,Su as On,Zt as Oo,$s as Or,a as Os,Qd as Ot,Sp as P,mt as Pa,Mi as Pi,ou as Pn,kn as Po,gc as Pr,jd as Pt,Pf as Q,pt as Qa,Bi as Qi,wl as Qn,ut as Qo,Wo as Qr,yd as Qt,fp as R,w as Ra,Si as Ri,ru as Rn,ln as Ro,Ts as Rr,od as Rt,Xp as S,Pt as Sa,Ri as Si,zu as Sn,Ft as So,_c as Sr,ce as Ss,uf as St,um as T,vn as Ta,Fi as Ti,$u as Tn,zn as To,rc as Tr,s as Ts,ef as Tt,Ap as U,Tn as Ua,Pi as Ui,kl as Un,_t as Uo,Cs as Ur,bd as Ut,Op as V,Yn as Va,_i as Vi,Wl as Vn,Pn as Vo,As as Vr,pd as Vt,Uf as W,Hn as Wa,ri as Wi,xl as Wn,er as Wo,os as Wr,hd as Wt,jf as X,Wn as Xa,Xr as Xi,Fl as Xn,it as Xo,Po as Xr,vd as Xt,Lf as Y,D as Ya,zi as Yi,Pl as Yn,rt as Yo,Io as Yr,md as Yt,If as Z,Nt as Za,ei as Zi,Ll as Zn,at as Zo,Ho as Zr,Sd as Zt,xm as _,en as _a,xa as _i,vu as _n,dt as _o,jc as _r,ue as _s,pf as _t,rh as a,jr as aa,uo as ai,Gu as an,qt as ao,yl as ar,Ve as as,xf as at,Wp as b,Dt as ba,da as bi,Tu as bn,St as bo,nc as br,ve as bs,ff as bt,$ as c,mr as ca,qa as ci,Qu as cn,wt as co,gl as cr,Me as cs,Tf as ct,eh as d,wr as da,Ra as di,Cu as dn,Gn as do,nl as dr,ke as ds,Af as dt,F as ea,Do as ei,wu as en,un as eo,zl as er,st as es,Mf as et,nh as f,fr as fa,za as fi,ku as fn,Jn as fo,el as fr,Oe as fs,Yd as ft,Tm as g,or as ga,Na as gi,bu as gn,xn as go,Nc as gr,De as gs,mf as gt,zm as h,rr as ha,Da as hi,yu as hn,bn as ho,Ec as hr,b as hs,df as ht,$m as i,Tr as ia,co as ii,Du as in,Ln as io,ul as ir,Ge as is,J as it,Y as j,dn as ja,Ji as ji,Kl as jn,yt as jo,bc as jr,o as js,Vd as jt,cp as k,O as ka,Yi as ki,ju as kn,Qt as ko,tc as kr,ne as ks,G as kt,Xm as l,hr as la,Ka as li,td as ln,Vn as lo,H as lr,Ne as ls,Ef as lt,Wm as m,pr as ma,Ea as mi,_u as mn,yn as mo,Zc as mr,Te as ms,yf as mt,Qm as n,Ii as na,Eo as ni,Au as nn,gn as no,Cl as nr,Ue as ns,Ff as nt,qm as o,_r as oa,Ya as oi,Yu as on,gt as oo,ll as or,Ie as os,Sf as ot,Q as p,yr as pa,Ia as pi,Eu as pn,En as po,Qc as pr,we as ps,W as pt,Qf as q,hn as qa,xi as qi,Ml as qn,tt as qo,No as qr,_d as qt,ih as r,Er as ra,lo as ri,Bu as rn,In as ro,il as rr,We as rs,zf as rt,th as s,gr as sa,Ja as si,Ru as sn,Ct as so,fl as sr,Be as ss,wf as st,Zm as t,Zr as ta,Ro as ti,hu as tn,cn as to,Dl as tr,Qe as ts,Nf as tt,Jm as u,vr as ua,Ga as ui,Mu as un,ht as uo,tl as ur,Ae as us,Df as ut,Lm as v,C as va,fa as vi,gu as vn,bt as vo,Mc as vr,he as vs,af as vt,lm as w,$t as wa,Ci as wi,ed as wn,Bn as wo,Cc as wr,re as ws,Zd as wt,Gp as x,Ot as xa,Yr as xi,Ju as xn,Xn as xo,ec as xr,se as xs,nf as xt,Em as y,kt as ya,pa as yi,Vu as yn,Kn as yo,Fs as yr,pe as ys,cf as yt,Ep as z,sn as za,Ti as zi,lu as zn,x as zo,xs as zr,gd as zt};
|