@loicngr/kobo 1.11.21 → 1.11.23
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/CHANGELOG.md +9 -0
- package/dist/server/db/migrations.js +13 -0
- package/dist/server/db/schema.js +1 -0
- package/dist/server/index.js +2 -0
- package/dist/server/routes/pull-requests.js +112 -0
- package/dist/server/routes/workspaces.js +98 -0
- package/dist/server/services/forge/bitbucket/provider.js +86 -0
- package/dist/server/services/forge/github/provider.js +76 -0
- package/dist/server/services/forge/gitlab/provider.js +44 -0
- package/dist/server/services/forge/none.js +4 -0
- package/dist/server/services/pr-checkout-service.js +380 -0
- package/dist/server/services/workspace-service.js +4 -3
- package/dist/server/services/worktree-service.js +5 -5
- package/package.json +1 -1
- package/src/client/dist/pwa/assets/{ActivityFeed-DtsapcUb.js → ActivityFeed-BNyFzRkx.js} +1 -1
- package/src/client/dist/pwa/assets/{ChangelogPage-D5FtafDI.js → ChangelogPage-7pgilQJn.js} +1 -1
- package/src/client/dist/pwa/assets/ClosePopup-BK6mNWsy.js +1 -0
- package/src/client/dist/pwa/assets/CreatePage-BCuDTB_0.css +1 -0
- package/src/client/dist/pwa/assets/CreatePage-P4N9bro4.js +2 -0
- package/src/client/dist/pwa/assets/{DiffViewer-B7CQC4kD.js → DiffViewer-Cl2w9liE.js} +4 -4
- package/src/client/dist/pwa/assets/{DocumentsPanel-BgIrc-i0.js → DocumentsPanel-CARiAfZs.js} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-txKWaxSr.js +3 -0
- package/src/client/dist/pwa/assets/HealthPage-B0_v81_H.js +1 -0
- package/src/client/dist/pwa/assets/MainLayout-Cl26t1Yw.js +2 -0
- package/src/client/dist/pwa/assets/{QBtnDropdown-COnv-9Kx.js → QBtnDropdown-9dpk4IiI.js} +1 -1
- package/src/client/dist/pwa/assets/QItemSection-5GBV9MR2.js +1 -0
- package/src/client/dist/pwa/assets/{SchedulePanel-CS__azUn.js → SchedulePanel-CSJbQpWB.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-CBQqJmmb.js → SearchPage-B5Wndh73.js} +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-BmSaJrE5.js +16 -0
- package/src/client/dist/pwa/assets/{TerminalPanel-lsPJEdE-.js → TerminalPanel-CuKWlENm.js} +1 -1
- package/src/client/dist/pwa/assets/TouchPan-CflYDvzb.js +1 -0
- package/src/client/dist/pwa/assets/WorkspacePage-C8SAYVkt.js +4 -0
- package/src/client/dist/pwa/assets/{build-path-tree-CmNRcZvN.js → build-path-tree-nS5a0hfa.js} +1 -1
- package/src/client/dist/pwa/assets/{cssMode-DuFZt6Ie.js → cssMode-BWoHpG_3.js} +1 -1
- package/src/client/dist/pwa/assets/{editor.api-Dt5YHQkt.js → editor.api-CHHKMKIl.js} +1 -1
- package/src/client/dist/pwa/assets/efforts-C0gGtu_O.js +9 -0
- package/src/client/dist/pwa/assets/engineFeatures-Cm3wk7lo.js +1 -0
- package/src/client/dist/pwa/assets/expand-template-CRv7R1En.js +1 -0
- package/src/client/dist/pwa/assets/{freemarker2-DQWkQIhe.js → freemarker2-ChmoNkJH.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-C8DkGF05.js → handlebars-DjdwH2Vr.js} +1 -1
- package/src/client/dist/pwa/assets/{html-DlhhK7Jm.js → html-DJszTgCl.js} +1 -1
- package/src/client/dist/pwa/assets/{htmlMode-BVmEqAhh.js → htmlMode-D0QTtBWO.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-BQFPc-Bc.js +1 -0
- package/src/client/dist/pwa/assets/{index-B29y2aJO.js → index-okqx5CVc.js} +7 -7
- package/src/client/dist/pwa/assets/{javascript-C80MQqD5.js → javascript-ByhJGDgS.js} +1 -1
- package/src/client/dist/pwa/assets/{jsonMode-r9kfqNya.js → jsonMode-Db1oPA-y.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-DT_yR5El.js → liquid-CGMily4q.js} +1 -1
- package/src/client/dist/pwa/assets/{lspLanguageFeatures-CY9UVeSD.js → lspLanguageFeatures-B85CeJTe.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-C_PbX1dC.js → mdx-B5_UPmNo.js} +1 -1
- package/src/client/dist/pwa/assets/{network-auth-BP2CrR3z.js → network-auth-D9vq0xDI.js} +1 -1
- package/src/client/dist/pwa/assets/{notify-theme-DIVwJeyL.js → notify-theme-kRr6YTnZ.js} +1 -1
- package/src/client/dist/pwa/assets/{pending-diff-open-B9fNhQic.js → pending-diff-open-nLdNq-y-.js} +1 -1
- package/src/client/dist/pwa/assets/{permissionModes-Be3ZDmns.js → permissionModes-Du6lXebH.js} +3 -3
- package/src/client/dist/pwa/assets/{project-color-Bc8ih-HF.js → project-color-tT7gsmB5.js} +1 -1
- package/src/client/dist/pwa/assets/{python-8G6qNwxa.js → python-FzBHx7LG.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-BazUxiHR.js → razor-BU_JvIXc.js} +1 -1
- package/src/client/dist/pwa/assets/{render-chat-markdown-CI48Q5rA.js → render-chat-markdown-DrGdVCku.js} +1 -1
- package/src/client/dist/pwa/assets/{tsMode-BUJh8zAj.js → tsMode-BDW6Cb6M.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-C5pPIpSU.js → typescript-21K3hWN-.js} +1 -1
- package/src/client/dist/pwa/assets/{use-onboarding-BQCOq7nO.js → use-onboarding-BCM8AGRg.js} +1 -1
- package/src/client/dist/pwa/assets/{vs-QND9VumP.js → vs-Ch3CDiTS.js} +3 -3
- package/src/client/dist/pwa/assets/{workers-CXEAdpVt.js → workers-CbIvH33O.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-DNCFiQ9N.js → xml-d-kArTuN.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-Ck1iNNOE.js → yaml-tzAPZ-1Q.js} +1 -1
- package/src/client/dist/pwa/index.html +1 -1
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/client/dist/pwa/assets/ClosePopup-DEy0yFXE.js +0 -1
- package/src/client/dist/pwa/assets/CreatePage-BhcHSOqz.js +0 -2
- package/src/client/dist/pwa/assets/CreatePage-RMBX-Zjn.css +0 -1
- package/src/client/dist/pwa/assets/GitPanel-DHvRFdbB.js +0 -3
- package/src/client/dist/pwa/assets/HealthPage-YqOn5Ig0.js +0 -1
- package/src/client/dist/pwa/assets/MainLayout-aDNwgrrT.js +0 -2
- package/src/client/dist/pwa/assets/QItemSection-CDBweQnA.js +0 -1
- package/src/client/dist/pwa/assets/QList-Ccqhimcb.js +0 -1
- package/src/client/dist/pwa/assets/SettingsPage-kx7aNmeH.js +0 -16
- package/src/client/dist/pwa/assets/TouchPan-DnEDaTFL.js +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-Cyoc2Mvs.js +0 -4
- package/src/client/dist/pwa/assets/efforts-C3gjASPy.js +0 -9
- package/src/client/dist/pwa/assets/engineFeatures-DkgYepOC.js +0 -1
- package/src/client/dist/pwa/assets/expand-template-CLqglUAa.js +0 -1
- package/src/client/dist/pwa/assets/i18n-C-chrpJN.js +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MainLayout-
|
|
2
|
-
import{n as e,t}from"./vue-i18n-C3W5i7h6.js";import{A as n,B as r,C as i,O as a,T as o,g as s,wt as c,x as l}from"./reactivity.esm-bundler-DtSZKRQB.js";import{$ as u,A as d,At as f,B as p,Bt as m,C as h,Et as g,H as _,It as v,Kt as y,Mt as b,Ot as x,Rt as S,Tt as C,U as w,V as T,W as E,Z as D,_n as O,fn as k,i as A,kt as ee,n as j,st as M,t as te,ut as N,vt as P}from"./runtime-dom.esm-bundler-DgevF6KV.js";import{$ as F,A as ne,B as re,D as ie,G as I,N as ae,O as L,R as oe,S as R,W as z,X as se,Y as ce,Z as B,b as le,et as ue,j as de,k as fe,l as pe,m as me,nt as he,o as ge,p as _e,q as ve,rt as ye,s as be,t as xe,tt as V,u as Se,w as Ce,x as we,z as Te}from"./QBtn-B7WFdfmy.js";import{t as Ee}from"./debounce-CDIE7CV6.js";import{C as De,D as Oe,E as ke,O as Ae,S as je,T as Me,a as Ne,g as Pe,h as Fe,i as Ie,k as Le,m as Re,o as ze,r as Be,s as Ve,t as He,u as Ue,w as We,x as Ge}from"./use-id-DlouqdB8.js";import{i as Ke,n as qe,r as Je}from"./private.use-form-D8Yuc3aU.js";import{a as Ye,i as Xe,n as Ze,r as Qe,t as $e}from"./use-checkbox-z-Qs4ZHY.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var et=[`sm`,`md`,`lg`,`xl`],{passive:tt}=z,nt=F({width:0,height:0,name:`xs`,sizes:{sm:600,md:1024,lg:1440,xl:1920},lt:{sm:!0,md:!0,lg:!0,xl:!0},gt:{xs:!1,sm:!1,md:!1,lg:!1},xs:!0,sm:!1,md:!1,lg:!1,xl:!1},{setSizes:I,setDebounce:I,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed){e.config.screen!==void 0&&(e.config.screen.bodyClasses?this.__update(!0):document.body.classList.remove(`screen--${this.name}`));return}let{visualViewport:n}=window,r=n||window,i=document.scrollingElement||document.documentElement,a=n===void 0||V.is.mobile?()=>[Math.max(window.innerWidth,i.clientWidth),Math.max(window.innerHeight,i.clientHeight)]:()=>[n.width*n.scale+window.innerWidth-i.clientWidth,n.height*n.scale+window.innerHeight-i.clientHeight],o=e.config.screen?.bodyClasses===!0;this.__update=e=>{let[t,n]=a();if(n!==this.height&&(this.height=n),t!==this.width)this.width=t;else if(e!==!0)return;let r=this.sizes;this.gt.xs=t>=r.sm,this.gt.sm=t>=r.md,this.gt.md=t>=r.lg,this.gt.lg=t>=r.xl,this.lt.sm=t<r.sm,this.lt.md=t<r.md,this.lt.lg=t<r.lg,this.lt.xl=t<r.xl,this.xs=this.lt.sm,this.sm=this.gt.xs&&this.lt.md,this.md=this.gt.sm&&this.lt.lg,this.lg=this.gt.md&&this.lt.xl,this.xl=this.gt.lg,r=this.xs&&`xs`||this.sm&&`sm`||this.md&&`md`||this.lg&&`lg`||`xl`,r!==this.name&&(o&&(document.body.classList.remove(`screen--${this.name}`),document.body.classList.add(`screen--${r}`)),this.name=r)};let s,c={},l=16;this.setSizes=e=>{et.forEach(t=>{e[t]!==void 0&&(c[t]=e[t])})},this.setDebounce=e=>{l=e};let u=()=>{let e=getComputedStyle(document.body);e.getPropertyValue(`--q-size-sm`)&&et.forEach(t=>{this.sizes[t]=Number.parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{et.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{s!==void 0&&r.removeEventListener(`resize`,s,tt),s=e>0?Ee(this.__update,e):this.__update,r.addEventListener(`resize`,s,tt)},this.setDebounce(l),Object.keys(c).length===0?this.__update():(this.setSizes(c),c=void 0),o&&this.name===`xs`&&document.body.classList.add(`screen--xs`)};he.value?t.push(u):u()}}),H=F({isActive:!1,mode:!1},{__media:void 0,set(e){H.mode=e,e===`auto`?(H.__media===void 0&&(H.__media=window.matchMedia(`(prefers-color-scheme: dark)`),H.__updateMedia=()=>{H.set(`auto`)},H.__media.addListener(H.__updateMedia)),e=H.__media.matches):H.__media!==void 0&&(H.__media.removeListener(H.__updateMedia),H.__media=void 0),H.isActive=e===!0,document.body.classList.remove(`body--${e===!0?`light`:`dark`}`),document.body.classList.add(`body--${e===!0?`dark`:`light`}`)},toggle(){H.set(!H.isActive)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,this.__installed||this.set(n!==void 0&&n)}});function rt(e,t,n=document.body){if(typeof e!=`string`)throw TypeError(`Expected a string as propName`);if(typeof t!=`string`)throw TypeError(`Expected a string as value`);if(!(n instanceof Element))throw TypeError(`Expected a DOM element`);n.style.setProperty(`--q-${e}`,t)}function it(e){if(e.ios)return`ios`;if(e.android)return`android`}function at({is:e,has:t,within:n},r){let i=[e.desktop?`desktop`:`mobile`,`${t.touch?``:`no-`}touch`];if(e.mobile){let t=it(e);t!==void 0&&i.push(`platform-`+t)}if(e.nativeMobile){let t=e.nativeMobileWrapper,n=r[t];i.push(t,`native-mobile`),e.ios&&(n===void 0||n.iosStatusBarPadding)?i.push(`q-ios-padding`):e.android&&(n===void 0||n.androidStatusBarPadding!==!1)&&i.push(`q-safe-area-padding`)}else e.electron?i.push(`electron`):e.bex&&i.push(`bex`);return n.iframe&&i.push(`within-iframe`),i}function ot(){let{is:e}=V,t=document.body.className,n=new Set(t.replaceAll(/ {2}/g,` `).split(` `));if(!e.nativeMobile&&!e.electron&&!e.bex){if(e.desktop)n.delete(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`),n.add(`desktop`);else if(e.mobile){n.delete(`desktop`),n.add(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`);let t=it(e);t!==void 0&&n.add(`platform-${t}`)}}V.has.touch&&(n.delete(`no-touch`),n.add(`touch`)),V.within.iframe&&n.add(`within-iframe`);let r=[...n].join(` `);t!==r&&(document.body.className=r)}function st(e){for(let t in e)rt(t,e[t])}var ct={install(e){if(!this.__installed){if(he.value)ot();else{let{$q:t}=e;t.config.brand!==void 0&&st(t.config.brand),document.body.classList.add(...at(V,t.config))}V.is.ios&&document.body.addEventListener(`touchstart`,I),window.addEventListener(`keydown`,Te,!0)}}},lt=()=>!0;function ut(e){return typeof e==`string`&&e!==``&&e!==`/`&&e!==`#/`}function dt(e){return e.startsWith(`#`)&&(e=e.slice(1)),e.startsWith(`/`)||(e=`/`+e),e.endsWith(`/`)&&(e=e.slice(0,-1)),`#`+e}function ft(e){if(e.backButtonExit===!1)return()=>!1;if(e.backButtonExit===`*`)return lt;let t=[`#/`];return Array.isArray(e.backButtonExit)&&t.push(...e.backButtonExit.filter(ut).map(dt)),()=>t.includes(window.location.hash)}var pt={__history:[],add:I,remove:I,install({$q:e}){if(this.__installed)return;let{cordova:t,capacitor:n}=V.is;if(!t&&!n)return;let r=e.config[t?`cordova`:`capacitor`];if(r?.backButton===!1||n&&(window.Capacitor===void 0||window.Capacitor.Plugins.App===void 0))return;this.add=e=>{e.condition===void 0&&(e.condition=lt),this.__history.push(e)},this.remove=e=>{let t=this.__history.indexOf(e);t!==-1&&this.__history.splice(t,1)};let i=ft({backButtonExit:!0,...r}),a=()=>{if(this.__history.length!==0){let e=this.__history.at(-1);e.condition()&&(this.__history.pop(),e.handler())}else i()?navigator.app.exitApp():window.history.back()};t?document.addEventListener(`deviceready`,()=>{document.addEventListener(`backbutton`,a,!1)}):window.Capacitor.Plugins.App.addListener(`backButton`,a)}},mt={isoName:`en-US`,nativeName:`English (US)`,label:{clear:`Clear`,ok:`OK`,cancel:`Cancel`,close:`Close`,set:`Set`,select:`Select`,reset:`Reset`,remove:`Remove`,update:`Update`,create:`Create`,search:`Search`,filter:`Filter`,refresh:`Refresh`,expand:e=>e?`Expand "${e}"`:`Expand`,collapse:e=>e?`Collapse "${e}"`:`Collapse`},date:{days:`Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday`.split(`_`),daysShort:`Sun_Mon_Tue_Wed_Thu_Fri_Sat`.split(`_`),months:`January_February_March_April_May_June_July_August_September_October_November_December`.split(`_`),monthsShort:`Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec`.split(`_`),firstDayOfWeek:0,format24h:!1,pluralDay:`days`,prevMonth:`Previous month`,nextMonth:`Next month`,prevYear:`Previous year`,nextYear:`Next year`,today:`Today`,prevRangeYears:e=>`Previous ${e} years`,nextRangeYears:e=>`Next ${e} years`},table:{noData:`No data available`,noResults:`No matching records found`,loading:`Loading...`,selectedRecords:e=>e===1?`1 record selected.`:(e===0?`No`:e)+` records selected.`,recordsPerPage:`Records per page:`,allRows:`All`,pagination:(e,t,n)=>e+`–`+t+` of `+n,columns:`Columns`},pagination:{first:`First page`,prev:`Previous page`,next:`Next page`,last:`Last page`},editor:{url:`URL`,bold:`Bold`,italic:`Italic`,strikethrough:`Strikethrough`,underline:`Underline`,unorderedList:`Unordered List`,orderedList:`Ordered List`,subscript:`Subscript`,superscript:`Superscript`,hyperlink:`Hyperlink`,toggleFullscreen:`Toggle Fullscreen`,quote:`Quote`,left:`Left align`,center:`Center align`,right:`Right align`,justify:`Justify align`,print:`Print`,outdent:`Decrease indentation`,indent:`Increase indentation`,removeFormat:`Remove formatting`,formatting:`Formatting`,fontSize:`Font Size`,align:`Align`,hr:`Insert Horizontal Rule`,undo:`Undo`,redo:`Redo`,heading1:`Heading 1`,heading2:`Heading 2`,heading3:`Heading 3`,heading4:`Heading 4`,heading5:`Heading 5`,heading6:`Heading 6`,paragraph:`Paragraph`,code:`Code`,size1:`Very small`,size2:`A bit small`,size3:`Normal`,size4:`Medium-large`,size5:`Big`,size6:`Very big`,size7:`Maximum`,defaultFont:`Default Font`,viewSource:`View Source`},tree:{noNodes:`No nodes available`,noResults:`No matching nodes found`}};function ht(){let e=Array.isArray(navigator.languages)&&navigator.languages.length!==0?navigator.languages[0]:navigator.language;if(typeof e==`string`)return e.split(/[-_]/).map((e,t)=>t===0?e.toLowerCase():t>1||e.length<4?e.toUpperCase():e[0].toUpperCase()+e.slice(1).toLowerCase()).join(`-`)}var gt=F({__qLang:{}},{getLocale:ht,set(e=mt,t){let n={...e,rtl:e.rtl===!0,getLocale:ht};if(n.set=gt.set,gt.__langConfig===void 0||!gt.__langConfig.noHtmlAttrs){let e=document.documentElement;e.setAttribute(`dir`,n.rtl?`rtl`:`ltr`),e.setAttribute(`lang`,n.isoName)}Object.assign(gt.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=gt.__qLang,gt.__langConfig=e.config.lang,this.__installed?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qLang,{get:Reflect.get,ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`&&e!==`getLocale`)}}),this.set(t||mt))}}),_t={name:`material-icons`,type:{positive:`check_circle`,negative:`warning`,info:`info`,warning:`priority_high`},arrow:{up:`arrow_upward`,right:`arrow_forward`,down:`arrow_downward`,left:`arrow_back`,dropdown:`arrow_drop_down`},chevron:{left:`chevron_left`,right:`chevron_right`},colorPicker:{spectrum:`gradient`,tune:`tune`,palette:`style`},pullToRefresh:{icon:`refresh`},carousel:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`,navigationIcon:`lens`},chip:{remove:`cancel`,selected:`check`},datetime:{arrowLeft:`chevron_left`,arrowRight:`chevron_right`,now:`access_time`,today:`today`},editor:{bold:`format_bold`,italic:`format_italic`,strikethrough:`strikethrough_s`,underline:`format_underlined`,unorderedList:`format_list_bulleted`,orderedList:`format_list_numbered`,subscript:`vertical_align_bottom`,superscript:`vertical_align_top`,hyperlink:`link`,toggleFullscreen:`fullscreen`,quote:`format_quote`,left:`format_align_left`,center:`format_align_center`,right:`format_align_right`,justify:`format_align_justify`,print:`print`,outdent:`format_indent_decrease`,indent:`format_indent_increase`,removeFormat:`format_clear`,formatting:`text_format`,fontSize:`format_size`,align:`format_align_left`,hr:`remove`,undo:`undo`,redo:`redo`,heading:`format_size`,code:`code`,size:`format_size`,font:`font_download`,viewSource:`code`},expansionItem:{icon:`keyboard_arrow_down`,denseIcon:`arrow_drop_down`},fab:{icon:`add`,activeIcon:`close`},field:{clear:`cancel`,error:`error`},pagination:{first:`first_page`,prev:`keyboard_arrow_left`,next:`keyboard_arrow_right`,last:`last_page`},rating:{icon:`grade`},stepper:{done:`check`,active:`edit`,error:`warning`},tabs:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`},table:{arrowUp:`arrow_upward`,warning:`warning`,firstPage:`first_page`,prevPage:`chevron_left`,nextPage:`chevron_right`,lastPage:`last_page`},tree:{icon:`play_arrow`},uploader:{done:`done`,clear:`clear`,add:`add_box`,upload:`cloud_upload`,removeQueue:`clear_all`,removeUploaded:`done_all`}},vt=F({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=vt.set,Object.assign(vt.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){e.config.iconMapFn!==void 0&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,ye(e,`iconMapFn`,()=>this.iconMapFn,e=>{this.iconMapFn=e}),this.__installed?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get:Reflect.get,ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`)}}),this.set(t||_t))}});function yt(e,t){if(e===t)return!0;if(e!==null&&t!==null&&typeof e==`object`&&typeof t==`object`){if(e.constructor!==t.constructor)return!1;let n,r;if(e.constructor===Array){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!yt(e[r],t[r]))return!1;return!0}if(e.constructor===Map){if(e.size!==t.size)return!1;let n=e.entries();for(r=n.next();!r.done;){if(!t.has(r.value[0]))return!1;r=n.next()}for(n=e.entries(),r=n.next();!r.done;){if(!yt(r.value[1],t.get(r.value[0])))return!1;r=n.next()}return!0}if(e.constructor===Set){if(e.size!==t.size)return!1;let n=e.entries();for(r=n.next();!r.done;){if(!t.has(r.value[0]))return!1;r=n.next()}return!0}if(e.buffer!=null&&e.buffer.constructor===ArrayBuffer){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();let i=Object.keys(e).filter(t=>e[t]!==void 0);if(n=i.length,n!==Object.keys(t).filter(e=>t[e]!==void 0).length)return!1;for(r=n;r--!==0;){let n=i[r];if(!yt(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}function U(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function bt(e){return typeof e==`number`&&Number.isFinite(e)}var xt=[ue,ct,H,nt,pt,gt,vt];function St(e,t){let n=A(e);n.config.globalProperties=t.config.globalProperties;let{reload:r,...i}=t._context;return Object.assign(n._context,i),n}function Ct(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}function wt(e,t,n){e.config.globalProperties.$q=n.$q,e.provide(`_q_`,n.$q),Ct(n,xt),t.components!==void 0&&Object.values(t.components).forEach(t=>{U(t)&&t.name!==void 0&&e.component(t.name,t)}),t.directives!==void 0&&Object.values(t.directives).forEach(t=>{U(t)&&t.name!==void 0&&e.directive(t.name,t)}),t.plugins!==void 0&&Ct(n,Object.values(t.plugins).filter(e=>typeof e.install==`function`&&!xt.includes(e))),he.value&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}var Tt={name:`Quasar`,version:`2.24.0`,install:function(e,t={}){let n={version:`2.24.0`};de?n.config=t.config||{}:(t.config!==void 0&&Object.assign(ne,t.config),n.config={...ne},fe()),wt(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})},lang:gt,iconSet:vt},W=B({name:`QCardSection`,props:{tag:{type:String,default:`div`},horizontal:Boolean},setup(e,{slots:t}){let n=p(()=>`q-card__section q-card__section--${e.horizontal?`horiz row no-wrap`:`vert`}`);return()=>N(e.tag,{class:n.value},R(t.default))}}),Et={xs:2,sm:4,md:6,lg:10,xl:14};function Dt(e){return{transform:`scale3d(${e},1,1)`}}var Ot=B({name:`QLinearProgress`,props:{...Le,...L,value:{type:Number,default:0},buffer:Number,color:String,trackColor:String,reverse:Boolean,stripe:Boolean,indeterminate:Boolean,query:Boolean,rounded:Boolean,animationSpeed:{type:[String,Number],default:2100},instantFeedback:Boolean},setup(e,{slots:t}){let{proxy:n}=M(),r=Ae(e,n.$q),i=ie(e,Et),a=p(()=>e.indeterminate||e.query),o=p(()=>({...i.value===null?{}:i.value,"--q-linear-progress-speed":`${e.animationSpeed}ms`})),s=p(()=>`q-linear-progress`+(e.color===void 0?``:` text-${e.color}`)+(e.reverse||e.query?` q-linear-progress--reverse`:``)+(e.rounded?` rounded-borders`:``)),c=p(()=>Dt(e.buffer===void 0?1:e.buffer)),l=p(()=>`with${e.instantFeedback?`out`:``}-transition`),u=p(()=>`q-linear-progress__track absolute-full q-linear-progress__track--${l.value} q-linear-progress__track--${r.value?`dark`:`light`}`+(e.trackColor===void 0?``:` bg-${e.trackColor}`)),d=p(()=>Dt(a.value?1:e.value)),f=p(()=>`q-linear-progress__model absolute-full q-linear-progress__model--${l.value} q-linear-progress__model--${a.value?`in`:``}determinate`),m=p(()=>({width:`${e.value*100}%`})),h=p(()=>`q-linear-progress__stripe absolute-${e.reverse?`right`:`left`} q-linear-progress__stripe--${l.value}`);return()=>{let n=[N(`div`,{class:u.value,style:c.value}),N(`div`,{class:f.value,style:d.value})];return e.stripe&&!a.value&&n.push(N(`div`,{class:h.value,style:m.value})),N(`div`,{class:s.value,style:o.value,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":e.indeterminate?void 0:e.value},le(t.default,n))}}}),kt=B({name:`QCard`,props:{...Le,tag:{type:String,default:`div`},square:Boolean,flat:Boolean,bordered:Boolean},setup(e,{slots:t}){let{proxy:{$q:n}}=M(),r=Ae(e,n),i=p(()=>`q-card`+(r.value?` q-card--dark q-dark`:``)+(e.bordered?` q-card--bordered`:``)+(e.square?` q-card--square no-border-radius`:``)+(e.flat?` q-card--flat no-shadow`:``));return()=>N(e.tag,{class:i.value},R(t.default))}});function At(e,t,n){let r;function i(){r!==void 0&&(pt.remove(r),r=void 0)}return x(()=>{e.value&&i()}),{removeFromHistory:i,addToHistory(){r={condition:()=>n.value,handler:t},pt.add(r)}}}var jt=0,Mt,Nt,Pt,Ft=!1,It,Lt,Rt,zt=null;function Bt(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function Vt(e){Ft||(Ft=!0,requestAnimationFrame(()=>{Ft=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:r}=document.scrollingElement;(Pt===void 0||t!==window.innerHeight)&&(Pt=n-t,document.scrollingElement.scrollTop=r),r>Pt&&(document.scrollingElement.scrollTop-=Math.ceil((r-Pt)/8))}))}function Ht(e){let t=document.body,n=window.visualViewport!==void 0;if(e===`add`){let{overflowY:e,overflowX:r}=window.getComputedStyle(t);Mt=Ve(window),Nt=Ue(window),It=t.style.left,Lt=t.style.top,Rt=window.location.pathname,t.style.left=`-${Mt}px`,t.style.top=`-${Nt}px`,r!==`hidden`&&(r===`scroll`||t.scrollWidth>window.innerWidth)&&t.classList.add(`q-body--force-scrollbar-x`),e!==`hidden`&&(e===`scroll`||t.scrollHeight>window.innerHeight)&&t.classList.add(`q-body--force-scrollbar-y`),document.documentElement.classList.add(`q-document--prevent-scroll`),document.qScrollPrevented=!0,V.is.ios&&(n?(window.scrollTo(0,0),window.visualViewport.addEventListener(`resize`,Vt,z.passiveCapture),window.visualViewport.addEventListener(`scroll`,Vt,z.passiveCapture),window.scrollTo(0,0)):window.addEventListener(`scroll`,Bt,z.passiveCapture))}else V.is.ios&&(n?(window.visualViewport.removeEventListener(`resize`,Vt,z.passiveCapture),window.visualViewport.removeEventListener(`scroll`,Vt,z.passiveCapture)):window.removeEventListener(`scroll`,Bt,z.passiveCapture)),document.documentElement.classList.remove(`q-document--prevent-scroll`),t.classList.remove(`q-body--force-scrollbar-x`,`q-body--force-scrollbar-y`),document.qScrollPrevented=!1,t.style.left=It,t.style.top=Lt,window.location.pathname===Rt&&window.scrollTo(Mt,Nt),Pt=void 0}function Ut(e){let t=`add`;if(e===!0){if(jt++,zt!==null){clearTimeout(zt),zt=null;return}if(jt>1)return}else{if(jt===0||(jt--,jt>0))return;if(t=`remove`,V.is.ios&&V.is.nativeMobile){zt!==null&&clearTimeout(zt),zt=setTimeout(()=>{Ht(t),zt=null},100);return}}Ht(t)}function Wt(){let e;return{preventBodyScroll(t){t!==e&&(e!==void 0||t)&&(e=t,Ut(t))}}}var Gt=[];function Kt(e){Gt.at(-1)(e)}function qt(e){V.is.desktop&&(Gt.push(e),Gt.length===1&&document.body.addEventListener(`focusin`,Kt))}function Jt(e){let t=Gt.indexOf(e);t!==-1&&(Gt.splice(t,1),Gt.length===0&&document.body.removeEventListener(`focusin`,Kt))}var Yt=new Map;function Xt(e){for(let[t,n]of Yt)if(n.$el.contains(e)===!0)return t}function Zt(e,t){if(e==null)return!1;let n=new Set;for(let r=Xt(t);r!==void 0&&n.has(r)===!1;r=Xt(r)){if(Se(e,r)===!0)return!0;n.add(r)}return!1}var Qt=0,$t={standard:`fixed-full flex-center`,top:`fixed-top justify-center`,bottom:`fixed-bottom justify-center`,right:`fixed-right items-center`,left:`fixed-left items-center`},en={standard:[`scale`,`scale`],top:[`slide-down`,`slide-up`],bottom:[`slide-up`,`slide-down`],right:[`slide-left`,`slide-right`],left:[`slide-right`,`slide-left`]},tn=B({name:`QDialog`,inheritAttrs:!1,props:{...Me,...je,transitionShow:String,transitionHide:String,persistent:Boolean,autoClose:Boolean,allowFocusOutside:Boolean,noEscDismiss:Boolean,noBackdropDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,noShake:Boolean,seamless:Boolean,maximized:Boolean,fullWidth:Boolean,fullHeight:Boolean,square:Boolean,backdropFilter:String,position:{type:String,default:`standard`,validator:e=>[`standard`,`top`,`bottom`,`left`,`right`].includes(e)}},emits:[...We,`shake`,`click`,`escapeKey`],setup(e,{slots:t,emit:n,attrs:r}){let a=M(),o=i(null),s=i(!1),c=i(!1),l=null,u=null,d=!1,f=!1,m=p(()=>!e.persistent&&!e.noRouteDismiss&&!e.seamless),{preventBodyScroll:h}=Wt(),{registerTimeout:g}=Oe(),{registerTick:_,removeTick:v}=ke(),{transitionProps:y,transitionStyle:b}=Ge(e,()=>en[e.position][0],()=>en[e.position][1]),S=p(()=>b.value+(e.backdropFilter===void 0?``:`;backdrop-filter:${e.backdropFilter};-webkit-backdrop-filter:${e.backdropFilter}`)),{showPortal:C,hidePortal:w,portalIsAccessible:T,renderPortal:E}=Re(a,o,le,`dialog`),{hide:D}=De({showing:s,hideOnRouteChange:m,handleShow:ne,handleHide:re,handleRouteChange:ie,processOnMount:!0}),{addToHistory:O,removeFromHistory:A}=At(s,D,m),ee=p(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${e.maximized?`maximized`:`minimized`} q-dialog__inner--${e.position} ${$t[e.position]}`+(c.value?` q-dialog__inner--animating`:``)+(e.fullWidth?` q-dialog__inner--fullwidth`:``)+(e.fullHeight?` q-dialog__inner--fullheight`:``)+(e.square?` q-dialog__inner--square`:``)),j=p(()=>s.value&&!e.seamless),P=p(()=>e.autoClose?{onClick:se}:{}),F=p(()=>[`q-dialog fullscreen no-pointer-events q-dialog--${j.value?`modal`:`seamless`}`,r.class]);k(()=>e.maximized,e=>{s.value&&z(e)}),k(j,e=>{h(e),e?(qt(B),Ne(L)):(Jt(B),ze(L))});function ne(t){O(),u=!e.noRefocus&&document.activeElement!==null?document.activeElement:null,z(e.maximized),C(),c.value=!0,e.noFocus?v():(document.activeElement?.blur(),_(I)),g(()=>{if(a.proxy.$q.platform.is.ios){if(!e.seamless&&document.activeElement){let{top:e,bottom:t}=document.activeElement.getBoundingClientRect(),{innerHeight:n}=window,r=window.visualViewport===void 0?n:window.visualViewport.height;e>0&&t>r/2&&(document.scrollingElement.scrollTop=Math.min(document.scrollingElement.scrollHeight-r,t>=n?1/0:Math.ceil(document.scrollingElement.scrollTop+t-r/2))),document.activeElement.scrollIntoView()}f=!0,o.value.click(),f=!1}C(!0),c.value=!1,n(`show`,t)},e.transitionDuration)}function re(t){if(v(),A(),oe(!0),c.value=!0,w(),u!==null){let e=(t?.type.indexOf(`key`)===0?u.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||u;u=null,Fe(()=>{e.isConnected&&e.focus({preventScroll:!0})})}g(()=>{w(!0),c.value=!1,n(`hide`,t)},e.transitionDuration)}function ie(){u=null}function I(e){Fe(()=>{let t=o.value;if(t!==null){if(e!==void 0){let n=t.querySelector(e);if(n!==null){n.focus({preventScroll:!0});return}}t.contains(document.activeElement)||(t=t.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||t.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||t.querySelector(`[autofocus], [data-autofocus]`)||t,t.focus({preventScroll:!0}))}})}function ae(e){e&&typeof e.focus==`function`?e.focus({preventScroll:!0}):I(),n(`shake`);let t=o.value;t!==null&&(t.classList.remove(`q-animate--scale`),t.classList.add(`q-animate--scale`),l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,o.value!==null&&(t.classList.remove(`q-animate--scale`),I())},170))}function L(){e.seamless||(e.persistent||e.noEscDismiss?!e.maximized&&!e.noShake&&ae():(n(`escapeKey`),D()))}function oe(t){l!==null&&(clearTimeout(l),l=null),(t||s.value)&&(z(!1),e.seamless||(h(!1),Jt(B),ze(L))),t||(u=null)}function z(e){e?d||=(Qt<1&&document.body.classList.add(`q-body--dialog`),Qt++,!0):d&&=(Qt<2&&document.body.classList.remove(`q-body--dialog`),Qt--,!1)}function se(e){f||(D(e),n(`click`,e))}function ce(t){!e.persistent&&!e.noBackdropDismiss?D(t):e.noShake||ae()}function B(t){!e.allowFocusOutside&&T.value&&!Se(o.value,t.target)&&!Zt(o.value,t.target)&&I(`[tabindex]:not([tabindex="-1"])`)}Object.assign(a.proxy,{focus:I,shake:ae,__updateRefocusTarget(e){u=e||null}}),x(oe);function le(){return N(`div`,{role:`dialog`,"aria-modal":j.value?`true`:`false`,...r,class:F.value},[N(te,{name:`q-transition--fade`,appear:!0},()=>j.value?N(`div`,{class:`q-dialog__backdrop fixed-full`,style:S.value,"aria-hidden":`true`,onClick:ce}):null),N(te,y.value,()=>s.value?N(`div`,{ref:o,class:ee.value,style:b.value,tabindex:-1,...P.value},R(t.default)):null)])}return E}});function nn(e){"@babel/helpers - typeof";return nn=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},nn(e)}function rn(e,t){if(nn(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(nn(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function an(e){var t=rn(e,`string`);return nn(t)==`symbol`?t:t+``}function on(e,t,n){return(t=an(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var sn=Ie(`migration`,()=>{let e=i({state:`idle`});async function t(){try{let t=await fetch(`/api/migration/status`);if(!t.ok)return;e.value=await t.json()}catch{}}function n(t){e.value={...t}}return{status:e,fetchInitial:t,update:n}}),cn={class:`text-h6`},ln={class:`text-h6`},un={class:`text-h6 text-negative`},dn={class:`q-mt-sm`},fn={key:0,class:`q-mt-md text-caption`},pn={class:`q-mt-md text-caption`},mn=u({__name:`MigrationOverlay`,setup(t){let{t:n}=e(),i=sn(),a=p(()=>[`backing-up`,`running`,`error`].includes(i.status.state));return b(()=>{i.fetchInitial()}),(e,t)=>(S(),_(tn,{modelValue:a.value,"onUpdate:modelValue":t[0]||=e=>a.value=e,persistent:``,"no-backdrop-dismiss":``},{default:O(()=>[D(kt,{style:{"min-width":`400px`}},{default:O(()=>[r(i).status.state===`backing-up`?(S(),_(W,{key:0},{default:O(()=>[T(`div`,cn,c(r(n)(`migration.backing_up`)),1),D(Ce,{class:`q-mt-md`})]),_:1})):r(i).status.state===`running`?(S(),_(W,{key:1},{default:O(()=>[T(`div`,ln,c(r(n)(`migration.running`,{processed:r(i).status.processed,total:r(i).status.total})),1),D(Ot,{value:r(i).status.total>0?r(i).status.processed/r(i).status.total:0,class:`q-mt-md`},null,8,[`value`])]),_:1})):r(i).status.state===`error`?(S(),_(W,{key:2},{default:O(()=>[T(`div`,un,c(r(n)(`migration.error`)),1),T(`div`,dn,c(r(i).status.errorMessage),1),r(i).status.backupPath?(S(),E(`div`,fn,c(r(n)(`migration.backup_location`,{path:r(i).status.backupPath})),1)):w(``,!0),T(`div`,pn,c(r(n)(`migration.retry`)),1)]),_:1})):w(``,!0)]),_:1})]),_:1},8,[`modelValue`]))}}),hn=/^on[A-Z]/;function gn(){let e=M(),{attrs:t}=e,n={listeners:i({}),attributes:i({})};function r(){let r={},i={};for(let e in t)e!==`class`&&e!==`style`&&!hn.test(e)&&(r[e]=t[e]);for(let t in e.vnode.props)hn.test(t)&&(i[t]=e.vnode.props[t]);n.attributes.value=r,n.listeners.value=i}return ee(r),r(),n}function _n({validate:e,resetValidation:t,requiresQForm:n}){let r=P(ae,!1);if(r!==!1){let{props:n,proxy:i}=M();Object.assign(i,{validate:e,resetValidation:t}),k(()=>n.disable,e=>{e?(typeof t==`function`&&t(),r.unbindComponent(i)):r.bindComponent(i)}),b(()=>{n.disable||r.bindComponent(i)}),x(()=>{n.disable||r.unbindComponent(i)})}else n&&console.error(`Parent QForm not found on useFormChild()!`)}var vn=/^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/,yn=/^#[0-9a-fA-F]{4}([0-9a-fA-F]{4})?$/,bn=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,xn=/^rgb\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5])\)$/,Sn=/^rgba\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),(0(\.[\d]+)?|1(\.0+)?)\)$/,Cn=/^-?[\d]+\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])$/,wn=/^([0-1]?\d|2[0-3]):[0-5]\d$/,Tn=/^([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/,En=/^([0-1]?\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/,Dn=/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,On={date:e=>Cn.test(e),time:e=>wn.test(e),fulltime:e=>Tn.test(e),timeOrFulltime:e=>En.test(e),email:e=>Dn.test(e),hexColor:e=>vn.test(e),hexaColor:e=>yn.test(e),hexOrHexaColor:e=>bn.test(e),rgbColor:e=>xn.test(e),rgbaColor:e=>Sn.test(e),rgbOrRgbaColor:e=>xn.test(e)||Sn.test(e),hexOrRgbColor:e=>vn.test(e)||xn.test(e),hexaOrRgbaColor:e=>yn.test(e)||Sn.test(e),anyColor:e=>bn.test(e)||xn.test(e)||Sn.test(e)},kn=[!0,!1,`ondemand`],An={modelValue:{},error:{type:Boolean,default:null},errorMessage:String,noErrorIcon:Boolean,rules:Array,reactiveRules:Boolean,lazyRules:{type:[Boolean,String],default:!1,validator:e=>kn.includes(e)}};function jn(e,t){let{props:n,proxy:r}=M(),a=i(!1),o=i(null),s=i(!1);_n({validate:_,resetValidation:g});let c=0,l,u=p(()=>n.rules!==void 0&&n.rules!==null&&n.rules.length!==0),d=p(()=>!n.disable&&u.value&&!t.value),f=p(()=>n.error===!0||a.value),m=p(()=>typeof n.errorMessage==`string`&&n.errorMessage.length!==0?n.errorMessage:o.value);k(()=>n.modelValue,()=>{s.value=!0,d.value&&n.lazyRules===!1&&v()});function h(){n.lazyRules!==`ondemand`&&d.value&&s.value&&v()}k(()=>n.reactiveRules,e=>{e?l===void 0&&(l=k(()=>n.rules,h,{immediate:!0,deep:!0})):l!==void 0&&(l(),l=void 0)},{immediate:!0}),k(()=>n.lazyRules,h),k(e,e=>{e?s.value=!0:d.value&&n.lazyRules!==`ondemand`&&v()});function g(){c++,t.value=!1,s.value=!1,a.value=!1,o.value=null,v.cancel()}function _(e=n.modelValue){if(n.disable||!u.value)return!0;let r=++c,i=t.value?()=>{}:()=>{s.value=!0},l=(e,n)=>{e&&i(),a.value=e,o.value=n||null,t.value=!1},d=[];for(let t=0;t<n.rules.length;t++){let r=n.rules[t],i;if(typeof r==`function`?i=r(e,On):typeof r==`string`&&(On[r]===void 0?(console.error(`Unknown validation pattern rule: "${r}"`),i=!1):i=On[r](e)),i===!1||typeof i==`string`)return l(!0,i),!1;i!==!0&&i!==void 0&&d.push(i)}return d.length===0?(l(!1),!0):(t.value=!0,Promise.all(d).then(e=>{if(e===void 0||!Array.isArray(e)||e.length===0)return r===c&&l(!1),!0;let t=e.find(e=>e===!1||typeof e==`string`);return r===c&&l(t!==void 0,t),t===void 0},e=>(r===c&&(console.error(e),l(!0)),!1)))}let v=Ee(_,0);return x(()=>{l?.(),v.cancel()}),Object.assign(r,{resetValidation:g,validate:_}),ye(r,`hasError`,()=>f.value),{isDirtyModel:s,hasRules:u,hasError:f,errorMessage:m,validate:_,resetValidation:g}}function Mn(e){return e!=null&&String(e).length!==0}var Nn={...Le,...An,label:String,stackLabel:Boolean,hint:String,hideHint:Boolean,prefix:String,suffix:String,labelColor:String,color:String,bgColor:String,filled:Boolean,outlined:Boolean,borderless:Boolean,standout:[Boolean,String],square:Boolean,loading:Boolean,labelSlot:Boolean,bottomSlots:Boolean,hideBottomSpace:Boolean,rounded:Boolean,dense:Boolean,itemAligned:Boolean,counter:Boolean,clearable:Boolean,clearIcon:String,disable:Boolean,readonly:Boolean,autofocus:Boolean,for:String,maxlength:[Number,String]},Pn=[`update:modelValue`,`clear`,`focus`,`blur`];function Fn({requiredForAttr:e=!0,tagProp:t,changeEvent:n=!1}={}){let{props:r,proxy:a}=M(),o=Ae(r,a.$q),s=He({required:e,getValue:()=>r.for});return{requiredForAttr:e,changeEvent:n,tag:t?p(()=>r.tag):{value:`label`},isDark:o,editable:p(()=>!r.disable&&!r.readonly),innerLoading:i(!1),focused:i(!1),hasPopupOpen:!1,splitAttrs:gn(),targetUid:s,rootRef:i(null),targetRef:i(null),controlRef:i(null)}}function In(e,t){return t===null?null:N(`div`,{key:e,class:`q-field__append q-field__marginal row no-wrap items-center q-anchor--skip`},t)}function Ln(e){let{props:t,emit:n,slots:r,attrs:i,proxy:a}=M(),{$q:o}=a,s=null;e.hasValue===void 0&&(e.hasValue=p(()=>Mn(t.modelValue))),e.emitValue===void 0&&(e.emitValue=e=>{n(`update:modelValue`,e)}),e.controlEvents===void 0&&(e.controlEvents={onFocusin:ee,onFocusout:j}),Object.assign(e,{clearValue:P,onControlFocusin:ee,onControlFocusout:j,focus:k}),e.computedCounter===void 0&&(e.computedCounter=p(()=>{if(t.counter){let e=typeof t.modelValue==`string`||typeof t.modelValue==`number`?String(t.modelValue).length:Array.isArray(t.modelValue)?t.modelValue.length:0,n=t.maxlength===void 0?t.maxValues:t.maxlength;return e+(n===void 0?``:` / `+n)}}));let{isDirtyModel:c,hasRules:l,hasError:u,errorMessage:d,resetValidation:m}=jn(e.focused,e.innerLoading),h=e.floatingLabel===void 0?p(()=>t.stackLabel||e.focused.value||e.hasValue.value):p(()=>t.stackLabel||e.focused.value||e.floatingLabel.value),_=p(()=>t.bottomSlots||t.hint!==void 0||l.value||t.counter||t.error!==null),v=p(()=>t.filled?`filled`:t.outlined?`outlined`:t.borderless?`borderless`:t.standout?`standout`:`standard`),y=p(()=>`q-field row no-wrap items-start q-field--${v.value}`+(e.fieldClass===void 0?``:` ${e.fieldClass.value}`)+(t.rounded?` q-field--rounded`:``)+(t.square?` q-field--square`:``)+(h.value?` q-field--float`:``)+(w.value?` q-field--labeled`:``)+(t.dense?` q-field--dense`:``)+(t.itemAligned?` q-field--item-aligned q-item-type`:``)+(e.isDark.value?` q-field--dark`:``)+(e.getControl===void 0?` q-field--auto-height`:``)+(e.focused.value?` q-field--focused`:``)+(u.value?` q-field--error`:``)+(u.value||e.focused.value?` q-field--highlighted`:``)+(!t.hideBottomSpace&&_.value?` q-field--with-bottom`:``)+(t.disable?` q-field--disabled`:t.readonly?` q-field--readonly`:``)),S=p(()=>`q-field__control relative-position row no-wrap`+(t.bgColor===void 0?``:` bg-${t.bgColor}`)+(u.value?` text-negative`:typeof t.standout==`string`&&t.standout.length!==0&&e.focused.value?` ${t.standout}`:t.color===void 0?``:` text-${t.color}`)),w=p(()=>t.labelSlot||t.label!==void 0),T=p(()=>`q-field__label no-pointer-events absolute ellipsis`+(t.labelColor!==void 0&&!u.value?` text-${t.labelColor}`:``)),E=p(()=>ye({id:e.targetUid.value,editable:e.editable.value,focused:e.focused.value,floatingLabel:h.value,modelValue:t.modelValue,emitValue:e.emitValue},`field`,()=>e.rootRef.value)),D=p(()=>{let n={};return e.targetUid.value&&(n.for=e.targetUid.value),t.disable&&(n[`aria-disabled`]=`true`),n});function O(){let t=document.activeElement,n=e.targetRef?.value;n&&(t===null||t.id!==e.targetUid.value)&&(n.hasAttribute(`tabindex`)||(n=n.querySelector(`[tabindex]`)),n!==t&&n?.focus({preventScroll:!0}))}function k(){Fe(O)}function A(){Pe(O);let t=document.activeElement;t!==null&&e.rootRef.value.contains(t)&&t.blur()}function ee(t){s!==null&&(clearTimeout(s),s=null),e.editable.value&&!e.focused.value&&(e.focused.value=!0,n(`focus`,t))}function j(t,r){s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null,!(document.hasFocus()&&(e.hasPopupOpen||e.controlRef===void 0||e.controlRef.value===null||e.controlRef.value.contains(document.activeElement)))&&(e.focused.value&&(e.focused.value=!1,n(`blur`,t)),r?.())},0)}function P(r){se(r),o.platform.is.mobile?e.rootRef.value.contains(document.activeElement)&&document.activeElement.blur():(e.targetRef?.value||e.rootRef.value).focus(),t.type===`file`&&(e.inputRef.value.value=null),e.onClear?.(),n(`update:modelValue`,null),e.changeEvent&&n(`change`,null),n(`clear`,t.modelValue),C(()=>{let e=c.value;m(),c.value=e})}function F(e){[13,32].includes(e.keyCode)&&P(e)}function ne(){let n=[];return r.prepend!==void 0&&n.push(N(`div`,{class:`q-field__prepend q-field__marginal row no-wrap items-center`,key:`prepend`,onClick:ve},r.prepend())),n.push(N(`div`,{class:`q-field__control-container col relative-position row no-wrap q-anchor--skip`},re())),u.value&&!t.noErrorIcon&&n.push(In(`error`,[N(pe,{name:o.iconSet.field.error,color:`negative`})])),t.loading||e.innerLoading.value?n.push(In(`inner-loading-append`,r.loading===void 0?[N(Ce,{color:t.color})]:r.loading())):t.clearable&&e.hasValue.value&&e.editable.value&&n.push(In(`inner-clearable-append`,[N(pe,{class:`q-field__focusable-action`,name:t.clearIcon||o.iconSet.field.clear,tabindex:0,role:`button`,"aria-hidden":`false`,"aria-label":o.lang.label.clear,onKeyup:F,onClick:P})])),r.append!==void 0&&n.push(N(`div`,{class:`q-field__append q-field__marginal row no-wrap items-center`,key:`append`,onClick:ve},r.append())),e.getInnerAppend!==void 0&&n.push(In(`inner-append`,e.getInnerAppend())),e.getControlChild!==void 0&&n.push(e.getControlChild()),n}function re(){let n=[];return t.prefix!==void 0&&t.prefix!==null&&n.push(N(`div`,{class:`q-field__prefix no-pointer-events row items-center`},t.prefix)),e.getShadowControl!==void 0&&e.hasShadow.value&&n.push(e.getShadowControl()),w.value&&n.push(N(`div`,{class:T.value},R(r.label,t.label))),e.getControl===void 0?r.rawControl===void 0?r.control!==void 0&&n.push(N(`div`,{ref:e.targetRef,class:`q-field__native row`,tabindex:-1,...e.splitAttrs.attributes.value,"data-autofocus":t.autofocus||void 0},r.control(E.value))):n.push(r.rawControl()):n.push(e.getControl()),t.suffix!==void 0&&t.suffix!==null&&n.push(N(`div`,{class:`q-field__suffix no-pointer-events row items-center`},t.suffix)),n.concat(R(r.default))}function ie(){let n,i;u.value?d.value===null?(n=R(r.error),i=`q--slot-error`):(n=[N(`div`,{role:`alert`},d.value)],i=`q--slot-error-${d.value}`):(!t.hideHint||e.focused.value)&&(t.hint===void 0?(n=R(r.hint),i=`q--slot-hint`):(n=[N(`div`,t.hint)],i=`q--slot-hint-${t.hint}`));let a=t.counter||r.counter!==void 0;if(t.hideBottomSpace&&!a&&n===void 0)return;let o=N(`div`,{key:i,class:`q-field__messages col`},n);return N(`div`,{class:`q-field__bottom row items-start q-field__bottom--`+(t.hideBottomSpace?`stale`:`animated`),onClick:ve},[t.hideBottomSpace?o:N(te,{name:`q-transition--field-message`},()=>o),a?N(`div`,{class:`q-field__counter`},r.counter===void 0?e.computedCounter.value:r.counter()):null])}let I=!1;return f(()=>{I=!0}),g(()=>{I&&t.autofocus&&a.focus()}),t.autofocus&&b(()=>{a.focus()}),x(()=>{s!==null&&clearTimeout(s)}),Object.assign(a,{focus:k,blur:A}),function(){let n=e.getControl===void 0&&r.control===void 0?{...e.splitAttrs.attributes.value,"data-autofocus":t.autofocus||void 0,...D.value}:D.value;return N(e.tag.value,{ref:e.rootRef,class:[y.value,i.class],style:i.style,...n},[r.before===void 0?null:N(`div`,{class:`q-field__before q-field__marginal row no-wrap items-center`,onClick:ve},r.before()),N(`div`,{class:`q-field__inner relative-position col self-stretch`},[N(`div`,{ref:e.controlRef,class:S.value,tabindex:-1,...e.controlEvents},ne()),_.value?ie():null]),r.after===void 0?null:N(`div`,{class:`q-field__after q-field__marginal row no-wrap items-center`,onClick:ve},r.after())])}}var Rn={date:`####/##/##`,datetime:`####/##/## ##:##`,time:`##:##`,fulltime:`##:##:##`,phone:`(###) ### - ####`,card:`#### #### #### ####`},{tokenMap:zn,tokenKeys:Bn}=Vn({"#":{pattern:`[\\d]`,negate:`[^\\d]`},S:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`},N:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`},A:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`,transform:e=>e.toLocaleUpperCase()},a:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`,transform:e=>e.toLocaleLowerCase()},X:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`,transform:e=>e.toLocaleUpperCase()},x:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`,transform:e=>e.toLocaleLowerCase()}});function Vn(e){let t=Object.keys(e),n={};return t.forEach(t=>{let r=e[t];n[t]={...r,regex:new RegExp(r.pattern)}}),{tokenMap:n,tokenKeys:t}}function Hn(e){return RegExp("\\\\([^.*+?^${}()|([\\]])|([.*+?^${}()|[\\]])|(["+e.join(``)+`])|(.)`,`g`)}var Un=/[.*+?^${}()|[\]\\]/g,Wn=Hn(Bn),G=String.fromCodePoint(1),Gn={mask:String,reverseFillMask:Boolean,fillMask:[Boolean,String],unmaskedValue:Boolean,maskTokens:Object};function Kn(e,t,n,r){let a,o,s,c,l,u,d=p(()=>{if(e.maskTokens===void 0||e.maskTokens===null)return{tokenMap:zn,tokenRegexMask:Wn};let{tokenMap:t}=Vn(e.maskTokens),n={...zn,...t};return{tokenMap:n,tokenRegexMask:Hn(Object.keys(n))}}),f=i(null),m=i(g());function h(){return e.autogrow||[`textarea`,`text`,`search`,`url`,`tel`,`password`].includes(e.type)}k(()=>e.type+e.autogrow,v),k(()=>e.mask,n=>{if(n!==void 0)y(m.value,!0);else{let n=D(m.value);v(),e.modelValue!==n&&t(`update:modelValue`,n)}}),k(()=>e.fillMask+e.reverseFillMask,()=>{f.value&&y(m.value,!0)}),k(()=>e.unmaskedValue,()=>{f.value&&y(m.value)}),k(()=>e.maskTokens,()=>{f.value&&y(m.value,!0)},{deep:!0});function g(){if(v(),f.value){let t=T(D(e.modelValue));return e.fillMask===!1?t:O(t)}return e.modelValue}function _(e){if(e<a.length)return a.slice(-e);let t=``,n=a,r=n.indexOf(G);if(r!==-1){for(let r=e-n.length;r>0;r--)t+=G;n=n.slice(0,r)+t+n.slice(r)}return n}function v(){if(f.value=e.mask!==void 0&&e.mask.length!==0&&h(),!f.value){c=void 0,a=``,o=``;return}let t=Rn[e.mask]===void 0?e.mask:Rn[e.mask],n=typeof e.fillMask==`string`&&e.fillMask.length!==0?e.fillMask.slice(0,1):`_`,r=n.replace(Un,String.raw`\$&`),i=[],l=[],u=[],p=e.reverseFillMask,m=``,g=``;t.replace(d.value.tokenRegexMask,(e,t,n,r,a)=>{if(r!==void 0){let e=d.value.tokenMap[r];u.push(e),g=e.negate,p&&=(l.push(`(?:`+g+`+)?(`+e.pattern+`+)?(?:`+g+`+)?(`+e.pattern+`+)?`),!1),l.push(`(?:`+g+`+)?(`+e.pattern+`)?`);return}if(n!==void 0)m=`\\`+(n===`\\`?``:n),u.push(n);else{let e=t===void 0?a:t;m=e===`\\`?String.raw`\\\\`:e.replace(Un,String.raw`\\$&`),u.push(e)}i.push(`([^`+m+`]+)?`+m+`?`)});let _=RegExp(`^`+i.join(``)+`(`+(m===``?`.`:`[^`+m+`]`)+`+)?`+(m===``?``:`[`+m+`]*`)+`$`),v=l.length-1,y=l.map((t,n)=>n===0&&e.reverseFillMask?RegExp(`^`+r+`*`+t):RegExp(n===v?`^`+t+`(`+(g===``?`.`:g)+`+)?`+(e.reverseFillMask?`$`:r+`*`):`^`+t));s=u,c=t=>{let n=_.exec(e.reverseFillMask?t:t.slice(0,u.length+1));n!==null&&(t=n.slice(1).join(``));let r=[],i=y.length;for(let e=0,n=t;e<i;e++){let t=y[e].exec(n);if(t===null)break;n=n.slice(t.shift().length),r.push(...t)}return r.length===0?t:r.join(``)},a=u.map(e=>typeof e==`string`?e:G).join(``),o=a.split(G).join(n)}function y(t,i,s){let c=r.value,u=c?.selectionEnd??0,d=c===null?0:c.value.length-u,f=D(t);i===!0&&v();let p=T(f,i),h=e.fillMask===!1?p:O(p),g=m.value!==h;c!==null&&c.value!==h&&(c.value=h),g&&(m.value=h),c!==null&&document.activeElement===c&&C(()=>{if(h===o){let t=e.reverseFillMask?o.length:0;c.setSelectionRange(t,t,`forward`);return}if(s===`insertFromPaste`&&!e.reverseFillMask){let e=c.selectionEnd,t=u-1;for(let n=l;n<=t&&n<e;n++)a[n]!==G&&t++;x.right(c,t);return}if([`deleteContentBackward`,`deleteContentForward`].includes(s)){let t=e.reverseFillMask?u===0?+(h.length>p.length):Math.max(0,h.length-(h===o?0:Math.min(p.length,d)+1))+1:u;c.setSelectionRange(t,t,`forward`);return}if(e.reverseFillMask){if(g){let e=Math.max(0,h.length-(h===o?0:Math.min(p.length,d+1)));e===1&&u===1?c.setSelectionRange(e,e,`forward`):x.rightReverse(c,e)}else{let e=h.length-d;c.setSelectionRange(e,e,`backward`)}}else if(g){let e=Math.max(0,a.indexOf(G),Math.min(p.length,u)-1);x.right(c,e)}else{let e=u-1;x.right(c,e)}});let _=e.unmaskedValue?D(h):h;String(e.modelValue)!==_&&(e.modelValue!==null||_!==``)&&n(_,!0)}function b(e,t,n){let r=T(D(e.value));t=Math.max(0,a.indexOf(G),Math.min(r.length,t)),l=t,e.setSelectionRange(t,n,`forward`)}let x={left(e,t){let n=!a.slice(t-1).includes(G),r=Math.max(0,t-1);for(;r>=0;r--)if(a[r]===G){t=r,n&&t++;break}if(r<0&&a[t]!==void 0&&a[t]!==G)return x.right(e,0);t>=0&&e.setSelectionRange(t,t,`backward`)},right(e,t){let n=e.value.length,r=Math.min(n,t+1);for(;r<=n;r++)if(a[r]===G){t=r;break}else a[r-1]===G&&(t=r);if(r>n&&a[t-1]!==void 0&&a[t-1]!==G)return x.left(e,n);e.setSelectionRange(t,t,`forward`)},leftReverse(e,t){let n=_(e.value.length),r=Math.max(0,t-1);for(;r>=0;r--)if(n[r-1]===G){t=r;break}else if(n[r]===G&&(t=r,r===0))break;if(r<0&&n[t]!==void 0&&n[t]!==G)return x.rightReverse(e,0);t>=0&&e.setSelectionRange(t,t,`backward`)},rightReverse(e,t){let n=e.value.length,r=_(n),i=!r.slice(0,t+1).includes(G),a=Math.min(n,t+1);for(;a<=n;a++)if(r[a-1]===G){t=a,t>0&&i&&t--;break}if(a>n&&r[t-1]!==void 0&&r[t-1]!==G)return x.leftReverse(e,n);e.setSelectionRange(t,t,`forward`)}};function S(e){t(`click`,e),u=void 0}function w(n){if(t(`keydown`,n),re(n)||n.altKey)return;let i=r.value,a=i.selectionStart,o=i.selectionEnd;if(n.shiftKey||(u=void 0),n.keyCode===37||n.keyCode===39){n.shiftKey&&u===void 0&&(u=i.selectionDirection===`forward`?a:o);let t=x[(n.keyCode===39?`right`:`left`)+(e.reverseFillMask?`Reverse`:``)];if(n.preventDefault(),t(i,u===a?o:a),n.shiftKey){let e=i.selectionStart;i.setSelectionRange(Math.min(u,e),Math.max(u,e),`forward`)}}else n.keyCode===8&&!e.reverseFillMask&&a===o?(x.left(i,a),i.setSelectionRange(i.selectionStart,o,`backward`)):n.keyCode===46&&e.reverseFillMask&&a===o&&(x.rightReverse(i,o),i.setSelectionRange(a,i.selectionEnd,`forward`))}function T(t,n){if(t==null||t===``)return``;if(e.reverseFillMask)return E(t,n);let r=s,i=0,a=``;for(let e=0;e<r.length;e++){let o=t[i],s=r[e];if(typeof s==`string`)a+=s,n===!0&&o===s&&i++;else if(o!==void 0&&s.regex.test(o))a+=s.transform===void 0?o:s.transform(o),i++;else return a}return a}function E(e,t){let n=s,r=a.indexOf(G),i=e.length-1,o=``;for(let a=n.length-1;a>=0&&i!==-1;a--){let s=n[a],c=e[i];if(typeof s==`string`)o=s+o,t===!0&&c===s&&i--;else if(c!==void 0&&s.regex.test(c))do o=(s.transform===void 0?c:s.transform(c))+o,i--,c=e[i];while(r===a&&c!==void 0&&s.regex.test(c));else return o}return o}function D(e){return typeof e!=`string`||c===void 0?typeof e==`number`?c(String(e)):e:c(e)}function O(t){return o.length-t.length<=0?t:e.reverseFillMask&&t.length!==0?o.slice(0,-t.length)+t:t+o.slice(t.length)}return{innerValue:m,hasMask:f,moveCursorForPaste:b,updateMaskValue:y,onMaskedKeydown:w,onMaskedClick:S}}function qn(e,t){function n(){let t=e.modelValue;try{let e=`DataTransfer`in window?new DataTransfer:`ClipboardEvent`in window?new ClipboardEvent(``).clipboardData:void 0;return Object(t)===t&&(`length`in t?[...t]:[t]).forEach(t=>{e.items.add(t)}),{files:e.files}}catch{return{files:void 0}}}return p(t?()=>{if(e.type===`file`)return n()}:n)}var Jn=/[\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFF9F\u4E00-\u9FAF\u3400-\u4DBF]/,Yn=/[\u4E00-\u9FFF\u3400-\u4DBF\u{20000}-\u{2A6DF}\u{2A700}-\u{2B73F}\u{2B740}-\u{2B81F}\u{2B820}-\u{2CEAF}\uF900-\uFAFF\u3300-\u33FF\uFE30-\uFE4F\uF900-\uFAFF\u{2F800}-\u{2FA1F}]/u,Xn=/[\u3131-\u314E\u314F-\u3163\uAC00-\uD7A3]/,Zn=/[a-z0-9_ -]$/i;function Qn(e){return function(t){if(t.type===`compositionend`||t.type===`change`){if(!t.target.qComposing)return;t.target.qComposing=!1,e(t)}else t.type===`compositionupdate`&&!t.target.qComposing&&typeof t.data==`string`&&(V.is.firefox?!Zn.test(t.data):Jn.test(t.data)||Yn.test(t.data)||Xn.test(t.data))&&(t.target.qComposing=!0)}}var $n=B({name:`QInput`,inheritAttrs:!1,props:{...Nn,...Gn,...Ke,modelValue:[String,Number,FileList],modelModifiers:Object,shadowText:String,type:{type:String,default:`text`},debounce:[String,Number],autogrow:Boolean,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...Pn,`paste`,`change`,`keydown`,`click`,`animationend`],setup(e,{emit:t,attrs:n}){let{proxy:r}=M(),{$q:a}=r,o={},s=NaN,c=!1,l=!1,u=null,d,f=i(null),m=Je(e),{innerValue:h,hasMask:g,moveCursorForPaste:_,updateMaskValue:v,onMaskedKeydown:y,onMaskedClick:S}=Kn(e,t,L,f),w=qn(e,!0),T=p(()=>Mn(h.value)),E=Qn(I);function D(e){if(g.value&&e.type===`compositionstart`){e.target.qComposing=!0;return}E(e)}let O=Fn({changeEvent:!0}),A=p(()=>e.type===`textarea`||e.autogrow),ee=p(()=>A.value||[`text`,`search`,`url`,`tel`,`password`].includes(e.type)),j=p(()=>{let t={...O.splitAttrs.listeners.value,onInput:I,onPaste:ie,onChange:se,onBlur:B,onFocus:ce};return t.onCompositionstart=t.onCompositionupdate=t.onCompositionend=D,g.value&&(t.onKeydown=y,t.onClick=S),e.autogrow&&(t.onAnimationend=ae),t}),te=p(()=>{let t={tabindex:0,"data-autofocus":e.autofocus||void 0,rows:e.type===`textarea`?6:void 0,"aria-label":e.label,name:m.value,...O.splitAttrs.attributes.value,id:O.targetUid.value,maxlength:e.maxlength,disabled:e.disable,readonly:e.readonly};return A.value||(t.type=e.type),e.autogrow&&(t.rows=1),t});k(()=>e.type,()=>{f.value&&(f.value.value=e.modelValue)}),k(()=>e.modelValue,t=>{if(u!==null&&(oe(),c=!1,l=!1,delete o.value),g.value){if(l&&(l=!1,String(t)===s))return;v(t)}else h.value!==t&&(h.value=t,e.type===`number`&&Object.hasOwn(o,`value`)&&(c?c=!1:delete o.value),e.modelModifiers?.trim===!0&&Object.hasOwn(o,`value`)&&(typeof o.value!=`string`||o.value.trim()!==t)&&delete o.value);e.autogrow&&C(z)}),k(()=>e.autogrow,e=>{e?C(z):f.value!==null&&n.rows>0&&(f.value.style.height=`auto`)}),k(()=>e.dense,()=>{e.autogrow&&C(z)});function P(){let e=document.activeElement;f.value!==null&&f.value!==e&&(e===null||e.id!==O.targetUid.value)&&f.value.focus({preventScroll:!0})}function F(){Fe(P)}function ne(){Pe(P);let e=document.activeElement;e!==null&&O.rootRef.value.contains(e)&&e.blur()}function re(){f.value?.select()}function ie(n){if(g.value&&e.reverseFillMask!==!0){let e=n.target;_(e,e.selectionStart,e.selectionEnd)}t(`paste`,n)}function I(n){if(!n||!n.target)return;if(e.type===`file`){t(`update:modelValue`,n.target.files);return}let r=n.target.value;if(n.target.qComposing){o.value=r;return}if(g.value)v(r,!1,n.inputType);else if(e.modelModifiers?.trim===!0&&(o.value=r),L(r),ee.value&&n.target===document.activeElement){let{selectionStart:e,selectionEnd:t}=n.target;e!==void 0&&t!==void 0&&C(()=>{n.target===document.activeElement&&r.indexOf(n.target.value)===0&&n.target.setSelectionRange(e,t)})}e.autogrow&&z()}function ae(e){t(`animationend`,e),z()}function L(n,r){d=()=>{u=null,e.type!==`number`&&(e.modelModifiers?.trim!==!0||g.value)&&Object.hasOwn(o,`value`)&&delete o.value,e.modelValue!==n&&s!==n&&(s=n,r===!0&&(l=!0),t(`update:modelValue`,n),C(()=>{s===n&&(s=NaN)})),d=void 0},e.type===`number`&&(c=!0,o.value=n),e.debounce===void 0?d():(u!==null&&clearTimeout(u),o.value=n,u=setTimeout(d,e.debounce))}function oe(){u!==null&&(clearTimeout(u),u=null),d=void 0}function R(){oe(),c=!1,l=!1,delete o.value}function z(){requestAnimationFrame(()=>{let e=f.value;if(e!==null){let t=e.parentNode.style,{scrollTop:n}=e,{overflowY:r,maxHeight:i}=a.platform.is.firefox?{}:window.getComputedStyle(e),o=r!==void 0&&r!==`scroll`;o&&(e.style.overflowY=`hidden`),t.marginBottom=e.scrollHeight-1+`px`,e.style.height=`1px`,e.style.height=e.scrollHeight+`px`,o&&(e.style.overflowY=Number.parseInt(i,10)<e.scrollHeight?`auto`:`hidden`),t.marginBottom=``,e.scrollTop=n}})}function se(e){D(e),u!==null&&(clearTimeout(u),u=null),d?.(),t(`change`,e.target.value)}function B(t){t!==void 0&&ce(t),u!==null&&(clearTimeout(u),u=null),d?.(),c=!1,l=!1,delete o.value,e.type!==`file`&&setTimeout(()=>{f.value!==null&&(f.value.value=h.value===void 0?``:h.value)},0)}function le(){return Object.hasOwn(o,`value`)?o.value:h.value===void 0?``:h.value}x(()=>{B()}),b(()=>{e.autogrow&&z()}),Object.assign(O,{innerValue:h,fieldClass:p(()=>`q-${A.value?`textarea`:`input`}`+(e.autogrow?` q-textarea--autogrow`:``)),hasShadow:p(()=>e.type!==`file`&&typeof e.shadowText==`string`&&e.shadowText.length!==0),inputRef:f,emitValue:L,onClear:R,hasValue:T,floatingLabel:p(()=>T.value&&(e.type!==`number`||Number.isFinite(Number(h.value)))||Mn(e.displayValue)),getControl:()=>N(A.value?`textarea`:`input`,{ref:f,class:[`q-field__native q-placeholder`,e.inputClass],style:e.inputStyle,...te.value,...j.value,...e.type===`file`?w.value:{value:le()}}),getShadowControl:()=>N(`div`,{class:`q-field__native q-field__shadow absolute-bottom no-pointer-events`+(A.value?``:` text-no-wrap`)},[N(`span`,{class:`invisible`},le()),N(`span`,e.shadowText)])});let ue=Ln(O);return Object.assign(r,{focus:F,blur:ne,select:re,getNativeElement:()=>f.value}),ye(r,`nativeEl`,()=>f.value),ue}}),er=B({name:`QCardActions`,props:{...be,vertical:Boolean},setup(e,{slots:t}){let n=ge(e),r=p(()=>`q-card__actions ${n.value} q-card__actions--${e.vertical?`vert column`:`horiz row`}`);return()=>N(`div`,{class:r.value},R(t.default))}}),tr=`kobo:network-token`;function nr(){try{return localStorage.getItem(tr)}catch{return null}}function rr(e){try{localStorage.setItem(tr,e)}catch{}}function ir(e){try{let t=new URL(e,window.location.origin);return t.origin===window.location.origin&&t.pathname.startsWith(`/api/`)}catch{return typeof e==`string`&&e.startsWith(`/api/`)}}function ar(e,t){return t?`${e}${e.includes(`?`)?`&`:`?`}token=${encodeURIComponent(t)}`:e}var or=i(!1);function sr(){or.value=!0}function cr(){or.value=!1}var lr={class:`text-h6`},ur={class:`text-caption text-kobo-3 q-mt-sm`},dr=u({__name:`NetworkLoginDialog`,setup(t){let{t:n}=e(),a=p({get:()=>or.value,set:e=>{e||cr()}}),o=i(``),s=i(!1),l=i(!1),u=i(``);async function d(){let e=o.value.trim();if(e){s.value=!0,l.value=!1;try{let t=await fetch(`/api/settings/network/ping`,{headers:{"X-Kobo-Token":e}});if(t.ok){rr(e),cr(),window.location.reload();return}u.value=t.status===401?n(`network.login.invalid`):n(`network.login.serverError`),l.value=!0}catch{u.value=n(`network.login.unreachable`),l.value=!0}finally{s.value=!1}}}return(e,t)=>(S(),_(tn,{modelValue:a.value,"onUpdate:modelValue":t[1]||=e=>a.value=e,persistent:``},{default:O(()=>[D(kt,{style:{"min-width":`320px`,"max-width":`90vw`}},{default:O(()=>[D(W,null,{default:O(()=>[T(`div`,lr,c(r(n)(`network.login.title`)),1),T(`div`,ur,c(r(n)(`network.login.description`)),1)]),_:1}),D(W,null,{default:O(()=>[D($n,{modelValue:o.value,"onUpdate:modelValue":t[0]||=e=>o.value=e,label:r(n)(`network.login.tokenLabel`),placeholder:r(n)(`network.login.tokenPlaceholder`),error:l.value,"error-message":u.value,autofocus:``,dense:``,outlined:``,onKeyup:h(d,[`enter`])},null,8,[`modelValue`,`label`,`placeholder`,`error`,`error-message`])]),_:1}),D(er,{align:`right`},{default:O(()=>[D(xe,{label:r(n)(`network.login.connect`),color:`primary`,loading:s.value,unelevated:``,onClick:d},null,8,[`label`,`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]))}}),fr=Ie(`templates`,{state:()=>({templates:[],defaultSlugs:[],loading:!1,loaded:!1}),getters:{isDefault:e=>t=>e.defaultSlugs.includes(t)},actions:{async fetchTemplates(){if(!this.loading){this.loading=!0;try{let e=await fetch(`/api/templates`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();this.templates=t.templates,this.defaultSlugs=t.defaultSlugs??[],this.loaded=!0}catch(e){console.error(`[templates store] fetchTemplates failed:`,e)}finally{this.loading=!1}}},async createTemplate(e){let t=await fetch(`/api/templates`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}let n=await t.json();return this.templates.push(n),n},async updateTemplate(e,t){let n=await fetch(`/api/templates/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json(),i=this.templates.findIndex(t=>t.slug===e);return i>=0&&(this.templates[i]=r),r},async reloadDefaults(){let e=await fetch(`/api/templates/reload-defaults`,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error??`HTTP ${e.status}`)}let t=await e.json();return t.added.length>0&&await this.fetchTemplates(),t},async deleteTemplate(e){let t=await fetch(`/api/templates/${encodeURIComponent(e)}`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}this.templates=this.templates.filter(t=>t.slug!==e)},async resetToDefault(e){let t=await fetch(`/api/templates/${encodeURIComponent(e)}/reset-default`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({error:`Reset failed`}));throw Error(e.error??`Reset failed`)}let{template:n}=await t.json(),r=this.templates.findIndex(t=>t.slug===e);return r>=0?this.templates[r]=n:this.templates.push(n),n}}}),pr=B({name:`QAvatar`,props:{...L,fontSize:String,color:String,textColor:String,icon:String,square:Boolean,rounded:Boolean},setup(e,{slots:t}){let n=ie(e),r=p(()=>`q-avatar`+(e.color?` bg-${e.color}`:``)+(e.textColor?` text-${e.textColor} q-chip--colored`:``)+(e.square?` q-avatar--square`:e.rounded?` rounded-borders`:``)),i=p(()=>e.fontSize?{fontSize:e.fontSize}:null);return()=>{let a=e.icon===void 0?void 0:[N(pe,{name:e.icon})];return N(`div`,{class:r.value,style:n.value},[N(`div`,{class:`q-avatar__content row flex-center overflow-hidden`,style:i.value},we(t.default,a))])}}}),mr=0,hr={},gr={},K={},_r={},vr=/^\s*$/,yr=[],br=[void 0,null,!0,!1,``],xr=[`top-left`,`top-right`,`bottom-left`,`bottom-right`,`top`,`bottom`,`left`,`right`,`center`],Sr=[`top-left`,`top-right`,`bottom-left`,`bottom-right`],Cr={positive:{icon:e=>e.iconSet.type.positive,color:`positive`},negative:{icon:e=>e.iconSet.type.negative,color:`negative`},warning:{icon:e=>e.iconSet.type.warning,color:`warning`,textColor:`dark`},info:{icon:e=>e.iconSet.type.info,color:`info`},ongoing:{group:!1,timeout:0,spinner:!0,color:`grey-8`}};function wr(e,t,n){if(!e)return Dr(`parameter required`);let r,i={textColor:`white`};if(e.ignoreDefaults||Object.assign(i,hr),U(e)||(i.type&&Object.assign(i,Cr[i.type]),e={message:e}),Object.assign(i,Cr[e.type||i.type],e),typeof i.icon==`function`&&(i.icon=i.icon(t)),i.spinner=i.spinner?i.spinner===!0?Ce:s(i.spinner):!1,i.meta={hasMedia:!!(i.spinner||i.icon||i.avatar),hasText:Er(i.message)||Er(i.caption)},i.position){if(!xr.includes(i.position))return Dr(`wrong position`,e)}else i.position=`bottom`;if(br.includes(i.timeout))i.timeout=5e3;else{let t=Number.parseFloat(i.timeout);if(!Number.isFinite(t)||t<0)return Dr(`wrong timeout`,e);i.timeout=t}i.timeout===0?i.progress=!1:i.progress&&(i.meta.progressClass=`q-notification__progress`+(i.progressClass?` ${i.progressClass}`:``),i.meta.progressStyle={animationDuration:`${i.timeout+1e3}ms`});let a=[...Array.isArray(e.actions)?e.actions:[],...!e.ignoreDefaults&&Array.isArray(hr.actions)?hr.actions:[],...Array.isArray(Cr[e.type]?.actions)?Cr[e.type].actions:[]],{closeBtn:o}=i;if(o&&a.push({label:typeof o==`string`?o:t.lang.label.close}),i.actions=a.map(({handler:e,noDismiss:t,...n})=>({flat:!0,...n,onClick:typeof e==`function`?()=>{e(),t||c()}:()=>{c()}})),i.multiLine===void 0&&(i.multiLine=i.actions.length>1),Object.assign(i.meta,{class:`q-notification row items-stretch q-notification--${i.multiLine?`multi-line`:`standard`}`+(i.color===void 0?``:` bg-${i.color}`)+(i.textColor===void 0?``:` text-${i.textColor}`)+(i.classes===void 0?``:` ${i.classes}`),wrapperClass:`q-notification__wrapper col relative-position border-radius-inherit `+(i.multiLine?`column no-wrap justify-center`:`row items-center`),contentClass:`q-notification__content row items-center`+(i.multiLine?``:` col`),leftClass:i.meta.hasText?`additional`:`single`,attrs:{role:`alert`,...i.attrs}}),i.group===!1?(i.group=void 0,i.meta.group=void 0):((i.group===void 0||i.group===!0)&&(i.group=[i.message,i.caption,i.multiLine,...i.actions.map(e=>`${e.label}*${e.icon}`)].join(`|`)),i.meta.group=i.group+`|`+i.position),i.actions.length===0?i.actions=void 0:i.meta.actionsClass=`q-notification__actions row items-center `+(i.multiLine?`justify-end`:`col-auto`)+(i.meta.hasMedia?` q-notification__actions--with-media`:``),n!==void 0){n.notif.meta.timer&&(clearTimeout(n.notif.meta.timer),n.notif.meta.timer=void 0),i.meta.uid=n.notif.meta.uid;let e=K[i.position].value.indexOf(n.notif);K[i.position].value[e]=i}else{let t=gr[i.meta.group];if(t===void 0){if(i.meta.uid=mr++,i.meta.badge=1,[`left`,`right`,`center`].includes(i.position))K[i.position].value.splice(Math.floor(K[i.position].value.length/2),0,i);else{let e=i.position.includes(`top`)?`unshift`:`push`;K[i.position].value[e](i)}i.group!==void 0&&(gr[i.meta.group]=i)}else{if(t.meta.timer&&(clearTimeout(t.meta.timer),t.meta.timer=void 0),i.badgePosition!==void 0){if(!Sr.includes(i.badgePosition))return Dr(`wrong badgePosition`,e)}else i.badgePosition=`top-${i.position.includes(`left`)?`right`:`left`}`;i.meta.uid=t.meta.uid,i.meta.badge=t.meta.badge+1,i.meta.badgeClass=`q-notification__badge q-notification__badge--${i.badgePosition}`+(i.badgeColor===void 0?``:` bg-${i.badgeColor}`)+(i.badgeTextColor===void 0?``:` text-${i.badgeTextColor}`)+(i.badgeClass?` ${i.badgeClass}`:``);let n=K[i.position].value.indexOf(t);K[i.position].value[n]=gr[i.meta.group]=i}}let c=()=>{Tr(i),r=void 0};if(i.timeout>0&&(i.meta.timer=setTimeout(()=>{i.meta.timer=void 0,c()},i.timeout+1e3)),i.group!==void 0)return t=>{t===void 0?c():Dr(`trying to update a grouped one which is forbidden`,e)};if(r={dismiss:c,config:e,notif:i},n!==void 0){Object.assign(n,r);return}return e=>{r!==void 0&&(e===void 0?r.dismiss():wr({...r.config,...e,group:!1,position:i.position},t,r))}}function Tr(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=K[e.position].value.indexOf(e);if(t!==-1){e.group!==void 0&&delete gr[e.meta.group];let n=yr[String(e.meta.uid)];if(n){let{width:e,height:t}=getComputedStyle(n);n.style.left=`${n.offsetLeft}px`,n.style.width=e,n.style.height=t}K[e.position].value.splice(t,1),typeof e.onDismiss==`function`&&e.onDismiss()}}function Er(e){return e!=null&&!vr.test(e)}function Dr(e,t){return console.error(`Notify: ${e}`,t),!1}function Or(){return B({name:`QNotifications`,devtools:{hide:!0},setup(){return()=>N(`div`,{class:`q-notifications`},xr.map(e=>N(j,{key:e,class:_r[e],tag:`div`,name:`q-notification--${e}`},()=>K[e].value.map(e=>{let t=e.meta,n=[];if(t.hasMedia&&(e.spinner?n.push(N(e.spinner,{class:`q-notification__spinner q-notification__spinner--`+t.leftClass,color:e.spinnerColor,size:e.spinnerSize})):e.icon?n.push(N(pe,{class:`q-notification__icon q-notification__icon--`+t.leftClass,name:e.icon,color:e.iconColor,size:e.iconSize,role:`img`})):e.avatar&&n.push(N(pr,{class:`q-notification__avatar q-notification__avatar--`+t.leftClass},()=>N(`img`,{src:e.avatar,"aria-hidden":`true`})))),t.hasText){let t,r={class:`q-notification__message col`};if(e.html)r.innerHTML=e.caption?`<div>${e.message}</div><div class="q-notification__caption">${e.caption}</div>`:e.message;else{let n=[e.message];t=e.caption?[N(`div`,n),N(`div`,{class:`q-notification__caption`},[e.caption])]:n}n.push(N(`div`,r,t))}let r=[N(`div`,{class:t.contentClass},n)];return e.progress&&r.push(N(`div`,{key:`${t.uid}|p|${t.badge}`,class:t.progressClass,style:t.progressStyle})),e.actions&&r.push(N(`div`,{class:t.actionsClass},e.actions.map(e=>N(xe,e)))),t.badge>1&&r.push(N(`div`,{key:`${t.uid}|${t.badge}`,class:e.meta.badgeClass,style:e.badgeStyle},[t.badge])),N(`div`,{ref:e=>{yr[String(t.uid)]=e},key:t.uid,class:t.class,...t.attrs},[N(`div`,{class:t.wrapperClass},r)])}))))}})}var kr={setDefaults(e){U(e)&&Object.assign(hr,e)},registerType(e,t){U(t)&&(Cr[e]=t)},install({$q:e,parentApp:t}){if(e.notify=this.create=t=>wr(t,e),e.notify.setDefaults=this.setDefaults,e.notify.registerType=this.registerType,e.config.notify!==void 0&&this.setDefaults(e.config.notify),!this.__installed){xr.forEach(e=>{K[e]=i([]);let t=e===`left`||e===`center`||e===`right`?`center`:e.includes(`top`)?`top`:`bottom`,n=e.includes(`left`)?`start`:e.includes(`right`)?`end`:`center`;_r[e]=`q-notifications__list q-notifications__list--${t} fixed column no-wrap ${e===`left`||e===`right`?`items-${e===`left`?`start`:`end`} justify-center`:e===`center`?`flex-center`:`items-${n}`}`});let e=_e(`q-notify`);St(Or(),t).mount(e)}}},Ar={"model.tooltip":`Modell, das der Agent für diesen Workspace verwendet`,"reasoning.tooltip":`Denkaufwand des Agenten für diesen Workspace`,"thinking.label":`Überlegung`,"thinking.noDetails":`Der Agent denkt nach…`,"common.save":`Speichern`,"common.cancel":`Abbrechen`,"common.retry":`Erneut versuchen`,"common.delete":`Löschen`,"common.close":`Schließen`,"common.dismiss":`Verwerfen`,"common.details":`Details`,"common.ok":`OK`,"whatsNew.title":`Neuigkeiten`,"common.loading":`Laden...`,"common.search":`Suchen...`,"common.refresh":`Aktualisieren`,"common.copy":`Kopieren`,"common.copied":`In die Zwischenablage kopiert`,"common.copyFailed":`Kopieren fehlgeschlagen`,"common.add":`Hinzufügen`,"folderPicker.title":`Ordner auswählen`,"folderPicker.parent":`Übergeordneter Ordner`,"folderPicker.empty":`Keine Unterordner`,"folderPicker.select":`Diesen Ordner auswählen`,"common.start":`Starten`,"common.stop":`Stoppen`,"common.archive":`Archivieren`,"common.unarchive":`Wiederherstellen`,"common.selectWorkspace":`Arbeitsbereich auswählen`,"common.noResults":`Keine Ergebnisse für „{query}"`,"common.send":`senden`,"common.newLine":`neue Zeile`,"common.history":`Verlauf`,"common.justNow":`gerade eben`,"common.minutesAgo":`vor {count}m`,"common.hoursAgo":`vor {count}h`,"common.daysAgo":`vor {count}T`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`Leistungsfähigstes Modell — Nachfolger von Opus 4.8, 1M Kontext, adaptive thinking`,"model.mythos5Description":`Fable 5 ohne Sicherheitsklassifikatoren — eingeschränkter Zugriff (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude wählt das optimale Modell`,"model.opus5Description":`Für komplexes agentisches Coding und Unternehmenseinsätze, 1M Kontext`,"model.opus48Description":`Leistungsfähigstes Opus — Long-Horizon-Coding, 1M-Kontext standardmäßig, hoher Effort standardmäßig`,"model.opus47ClassicDescription":`Neuestes Opus, am leistungsfähigsten`,"model.opus471mDescription":`Neuestes Opus, 1M Kontext`,"model.opusClassicDescription":`Am leistungsstärksten`,"model.opus1mDescription":`Am leistungsstärksten, 1M Kontext`,"model.sonnet5Description":`Beste Mischung aus Geschwindigkeit und Intelligenz, 1M Kontext`,"model.sonnetClassicDescription":`Ausgewogen`,"model.sonnet1mDescription":`Ausgewogen, 1M Kontext`,"model.haikuDescription":`Am schnellsten`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`Neuestes Spitzenmodell für agentisches Coding (erfordert ChatGPT-Anmeldung)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Ausgewogenes agentisches Coding-Modell für den Alltag (erfordert ChatGPT-Anmeldung)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Schnelles und günstiges agentisches Coding-Modell (erfordert ChatGPT-Anmeldung)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Empfohlen für komplexes Coding (erfordert ChatGPT-Anmeldung)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Standard-Fallback — starkes Reasoning, funktioniert mit API-Key-Authentifizierung`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Schnell und effizient — ideal für reaktive Aufgaben und Subagenten`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimiert für professionelle Arbeit und langlaufende Agenten`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Auf Coding spezialisiertes Modell für komplexe Softwareentwicklung`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`keine`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Engine entscheidet automatisch`,"reasoning.minimalDescription":`Schnellstes, oberflächlichstes Reasoning`,"reasoning.noneDescription":`Ohne zusätzliches Reasoning`,"reasoning.lowDescription":`Schneller, weniger Tiefe`,"reasoning.mediumDescription":`Ausgewogen`,"reasoning.highDescription":`Mehr Tiefe`,"reasoning.xhighDescription":`Erweiterte Tiefe, langfristige Aufgaben`,"reasoning.maxDescription":`Maximale Tiefe`,"agentPermissionMode.label":`Berechtigungsmodus`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Edits akzeptieren`,"agentPermissionMode.interactive":`Interaktiv`,"agentPermissionMode.tooltip":`Wie der Agent Tool-Berechtigungen handhabt. Plan: schreibgeschützt, keine Schreibvorgänge. Bypass: alle Nachfragen überspringen. Strict: Datei-Edits automatisch akzeptieren, allow/deny für den Rest beachten. Interaktiv: vor jedem Tool den Benutzer per Berechtigungs-Panel fragen.`,"agentPermissionMode.autoLoopOverride":`Auto-Loop erzwingt einen Modus außer Plan — Plan blockiert MCP-Tools und Edits, die der Loop benötigt. Wähle stattdessen Bypass, Strict oder Interaktiv.`,"agentPermissionMode.autoLoopLocked":`Auf Bypass gesperrt, solange Auto-Loop aktiv ist — jeder andere Modus würde den Loop bei Berechtigungsabfragen anhalten. AskUserQuestion funktioniert weiterhin.`,"workspaceList.title":`Arbeitsbereiche`,"workspaceList.a11y.groupToggle":`Gruppe {group}, {count} Workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Aufmerksamkeit erforderlich`,"workspaceList.running":`Aktiv`,"workspaceList.idle":`Inaktiv`,"workspaceList.archived":`Archiviert`,"workspaceList.archivedToast":`„{name}“ archiviert`,"workspaceList.archivedUndo":`Rückgängig`,"workspaceList.unarchiveFailed":`Workspace konnte nicht dearchiviert werden`,"workspaceList.noWorkspaces":`Noch keine Arbeitsbereiche`,"workspaceList.loadFailed":`Deine Workspaces konnten nicht geladen werden`,"workspaceList.loadFailedHint":`Das ist ein Verbindungsfehler, kein leeres Konto.`,"workspaceList.footer":`{count} Arbeitsbereich | {count} Arbeitsbereiche`,"workspaceList.footerRunning":`{count} aktiv`,"workspaceList.deleteDialog.title":`Arbeitsbereich löschen?`,"workspaceList.deleteDialog.deleteLocal":`Lokalen Branch löschen`,"workspaceList.deleteDialog.deleteRemote":`Remote-Branch löschen`,"workspaceList.deleteDialog.warning":`Achtung: Diese Aktion ist auf dem Remote unwiderruflich.`,"workspaceList.deleteArchivedDialog.tooltip":`Alle archivierten Arbeitsbereiche löschen`,"workspaceList.deleteArchivedDialog.title":`Alle archivierten Arbeitsbereiche löschen?`,"workspaceList.deleteArchivedDialog.message":`Dadurch werden die {count} archivierten Arbeitsbereiche endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.`,"workspacePage.selectWorkspace":`Arbeitsbereich auswählen, um zu beginnen`,"workspacePage.commandPalettePlaceholder":`Befehle suchen…`,"workspacePage.commandPaletteEmpty":`Kein passender Befehl`,"workspacePage.commandFocusChat":`Chat-Eingabe fokussieren`,"workspacePage.commandSearchHistory":`Workspace-Verlauf durchsuchen`,"workspacePage.commandTogglePanel":`Seitenleiste ein- oder ausblenden`,"workspacePage.commandStartAgent":`Agent starten`,"workspacePage.commandStopAgent":`Agent stoppen`,"workspacePage.commandOpenSettings":`Einstellungen öffnen`,"workspacePage.commandOpenCreate":`Workspace erstellen`,"workspacePage.commandOpenSearch":`Globale Suche`,"workspacePage.commandOpenHealth":`Health-Seite`,"workspacePage.commandOpenChangelog":`Changelog`,"workspacePage.commandGroupWorkspaces":`Zu einem Workspace wechseln`,"workspacePage.commandPaletteHint":`Befehlspalette`,"workspacePage.session":`Sitzung #{n}`,"workspacePage.newSession":`+ Neue Sitzung`,"workspacePage.renameSession":`Umbenennen`,"workspacePage.renameSessionTitle":`Sitzung umbenennen`,"workspacePage.sessionNameLabel":`Sitzungsname`,"workspacePage.sessionEndedNotice":`Diese Sitzung ist beendet. Erstelle eine neue Sitzung um fortzufahren.`,"workspacePage.renameFailed":`Umbenennung fehlgeschlagen`,"workspacePage.copySessionId":`Sitzungs-ID kopieren`,"workspacePage.deleteSession":`Sitzung löschen`,"workspacePage.deleteSessionTitle":`Sitzung löschen?`,"workspacePage.deleteSessionConfirm":`Diese Sitzung und ihr Gesprächsverlauf werden dauerhaft gelöscht.`,"workspacePage.deleteSessionFailed":`Sitzung konnte nicht gelöscht werden`,"workspacePage.noEngineSessionId":`Noch keine Sitzungs-ID — der Agent hat diese Sitzung noch nicht gestartet`,"workspacePage.createSessionFailed":`Sitzung konnte nicht erstellt werden`,"workspacePage.startFailed":`Start fehlgeschlagen`,"workspacePage.stopFailed":`Stopp fehlgeschlagen`,"workspacePage.interrupt":`Unterbrechen`,"workspacePage.interrupted":`Agent unterbrochen — wartet auf Ihre nächste Nachricht`,"workspacePage.lastAgentEvent":`Letztes Ereignis {when}`,"workspacePage.agentStopping":`Wird gestoppt…`,"workspacePage.agentNotRunning":`Kein Agent-Prozess — der Status ist veraltet`,"workspacePage.archivedBanner":`Archivierter Workspace — schreibgeschützt`,"workspacePage.worktreePurgedBanner":`Worktree gelöscht — Verlauf erhalten, keine Wiederherstellung in dieser Version`,"workspacePage.worktreePurgedTooltip":"Der Worktree-Ordner wurde von der Festplatte gelöscht, um Speicherplatz zurückzugewinnen. Chat-Verlauf, Sitzungen und PR-Metadaten bleiben hier abrufbar, aber das Arbeitsverzeichnis existiert lokal nicht mehr. Eine zukünftige Kōbō-Version wird den Worktree aus der gemergten PR wiederherstellen können — vorerst musst du ihn manuell über `gh pr checkout` oder `git worktree add` neu erstellen.","workspacePage.pendingInitialPromptBanner":`Ein anfänglicher Prompt ist ausstehend — der Agent hat ihn nie erhalten (Setup-Script abgestürzt oder Workspace nie gestartet). Klicke auf Start, um ihn jetzt zu senden.`,"workspacePage.unarchived":`Workspace dearchiviert`,"workspacePage.unarchiveFailed":`Dearchivierung fehlgeschlagen`,"workspacePage.interruptFailed":`Unterbrechung fehlgeschlagen`,"workspacePage.interruptHint":`Den laufenden Zug unterbrechen, ohne die Sitzung zu beenden.`,"workspacePage.interruptTooltip":`Sanfte Unterbrechung (wie Escape) — stoppt das aktuelle Tool, hält die Sitzung aktiv`,"workspacePage.pendingNextRun":`Beim nächsten Start angewendet`,"workspacePage.activeSessionModel":`Aktiv: {model}`,"workspacePage.activeSessionModelTooltip":`Modell, das von der ausgewählten Sitzung tatsächlich verwendet wird`,"workspacePage.switchEngine":`Engine wechseln`,"workspacePage.switchEngineHint":`Diesen Workspace mit einer anderen Agent-Engine fortsetzen`,"workspacePage.moreActions":`Weitere Aktionen`,"workspacePage.switchEngineTitle":`Agent-Engine wechseln`,"workspacePage.switchEngineWarning":`Der aktuelle Agent wird gestoppt und eine neue Sitzung startet im selben Worktree.`,"workspacePage.engineLabel":`Engine`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Übergabe für die neue Engine`,"workspacePage.engineHandoffHint":`Überprüfen oder bearbeiten Sie den Kontext für den neuen Agenten.`,"workspacePage.confirmSwitchEngine":`Engine wechseln`,"workspacePage.switchEngineFailed":`Engine-Wechsel fehlgeschlagen`,"whip.dispatchFailed":`Peitschen-Nachricht konnte nicht gesendet werden`,"whip.phrase1":`Schneller, tocard!`,"whip.phrase2":`Leg einen Zahn zu, tocard!`,"whip.phrase3":`Zurück an die Arbeit, tocard!`,"whip.phrase4":`Zeig etwas Tempo, tocard!`,"whip.phrase5":`Weniger denken, mehr machen, tocard!`,"search.title":`Suche`,"search.tooltip":`Agent-Verlauf durchsuchen`,"search.placeholder":`In allen Agent-Nachrichten suchen…`,"search.includeArchived":`Archivierte Arbeitsbereiche einbeziehen`,"search.loading":`Suche läuft…`,"search.noResults":`Keine Treffer`,"search.error":`Suche fehlgeschlagen: {message}`,"search.resultCount":`{n} Treffer`,"search.eventType.userMessage":`Sie`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Noch keine Aktivität`,"activityFeed.emptyHint":`Starten Sie einen Arbeitsbereich, um die Agentenausgabe hier zu sehen`,"activityFeed.initialPrompt":`Initialer Prompt`,"activityFeed.you":`Sie`,"activityFeed.agent":`Agent`,"activityFeed.question":`Frage`,"activityFeed.goToPrevious":`Zur vorherigen Nachricht`,"activityFeed.scrollToBottom":`Nach unten scrollen`,"activityFeed.sendAnswers":`Antworten senden`,"agentBusy.banner":`Agent ist beschäftigt`,"agentBusy.subagentsRunning":`1 Sub-Agent aktiv | {n} Sub-Agents aktiv`,"agentBusy.viewSubagents":`Sub-Agents anzeigen`,"agentBusy.pendingMessage":`Warten — Agent ist beschäftigt`,"terminal.title":`Terminal`,"terminal.open":`Terminal öffnen`,"terminal.close":`Terminal schließen`,"terminal.noWorkspace":`Workspace auswählen`,"terminal.noWorktree":`Worktree noch nicht erstellt`,"terminal.error":`Terminalfehler`,"terminal.exited":`Terminal beendet`,"terminal.disconnected":`Verbindung verloren`,"terminal.reconnecting":`Verbindungsaufbau… (Versuch {attempt} von {max})`,"terminal.reconnect":`Neu verbinden`,"chatInput.placeholder":`Nachricht... (/ für Skills)`,"chatInput.fileSearchHint":`Datei suchen`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Bild anhängen`,"chatInput.queueBanner":`Nachricht in Warteschlange — wird gesendet, wenn der Agent fertig ist`,"chatInput.forceQueue":`Senden erzwingen`,"chatInput.searchHistory":`suchen`,"chatInput.commandPalette":`Befehle`,"chatInput.shortcuts":`Tastenkürzel`,"chatInput.cancelQueue":`Warteschlange abbrechen`,"chatInput.autoLoopBanner":`Auto-Loop läuft — beende ihn, um eine Nachricht zu senden`,"chatInput.awaitingUserBanner":`Der Agent wartet auf deine Antwort oben — antworte über das Fragefenster`,"chatInput.autoLoopStop":`Beenden`,"koboCommand.checkProgressDesc":`Fortschritt bei Aufgaben und Akzeptanzkriterien prüfen`,"chatInput.uploading":`Wird hochgeladen...`,"voice.title":`Sprachtranskription`,"voice.enabled":`Lokale Sprachtranskription aktivieren`,"voice.pttKey":`Push-to-talk-Taste`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Strg+Leertaste`,"voice.language":`Sprache (auto oder Code)`,"voice.model":`Aktives Modell`,"voice.commandPath":`Pfad zur Whisper-Binärdatei (optional)`,"voice.ffmpegPath":`Pfad zur ffmpeg-Binärdatei (optional)`,"voice.temperature":`Temperatur`,"voice.temperatureHint":`Niedriger = deterministischer, höher = flexibler, aber potenziell weniger stabil.`,"voice.initialPrompt":`Initial Prompt (optional)`,"voice.initialPromptHint":`Optionaler Kontext, um Whisper bei Namen, Fachbegriffen oder domänenspezifischem Vokabular zu helfen.`,"voice.translateToEnglish":`Ins Englische übersetzen`,"voice.translateToEnglishHint":`Wenn aktiviert, wird nicht-englische Sprache ins Englische übersetzt statt originalgetreu transkribiert.`,"voice.suppressNst":`Nicht-Sprach-Tokens unterdrücken`,"voice.suppressNstHint":`Versucht, Nicht-Sprach-Artefakte im Transkript zu reduzieren.`,"voice.installLink":`whisper.cpp installieren`,"voice.installGuideTitle":`Installationsanleitung`,"voice.installGuideIntro":`Installiere whisper.cpp und ffmpeg und setze bei Bedarf unten die Binärpfade.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Nach dem CMake-Build liegt die Whisper-Binärdatei üblicherweise hier: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Danach in diesem Bereich „Pfad zur Whisper-Binärdatei“ und „Pfad zur ffmpeg-Binärdatei“ setzen (oder leer lassen, wenn im PATH).`,"voice.noneModel":`Kein aktives Modell`,"voice.notInstalled":`nicht installiert`,"voice.download":`Herunterladen`,"voice.delete":`Löschen`,"voice.holdToTalk":`Zum Sprechen gedrückt halten`,"voice.recording":`Aufnahme...`,"voice.transcribing":`Transkription...`,"voice.notSupported":`Sprachaufnahme wird in diesem Browser nicht unterstützt`,"voice.errorMicPermission":`Mikrofonberechtigung verweigert`,"voice.errorTranscription":`Sprachtranskription fehlgeschlagen`,"voice.downloadFailed":`Modelldownload fehlgeschlagen`,"voice.deleteFailed":`Modell konnte nicht gelöscht werden`,"voice.errorDisabled":`Sprachtranskription ist in den Einstellungen deaktiviert`,"voice.errorModelMissing":`Kein aktives Sprachmodell konfiguriert`,"voice.errorModelNotInstalled":`Das aktive Sprachmodell ist nicht installiert`,"voice.errorAudioInvalid":`Audioaufnahme ist ungültig oder leer`,"voice.errorLanguageInvalid":`Sprachkonfiguration ist ungültig`,"voice.errorRuntimeMissing":`Whisper-Runtime ist nicht installiert oder nicht im PATH`,"voice.maxDurationReached":`Maximale Aufnahmedauer erreicht`,"voice.runtimeReady":`Runtime bereit: {command}`,"voice.runtimeMissing":`Runtime fehlt: {command}`,"voice.ffmpegReady":`ffmpeg bereit`,"voice.ffmpegMissing":`ffmpeg fehlt`,"voice.sectionRuntime":`Runtime-Status`,"voice.sectionActivation":`Aktivierung`,"voice.sectionModels":`Whisper-Modelle`,"voice.sectionAdvanced":`Erweiterte Optionen`,"voice.sectionBehavior":`Transkriptionsverhalten`,"voice.sectionBinaries":`Binärpfade`,"voice.downloadModels":`Modell herunterladen`,"voice.cancelFailed":`Abbrechen des Downloads fehlgeschlagen`,"createPage.title":`Workspace erstellen`,"createPage.subtitle":`Beschreiben Sie die Aufgabe, wählen Sie ein Projekt und konfigurieren Sie den Agenten.`,"createPage.sectionMission":`Aufgabe`,"createPage.sectionMissionHint":`Geben Sie dem Agenten ein klares Ziel und den erforderlichen Kontext.`,"createPage.workspaceNameLabel":`Workspace-Name`,"createPage.descriptionLabel":`Aufgabenbeschreibung`,"createPage.sources":`Optionale Quellen`,"createPage.sectionGit":`Git-Projekt`,"createPage.sectionGitHint":`Wählen Sie Repository, Ausgangsbranch und Worktree-Modus.`,"createPage.worktreeMode":`Worktree-Modus`,"createPage.worktreeNew":`Neuer isolierter Worktree`,"createPage.worktreeExisting":`Vorhandenen Worktree verwenden`,"createPage.projectLabel":`Projekt`,"createPage.sourceBranch":`Ausgangsbranch`,"createPage.workingBranchPreview":`Vorschau des Arbeitsbranches`,"createPage.branchNamePending":`workspace-name`,"createPage.sectionAgent":`Agent`,"createPage.sectionAgentHint":`Prüfen Sie die Ausführungsvorgaben oder aktivieren Sie die Automatisierung.`,"createPage.configureAgent":`Agent konfigurieren`,"createPage.advancedOptions":`Erweiterte Optionen`,"createPage.keyboardHint":`Drücken Sie Strg/Cmd + Enter, um den Workspace zu erstellen.`,"createPage.createWorkspace":`Workspace erstellen`,"createPage.notionEnabled":`Notion aktiviert`,"createPage.importNotion":`Aus Notion importieren`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`Die URL muss mit https://www.notion.so/ oder https://app.notion.com/ beginnen`,"createPage.notionAutoExtract":`Unteraufgaben und Akzeptanzkriterien werden automatisch extrahiert.`,"createPage.notionPanelChoiceLabel":`Diese URL verweist auf eine Unterseite (?p=). An welcher möchtest du arbeiten?`,"createPage.notionPanelOption":`Unterseite (Panel)`,"createPage.notionPanelOptionDesc":`Die Seite, die du angesehen hast — empfohlen`,"createPage.notionParentOption":`Übergeordnete Seite`,"createPage.notionParentOptionDesc":`Das Epic / die Datenbank dazu`,"createPage.importSentry":`Sentry importieren`,"createPage.sentryEnabled":`Sentry aktiviert`,"createPage.sentryPlaceholder":`https://ihre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`Die URL muss auf ein Sentry-Issue zeigen (/issues/<id>)`,"createPage.sentryAutoExtract":`Sentry-Issue wird automatisch importiert`,"createPage.sentryExtractHint":`Kobo extrahiert das Issue und schreibt es nach .ai/thoughts/`,"createPage.workspaceName":`Name des Arbeitsbereichs (Standard: Notion-Seitentitel)`,"createPage.workspaceNamePlaceholder":`Name des Arbeitsbereichs...`,"createPage.instructions":`Zusätzliche Anweisungen (optional)...`,"createPage.instructionsPlaceholder":`Aufgabe beschreiben...`,"createPage.tasks":`Aufgaben ({count})`,"createPage.addTask":`Aufgabe hinzufügen...`,"createPage.acceptanceCriteria":`Akzeptanzkriterien ({count})`,"createPage.addCriterion":`Kriterium hinzufügen...`,"createPage.projectPath":`Projektpfad eingeben`,"createPage.branchType":`Branch-Typ`,"createPage.branch":`Branch`,"createPage.noBranches":`Keine Branches gefunden`,"createPage.enterPath":`Projektpfad eingeben`,"createPage.skipSetupScript":`Setup-Skript überspringen`,"createPage.worktreePickerLabel":`Bestehender Worktree`,"createPage.noOrphanWorktrees":`Kein verwaister Worktree in diesem Projekt`,"createPage.pickWorktreeRequired":`Bitte einen Worktree zum Anhängen auswählen`,"createPage.notionExtractHint":`Unteraufgaben und Akzeptanzkriterien werden aus der Notion-Seite extrahiert.`,"createPage.errorCreating":`Fehler beim Erstellen des Arbeitsbereichs.`,"createPage.branchAdjusted":"Branch existierte bereits — stattdessen `{branch}` erstellt. Der zugehörige Worktree-Ordner verwendet das gleiche Suffix.","createPage.localSourceFallback":`Workspace vom lokalen Branch erstellt (origin nicht erreichbar) — die Basis ist möglicherweise veraltet.`,"createPage.validationNotionUrl":`Bitte eine gültige Notion-URL einfügen (https://www.notion.so/... oder https://app.notion.com/...).`,"createPage.validationDescription":`Bitte beschreiben Sie die Aufgabe.`,"createPage.validationName":`Bitte geben Sie einen Arbeitsbereichnamen an.`,"createPage.validationPath":`Bitte geben Sie den Projektpfad ein.`,"createPage.validationBranch":`Bitte wählen Sie einen Branch aus.`,"createPage.validationFocusHint":`Das zu korrigierende Feld ist unten hervorgehoben.`,"createPage.progress.validate":`Anfrage wird geprüft…`,"createPage.progress.fetch-source-branch":`Source-Branch wird von origin geholt…`,"createPage.progress.inspect-worktree":`Bestehender Worktree wird geprüft…`,"createPage.progress.extract-notion":`Notion-Seite wird extrahiert…`,"createPage.progress.extract-sentry":`Sentry-Issue wird extrahiert…`,"createPage.progress.create-record":`Workspace wird erstellt…`,"createPage.progress.create-tasks":`Tasks und Akzeptanzkriterien werden erstellt…`,"createPage.progress.create-worktree":`Git-Worktree wird erstellt…`,"createPage.progress.write-conventions":`Git-Konventionen werden geschrieben…`,"createPage.progress.write-context-files":`Kontextdateien werden geschrieben…`,"createPage.progress.build-prompt":`Initialer Prompt wird erstellt…`,"createPage.progress.setup-script":`Dein Setup-Skript läuft…`,"createPage.progress.start-agent":`Agent wird gestartet…`,"createPage.progress.rollback":`Fehlgeschlagene Erstellung wird rückgängig gemacht…`,"createPage.progress.done":`Fertig`,"createPage.progress.step":`Schritt {index} von {total}`,"createPage.errorAtStep":`Erstellung im Schritt „{step}“ fehlgeschlagen: {message}`,"createPage.override.title":`Zwei deiner Einstellungen wurden überschrieben`,"createPage.override.setup-script-forced":`Setup-Skript übersprungen: ein erneuter Lauf auf einem bereits vorbereiteten Worktree könnte dessen Inhalt zerstören.`,"createPage.override.permission-mode-downgraded":`Berechtigungsmodus von Plan auf Bypass geändert: eine autonome Schleife kann nicht in Plan laufen, der Tools und Änderungen blockiert.`,"settings.title":`Einstellungen`,"settings.language":`Sprache`,"settings.projectColor":`Farbe`,"settings.projectColorClear":`Löschen`,"settings.projectColorDefault":`Standard (grau)`,"settings.workspaceListSection":`Workspace-Liste`,"settings.flattenWorkspaceList":`Workspace-Liste flach anzeigen`,"settings.flattenWorkspaceListHint":`Zeigt alle Workspaces in einer flachen Liste mit Projekt-Badge, anstatt nach Projekt gruppiert.`,"settings.skillSuite.section":`Skill-Suite`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Benutzerdefiniert`,"settings.skillSuite.superpowersHint":`Opinionierter TDD / Brainstorm / Plan-Workflow (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Garry Tans Suite — /review, /ship, /qa, /office-hours usw. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Beide Suites lassen sich kombinieren — superpowers für Methodik (Brainstorm / TDD / Pläne / Prinzipien-Review), gstack für konkrete Workflows (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Agent-Harness-Framework von affaan-m — Agents, Skills, Rules und Hooks zum Planen, Testen, Implementieren, Reviewen und Speichern (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Alle drei lassen sich kombinieren — superpowers für Methodik, gstack für konkrete Workflows, ECC für strukturierte Multi-Agent-Review-/Implementierungsdurchläufe.`,"settings.skillSuite.customHint":`Stelle die fünf Prompts unten aus beliebigen Vorlagen zusammen und bearbeite sie frei.`,"settings.skillSuite.reloadDefaults":`Standard wiederherstellen`,"settings.skillSuite.reloadDefaultsConfirm":`Die fünf benutzerdefinierten Prompts durch die agnostischen Standardwerte ersetzen?`,"settings.skillSuite.customPrompts":`Benutzerdefinierte Prompts`,"settings.skillSuite.agnostic":`Agnostische Basis`,"settings.skillSuite.importPrompt":`Vorlage importieren`,"settings.skillSuite.imported":`Vorlage importiert. Du kannst sie jetzt bearbeiten.`,"settings.skillSuite.importFailed":`Vorlage konnte nicht importiert werden`,"settings.skillSuite.reviewTemplate":`Review-Vorlage`,"settings.skillSuite.autoLoopReviewGate":`Auto-Loop Review-Gate`,"settings.skillSuite.autoLoopGroomingIntro":`Auto-Loop Grooming-Intro`,"settings.skillSuite.qaTemplate":`QA-Vorlage`,"settings.skillSuite.brainstormingInstruction":`Anweisung für die Brainstorming-Phase`,"settings.global":`Allgemein`,"settings.projects":`Projekte`,"settings.globalSettings":`Allgemeine Einstellungen`,"settings.defaultModel":`Standardmodell`,"settings.defaultModelClaude":`Standardmodell (Claude Code)`,"settings.defaultModelCodex":`Standardmodell (OpenAI Codex)`,"settings.agentPermissions":`Agentenberechtigungen`,"settings.skipPermissions":`Berechtigungsabfragen überspringen (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Achtung: Wird diese Option deaktiviert, werden alle Tool-Berechtigungen (Write, Edit, Bash...) im Headless-Modus automatisch abgelehnt. Der Agent kann dann nur lesen.`,"settings.notifications":`Benachrichtigungen`,"settings.browserNotifications":`Browser-Benachrichtigung wenn Agent fertig ist`,"settings.audioNotifications":`Ton-Benachrichtigung wenn Agent fertig ist`,"settings.enableBrowserNotifications":`Browser-Benachrichtigungen aktivieren`,"settings.testBrowserNotification":`Benachrichtigung testen`,"settings.browserNotificationGranted":`Browser-Benachrichtigungen erlaubt`,"settings.browserNotificationDenied":`Browser-Benachrichtigungen blockiert`,"settings.browserNotificationAsk":`Browser-Berechtigung erforderlich`,"settings.browserNotificationUnsupported":`Browser-Benachrichtigungen nicht verfügbar`,"settings.browserNotificationPermissionNeeded":`Erlaube Browser-Benachrichtigungen, um einen Test zu senden.`,"settings.browserNotificationTestTitle":`Kōbō-Benachrichtigungstest`,"settings.browserNotificationTestBody":`Browser-Benachrichtigungen funktionieren.`,"settings.enableAudio":`Audio aktivieren`,"settings.notificationSound":`Benachrichtigungston`,"settings.notificationSoundHint":`Wird abgespielt, wenn der Agent fertig ist oder eine Berechtigung anfordert.`,"settings.questionSound":`Frageton`,"settings.questionSoundHint":`Wird nur abgespielt, wenn der Agent eine Frage stellt.`,"settings.workspaceCreatedSound":`Ton für Workspace-Erstellung`,"settings.workspaceCreatedSoundHint":`Wird nach dem Erstellen eines Workspaces abgespielt.`,"settings.notificationSoundPreview":`Anhören`,"settings.notificationVolume":`Lautstärke`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Agentenfehler`,"settings.agentErrorSoundHint":`Wird bei Quoten-, Rate-Limit- und Agentenfehlern abgespielt.`,"settings.notificationSoundBasic":`Standardbenachrichtigung`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Arbeit`,"settings.notificationSoundTravailTermine":`Arbeit erledigt`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Das wird knallen`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR und CI`,"settings.soundGeneral":`Allgemeiner Ton`,"settings.soundNone":`Kein Ton`,"settings.prCiFailedSound":`CI fehlgeschlagen`,"settings.prCiRecoveredSound":`CI wieder erfolgreich`,"settings.prChangesRequestedSound":`Änderungen angefordert`,"settings.prApprovedSound":`PR genehmigt`,"settings.prMergeConflictSound":`Merge-Konflikt`,"settings.prReadyToMergeSound":`Bereit zum Mergen`,"settings.prMergedSound":`PR gemergt`,"settings.prCiFailedSoundHint":`Wird abgespielt, wenn die CI fehlschlägt.`,"settings.prCiRecoveredSoundHint":`Wird abgespielt, wenn sich die CI nach einem Fehler erholt.`,"settings.prChangesRequestedSoundHint":`Wird abgespielt, wenn Änderungen angefordert werden.`,"settings.prApprovedSoundHint":`Wird abgespielt, wenn der Pull Request genehmigt wird.`,"settings.prMergeConflictSoundHint":`Wird abgespielt, wenn ein Merge-Konflikt erkannt wird.`,"settings.prReadyToMergeSoundHint":`Wird abgespielt, wenn der Pull Request merge-bereit ist.`,"settings.prMergedSoundHint":`Wird abgespielt, wenn der Pull Request gemergt wird.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Standard-Berechtigungsmodus`,"settings.defaultPermissionModeClaude":`Standard-Berechtigungsmodus (Claude Code)`,"settings.defaultPermissionModeCodex":`Standard-Berechtigungsmodus (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modus bei der Erstellung eines neuen Workspaces. Plan = nur lesen, Bypass = keine Nachfragen, Strict = Edits automatisch akzeptieren mit allow-list, Interaktiv = vor jedem Tool fragen.`,"settings.activityFeed":`Aktivitätsfeed`,"settings.showThinkingBlocks":`Denkblöcke der Agenten anzeigen`,"settings.whipSettings":`Peitsche`,"settings.whipSettingsHint":`Konfiguriere den optionalen Peitschen-Kurzbefehl und die Lautstärke.`,"settings.whipEnabled":`Peitsche aktivieren`,"settings.whipEnabledHint":`Zeigt die interaktive Peitsche in geeigneten laufenden Workspaces an.`,"settings.whipVolume":`Peitschenlautstärke`,"settings.whipVolumeMasterAudioDisabled":`Der Hauptton ist ausgeschaltet. Aktivieren Sie Audio-Benachrichtigungen, um die Peitschenlautstärke anzupassen; der gespeicherte Wert bleibt erhalten.`,"whip.overlayLabel":`Interaktive Peitsche`,"whip.overlayInstructions":`Bewegen Sie den Zeiger, um die Peitsche zu steuern. Drücken Sie Eingabe oder Leertaste zum Knallen. Drücken Sie Escape zum Schließen.`,"settings.whipShortcut":`Peitschen-Tastenkürzel`,"settings.whipShortcutHint":`Klicken Sie und drücken Sie dann das gewünschte Tastenkürzel.`,"settings.whipShortcutRecording":`Tastenkürzel drücken…`,"settings.whipShortcutButtonLabel":`Peitschen-Tastenkürzel: {shortcut}`,"settings.whipShortcutRecordingLabel":`Peitschen-Tastenkürzel wird aufgezeichnet. Tastenkürzel drücken…`,"settings.whipShortcutReset":`Tastenkürzel zurücksetzen`,"settings.whipShortcutReserved":`Dieses Tastenkürzel ist vom Browser reserviert.`,"settings.testIntegration":`Verbindung testen`,"pwa.offline":`Du bist offline. Chat und Agenten benötigen den Kōbō-Server.`,"pwa.reconnecting":`Verbindung zum Kōbō-Server wird wiederhergestellt…`,"pwa.installReady":`Kōbō als App installieren.`,"pwa.install":`Installieren`,"pwa.ignore":`Ignorieren`,"pwa.updateReady":`Ein Kōbō-Update ist verfügbar.`,"pwa.reload":`Neu laden`,"chat.searchWorkspaceHistory":`Workspace-Verlauf durchsuchen`,"chat.historySearch.user":`Sie`,"chat.historySearch.agent":`Agent`,"chat.openInGitDiff":`Im Git-Diff öffnen`,"timeline.title":`Sitzungszeitachse`,"timeline.export":`Diagnose exportieren`,"timeline.unnamed":`Agent-Sitzung`,"timeline.tools":`{count} Tools`,"timeline.errors":`{count} Fehler`,"settings.verboseMessages":`Ausführliche Systemnachrichten anzeigen (task_progress, task_started)`,"settings.availableVariables":`Verfügbare Template-Variablen`,"settings.prPromptTemplate":`PR-Prompt-Vorlage`,"settings.prPromptPlaceholder":`Anweisungen für den Agenten bei der Erstellung von GitHub-PRs...`,"settings.prPromptHint":`Verwenden Sie die oben aufgeführten Platzhalter (doppelte geschweifte Klammern).`,"settings.reviewPromptTemplate":`Review-Prompt-Vorlage`,"settings.reviewPromptPlaceholder":`Anweisungen für den Agenten bei der Review von Branch-Änderungen...`,"settings.ciFixPromptTemplate":`CI-Fix-Prompt-Vorlage`,"settings.ciFixPromptHint":`Wird an den Agenten gesendet, wenn die CI eines Workspaces fehlschlägt. Variablen (doppelte geschweifte Klammern): pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Den Agenten bitten, die fehlschlagenden CI-Jobs zu diagnostizieren und zu beheben...`,"settings.finalizationPromptTemplate":`Auto-Loop-Finalisierungs-Prompt`,"settings.finalizationPromptHint":`Standard-Prompt für die letzte Auto-Loop-Iteration (abschließende Qualitätsprüfungen). Wird verwendet, wenn ein Projekt seinen eigenen Finalisierungs-Prompt leer lässt.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Notion-Initial-Prompt`,"settings.notionInitialPrompt.help":`Wird an den Workspace-Erstellungsprompt angehängt, wenn der Workspace ein Notion-Ticket hat. Variablen: {variables}.`,"settings.notionInitialPrompt.project":`Notion-Initial-Prompt (Überschreibung)`,"settings.sentryInitialPrompt":`Sentry-Initial-Prompt`,"settings.sentryInitialPrompt.help":`Wird an den Workspace-Erstellungsprompt angehängt, wenn der Workspace ein Sentry-Issue hat. Variablen: {variables}.`,"settings.sentryInitialPrompt.project":`Sentry-Initial-Prompt (Überschreibung)`,"settings.initialPrompt.inheritHint":`Leer lassen, um zu erben. Geben Sie ein Leerzeichen ein, um die Injektion auf dieser Ebene zu deaktivieren.`,"settings.resetToDefault":`Zurücksetzen`,"settings.resetFailed":`Standardwert konnte nicht geladen werden`,"settings.sentryIntegration":`Sentry-Integration`,"settings.var.prNumber":`PR-Nummer (z. B. 42)`,"settings.var.prUrl":`Vollständige URL der erstellten PR`,"settings.var.branchName":`Name des Arbeitsbranches`,"settings.var.sourceBranch":`Quellbranch, auf den die PR abzielt`,"settings.var.workspaceName":`Workspace-Name`,"settings.var.projectName":`Letztes Segment des Projektpfads`,"settings.var.notionUrl":`Notion-URL falls gesetzt, sonst leer`,"settings.var.commits":`Aufzählung der Commits zwischen Source und Head`,"settings.var.diffStats":`Git-Shortstat-Zusammenfassung (Dateien, Einfügungen, Löschungen)`,"settings.var.tasks":`Reguläre Aufgaben als Checkliste`,"settings.var.acceptanceCriteria":`Akzeptanzkriterien als Checkliste`,"settings.gitConventions":`Git-Konventionen (global)`,"settings.gitConventionsPlaceholder":`# Git-Konventionen...`,"settings.gitConventionsHint":`Diese Konventionen werden in .ai/.git-conventions.md jedes neuen Arbeitsbereichs geschrieben und müssen vom Agenten vor jeder Git-Operation eingehalten werden. Werden durch projektspezifische Konventionen überschrieben, falls definiert.`,"settings.setupScript":`Setup-Skript`,"settings.cleanupScript":`Cleanup-Skript`,"settings.archiveScript":`Archiv-Skript`,"settings.archiveScriptHint":`Shell-Skript, das serverseitig im Worktree ausgeführt wird, wenn ein Workspace archiviert wird. Leer lassen zum Deaktivieren.`,"settings.archiveScriptPlaceholder":`z. B. Container aufräumen, Speicherplatz freigeben…`,"settings.changeSourceBranchScript":`Quellbranch-Wechsel-Skript`,"settings.changeSourceBranchScript.help":`Ersetzt den eingebauten Cherry-Pick, wenn nicht leer. Das Skript verwaltet Git, PR-Basis, Force-Push und Konflikte; Kōbō verweigert nur, solange der Agent läuft, und aktualisiert die Quellbranch-Metadaten bei Exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — neuer Quellbranch aus dem Dialog
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MainLayout-Cl26t1Yw.js","assets/vue-i18n-C3W5i7h6.js","assets/reactivity.esm-bundler-DtSZKRQB.js","assets/runtime-dom.esm-bundler-DgevF6KV.js","assets/QBtn-B7WFdfmy.js","assets/use-id-DlouqdB8.js","assets/QItemSection-5GBV9MR2.js","assets/permissionModes-Du6lXebH.js","assets/debounce-CDIE7CV6.js","assets/private.use-form-D8Yuc3aU.js","assets/layout-nWIyHeJf.js","assets/QChip-BzB_GF4Z.js","assets/documents-B6eOZeFK.js","assets/render-chat-markdown-DrGdVCku.js","assets/QBadge-BgS0-MXB.js","assets/QSpace-D3PNLwa4.js","assets/ClosePopup-BK6mNWsy.js","assets/efforts-C0gGtu_O.js","assets/use-onboarding-BCM8AGRg.js","assets/TouchPan-CflYDvzb.js","assets/use-onboarding-CTZuBZOi.css","assets/engineFeatures-Cm3wk7lo.js","assets/formatters-D0dU6VcA.js","assets/project-color-tT7gsmB5.js","assets/MainLayout-BCIURScy.css","assets/WorkspacePage-C8SAYVkt.js","assets/QSpinnerDots-DWOFEezR.js","assets/clipboard-t9qe6lK7.js","assets/QPage-RpDxx5ah.js","assets/expand-template-CRv7R1En.js","assets/expand-template-B4LAsXAF.css","assets/QBanner-BoAbhM1O.js","assets/WorkspacePage-xKaXyg_O.css","assets/CreatePage-P4N9bro4.js","assets/QBtnToggle-eMu_yinY.js","assets/QBtnGroup-BMQlX2YS.js","assets/DrawerToggleButton-CBdOJzVZ.js","assets/CreatePage-BCuDTB_0.css","assets/SettingsPage-BmSaJrE5.js","assets/QBtnDropdown-9dpk4IiI.js","assets/SettingsPage-CDZhPV6A.css","assets/SearchPage-B5Wndh73.js","assets/SearchPage-DdWM01rq.css","assets/HealthPage-B0_v81_H.js","assets/HealthPage-BbqLoFQj.css","assets/ChangelogPage-7pgilQJn.js","assets/ChangelogPage-D_WOVByV.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as e,t}from"./vue-i18n-C3W5i7h6.js";import{A as n,B as r,C as i,O as a,T as o,g as s,wt as c,x as l}from"./reactivity.esm-bundler-DtSZKRQB.js";import{$ as u,A as d,At as f,B as p,Bt as m,C as h,Et as g,H as _,It as v,Kt as y,Mt as b,Ot as x,Rt as S,Tt as C,U as w,V as T,W as E,Z as D,_n as O,fn as k,i as A,kt as ee,n as j,st as M,t as te,ut as N,vt as P}from"./runtime-dom.esm-bundler-DgevF6KV.js";import{$ as F,A as ne,B as re,D as ie,G as I,N as ae,O as L,R as oe,S as R,W as z,X as se,Y as ce,Z as B,b as le,et as ue,j as de,k as fe,l as pe,m as me,nt as he,o as ge,p as _e,q as ve,rt as ye,s as be,t as xe,tt as V,u as Se,w as Ce,x as we,z as Te}from"./QBtn-B7WFdfmy.js";import{t as Ee}from"./debounce-CDIE7CV6.js";import{C as De,D as Oe,E as ke,O as Ae,S as je,T as Me,a as Ne,g as Pe,h as Fe,i as Ie,k as Le,m as Re,o as ze,r as Be,s as Ve,t as He,u as Ue,w as We,x as Ge}from"./use-id-DlouqdB8.js";import{i as Ke,n as qe,r as Je}from"./private.use-form-D8Yuc3aU.js";import{a as Ye,i as Xe,n as Ze,r as Qe,t as $e}from"./use-checkbox-z-Qs4ZHY.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var et=[`sm`,`md`,`lg`,`xl`],{passive:tt}=z,nt=F({width:0,height:0,name:`xs`,sizes:{sm:600,md:1024,lg:1440,xl:1920},lt:{sm:!0,md:!0,lg:!0,xl:!0},gt:{xs:!1,sm:!1,md:!1,lg:!1},xs:!0,sm:!1,md:!1,lg:!1,xl:!1},{setSizes:I,setDebounce:I,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed){e.config.screen!==void 0&&(e.config.screen.bodyClasses?this.__update(!0):document.body.classList.remove(`screen--${this.name}`));return}let{visualViewport:n}=window,r=n||window,i=document.scrollingElement||document.documentElement,a=n===void 0||V.is.mobile?()=>[Math.max(window.innerWidth,i.clientWidth),Math.max(window.innerHeight,i.clientHeight)]:()=>[n.width*n.scale+window.innerWidth-i.clientWidth,n.height*n.scale+window.innerHeight-i.clientHeight],o=e.config.screen?.bodyClasses===!0;this.__update=e=>{let[t,n]=a();if(n!==this.height&&(this.height=n),t!==this.width)this.width=t;else if(e!==!0)return;let r=this.sizes;this.gt.xs=t>=r.sm,this.gt.sm=t>=r.md,this.gt.md=t>=r.lg,this.gt.lg=t>=r.xl,this.lt.sm=t<r.sm,this.lt.md=t<r.md,this.lt.lg=t<r.lg,this.lt.xl=t<r.xl,this.xs=this.lt.sm,this.sm=this.gt.xs&&this.lt.md,this.md=this.gt.sm&&this.lt.lg,this.lg=this.gt.md&&this.lt.xl,this.xl=this.gt.lg,r=this.xs&&`xs`||this.sm&&`sm`||this.md&&`md`||this.lg&&`lg`||`xl`,r!==this.name&&(o&&(document.body.classList.remove(`screen--${this.name}`),document.body.classList.add(`screen--${r}`)),this.name=r)};let s,c={},l=16;this.setSizes=e=>{et.forEach(t=>{e[t]!==void 0&&(c[t]=e[t])})},this.setDebounce=e=>{l=e};let u=()=>{let e=getComputedStyle(document.body);e.getPropertyValue(`--q-size-sm`)&&et.forEach(t=>{this.sizes[t]=Number.parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{et.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{s!==void 0&&r.removeEventListener(`resize`,s,tt),s=e>0?Ee(this.__update,e):this.__update,r.addEventListener(`resize`,s,tt)},this.setDebounce(l),Object.keys(c).length===0?this.__update():(this.setSizes(c),c=void 0),o&&this.name===`xs`&&document.body.classList.add(`screen--xs`)};he.value?t.push(u):u()}}),H=F({isActive:!1,mode:!1},{__media:void 0,set(e){H.mode=e,e===`auto`?(H.__media===void 0&&(H.__media=window.matchMedia(`(prefers-color-scheme: dark)`),H.__updateMedia=()=>{H.set(`auto`)},H.__media.addListener(H.__updateMedia)),e=H.__media.matches):H.__media!==void 0&&(H.__media.removeListener(H.__updateMedia),H.__media=void 0),H.isActive=e===!0,document.body.classList.remove(`body--${e===!0?`light`:`dark`}`),document.body.classList.add(`body--${e===!0?`dark`:`light`}`)},toggle(){H.set(!H.isActive)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,this.__installed||this.set(n!==void 0&&n)}});function rt(e,t,n=document.body){if(typeof e!=`string`)throw TypeError(`Expected a string as propName`);if(typeof t!=`string`)throw TypeError(`Expected a string as value`);if(!(n instanceof Element))throw TypeError(`Expected a DOM element`);n.style.setProperty(`--q-${e}`,t)}function it(e){if(e.ios)return`ios`;if(e.android)return`android`}function at({is:e,has:t,within:n},r){let i=[e.desktop?`desktop`:`mobile`,`${t.touch?``:`no-`}touch`];if(e.mobile){let t=it(e);t!==void 0&&i.push(`platform-`+t)}if(e.nativeMobile){let t=e.nativeMobileWrapper,n=r[t];i.push(t,`native-mobile`),e.ios&&(n===void 0||n.iosStatusBarPadding)?i.push(`q-ios-padding`):e.android&&(n===void 0||n.androidStatusBarPadding!==!1)&&i.push(`q-safe-area-padding`)}else e.electron?i.push(`electron`):e.bex&&i.push(`bex`);return n.iframe&&i.push(`within-iframe`),i}function ot(){let{is:e}=V,t=document.body.className,n=new Set(t.replaceAll(/ {2}/g,` `).split(` `));if(!e.nativeMobile&&!e.electron&&!e.bex){if(e.desktop)n.delete(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`),n.add(`desktop`);else if(e.mobile){n.delete(`desktop`),n.add(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`);let t=it(e);t!==void 0&&n.add(`platform-${t}`)}}V.has.touch&&(n.delete(`no-touch`),n.add(`touch`)),V.within.iframe&&n.add(`within-iframe`);let r=[...n].join(` `);t!==r&&(document.body.className=r)}function st(e){for(let t in e)rt(t,e[t])}var ct={install(e){if(!this.__installed){if(he.value)ot();else{let{$q:t}=e;t.config.brand!==void 0&&st(t.config.brand),document.body.classList.add(...at(V,t.config))}V.is.ios&&document.body.addEventListener(`touchstart`,I),window.addEventListener(`keydown`,Te,!0)}}},lt=()=>!0;function ut(e){return typeof e==`string`&&e!==``&&e!==`/`&&e!==`#/`}function dt(e){return e.startsWith(`#`)&&(e=e.slice(1)),e.startsWith(`/`)||(e=`/`+e),e.endsWith(`/`)&&(e=e.slice(0,-1)),`#`+e}function ft(e){if(e.backButtonExit===!1)return()=>!1;if(e.backButtonExit===`*`)return lt;let t=[`#/`];return Array.isArray(e.backButtonExit)&&t.push(...e.backButtonExit.filter(ut).map(dt)),()=>t.includes(window.location.hash)}var pt={__history:[],add:I,remove:I,install({$q:e}){if(this.__installed)return;let{cordova:t,capacitor:n}=V.is;if(!t&&!n)return;let r=e.config[t?`cordova`:`capacitor`];if(r?.backButton===!1||n&&(window.Capacitor===void 0||window.Capacitor.Plugins.App===void 0))return;this.add=e=>{e.condition===void 0&&(e.condition=lt),this.__history.push(e)},this.remove=e=>{let t=this.__history.indexOf(e);t!==-1&&this.__history.splice(t,1)};let i=ft({backButtonExit:!0,...r}),a=()=>{if(this.__history.length!==0){let e=this.__history.at(-1);e.condition()&&(this.__history.pop(),e.handler())}else i()?navigator.app.exitApp():window.history.back()};t?document.addEventListener(`deviceready`,()=>{document.addEventListener(`backbutton`,a,!1)}):window.Capacitor.Plugins.App.addListener(`backButton`,a)}},mt={isoName:`en-US`,nativeName:`English (US)`,label:{clear:`Clear`,ok:`OK`,cancel:`Cancel`,close:`Close`,set:`Set`,select:`Select`,reset:`Reset`,remove:`Remove`,update:`Update`,create:`Create`,search:`Search`,filter:`Filter`,refresh:`Refresh`,expand:e=>e?`Expand "${e}"`:`Expand`,collapse:e=>e?`Collapse "${e}"`:`Collapse`},date:{days:`Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday`.split(`_`),daysShort:`Sun_Mon_Tue_Wed_Thu_Fri_Sat`.split(`_`),months:`January_February_March_April_May_June_July_August_September_October_November_December`.split(`_`),monthsShort:`Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec`.split(`_`),firstDayOfWeek:0,format24h:!1,pluralDay:`days`,prevMonth:`Previous month`,nextMonth:`Next month`,prevYear:`Previous year`,nextYear:`Next year`,today:`Today`,prevRangeYears:e=>`Previous ${e} years`,nextRangeYears:e=>`Next ${e} years`},table:{noData:`No data available`,noResults:`No matching records found`,loading:`Loading...`,selectedRecords:e=>e===1?`1 record selected.`:(e===0?`No`:e)+` records selected.`,recordsPerPage:`Records per page:`,allRows:`All`,pagination:(e,t,n)=>e+`–`+t+` of `+n,columns:`Columns`},pagination:{first:`First page`,prev:`Previous page`,next:`Next page`,last:`Last page`},editor:{url:`URL`,bold:`Bold`,italic:`Italic`,strikethrough:`Strikethrough`,underline:`Underline`,unorderedList:`Unordered List`,orderedList:`Ordered List`,subscript:`Subscript`,superscript:`Superscript`,hyperlink:`Hyperlink`,toggleFullscreen:`Toggle Fullscreen`,quote:`Quote`,left:`Left align`,center:`Center align`,right:`Right align`,justify:`Justify align`,print:`Print`,outdent:`Decrease indentation`,indent:`Increase indentation`,removeFormat:`Remove formatting`,formatting:`Formatting`,fontSize:`Font Size`,align:`Align`,hr:`Insert Horizontal Rule`,undo:`Undo`,redo:`Redo`,heading1:`Heading 1`,heading2:`Heading 2`,heading3:`Heading 3`,heading4:`Heading 4`,heading5:`Heading 5`,heading6:`Heading 6`,paragraph:`Paragraph`,code:`Code`,size1:`Very small`,size2:`A bit small`,size3:`Normal`,size4:`Medium-large`,size5:`Big`,size6:`Very big`,size7:`Maximum`,defaultFont:`Default Font`,viewSource:`View Source`},tree:{noNodes:`No nodes available`,noResults:`No matching nodes found`}};function ht(){let e=Array.isArray(navigator.languages)&&navigator.languages.length!==0?navigator.languages[0]:navigator.language;if(typeof e==`string`)return e.split(/[-_]/).map((e,t)=>t===0?e.toLowerCase():t>1||e.length<4?e.toUpperCase():e[0].toUpperCase()+e.slice(1).toLowerCase()).join(`-`)}var gt=F({__qLang:{}},{getLocale:ht,set(e=mt,t){let n={...e,rtl:e.rtl===!0,getLocale:ht};if(n.set=gt.set,gt.__langConfig===void 0||!gt.__langConfig.noHtmlAttrs){let e=document.documentElement;e.setAttribute(`dir`,n.rtl?`rtl`:`ltr`),e.setAttribute(`lang`,n.isoName)}Object.assign(gt.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=gt.__qLang,gt.__langConfig=e.config.lang,this.__installed?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qLang,{get:Reflect.get,ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`&&e!==`getLocale`)}}),this.set(t||mt))}}),_t={name:`material-icons`,type:{positive:`check_circle`,negative:`warning`,info:`info`,warning:`priority_high`},arrow:{up:`arrow_upward`,right:`arrow_forward`,down:`arrow_downward`,left:`arrow_back`,dropdown:`arrow_drop_down`},chevron:{left:`chevron_left`,right:`chevron_right`},colorPicker:{spectrum:`gradient`,tune:`tune`,palette:`style`},pullToRefresh:{icon:`refresh`},carousel:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`,navigationIcon:`lens`},chip:{remove:`cancel`,selected:`check`},datetime:{arrowLeft:`chevron_left`,arrowRight:`chevron_right`,now:`access_time`,today:`today`},editor:{bold:`format_bold`,italic:`format_italic`,strikethrough:`strikethrough_s`,underline:`format_underlined`,unorderedList:`format_list_bulleted`,orderedList:`format_list_numbered`,subscript:`vertical_align_bottom`,superscript:`vertical_align_top`,hyperlink:`link`,toggleFullscreen:`fullscreen`,quote:`format_quote`,left:`format_align_left`,center:`format_align_center`,right:`format_align_right`,justify:`format_align_justify`,print:`print`,outdent:`format_indent_decrease`,indent:`format_indent_increase`,removeFormat:`format_clear`,formatting:`text_format`,fontSize:`format_size`,align:`format_align_left`,hr:`remove`,undo:`undo`,redo:`redo`,heading:`format_size`,code:`code`,size:`format_size`,font:`font_download`,viewSource:`code`},expansionItem:{icon:`keyboard_arrow_down`,denseIcon:`arrow_drop_down`},fab:{icon:`add`,activeIcon:`close`},field:{clear:`cancel`,error:`error`},pagination:{first:`first_page`,prev:`keyboard_arrow_left`,next:`keyboard_arrow_right`,last:`last_page`},rating:{icon:`grade`},stepper:{done:`check`,active:`edit`,error:`warning`},tabs:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`},table:{arrowUp:`arrow_upward`,warning:`warning`,firstPage:`first_page`,prevPage:`chevron_left`,nextPage:`chevron_right`,lastPage:`last_page`},tree:{icon:`play_arrow`},uploader:{done:`done`,clear:`clear`,add:`add_box`,upload:`cloud_upload`,removeQueue:`clear_all`,removeUploaded:`done_all`}},vt=F({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=vt.set,Object.assign(vt.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){e.config.iconMapFn!==void 0&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,ye(e,`iconMapFn`,()=>this.iconMapFn,e=>{this.iconMapFn=e}),this.__installed?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get:Reflect.get,ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`)}}),this.set(t||_t))}});function yt(e,t){if(e===t)return!0;if(e!==null&&t!==null&&typeof e==`object`&&typeof t==`object`){if(e.constructor!==t.constructor)return!1;let n,r;if(e.constructor===Array){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!yt(e[r],t[r]))return!1;return!0}if(e.constructor===Map){if(e.size!==t.size)return!1;let n=e.entries();for(r=n.next();!r.done;){if(!t.has(r.value[0]))return!1;r=n.next()}for(n=e.entries(),r=n.next();!r.done;){if(!yt(r.value[1],t.get(r.value[0])))return!1;r=n.next()}return!0}if(e.constructor===Set){if(e.size!==t.size)return!1;let n=e.entries();for(r=n.next();!r.done;){if(!t.has(r.value[0]))return!1;r=n.next()}return!0}if(e.buffer!=null&&e.buffer.constructor===ArrayBuffer){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();let i=Object.keys(e).filter(t=>e[t]!==void 0);if(n=i.length,n!==Object.keys(t).filter(e=>t[e]!==void 0).length)return!1;for(r=n;r--!==0;){let n=i[r];if(!yt(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}function U(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function bt(e){return typeof e==`number`&&Number.isFinite(e)}var xt=[ue,ct,H,nt,pt,gt,vt];function St(e,t){let n=A(e);n.config.globalProperties=t.config.globalProperties;let{reload:r,...i}=t._context;return Object.assign(n._context,i),n}function Ct(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}function wt(e,t,n){e.config.globalProperties.$q=n.$q,e.provide(`_q_`,n.$q),Ct(n,xt),t.components!==void 0&&Object.values(t.components).forEach(t=>{U(t)&&t.name!==void 0&&e.component(t.name,t)}),t.directives!==void 0&&Object.values(t.directives).forEach(t=>{U(t)&&t.name!==void 0&&e.directive(t.name,t)}),t.plugins!==void 0&&Ct(n,Object.values(t.plugins).filter(e=>typeof e.install==`function`&&!xt.includes(e))),he.value&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}var Tt={name:`Quasar`,version:`2.24.0`,install:function(e,t={}){let n={version:`2.24.0`};de?n.config=t.config||{}:(t.config!==void 0&&Object.assign(ne,t.config),n.config={...ne},fe()),wt(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})},lang:gt,iconSet:vt},W=B({name:`QCardSection`,props:{tag:{type:String,default:`div`},horizontal:Boolean},setup(e,{slots:t}){let n=p(()=>`q-card__section q-card__section--${e.horizontal?`horiz row no-wrap`:`vert`}`);return()=>N(e.tag,{class:n.value},R(t.default))}}),Et={xs:2,sm:4,md:6,lg:10,xl:14};function Dt(e){return{transform:`scale3d(${e},1,1)`}}var Ot=B({name:`QLinearProgress`,props:{...Le,...L,value:{type:Number,default:0},buffer:Number,color:String,trackColor:String,reverse:Boolean,stripe:Boolean,indeterminate:Boolean,query:Boolean,rounded:Boolean,animationSpeed:{type:[String,Number],default:2100},instantFeedback:Boolean},setup(e,{slots:t}){let{proxy:n}=M(),r=Ae(e,n.$q),i=ie(e,Et),a=p(()=>e.indeterminate||e.query),o=p(()=>({...i.value===null?{}:i.value,"--q-linear-progress-speed":`${e.animationSpeed}ms`})),s=p(()=>`q-linear-progress`+(e.color===void 0?``:` text-${e.color}`)+(e.reverse||e.query?` q-linear-progress--reverse`:``)+(e.rounded?` rounded-borders`:``)),c=p(()=>Dt(e.buffer===void 0?1:e.buffer)),l=p(()=>`with${e.instantFeedback?`out`:``}-transition`),u=p(()=>`q-linear-progress__track absolute-full q-linear-progress__track--${l.value} q-linear-progress__track--${r.value?`dark`:`light`}`+(e.trackColor===void 0?``:` bg-${e.trackColor}`)),d=p(()=>Dt(a.value?1:e.value)),f=p(()=>`q-linear-progress__model absolute-full q-linear-progress__model--${l.value} q-linear-progress__model--${a.value?`in`:``}determinate`),m=p(()=>({width:`${e.value*100}%`})),h=p(()=>`q-linear-progress__stripe absolute-${e.reverse?`right`:`left`} q-linear-progress__stripe--${l.value}`);return()=>{let n=[N(`div`,{class:u.value,style:c.value}),N(`div`,{class:f.value,style:d.value})];return e.stripe&&!a.value&&n.push(N(`div`,{class:h.value,style:m.value})),N(`div`,{class:s.value,style:o.value,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":e.indeterminate?void 0:e.value},le(t.default,n))}}}),kt=B({name:`QCard`,props:{...Le,tag:{type:String,default:`div`},square:Boolean,flat:Boolean,bordered:Boolean},setup(e,{slots:t}){let{proxy:{$q:n}}=M(),r=Ae(e,n),i=p(()=>`q-card`+(r.value?` q-card--dark q-dark`:``)+(e.bordered?` q-card--bordered`:``)+(e.square?` q-card--square no-border-radius`:``)+(e.flat?` q-card--flat no-shadow`:``));return()=>N(e.tag,{class:i.value},R(t.default))}});function At(e,t,n){let r;function i(){r!==void 0&&(pt.remove(r),r=void 0)}return x(()=>{e.value&&i()}),{removeFromHistory:i,addToHistory(){r={condition:()=>n.value,handler:t},pt.add(r)}}}var jt=0,Mt,Nt,Pt,Ft=!1,It,Lt,Rt,zt=null;function Bt(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function Vt(e){Ft||(Ft=!0,requestAnimationFrame(()=>{Ft=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:r}=document.scrollingElement;(Pt===void 0||t!==window.innerHeight)&&(Pt=n-t,document.scrollingElement.scrollTop=r),r>Pt&&(document.scrollingElement.scrollTop-=Math.ceil((r-Pt)/8))}))}function Ht(e){let t=document.body,n=window.visualViewport!==void 0;if(e===`add`){let{overflowY:e,overflowX:r}=window.getComputedStyle(t);Mt=Ve(window),Nt=Ue(window),It=t.style.left,Lt=t.style.top,Rt=window.location.pathname,t.style.left=`-${Mt}px`,t.style.top=`-${Nt}px`,r!==`hidden`&&(r===`scroll`||t.scrollWidth>window.innerWidth)&&t.classList.add(`q-body--force-scrollbar-x`),e!==`hidden`&&(e===`scroll`||t.scrollHeight>window.innerHeight)&&t.classList.add(`q-body--force-scrollbar-y`),document.documentElement.classList.add(`q-document--prevent-scroll`),document.qScrollPrevented=!0,V.is.ios&&(n?(window.scrollTo(0,0),window.visualViewport.addEventListener(`resize`,Vt,z.passiveCapture),window.visualViewport.addEventListener(`scroll`,Vt,z.passiveCapture),window.scrollTo(0,0)):window.addEventListener(`scroll`,Bt,z.passiveCapture))}else V.is.ios&&(n?(window.visualViewport.removeEventListener(`resize`,Vt,z.passiveCapture),window.visualViewport.removeEventListener(`scroll`,Vt,z.passiveCapture)):window.removeEventListener(`scroll`,Bt,z.passiveCapture)),document.documentElement.classList.remove(`q-document--prevent-scroll`),t.classList.remove(`q-body--force-scrollbar-x`,`q-body--force-scrollbar-y`),document.qScrollPrevented=!1,t.style.left=It,t.style.top=Lt,window.location.pathname===Rt&&window.scrollTo(Mt,Nt),Pt=void 0}function Ut(e){let t=`add`;if(e===!0){if(jt++,zt!==null){clearTimeout(zt),zt=null;return}if(jt>1)return}else{if(jt===0||(jt--,jt>0))return;if(t=`remove`,V.is.ios&&V.is.nativeMobile){zt!==null&&clearTimeout(zt),zt=setTimeout(()=>{Ht(t),zt=null},100);return}}Ht(t)}function Wt(){let e;return{preventBodyScroll(t){t!==e&&(e!==void 0||t)&&(e=t,Ut(t))}}}var Gt=[];function Kt(e){Gt.at(-1)(e)}function qt(e){V.is.desktop&&(Gt.push(e),Gt.length===1&&document.body.addEventListener(`focusin`,Kt))}function Jt(e){let t=Gt.indexOf(e);t!==-1&&(Gt.splice(t,1),Gt.length===0&&document.body.removeEventListener(`focusin`,Kt))}var Yt=new Map;function Xt(e){for(let[t,n]of Yt)if(n.$el.contains(e)===!0)return t}function Zt(e,t){if(e==null)return!1;let n=new Set;for(let r=Xt(t);r!==void 0&&n.has(r)===!1;r=Xt(r)){if(Se(e,r)===!0)return!0;n.add(r)}return!1}var Qt=0,$t={standard:`fixed-full flex-center`,top:`fixed-top justify-center`,bottom:`fixed-bottom justify-center`,right:`fixed-right items-center`,left:`fixed-left items-center`},en={standard:[`scale`,`scale`],top:[`slide-down`,`slide-up`],bottom:[`slide-up`,`slide-down`],right:[`slide-left`,`slide-right`],left:[`slide-right`,`slide-left`]},tn=B({name:`QDialog`,inheritAttrs:!1,props:{...Me,...je,transitionShow:String,transitionHide:String,persistent:Boolean,autoClose:Boolean,allowFocusOutside:Boolean,noEscDismiss:Boolean,noBackdropDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,noShake:Boolean,seamless:Boolean,maximized:Boolean,fullWidth:Boolean,fullHeight:Boolean,square:Boolean,backdropFilter:String,position:{type:String,default:`standard`,validator:e=>[`standard`,`top`,`bottom`,`left`,`right`].includes(e)}},emits:[...We,`shake`,`click`,`escapeKey`],setup(e,{slots:t,emit:n,attrs:r}){let a=M(),o=i(null),s=i(!1),c=i(!1),l=null,u=null,d=!1,f=!1,m=p(()=>!e.persistent&&!e.noRouteDismiss&&!e.seamless),{preventBodyScroll:h}=Wt(),{registerTimeout:g}=Oe(),{registerTick:_,removeTick:v}=ke(),{transitionProps:y,transitionStyle:b}=Ge(e,()=>en[e.position][0],()=>en[e.position][1]),S=p(()=>b.value+(e.backdropFilter===void 0?``:`;backdrop-filter:${e.backdropFilter};-webkit-backdrop-filter:${e.backdropFilter}`)),{showPortal:C,hidePortal:w,portalIsAccessible:T,renderPortal:E}=Re(a,o,le,`dialog`),{hide:D}=De({showing:s,hideOnRouteChange:m,handleShow:ne,handleHide:re,handleRouteChange:ie,processOnMount:!0}),{addToHistory:O,removeFromHistory:A}=At(s,D,m),ee=p(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${e.maximized?`maximized`:`minimized`} q-dialog__inner--${e.position} ${$t[e.position]}`+(c.value?` q-dialog__inner--animating`:``)+(e.fullWidth?` q-dialog__inner--fullwidth`:``)+(e.fullHeight?` q-dialog__inner--fullheight`:``)+(e.square?` q-dialog__inner--square`:``)),j=p(()=>s.value&&!e.seamless),P=p(()=>e.autoClose?{onClick:se}:{}),F=p(()=>[`q-dialog fullscreen no-pointer-events q-dialog--${j.value?`modal`:`seamless`}`,r.class]);k(()=>e.maximized,e=>{s.value&&z(e)}),k(j,e=>{h(e),e?(qt(B),Ne(L)):(Jt(B),ze(L))});function ne(t){O(),u=!e.noRefocus&&document.activeElement!==null?document.activeElement:null,z(e.maximized),C(),c.value=!0,e.noFocus?v():(document.activeElement?.blur(),_(I)),g(()=>{if(a.proxy.$q.platform.is.ios){if(!e.seamless&&document.activeElement){let{top:e,bottom:t}=document.activeElement.getBoundingClientRect(),{innerHeight:n}=window,r=window.visualViewport===void 0?n:window.visualViewport.height;e>0&&t>r/2&&(document.scrollingElement.scrollTop=Math.min(document.scrollingElement.scrollHeight-r,t>=n?1/0:Math.ceil(document.scrollingElement.scrollTop+t-r/2))),document.activeElement.scrollIntoView()}f=!0,o.value.click(),f=!1}C(!0),c.value=!1,n(`show`,t)},e.transitionDuration)}function re(t){if(v(),A(),oe(!0),c.value=!0,w(),u!==null){let e=(t?.type.indexOf(`key`)===0?u.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||u;u=null,Fe(()=>{e.isConnected&&e.focus({preventScroll:!0})})}g(()=>{w(!0),c.value=!1,n(`hide`,t)},e.transitionDuration)}function ie(){u=null}function I(e){Fe(()=>{let t=o.value;if(t!==null){if(e!==void 0){let n=t.querySelector(e);if(n!==null){n.focus({preventScroll:!0});return}}t.contains(document.activeElement)||(t=t.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||t.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||t.querySelector(`[autofocus], [data-autofocus]`)||t,t.focus({preventScroll:!0}))}})}function ae(e){e&&typeof e.focus==`function`?e.focus({preventScroll:!0}):I(),n(`shake`);let t=o.value;t!==null&&(t.classList.remove(`q-animate--scale`),t.classList.add(`q-animate--scale`),l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,o.value!==null&&(t.classList.remove(`q-animate--scale`),I())},170))}function L(){e.seamless||(e.persistent||e.noEscDismiss?!e.maximized&&!e.noShake&&ae():(n(`escapeKey`),D()))}function oe(t){l!==null&&(clearTimeout(l),l=null),(t||s.value)&&(z(!1),e.seamless||(h(!1),Jt(B),ze(L))),t||(u=null)}function z(e){e?d||=(Qt<1&&document.body.classList.add(`q-body--dialog`),Qt++,!0):d&&=(Qt<2&&document.body.classList.remove(`q-body--dialog`),Qt--,!1)}function se(e){f||(D(e),n(`click`,e))}function ce(t){!e.persistent&&!e.noBackdropDismiss?D(t):e.noShake||ae()}function B(t){!e.allowFocusOutside&&T.value&&!Se(o.value,t.target)&&!Zt(o.value,t.target)&&I(`[tabindex]:not([tabindex="-1"])`)}Object.assign(a.proxy,{focus:I,shake:ae,__updateRefocusTarget(e){u=e||null}}),x(oe);function le(){return N(`div`,{role:`dialog`,"aria-modal":j.value?`true`:`false`,...r,class:F.value},[N(te,{name:`q-transition--fade`,appear:!0},()=>j.value?N(`div`,{class:`q-dialog__backdrop fixed-full`,style:S.value,"aria-hidden":`true`,onClick:ce}):null),N(te,y.value,()=>s.value?N(`div`,{ref:o,class:ee.value,style:b.value,tabindex:-1,...P.value},R(t.default)):null)])}return E}});function nn(e){"@babel/helpers - typeof";return nn=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},nn(e)}function rn(e,t){if(nn(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(nn(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function an(e){var t=rn(e,`string`);return nn(t)==`symbol`?t:t+``}function on(e,t,n){return(t=an(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var sn=Ie(`migration`,()=>{let e=i({state:`idle`});async function t(){try{let t=await fetch(`/api/migration/status`);if(!t.ok)return;e.value=await t.json()}catch{}}function n(t){e.value={...t}}return{status:e,fetchInitial:t,update:n}}),cn={class:`text-h6`},ln={class:`text-h6`},un={class:`text-h6 text-negative`},dn={class:`q-mt-sm`},fn={key:0,class:`q-mt-md text-caption`},pn={class:`q-mt-md text-caption`},mn=u({__name:`MigrationOverlay`,setup(t){let{t:n}=e(),i=sn(),a=p(()=>[`backing-up`,`running`,`error`].includes(i.status.state));return b(()=>{i.fetchInitial()}),(e,t)=>(S(),_(tn,{modelValue:a.value,"onUpdate:modelValue":t[0]||=e=>a.value=e,persistent:``,"no-backdrop-dismiss":``},{default:O(()=>[D(kt,{style:{"min-width":`400px`}},{default:O(()=>[r(i).status.state===`backing-up`?(S(),_(W,{key:0},{default:O(()=>[T(`div`,cn,c(r(n)(`migration.backing_up`)),1),D(Ce,{class:`q-mt-md`})]),_:1})):r(i).status.state===`running`?(S(),_(W,{key:1},{default:O(()=>[T(`div`,ln,c(r(n)(`migration.running`,{processed:r(i).status.processed,total:r(i).status.total})),1),D(Ot,{value:r(i).status.total>0?r(i).status.processed/r(i).status.total:0,class:`q-mt-md`},null,8,[`value`])]),_:1})):r(i).status.state===`error`?(S(),_(W,{key:2},{default:O(()=>[T(`div`,un,c(r(n)(`migration.error`)),1),T(`div`,dn,c(r(i).status.errorMessage),1),r(i).status.backupPath?(S(),E(`div`,fn,c(r(n)(`migration.backup_location`,{path:r(i).status.backupPath})),1)):w(``,!0),T(`div`,pn,c(r(n)(`migration.retry`)),1)]),_:1})):w(``,!0)]),_:1})]),_:1},8,[`modelValue`]))}}),hn=/^on[A-Z]/;function gn(){let e=M(),{attrs:t}=e,n={listeners:i({}),attributes:i({})};function r(){let r={},i={};for(let e in t)e!==`class`&&e!==`style`&&!hn.test(e)&&(r[e]=t[e]);for(let t in e.vnode.props)hn.test(t)&&(i[t]=e.vnode.props[t]);n.attributes.value=r,n.listeners.value=i}return ee(r),r(),n}function _n({validate:e,resetValidation:t,requiresQForm:n}){let r=P(ae,!1);if(r!==!1){let{props:n,proxy:i}=M();Object.assign(i,{validate:e,resetValidation:t}),k(()=>n.disable,e=>{e?(typeof t==`function`&&t(),r.unbindComponent(i)):r.bindComponent(i)}),b(()=>{n.disable||r.bindComponent(i)}),x(()=>{n.disable||r.unbindComponent(i)})}else n&&console.error(`Parent QForm not found on useFormChild()!`)}var vn=/^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/,yn=/^#[0-9a-fA-F]{4}([0-9a-fA-F]{4})?$/,bn=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,xn=/^rgb\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5])\)$/,Sn=/^rgba\(((0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),){2}(0|[1-9][\d]?|1[\d]{0,2}|2[\d]?|2[0-4][\d]|25[0-5]),(0(\.[\d]+)?|1(\.0+)?)\)$/,Cn=/^-?[\d]+\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])$/,wn=/^([0-1]?\d|2[0-3]):[0-5]\d$/,Tn=/^([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/,En=/^([0-1]?\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/,Dn=/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,On={date:e=>Cn.test(e),time:e=>wn.test(e),fulltime:e=>Tn.test(e),timeOrFulltime:e=>En.test(e),email:e=>Dn.test(e),hexColor:e=>vn.test(e),hexaColor:e=>yn.test(e),hexOrHexaColor:e=>bn.test(e),rgbColor:e=>xn.test(e),rgbaColor:e=>Sn.test(e),rgbOrRgbaColor:e=>xn.test(e)||Sn.test(e),hexOrRgbColor:e=>vn.test(e)||xn.test(e),hexaOrRgbaColor:e=>yn.test(e)||Sn.test(e),anyColor:e=>bn.test(e)||xn.test(e)||Sn.test(e)},kn=[!0,!1,`ondemand`],An={modelValue:{},error:{type:Boolean,default:null},errorMessage:String,noErrorIcon:Boolean,rules:Array,reactiveRules:Boolean,lazyRules:{type:[Boolean,String],default:!1,validator:e=>kn.includes(e)}};function jn(e,t){let{props:n,proxy:r}=M(),a=i(!1),o=i(null),s=i(!1);_n({validate:_,resetValidation:g});let c=0,l,u=p(()=>n.rules!==void 0&&n.rules!==null&&n.rules.length!==0),d=p(()=>!n.disable&&u.value&&!t.value),f=p(()=>n.error===!0||a.value),m=p(()=>typeof n.errorMessage==`string`&&n.errorMessage.length!==0?n.errorMessage:o.value);k(()=>n.modelValue,()=>{s.value=!0,d.value&&n.lazyRules===!1&&v()});function h(){n.lazyRules!==`ondemand`&&d.value&&s.value&&v()}k(()=>n.reactiveRules,e=>{e?l===void 0&&(l=k(()=>n.rules,h,{immediate:!0,deep:!0})):l!==void 0&&(l(),l=void 0)},{immediate:!0}),k(()=>n.lazyRules,h),k(e,e=>{e?s.value=!0:d.value&&n.lazyRules!==`ondemand`&&v()});function g(){c++,t.value=!1,s.value=!1,a.value=!1,o.value=null,v.cancel()}function _(e=n.modelValue){if(n.disable||!u.value)return!0;let r=++c,i=t.value?()=>{}:()=>{s.value=!0},l=(e,n)=>{e&&i(),a.value=e,o.value=n||null,t.value=!1},d=[];for(let t=0;t<n.rules.length;t++){let r=n.rules[t],i;if(typeof r==`function`?i=r(e,On):typeof r==`string`&&(On[r]===void 0?(console.error(`Unknown validation pattern rule: "${r}"`),i=!1):i=On[r](e)),i===!1||typeof i==`string`)return l(!0,i),!1;i!==!0&&i!==void 0&&d.push(i)}return d.length===0?(l(!1),!0):(t.value=!0,Promise.all(d).then(e=>{if(e===void 0||!Array.isArray(e)||e.length===0)return r===c&&l(!1),!0;let t=e.find(e=>e===!1||typeof e==`string`);return r===c&&l(t!==void 0,t),t===void 0},e=>(r===c&&(console.error(e),l(!0)),!1)))}let v=Ee(_,0);return x(()=>{l?.(),v.cancel()}),Object.assign(r,{resetValidation:g,validate:_}),ye(r,`hasError`,()=>f.value),{isDirtyModel:s,hasRules:u,hasError:f,errorMessage:m,validate:_,resetValidation:g}}function Mn(e){return e!=null&&String(e).length!==0}var Nn={...Le,...An,label:String,stackLabel:Boolean,hint:String,hideHint:Boolean,prefix:String,suffix:String,labelColor:String,color:String,bgColor:String,filled:Boolean,outlined:Boolean,borderless:Boolean,standout:[Boolean,String],square:Boolean,loading:Boolean,labelSlot:Boolean,bottomSlots:Boolean,hideBottomSpace:Boolean,rounded:Boolean,dense:Boolean,itemAligned:Boolean,counter:Boolean,clearable:Boolean,clearIcon:String,disable:Boolean,readonly:Boolean,autofocus:Boolean,for:String,maxlength:[Number,String]},Pn=[`update:modelValue`,`clear`,`focus`,`blur`];function Fn({requiredForAttr:e=!0,tagProp:t,changeEvent:n=!1}={}){let{props:r,proxy:a}=M(),o=Ae(r,a.$q),s=He({required:e,getValue:()=>r.for});return{requiredForAttr:e,changeEvent:n,tag:t?p(()=>r.tag):{value:`label`},isDark:o,editable:p(()=>!r.disable&&!r.readonly),innerLoading:i(!1),focused:i(!1),hasPopupOpen:!1,splitAttrs:gn(),targetUid:s,rootRef:i(null),targetRef:i(null),controlRef:i(null)}}function In(e,t){return t===null?null:N(`div`,{key:e,class:`q-field__append q-field__marginal row no-wrap items-center q-anchor--skip`},t)}function Ln(e){let{props:t,emit:n,slots:r,attrs:i,proxy:a}=M(),{$q:o}=a,s=null;e.hasValue===void 0&&(e.hasValue=p(()=>Mn(t.modelValue))),e.emitValue===void 0&&(e.emitValue=e=>{n(`update:modelValue`,e)}),e.controlEvents===void 0&&(e.controlEvents={onFocusin:ee,onFocusout:j}),Object.assign(e,{clearValue:P,onControlFocusin:ee,onControlFocusout:j,focus:k}),e.computedCounter===void 0&&(e.computedCounter=p(()=>{if(t.counter){let e=typeof t.modelValue==`string`||typeof t.modelValue==`number`?String(t.modelValue).length:Array.isArray(t.modelValue)?t.modelValue.length:0,n=t.maxlength===void 0?t.maxValues:t.maxlength;return e+(n===void 0?``:` / `+n)}}));let{isDirtyModel:c,hasRules:l,hasError:u,errorMessage:d,resetValidation:m}=jn(e.focused,e.innerLoading),h=e.floatingLabel===void 0?p(()=>t.stackLabel||e.focused.value||e.hasValue.value):p(()=>t.stackLabel||e.focused.value||e.floatingLabel.value),_=p(()=>t.bottomSlots||t.hint!==void 0||l.value||t.counter||t.error!==null),v=p(()=>t.filled?`filled`:t.outlined?`outlined`:t.borderless?`borderless`:t.standout?`standout`:`standard`),y=p(()=>`q-field row no-wrap items-start q-field--${v.value}`+(e.fieldClass===void 0?``:` ${e.fieldClass.value}`)+(t.rounded?` q-field--rounded`:``)+(t.square?` q-field--square`:``)+(h.value?` q-field--float`:``)+(w.value?` q-field--labeled`:``)+(t.dense?` q-field--dense`:``)+(t.itemAligned?` q-field--item-aligned q-item-type`:``)+(e.isDark.value?` q-field--dark`:``)+(e.getControl===void 0?` q-field--auto-height`:``)+(e.focused.value?` q-field--focused`:``)+(u.value?` q-field--error`:``)+(u.value||e.focused.value?` q-field--highlighted`:``)+(!t.hideBottomSpace&&_.value?` q-field--with-bottom`:``)+(t.disable?` q-field--disabled`:t.readonly?` q-field--readonly`:``)),S=p(()=>`q-field__control relative-position row no-wrap`+(t.bgColor===void 0?``:` bg-${t.bgColor}`)+(u.value?` text-negative`:typeof t.standout==`string`&&t.standout.length!==0&&e.focused.value?` ${t.standout}`:t.color===void 0?``:` text-${t.color}`)),w=p(()=>t.labelSlot||t.label!==void 0),T=p(()=>`q-field__label no-pointer-events absolute ellipsis`+(t.labelColor!==void 0&&!u.value?` text-${t.labelColor}`:``)),E=p(()=>ye({id:e.targetUid.value,editable:e.editable.value,focused:e.focused.value,floatingLabel:h.value,modelValue:t.modelValue,emitValue:e.emitValue},`field`,()=>e.rootRef.value)),D=p(()=>{let n={};return e.targetUid.value&&(n.for=e.targetUid.value),t.disable&&(n[`aria-disabled`]=`true`),n});function O(){let t=document.activeElement,n=e.targetRef?.value;n&&(t===null||t.id!==e.targetUid.value)&&(n.hasAttribute(`tabindex`)||(n=n.querySelector(`[tabindex]`)),n!==t&&n?.focus({preventScroll:!0}))}function k(){Fe(O)}function A(){Pe(O);let t=document.activeElement;t!==null&&e.rootRef.value.contains(t)&&t.blur()}function ee(t){s!==null&&(clearTimeout(s),s=null),e.editable.value&&!e.focused.value&&(e.focused.value=!0,n(`focus`,t))}function j(t,r){s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null,!(document.hasFocus()&&(e.hasPopupOpen||e.controlRef===void 0||e.controlRef.value===null||e.controlRef.value.contains(document.activeElement)))&&(e.focused.value&&(e.focused.value=!1,n(`blur`,t)),r?.())},0)}function P(r){se(r),o.platform.is.mobile?e.rootRef.value.contains(document.activeElement)&&document.activeElement.blur():(e.targetRef?.value||e.rootRef.value).focus(),t.type===`file`&&(e.inputRef.value.value=null),e.onClear?.(),n(`update:modelValue`,null),e.changeEvent&&n(`change`,null),n(`clear`,t.modelValue),C(()=>{let e=c.value;m(),c.value=e})}function F(e){[13,32].includes(e.keyCode)&&P(e)}function ne(){let n=[];return r.prepend!==void 0&&n.push(N(`div`,{class:`q-field__prepend q-field__marginal row no-wrap items-center`,key:`prepend`,onClick:ve},r.prepend())),n.push(N(`div`,{class:`q-field__control-container col relative-position row no-wrap q-anchor--skip`},re())),u.value&&!t.noErrorIcon&&n.push(In(`error`,[N(pe,{name:o.iconSet.field.error,color:`negative`})])),t.loading||e.innerLoading.value?n.push(In(`inner-loading-append`,r.loading===void 0?[N(Ce,{color:t.color})]:r.loading())):t.clearable&&e.hasValue.value&&e.editable.value&&n.push(In(`inner-clearable-append`,[N(pe,{class:`q-field__focusable-action`,name:t.clearIcon||o.iconSet.field.clear,tabindex:0,role:`button`,"aria-hidden":`false`,"aria-label":o.lang.label.clear,onKeyup:F,onClick:P})])),r.append!==void 0&&n.push(N(`div`,{class:`q-field__append q-field__marginal row no-wrap items-center`,key:`append`,onClick:ve},r.append())),e.getInnerAppend!==void 0&&n.push(In(`inner-append`,e.getInnerAppend())),e.getControlChild!==void 0&&n.push(e.getControlChild()),n}function re(){let n=[];return t.prefix!==void 0&&t.prefix!==null&&n.push(N(`div`,{class:`q-field__prefix no-pointer-events row items-center`},t.prefix)),e.getShadowControl!==void 0&&e.hasShadow.value&&n.push(e.getShadowControl()),w.value&&n.push(N(`div`,{class:T.value},R(r.label,t.label))),e.getControl===void 0?r.rawControl===void 0?r.control!==void 0&&n.push(N(`div`,{ref:e.targetRef,class:`q-field__native row`,tabindex:-1,...e.splitAttrs.attributes.value,"data-autofocus":t.autofocus||void 0},r.control(E.value))):n.push(r.rawControl()):n.push(e.getControl()),t.suffix!==void 0&&t.suffix!==null&&n.push(N(`div`,{class:`q-field__suffix no-pointer-events row items-center`},t.suffix)),n.concat(R(r.default))}function ie(){let n,i;u.value?d.value===null?(n=R(r.error),i=`q--slot-error`):(n=[N(`div`,{role:`alert`},d.value)],i=`q--slot-error-${d.value}`):(!t.hideHint||e.focused.value)&&(t.hint===void 0?(n=R(r.hint),i=`q--slot-hint`):(n=[N(`div`,t.hint)],i=`q--slot-hint-${t.hint}`));let a=t.counter||r.counter!==void 0;if(t.hideBottomSpace&&!a&&n===void 0)return;let o=N(`div`,{key:i,class:`q-field__messages col`},n);return N(`div`,{class:`q-field__bottom row items-start q-field__bottom--`+(t.hideBottomSpace?`stale`:`animated`),onClick:ve},[t.hideBottomSpace?o:N(te,{name:`q-transition--field-message`},()=>o),a?N(`div`,{class:`q-field__counter`},r.counter===void 0?e.computedCounter.value:r.counter()):null])}let I=!1;return f(()=>{I=!0}),g(()=>{I&&t.autofocus&&a.focus()}),t.autofocus&&b(()=>{a.focus()}),x(()=>{s!==null&&clearTimeout(s)}),Object.assign(a,{focus:k,blur:A}),function(){let n=e.getControl===void 0&&r.control===void 0?{...e.splitAttrs.attributes.value,"data-autofocus":t.autofocus||void 0,...D.value}:D.value;return N(e.tag.value,{ref:e.rootRef,class:[y.value,i.class],style:i.style,...n},[r.before===void 0?null:N(`div`,{class:`q-field__before q-field__marginal row no-wrap items-center`,onClick:ve},r.before()),N(`div`,{class:`q-field__inner relative-position col self-stretch`},[N(`div`,{ref:e.controlRef,class:S.value,tabindex:-1,...e.controlEvents},ne()),_.value?ie():null]),r.after===void 0?null:N(`div`,{class:`q-field__after q-field__marginal row no-wrap items-center`,onClick:ve},r.after())])}}var Rn={date:`####/##/##`,datetime:`####/##/## ##:##`,time:`##:##`,fulltime:`##:##:##`,phone:`(###) ### - ####`,card:`#### #### #### ####`},{tokenMap:zn,tokenKeys:Bn}=Vn({"#":{pattern:`[\\d]`,negate:`[^\\d]`},S:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`},N:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`},A:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`,transform:e=>e.toLocaleUpperCase()},a:{pattern:`[a-zA-Z]`,negate:`[^a-zA-Z]`,transform:e=>e.toLocaleLowerCase()},X:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`,transform:e=>e.toLocaleUpperCase()},x:{pattern:`[0-9a-zA-Z]`,negate:`[^0-9a-zA-Z]`,transform:e=>e.toLocaleLowerCase()}});function Vn(e){let t=Object.keys(e),n={};return t.forEach(t=>{let r=e[t];n[t]={...r,regex:new RegExp(r.pattern)}}),{tokenMap:n,tokenKeys:t}}function Hn(e){return RegExp("\\\\([^.*+?^${}()|([\\]])|([.*+?^${}()|[\\]])|(["+e.join(``)+`])|(.)`,`g`)}var Un=/[.*+?^${}()|[\]\\]/g,Wn=Hn(Bn),G=String.fromCodePoint(1),Gn={mask:String,reverseFillMask:Boolean,fillMask:[Boolean,String],unmaskedValue:Boolean,maskTokens:Object};function Kn(e,t,n,r){let a,o,s,c,l,u,d=p(()=>{if(e.maskTokens===void 0||e.maskTokens===null)return{tokenMap:zn,tokenRegexMask:Wn};let{tokenMap:t}=Vn(e.maskTokens),n={...zn,...t};return{tokenMap:n,tokenRegexMask:Hn(Object.keys(n))}}),f=i(null),m=i(g());function h(){return e.autogrow||[`textarea`,`text`,`search`,`url`,`tel`,`password`].includes(e.type)}k(()=>e.type+e.autogrow,v),k(()=>e.mask,n=>{if(n!==void 0)y(m.value,!0);else{let n=D(m.value);v(),e.modelValue!==n&&t(`update:modelValue`,n)}}),k(()=>e.fillMask+e.reverseFillMask,()=>{f.value&&y(m.value,!0)}),k(()=>e.unmaskedValue,()=>{f.value&&y(m.value)}),k(()=>e.maskTokens,()=>{f.value&&y(m.value,!0)},{deep:!0});function g(){if(v(),f.value){let t=T(D(e.modelValue));return e.fillMask===!1?t:O(t)}return e.modelValue}function _(e){if(e<a.length)return a.slice(-e);let t=``,n=a,r=n.indexOf(G);if(r!==-1){for(let r=e-n.length;r>0;r--)t+=G;n=n.slice(0,r)+t+n.slice(r)}return n}function v(){if(f.value=e.mask!==void 0&&e.mask.length!==0&&h(),!f.value){c=void 0,a=``,o=``;return}let t=Rn[e.mask]===void 0?e.mask:Rn[e.mask],n=typeof e.fillMask==`string`&&e.fillMask.length!==0?e.fillMask.slice(0,1):`_`,r=n.replace(Un,String.raw`\$&`),i=[],l=[],u=[],p=e.reverseFillMask,m=``,g=``;t.replace(d.value.tokenRegexMask,(e,t,n,r,a)=>{if(r!==void 0){let e=d.value.tokenMap[r];u.push(e),g=e.negate,p&&=(l.push(`(?:`+g+`+)?(`+e.pattern+`+)?(?:`+g+`+)?(`+e.pattern+`+)?`),!1),l.push(`(?:`+g+`+)?(`+e.pattern+`)?`);return}if(n!==void 0)m=`\\`+(n===`\\`?``:n),u.push(n);else{let e=t===void 0?a:t;m=e===`\\`?String.raw`\\\\`:e.replace(Un,String.raw`\\$&`),u.push(e)}i.push(`([^`+m+`]+)?`+m+`?`)});let _=RegExp(`^`+i.join(``)+`(`+(m===``?`.`:`[^`+m+`]`)+`+)?`+(m===``?``:`[`+m+`]*`)+`$`),v=l.length-1,y=l.map((t,n)=>n===0&&e.reverseFillMask?RegExp(`^`+r+`*`+t):RegExp(n===v?`^`+t+`(`+(g===``?`.`:g)+`+)?`+(e.reverseFillMask?`$`:r+`*`):`^`+t));s=u,c=t=>{let n=_.exec(e.reverseFillMask?t:t.slice(0,u.length+1));n!==null&&(t=n.slice(1).join(``));let r=[],i=y.length;for(let e=0,n=t;e<i;e++){let t=y[e].exec(n);if(t===null)break;n=n.slice(t.shift().length),r.push(...t)}return r.length===0?t:r.join(``)},a=u.map(e=>typeof e==`string`?e:G).join(``),o=a.split(G).join(n)}function y(t,i,s){let c=r.value,u=c?.selectionEnd??0,d=c===null?0:c.value.length-u,f=D(t);i===!0&&v();let p=T(f,i),h=e.fillMask===!1?p:O(p),g=m.value!==h;c!==null&&c.value!==h&&(c.value=h),g&&(m.value=h),c!==null&&document.activeElement===c&&C(()=>{if(h===o){let t=e.reverseFillMask?o.length:0;c.setSelectionRange(t,t,`forward`);return}if(s===`insertFromPaste`&&!e.reverseFillMask){let e=c.selectionEnd,t=u-1;for(let n=l;n<=t&&n<e;n++)a[n]!==G&&t++;x.right(c,t);return}if([`deleteContentBackward`,`deleteContentForward`].includes(s)){let t=e.reverseFillMask?u===0?+(h.length>p.length):Math.max(0,h.length-(h===o?0:Math.min(p.length,d)+1))+1:u;c.setSelectionRange(t,t,`forward`);return}if(e.reverseFillMask){if(g){let e=Math.max(0,h.length-(h===o?0:Math.min(p.length,d+1)));e===1&&u===1?c.setSelectionRange(e,e,`forward`):x.rightReverse(c,e)}else{let e=h.length-d;c.setSelectionRange(e,e,`backward`)}}else if(g){let e=Math.max(0,a.indexOf(G),Math.min(p.length,u)-1);x.right(c,e)}else{let e=u-1;x.right(c,e)}});let _=e.unmaskedValue?D(h):h;String(e.modelValue)!==_&&(e.modelValue!==null||_!==``)&&n(_,!0)}function b(e,t,n){let r=T(D(e.value));t=Math.max(0,a.indexOf(G),Math.min(r.length,t)),l=t,e.setSelectionRange(t,n,`forward`)}let x={left(e,t){let n=!a.slice(t-1).includes(G),r=Math.max(0,t-1);for(;r>=0;r--)if(a[r]===G){t=r,n&&t++;break}if(r<0&&a[t]!==void 0&&a[t]!==G)return x.right(e,0);t>=0&&e.setSelectionRange(t,t,`backward`)},right(e,t){let n=e.value.length,r=Math.min(n,t+1);for(;r<=n;r++)if(a[r]===G){t=r;break}else a[r-1]===G&&(t=r);if(r>n&&a[t-1]!==void 0&&a[t-1]!==G)return x.left(e,n);e.setSelectionRange(t,t,`forward`)},leftReverse(e,t){let n=_(e.value.length),r=Math.max(0,t-1);for(;r>=0;r--)if(n[r-1]===G){t=r;break}else if(n[r]===G&&(t=r,r===0))break;if(r<0&&n[t]!==void 0&&n[t]!==G)return x.rightReverse(e,0);t>=0&&e.setSelectionRange(t,t,`backward`)},rightReverse(e,t){let n=e.value.length,r=_(n),i=!r.slice(0,t+1).includes(G),a=Math.min(n,t+1);for(;a<=n;a++)if(r[a-1]===G){t=a,t>0&&i&&t--;break}if(a>n&&r[t-1]!==void 0&&r[t-1]!==G)return x.leftReverse(e,n);e.setSelectionRange(t,t,`forward`)}};function S(e){t(`click`,e),u=void 0}function w(n){if(t(`keydown`,n),re(n)||n.altKey)return;let i=r.value,a=i.selectionStart,o=i.selectionEnd;if(n.shiftKey||(u=void 0),n.keyCode===37||n.keyCode===39){n.shiftKey&&u===void 0&&(u=i.selectionDirection===`forward`?a:o);let t=x[(n.keyCode===39?`right`:`left`)+(e.reverseFillMask?`Reverse`:``)];if(n.preventDefault(),t(i,u===a?o:a),n.shiftKey){let e=i.selectionStart;i.setSelectionRange(Math.min(u,e),Math.max(u,e),`forward`)}}else n.keyCode===8&&!e.reverseFillMask&&a===o?(x.left(i,a),i.setSelectionRange(i.selectionStart,o,`backward`)):n.keyCode===46&&e.reverseFillMask&&a===o&&(x.rightReverse(i,o),i.setSelectionRange(a,i.selectionEnd,`forward`))}function T(t,n){if(t==null||t===``)return``;if(e.reverseFillMask)return E(t,n);let r=s,i=0,a=``;for(let e=0;e<r.length;e++){let o=t[i],s=r[e];if(typeof s==`string`)a+=s,n===!0&&o===s&&i++;else if(o!==void 0&&s.regex.test(o))a+=s.transform===void 0?o:s.transform(o),i++;else return a}return a}function E(e,t){let n=s,r=a.indexOf(G),i=e.length-1,o=``;for(let a=n.length-1;a>=0&&i!==-1;a--){let s=n[a],c=e[i];if(typeof s==`string`)o=s+o,t===!0&&c===s&&i--;else if(c!==void 0&&s.regex.test(c))do o=(s.transform===void 0?c:s.transform(c))+o,i--,c=e[i];while(r===a&&c!==void 0&&s.regex.test(c));else return o}return o}function D(e){return typeof e!=`string`||c===void 0?typeof e==`number`?c(String(e)):e:c(e)}function O(t){return o.length-t.length<=0?t:e.reverseFillMask&&t.length!==0?o.slice(0,-t.length)+t:t+o.slice(t.length)}return{innerValue:m,hasMask:f,moveCursorForPaste:b,updateMaskValue:y,onMaskedKeydown:w,onMaskedClick:S}}function qn(e,t){function n(){let t=e.modelValue;try{let e=`DataTransfer`in window?new DataTransfer:`ClipboardEvent`in window?new ClipboardEvent(``).clipboardData:void 0;return Object(t)===t&&(`length`in t?[...t]:[t]).forEach(t=>{e.items.add(t)}),{files:e.files}}catch{return{files:void 0}}}return p(t?()=>{if(e.type===`file`)return n()}:n)}var Jn=/[\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFF9F\u4E00-\u9FAF\u3400-\u4DBF]/,Yn=/[\u4E00-\u9FFF\u3400-\u4DBF\u{20000}-\u{2A6DF}\u{2A700}-\u{2B73F}\u{2B740}-\u{2B81F}\u{2B820}-\u{2CEAF}\uF900-\uFAFF\u3300-\u33FF\uFE30-\uFE4F\uF900-\uFAFF\u{2F800}-\u{2FA1F}]/u,Xn=/[\u3131-\u314E\u314F-\u3163\uAC00-\uD7A3]/,Zn=/[a-z0-9_ -]$/i;function Qn(e){return function(t){if(t.type===`compositionend`||t.type===`change`){if(!t.target.qComposing)return;t.target.qComposing=!1,e(t)}else t.type===`compositionupdate`&&!t.target.qComposing&&typeof t.data==`string`&&(V.is.firefox?!Zn.test(t.data):Jn.test(t.data)||Yn.test(t.data)||Xn.test(t.data))&&(t.target.qComposing=!0)}}var $n=B({name:`QInput`,inheritAttrs:!1,props:{...Nn,...Gn,...Ke,modelValue:[String,Number,FileList],modelModifiers:Object,shadowText:String,type:{type:String,default:`text`},debounce:[String,Number],autogrow:Boolean,inputClass:[Array,String,Object],inputStyle:[Array,String,Object]},emits:[...Pn,`paste`,`change`,`keydown`,`click`,`animationend`],setup(e,{emit:t,attrs:n}){let{proxy:r}=M(),{$q:a}=r,o={},s=NaN,c=!1,l=!1,u=null,d,f=i(null),m=Je(e),{innerValue:h,hasMask:g,moveCursorForPaste:_,updateMaskValue:v,onMaskedKeydown:y,onMaskedClick:S}=Kn(e,t,L,f),w=qn(e,!0),T=p(()=>Mn(h.value)),E=Qn(I);function D(e){if(g.value&&e.type===`compositionstart`){e.target.qComposing=!0;return}E(e)}let O=Fn({changeEvent:!0}),A=p(()=>e.type===`textarea`||e.autogrow),ee=p(()=>A.value||[`text`,`search`,`url`,`tel`,`password`].includes(e.type)),j=p(()=>{let t={...O.splitAttrs.listeners.value,onInput:I,onPaste:ie,onChange:se,onBlur:B,onFocus:ce};return t.onCompositionstart=t.onCompositionupdate=t.onCompositionend=D,g.value&&(t.onKeydown=y,t.onClick=S),e.autogrow&&(t.onAnimationend=ae),t}),te=p(()=>{let t={tabindex:0,"data-autofocus":e.autofocus||void 0,rows:e.type===`textarea`?6:void 0,"aria-label":e.label,name:m.value,...O.splitAttrs.attributes.value,id:O.targetUid.value,maxlength:e.maxlength,disabled:e.disable,readonly:e.readonly};return A.value||(t.type=e.type),e.autogrow&&(t.rows=1),t});k(()=>e.type,()=>{f.value&&(f.value.value=e.modelValue)}),k(()=>e.modelValue,t=>{if(u!==null&&(oe(),c=!1,l=!1,delete o.value),g.value){if(l&&(l=!1,String(t)===s))return;v(t)}else h.value!==t&&(h.value=t,e.type===`number`&&Object.hasOwn(o,`value`)&&(c?c=!1:delete o.value),e.modelModifiers?.trim===!0&&Object.hasOwn(o,`value`)&&(typeof o.value!=`string`||o.value.trim()!==t)&&delete o.value);e.autogrow&&C(z)}),k(()=>e.autogrow,e=>{e?C(z):f.value!==null&&n.rows>0&&(f.value.style.height=`auto`)}),k(()=>e.dense,()=>{e.autogrow&&C(z)});function P(){let e=document.activeElement;f.value!==null&&f.value!==e&&(e===null||e.id!==O.targetUid.value)&&f.value.focus({preventScroll:!0})}function F(){Fe(P)}function ne(){Pe(P);let e=document.activeElement;e!==null&&O.rootRef.value.contains(e)&&e.blur()}function re(){f.value?.select()}function ie(n){if(g.value&&e.reverseFillMask!==!0){let e=n.target;_(e,e.selectionStart,e.selectionEnd)}t(`paste`,n)}function I(n){if(!n||!n.target)return;if(e.type===`file`){t(`update:modelValue`,n.target.files);return}let r=n.target.value;if(n.target.qComposing){o.value=r;return}if(g.value)v(r,!1,n.inputType);else if(e.modelModifiers?.trim===!0&&(o.value=r),L(r),ee.value&&n.target===document.activeElement){let{selectionStart:e,selectionEnd:t}=n.target;e!==void 0&&t!==void 0&&C(()=>{n.target===document.activeElement&&r.indexOf(n.target.value)===0&&n.target.setSelectionRange(e,t)})}e.autogrow&&z()}function ae(e){t(`animationend`,e),z()}function L(n,r){d=()=>{u=null,e.type!==`number`&&(e.modelModifiers?.trim!==!0||g.value)&&Object.hasOwn(o,`value`)&&delete o.value,e.modelValue!==n&&s!==n&&(s=n,r===!0&&(l=!0),t(`update:modelValue`,n),C(()=>{s===n&&(s=NaN)})),d=void 0},e.type===`number`&&(c=!0,o.value=n),e.debounce===void 0?d():(u!==null&&clearTimeout(u),o.value=n,u=setTimeout(d,e.debounce))}function oe(){u!==null&&(clearTimeout(u),u=null),d=void 0}function R(){oe(),c=!1,l=!1,delete o.value}function z(){requestAnimationFrame(()=>{let e=f.value;if(e!==null){let t=e.parentNode.style,{scrollTop:n}=e,{overflowY:r,maxHeight:i}=a.platform.is.firefox?{}:window.getComputedStyle(e),o=r!==void 0&&r!==`scroll`;o&&(e.style.overflowY=`hidden`),t.marginBottom=e.scrollHeight-1+`px`,e.style.height=`1px`,e.style.height=e.scrollHeight+`px`,o&&(e.style.overflowY=Number.parseInt(i,10)<e.scrollHeight?`auto`:`hidden`),t.marginBottom=``,e.scrollTop=n}})}function se(e){D(e),u!==null&&(clearTimeout(u),u=null),d?.(),t(`change`,e.target.value)}function B(t){t!==void 0&&ce(t),u!==null&&(clearTimeout(u),u=null),d?.(),c=!1,l=!1,delete o.value,e.type!==`file`&&setTimeout(()=>{f.value!==null&&(f.value.value=h.value===void 0?``:h.value)},0)}function le(){return Object.hasOwn(o,`value`)?o.value:h.value===void 0?``:h.value}x(()=>{B()}),b(()=>{e.autogrow&&z()}),Object.assign(O,{innerValue:h,fieldClass:p(()=>`q-${A.value?`textarea`:`input`}`+(e.autogrow?` q-textarea--autogrow`:``)),hasShadow:p(()=>e.type!==`file`&&typeof e.shadowText==`string`&&e.shadowText.length!==0),inputRef:f,emitValue:L,onClear:R,hasValue:T,floatingLabel:p(()=>T.value&&(e.type!==`number`||Number.isFinite(Number(h.value)))||Mn(e.displayValue)),getControl:()=>N(A.value?`textarea`:`input`,{ref:f,class:[`q-field__native q-placeholder`,e.inputClass],style:e.inputStyle,...te.value,...j.value,...e.type===`file`?w.value:{value:le()}}),getShadowControl:()=>N(`div`,{class:`q-field__native q-field__shadow absolute-bottom no-pointer-events`+(A.value?``:` text-no-wrap`)},[N(`span`,{class:`invisible`},le()),N(`span`,e.shadowText)])});let ue=Ln(O);return Object.assign(r,{focus:F,blur:ne,select:re,getNativeElement:()=>f.value}),ye(r,`nativeEl`,()=>f.value),ue}}),er=B({name:`QCardActions`,props:{...be,vertical:Boolean},setup(e,{slots:t}){let n=ge(e),r=p(()=>`q-card__actions ${n.value} q-card__actions--${e.vertical?`vert column`:`horiz row`}`);return()=>N(`div`,{class:r.value},R(t.default))}}),tr=`kobo:network-token`;function nr(){try{return localStorage.getItem(tr)}catch{return null}}function rr(e){try{localStorage.setItem(tr,e)}catch{}}function ir(e){try{let t=new URL(e,window.location.origin);return t.origin===window.location.origin&&t.pathname.startsWith(`/api/`)}catch{return typeof e==`string`&&e.startsWith(`/api/`)}}function ar(e,t){return t?`${e}${e.includes(`?`)?`&`:`?`}token=${encodeURIComponent(t)}`:e}var or=i(!1);function sr(){or.value=!0}function cr(){or.value=!1}var lr={class:`text-h6`},ur={class:`text-caption text-kobo-3 q-mt-sm`},dr=u({__name:`NetworkLoginDialog`,setup(t){let{t:n}=e(),a=p({get:()=>or.value,set:e=>{e||cr()}}),o=i(``),s=i(!1),l=i(!1),u=i(``);async function d(){let e=o.value.trim();if(e){s.value=!0,l.value=!1;try{let t=await fetch(`/api/settings/network/ping`,{headers:{"X-Kobo-Token":e}});if(t.ok){rr(e),cr(),window.location.reload();return}u.value=t.status===401?n(`network.login.invalid`):n(`network.login.serverError`),l.value=!0}catch{u.value=n(`network.login.unreachable`),l.value=!0}finally{s.value=!1}}}return(e,t)=>(S(),_(tn,{modelValue:a.value,"onUpdate:modelValue":t[1]||=e=>a.value=e,persistent:``},{default:O(()=>[D(kt,{style:{"min-width":`320px`,"max-width":`90vw`}},{default:O(()=>[D(W,null,{default:O(()=>[T(`div`,lr,c(r(n)(`network.login.title`)),1),T(`div`,ur,c(r(n)(`network.login.description`)),1)]),_:1}),D(W,null,{default:O(()=>[D($n,{modelValue:o.value,"onUpdate:modelValue":t[0]||=e=>o.value=e,label:r(n)(`network.login.tokenLabel`),placeholder:r(n)(`network.login.tokenPlaceholder`),error:l.value,"error-message":u.value,autofocus:``,dense:``,outlined:``,onKeyup:h(d,[`enter`])},null,8,[`modelValue`,`label`,`placeholder`,`error`,`error-message`])]),_:1}),D(er,{align:`right`},{default:O(()=>[D(xe,{label:r(n)(`network.login.connect`),color:`primary`,loading:s.value,unelevated:``,onClick:d},null,8,[`label`,`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]))}}),fr=Ie(`templates`,{state:()=>({templates:[],defaultSlugs:[],loading:!1,loaded:!1}),getters:{isDefault:e=>t=>e.defaultSlugs.includes(t)},actions:{async fetchTemplates(){if(!this.loading){this.loading=!0;try{let e=await fetch(`/api/templates`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();this.templates=t.templates,this.defaultSlugs=t.defaultSlugs??[],this.loaded=!0}catch(e){console.error(`[templates store] fetchTemplates failed:`,e)}finally{this.loading=!1}}},async createTemplate(e){let t=await fetch(`/api/templates`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}let n=await t.json();return this.templates.push(n),n},async updateTemplate(e,t){let n=await fetch(`/api/templates/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json(),i=this.templates.findIndex(t=>t.slug===e);return i>=0&&(this.templates[i]=r),r},async reloadDefaults(){let e=await fetch(`/api/templates/reload-defaults`,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error??`HTTP ${e.status}`)}let t=await e.json();return t.added.length>0&&await this.fetchTemplates(),t},async deleteTemplate(e){let t=await fetch(`/api/templates/${encodeURIComponent(e)}`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}this.templates=this.templates.filter(t=>t.slug!==e)},async resetToDefault(e){let t=await fetch(`/api/templates/${encodeURIComponent(e)}/reset-default`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({error:`Reset failed`}));throw Error(e.error??`Reset failed`)}let{template:n}=await t.json(),r=this.templates.findIndex(t=>t.slug===e);return r>=0?this.templates[r]=n:this.templates.push(n),n}}}),pr=B({name:`QAvatar`,props:{...L,fontSize:String,color:String,textColor:String,icon:String,square:Boolean,rounded:Boolean},setup(e,{slots:t}){let n=ie(e),r=p(()=>`q-avatar`+(e.color?` bg-${e.color}`:``)+(e.textColor?` text-${e.textColor} q-chip--colored`:``)+(e.square?` q-avatar--square`:e.rounded?` rounded-borders`:``)),i=p(()=>e.fontSize?{fontSize:e.fontSize}:null);return()=>{let a=e.icon===void 0?void 0:[N(pe,{name:e.icon})];return N(`div`,{class:r.value,style:n.value},[N(`div`,{class:`q-avatar__content row flex-center overflow-hidden`,style:i.value},we(t.default,a))])}}}),mr=0,hr={},gr={},K={},_r={},vr=/^\s*$/,yr=[],br=[void 0,null,!0,!1,``],xr=[`top-left`,`top-right`,`bottom-left`,`bottom-right`,`top`,`bottom`,`left`,`right`,`center`],Sr=[`top-left`,`top-right`,`bottom-left`,`bottom-right`],Cr={positive:{icon:e=>e.iconSet.type.positive,color:`positive`},negative:{icon:e=>e.iconSet.type.negative,color:`negative`},warning:{icon:e=>e.iconSet.type.warning,color:`warning`,textColor:`dark`},info:{icon:e=>e.iconSet.type.info,color:`info`},ongoing:{group:!1,timeout:0,spinner:!0,color:`grey-8`}};function wr(e,t,n){if(!e)return Dr(`parameter required`);let r,i={textColor:`white`};if(e.ignoreDefaults||Object.assign(i,hr),U(e)||(i.type&&Object.assign(i,Cr[i.type]),e={message:e}),Object.assign(i,Cr[e.type||i.type],e),typeof i.icon==`function`&&(i.icon=i.icon(t)),i.spinner=i.spinner?i.spinner===!0?Ce:s(i.spinner):!1,i.meta={hasMedia:!!(i.spinner||i.icon||i.avatar),hasText:Er(i.message)||Er(i.caption)},i.position){if(!xr.includes(i.position))return Dr(`wrong position`,e)}else i.position=`bottom`;if(br.includes(i.timeout))i.timeout=5e3;else{let t=Number.parseFloat(i.timeout);if(!Number.isFinite(t)||t<0)return Dr(`wrong timeout`,e);i.timeout=t}i.timeout===0?i.progress=!1:i.progress&&(i.meta.progressClass=`q-notification__progress`+(i.progressClass?` ${i.progressClass}`:``),i.meta.progressStyle={animationDuration:`${i.timeout+1e3}ms`});let a=[...Array.isArray(e.actions)?e.actions:[],...!e.ignoreDefaults&&Array.isArray(hr.actions)?hr.actions:[],...Array.isArray(Cr[e.type]?.actions)?Cr[e.type].actions:[]],{closeBtn:o}=i;if(o&&a.push({label:typeof o==`string`?o:t.lang.label.close}),i.actions=a.map(({handler:e,noDismiss:t,...n})=>({flat:!0,...n,onClick:typeof e==`function`?()=>{e(),t||c()}:()=>{c()}})),i.multiLine===void 0&&(i.multiLine=i.actions.length>1),Object.assign(i.meta,{class:`q-notification row items-stretch q-notification--${i.multiLine?`multi-line`:`standard`}`+(i.color===void 0?``:` bg-${i.color}`)+(i.textColor===void 0?``:` text-${i.textColor}`)+(i.classes===void 0?``:` ${i.classes}`),wrapperClass:`q-notification__wrapper col relative-position border-radius-inherit `+(i.multiLine?`column no-wrap justify-center`:`row items-center`),contentClass:`q-notification__content row items-center`+(i.multiLine?``:` col`),leftClass:i.meta.hasText?`additional`:`single`,attrs:{role:`alert`,...i.attrs}}),i.group===!1?(i.group=void 0,i.meta.group=void 0):((i.group===void 0||i.group===!0)&&(i.group=[i.message,i.caption,i.multiLine,...i.actions.map(e=>`${e.label}*${e.icon}`)].join(`|`)),i.meta.group=i.group+`|`+i.position),i.actions.length===0?i.actions=void 0:i.meta.actionsClass=`q-notification__actions row items-center `+(i.multiLine?`justify-end`:`col-auto`)+(i.meta.hasMedia?` q-notification__actions--with-media`:``),n!==void 0){n.notif.meta.timer&&(clearTimeout(n.notif.meta.timer),n.notif.meta.timer=void 0),i.meta.uid=n.notif.meta.uid;let e=K[i.position].value.indexOf(n.notif);K[i.position].value[e]=i}else{let t=gr[i.meta.group];if(t===void 0){if(i.meta.uid=mr++,i.meta.badge=1,[`left`,`right`,`center`].includes(i.position))K[i.position].value.splice(Math.floor(K[i.position].value.length/2),0,i);else{let e=i.position.includes(`top`)?`unshift`:`push`;K[i.position].value[e](i)}i.group!==void 0&&(gr[i.meta.group]=i)}else{if(t.meta.timer&&(clearTimeout(t.meta.timer),t.meta.timer=void 0),i.badgePosition!==void 0){if(!Sr.includes(i.badgePosition))return Dr(`wrong badgePosition`,e)}else i.badgePosition=`top-${i.position.includes(`left`)?`right`:`left`}`;i.meta.uid=t.meta.uid,i.meta.badge=t.meta.badge+1,i.meta.badgeClass=`q-notification__badge q-notification__badge--${i.badgePosition}`+(i.badgeColor===void 0?``:` bg-${i.badgeColor}`)+(i.badgeTextColor===void 0?``:` text-${i.badgeTextColor}`)+(i.badgeClass?` ${i.badgeClass}`:``);let n=K[i.position].value.indexOf(t);K[i.position].value[n]=gr[i.meta.group]=i}}let c=()=>{Tr(i),r=void 0};if(i.timeout>0&&(i.meta.timer=setTimeout(()=>{i.meta.timer=void 0,c()},i.timeout+1e3)),i.group!==void 0)return t=>{t===void 0?c():Dr(`trying to update a grouped one which is forbidden`,e)};if(r={dismiss:c,config:e,notif:i},n!==void 0){Object.assign(n,r);return}return e=>{r!==void 0&&(e===void 0?r.dismiss():wr({...r.config,...e,group:!1,position:i.position},t,r))}}function Tr(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=K[e.position].value.indexOf(e);if(t!==-1){e.group!==void 0&&delete gr[e.meta.group];let n=yr[String(e.meta.uid)];if(n){let{width:e,height:t}=getComputedStyle(n);n.style.left=`${n.offsetLeft}px`,n.style.width=e,n.style.height=t}K[e.position].value.splice(t,1),typeof e.onDismiss==`function`&&e.onDismiss()}}function Er(e){return e!=null&&!vr.test(e)}function Dr(e,t){return console.error(`Notify: ${e}`,t),!1}function Or(){return B({name:`QNotifications`,devtools:{hide:!0},setup(){return()=>N(`div`,{class:`q-notifications`},xr.map(e=>N(j,{key:e,class:_r[e],tag:`div`,name:`q-notification--${e}`},()=>K[e].value.map(e=>{let t=e.meta,n=[];if(t.hasMedia&&(e.spinner?n.push(N(e.spinner,{class:`q-notification__spinner q-notification__spinner--`+t.leftClass,color:e.spinnerColor,size:e.spinnerSize})):e.icon?n.push(N(pe,{class:`q-notification__icon q-notification__icon--`+t.leftClass,name:e.icon,color:e.iconColor,size:e.iconSize,role:`img`})):e.avatar&&n.push(N(pr,{class:`q-notification__avatar q-notification__avatar--`+t.leftClass},()=>N(`img`,{src:e.avatar,"aria-hidden":`true`})))),t.hasText){let t,r={class:`q-notification__message col`};if(e.html)r.innerHTML=e.caption?`<div>${e.message}</div><div class="q-notification__caption">${e.caption}</div>`:e.message;else{let n=[e.message];t=e.caption?[N(`div`,n),N(`div`,{class:`q-notification__caption`},[e.caption])]:n}n.push(N(`div`,r,t))}let r=[N(`div`,{class:t.contentClass},n)];return e.progress&&r.push(N(`div`,{key:`${t.uid}|p|${t.badge}`,class:t.progressClass,style:t.progressStyle})),e.actions&&r.push(N(`div`,{class:t.actionsClass},e.actions.map(e=>N(xe,e)))),t.badge>1&&r.push(N(`div`,{key:`${t.uid}|${t.badge}`,class:e.meta.badgeClass,style:e.badgeStyle},[t.badge])),N(`div`,{ref:e=>{yr[String(t.uid)]=e},key:t.uid,class:t.class,...t.attrs},[N(`div`,{class:t.wrapperClass},r)])}))))}})}var kr={setDefaults(e){U(e)&&Object.assign(hr,e)},registerType(e,t){U(t)&&(Cr[e]=t)},install({$q:e,parentApp:t}){if(e.notify=this.create=t=>wr(t,e),e.notify.setDefaults=this.setDefaults,e.notify.registerType=this.registerType,e.config.notify!==void 0&&this.setDefaults(e.config.notify),!this.__installed){xr.forEach(e=>{K[e]=i([]);let t=e===`left`||e===`center`||e===`right`?`center`:e.includes(`top`)?`top`:`bottom`,n=e.includes(`left`)?`start`:e.includes(`right`)?`end`:`center`;_r[e]=`q-notifications__list q-notifications__list--${t} fixed column no-wrap ${e===`left`||e===`right`?`items-${e===`left`?`start`:`end`} justify-center`:e===`center`?`flex-center`:`items-${n}`}`});let e=_e(`q-notify`);St(Or(),t).mount(e)}}},Ar={"model.tooltip":`Modell, das der Agent für diesen Workspace verwendet`,"reasoning.tooltip":`Denkaufwand des Agenten für diesen Workspace`,"thinking.label":`Überlegung`,"thinking.noDetails":`Der Agent denkt nach…`,"common.save":`Speichern`,"common.cancel":`Abbrechen`,"common.retry":`Erneut versuchen`,"common.delete":`Löschen`,"common.close":`Schließen`,"common.dismiss":`Verwerfen`,"common.details":`Details`,"common.ok":`OK`,"whatsNew.title":`Neuigkeiten`,"common.loading":`Laden...`,"common.search":`Suchen...`,"common.refresh":`Aktualisieren`,"common.copy":`Kopieren`,"common.copied":`In die Zwischenablage kopiert`,"common.copyFailed":`Kopieren fehlgeschlagen`,"common.add":`Hinzufügen`,"folderPicker.title":`Ordner auswählen`,"folderPicker.parent":`Übergeordneter Ordner`,"folderPicker.empty":`Keine Unterordner`,"folderPicker.select":`Diesen Ordner auswählen`,"common.start":`Starten`,"common.stop":`Stoppen`,"common.archive":`Archivieren`,"common.unarchive":`Wiederherstellen`,"common.selectWorkspace":`Arbeitsbereich auswählen`,"common.noResults":`Keine Ergebnisse für „{query}"`,"common.send":`senden`,"common.newLine":`neue Zeile`,"common.history":`Verlauf`,"common.justNow":`gerade eben`,"common.minutesAgo":`vor {count}m`,"common.hoursAgo":`vor {count}h`,"common.daysAgo":`vor {count}T`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`Leistungsfähigstes Modell — Nachfolger von Opus 4.8, 1M Kontext, adaptive thinking`,"model.mythos5Description":`Fable 5 ohne Sicherheitsklassifikatoren — eingeschränkter Zugriff (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude wählt das optimale Modell`,"model.opus5Description":`Für komplexes agentisches Coding und Unternehmenseinsätze, 1M Kontext`,"model.opus48Description":`Leistungsfähigstes Opus — Long-Horizon-Coding, 1M-Kontext standardmäßig, hoher Effort standardmäßig`,"model.opus47ClassicDescription":`Neuestes Opus, am leistungsfähigsten`,"model.opus471mDescription":`Neuestes Opus, 1M Kontext`,"model.opusClassicDescription":`Am leistungsstärksten`,"model.opus1mDescription":`Am leistungsstärksten, 1M Kontext`,"model.sonnet5Description":`Beste Mischung aus Geschwindigkeit und Intelligenz, 1M Kontext`,"model.sonnetClassicDescription":`Ausgewogen`,"model.sonnet1mDescription":`Ausgewogen, 1M Kontext`,"model.haikuDescription":`Am schnellsten`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`Neuestes Spitzenmodell für agentisches Coding (erfordert ChatGPT-Anmeldung)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Ausgewogenes agentisches Coding-Modell für den Alltag (erfordert ChatGPT-Anmeldung)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Schnelles und günstiges agentisches Coding-Modell (erfordert ChatGPT-Anmeldung)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Empfohlen für komplexes Coding (erfordert ChatGPT-Anmeldung)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Standard-Fallback — starkes Reasoning, funktioniert mit API-Key-Authentifizierung`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Schnell und effizient — ideal für reaktive Aufgaben und Subagenten`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimiert für professionelle Arbeit und langlaufende Agenten`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Auf Coding spezialisiertes Modell für komplexe Softwareentwicklung`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`keine`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Engine entscheidet automatisch`,"reasoning.minimalDescription":`Schnellstes, oberflächlichstes Reasoning`,"reasoning.noneDescription":`Ohne zusätzliches Reasoning`,"reasoning.lowDescription":`Schneller, weniger Tiefe`,"reasoning.mediumDescription":`Ausgewogen`,"reasoning.highDescription":`Mehr Tiefe`,"reasoning.xhighDescription":`Erweiterte Tiefe, langfristige Aufgaben`,"reasoning.maxDescription":`Maximale Tiefe`,"agentPermissionMode.label":`Berechtigungsmodus`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Edits akzeptieren`,"agentPermissionMode.interactive":`Interaktiv`,"agentPermissionMode.tooltip":`Wie der Agent Tool-Berechtigungen handhabt. Plan: schreibgeschützt, keine Schreibvorgänge. Bypass: alle Nachfragen überspringen. Strict: Datei-Edits automatisch akzeptieren, allow/deny für den Rest beachten. Interaktiv: vor jedem Tool den Benutzer per Berechtigungs-Panel fragen.`,"agentPermissionMode.autoLoopOverride":`Auto-Loop erzwingt einen Modus außer Plan — Plan blockiert MCP-Tools und Edits, die der Loop benötigt. Wähle stattdessen Bypass, Strict oder Interaktiv.`,"agentPermissionMode.autoLoopLocked":`Auf Bypass gesperrt, solange Auto-Loop aktiv ist — jeder andere Modus würde den Loop bei Berechtigungsabfragen anhalten. AskUserQuestion funktioniert weiterhin.`,"workspaceList.title":`Arbeitsbereiche`,"workspaceList.a11y.groupToggle":`Gruppe {group}, {count} Workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Aufmerksamkeit erforderlich`,"workspaceList.running":`Aktiv`,"workspaceList.idle":`Inaktiv`,"workspaceList.archived":`Archiviert`,"workspaceList.archivedToast":`„{name}“ archiviert`,"workspaceList.archivedUndo":`Rückgängig`,"workspaceList.unarchiveFailed":`Workspace konnte nicht dearchiviert werden`,"workspaceList.noWorkspaces":`Noch keine Arbeitsbereiche`,"workspaceList.loadFailed":`Deine Workspaces konnten nicht geladen werden`,"workspaceList.loadFailedHint":`Das ist ein Verbindungsfehler, kein leeres Konto.`,"workspaceList.footer":`{count} Arbeitsbereich | {count} Arbeitsbereiche`,"workspaceList.footerRunning":`{count} aktiv`,"workspaceList.deleteDialog.title":`Arbeitsbereich löschen?`,"workspaceList.deleteDialog.deleteLocal":`Lokalen Branch löschen`,"workspaceList.deleteDialog.deleteRemote":`Remote-Branch löschen`,"workspaceList.deleteDialog.warning":`Achtung: Diese Aktion ist auf dem Remote unwiderruflich.`,"workspaceList.deleteArchivedDialog.tooltip":`Alle archivierten Arbeitsbereiche löschen`,"workspaceList.deleteArchivedDialog.title":`Alle archivierten Arbeitsbereiche löschen?`,"workspaceList.deleteArchivedDialog.message":`Dadurch werden die {count} archivierten Arbeitsbereiche endgültig gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.`,"workspacePage.selectWorkspace":`Arbeitsbereich auswählen, um zu beginnen`,"workspacePage.commandPalettePlaceholder":`Befehle suchen…`,"workspacePage.commandPaletteEmpty":`Kein passender Befehl`,"workspacePage.commandFocusChat":`Chat-Eingabe fokussieren`,"workspacePage.commandSearchHistory":`Workspace-Verlauf durchsuchen`,"workspacePage.commandTogglePanel":`Seitenleiste ein- oder ausblenden`,"workspacePage.commandStartAgent":`Agent starten`,"workspacePage.commandStopAgent":`Agent stoppen`,"workspacePage.commandOpenSettings":`Einstellungen öffnen`,"workspacePage.commandOpenCreate":`Workspace erstellen`,"workspacePage.commandOpenSearch":`Globale Suche`,"workspacePage.commandOpenHealth":`Health-Seite`,"workspacePage.commandOpenChangelog":`Changelog`,"workspacePage.commandGroupWorkspaces":`Zu einem Workspace wechseln`,"workspacePage.commandPaletteHint":`Befehlspalette`,"workspacePage.session":`Sitzung #{n}`,"workspacePage.newSession":`+ Neue Sitzung`,"workspacePage.renameSession":`Umbenennen`,"workspacePage.renameSessionTitle":`Sitzung umbenennen`,"workspacePage.sessionNameLabel":`Sitzungsname`,"workspacePage.sessionEndedNotice":`Diese Sitzung ist beendet. Erstelle eine neue Sitzung um fortzufahren.`,"workspacePage.renameFailed":`Umbenennung fehlgeschlagen`,"workspacePage.copySessionId":`Sitzungs-ID kopieren`,"workspacePage.deleteSession":`Sitzung löschen`,"workspacePage.deleteSessionTitle":`Sitzung löschen?`,"workspacePage.deleteSessionConfirm":`Diese Sitzung und ihr Gesprächsverlauf werden dauerhaft gelöscht.`,"workspacePage.deleteSessionFailed":`Sitzung konnte nicht gelöscht werden`,"workspacePage.noEngineSessionId":`Noch keine Sitzungs-ID — der Agent hat diese Sitzung noch nicht gestartet`,"workspacePage.createSessionFailed":`Sitzung konnte nicht erstellt werden`,"workspacePage.startFailed":`Start fehlgeschlagen`,"workspacePage.stopFailed":`Stopp fehlgeschlagen`,"workspacePage.interrupt":`Unterbrechen`,"workspacePage.interrupted":`Agent unterbrochen — wartet auf Ihre nächste Nachricht`,"workspacePage.lastAgentEvent":`Letztes Ereignis {when}`,"workspacePage.agentStopping":`Wird gestoppt…`,"workspacePage.agentNotRunning":`Kein Agent-Prozess — der Status ist veraltet`,"workspacePage.archivedBanner":`Archivierter Workspace — schreibgeschützt`,"workspacePage.worktreePurgedBanner":`Worktree gelöscht — Verlauf erhalten, keine Wiederherstellung in dieser Version`,"workspacePage.worktreePurgedTooltip":"Der Worktree-Ordner wurde von der Festplatte gelöscht, um Speicherplatz zurückzugewinnen. Chat-Verlauf, Sitzungen und PR-Metadaten bleiben hier abrufbar, aber das Arbeitsverzeichnis existiert lokal nicht mehr. Eine zukünftige Kōbō-Version wird den Worktree aus der gemergten PR wiederherstellen können — vorerst musst du ihn manuell über `gh pr checkout` oder `git worktree add` neu erstellen.","workspacePage.pendingInitialPromptBanner":`Ein anfänglicher Prompt ist ausstehend — der Agent hat ihn nie erhalten (Setup-Script abgestürzt oder Workspace nie gestartet). Klicke auf Start, um ihn jetzt zu senden.`,"workspacePage.unarchived":`Workspace dearchiviert`,"workspacePage.unarchiveFailed":`Dearchivierung fehlgeschlagen`,"workspacePage.interruptFailed":`Unterbrechung fehlgeschlagen`,"workspacePage.interruptHint":`Den laufenden Zug unterbrechen, ohne die Sitzung zu beenden.`,"workspacePage.interruptTooltip":`Sanfte Unterbrechung (wie Escape) — stoppt das aktuelle Tool, hält die Sitzung aktiv`,"workspacePage.pendingNextRun":`Beim nächsten Start angewendet`,"workspacePage.activeSessionModel":`Aktiv: {model}`,"workspacePage.activeSessionModelTooltip":`Modell, das von der ausgewählten Sitzung tatsächlich verwendet wird`,"workspacePage.switchEngine":`Engine wechseln`,"workspacePage.switchEngineHint":`Diesen Workspace mit einer anderen Agent-Engine fortsetzen`,"workspacePage.moreActions":`Weitere Aktionen`,"workspacePage.switchEngineTitle":`Agent-Engine wechseln`,"workspacePage.switchEngineWarning":`Der aktuelle Agent wird gestoppt und eine neue Sitzung startet im selben Worktree.`,"workspacePage.engineLabel":`Engine`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Übergabe für die neue Engine`,"workspacePage.engineHandoffHint":`Überprüfen oder bearbeiten Sie den Kontext für den neuen Agenten.`,"workspacePage.confirmSwitchEngine":`Engine wechseln`,"workspacePage.switchEngineFailed":`Engine-Wechsel fehlgeschlagen`,"whip.dispatchFailed":`Peitschen-Nachricht konnte nicht gesendet werden`,"whip.phrase1":`Schneller, tocard!`,"whip.phrase2":`Leg einen Zahn zu, tocard!`,"whip.phrase3":`Zurück an die Arbeit, tocard!`,"whip.phrase4":`Zeig etwas Tempo, tocard!`,"whip.phrase5":`Weniger denken, mehr machen, tocard!`,"search.title":`Suche`,"search.tooltip":`Agent-Verlauf durchsuchen`,"search.placeholder":`In allen Agent-Nachrichten suchen…`,"search.includeArchived":`Archivierte Arbeitsbereiche einbeziehen`,"search.loading":`Suche läuft…`,"search.noResults":`Keine Treffer`,"search.error":`Suche fehlgeschlagen: {message}`,"search.resultCount":`{n} Treffer`,"search.eventType.userMessage":`Sie`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Noch keine Aktivität`,"activityFeed.emptyHint":`Starten Sie einen Arbeitsbereich, um die Agentenausgabe hier zu sehen`,"activityFeed.initialPrompt":`Initialer Prompt`,"activityFeed.you":`Sie`,"activityFeed.agent":`Agent`,"activityFeed.question":`Frage`,"activityFeed.goToPrevious":`Zur vorherigen Nachricht`,"activityFeed.scrollToBottom":`Nach unten scrollen`,"activityFeed.sendAnswers":`Antworten senden`,"agentBusy.banner":`Agent ist beschäftigt`,"agentBusy.subagentsRunning":`1 Sub-Agent aktiv | {n} Sub-Agents aktiv`,"agentBusy.viewSubagents":`Sub-Agents anzeigen`,"agentBusy.pendingMessage":`Warten — Agent ist beschäftigt`,"terminal.title":`Terminal`,"terminal.open":`Terminal öffnen`,"terminal.close":`Terminal schließen`,"terminal.noWorkspace":`Workspace auswählen`,"terminal.noWorktree":`Worktree noch nicht erstellt`,"terminal.error":`Terminalfehler`,"terminal.exited":`Terminal beendet`,"terminal.disconnected":`Verbindung verloren`,"terminal.reconnecting":`Verbindungsaufbau… (Versuch {attempt} von {max})`,"terminal.reconnect":`Neu verbinden`,"chatInput.placeholder":`Nachricht... (/ für Skills)`,"chatInput.fileSearchHint":`Datei suchen`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Bild anhängen`,"chatInput.queueBanner":`Nachricht in Warteschlange — wird gesendet, wenn der Agent fertig ist`,"chatInput.forceQueue":`Senden erzwingen`,"chatInput.searchHistory":`suchen`,"chatInput.commandPalette":`Befehle`,"chatInput.shortcuts":`Tastenkürzel`,"chatInput.cancelQueue":`Warteschlange abbrechen`,"chatInput.autoLoopBanner":`Auto-Loop läuft — beende ihn, um eine Nachricht zu senden`,"chatInput.awaitingUserBanner":`Der Agent wartet auf deine Antwort oben — antworte über das Fragefenster`,"chatInput.autoLoopStop":`Beenden`,"koboCommand.checkProgressDesc":`Fortschritt bei Aufgaben und Akzeptanzkriterien prüfen`,"chatInput.uploading":`Wird hochgeladen...`,"voice.title":`Sprachtranskription`,"voice.enabled":`Lokale Sprachtranskription aktivieren`,"voice.pttKey":`Push-to-talk-Taste`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Strg+Leertaste`,"voice.language":`Sprache (auto oder Code)`,"voice.model":`Aktives Modell`,"voice.commandPath":`Pfad zur Whisper-Binärdatei (optional)`,"voice.ffmpegPath":`Pfad zur ffmpeg-Binärdatei (optional)`,"voice.temperature":`Temperatur`,"voice.temperatureHint":`Niedriger = deterministischer, höher = flexibler, aber potenziell weniger stabil.`,"voice.initialPrompt":`Initial Prompt (optional)`,"voice.initialPromptHint":`Optionaler Kontext, um Whisper bei Namen, Fachbegriffen oder domänenspezifischem Vokabular zu helfen.`,"voice.translateToEnglish":`Ins Englische übersetzen`,"voice.translateToEnglishHint":`Wenn aktiviert, wird nicht-englische Sprache ins Englische übersetzt statt originalgetreu transkribiert.`,"voice.suppressNst":`Nicht-Sprach-Tokens unterdrücken`,"voice.suppressNstHint":`Versucht, Nicht-Sprach-Artefakte im Transkript zu reduzieren.`,"voice.installLink":`whisper.cpp installieren`,"voice.installGuideTitle":`Installationsanleitung`,"voice.installGuideIntro":`Installiere whisper.cpp und ffmpeg und setze bei Bedarf unten die Binärpfade.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Nach dem CMake-Build liegt die Whisper-Binärdatei üblicherweise hier: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Danach in diesem Bereich „Pfad zur Whisper-Binärdatei“ und „Pfad zur ffmpeg-Binärdatei“ setzen (oder leer lassen, wenn im PATH).`,"voice.noneModel":`Kein aktives Modell`,"voice.notInstalled":`nicht installiert`,"voice.download":`Herunterladen`,"voice.delete":`Löschen`,"voice.holdToTalk":`Zum Sprechen gedrückt halten`,"voice.recording":`Aufnahme...`,"voice.transcribing":`Transkription...`,"voice.notSupported":`Sprachaufnahme wird in diesem Browser nicht unterstützt`,"voice.errorMicPermission":`Mikrofonberechtigung verweigert`,"voice.errorTranscription":`Sprachtranskription fehlgeschlagen`,"voice.downloadFailed":`Modelldownload fehlgeschlagen`,"voice.deleteFailed":`Modell konnte nicht gelöscht werden`,"voice.errorDisabled":`Sprachtranskription ist in den Einstellungen deaktiviert`,"voice.errorModelMissing":`Kein aktives Sprachmodell konfiguriert`,"voice.errorModelNotInstalled":`Das aktive Sprachmodell ist nicht installiert`,"voice.errorAudioInvalid":`Audioaufnahme ist ungültig oder leer`,"voice.errorLanguageInvalid":`Sprachkonfiguration ist ungültig`,"voice.errorRuntimeMissing":`Whisper-Runtime ist nicht installiert oder nicht im PATH`,"voice.maxDurationReached":`Maximale Aufnahmedauer erreicht`,"voice.runtimeReady":`Runtime bereit: {command}`,"voice.runtimeMissing":`Runtime fehlt: {command}`,"voice.ffmpegReady":`ffmpeg bereit`,"voice.ffmpegMissing":`ffmpeg fehlt`,"voice.sectionRuntime":`Runtime-Status`,"voice.sectionActivation":`Aktivierung`,"voice.sectionModels":`Whisper-Modelle`,"voice.sectionAdvanced":`Erweiterte Optionen`,"voice.sectionBehavior":`Transkriptionsverhalten`,"voice.sectionBinaries":`Binärpfade`,"voice.downloadModels":`Modell herunterladen`,"voice.cancelFailed":`Abbrechen des Downloads fehlgeschlagen`,"createPage.title":`Workspace erstellen`,"createPage.subtitle":`Beschreiben Sie die Aufgabe, wählen Sie ein Projekt und konfigurieren Sie den Agenten.`,"createPage.sectionMission":`Aufgabe`,"createPage.sectionMissionHint":`Geben Sie dem Agenten ein klares Ziel und den erforderlichen Kontext.`,"createPage.workspaceNameLabel":`Workspace-Name`,"createPage.descriptionLabel":`Aufgabenbeschreibung`,"createPage.sources":`Optionale Quellen`,"createPage.sectionGit":`Git-Projekt`,"createPage.sectionGitHint":`Wählen Sie Repository, Ausgangsbranch und Worktree-Modus.`,"createPage.worktreeMode":`Worktree-Modus`,"createPage.worktreeNew":`Neuer isolierter Worktree`,"createPage.worktreeExisting":`Vorhandenen Worktree verwenden`,"createPage.projectLabel":`Projekt`,"createPage.sourceBranch":`Ausgangsbranch`,"createPage.workingBranchPreview":`Vorschau des Arbeitsbranches`,"createPage.branchNamePending":`workspace-name`,"createPage.sectionAgent":`Agent`,"createPage.sectionAgentHint":`Prüfen Sie die Ausführungsvorgaben oder aktivieren Sie die Automatisierung.`,"createPage.configureAgent":`Agent konfigurieren`,"createPage.advancedOptions":`Erweiterte Optionen`,"createPage.keyboardHint":`Drücken Sie Strg/Cmd + Enter, um den Workspace zu erstellen.`,"createPage.createWorkspace":`Workspace erstellen`,"createPage.notionEnabled":`Notion aktiviert`,"createPage.importNotion":`Aus Notion importieren`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`Die URL muss mit https://www.notion.so/ oder https://app.notion.com/ beginnen`,"createPage.notionAutoExtract":`Unteraufgaben und Akzeptanzkriterien werden automatisch extrahiert.`,"createPage.notionPanelChoiceLabel":`Diese URL verweist auf eine Unterseite (?p=). An welcher möchtest du arbeiten?`,"createPage.notionPanelOption":`Unterseite (Panel)`,"createPage.notionPanelOptionDesc":`Die Seite, die du angesehen hast — empfohlen`,"createPage.notionParentOption":`Übergeordnete Seite`,"createPage.notionParentOptionDesc":`Das Epic / die Datenbank dazu`,"createPage.importSentry":`Sentry importieren`,"createPage.sentryEnabled":`Sentry aktiviert`,"createPage.sentryPlaceholder":`https://ihre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`Die URL muss auf ein Sentry-Issue zeigen (/issues/<id>)`,"createPage.sentryAutoExtract":`Sentry-Issue wird automatisch importiert`,"createPage.sentryExtractHint":`Kobo extrahiert das Issue und schreibt es nach .ai/thoughts/`,"createPage.importPr":`Aus einem PR importieren`,"createPage.importPrRequiresProject":`Zuerst ein Projekt auswählen`,"createPage.importPrNotSupported":`Die Forge dieses Projekts unterstützt das Auflisten von Pull Requests nicht`,"createPage.lockedToPr":`Gesperrt auf PR #{number}`,"createPage.prReadyToCreate":`PR #{number} importiert — der Workspace kann erstellt werden.`,"createPage.unlockPrCheckout":`Entsperren`,"createPage.workspaceName":`Name des Arbeitsbereichs (Standard: Notion-Seitentitel)`,"createPage.workspaceNamePlaceholder":`Name des Arbeitsbereichs...`,"createPage.instructions":`Zusätzliche Anweisungen (optional)...`,"createPage.instructionsPlaceholder":`Aufgabe beschreiben...`,"createPage.tasks":`Aufgaben ({count})`,"createPage.addTask":`Aufgabe hinzufügen...`,"createPage.acceptanceCriteria":`Akzeptanzkriterien ({count})`,"createPage.addCriterion":`Kriterium hinzufügen...`,"createPage.projectPath":`Projektpfad eingeben`,"createPage.branchType":`Branch-Typ`,"createPage.branch":`Branch`,"createPage.noBranches":`Keine Branches gefunden`,"createPage.enterPath":`Projektpfad eingeben`,"createPage.skipSetupScript":`Setup-Skript überspringen`,"createPage.worktreePickerLabel":`Bestehender Worktree`,"createPage.noOrphanWorktrees":`Kein verwaister Worktree in diesem Projekt`,"createPage.pickWorktreeRequired":`Bitte einen Worktree zum Anhängen auswählen`,"createPage.notionExtractHint":`Unteraufgaben und Akzeptanzkriterien werden aus der Notion-Seite extrahiert.`,"createPage.errorCreating":`Fehler beim Erstellen des Arbeitsbereichs.`,"createPage.branchAdjusted":"Branch existierte bereits — stattdessen `{branch}` erstellt. Der zugehörige Worktree-Ordner verwendet das gleiche Suffix.","createPage.localSourceFallback":`Workspace vom lokalen Branch erstellt (origin nicht erreichbar) — die Basis ist möglicherweise veraltet.`,"createPage.validationNotionUrl":`Bitte eine gültige Notion-URL einfügen (https://www.notion.so/... oder https://app.notion.com/...).`,"createPage.validationDescription":`Bitte beschreiben Sie die Aufgabe.`,"createPage.validationName":`Bitte geben Sie einen Arbeitsbereichnamen an.`,"createPage.validationPath":`Bitte geben Sie den Projektpfad ein.`,"createPage.validationBranch":`Bitte wählen Sie einen Branch aus.`,"createPage.validationFocusHint":`Das zu korrigierende Feld ist unten hervorgehoben.`,"createPage.progress.validate":`Anfrage wird geprüft…`,"createPage.progress.fetch-source-branch":`Source-Branch wird von origin geholt…`,"createPage.progress.inspect-worktree":`Bestehender Worktree wird geprüft…`,"createPage.progress.extract-notion":`Notion-Seite wird extrahiert…`,"createPage.progress.extract-sentry":`Sentry-Issue wird extrahiert…`,"createPage.progress.create-record":`Workspace wird erstellt…`,"createPage.progress.create-tasks":`Tasks und Akzeptanzkriterien werden erstellt…`,"createPage.progress.create-worktree":`Git-Worktree wird erstellt…`,"createPage.progress.write-conventions":`Git-Konventionen werden geschrieben…`,"createPage.progress.write-context-files":`Kontextdateien werden geschrieben…`,"createPage.progress.build-prompt":`Initialer Prompt wird erstellt…`,"createPage.progress.setup-script":`Dein Setup-Skript läuft…`,"createPage.progress.start-agent":`Agent wird gestartet…`,"createPage.progress.rollback":`Fehlgeschlagene Erstellung wird rückgängig gemacht…`,"createPage.progress.done":`Fertig`,"createPage.progress.step":`Schritt {index} von {total}`,"createPage.errorAtStep":`Erstellung im Schritt „{step}“ fehlgeschlagen: {message}`,"createPage.override.title":`Zwei deiner Einstellungen wurden überschrieben`,"createPage.override.setup-script-forced":`Setup-Skript übersprungen: ein erneuter Lauf auf einem bereits vorbereiteten Worktree könnte dessen Inhalt zerstören.`,"createPage.override.permission-mode-downgraded":`Berechtigungsmodus von Plan auf Bypass geändert: eine autonome Schleife kann nicht in Plan laufen, der Tools und Änderungen blockiert.`,"settings.title":`Einstellungen`,"settings.language":`Sprache`,"settings.projectColor":`Farbe`,"settings.projectColorClear":`Löschen`,"settings.projectColorDefault":`Standard (grau)`,"settings.workspaceListSection":`Workspace-Liste`,"settings.flattenWorkspaceList":`Workspace-Liste flach anzeigen`,"settings.flattenWorkspaceListHint":`Zeigt alle Workspaces in einer flachen Liste mit Projekt-Badge, anstatt nach Projekt gruppiert.`,"settings.skillSuite.section":`Skill-Suite`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Benutzerdefiniert`,"settings.skillSuite.superpowersHint":`Opinionierter TDD / Brainstorm / Plan-Workflow (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Garry Tans Suite — /review, /ship, /qa, /office-hours usw. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Beide Suites lassen sich kombinieren — superpowers für Methodik (Brainstorm / TDD / Pläne / Prinzipien-Review), gstack für konkrete Workflows (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Agent-Harness-Framework von affaan-m — Agents, Skills, Rules und Hooks zum Planen, Testen, Implementieren, Reviewen und Speichern (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Alle drei lassen sich kombinieren — superpowers für Methodik, gstack für konkrete Workflows, ECC für strukturierte Multi-Agent-Review-/Implementierungsdurchläufe.`,"settings.skillSuite.customHint":`Stelle die fünf Prompts unten aus beliebigen Vorlagen zusammen und bearbeite sie frei.`,"settings.skillSuite.reloadDefaults":`Standard wiederherstellen`,"settings.skillSuite.reloadDefaultsConfirm":`Die fünf benutzerdefinierten Prompts durch die agnostischen Standardwerte ersetzen?`,"settings.skillSuite.customPrompts":`Benutzerdefinierte Prompts`,"settings.skillSuite.agnostic":`Agnostische Basis`,"settings.skillSuite.importPrompt":`Vorlage importieren`,"settings.skillSuite.imported":`Vorlage importiert. Du kannst sie jetzt bearbeiten.`,"settings.skillSuite.importFailed":`Vorlage konnte nicht importiert werden`,"settings.skillSuite.reviewTemplate":`Review-Vorlage`,"settings.skillSuite.autoLoopReviewGate":`Auto-Loop Review-Gate`,"settings.skillSuite.autoLoopGroomingIntro":`Auto-Loop Grooming-Intro`,"settings.skillSuite.qaTemplate":`QA-Vorlage`,"settings.skillSuite.brainstormingInstruction":`Anweisung für die Brainstorming-Phase`,"settings.global":`Allgemein`,"settings.projects":`Projekte`,"settings.globalSettings":`Allgemeine Einstellungen`,"settings.defaultModel":`Standardmodell`,"settings.defaultModelClaude":`Standardmodell (Claude Code)`,"settings.defaultModelCodex":`Standardmodell (OpenAI Codex)`,"settings.agentPermissions":`Agentenberechtigungen`,"settings.skipPermissions":`Berechtigungsabfragen überspringen (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Achtung: Wird diese Option deaktiviert, werden alle Tool-Berechtigungen (Write, Edit, Bash...) im Headless-Modus automatisch abgelehnt. Der Agent kann dann nur lesen.`,"settings.notifications":`Benachrichtigungen`,"settings.browserNotifications":`Browser-Benachrichtigung wenn Agent fertig ist`,"settings.audioNotifications":`Ton-Benachrichtigung wenn Agent fertig ist`,"settings.enableBrowserNotifications":`Browser-Benachrichtigungen aktivieren`,"settings.testBrowserNotification":`Benachrichtigung testen`,"settings.browserNotificationGranted":`Browser-Benachrichtigungen erlaubt`,"settings.browserNotificationDenied":`Browser-Benachrichtigungen blockiert`,"settings.browserNotificationAsk":`Browser-Berechtigung erforderlich`,"settings.browserNotificationUnsupported":`Browser-Benachrichtigungen nicht verfügbar`,"settings.browserNotificationPermissionNeeded":`Erlaube Browser-Benachrichtigungen, um einen Test zu senden.`,"settings.browserNotificationTestTitle":`Kōbō-Benachrichtigungstest`,"settings.browserNotificationTestBody":`Browser-Benachrichtigungen funktionieren.`,"settings.enableAudio":`Audio aktivieren`,"settings.notificationSound":`Benachrichtigungston`,"settings.notificationSoundHint":`Wird abgespielt, wenn der Agent fertig ist oder eine Berechtigung anfordert.`,"settings.questionSound":`Frageton`,"settings.questionSoundHint":`Wird nur abgespielt, wenn der Agent eine Frage stellt.`,"settings.workspaceCreatedSound":`Ton für Workspace-Erstellung`,"settings.workspaceCreatedSoundHint":`Wird nach dem Erstellen eines Workspaces abgespielt.`,"settings.notificationSoundPreview":`Anhören`,"settings.notificationVolume":`Lautstärke`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Agentenfehler`,"settings.agentErrorSoundHint":`Wird bei Quoten-, Rate-Limit- und Agentenfehlern abgespielt.`,"settings.notificationSoundBasic":`Standardbenachrichtigung`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Arbeit`,"settings.notificationSoundTravailTermine":`Arbeit erledigt`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Das wird knallen`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR und CI`,"settings.soundGeneral":`Allgemeiner Ton`,"settings.soundNone":`Kein Ton`,"settings.prCiFailedSound":`CI fehlgeschlagen`,"settings.prCiRecoveredSound":`CI wieder erfolgreich`,"settings.prChangesRequestedSound":`Änderungen angefordert`,"settings.prApprovedSound":`PR genehmigt`,"settings.prMergeConflictSound":`Merge-Konflikt`,"settings.prReadyToMergeSound":`Bereit zum Mergen`,"settings.prMergedSound":`PR gemergt`,"settings.prCiFailedSoundHint":`Wird abgespielt, wenn die CI fehlschlägt.`,"settings.prCiRecoveredSoundHint":`Wird abgespielt, wenn sich die CI nach einem Fehler erholt.`,"settings.prChangesRequestedSoundHint":`Wird abgespielt, wenn Änderungen angefordert werden.`,"settings.prApprovedSoundHint":`Wird abgespielt, wenn der Pull Request genehmigt wird.`,"settings.prMergeConflictSoundHint":`Wird abgespielt, wenn ein Merge-Konflikt erkannt wird.`,"settings.prReadyToMergeSoundHint":`Wird abgespielt, wenn der Pull Request merge-bereit ist.`,"settings.prMergedSoundHint":`Wird abgespielt, wenn der Pull Request gemergt wird.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Standard-Berechtigungsmodus`,"settings.defaultPermissionModeClaude":`Standard-Berechtigungsmodus (Claude Code)`,"settings.defaultPermissionModeCodex":`Standard-Berechtigungsmodus (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modus bei der Erstellung eines neuen Workspaces. Plan = nur lesen, Bypass = keine Nachfragen, Strict = Edits automatisch akzeptieren mit allow-list, Interaktiv = vor jedem Tool fragen.`,"settings.activityFeed":`Aktivitätsfeed`,"settings.showThinkingBlocks":`Denkblöcke der Agenten anzeigen`,"settings.whipSettings":`Peitsche`,"settings.whipSettingsHint":`Konfiguriere den optionalen Peitschen-Kurzbefehl und die Lautstärke.`,"settings.whipEnabled":`Peitsche aktivieren`,"settings.whipEnabledHint":`Zeigt die interaktive Peitsche in geeigneten laufenden Workspaces an.`,"settings.whipVolume":`Peitschenlautstärke`,"settings.whipVolumeMasterAudioDisabled":`Der Hauptton ist ausgeschaltet. Aktivieren Sie Audio-Benachrichtigungen, um die Peitschenlautstärke anzupassen; der gespeicherte Wert bleibt erhalten.`,"whip.overlayLabel":`Interaktive Peitsche`,"whip.overlayInstructions":`Bewegen Sie den Zeiger, um die Peitsche zu steuern. Drücken Sie Eingabe oder Leertaste zum Knallen. Drücken Sie Escape zum Schließen.`,"settings.whipShortcut":`Peitschen-Tastenkürzel`,"settings.whipShortcutHint":`Klicken Sie und drücken Sie dann das gewünschte Tastenkürzel.`,"settings.whipShortcutRecording":`Tastenkürzel drücken…`,"settings.whipShortcutButtonLabel":`Peitschen-Tastenkürzel: {shortcut}`,"settings.whipShortcutRecordingLabel":`Peitschen-Tastenkürzel wird aufgezeichnet. Tastenkürzel drücken…`,"settings.whipShortcutReset":`Tastenkürzel zurücksetzen`,"settings.whipShortcutReserved":`Dieses Tastenkürzel ist vom Browser reserviert.`,"settings.testIntegration":`Verbindung testen`,"pwa.offline":`Du bist offline. Chat und Agenten benötigen den Kōbō-Server.`,"pwa.reconnecting":`Verbindung zum Kōbō-Server wird wiederhergestellt…`,"pwa.installReady":`Kōbō als App installieren.`,"pwa.install":`Installieren`,"pwa.ignore":`Ignorieren`,"pwa.updateReady":`Ein Kōbō-Update ist verfügbar.`,"pwa.reload":`Neu laden`,"chat.searchWorkspaceHistory":`Workspace-Verlauf durchsuchen`,"chat.historySearch.user":`Sie`,"chat.historySearch.agent":`Agent`,"chat.openInGitDiff":`Im Git-Diff öffnen`,"timeline.title":`Sitzungszeitachse`,"timeline.export":`Diagnose exportieren`,"timeline.unnamed":`Agent-Sitzung`,"timeline.tools":`{count} Tools`,"timeline.errors":`{count} Fehler`,"settings.verboseMessages":`Ausführliche Systemnachrichten anzeigen (task_progress, task_started)`,"settings.availableVariables":`Verfügbare Template-Variablen`,"settings.prPromptTemplate":`PR-Prompt-Vorlage`,"settings.prPromptPlaceholder":`Anweisungen für den Agenten bei der Erstellung von GitHub-PRs...`,"settings.prPromptHint":`Verwenden Sie die oben aufgeführten Platzhalter (doppelte geschweifte Klammern).`,"settings.reviewPromptTemplate":`Review-Prompt-Vorlage`,"settings.reviewPromptPlaceholder":`Anweisungen für den Agenten bei der Review von Branch-Änderungen...`,"settings.ciFixPromptTemplate":`CI-Fix-Prompt-Vorlage`,"settings.ciFixPromptHint":`Wird an den Agenten gesendet, wenn die CI eines Workspaces fehlschlägt. Variablen (doppelte geschweifte Klammern): pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Den Agenten bitten, die fehlschlagenden CI-Jobs zu diagnostizieren und zu beheben...`,"settings.finalizationPromptTemplate":`Auto-Loop-Finalisierungs-Prompt`,"settings.finalizationPromptHint":`Standard-Prompt für die letzte Auto-Loop-Iteration (abschließende Qualitätsprüfungen). Wird verwendet, wenn ein Projekt seinen eigenen Finalisierungs-Prompt leer lässt.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Notion-Initial-Prompt`,"settings.notionInitialPrompt.help":`Wird an den Workspace-Erstellungsprompt angehängt, wenn der Workspace ein Notion-Ticket hat. Variablen: {variables}.`,"settings.notionInitialPrompt.project":`Notion-Initial-Prompt (Überschreibung)`,"settings.sentryInitialPrompt":`Sentry-Initial-Prompt`,"settings.sentryInitialPrompt.help":`Wird an den Workspace-Erstellungsprompt angehängt, wenn der Workspace ein Sentry-Issue hat. Variablen: {variables}.`,"settings.sentryInitialPrompt.project":`Sentry-Initial-Prompt (Überschreibung)`,"settings.initialPrompt.inheritHint":`Leer lassen, um zu erben. Geben Sie ein Leerzeichen ein, um die Injektion auf dieser Ebene zu deaktivieren.`,"settings.resetToDefault":`Zurücksetzen`,"settings.resetFailed":`Standardwert konnte nicht geladen werden`,"settings.sentryIntegration":`Sentry-Integration`,"settings.var.prNumber":`PR-Nummer (z. B. 42)`,"settings.var.prUrl":`Vollständige URL der erstellten PR`,"settings.var.branchName":`Name des Arbeitsbranches`,"settings.var.sourceBranch":`Quellbranch, auf den die PR abzielt`,"settings.var.workspaceName":`Workspace-Name`,"settings.var.projectName":`Letztes Segment des Projektpfads`,"settings.var.notionUrl":`Notion-URL falls gesetzt, sonst leer`,"settings.var.commits":`Aufzählung der Commits zwischen Source und Head`,"settings.var.diffStats":`Git-Shortstat-Zusammenfassung (Dateien, Einfügungen, Löschungen)`,"settings.var.tasks":`Reguläre Aufgaben als Checkliste`,"settings.var.acceptanceCriteria":`Akzeptanzkriterien als Checkliste`,"settings.gitConventions":`Git-Konventionen (global)`,"settings.gitConventionsPlaceholder":`# Git-Konventionen...`,"settings.gitConventionsHint":`Diese Konventionen werden in .ai/.git-conventions.md jedes neuen Arbeitsbereichs geschrieben und müssen vom Agenten vor jeder Git-Operation eingehalten werden. Werden durch projektspezifische Konventionen überschrieben, falls definiert.`,"settings.setupScript":`Setup-Skript`,"settings.cleanupScript":`Cleanup-Skript`,"settings.archiveScript":`Archiv-Skript`,"settings.archiveScriptHint":`Shell-Skript, das serverseitig im Worktree ausgeführt wird, wenn ein Workspace archiviert wird. Leer lassen zum Deaktivieren.`,"settings.archiveScriptPlaceholder":`z. B. Container aufräumen, Speicherplatz freigeben…`,"settings.changeSourceBranchScript":`Quellbranch-Wechsel-Skript`,"settings.changeSourceBranchScript.help":`Ersetzt den eingebauten Cherry-Pick, wenn nicht leer. Das Skript verwaltet Git, PR-Basis, Force-Push und Konflikte; Kōbō verweigert nur, solange der Agent läuft, und aktualisiert die Quellbranch-Metadaten bei Exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — neuer Quellbranch aus dem Dialog
|
|
3
3
|
KOBO_OLD_BASE — vorheriger Quellbranch des Workspaces
|
|
4
4
|
KOBO_WORKING_BRANCH — Arbeitsbranch des Workspaces
|
|
5
5
|
KOBO_WORKTREE_PATH — absoluter Pfad des Worktrees (auch cwd)
|
|
@@ -15,7 +15,7 @@ KOBO_PR_NUMBER — PR-/MR-Nummer auf der aufgelösten Forge (leer wenn kein
|
|
|
15
15
|
# Oder direkt über git (funktioniert auf GitHub auch nach Löschen des Branches):
|
|
16
16
|
git fetch origin pull/[pr-nummer]/head:[branch-name]
|
|
17
17
|
git worktree add [pfad] [branch-name]`,"settings.purgeDocsRestoreFootnote":`GitHub hält den PR-Head-Ref lange nach dem Löschen des Quellbranches zugänglich (Monate / Jahre). Die automatische Erkennung läuft im 30-Sekunden-Watcher — keine UI-Aktion nötig, sobald der Ordner wieder da ist.`,"settings.purgeDocsPermissionsTitle":`Berechtigungsfehler während der Bereinigung vermeiden`,"settings.purgeDocsPermissionsIntro":`Docker hinterlässt oft root-eigene Dateien in node_modules / vendor innerhalb des Worktrees. Wenn Kōbō versucht, sie zu entfernen, erhältst du EACCES / EPERM und die Bereinigung schlägt fehl. Zwei Vorbeugemöglichkeiten:`,"settings.purgeDocsPermissionsDocker":'Konfiguriere deinen Container so, dass er als dein Host-Benutzer läuft — USER-Direktive im Dockerfile oder `user: "${UID}:${GID}"` in docker-compose (mit UID/GID in deiner Shell exportiert).',"settings.purgeDocsPermissionsAcl":`Bereite das Worktrees-Root mit einer Standard-ACL vor — Sicherheitsnetz, das in den MEISTEN Fällen funktioniert (ext4/btrfs/xfs + Standard-Docker-Bind-Mount). Jede neue Datei erbt dann einen Zugriffseintrag für deinen Benutzer, zusätzlich zum nominalen Besitzer:`,"settings.purgeDocsPermissionsAclCommand":` setfacl -d -m u:$(whoami):rwX [worktrees-root]`,"settings.purgeDocsPermissionsFootnote":"ACL-Einschränkungen: funktionieren NICHT bei benannten Docker-Volumes (nutze einen Bind-Mount), Dateisystemen ohne ACL-Unterstützung (NTFS, exFAT, tmpfs), striktem SELinux mit `:Z` oder wenn Docker `userns-remap` aktiv ist. Die zuverlässigste Lösung bleibt die Konfiguration des Benutzers im Container (Option 1). Tipp: `rwX` (großes X) fügt das Ausführungsbit nur bei Verzeichnissen und bereits ausführbaren Dateien hinzu — sauberer als `rwx`, das jede Textdatei ausführbar machen würde.","settings.purgeDocsPermissionsRecoverTitle":`Einen bereits blockierten Worktree entsperren (bestehende root-eigene Dateien)`,"settings.purgeDocsPermissionsRecoverIntro":`Wenn ein Worktree bereits voll mit root-eigenen Dateien ist (Docker hat schon gelaufen, vendor / node_modules sind blockiert), reicht die präventive ACL oben nicht — du musst die BESTEHENDEN Dateien behandeln. Zwei Ansätze, beide aus dem Worktree-Ordner heraus auszuführen:`,"settings.purgeDocsPermissionsRecoverAclIntro":`Option A — Rekursive ACL (behält root-Ownership für Audit, fügt nur Zugriff für deinen Benutzer parallel hinzu):`,"settings.purgeDocsPermissionsRecoverAclCommand":`# setze Default-ACL für zukünftige Dateien UND gewähre Zugriff auf alles Bestehende
|
|
18
|
-
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Ownership übernehmen (einfacher, verliert die Spur "von root im Container erstellt", spielt in der Praxis selten eine Rolle):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Tipp: Du kannst diese Befehle direkt auf das Worktrees-Root anwenden (z. B. `~/.worktrees/`), um alle bestehenden UND zukünftigen Workspaces auf einmal abzudecken. Danach funktioniert die Kōbō-Bereinigung ohne Berechtigungsfehler.","contextMenu.runSetup":`Setup-Skript ausführen`,"contextMenu.exportEvents":`Events exportieren (CSV)`,"contextMenu.dismissChangesRequested":`Änderungen angefragt als gesehen markieren`,"contextMenu.dismissCiFailure":`CI-Fehler als gesehen markieren`,"contextMenu.restoreChangesRequested":`Änderungen angefragt als ungesehen markieren`,"contextMenu.restoreCiFailure":`CI-Fehler als ungesehen markieren`,"contextMenu.exportingEvents":`Export wird vorbereitet…`,"contextMenu.exportEventsError":`Event-Export fehlgeschlagen`,"contextMenu.openNotion":`In Notion öffnen`,"contextMenu.openSentry":`In Sentry öffnen`,"contextMenu.openPr":`PR öffnen`,"contextMenu.ignorePrWatch":`PR-Prüfungen ignorieren`,"contextMenu.resumePrWatch":`PR-Prüfungen fortsetzen`,"contextMenu.prWatchToggleFailed":`Aktualisierung der PR-Prüfungen fehlgeschlagen`,"workspace.favorite":`Als Favorit markieren`,"workspace.unfavorite":`Aus Favoriten entfernen`,"workspace.showFavoritesOnly":`Nur Favoriten anzeigen`,"workspace.searchArchivedToggle":`Auch in archivierten Workspaces suchen`,"workspace.descriptionPlaceholder":`Kurze Beschreibung hinzufügen`,"workspace.descriptionDialogHint":`Klartext, max. 200 Zeichen. Leer lassen, um zu löschen.`,"workspace.descriptionTooLong":`Die Beschreibung darf höchstens 200 Zeichen lang sein.`,"workspace.descriptionSaveFailed":`Beschreibung konnte nicht gespeichert werden.`,"workspace.agentDescriptionTooltip":`Live-Status, gepflegt vom Agent`,"mcp.tool.setWorkspaceDescription":`Setzt die Kurzbeschreibung des Workspace (≤ 200 Zeichen).`,"tags.manage":`Tags verwalten`,"tags.manageTitle":`Workspace-Tags verwalten`,"tags.noTagsDefined":`Keine Tags definiert. Füge welche in Einstellungen > Global > Tags hinzu.`,"tags.orphanedHint":`{count} Tag(s) sind nicht mehr im globalen Katalog. Abwählen zum Entfernen.`,"settings.tagsTitle":`Workspace-Tags`,"settings.tagsHint":`Definiere die Tags, die Workspaces zugewiesen werden können. Tippe zum Hinzufügen, klicke auf das Kreuz zum Entfernen.`,"settings.tagsLabel":`Verfügbare Tags`,"settings.branchPrefixesTitle":`Branch-Präfixe`,"settings.branchPrefixesHint":`Verwalten Sie die Git-Branch-Präfixe, die auf der Workspace-Erstellungsseite verfügbar sind. Das erste ist standardmäßig vorausgewählt.`,"settings.branchPrefixesEmpty":`Kein Branch-Präfix definiert. Fügen Sie unten mindestens eines hinzu.`,"settings.branchPrefixesAddLabel":`Neues Präfix`,"settings.branchPrefixesEditHint":`Zum Umbenennen klicken`,"settings.branchPrefixesMoveUp":`Nach oben`,"settings.branchPrefixesMoveDown":`Nach unten`,"settings.worktreesTitle":`Git-Worktrees`,"settings.worktreesHint":`Wähle aus, wo neue Workspace-Worktrees erstellt werden. Relative Pfade sind projektrelativ; absolute Linux/macOS- und Windows-Pfade, $HOME, ~ und %USERPROFILE% werden unterstützt.`,"settings.worktreesPathLabel":`Worktrees-Pfad`,"settings.worktreesPathRequired":`Worktrees-Pfad ist erforderlich.`,"settings.worktreesPrefixByProject":`Worktrees nach Projektname präfixen`,"settings.worktreesPrefixByProjectHint":`Legt jeden Worktree in einem nach dem Projekt benannten Unterordner ab, um Kollisionen zu vermeiden, wenn mehrere Projekte die gleiche Worktree-Wurzel teilen.`,"settings.shareTitle":`Konfiguration teilen`,"settings.shareHint":`Exportiere Einstellungen, Templates und Tags als JSON-Bundle. MCP-Keys werden aus Sicherheitsgründen nicht exportiert.`,"settings.exportConfig":`Exportieren`,"settings.importConfig":`Importieren`,"settings.exportSuccess":`Konfiguration exportiert`,"settings.importSuccess":`Konfiguration importiert`,"settings.importConfirmTitle":`Konfiguration importieren`,"settings.importConfirmMessage":`Dies ersetzt deine aktuellen Einstellungen, Templates und Tags. MCP-Keys bleiben erhalten. Fortfahren?`,"settings.network.title":`Netzwerkzugriff`,"settings.network.hint":`Steuere Kōbō von einem anderen Gerät in deinem vertrauenswürdigen LAN. Aus = nur localhost. An = im Netzwerk erreichbar, per Token geschützt. Starte Kōbō nach dem Umschalten neu.`,"settings.network.enable":`Netzwerkzugriff aktivieren`,"settings.network.behindProxy":`Hinter einem Reverse Proxy`,"settings.network.behindProxyHint":`Kōbō kann deinen eigenen Rechner nicht mehr von einer weitergeleiteten Anfrage unterscheiden — selbst localhost benötigt ab jetzt das Token. Aktiviere dies nur, wenn ein Reverse Proxy (Traefik, nginx, Caddy…) vor Kōbō steht.`,"settings.network.restartRequired":`Starte Kōbō neu, um die neue Bind-Adresse anzuwenden.`,"settings.network.token":`Zugriffstoken`,"settings.network.copy":`Kopieren`,"settings.network.copied":`Kopiert`,"settings.network.regenerate":`Neu generieren`,"settings.network.regenerateConfirm":`Token neu generieren? Verbundene Geräte benötigen das neue Token.`,"settings.network.urls":`LAN-URLs`,"settings.network.scan":`Zum Verbinden scannen`,"settings.network.noUrls":`Keine LAN-Adresse erkannt.`,"settings.network.loadFailed":`Netzwerkzugriff-Einstellungen konnten nicht geladen werden.`,"settings.network.updateFailed":`Netzwerkzugriff-Einstellungen konnten nicht aktualisiert werden.`,"settings.unsavedChanges.title":`Nicht gespeicherte Änderungen`,"settings.unsavedChanges.message":`Dieses Projekt hat nicht gespeicherte Änderungen. Ein Projektwechsel verwirft sie.`,"settings.unsavedChanges.discard":`Verwerfen und wechseln`,"settings.unsavedChanges.cancel":`Abbrechen`,"settings.loadFailed":`Einstellungen konnten nicht geladen werden`,"settings.loadFailedHint":`Speichern ist deaktiviert: das Formular zeigt Standardwerte, und sie zu schreiben würde deine echte Konfiguration überschreiben.`,"health.title":`Status`,"health.tooltip":`Systemstatus`,"changelog.title":`Änderungsprotokoll`,"changelog.tooltip":`Was ist neu in Kōbō`,"changelog.empty":`Kein Änderungsprotokoll verfügbar.`,"changelog.current":`aktuell`,"changelog.currentVersion":`Aktuelle Version: v{version}`,"health.envTitle":`Umgebung`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Datenbank`,"health.dbPath":`Pfad`,"health.dbSize":`Größe`,"health.schemaVersion":`Schema-Version`,"health.settingsSchemaVersion":`Einstellungs-Schema`,"health.runtimesTitle":`Agent-Laufzeiten`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude nicht im PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`codex-Binärdatei nicht auflösbar`,"health.forgeCliTitle":`Forge-CLI (gh / glab)`,"health.forgeCliMissing":`Weder gh noch glab gefunden — Pull Requests und CI-Überwachung nicht verfügbar`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} gesamt, {archived} archiviert`,"health.worktreesMissing":`{count} Worktree(s) auf der Festplatte fehlen`,"health.sessionsTitle":`Agent-Sitzungen`,"health.sessionsOrphaned":`{n} verwaiste laufende Sitzung(en)`,"health.integrationsTitle":`Integrationen`,"health.integrationConfigured":`konfiguriert`,"health.integrationMissing":`nicht konfiguriert`,"health.integrationDisabled":`deaktiviert`,"settings.integrationEnabled":`Integration aktivieren`,"health.activeTitle":`Aktiver Zustand`,"health.activeQuotaBackoffs":`Ausstehende Quota-Backoffs`,"health.activeWakeups":`Geplante Aufweckungen`,"health.activeAutoLoop":`Auto-Loop läuft`,"health.activeAgentSessions":`Aktive Agent-Sessions`,"health.activeDevServers":`Laufende Dev-Server`,"health.noneActive":`Keine.`,"health.quotaResumeAt":`fortgesetzt um {time}`,"health.wakeupAt":`aufgeweckt um {time}`,"health.startedAgo":`gestartet vor {time}`,"health.autoLoopReady":`bereit, iteriert`,"health.autoLoopGrooming":`Grooming läuft`,"session.started":`Sitzung gestartet`,"session.ended":`Sitzung beendet`,"session.compacted":`Kontext komprimiert`,"session.endedCompleted":`Zug beendet — senden Sie eine Nachricht, um fortzufahren`,"session.endedKilled":`Sitzung gestoppt`,"session.endedError":`Sitzung mit einem Fehler beendet`,"session.endedWatchdog":`Sitzung nach einer Phase der Inaktivität zwangsweise geschlossen`,"tool.running":`Läuft...`,"activity.raw_lines":`Rohausgabezeilen ({n})`,"activity.loading_older":`Ältere Nachrichten werden geladen…`,"activity.compacting":`Kontext wird komprimiert…`,"activity.prev_user_message":`Vorherige Nachricht des Benutzers`,"activity.scroll_to_bottom":`Nach unten scrollen`,"activity.empty":`Noch nichts`,"activity.emptyHint":`Die Agentenausgabe erscheint hier, sobald eine Sitzung startet.`,"activity.a11y.region":`Ansagen zur Agentenaktivität`,"activity.a11y.agentSaid":`Agent: {text}`,"activity.a11y.toolStarted":`Werkzeug {name} gestartet`,"activity.a11y.toolFinished":`Werkzeug {name} beendet`,"activity.a11y.toolFailed":`Werkzeug {name} fehlgeschlagen`,"chat.systemPrompt":`System-Prompt`,"chat.agent":`Agent`,"chat.cleanupScript":`Cleanup-Skript`,"chat.archiveScript":`Archiv-Skript`,"chat.setupScript":`Setup-Skript`,"chat.scriptDone":`Fertig`,"chat.scriptComplete":`[{phase}] Abgeschlossen`,"chat.scriptError":`[{phase}] Fehler: {message}`,"chat.unknownError":`unbekannt`,"chat.you":`Du`,"chat.session":`Sitzung`,"chat.nActions":`{n} Aktion | {n} Aktionen`,"chat.lastUpdatedAt":`Zuletzt aktualisiert um {time}`,"chat.scrollToTurnTop":`Zum Nachrichtenanfang scrollen`,"migration.backing_up":`Datenbank wird gesichert…`,"migration.running":`Agent-Daten werden migriert — {processed}/{total}`,"migration.error":`Migration fehlgeschlagen`,"migration.backup_location":`Ein Backup wurde unter {path} gespeichert. Starte Kōbō neu, um erneut zu versuchen.`,"migration.retry":`Starte Kōbō neu, um erneut zu versuchen.`,"engine.select":`Engine`,"engine.model":`Modell`,"engine.effort":`Reasoning-Aufwand`,"wakeup.scheduledIn":`Nächste Weckung in {n}s`,"wakeup.scheduledAt":`Nächste Weckung um {time}`,"wakeup.firing":`Wecke auf...`,"wakeup.reason":`Grund: {reason}`,"wakeup.cancel":`Diese Weckung abbrechen`,"wakeup.pendingIndicator":`Weckung geplant`,"cron.pendingIndicator":`{n} Cron(s) geplant`,"schedule.tabLabel":`Zeitplan`,"schedule.panelTitle":`Automatisierung`,"schedule.panelDescription":`Diesen Workspace später wecken oder Anweisungen nach Zeitplan ausführen.`,"schedule.activeTitle":`Aktive Zeitpläne`,"schedule.emptyTitle":`Nichts geplant`,"schedule.emptyDescription":`Unten ein einmaliges Wakeup oder eine wiederkehrende Aufgabe erstellen.`,"schedule.cancelWakeup":`Dieses Wakeup abbrechen`,"schedule.cancelCron":`Diese wiederkehrende Aufgabe löschen`,"schedule.createTitle":`Zeitplan erstellen`,"schedule.createDescription":`Festlegen, wann und wie der Agent ausgeführt werden soll.`,"schedule.typeWakeup":`Einmaliges Wakeup`,"schedule.typeRecurring":`Wiederkehrende Aufgabe`,"schedule.wakeupDescription":`Den Prompt einmalig nach einer Verzögerung ausführen.`,"schedule.cronDescription":`Den Prompt regelmäßig nach einem festen Zeitplan ausführen.`,"schedule.promptHint":`Anweisungen, die an den Agenten gesendet werden`,"schedule.frequencyTitle":`Häufigkeit`,"schedule.advancedDescription":`Einen rohen Cron-Ausdruck verwenden`,"schedule.cronExpressionLabel":`Cron-Ausdruck`,"schedule.sessionModeTitle":`Ausführungssitzung`,"schedule.modeResume":`Sitzung fortsetzen`,"schedule.oneShotHint":`Diesen Zeitplan nach der ersten Ausführung entfernen.`,"schedule.wakeupTitle":`Wakeup ausstehend`,"schedule.cronsTitle":`Wiederkehrende Zeitpläne`,"schedule.noWakeup":`Kein Wakeup geplant`,"schedule.noCrons":`Kein Cron geplant`,"schedule.nextFireAt":`nächstes um {time}`,"schedule.lastFiredAt":`zuletzt vor {time}`,"schedule.addCronTitle":`Wiederkehrende Aufgabe hinzufügen`,"schedule.addWakeupTitle":`Wakeup planen`,"schedule.every":`Alle`,"schedule.unitMinutes":`Minuten`,"schedule.unitHours":`Stunden`,"schedule.unitDays":`Tage`,"schedule.daysDriftWarning":`Das Intervall kann sich am Monatsende auf 1 Tag verkürzen (Cron-Einschränkung).`,"schedule.advancedExpression":`Erweiterter Ausdruck (optional)`,"schedule.advancedHint":`Roher Cron (z. B. */15 * * * *) oder {'@'}hourly/{'@'}daily — überschreibt die Auswahl, wenn gesetzt.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Bezeichnung (optional)`,"schedule.delayMinutes":`Verzögerung (Minuten)`,"schedule.modeFresh":`Neue Sitzung`,"schedule.oneShot":`Nur einmal ausführen`,"schedule.addCronBtn":`Cron hinzufügen`,"schedule.addWakeupBtn":`Wakeup planen`,"schedule.cronCreated":`Wiederkehrende Aufgabe hinzugefügt`,"schedule.wakeupCreated":`Wakeup geplant`,"askUserQuestion.title":`Der Agent stellt eine Frage`,"askUserQuestion.submit":`Antwort senden`,"askUserQuestion.multiSelectHint":`Eine oder mehrere Optionen auswählen`,"askUserQuestion.otherOption":`Sonstiges`,"askUserQuestion.otherOptionHint":`bitte in der nächsten Chat-Nachricht angeben`,"askUserQuestion.freeFormLabel":`Antwort präzisieren`,"askUserQuestion.freeFormHint":`Diese Antwort wird direkt an den Agenten gesendet.`,"askUserQuestion.noPending":`Keine offene Frage`,"askUserQuestion.next":`Weiter`,"askUserQuestion.previous":`Zurück`,"askUserQuestion.cancel":`Abbrechen`,"askUserQuestion.cancelTooltip":`Diese Frage überspringen — der Agent macht ohne Antwort weiter`,"askUserQuestion.collapse":`Fragebereich einklappen`,"askUserQuestion.expand":`Fragebereich ausklappen`,"permissionRequest.title":`Der Agent möchte ein Tool verwenden`,"permissionRequest.allow":`Erlauben`,"permissionRequest.allowOnce":`Einmal erlauben`,"permissionRequest.allowTurn":`Diesen Zug erlauben`,"permissionRequest.allowOperation":`Diese Aktion immer erlauben`,"permissionRequest.allowTool":`Dieses Tool immer erlauben`,"permissionRequest.deny":`Ablehnen`,"permissionRequest.tool":`Tool`,"permissionRequest.input":`Eingabe`,"permissionRequest.rawInput":`Technische Details`,"permissionRequest.collapse":`Berechtigungsfenster einklappen`,"permissionRequest.expand":`Berechtigungsfenster ausklappen`,"permissionRequest.denied":`vom Nutzer abgelehnt`,"workspaceStatus.created":`erstellt`,"workspaceStatus.extracting":`Extraktion`,"workspaceStatus.brainstorming":`Brainstorming`,"workspaceStatus.executing":`läuft`,"workspaceStatus.awaitingUser":`wartet auf deine Antwort`,"workspaceStatus.completed":`abgeschlossen`,"workspaceStatus.idle":`inaktiv`,"workspaceStatus.error":`Fehler`,"workspaceStatus.quota":`Kontingent erreicht`,"workspaceStatus.retrying":`automatische Wiederaufnahme`,"workspaceList.prOpen":`#{n} — Pull Request offen`,"workspaceList.prWatchDisabledIndicator":`PR-Prüfungen für diesen Workspace ignoriert`,"workspaceList.prChangesRequested":`#{n} — Änderungen angefordert`,"workspaceList.attentionCiFailed":`CI fehlgeschlagen`,"workspaceList.attentionChangesRequested":`Änderungen angefordert`,"workspaceList.attentionReadyToMerge":`Bereit zum Mergen`,"autoLoop.toggle":`Auto-Schleife`,"autoLoop.start":`Auto-Schleife starten`,"autoLoop.prepare":`Auto-Schleife vorbereiten`,"autoLoop.reprepare":`Auto-Schleife erneut vorbereiten`,"autoLoop.reprepareTooltip":`Grooming-Schritt erneut ausführen, um Aufgaben hinzuzufügen oder zu aktualisieren, bevor die Schleife neu gestartet wird`,"autoLoop.prepareBusy":`Warte, bis der Agent fertig ist, bevor du vorbereitest`,"autoLoop.forceReady":`Ich weiß, was ich tue — Grooming überspringen`,"autoLoop.forceReadyConfirm":`Grooming überspringen und Auto-Schleife als bereit markieren? Kann hängen bleiben, wenn Aufgaben nicht atomar sind.`,"autoLoop.stop":`Auto-Schleife stoppen`,"autoLoop.notReady":`Zuerst „Auto-Schleife vorbereiten" ausführen`,"autoLoop.noTasks":`Zuerst Aufgaben hinzufügen`,"autoLoop.progress":`Auto-Schleife · {done}/{total} Aufgaben`,"autoLoop.preparing":`Auto-Schleife · Vorbereitung`,"autoLoop.preparingTooltip":`Grooming läuft — der Agent erstellt / überprüft Aufgaben. Die Schleife startet, sobald mark_auto_loop_ready aufgerufen wird.`,"autoLoop.running":`Auto-Schleife läuft`,"autoLoop.startInMode":`Im Auto-Schleifen-Modus starten`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Modell nur für die anfängliche Brainstorming-Sitzung — jede Aufgabe danach nutzt das oben gewählte Modell`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Denkaufwand nur für die anfängliche Brainstorming-Sitzung`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Modell für jede Auto-Loop-Aufgabe nach der anfänglichen Brainstorming-Sitzung`,"autoLoop.sessionMode.perTask":`Neue Sitzung pro Aufgabe`,"autoLoop.sessionMode.label":`Sitzung:`,"autoLoop.sessionMode.perTaskTooltip":`Jede Aufgabe startet eine neue Claude-Code-Sitzung ohne Erinnerung an vorherige Aufgaben`,"autoLoop.sessionMode.continuous":`Durchgehende Sitzung`,"autoLoop.sessionMode.continuousTooltip":`Alle Aufgaben laufen in derselben Sitzung — der Agent behält den vollen Kontext, aber die Sitzung wird mit der Zeit länger`,"koboCommand.prepAutoloopDesc":`Aufgaben für Auto-Schleifen-Modus vorbereiten (auf Atomarität prüfen)`,"staleSessionBanner.title":`Auto-Schleife läuft`,"staleSessionBanner.message":`Du siehst eine ältere Sitzung — der Agent arbeitet gerade in der neuesten.`,"staleSessionBanner.staleTitle":`Ältere Sitzung`,"staleSessionBanner.staleMessage":`Du siehst eine ältere Sitzung — gesendete Nachrichten gehen an diese Sitzung, nicht an die neueste.`,"staleSessionBanner.switchToCurrent":`Zur aktuellen wechseln`,"network.login.title":`Netzwerkzugriff`,"network.login.description":`Dieses Kōbō benötigt ein Token, um über das Netzwerk gesteuert zu werden. Füge das in den Einstellungen auf dem Host angezeigte Token ein.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Token einfügen`,"network.login.connect":`Verbinden`,"network.login.invalid":`Ungültiges Token`,"network.login.serverError":`Serverfehler — bitte erneut versuchen.`,"network.login.unreachable":`Kōbō ist nicht erreichbar — prüfe deine Verbindung.`,"layout.toggleWorkspaces":`Workspaces-Leiste ein-/ausblenden`,"layout.togglePanel":`Seitenleiste ein-/ausblenden`,"unsaved.title":`Ohne Speichern verlassen?`,"unsaved.message":`Du hast ungespeicherte Änderungen. Diese Seite zu verlassen verwirft sie.`,"unsaved.leave":`Verlassen`,"unsaved.stay":`Bleiben`},jr={"model.tooltip":`Model used by the agent for this workspace`,"reasoning.tooltip":`Reasoning level used by the agent for this workspace`,"thinking.label":`Thinking`,"thinking.noDetails":`The agent is thinking…`,"common.save":`Save`,"common.cancel":`Cancel`,"common.retry":`Retry`,"common.delete":`Delete`,"common.close":`Close`,"common.dismiss":`Dismiss`,"common.details":`Details`,"common.ok":`OK`,"whatsNew.title":`What's new`,"common.loading":`Loading...`,"common.search":`Search...`,"common.refresh":`Refresh`,"common.copy":`Copy`,"common.copied":`Copied to clipboard`,"common.copyFailed":`Copy failed`,"common.add":`Add`,"folderPicker.title":`Choose a folder`,"folderPicker.parent":`Parent folder`,"folderPicker.empty":`No subfolders`,"folderPicker.select":`Select this folder`,"common.start":`Start`,"common.stop":`Stop`,"common.archive":`Archive`,"common.unarchive":`Unarchive`,"common.selectWorkspace":`Select a workspace`,"common.noResults":`No results for "{query}"`,"common.send":`send`,"common.newLine":`new line`,"common.history":`history`,"common.justNow":`just now`,"common.minutesAgo":`{count}m ago`,"common.hoursAgo":`{count}h ago`,"common.daysAgo":`{count}d ago`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`Most capable model — successor to Opus 4.8, 1M context, adaptive thinking`,"model.mythos5Description":`Fable 5 without safety classifiers — limited access (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude picks the optimal model`,"model.opus5Description":`For complex agentic coding and enterprise work, 1M context`,"model.opus48Description":`Most capable Opus — long-horizon agentic coding, 1M context by default, high effort default`,"model.opus47ClassicDescription":`Latest Opus, most capable`,"model.opus471mDescription":`Latest Opus, 1M context`,"model.opusClassicDescription":`Most powerful`,"model.opus1mDescription":`Most powerful, 1M context`,"model.sonnet5Description":`Best mix of speed and intelligence, 1M context`,"model.sonnetClassicDescription":`Balanced`,"model.sonnet1mDescription":`Balanced, 1M context`,"model.haikuDescription":`Fastest`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`Latest frontier agentic coding model (requires ChatGPT auth)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Balanced agentic coding model for everyday work (requires ChatGPT auth)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Fast and affordable agentic coding model (requires ChatGPT auth)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recommended for complex coding (requires ChatGPT auth)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Default fallback — strong reasoning, works with API key auth`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Fast and efficient — best for responsive tasks and subagents`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimized for professional work and long-running agents`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Coding-specialized model for complex software engineering`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`none`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Let the engine pick the default`,"reasoning.minimalDescription":`Fastest, shallowest reasoning`,"reasoning.noneDescription":`No additional reasoning`,"reasoning.lowDescription":`Faster, less depth`,"reasoning.mediumDescription":`Balanced`,"reasoning.highDescription":`More depth`,"reasoning.xhighDescription":`Extended depth, long-horizon tasks`,"reasoning.maxDescription":`Maximum depth`,"agentPermissionMode.label":`Permission mode`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Accept edits`,"agentPermissionMode.interactive":`Interactive`,"agentPermissionMode.tooltip":`How the agent handles tool permissions. Plan: read-only, no writes. Bypass: skip every prompt. Strict: auto-accept file edits, respect allow/deny lists for the rest. Interactive: ask the user before each tool via the permission panel.`,"agentPermissionMode.autoLoopOverride":`Auto-loop forces a non-plan mode — Plan blocks the MCP tools and edits the loop relies on. Pick Bypass, Strict, or Interactive instead.`,"agentPermissionMode.autoLoopLocked":`Locked to Bypass while auto-loop is on — any other mode would stall the loop on permission prompts. AskUserQuestion still works.`,"workspaceList.title":`Workspaces`,"workspaceList.a11y.groupToggle":`{group} group, {count} workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Needs Attention`,"workspaceList.running":`Running`,"workspaceList.idle":`Idle`,"workspaceList.archived":`Archived`,"workspaceList.archivedToast":`“{name}” archived`,"workspaceList.archivedUndo":`Undo`,"workspaceList.unarchiveFailed":`Could not unarchive this workspace`,"workspaceList.noWorkspaces":`No workspaces yet`,"workspaceList.loadFailed":`Could not load your workspaces`,"workspaceList.loadFailedHint":`This is a connection failure, not an empty account.`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} running`,"workspaceList.deleteDialog.title":`Delete workspace?`,"workspaceList.deleteDialog.deleteLocal":`Delete local branch`,"workspaceList.deleteDialog.deleteRemote":`Delete remote branch`,"workspaceList.deleteDialog.warning":`Warning: this action is irreversible on the remote.`,"workspaceList.deleteArchivedDialog.tooltip":`Delete all archived workspaces`,"workspaceList.deleteArchivedDialog.title":`Delete all archived workspaces?`,"workspaceList.deleteArchivedDialog.message":`This will permanently delete the {count} archived workspaces. This action cannot be undone.`,"workspacePage.selectWorkspace":`Select a workspace to begin`,"workspacePage.commandPalettePlaceholder":`Search commands…`,"workspacePage.commandPaletteEmpty":`No matching command`,"workspacePage.commandFocusChat":`Focus chat input`,"workspacePage.commandSearchHistory":`Search workspace history`,"workspacePage.commandTogglePanel":`Show or hide side panel`,"workspacePage.commandStartAgent":`Start agent`,"workspacePage.commandStopAgent":`Stop agent`,"workspacePage.commandOpenSettings":`Open settings`,"workspacePage.commandOpenCreate":`Create a workspace`,"workspacePage.commandOpenSearch":`Global search`,"workspacePage.commandOpenHealth":`Health page`,"workspacePage.commandOpenChangelog":`Changelog`,"workspacePage.commandGroupWorkspaces":`Switch to a workspace`,"workspacePage.commandPaletteHint":`Command palette`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ New session`,"workspacePage.renameSession":`Rename`,"workspacePage.renameSessionTitle":`Rename session`,"workspacePage.sessionNameLabel":`Session name`,"workspacePage.sessionEndedNotice":`This session has ended. Create a new session to continue.`,"workspacePage.renameFailed":`Rename failed`,"workspacePage.copySessionId":`Copy session ID`,"workspacePage.deleteSession":`Delete session`,"workspacePage.deleteSessionTitle":`Delete session?`,"workspacePage.deleteSessionConfirm":`This permanently deletes this session and its conversation history.`,"workspacePage.deleteSessionFailed":`Failed to delete session`,"workspacePage.noEngineSessionId":`No engine session ID yet — the agent hasn't started this session`,"workspacePage.createSessionFailed":`Failed to create session`,"workspacePage.startFailed":`Start failed`,"workspacePage.stopFailed":`Stop failed`,"workspacePage.interrupt":`Interrupt`,"workspacePage.interrupted":`Agent interrupted — waiting for your next message`,"workspacePage.lastAgentEvent":`Last event {when}`,"workspacePage.agentStopping":`Stopping…`,"workspacePage.agentNotRunning":`No agent process — status is stale`,"workspacePage.archivedBanner":`Archived workspace — read-only`,"workspacePage.worktreePurgedBanner":`Worktree deleted — history kept, no restore available in this version`,"workspacePage.worktreePurgedTooltip":"The worktree folder was deleted from disk to reclaim space. Chat history, sessions and PR metadata remain queryable here, but the working directory no longer exists locally. A future Kōbō version will rebuild the worktree from the merged PR — for now you would need to recreate it manually via `gh pr checkout` or `git worktree add`.","workspacePage.pendingInitialPromptBanner":`An initial prompt is pending — the agent never received it (setup script crashed or the workspace was never started). Click Start to send it now.`,"workspacePage.unarchived":`Workspace unarchived`,"workspacePage.unarchiveFailed":`Unarchive failed`,"workspacePage.interruptFailed":`Interrupt failed`,"workspacePage.interruptHint":`Interrupt the current turn without ending the session.`,"workspacePage.interruptTooltip":`Soft interrupt (like Escape) — stops the current tool but keeps the session alive`,"workspacePage.pendingNextRun":`Applied on next start`,"workspacePage.activeSessionModel":`Active: {model}`,"workspacePage.activeSessionModelTooltip":`Model currently used by the selected session`,"workspacePage.switchEngine":`Switch engine`,"workspacePage.switchEngineHint":`Continue this workspace with another agent engine`,"workspacePage.moreActions":`More actions`,"workspacePage.switchEngineTitle":`Switch agent engine`,"workspacePage.switchEngineWarning":`The current agent will be stopped and a fresh session will start in the same worktree.`,"workspacePage.engineLabel":`Engine`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Handoff for the new engine`,"workspacePage.engineHandoffHint":`Review or edit the context that will be sent to the new agent.`,"workspacePage.confirmSwitchEngine":`Switch engine`,"workspacePage.switchEngineFailed":`Failed to switch engine`,"whip.dispatchFailed":`Unable to send the whip message`,"whip.phrase1":`Move faster, tocard!`,"whip.phrase2":`Pick up the pace, tocard!`,"whip.phrase3":`Back to work, tocard!`,"whip.phrase4":`Show me some speed, tocard!`,"whip.phrase5":`Less thinking, more doing, tocard!`,"search.title":`Search`,"search.tooltip":`Search across agent history`,"search.placeholder":`Search across all agent messages…`,"search.includeArchived":`Include archived workspaces`,"search.loading":`Searching…`,"search.noResults":`No matches`,"search.error":`Search failed: {message}`,"search.resultCount":`{n} result(s)`,"search.eventType.userMessage":`You`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`No activity yet`,"activityFeed.emptyHint":`Start a workspace to see agent output here`,"activityFeed.initialPrompt":`Initial Prompt`,"activityFeed.you":`You`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Go to previous message`,"activityFeed.scrollToBottom":`Scroll to bottom`,"activityFeed.sendAnswers":`Send answers`,"agentBusy.banner":`Agent is busy`,"agentBusy.subagentsRunning":`1 sub-agent running | {n} sub-agents running`,"agentBusy.viewSubagents":`View sub-agents`,"agentBusy.pendingMessage":`Waiting — agent is busy`,"terminal.title":`Terminal`,"terminal.open":`Open terminal`,"terminal.close":`Close terminal`,"terminal.noWorkspace":`Select a workspace`,"terminal.noWorktree":`Worktree not created yet`,"terminal.error":`Terminal error`,"terminal.exited":`Terminal exited`,"terminal.disconnected":`Connection lost`,"terminal.reconnecting":`Reconnecting… (attempt {attempt} of {max})`,"terminal.reconnect":`Reconnect`,"chatInput.placeholder":`Message... (/ for skills)`,"chatInput.fileSearchHint":`search a file`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Attach image`,"chatInput.queueBanner":`Message queued — will be sent when the agent finishes`,"chatInput.forceQueue":`Force send`,"chatInput.searchHistory":`search`,"chatInput.commandPalette":`commands`,"chatInput.shortcuts":`Keyboard shortcuts`,"chatInput.cancelQueue":`Cancel Queue`,"chatInput.autoLoopBanner":`Auto-loop is running — stop it to send a message`,"chatInput.awaitingUserBanner":`The agent is waiting for your answer above — reply via the question panel`,"chatInput.autoLoopStop":`Stop`,"koboCommand.checkProgressDesc":`Verify progress on tasks and acceptance criteria`,"chatInput.uploading":`Uploading...`,"voice.title":`Voice transcription`,"voice.enabled":`Enable local voice transcription`,"voice.pttKey":`Push-to-talk key`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Space`,"voice.language":`Language (auto or code)`,"voice.model":`Active model`,"voice.commandPath":`Whisper binary path (optional)`,"voice.ffmpegPath":`ffmpeg binary path (optional)`,"voice.temperature":`Temperature`,"voice.temperatureHint":`Lower is more deterministic; higher can be more flexible but less stable.`,"voice.initialPrompt":`Initial prompt (optional)`,"voice.initialPromptHint":`Optional context to help Whisper with names, jargon, or domain vocabulary.`,"voice.translateToEnglish":`Translate to English`,"voice.translateToEnglishHint":`When enabled, non-English speech is translated to English instead of transcribed as-is.`,"voice.suppressNst":`Suppress non-speech tokens`,"voice.suppressNstHint":`Attempts to reduce non-speech artifacts in the transcript.`,"voice.installLink":`Install whisper.cpp`,"voice.installGuideTitle":`Installation guide`,"voice.installGuideIntro":`Install whisper.cpp and ffmpeg, then set the binary paths below if needed.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`After CMake build, the Whisper binary is usually at: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Then set "Whisper binary path" and "ffmpeg binary path" in this section (or leave empty if they are in PATH).`,"voice.noneModel":`No active model`,"voice.notInstalled":`not installed`,"voice.download":`Download`,"voice.delete":`Delete`,"voice.holdToTalk":`Hold to talk`,"voice.recording":`Recording...`,"voice.transcribing":`Transcribing...`,"voice.notSupported":`Voice recording is not supported in this browser`,"voice.errorMicPermission":`Microphone permission denied`,"voice.errorTranscription":`Voice transcription failed`,"voice.downloadFailed":`Model download failed`,"voice.deleteFailed":`Model deletion failed`,"voice.errorDisabled":`Voice transcription is disabled in settings`,"voice.errorModelMissing":`No active voice model is configured`,"voice.errorModelNotInstalled":`The active voice model is not installed`,"voice.errorAudioInvalid":`Audio capture is invalid or empty`,"voice.errorLanguageInvalid":`Voice language configuration is invalid`,"voice.errorRuntimeMissing":`Whisper runtime is not installed or not in PATH`,"voice.maxDurationReached":`Maximum recording duration reached`,"voice.runtimeReady":`Runtime ready: {command}`,"voice.runtimeMissing":`Runtime missing: {command}`,"voice.ffmpegReady":`ffmpeg ready`,"voice.ffmpegMissing":`ffmpeg missing`,"voice.sectionRuntime":`Runtime status`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Whisper models`,"voice.sectionAdvanced":`Advanced options`,"voice.sectionBehavior":`Transcription behavior`,"voice.sectionBinaries":`Binary paths`,"voice.downloadModels":`Download a model`,"voice.cancelFailed":`Failed to cancel the download`,"createPage.title":`Create a workspace`,"createPage.subtitle":`Describe the mission, choose a project, then configure the agent.`,"createPage.sectionMission":`Mission`,"createPage.sectionMissionHint":`Give the agent a clear objective and the context needed to complete it.`,"createPage.workspaceNameLabel":`Workspace name`,"createPage.descriptionLabel":`Mission description`,"createPage.sources":`Optional sources`,"createPage.sectionGit":`Git project`,"createPage.sectionGitHint":`Choose the repository, source branch and worktree mode.`,"createPage.worktreeMode":`Worktree mode`,"createPage.worktreeNew":`New isolated worktree`,"createPage.worktreeExisting":`Reuse an existing worktree`,"createPage.projectLabel":`Project`,"createPage.sourceBranch":`Source branch`,"createPage.workingBranchPreview":`Working branch preview`,"createPage.branchNamePending":`workspace-name`,"createPage.sectionAgent":`Agent`,"createPage.sectionAgentHint":`Review the execution defaults or enable automation.`,"createPage.configureAgent":`Configure the agent`,"createPage.advancedOptions":`Advanced options`,"createPage.keyboardHint":`Press Ctrl/Cmd + Enter to create the workspace.`,"createPage.createWorkspace":`Create workspace`,"createPage.notionEnabled":`Notion enabled`,"createPage.importNotion":`Import from Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`URL must start with https://www.notion.so/ or https://app.notion.com/`,"createPage.notionAutoExtract":`Subtasks and acceptance criteria will be extracted automatically.`,"createPage.notionPanelChoiceLabel":`This URL points to a sub-page (?p=). Which one do you want to work on?`,"createPage.notionPanelOption":`Sub-page (panel)`,"createPage.notionPanelOptionDesc":`The page you were viewing — recommended`,"createPage.notionParentOption":`Parent page`,"createPage.notionParentOptionDesc":`The epic / database it belongs to`,"createPage.importSentry":`Import Sentry`,"createPage.sentryEnabled":`Sentry enabled`,"createPage.sentryPlaceholder":`https://your-org.sentry.io/issues/123456`,"createPage.sentryValidation":`URL must point to a Sentry issue (/issues/<id>)`,"createPage.sentryAutoExtract":`Sentry issue will be imported automatically`,"createPage.sentryExtractHint":`Kobo will extract the issue and write it to .ai/thoughts/`,"createPage.workspaceName":`Workspace name (defaults to Notion page title)`,"createPage.workspaceNamePlaceholder":`Workspace name...`,"createPage.instructions":`Additional instructions (optional)...`,"createPage.instructionsPlaceholder":`Describe the task...`,"createPage.tasks":`Tasks ({count})`,"createPage.addTask":`Add a task...`,"createPage.acceptanceCriteria":`Acceptance Criteria ({count})`,"createPage.addCriterion":`Add a criterion...`,"createPage.projectPath":`Enter the project path`,"createPage.branchType":`Branch type`,"createPage.branch":`Branch`,"createPage.noBranches":`No branches found`,"createPage.enterPath":`Enter a project path`,"createPage.skipSetupScript":`Skip setup script`,"createPage.worktreePickerLabel":`Existing worktree`,"createPage.noOrphanWorktrees":`No orphan worktrees in this project`,"createPage.pickWorktreeRequired":`Please pick a worktree to attach`,"createPage.notionExtractHint":`Subtasks and acceptance criteria will be extracted from the Notion page.`,"createPage.errorCreating":`Error creating workspace.`,"createPage.branchAdjusted":"Branch already existed — created `{branch}` instead. The matching worktree folder uses the same suffix.","createPage.localSourceFallback":`Workspace created from the local branch (origin unreachable) — the base may be stale.`,"createPage.validationNotionUrl":`Please paste a valid Notion URL (https://www.notion.so/... or https://app.notion.com/...).`,"createPage.validationDescription":`Please describe the task.`,"createPage.validationName":`Please provide a workspace name.`,"createPage.validationPath":`Please enter the project path.`,"createPage.validationBranch":`Please select a branch.`,"createPage.validationFocusHint":`The field to fix is highlighted below.`,"createPage.progress.validate":`Validating the request…`,"createPage.progress.fetch-source-branch":`Fetching the source branch from origin…`,"createPage.progress.inspect-worktree":`Inspecting the existing worktree…`,"createPage.progress.extract-notion":`Extracting the Notion page…`,"createPage.progress.extract-sentry":`Extracting the Sentry issue…`,"createPage.progress.create-record":`Creating the workspace…`,"createPage.progress.create-tasks":`Creating tasks and acceptance criteria…`,"createPage.progress.create-worktree":`Creating the git worktree…`,"createPage.progress.write-conventions":`Writing git conventions…`,"createPage.progress.write-context-files":`Writing context files…`,"createPage.progress.build-prompt":`Building the initial prompt…`,"createPage.progress.setup-script":`Running your setup script…`,"createPage.progress.start-agent":`Starting the agent…`,"createPage.progress.rollback":`Undoing the failed creation…`,"createPage.progress.done":`Done`,"createPage.progress.step":`Step {index} of {total}`,"createPage.errorAtStep":`Creation failed at step "{step}": {message}`,"createPage.override.title":`Two of your choices were overridden`,"createPage.override.setup-script-forced":`Setup script skipped: re-running it on a worktree you already prepared could destroy its contents.`,"createPage.override.permission-mode-downgraded":`Permission mode moved from Plan to Bypass: an auto-loop cannot run in Plan, which blocks tools and edits.`,"settings.title":`Settings`,"settings.language":`Language`,"settings.projectColor":`Color`,"settings.projectColorClear":`Clear`,"settings.projectColorDefault":`Default (grey)`,"settings.workspaceListSection":`Workspace list`,"settings.flattenWorkspaceList":`Flatten workspace list`,"settings.flattenWorkspaceListHint":`Show all workspaces in a single flat list with a project badge, instead of grouping by project.`,"settings.skillSuite.section":`Skill suite`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Custom`,"settings.skillSuite.superpowersHint":`Opinionated TDD / brainstorm / plan workflow (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Garry Tan's stack — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Both suites stack — superpowers for process discipline (brainstorm / TDD / plans / principles-level review), gstack for concrete workflows (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`affaan-m's agent-harness framework — agents, skills, rules and hooks for planning, testing, implementing, reviewing and memorizing (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`All three stack — superpowers for process discipline, gstack for concrete workflows, ECC for structured multi-agent review/implementation passes.`,"settings.skillSuite.customHint":`Compose the five prompts below from any templates you choose, then edit them freely.`,"settings.skillSuite.reloadDefaults":`Reload defaults`,"settings.skillSuite.reloadDefaultsConfirm":`Replace the five custom prompts with the agnostic defaults?`,"settings.skillSuite.customPrompts":`Custom prompts`,"settings.skillSuite.agnostic":`Agnostic baseline`,"settings.skillSuite.importPrompt":`Import a template`,"settings.skillSuite.imported":`Template imported. You can now edit it.`,"settings.skillSuite.importFailed":`Unable to import the template`,"settings.skillSuite.reviewTemplate":`Review template`,"settings.skillSuite.autoLoopReviewGate":`Auto-loop review gate`,"settings.skillSuite.autoLoopGroomingIntro":`Auto-loop grooming intro`,"settings.skillSuite.qaTemplate":`QA template`,"settings.skillSuite.brainstormingInstruction":`Brainstorming-phase instruction`,"settings.global":`Global`,"settings.projects":`Projects`,"settings.globalSettings":`Global Settings`,"settings.defaultModel":`Default model`,"settings.defaultModelClaude":`Default model (Claude Code)`,"settings.defaultModelCodex":`Default model (OpenAI Codex)`,"settings.agentPermissions":`Agent permissions`,"settings.skipPermissions":`Skip permission prompts (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Warning: disabling this will cause all tool permissions (Write, Edit, Bash...) to be auto-denied in headless mode. The agent will only be able to read.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Browser notifications when agent finishes`,"settings.audioNotifications":`Sound notification when agent finishes`,"settings.enableBrowserNotifications":`Enable browser notifications`,"settings.testBrowserNotification":`Test notification`,"settings.browserNotificationGranted":`Browser notifications allowed`,"settings.browserNotificationDenied":`Browser notifications blocked`,"settings.browserNotificationAsk":`Browser permission required`,"settings.browserNotificationUnsupported":`Browser notifications unavailable`,"settings.browserNotificationPermissionNeeded":`Allow browser notifications to send a test.`,"settings.browserNotificationTestTitle":`Kōbō notification test`,"settings.browserNotificationTestBody":`Browser notifications are working.`,"settings.enableAudio":`Enable audio`,"settings.notificationSound":`Notification sound`,"settings.notificationSoundHint":`Played when the agent finishes or requests permission.`,"settings.questionSound":`Question sound`,"settings.questionSoundHint":`Played only when the agent asks you a question.`,"settings.workspaceCreatedSound":`Workspace creation sound`,"settings.workspaceCreatedSoundHint":`Played after a workspace is created.`,"settings.notificationSoundPreview":`Preview`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Agent errors`,"settings.agentErrorSoundHint":`Played for quota, rate-limit, and agent errors.`,"settings.notificationSoundBasic":`Basic notification`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Work`,"settings.notificationSoundTravailTermine":`Work done`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`It's gonna blow`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR and CI`,"settings.soundGeneral":`General sound`,"settings.soundNone":`No sound`,"settings.prCiFailedSound":`CI failed`,"settings.prCiRecoveredSound":`CI recovered`,"settings.prChangesRequestedSound":`Changes requested`,"settings.prApprovedSound":`PR approved`,"settings.prMergeConflictSound":`Merge conflict`,"settings.prReadyToMergeSound":`Ready to merge`,"settings.prMergedSound":`PR merged`,"settings.prCiFailedSoundHint":`Played when CI changes to a failed state.`,"settings.prCiRecoveredSoundHint":`Played when CI recovers from a failure.`,"settings.prChangesRequestedSoundHint":`Played when a review requests changes.`,"settings.prApprovedSoundHint":`Played when the pull request is approved.`,"settings.prMergeConflictSoundHint":`Played when a merge conflict is detected.`,"settings.prReadyToMergeSoundHint":`Played when the pull request becomes ready to merge.`,"settings.prMergedSoundHint":`Played when the pull request is merged.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Default permission mode`,"settings.defaultPermissionModeClaude":`Default permission mode (Claude Code)`,"settings.defaultPermissionModeCodex":`Default permission mode (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode applied when creating a new workspace. Plan = read-only first, Bypass = skip prompts, Strict = auto-accept edits with allow-list, Interactive = ask before each tool.`,"settings.activityFeed":`Activity feed`,"settings.verboseMessages":`Show verbose system messages (task_progress, task_started)`,"settings.showThinkingBlocks":`Show agent thinking blocks`,"settings.whipSettings":`Whip`,"settings.whipSettingsHint":`Configure the optional whip shortcut and volume.`,"settings.whipEnabled":`Enable whip`,"settings.whipEnabledHint":`Shows the interactive whip control in eligible running workspaces.`,"settings.whipVolume":`Whip volume`,"settings.whipVolumeMasterAudioDisabled":`Master audio is off. Enable audio notifications to adjust the whip volume; your saved value is preserved.`,"whip.overlayLabel":`Interactive whip`,"whip.overlayInstructions":`Move the pointer to control the whip. Press Enter or Space to crack it. Press Escape to close.`,"settings.whipShortcut":`Whip shortcut`,"settings.whipShortcutHint":`Click, then press the shortcut to use.`,"settings.whipShortcutRecording":`Press a shortcut…`,"settings.whipShortcutButtonLabel":`Whip shortcut: {shortcut}`,"settings.whipShortcutRecordingLabel":`Recording whip shortcut. Press a shortcut…`,"settings.whipShortcutReset":`Reset shortcut`,"settings.whipShortcutReserved":`This shortcut is reserved by the browser.`,"settings.testIntegration":`Test connection`,"pwa.offline":`You are offline. Chat and agents require the Kōbō server.`,"pwa.reconnecting":`Reconnecting to the Kōbō server…`,"pwa.installReady":`Install Kōbō as an app.`,"pwa.install":`Install`,"pwa.ignore":`Ignore`,"pwa.updateReady":`A Kōbō update is available.`,"pwa.reload":`Reload`,"chat.searchWorkspaceHistory":`Search workspace history`,"chat.historySearch.user":`You`,"chat.historySearch.agent":`Agent`,"chat.openInGitDiff":`Open in Git diff`,"timeline.title":`Session timeline`,"timeline.export":`Export diagnostic`,"timeline.unnamed":`Agent session`,"timeline.tools":`{count} tools`,"timeline.errors":`{count} errors`,"settings.availableVariables":`Available template variables`,"settings.prPromptTemplate":`PR prompt template`,"settings.prPromptPlaceholder":`Instructions for the agent when creating GitHub PRs...`,"settings.prPromptHint":`Use the template variables listed above (double curly brace syntax).`,"settings.reviewPromptTemplate":`Review prompt template`,"settings.reviewPromptPlaceholder":`Instructions for the agent when reviewing branch changes...`,"settings.ciFixPromptTemplate":`CI fix prompt template`,"settings.ciFixPromptHint":`Sent to the agent when a workspace has failing CI. Variables (double-brace syntax): pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Ask the agent to diagnose and fix the failing CI jobs...`,"settings.finalizationPromptTemplate":`Auto-loop finalization prompt`,"settings.finalizationPromptHint":`Default prompt for the final auto-loop iteration (last quality checks). Used when a project leaves its own finalization prompt empty.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Notion initial prompt`,"settings.notionInitialPrompt.help":`Appended to the workspace creation prompt when the workspace has a Notion ticket. Variables: {variables}.`,"settings.notionInitialPrompt.project":`Notion initial prompt (override)`,"settings.sentryInitialPrompt":`Sentry initial prompt`,"settings.sentryInitialPrompt.help":`Appended to the workspace creation prompt when the workspace has a Sentry issue. Variables: {variables}.`,"settings.sentryInitialPrompt.project":`Sentry initial prompt (override)`,"settings.initialPrompt.inheritHint":`Leave blank to inherit. Type any whitespace character to disable injection at this level.`,"settings.resetToDefault":`Reset to default`,"settings.resetFailed":`Failed to load default value`,"settings.sentryIntegration":`Sentry integration`,"settings.var.prNumber":`PR number (e.g., 42)`,"settings.var.prUrl":`Full URL of the created PR`,"settings.var.branchName":`Working branch name`,"settings.var.sourceBranch":`Source branch the PR targets`,"settings.var.workspaceName":`Workspace name`,"settings.var.projectName":`Last segment of the project path`,"settings.var.notionUrl":`Notion URL if set, empty otherwise`,"settings.var.commits":`Bulleted commit list between source and head`,"settings.var.diffStats":`Git shortstat summary (files, insertions, deletions)`,"settings.var.tasks":`Regular tasks as a checkbox list`,"settings.var.acceptanceCriteria":`Acceptance criteria as a checkbox list`,"settings.gitConventions":`Git conventions (global)`,"settings.gitConventionsPlaceholder":`# Git conventions...`,"settings.gitConventionsHint":`These conventions are written to .ai/.git-conventions.md in each new workspace and must be followed by the agent before any git operation. Overridden by per-project conventions if defined.`,"settings.setupScript":`Setup script`,"settings.cleanupScript":`Cleanup script`,"settings.archiveScript":`Archive script`,"settings.archiveScriptHint":`Shell script run server-side in the worktree when a workspace is archived. Leave empty to disable.`,"settings.archiveScriptPlaceholder":`e.g. clean up containers, free disk space…`,"settings.changeSourceBranchScript":`Change-source-branch script`,"settings.changeSourceBranchScript.help":`Replaces the built-in cherry-pick when non-empty. The script owns git, PR base, force-push and conflicts; Kōbō still refuses while the agent is running and updates the source-branch metadata on exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — new source branch chosen in the dialog
|
|
18
|
+
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Ownership übernehmen (einfacher, verliert die Spur "von root im Container erstellt", spielt in der Praxis selten eine Rolle):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Tipp: Du kannst diese Befehle direkt auf das Worktrees-Root anwenden (z. B. `~/.worktrees/`), um alle bestehenden UND zukünftigen Workspaces auf einmal abzudecken. Danach funktioniert die Kōbō-Bereinigung ohne Berechtigungsfehler.","contextMenu.runSetup":`Setup-Skript ausführen`,"contextMenu.exportEvents":`Events exportieren (CSV)`,"contextMenu.dismissChangesRequested":`Änderungen angefragt als gesehen markieren`,"contextMenu.dismissCiFailure":`CI-Fehler als gesehen markieren`,"contextMenu.restoreChangesRequested":`Änderungen angefragt als ungesehen markieren`,"contextMenu.restoreCiFailure":`CI-Fehler als ungesehen markieren`,"contextMenu.exportingEvents":`Export wird vorbereitet…`,"contextMenu.exportEventsError":`Event-Export fehlgeschlagen`,"contextMenu.openNotion":`In Notion öffnen`,"contextMenu.openSentry":`In Sentry öffnen`,"contextMenu.openPr":`PR öffnen`,"contextMenu.ignorePrWatch":`PR-Prüfungen ignorieren`,"contextMenu.resumePrWatch":`PR-Prüfungen fortsetzen`,"contextMenu.prWatchToggleFailed":`Aktualisierung der PR-Prüfungen fehlgeschlagen`,"workspace.favorite":`Als Favorit markieren`,"workspace.unfavorite":`Aus Favoriten entfernen`,"workspace.showFavoritesOnly":`Nur Favoriten anzeigen`,"workspace.searchArchivedToggle":`Auch in archivierten Workspaces suchen`,"workspace.descriptionPlaceholder":`Kurze Beschreibung hinzufügen`,"workspace.descriptionDialogHint":`Klartext, max. 200 Zeichen. Leer lassen, um zu löschen.`,"workspace.descriptionTooLong":`Die Beschreibung darf höchstens 200 Zeichen lang sein.`,"workspace.descriptionSaveFailed":`Beschreibung konnte nicht gespeichert werden.`,"workspace.agentDescriptionTooltip":`Live-Status, gepflegt vom Agent`,"mcp.tool.setWorkspaceDescription":`Setzt die Kurzbeschreibung des Workspace (≤ 200 Zeichen).`,"tags.manage":`Tags verwalten`,"tags.manageTitle":`Workspace-Tags verwalten`,"tags.noTagsDefined":`Keine Tags definiert. Füge welche in Einstellungen > Global > Tags hinzu.`,"tags.orphanedHint":`{count} Tag(s) sind nicht mehr im globalen Katalog. Abwählen zum Entfernen.`,"settings.tagsTitle":`Workspace-Tags`,"settings.tagsHint":`Definiere die Tags, die Workspaces zugewiesen werden können. Tippe zum Hinzufügen, klicke auf das Kreuz zum Entfernen.`,"settings.tagsLabel":`Verfügbare Tags`,"settings.branchPrefixesTitle":`Branch-Präfixe`,"settings.branchPrefixesHint":`Verwalten Sie die Git-Branch-Präfixe, die auf der Workspace-Erstellungsseite verfügbar sind. Das erste ist standardmäßig vorausgewählt.`,"settings.branchPrefixesEmpty":`Kein Branch-Präfix definiert. Fügen Sie unten mindestens eines hinzu.`,"settings.branchPrefixesAddLabel":`Neues Präfix`,"settings.branchPrefixesEditHint":`Zum Umbenennen klicken`,"settings.branchPrefixesMoveUp":`Nach oben`,"settings.branchPrefixesMoveDown":`Nach unten`,"settings.worktreesTitle":`Git-Worktrees`,"settings.worktreesHint":`Wähle aus, wo neue Workspace-Worktrees erstellt werden. Relative Pfade sind projektrelativ; absolute Linux/macOS- und Windows-Pfade, $HOME, ~ und %USERPROFILE% werden unterstützt.`,"settings.worktreesPathLabel":`Worktrees-Pfad`,"settings.worktreesPathRequired":`Worktrees-Pfad ist erforderlich.`,"settings.worktreesPrefixByProject":`Worktrees nach Projektname präfixen`,"settings.worktreesPrefixByProjectHint":`Legt jeden Worktree in einem nach dem Projekt benannten Unterordner ab, um Kollisionen zu vermeiden, wenn mehrere Projekte die gleiche Worktree-Wurzel teilen.`,"settings.shareTitle":`Konfiguration teilen`,"settings.shareHint":`Exportiere Einstellungen, Templates und Tags als JSON-Bundle. MCP-Keys werden aus Sicherheitsgründen nicht exportiert.`,"settings.exportConfig":`Exportieren`,"settings.importConfig":`Importieren`,"settings.exportSuccess":`Konfiguration exportiert`,"settings.importSuccess":`Konfiguration importiert`,"settings.importConfirmTitle":`Konfiguration importieren`,"settings.importConfirmMessage":`Dies ersetzt deine aktuellen Einstellungen, Templates und Tags. MCP-Keys bleiben erhalten. Fortfahren?`,"settings.network.title":`Netzwerkzugriff`,"settings.network.hint":`Steuere Kōbō von einem anderen Gerät in deinem vertrauenswürdigen LAN. Aus = nur localhost. An = im Netzwerk erreichbar, per Token geschützt. Starte Kōbō nach dem Umschalten neu.`,"settings.network.enable":`Netzwerkzugriff aktivieren`,"settings.network.behindProxy":`Hinter einem Reverse Proxy`,"settings.network.behindProxyHint":`Kōbō kann deinen eigenen Rechner nicht mehr von einer weitergeleiteten Anfrage unterscheiden — selbst localhost benötigt ab jetzt das Token. Aktiviere dies nur, wenn ein Reverse Proxy (Traefik, nginx, Caddy…) vor Kōbō steht.`,"settings.network.restartRequired":`Starte Kōbō neu, um die neue Bind-Adresse anzuwenden.`,"settings.network.token":`Zugriffstoken`,"settings.network.copy":`Kopieren`,"settings.network.copied":`Kopiert`,"settings.network.regenerate":`Neu generieren`,"settings.network.regenerateConfirm":`Token neu generieren? Verbundene Geräte benötigen das neue Token.`,"settings.network.urls":`LAN-URLs`,"settings.network.scan":`Zum Verbinden scannen`,"settings.network.noUrls":`Keine LAN-Adresse erkannt.`,"settings.network.loadFailed":`Netzwerkzugriff-Einstellungen konnten nicht geladen werden.`,"settings.network.updateFailed":`Netzwerkzugriff-Einstellungen konnten nicht aktualisiert werden.`,"settings.unsavedChanges.title":`Nicht gespeicherte Änderungen`,"settings.unsavedChanges.message":`Dieses Projekt hat nicht gespeicherte Änderungen. Ein Projektwechsel verwirft sie.`,"settings.unsavedChanges.discard":`Verwerfen und wechseln`,"settings.unsavedChanges.cancel":`Abbrechen`,"settings.loadFailed":`Einstellungen konnten nicht geladen werden`,"settings.loadFailedHint":`Speichern ist deaktiviert: das Formular zeigt Standardwerte, und sie zu schreiben würde deine echte Konfiguration überschreiben.`,"health.title":`Status`,"health.tooltip":`Systemstatus`,"changelog.title":`Änderungsprotokoll`,"changelog.tooltip":`Was ist neu in Kōbō`,"changelog.empty":`Kein Änderungsprotokoll verfügbar.`,"changelog.current":`aktuell`,"changelog.currentVersion":`Aktuelle Version: v{version}`,"health.envTitle":`Umgebung`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Datenbank`,"health.dbPath":`Pfad`,"health.dbSize":`Größe`,"health.schemaVersion":`Schema-Version`,"health.settingsSchemaVersion":`Einstellungs-Schema`,"health.runtimesTitle":`Agent-Laufzeiten`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude nicht im PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`codex-Binärdatei nicht auflösbar`,"health.forgeCliTitle":`Forge-CLI (gh / glab)`,"health.forgeCliMissing":`Weder gh noch glab gefunden — Pull Requests und CI-Überwachung nicht verfügbar`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} gesamt, {archived} archiviert`,"health.worktreesMissing":`{count} Worktree(s) auf der Festplatte fehlen`,"health.sessionsTitle":`Agent-Sitzungen`,"health.sessionsOrphaned":`{n} verwaiste laufende Sitzung(en)`,"health.integrationsTitle":`Integrationen`,"health.integrationConfigured":`konfiguriert`,"health.integrationMissing":`nicht konfiguriert`,"health.integrationDisabled":`deaktiviert`,"settings.integrationEnabled":`Integration aktivieren`,"health.activeTitle":`Aktiver Zustand`,"health.activeQuotaBackoffs":`Ausstehende Quota-Backoffs`,"health.activeWakeups":`Geplante Aufweckungen`,"health.activeAutoLoop":`Auto-Loop läuft`,"health.activeAgentSessions":`Aktive Agent-Sessions`,"health.activeDevServers":`Laufende Dev-Server`,"health.noneActive":`Keine.`,"health.quotaResumeAt":`fortgesetzt um {time}`,"health.wakeupAt":`aufgeweckt um {time}`,"health.startedAgo":`gestartet vor {time}`,"health.autoLoopReady":`bereit, iteriert`,"health.autoLoopGrooming":`Grooming läuft`,"session.started":`Sitzung gestartet`,"session.ended":`Sitzung beendet`,"session.compacted":`Kontext komprimiert`,"session.endedCompleted":`Zug beendet — senden Sie eine Nachricht, um fortzufahren`,"session.endedKilled":`Sitzung gestoppt`,"session.endedError":`Sitzung mit einem Fehler beendet`,"session.endedWatchdog":`Sitzung nach einer Phase der Inaktivität zwangsweise geschlossen`,"tool.running":`Läuft...`,"activity.raw_lines":`Rohausgabezeilen ({n})`,"activity.loading_older":`Ältere Nachrichten werden geladen…`,"activity.compacting":`Kontext wird komprimiert…`,"activity.prev_user_message":`Vorherige Nachricht des Benutzers`,"activity.scroll_to_bottom":`Nach unten scrollen`,"activity.empty":`Noch nichts`,"activity.emptyHint":`Die Agentenausgabe erscheint hier, sobald eine Sitzung startet.`,"activity.a11y.region":`Ansagen zur Agentenaktivität`,"activity.a11y.agentSaid":`Agent: {text}`,"activity.a11y.toolStarted":`Werkzeug {name} gestartet`,"activity.a11y.toolFinished":`Werkzeug {name} beendet`,"activity.a11y.toolFailed":`Werkzeug {name} fehlgeschlagen`,"chat.systemPrompt":`System-Prompt`,"chat.agent":`Agent`,"chat.cleanupScript":`Cleanup-Skript`,"chat.archiveScript":`Archiv-Skript`,"chat.setupScript":`Setup-Skript`,"chat.scriptDone":`Fertig`,"chat.scriptComplete":`[{phase}] Abgeschlossen`,"chat.scriptError":`[{phase}] Fehler: {message}`,"chat.unknownError":`unbekannt`,"chat.you":`Du`,"chat.session":`Sitzung`,"chat.nActions":`{n} Aktion | {n} Aktionen`,"chat.lastUpdatedAt":`Zuletzt aktualisiert um {time}`,"chat.scrollToTurnTop":`Zum Nachrichtenanfang scrollen`,"migration.backing_up":`Datenbank wird gesichert…`,"migration.running":`Agent-Daten werden migriert — {processed}/{total}`,"migration.error":`Migration fehlgeschlagen`,"migration.backup_location":`Ein Backup wurde unter {path} gespeichert. Starte Kōbō neu, um erneut zu versuchen.`,"migration.retry":`Starte Kōbō neu, um erneut zu versuchen.`,"engine.select":`Engine`,"engine.model":`Modell`,"engine.effort":`Reasoning-Aufwand`,"wakeup.scheduledIn":`Nächste Weckung in {n}s`,"wakeup.scheduledAt":`Nächste Weckung um {time}`,"wakeup.firing":`Wecke auf...`,"wakeup.reason":`Grund: {reason}`,"wakeup.cancel":`Diese Weckung abbrechen`,"wakeup.pendingIndicator":`Weckung geplant`,"cron.pendingIndicator":`{n} Cron(s) geplant`,"schedule.tabLabel":`Zeitplan`,"schedule.panelTitle":`Automatisierung`,"schedule.panelDescription":`Diesen Workspace später wecken oder Anweisungen nach Zeitplan ausführen.`,"schedule.activeTitle":`Aktive Zeitpläne`,"schedule.emptyTitle":`Nichts geplant`,"schedule.emptyDescription":`Unten ein einmaliges Wakeup oder eine wiederkehrende Aufgabe erstellen.`,"schedule.cancelWakeup":`Dieses Wakeup abbrechen`,"schedule.cancelCron":`Diese wiederkehrende Aufgabe löschen`,"schedule.createTitle":`Zeitplan erstellen`,"schedule.createDescription":`Festlegen, wann und wie der Agent ausgeführt werden soll.`,"schedule.typeWakeup":`Einmaliges Wakeup`,"schedule.typeRecurring":`Wiederkehrende Aufgabe`,"schedule.wakeupDescription":`Den Prompt einmalig nach einer Verzögerung ausführen.`,"schedule.cronDescription":`Den Prompt regelmäßig nach einem festen Zeitplan ausführen.`,"schedule.promptHint":`Anweisungen, die an den Agenten gesendet werden`,"schedule.frequencyTitle":`Häufigkeit`,"schedule.advancedDescription":`Einen rohen Cron-Ausdruck verwenden`,"schedule.cronExpressionLabel":`Cron-Ausdruck`,"schedule.sessionModeTitle":`Ausführungssitzung`,"schedule.modeResume":`Sitzung fortsetzen`,"schedule.oneShotHint":`Diesen Zeitplan nach der ersten Ausführung entfernen.`,"schedule.wakeupTitle":`Wakeup ausstehend`,"schedule.cronsTitle":`Wiederkehrende Zeitpläne`,"schedule.noWakeup":`Kein Wakeup geplant`,"schedule.noCrons":`Kein Cron geplant`,"schedule.nextFireAt":`nächstes um {time}`,"schedule.lastFiredAt":`zuletzt vor {time}`,"schedule.addCronTitle":`Wiederkehrende Aufgabe hinzufügen`,"schedule.addWakeupTitle":`Wakeup planen`,"schedule.every":`Alle`,"schedule.unitMinutes":`Minuten`,"schedule.unitHours":`Stunden`,"schedule.unitDays":`Tage`,"schedule.daysDriftWarning":`Das Intervall kann sich am Monatsende auf 1 Tag verkürzen (Cron-Einschränkung).`,"schedule.advancedExpression":`Erweiterter Ausdruck (optional)`,"schedule.advancedHint":`Roher Cron (z. B. */15 * * * *) oder {'@'}hourly/{'@'}daily — überschreibt die Auswahl, wenn gesetzt.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Bezeichnung (optional)`,"schedule.delayMinutes":`Verzögerung (Minuten)`,"schedule.modeFresh":`Neue Sitzung`,"schedule.oneShot":`Nur einmal ausführen`,"schedule.addCronBtn":`Cron hinzufügen`,"schedule.addWakeupBtn":`Wakeup planen`,"schedule.cronCreated":`Wiederkehrende Aufgabe hinzugefügt`,"schedule.wakeupCreated":`Wakeup geplant`,"askUserQuestion.title":`Der Agent stellt eine Frage`,"askUserQuestion.submit":`Antwort senden`,"askUserQuestion.multiSelectHint":`Eine oder mehrere Optionen auswählen`,"askUserQuestion.otherOption":`Sonstiges`,"askUserQuestion.otherOptionHint":`bitte in der nächsten Chat-Nachricht angeben`,"askUserQuestion.freeFormLabel":`Antwort präzisieren`,"askUserQuestion.freeFormHint":`Diese Antwort wird direkt an den Agenten gesendet.`,"askUserQuestion.noPending":`Keine offene Frage`,"askUserQuestion.next":`Weiter`,"askUserQuestion.previous":`Zurück`,"askUserQuestion.cancel":`Abbrechen`,"askUserQuestion.cancelTooltip":`Diese Frage überspringen — der Agent macht ohne Antwort weiter`,"askUserQuestion.collapse":`Fragebereich einklappen`,"askUserQuestion.expand":`Fragebereich ausklappen`,"permissionRequest.title":`Der Agent möchte ein Tool verwenden`,"permissionRequest.allow":`Erlauben`,"permissionRequest.allowOnce":`Einmal erlauben`,"permissionRequest.allowTurn":`Diesen Zug erlauben`,"permissionRequest.allowOperation":`Diese Aktion immer erlauben`,"permissionRequest.allowTool":`Dieses Tool immer erlauben`,"permissionRequest.deny":`Ablehnen`,"permissionRequest.tool":`Tool`,"permissionRequest.input":`Eingabe`,"permissionRequest.rawInput":`Technische Details`,"permissionRequest.collapse":`Berechtigungsfenster einklappen`,"permissionRequest.expand":`Berechtigungsfenster ausklappen`,"permissionRequest.denied":`vom Nutzer abgelehnt`,"workspaceStatus.created":`erstellt`,"workspaceStatus.extracting":`Extraktion`,"workspaceStatus.brainstorming":`Brainstorming`,"workspaceStatus.executing":`läuft`,"workspaceStatus.awaitingUser":`wartet auf deine Antwort`,"workspaceStatus.completed":`abgeschlossen`,"workspaceStatus.idle":`inaktiv`,"workspaceStatus.error":`Fehler`,"workspaceStatus.quota":`Kontingent erreicht`,"workspaceStatus.retrying":`automatische Wiederaufnahme`,"workspaceList.prOpen":`#{n} — Pull Request offen`,"workspaceList.prWatchDisabledIndicator":`PR-Prüfungen für diesen Workspace ignoriert`,"workspaceList.prChangesRequested":`#{n} — Änderungen angefordert`,"workspaceList.attentionCiFailed":`CI fehlgeschlagen`,"workspaceList.attentionChangesRequested":`Änderungen angefordert`,"workspaceList.attentionReadyToMerge":`Bereit zum Mergen`,"autoLoop.toggle":`Auto-Schleife`,"autoLoop.start":`Auto-Schleife starten`,"autoLoop.prepare":`Auto-Schleife vorbereiten`,"autoLoop.reprepare":`Auto-Schleife erneut vorbereiten`,"autoLoop.reprepareTooltip":`Grooming-Schritt erneut ausführen, um Aufgaben hinzuzufügen oder zu aktualisieren, bevor die Schleife neu gestartet wird`,"autoLoop.prepareBusy":`Warte, bis der Agent fertig ist, bevor du vorbereitest`,"autoLoop.forceReady":`Ich weiß, was ich tue — Grooming überspringen`,"autoLoop.forceReadyConfirm":`Grooming überspringen und Auto-Schleife als bereit markieren? Kann hängen bleiben, wenn Aufgaben nicht atomar sind.`,"autoLoop.stop":`Auto-Schleife stoppen`,"autoLoop.notReady":`Zuerst „Auto-Schleife vorbereiten" ausführen`,"autoLoop.noTasks":`Zuerst Aufgaben hinzufügen`,"autoLoop.progress":`Auto-Schleife · {done}/{total} Aufgaben`,"autoLoop.preparing":`Auto-Schleife · Vorbereitung`,"autoLoop.preparingTooltip":`Grooming läuft — der Agent erstellt / überprüft Aufgaben. Die Schleife startet, sobald mark_auto_loop_ready aufgerufen wird.`,"autoLoop.running":`Auto-Schleife läuft`,"autoLoop.startInMode":`Im Auto-Schleifen-Modus starten`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Modell nur für die anfängliche Brainstorming-Sitzung — jede Aufgabe danach nutzt das oben gewählte Modell`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Denkaufwand nur für die anfängliche Brainstorming-Sitzung`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Modell für jede Auto-Loop-Aufgabe nach der anfänglichen Brainstorming-Sitzung`,"autoLoop.sessionMode.perTask":`Neue Sitzung pro Aufgabe`,"autoLoop.sessionMode.label":`Sitzung:`,"autoLoop.sessionMode.perTaskTooltip":`Jede Aufgabe startet eine neue Claude-Code-Sitzung ohne Erinnerung an vorherige Aufgaben`,"autoLoop.sessionMode.continuous":`Durchgehende Sitzung`,"autoLoop.sessionMode.continuousTooltip":`Alle Aufgaben laufen in derselben Sitzung — der Agent behält den vollen Kontext, aber die Sitzung wird mit der Zeit länger`,"koboCommand.prepAutoloopDesc":`Aufgaben für Auto-Schleifen-Modus vorbereiten (auf Atomarität prüfen)`,"staleSessionBanner.title":`Auto-Schleife läuft`,"staleSessionBanner.message":`Du siehst eine ältere Sitzung — der Agent arbeitet gerade in der neuesten.`,"staleSessionBanner.staleTitle":`Ältere Sitzung`,"staleSessionBanner.staleMessage":`Du siehst eine ältere Sitzung — gesendete Nachrichten gehen an diese Sitzung, nicht an die neueste.`,"staleSessionBanner.switchToCurrent":`Zur aktuellen wechseln`,"network.login.title":`Netzwerkzugriff`,"network.login.description":`Dieses Kōbō benötigt ein Token, um über das Netzwerk gesteuert zu werden. Füge das in den Einstellungen auf dem Host angezeigte Token ein.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Token einfügen`,"network.login.connect":`Verbinden`,"network.login.invalid":`Ungültiges Token`,"network.login.serverError":`Serverfehler — bitte erneut versuchen.`,"network.login.unreachable":`Kōbō ist nicht erreichbar — prüfe deine Verbindung.`,"layout.toggleWorkspaces":`Workspaces-Leiste ein-/ausblenden`,"layout.togglePanel":`Seitenleiste ein-/ausblenden`,"unsaved.title":`Ohne Speichern verlassen?`,"unsaved.message":`Du hast ungespeicherte Änderungen. Diese Seite zu verlassen verwirft sie.`,"unsaved.leave":`Verlassen`,"unsaved.stay":`Bleiben`,"prCheckout.staleRetriesExhausted":`Der Repository-Status hat sich während der Anwendung deiner Auswahl immer wieder geändert. Schließe diesen Dialog und versuche es erneut über die Pull-Request-Auswahl.`,"prPicker.title":`Aus einer Pull Request importieren`,"prPicker.filterAll":`Alle`,"prPicker.filterMine":`Meine`,"prPicker.filterReviewRequested":`Review angefragt`,"prPicker.searchPlaceholder":`Pull Requests durchsuchen…`,"prPicker.loadMore":`Mehr laden`,"prPicker.empty":`Keine offene Pull Request passt.`,"prPicker.forkNotSupported":`Diese PR stammt von einem Fork; Kōbō kann sie nicht auschecken.`,"prPicker.loadFailed":`Pull Requests konnten nicht geladen werden.`,"prPicker.badge.workspaceExists":`Bereits in Kōbō geöffnet`,"prPicker.badge.worktreePresent":`Worktree vorhanden`,"prPicker.badge.localBranch":`Lokaler Branch`,"prPicker.badge.new":`Neu`,"prPicker.badge.draft":`Entwurf`,"prCheckout.title":`Worktree vorbereiten`,"prCheckout.apply":`Anwenden`,"prCheckout.cancel":`Abbrechen`,"prCheckout.retry":`Erneut versuchen`,"prCheckout.diagnoseFailed":`Die Diagnose des Pull Requests ist fehlgeschlagen.`,"prCheckout.resolveFailed":`Die Auflösung des Pull-Request-Checkouts ist fehlgeschlagen.`,"prCheckout.path.required":`Gib einen Worktree-Pfad ein, der noch nicht existiert.`,"prCheckout.workspace.restoreNotAvailable":"Das Wiederherstellen eines bereinigten Workspaces ist von hier aus noch nicht möglich. Lege den Worktree-Ordner auf der Festplatte neu an (z. B. mit `git worktree add`) — Kōbō verknüpft ihn innerhalb von etwa 30 Sekunden automatisch wieder.","prCheckout.staleReloaded":`Das Repository hat sich geändert; die Diagnose wurde aktualisiert.`,"prCheckout.step.blocked":`Fortfahren nicht möglich`,"prCheckout.step.path":`Worktree-Speicherort`,"prCheckout.step.workspace":`Bestehender Workspace`,"prCheckout.step.worktree":`Bestehende Worktree`,"prCheckout.step.operation":`Git-Vorgang läuft`,"prCheckout.step.changes":`Nicht committete Änderungen`,"prCheckout.step.divergence":`Lokaler Branch vs. origin`,"prCheckout.workspace.activeHint":`Ein Workspace namens „{name}" verfolgt diesen Branch bereits.`,"prCheckout.workspace.open":`Diesen Workspace öffnen`,"prCheckout.workspace.continue":`Mit einem anderen Pfad fortfahren`,"prCheckout.workspace.unarchive":`Entarchivieren und öffnen`,"prCheckout.workspace.restore":`Worktree wiederherstellen`,"prCheckout.worktree.orphanHint":`Auf diesem Branch existiert bereits eine Worktree unter {path}.`,"prCheckout.worktree.attach":`Anhängen`,"prCheckout.worktree.createElsewhere":`Eine neue an anderer Stelle erstellen`,"prCheckout.operation.hint":`In dieser Worktree läuft gerade ein {operation}.`,"prCheckout.operation.abort":`Abbrechen`,"prCheckout.operation.cancel":`Unangetastet lassen und hier stoppen`,"prCheckout.changes.hint":`{modified} geändert, {staged} vorgemerkt, {untracked} unverfolgt.`,"prCheckout.changes.stash":`Stashen`,"prCheckout.changes.commit":`Committen`,"prCheckout.changes.discard":`Verwerfen (als benannter Stash aufbewahrt)`,"prCheckout.changes.keep":`So belassen, wie sie sind`,"prCheckout.divergence.behindHint":`Dein Branch liegt {behind} Commit(s) hinter origin zurück.`,"prCheckout.divergence.aheadHint":`Dein Branch hat {ahead} nicht gepushte(n) Commit(s).`,"prCheckout.divergence.divergedHint":`{ahead} voraus, {behind} zurück gegenüber origin.`,"prCheckout.divergence.fastForward":`Fast-Forward auf origin`,"prCheckout.divergence.rebase":`Auf origin rebasen`,"prCheckout.divergence.resetHard":`Auf origin zurücksetzen (zuvor wird ein Backup-Branch erstellt)`,"prCheckout.divergence.keep":`Lokalen Stand beibehalten`,"prCheckout.blocked.forgeUnavailable":`Das Forge-CLI fehlt oder ist nicht authentifiziert.`,"prCheckout.blocked.forkPr":`Diese PR stammt von einem Fork; Kōbō kann sie nicht auschecken.`,"prCheckout.blocked.headBranchDeleted":`Der Branch existiert auf dem Remote nicht mehr.`,"prCheckout.blocked.indexLock":`Ein anderer Git-Prozess läuft gerade (index.lock ist vorhanden).`,"prCheckout.blocked.pathOccupied":`{path} existiert bereits und ist keine Worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} ist eine Worktree auf einem anderen Branch ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Es existiert bereits ein lokaler Branch namens {branch} mit unabhängiger Historie.`},jr={"model.tooltip":`Model used by the agent for this workspace`,"reasoning.tooltip":`Reasoning level used by the agent for this workspace`,"thinking.label":`Thinking`,"thinking.noDetails":`The agent is thinking…`,"common.save":`Save`,"common.cancel":`Cancel`,"common.retry":`Retry`,"common.delete":`Delete`,"common.close":`Close`,"common.dismiss":`Dismiss`,"common.details":`Details`,"common.ok":`OK`,"whatsNew.title":`What's new`,"common.loading":`Loading...`,"common.search":`Search...`,"common.refresh":`Refresh`,"common.copy":`Copy`,"common.copied":`Copied to clipboard`,"common.copyFailed":`Copy failed`,"common.add":`Add`,"folderPicker.title":`Choose a folder`,"folderPicker.parent":`Parent folder`,"folderPicker.empty":`No subfolders`,"folderPicker.select":`Select this folder`,"common.start":`Start`,"common.stop":`Stop`,"common.archive":`Archive`,"common.unarchive":`Unarchive`,"common.selectWorkspace":`Select a workspace`,"common.noResults":`No results for "{query}"`,"common.send":`send`,"common.newLine":`new line`,"common.history":`history`,"common.justNow":`just now`,"common.minutesAgo":`{count}m ago`,"common.hoursAgo":`{count}h ago`,"common.daysAgo":`{count}d ago`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`Most capable model — successor to Opus 4.8, 1M context, adaptive thinking`,"model.mythos5Description":`Fable 5 without safety classifiers — limited access (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude picks the optimal model`,"model.opus5Description":`For complex agentic coding and enterprise work, 1M context`,"model.opus48Description":`Most capable Opus — long-horizon agentic coding, 1M context by default, high effort default`,"model.opus47ClassicDescription":`Latest Opus, most capable`,"model.opus471mDescription":`Latest Opus, 1M context`,"model.opusClassicDescription":`Most powerful`,"model.opus1mDescription":`Most powerful, 1M context`,"model.sonnet5Description":`Best mix of speed and intelligence, 1M context`,"model.sonnetClassicDescription":`Balanced`,"model.sonnet1mDescription":`Balanced, 1M context`,"model.haikuDescription":`Fastest`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`Latest frontier agentic coding model (requires ChatGPT auth)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Balanced agentic coding model for everyday work (requires ChatGPT auth)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Fast and affordable agentic coding model (requires ChatGPT auth)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recommended for complex coding (requires ChatGPT auth)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Default fallback — strong reasoning, works with API key auth`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Fast and efficient — best for responsive tasks and subagents`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimized for professional work and long-running agents`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Coding-specialized model for complex software engineering`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`none`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Let the engine pick the default`,"reasoning.minimalDescription":`Fastest, shallowest reasoning`,"reasoning.noneDescription":`No additional reasoning`,"reasoning.lowDescription":`Faster, less depth`,"reasoning.mediumDescription":`Balanced`,"reasoning.highDescription":`More depth`,"reasoning.xhighDescription":`Extended depth, long-horizon tasks`,"reasoning.maxDescription":`Maximum depth`,"agentPermissionMode.label":`Permission mode`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Accept edits`,"agentPermissionMode.interactive":`Interactive`,"agentPermissionMode.tooltip":`How the agent handles tool permissions. Plan: read-only, no writes. Bypass: skip every prompt. Strict: auto-accept file edits, respect allow/deny lists for the rest. Interactive: ask the user before each tool via the permission panel.`,"agentPermissionMode.autoLoopOverride":`Auto-loop forces a non-plan mode — Plan blocks the MCP tools and edits the loop relies on. Pick Bypass, Strict, or Interactive instead.`,"agentPermissionMode.autoLoopLocked":`Locked to Bypass while auto-loop is on — any other mode would stall the loop on permission prompts. AskUserQuestion still works.`,"workspaceList.title":`Workspaces`,"workspaceList.a11y.groupToggle":`{group} group, {count} workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Needs Attention`,"workspaceList.running":`Running`,"workspaceList.idle":`Idle`,"workspaceList.archived":`Archived`,"workspaceList.archivedToast":`“{name}” archived`,"workspaceList.archivedUndo":`Undo`,"workspaceList.unarchiveFailed":`Could not unarchive this workspace`,"workspaceList.noWorkspaces":`No workspaces yet`,"workspaceList.loadFailed":`Could not load your workspaces`,"workspaceList.loadFailedHint":`This is a connection failure, not an empty account.`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} running`,"workspaceList.deleteDialog.title":`Delete workspace?`,"workspaceList.deleteDialog.deleteLocal":`Delete local branch`,"workspaceList.deleteDialog.deleteRemote":`Delete remote branch`,"workspaceList.deleteDialog.warning":`Warning: this action is irreversible on the remote.`,"workspaceList.deleteArchivedDialog.tooltip":`Delete all archived workspaces`,"workspaceList.deleteArchivedDialog.title":`Delete all archived workspaces?`,"workspaceList.deleteArchivedDialog.message":`This will permanently delete the {count} archived workspaces. This action cannot be undone.`,"workspacePage.selectWorkspace":`Select a workspace to begin`,"workspacePage.commandPalettePlaceholder":`Search commands…`,"workspacePage.commandPaletteEmpty":`No matching command`,"workspacePage.commandFocusChat":`Focus chat input`,"workspacePage.commandSearchHistory":`Search workspace history`,"workspacePage.commandTogglePanel":`Show or hide side panel`,"workspacePage.commandStartAgent":`Start agent`,"workspacePage.commandStopAgent":`Stop agent`,"workspacePage.commandOpenSettings":`Open settings`,"workspacePage.commandOpenCreate":`Create a workspace`,"workspacePage.commandOpenSearch":`Global search`,"workspacePage.commandOpenHealth":`Health page`,"workspacePage.commandOpenChangelog":`Changelog`,"workspacePage.commandGroupWorkspaces":`Switch to a workspace`,"workspacePage.commandPaletteHint":`Command palette`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ New session`,"workspacePage.renameSession":`Rename`,"workspacePage.renameSessionTitle":`Rename session`,"workspacePage.sessionNameLabel":`Session name`,"workspacePage.sessionEndedNotice":`This session has ended. Create a new session to continue.`,"workspacePage.renameFailed":`Rename failed`,"workspacePage.copySessionId":`Copy session ID`,"workspacePage.deleteSession":`Delete session`,"workspacePage.deleteSessionTitle":`Delete session?`,"workspacePage.deleteSessionConfirm":`This permanently deletes this session and its conversation history.`,"workspacePage.deleteSessionFailed":`Failed to delete session`,"workspacePage.noEngineSessionId":`No engine session ID yet — the agent hasn't started this session`,"workspacePage.createSessionFailed":`Failed to create session`,"workspacePage.startFailed":`Start failed`,"workspacePage.stopFailed":`Stop failed`,"workspacePage.interrupt":`Interrupt`,"workspacePage.interrupted":`Agent interrupted — waiting for your next message`,"workspacePage.lastAgentEvent":`Last event {when}`,"workspacePage.agentStopping":`Stopping…`,"workspacePage.agentNotRunning":`No agent process — status is stale`,"workspacePage.archivedBanner":`Archived workspace — read-only`,"workspacePage.worktreePurgedBanner":`Worktree deleted — history kept, no restore available in this version`,"workspacePage.worktreePurgedTooltip":"The worktree folder was deleted from disk to reclaim space. Chat history, sessions and PR metadata remain queryable here, but the working directory no longer exists locally. A future Kōbō version will rebuild the worktree from the merged PR — for now you would need to recreate it manually via `gh pr checkout` or `git worktree add`.","workspacePage.pendingInitialPromptBanner":`An initial prompt is pending — the agent never received it (setup script crashed or the workspace was never started). Click Start to send it now.`,"workspacePage.unarchived":`Workspace unarchived`,"workspacePage.unarchiveFailed":`Unarchive failed`,"workspacePage.interruptFailed":`Interrupt failed`,"workspacePage.interruptHint":`Interrupt the current turn without ending the session.`,"workspacePage.interruptTooltip":`Soft interrupt (like Escape) — stops the current tool but keeps the session alive`,"workspacePage.pendingNextRun":`Applied on next start`,"workspacePage.activeSessionModel":`Active: {model}`,"workspacePage.activeSessionModelTooltip":`Model currently used by the selected session`,"workspacePage.switchEngine":`Switch engine`,"workspacePage.switchEngineHint":`Continue this workspace with another agent engine`,"workspacePage.moreActions":`More actions`,"workspacePage.switchEngineTitle":`Switch agent engine`,"workspacePage.switchEngineWarning":`The current agent will be stopped and a fresh session will start in the same worktree.`,"workspacePage.engineLabel":`Engine`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Handoff for the new engine`,"workspacePage.engineHandoffHint":`Review or edit the context that will be sent to the new agent.`,"workspacePage.confirmSwitchEngine":`Switch engine`,"workspacePage.switchEngineFailed":`Failed to switch engine`,"whip.dispatchFailed":`Unable to send the whip message`,"whip.phrase1":`Move faster, tocard!`,"whip.phrase2":`Pick up the pace, tocard!`,"whip.phrase3":`Back to work, tocard!`,"whip.phrase4":`Show me some speed, tocard!`,"whip.phrase5":`Less thinking, more doing, tocard!`,"search.title":`Search`,"search.tooltip":`Search across agent history`,"search.placeholder":`Search across all agent messages…`,"search.includeArchived":`Include archived workspaces`,"search.loading":`Searching…`,"search.noResults":`No matches`,"search.error":`Search failed: {message}`,"search.resultCount":`{n} result(s)`,"search.eventType.userMessage":`You`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`No activity yet`,"activityFeed.emptyHint":`Start a workspace to see agent output here`,"activityFeed.initialPrompt":`Initial Prompt`,"activityFeed.you":`You`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Go to previous message`,"activityFeed.scrollToBottom":`Scroll to bottom`,"activityFeed.sendAnswers":`Send answers`,"agentBusy.banner":`Agent is busy`,"agentBusy.subagentsRunning":`1 sub-agent running | {n} sub-agents running`,"agentBusy.viewSubagents":`View sub-agents`,"agentBusy.pendingMessage":`Waiting — agent is busy`,"terminal.title":`Terminal`,"terminal.open":`Open terminal`,"terminal.close":`Close terminal`,"terminal.noWorkspace":`Select a workspace`,"terminal.noWorktree":`Worktree not created yet`,"terminal.error":`Terminal error`,"terminal.exited":`Terminal exited`,"terminal.disconnected":`Connection lost`,"terminal.reconnecting":`Reconnecting… (attempt {attempt} of {max})`,"terminal.reconnect":`Reconnect`,"chatInput.placeholder":`Message... (/ for skills)`,"chatInput.fileSearchHint":`search a file`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Attach image`,"chatInput.queueBanner":`Message queued — will be sent when the agent finishes`,"chatInput.forceQueue":`Force send`,"chatInput.searchHistory":`search`,"chatInput.commandPalette":`commands`,"chatInput.shortcuts":`Keyboard shortcuts`,"chatInput.cancelQueue":`Cancel Queue`,"chatInput.autoLoopBanner":`Auto-loop is running — stop it to send a message`,"chatInput.awaitingUserBanner":`The agent is waiting for your answer above — reply via the question panel`,"chatInput.autoLoopStop":`Stop`,"koboCommand.checkProgressDesc":`Verify progress on tasks and acceptance criteria`,"chatInput.uploading":`Uploading...`,"voice.title":`Voice transcription`,"voice.enabled":`Enable local voice transcription`,"voice.pttKey":`Push-to-talk key`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Space`,"voice.language":`Language (auto or code)`,"voice.model":`Active model`,"voice.commandPath":`Whisper binary path (optional)`,"voice.ffmpegPath":`ffmpeg binary path (optional)`,"voice.temperature":`Temperature`,"voice.temperatureHint":`Lower is more deterministic; higher can be more flexible but less stable.`,"voice.initialPrompt":`Initial prompt (optional)`,"voice.initialPromptHint":`Optional context to help Whisper with names, jargon, or domain vocabulary.`,"voice.translateToEnglish":`Translate to English`,"voice.translateToEnglishHint":`When enabled, non-English speech is translated to English instead of transcribed as-is.`,"voice.suppressNst":`Suppress non-speech tokens`,"voice.suppressNstHint":`Attempts to reduce non-speech artifacts in the transcript.`,"voice.installLink":`Install whisper.cpp`,"voice.installGuideTitle":`Installation guide`,"voice.installGuideIntro":`Install whisper.cpp and ffmpeg, then set the binary paths below if needed.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`After CMake build, the Whisper binary is usually at: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Then set "Whisper binary path" and "ffmpeg binary path" in this section (or leave empty if they are in PATH).`,"voice.noneModel":`No active model`,"voice.notInstalled":`not installed`,"voice.download":`Download`,"voice.delete":`Delete`,"voice.holdToTalk":`Hold to talk`,"voice.recording":`Recording...`,"voice.transcribing":`Transcribing...`,"voice.notSupported":`Voice recording is not supported in this browser`,"voice.errorMicPermission":`Microphone permission denied`,"voice.errorTranscription":`Voice transcription failed`,"voice.downloadFailed":`Model download failed`,"voice.deleteFailed":`Model deletion failed`,"voice.errorDisabled":`Voice transcription is disabled in settings`,"voice.errorModelMissing":`No active voice model is configured`,"voice.errorModelNotInstalled":`The active voice model is not installed`,"voice.errorAudioInvalid":`Audio capture is invalid or empty`,"voice.errorLanguageInvalid":`Voice language configuration is invalid`,"voice.errorRuntimeMissing":`Whisper runtime is not installed or not in PATH`,"voice.maxDurationReached":`Maximum recording duration reached`,"voice.runtimeReady":`Runtime ready: {command}`,"voice.runtimeMissing":`Runtime missing: {command}`,"voice.ffmpegReady":`ffmpeg ready`,"voice.ffmpegMissing":`ffmpeg missing`,"voice.sectionRuntime":`Runtime status`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Whisper models`,"voice.sectionAdvanced":`Advanced options`,"voice.sectionBehavior":`Transcription behavior`,"voice.sectionBinaries":`Binary paths`,"voice.downloadModels":`Download a model`,"voice.cancelFailed":`Failed to cancel the download`,"createPage.title":`Create a workspace`,"createPage.subtitle":`Describe the mission, choose a project, then configure the agent.`,"createPage.sectionMission":`Mission`,"createPage.sectionMissionHint":`Give the agent a clear objective and the context needed to complete it.`,"createPage.workspaceNameLabel":`Workspace name`,"createPage.descriptionLabel":`Mission description`,"createPage.sources":`Optional sources`,"createPage.sectionGit":`Git project`,"createPage.sectionGitHint":`Choose the repository, source branch and worktree mode.`,"createPage.worktreeMode":`Worktree mode`,"createPage.worktreeNew":`New isolated worktree`,"createPage.worktreeExisting":`Reuse an existing worktree`,"createPage.projectLabel":`Project`,"createPage.sourceBranch":`Source branch`,"createPage.workingBranchPreview":`Working branch preview`,"createPage.branchNamePending":`workspace-name`,"createPage.sectionAgent":`Agent`,"createPage.sectionAgentHint":`Review the execution defaults or enable automation.`,"createPage.configureAgent":`Configure the agent`,"createPage.advancedOptions":`Advanced options`,"createPage.keyboardHint":`Press Ctrl/Cmd + Enter to create the workspace.`,"createPage.createWorkspace":`Create workspace`,"createPage.notionEnabled":`Notion enabled`,"createPage.importNotion":`Import from Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`URL must start with https://www.notion.so/ or https://app.notion.com/`,"createPage.notionAutoExtract":`Subtasks and acceptance criteria will be extracted automatically.`,"createPage.notionPanelChoiceLabel":`This URL points to a sub-page (?p=). Which one do you want to work on?`,"createPage.notionPanelOption":`Sub-page (panel)`,"createPage.notionPanelOptionDesc":`The page you were viewing — recommended`,"createPage.notionParentOption":`Parent page`,"createPage.notionParentOptionDesc":`The epic / database it belongs to`,"createPage.importSentry":`Import Sentry`,"createPage.sentryEnabled":`Sentry enabled`,"createPage.sentryPlaceholder":`https://your-org.sentry.io/issues/123456`,"createPage.sentryValidation":`URL must point to a Sentry issue (/issues/<id>)`,"createPage.sentryAutoExtract":`Sentry issue will be imported automatically`,"createPage.sentryExtractHint":`Kobo will extract the issue and write it to .ai/thoughts/`,"createPage.importPr":`Import from a PR`,"createPage.importPrRequiresProject":`Choose a project first`,"createPage.importPrNotSupported":`This project's forge does not support listing pull requests`,"createPage.lockedToPr":`Locked to PR #{number}`,"createPage.prReadyToCreate":`PR #{number} imported — ready to create the workspace.`,"createPage.unlockPrCheckout":`Unlock`,"createPage.workspaceName":`Workspace name (defaults to Notion page title)`,"createPage.workspaceNamePlaceholder":`Workspace name...`,"createPage.instructions":`Additional instructions (optional)...`,"createPage.instructionsPlaceholder":`Describe the task...`,"createPage.tasks":`Tasks ({count})`,"createPage.addTask":`Add a task...`,"createPage.acceptanceCriteria":`Acceptance Criteria ({count})`,"createPage.addCriterion":`Add a criterion...`,"createPage.projectPath":`Enter the project path`,"createPage.branchType":`Branch type`,"createPage.branch":`Branch`,"createPage.noBranches":`No branches found`,"createPage.enterPath":`Enter a project path`,"createPage.skipSetupScript":`Skip setup script`,"createPage.worktreePickerLabel":`Existing worktree`,"createPage.noOrphanWorktrees":`No orphan worktrees in this project`,"createPage.pickWorktreeRequired":`Please pick a worktree to attach`,"createPage.notionExtractHint":`Subtasks and acceptance criteria will be extracted from the Notion page.`,"createPage.errorCreating":`Error creating workspace.`,"createPage.branchAdjusted":"Branch already existed — created `{branch}` instead. The matching worktree folder uses the same suffix.","createPage.localSourceFallback":`Workspace created from the local branch (origin unreachable) — the base may be stale.`,"createPage.validationNotionUrl":`Please paste a valid Notion URL (https://www.notion.so/... or https://app.notion.com/...).`,"createPage.validationDescription":`Please describe the task.`,"createPage.validationName":`Please provide a workspace name.`,"createPage.validationPath":`Please enter the project path.`,"createPage.validationBranch":`Please select a branch.`,"createPage.validationFocusHint":`The field to fix is highlighted below.`,"createPage.progress.validate":`Validating the request…`,"createPage.progress.fetch-source-branch":`Fetching the source branch from origin…`,"createPage.progress.inspect-worktree":`Inspecting the existing worktree…`,"createPage.progress.extract-notion":`Extracting the Notion page…`,"createPage.progress.extract-sentry":`Extracting the Sentry issue…`,"createPage.progress.create-record":`Creating the workspace…`,"createPage.progress.create-tasks":`Creating tasks and acceptance criteria…`,"createPage.progress.create-worktree":`Creating the git worktree…`,"createPage.progress.write-conventions":`Writing git conventions…`,"createPage.progress.write-context-files":`Writing context files…`,"createPage.progress.build-prompt":`Building the initial prompt…`,"createPage.progress.setup-script":`Running your setup script…`,"createPage.progress.start-agent":`Starting the agent…`,"createPage.progress.rollback":`Undoing the failed creation…`,"createPage.progress.done":`Done`,"createPage.progress.step":`Step {index} of {total}`,"createPage.errorAtStep":`Creation failed at step "{step}": {message}`,"createPage.override.title":`Two of your choices were overridden`,"createPage.override.setup-script-forced":`Setup script skipped: re-running it on a worktree you already prepared could destroy its contents.`,"createPage.override.permission-mode-downgraded":`Permission mode moved from Plan to Bypass: an auto-loop cannot run in Plan, which blocks tools and edits.`,"settings.title":`Settings`,"settings.language":`Language`,"settings.projectColor":`Color`,"settings.projectColorClear":`Clear`,"settings.projectColorDefault":`Default (grey)`,"settings.workspaceListSection":`Workspace list`,"settings.flattenWorkspaceList":`Flatten workspace list`,"settings.flattenWorkspaceListHint":`Show all workspaces in a single flat list with a project badge, instead of grouping by project.`,"settings.skillSuite.section":`Skill suite`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Custom`,"settings.skillSuite.superpowersHint":`Opinionated TDD / brainstorm / plan workflow (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Garry Tan's stack — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Both suites stack — superpowers for process discipline (brainstorm / TDD / plans / principles-level review), gstack for concrete workflows (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`affaan-m's agent-harness framework — agents, skills, rules and hooks for planning, testing, implementing, reviewing and memorizing (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`All three stack — superpowers for process discipline, gstack for concrete workflows, ECC for structured multi-agent review/implementation passes.`,"settings.skillSuite.customHint":`Compose the five prompts below from any templates you choose, then edit them freely.`,"settings.skillSuite.reloadDefaults":`Reload defaults`,"settings.skillSuite.reloadDefaultsConfirm":`Replace the five custom prompts with the agnostic defaults?`,"settings.skillSuite.customPrompts":`Custom prompts`,"settings.skillSuite.agnostic":`Agnostic baseline`,"settings.skillSuite.importPrompt":`Import a template`,"settings.skillSuite.imported":`Template imported. You can now edit it.`,"settings.skillSuite.importFailed":`Unable to import the template`,"settings.skillSuite.reviewTemplate":`Review template`,"settings.skillSuite.autoLoopReviewGate":`Auto-loop review gate`,"settings.skillSuite.autoLoopGroomingIntro":`Auto-loop grooming intro`,"settings.skillSuite.qaTemplate":`QA template`,"settings.skillSuite.brainstormingInstruction":`Brainstorming-phase instruction`,"settings.global":`Global`,"settings.projects":`Projects`,"settings.globalSettings":`Global Settings`,"settings.defaultModel":`Default model`,"settings.defaultModelClaude":`Default model (Claude Code)`,"settings.defaultModelCodex":`Default model (OpenAI Codex)`,"settings.agentPermissions":`Agent permissions`,"settings.skipPermissions":`Skip permission prompts (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Warning: disabling this will cause all tool permissions (Write, Edit, Bash...) to be auto-denied in headless mode. The agent will only be able to read.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Browser notifications when agent finishes`,"settings.audioNotifications":`Sound notification when agent finishes`,"settings.enableBrowserNotifications":`Enable browser notifications`,"settings.testBrowserNotification":`Test notification`,"settings.browserNotificationGranted":`Browser notifications allowed`,"settings.browserNotificationDenied":`Browser notifications blocked`,"settings.browserNotificationAsk":`Browser permission required`,"settings.browserNotificationUnsupported":`Browser notifications unavailable`,"settings.browserNotificationPermissionNeeded":`Allow browser notifications to send a test.`,"settings.browserNotificationTestTitle":`Kōbō notification test`,"settings.browserNotificationTestBody":`Browser notifications are working.`,"settings.enableAudio":`Enable audio`,"settings.notificationSound":`Notification sound`,"settings.notificationSoundHint":`Played when the agent finishes or requests permission.`,"settings.questionSound":`Question sound`,"settings.questionSoundHint":`Played only when the agent asks you a question.`,"settings.workspaceCreatedSound":`Workspace creation sound`,"settings.workspaceCreatedSoundHint":`Played after a workspace is created.`,"settings.notificationSoundPreview":`Preview`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Agent errors`,"settings.agentErrorSoundHint":`Played for quota, rate-limit, and agent errors.`,"settings.notificationSoundBasic":`Basic notification`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Work`,"settings.notificationSoundTravailTermine":`Work done`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`It's gonna blow`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR and CI`,"settings.soundGeneral":`General sound`,"settings.soundNone":`No sound`,"settings.prCiFailedSound":`CI failed`,"settings.prCiRecoveredSound":`CI recovered`,"settings.prChangesRequestedSound":`Changes requested`,"settings.prApprovedSound":`PR approved`,"settings.prMergeConflictSound":`Merge conflict`,"settings.prReadyToMergeSound":`Ready to merge`,"settings.prMergedSound":`PR merged`,"settings.prCiFailedSoundHint":`Played when CI changes to a failed state.`,"settings.prCiRecoveredSoundHint":`Played when CI recovers from a failure.`,"settings.prChangesRequestedSoundHint":`Played when a review requests changes.`,"settings.prApprovedSoundHint":`Played when the pull request is approved.`,"settings.prMergeConflictSoundHint":`Played when a merge conflict is detected.`,"settings.prReadyToMergeSoundHint":`Played when the pull request becomes ready to merge.`,"settings.prMergedSoundHint":`Played when the pull request is merged.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Default permission mode`,"settings.defaultPermissionModeClaude":`Default permission mode (Claude Code)`,"settings.defaultPermissionModeCodex":`Default permission mode (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode applied when creating a new workspace. Plan = read-only first, Bypass = skip prompts, Strict = auto-accept edits with allow-list, Interactive = ask before each tool.`,"settings.activityFeed":`Activity feed`,"settings.verboseMessages":`Show verbose system messages (task_progress, task_started)`,"settings.showThinkingBlocks":`Show agent thinking blocks`,"settings.whipSettings":`Whip`,"settings.whipSettingsHint":`Configure the optional whip shortcut and volume.`,"settings.whipEnabled":`Enable whip`,"settings.whipEnabledHint":`Shows the interactive whip control in eligible running workspaces.`,"settings.whipVolume":`Whip volume`,"settings.whipVolumeMasterAudioDisabled":`Master audio is off. Enable audio notifications to adjust the whip volume; your saved value is preserved.`,"whip.overlayLabel":`Interactive whip`,"whip.overlayInstructions":`Move the pointer to control the whip. Press Enter or Space to crack it. Press Escape to close.`,"settings.whipShortcut":`Whip shortcut`,"settings.whipShortcutHint":`Click, then press the shortcut to use.`,"settings.whipShortcutRecording":`Press a shortcut…`,"settings.whipShortcutButtonLabel":`Whip shortcut: {shortcut}`,"settings.whipShortcutRecordingLabel":`Recording whip shortcut. Press a shortcut…`,"settings.whipShortcutReset":`Reset shortcut`,"settings.whipShortcutReserved":`This shortcut is reserved by the browser.`,"settings.testIntegration":`Test connection`,"pwa.offline":`You are offline. Chat and agents require the Kōbō server.`,"pwa.reconnecting":`Reconnecting to the Kōbō server…`,"pwa.installReady":`Install Kōbō as an app.`,"pwa.install":`Install`,"pwa.ignore":`Ignore`,"pwa.updateReady":`A Kōbō update is available.`,"pwa.reload":`Reload`,"chat.searchWorkspaceHistory":`Search workspace history`,"chat.historySearch.user":`You`,"chat.historySearch.agent":`Agent`,"chat.openInGitDiff":`Open in Git diff`,"timeline.title":`Session timeline`,"timeline.export":`Export diagnostic`,"timeline.unnamed":`Agent session`,"timeline.tools":`{count} tools`,"timeline.errors":`{count} errors`,"settings.availableVariables":`Available template variables`,"settings.prPromptTemplate":`PR prompt template`,"settings.prPromptPlaceholder":`Instructions for the agent when creating GitHub PRs...`,"settings.prPromptHint":`Use the template variables listed above (double curly brace syntax).`,"settings.reviewPromptTemplate":`Review prompt template`,"settings.reviewPromptPlaceholder":`Instructions for the agent when reviewing branch changes...`,"settings.ciFixPromptTemplate":`CI fix prompt template`,"settings.ciFixPromptHint":`Sent to the agent when a workspace has failing CI. Variables (double-brace syntax): pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Ask the agent to diagnose and fix the failing CI jobs...`,"settings.finalizationPromptTemplate":`Auto-loop finalization prompt`,"settings.finalizationPromptHint":`Default prompt for the final auto-loop iteration (last quality checks). Used when a project leaves its own finalization prompt empty.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Notion initial prompt`,"settings.notionInitialPrompt.help":`Appended to the workspace creation prompt when the workspace has a Notion ticket. Variables: {variables}.`,"settings.notionInitialPrompt.project":`Notion initial prompt (override)`,"settings.sentryInitialPrompt":`Sentry initial prompt`,"settings.sentryInitialPrompt.help":`Appended to the workspace creation prompt when the workspace has a Sentry issue. Variables: {variables}.`,"settings.sentryInitialPrompt.project":`Sentry initial prompt (override)`,"settings.initialPrompt.inheritHint":`Leave blank to inherit. Type any whitespace character to disable injection at this level.`,"settings.resetToDefault":`Reset to default`,"settings.resetFailed":`Failed to load default value`,"settings.sentryIntegration":`Sentry integration`,"settings.var.prNumber":`PR number (e.g., 42)`,"settings.var.prUrl":`Full URL of the created PR`,"settings.var.branchName":`Working branch name`,"settings.var.sourceBranch":`Source branch the PR targets`,"settings.var.workspaceName":`Workspace name`,"settings.var.projectName":`Last segment of the project path`,"settings.var.notionUrl":`Notion URL if set, empty otherwise`,"settings.var.commits":`Bulleted commit list between source and head`,"settings.var.diffStats":`Git shortstat summary (files, insertions, deletions)`,"settings.var.tasks":`Regular tasks as a checkbox list`,"settings.var.acceptanceCriteria":`Acceptance criteria as a checkbox list`,"settings.gitConventions":`Git conventions (global)`,"settings.gitConventionsPlaceholder":`# Git conventions...`,"settings.gitConventionsHint":`These conventions are written to .ai/.git-conventions.md in each new workspace and must be followed by the agent before any git operation. Overridden by per-project conventions if defined.`,"settings.setupScript":`Setup script`,"settings.cleanupScript":`Cleanup script`,"settings.archiveScript":`Archive script`,"settings.archiveScriptHint":`Shell script run server-side in the worktree when a workspace is archived. Leave empty to disable.`,"settings.archiveScriptPlaceholder":`e.g. clean up containers, free disk space…`,"settings.changeSourceBranchScript":`Change-source-branch script`,"settings.changeSourceBranchScript.help":`Replaces the built-in cherry-pick when non-empty. The script owns git, PR base, force-push and conflicts; Kōbō still refuses while the agent is running and updates the source-branch metadata on exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — new source branch chosen in the dialog
|
|
19
19
|
KOBO_OLD_BASE — workspace’s previous source branch
|
|
20
20
|
KOBO_WORKING_BRANCH — workspace’s working branch
|
|
21
21
|
KOBO_WORKTREE_PATH — absolute path of the worktree (also cwd)
|
|
@@ -31,7 +31,7 @@ KOBO_PR_NUMBER — PR/MR number on the resolved forge (empty if none open)`
|
|
|
31
31
|
# Or directly via git (works on GitHub even after branch deletion):
|
|
32
32
|
git fetch origin pull/[pr-number]/head:[branch-name]
|
|
33
33
|
git worktree add [path] [branch-name]`,"settings.purgeDocsRestoreFootnote":`GitHub keeps the PR head ref accessible long after the source branch is deleted (months / years). Auto-detection runs in the 30s watcher — no UI action needed once the folder is back.`,"settings.purgeDocsPermissionsTitle":`Avoiding permission errors during purge`,"settings.purgeDocsPermissionsIntro":`Docker often leaves root-owned files in node_modules / vendor inside the worktree. When Kōbō tries to remove them, you hit EACCES / EPERM and the purge fails. Two ways to prevent it:`,"settings.purgeDocsPermissionsDocker":'Configure your container to run as your host user — USER directive in the Dockerfile, or `user: "${UID}:${GID}"` in docker-compose (with UID/GID exported in your shell).',"settings.purgeDocsPermissionsAcl":`Pre-seed the worktrees root with a default ACL — safety net that works in MOST cases (ext4/btrfs/xfs + standard Docker bind mount). Each new file then inherits an access entry for your user, on top of the nominal owner:`,"settings.purgeDocsPermissionsAclCommand":` setfacl -d -m u:$(whoami):rwX [worktrees-root]`,"settings.purgeDocsPermissionsFootnote":"ACL limitations: do NOT work on named Docker volumes (use a bind mount), filesystems without ACL support (NTFS, exFAT, tmpfs), strict SELinux with `:Z`, or when Docker `userns-remap` is enabled. The most reliable solution remains configuring the user inside the container (option 1). Tip: `rwX` (capital X) only adds the executable bit on directories and already-executable files — cleaner than `rwx` which would make every text file executable.","settings.purgeDocsPermissionsRecoverTitle":`Unblock an already-broken worktree (existing root-owned files)`,"settings.purgeDocsPermissionsRecoverIntro":`If you end up with a worktree already full of root-owned files (Docker has run, vendor / node_modules are stuck), the preventive ACL above is not enough — you need to fix EXISTING files. Two approaches, both run from inside the worktree folder:`,"settings.purgeDocsPermissionsRecoverAclIntro":`Option A — Recursive ACL (preserves root ownership for audit, just adds access for your user alongside):`,"settings.purgeDocsPermissionsRecoverAclCommand":`# set default ACL for future files AND grant access to everything existing
|
|
34
|
-
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Take ownership (simpler, loses the "created by root in container" trace but rarely matters):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Tip: you can run these commands directly on the worktrees root (e.g. `~/.worktrees/`) to cover all existing AND future workspaces at once. Once done, Kōbō purge will work without permission errors.","contextMenu.runSetup":`Run setup script`,"contextMenu.exportEvents":`Export events (CSV)`,"contextMenu.dismissChangesRequested":`Mark 'Changes requested' as seen`,"contextMenu.dismissCiFailure":`Mark 'CI failure' as seen`,"contextMenu.restoreChangesRequested":`Mark 'Changes requested' as unseen`,"contextMenu.restoreCiFailure":`Mark 'CI failure' as unseen`,"contextMenu.exportingEvents":`Preparing export…`,"contextMenu.exportEventsError":`Event export failed`,"contextMenu.openNotion":`Open in Notion`,"contextMenu.openSentry":`Open in Sentry`,"contextMenu.openPr":`Open PR`,"contextMenu.ignorePrWatch":`Ignore PR checks`,"contextMenu.resumePrWatch":`Resume PR checks`,"contextMenu.prWatchToggleFailed":`Failed to update PR checks setting`,"workspace.favorite":`Mark as favorite`,"workspace.unfavorite":`Remove from favorites`,"workspace.showFavoritesOnly":`Show favorites only`,"workspace.searchArchivedToggle":`Also search archived workspaces`,"workspace.descriptionPlaceholder":`Add a short description`,"workspace.descriptionDialogHint":`Plain text, 200 characters max. Leave empty to clear.`,"workspace.descriptionTooLong":`Description must be 200 characters or fewer.`,"workspace.descriptionSaveFailed":`Failed to save description.`,"workspace.agentDescriptionTooltip":`Live status maintained by the agent`,"mcp.tool.setWorkspaceDescription":`Set the workspace short description (≤ 200 chars).`,"tags.manage":`Manage tags`,"tags.manageTitle":`Manage workspace tags`,"tags.noTagsDefined":`No tags defined. Add some in Settings > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) are no longer in the global catalog. Uncheck to remove them.`,"settings.tagsTitle":`Workspace tags`,"settings.tagsHint":`Define the tags you can assign to workspaces. Type to add, click the cross to remove.`,"settings.tagsLabel":`Available tags`,"settings.branchPrefixesTitle":`Branch prefixes`,"settings.branchPrefixesHint":`Manage the git branch prefixes available on the workspace creation page. The first one is pre-selected by default.`,"settings.branchPrefixesEmpty":`No branch prefix defined. Add at least one below.`,"settings.branchPrefixesAddLabel":`New prefix`,"settings.branchPrefixesEditHint":`Click to rename`,"settings.branchPrefixesMoveUp":`Move up`,"settings.branchPrefixesMoveDown":`Move down`,"settings.worktreesTitle":`Git worktrees`,"settings.worktreesHint":`Choose where new workspace worktrees are created. Relative paths are project-relative; Linux/macOS and Windows absolute paths, $HOME, ~, and %USERPROFILE% are supported.`,"settings.worktreesPathLabel":`Worktrees path`,"settings.worktreesPathRequired":`Worktrees path is required.`,"settings.worktreesPrefixByProject":`Prefix worktrees by project name`,"settings.worktreesPrefixByProjectHint":`Place each worktree under a sub-directory named after the project, to avoid collisions when multiple projects share the same worktrees root.`,"settings.shareTitle":`Share configuration`,"settings.shareHint":`Export your settings, templates and tags as a JSON bundle. MCP API keys are stripped from exports for security.`,"settings.exportConfig":`Export`,"settings.importConfig":`Import`,"settings.exportSuccess":`Configuration exported`,"settings.importSuccess":`Configuration imported`,"settings.importConfirmTitle":`Import configuration`,"settings.importConfirmMessage":`This will replace your current settings, templates and tags. Your MCP keys are preserved. Continue?`,"settings.network.title":`Network access`,"settings.network.hint":`Control Kōbō from another device on your trusted LAN. Off = localhost only. On = reachable on your network, protected by a token. Restart Kōbō after toggling.`,"settings.network.enable":`Enable network access`,"settings.network.behindProxy":`Behind a reverse proxy`,"settings.network.behindProxyHint":`Kōbō can no longer tell your own machine apart from a proxied request — even localhost will need the token from now on. Enable this only if a reverse proxy (Traefik, nginx, Caddy…) sits in front of Kōbō.`,"settings.network.restartRequired":`Restart Kōbō to apply the new bind address.`,"settings.network.token":`Access token`,"settings.network.copy":`Copy`,"settings.network.copied":`Copied`,"settings.network.regenerate":`Regenerate`,"settings.network.regenerateConfirm":`Regenerate the token? Connected devices will need the new token.`,"settings.network.urls":`LAN URLs`,"settings.network.scan":`Scan to connect`,"settings.network.noUrls":`No LAN address detected.`,"settings.network.loadFailed":`Failed to load network access settings.`,"settings.network.updateFailed":`Failed to update network access settings.`,"settings.unsavedChanges.title":`Unsaved changes`,"settings.unsavedChanges.message":`This project has unsaved changes. Switching projects will discard them.`,"settings.unsavedChanges.discard":`Discard and switch`,"settings.unsavedChanges.cancel":`Cancel`,"settings.loadFailed":`Settings could not be loaded`,"settings.loadFailedHint":`Saving is disabled: the form is showing default values, and writing them would overwrite your real configuration.`,"health.title":`Health`,"health.tooltip":`System health`,"changelog.title":`Changelog`,"changelog.tooltip":`What's new in Kōbō`,"changelog.empty":`No changelog available.`,"changelog.current":`current`,"changelog.currentVersion":`Current version: v{version}`,"health.envTitle":`Environment`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Database`,"health.dbPath":`Path`,"health.dbSize":`Size`,"health.schemaVersion":`Schema version`,"health.settingsSchemaVersion":`Settings schema`,"health.runtimesTitle":`Agent runtimes`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude not on PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`codex binary not resolvable`,"health.forgeCliTitle":`Forge CLI (gh / glab)`,"health.forgeCliMissing":`Neither gh nor glab found — pull requests and CI watching are unavailable`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} total, {archived} archived`,"health.worktreesMissing":`{count} worktree(s) missing on disk`,"health.sessionsTitle":`Agent sessions`,"health.sessionsOrphaned":`{n} orphaned running session(s)`,"health.integrationsTitle":`Integrations`,"health.integrationConfigured":`configured`,"health.integrationMissing":`not configured`,"health.integrationDisabled":`disabled`,"settings.integrationEnabled":`Enable integration`,"health.activeTitle":`Active state`,"health.activeQuotaBackoffs":`Pending quota backoffs`,"health.activeWakeups":`Scheduled wakeups`,"health.activeAutoLoop":`Auto-loop running`,"health.activeAgentSessions":`Live agent sessions`,"health.activeDevServers":`Running dev servers`,"health.noneActive":`None.`,"health.quotaResumeAt":`resumes at {time}`,"health.wakeupAt":`wakes at {time}`,"health.startedAgo":`started {time} ago`,"health.autoLoopReady":`ready, iterating`,"health.autoLoopGrooming":`grooming in progress`,"session.started":`Session started`,"session.ended":`Session ended`,"session.compacted":`Context compacted`,"session.endedCompleted":`Turn finished — send a message to continue`,"session.endedKilled":`Session stopped`,"session.endedError":`Session ended on an error`,"session.endedWatchdog":`Session force-closed after a period of inactivity`,"tool.running":`Running...`,"activity.raw_lines":`Raw output lines ({n})`,"activity.loading_older":`Loading older messages…`,"activity.compacting":`Compacting context…`,"activity.prev_user_message":`Previous user message`,"activity.scroll_to_bottom":`Scroll to bottom`,"activity.empty":`Nothing yet`,"activity.emptyHint":`The agent output will show up here as soon as a session starts.`,"activity.a11y.region":`Agent activity announcements`,"activity.a11y.agentSaid":`Agent: {text}`,"activity.a11y.toolStarted":`Tool {name} started`,"activity.a11y.toolFinished":`Tool {name} finished`,"activity.a11y.toolFailed":`Tool {name} failed`,"chat.systemPrompt":`System prompt`,"chat.agent":`Agent`,"chat.cleanupScript":`Cleanup script`,"chat.archiveScript":`Archive script`,"chat.setupScript":`Setup script`,"chat.scriptDone":`Done`,"chat.scriptComplete":`[{phase}] Complete`,"chat.scriptError":`[{phase}] Error: {message}`,"chat.unknownError":`unknown`,"chat.you":`You`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Last updated at {time}`,"chat.scrollToTurnTop":`Scroll to top of this message`,"migration.backing_up":`Backing up the database…`,"migration.running":`Migrating agent data — {processed}/{total}`,"migration.error":`Migration failed`,"migration.backup_location":`A backup was saved at {path}. Restart Kōbō to retry.`,"migration.retry":`Restart Kōbō to retry.`,"engine.select":`Engine`,"engine.model":`Model`,"engine.effort":`Reasoning effort`,"wakeup.scheduledIn":`Next wakeup in {n}s`,"wakeup.scheduledAt":`Next wakeup at {time}`,"wakeup.firing":`Waking up...`,"wakeup.reason":`Reason: {reason}`,"wakeup.cancel":`Cancel this wakeup`,"wakeup.pendingIndicator":`Wakeup scheduled`,"cron.pendingIndicator":`{n} cron(s) scheduled`,"schedule.tabLabel":`Schedule`,"schedule.panelTitle":`Automation`,"schedule.panelDescription":`Wake this workspace later or run instructions on a schedule.`,"schedule.activeTitle":`Active schedules`,"schedule.emptyTitle":`Nothing scheduled`,"schedule.emptyDescription":`Create a wakeup or recurring task below.`,"schedule.cancelWakeup":`Cancel this wakeup`,"schedule.cancelCron":`Delete this recurring task`,"schedule.createTitle":`Create a schedule`,"schedule.createDescription":`Choose when and how the agent should run.`,"schedule.typeWakeup":`One-time wakeup`,"schedule.typeRecurring":`Recurring task`,"schedule.wakeupDescription":`Run the prompt once after a delay.`,"schedule.cronDescription":`Run the prompt repeatedly on a fixed schedule.`,"schedule.promptHint":`Instructions that will be sent to the agent`,"schedule.frequencyTitle":`Frequency`,"schedule.advancedDescription":`Use a raw cron expression`,"schedule.cronExpressionLabel":`Cron expression`,"schedule.sessionModeTitle":`Execution session`,"schedule.modeResume":`Resume session`,"schedule.oneShotHint":`Remove this schedule after its first run.`,"schedule.wakeupTitle":`Wakeup pending`,"schedule.cronsTitle":`Recurring schedules`,"schedule.noWakeup":`No wakeup scheduled`,"schedule.noCrons":`No cron scheduled`,"schedule.nextFireAt":`next at {time}`,"schedule.lastFiredAt":`last fired {time} ago`,"schedule.addCronTitle":`Add a recurring task`,"schedule.addWakeupTitle":`Schedule a wakeup`,"schedule.every":`Every`,"schedule.unitMinutes":`minutes`,"schedule.unitHours":`hours`,"schedule.unitDays":`days`,"schedule.daysDriftWarning":`The interval may shrink to 1 day at the end of the month (cron limitation).`,"schedule.advancedExpression":`Advanced expression (optional)`,"schedule.advancedHint":`Raw cron (e.g. */15 * * * *) or {'@'}hourly/{'@'}daily — overrides the picker when set.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Label (optional)`,"schedule.delayMinutes":`Delay (minutes)`,"schedule.modeFresh":`New session`,"schedule.oneShot":`Run only once`,"schedule.addCronBtn":`Add cron`,"schedule.addWakeupBtn":`Schedule wakeup`,"schedule.cronCreated":`Recurring task added`,"schedule.wakeupCreated":`Wakeup scheduled`,"askUserQuestion.title":`The agent is asking a question`,"askUserQuestion.submit":`Submit answer`,"askUserQuestion.multiSelectHint":`Select one or more options`,"askUserQuestion.otherOption":`Other`,"askUserQuestion.otherOptionHint":`specify in your next chat message`,"askUserQuestion.freeFormLabel":`Specify your answer`,"askUserQuestion.freeFormHint":`This answer will be sent directly to the agent.`,"askUserQuestion.noPending":`No pending question`,"askUserQuestion.next":`Next`,"askUserQuestion.previous":`Previous`,"askUserQuestion.cancel":`Cancel`,"askUserQuestion.cancelTooltip":`Skip this question — the agent will proceed without an answer`,"askUserQuestion.collapse":`Collapse the question panel`,"askUserQuestion.expand":`Expand the question panel`,"permissionRequest.title":`The agent wants to use a tool`,"permissionRequest.allow":`Allow`,"permissionRequest.allowOnce":`Allow once`,"permissionRequest.allowTurn":`Allow this turn`,"permissionRequest.allowOperation":`Always this operation`,"permissionRequest.allowTool":`Always this tool`,"permissionRequest.deny":`Deny`,"permissionRequest.tool":`Tool`,"permissionRequest.input":`Input`,"permissionRequest.rawInput":`Technical details`,"permissionRequest.collapse":`Collapse the permission panel`,"permissionRequest.expand":`Expand the permission panel`,"permissionRequest.denied":`denied by user`,"workspaceStatus.created":`created`,"workspaceStatus.extracting":`extracting`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.executing":`running`,"workspaceStatus.awaitingUser":`awaiting your answer`,"workspaceStatus.completed":`completed`,"workspaceStatus.idle":`idle`,"workspaceStatus.error":`error`,"workspaceStatus.quota":`quota reached`,"workspaceStatus.retrying":`auto-resuming`,"workspaceList.prOpen":`#{n} — Pull request open`,"workspaceList.prWatchDisabledIndicator":`PR checks ignored for this workspace`,"workspaceList.prChangesRequested":`#{n} — Changes requested`,"workspaceList.attentionCiFailed":`CI failed`,"workspaceList.attentionChangesRequested":`Changes requested`,"workspaceList.attentionReadyToMerge":`Ready to merge`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Start auto-loop`,"autoLoop.prepare":`Prepare for auto-loop`,"autoLoop.reprepare":`Re-prepare for auto-loop`,"autoLoop.reprepareTooltip":`Re-run the grooming pass to add or refresh tasks before resuming the loop`,"autoLoop.prepareBusy":`Wait for the agent to finish before preparing`,"autoLoop.forceReady":`I know what I'm doing — skip grooming`,"autoLoop.forceReadyConfirm":`Skip grooming and mark auto-loop ready? This may cause the loop to stall if tasks aren't atomic.`,"autoLoop.stop":`Stop auto-loop`,"autoLoop.notReady":`Run 'Prepare for auto-loop' first`,"autoLoop.noTasks":`Add tasks first`,"autoLoop.progress":`Auto-loop · {done}/{total} tasks`,"autoLoop.preparing":`Auto-loop · preparing`,"autoLoop.preparingTooltip":`Grooming in progress — the agent is creating / reviewing tasks. The loop will start running once it calls mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop running`,"autoLoop.startInMode":`Start in auto-loop mode`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Model used only for the initial brainstorming session — every task after that uses the model picked above`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Reasoning level used only for the initial brainstorming session`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Model used for every auto-loop task after the initial brainstorming session`,"autoLoop.sessionMode.perTask":`New session per task`,"autoLoop.sessionMode.label":`Session:`,"autoLoop.sessionMode.perTaskTooltip":`Each task starts a fresh Claude Code session with no memory of prior tasks`,"autoLoop.sessionMode.continuous":`Continuous session`,"autoLoop.sessionMode.continuousTooltip":`All tasks run in the same session — the agent keeps full context, but the session grows longer over time`,"koboCommand.prepAutoloopDesc":`Prepare tasks for auto-loop mode (groom for atomicity)`,"staleSessionBanner.title":`Auto-loop running`,"staleSessionBanner.message":`You're viewing an older session — the agent is currently working in the latest one.`,"staleSessionBanner.staleTitle":`Older session`,"staleSessionBanner.staleMessage":`You're viewing an older session — messages you send go to this session, not the latest one.`,"staleSessionBanner.switchToCurrent":`Switch to current`,"network.login.title":`Network access`,"network.login.description":`This Kōbō requires a token to be controlled from the network. Paste the token shown in Settings on the host machine.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Paste your token`,"network.login.connect":`Connect`,"network.login.invalid":`Invalid token`,"network.login.serverError":`Server error — try again.`,"network.login.unreachable":`Kōbō is unreachable — check your connection.`,"layout.toggleWorkspaces":`Toggle workspaces panel`,"layout.togglePanel":`Toggle side panel`,"unsaved.title":`Leave without saving?`,"unsaved.message":`You have unsaved changes. Leaving this page discards them.`,"unsaved.leave":`Leave`,"unsaved.stay":`Stay`},Mr={"model.tooltip":`Modelo usado por el agente en este workspace`,"reasoning.tooltip":`Nivel de razonamiento usado por el agente en este workspace`,"thinking.label":`Razonamiento`,"thinking.noDetails":`El agente está razonando…`,"common.save":`Guardar`,"common.cancel":`Cancelar`,"common.retry":`Reintentar`,"common.delete":`Eliminar`,"common.close":`Cerrar`,"common.dismiss":`Descartar`,"common.details":`Detalles`,"common.ok":`OK`,"whatsNew.title":`Novedades`,"common.loading":`Cargando...`,"common.search":`Buscar...`,"common.refresh":`Actualizar`,"common.copy":`Copiar`,"common.copied":`Copiado al portapapeles`,"common.copyFailed":`Error al copiar`,"common.add":`Añadir`,"folderPicker.title":`Elegir una carpeta`,"folderPicker.parent":`Carpeta superior`,"folderPicker.empty":`Sin subcarpetas`,"folderPicker.select":`Elegir esta carpeta`,"common.start":`Iniciar`,"common.stop":`Detener`,"common.archive":`Archivar`,"common.unarchive":`Desarchivar`,"common.selectWorkspace":`Selecciona un workspace`,"common.noResults":`Sin resultados para "{query}"`,"common.send":`enviar`,"common.newLine":`nueva línea`,"common.history":`historial`,"common.justNow":`ahora mismo`,"common.minutesAgo":`hace {count}m`,"common.hoursAgo":`hace {count}h`,"common.daysAgo":`hace {count}d`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`El modelo más capaz — sucesor de Opus 4.8, contexto 1M, adaptive thinking`,"model.mythos5Description":`Fable 5 sin clasificadores de seguridad — acceso limitado (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude elige el modelo óptimo`,"model.opus5Description":`Para código agéntico complejo y trabajo empresarial, contexto 1M`,"model.opus48Description":`Opus más capaz — coding agéntico long-horizon, contexto 1M por defecto, esfuerzo high por defecto`,"model.opus47ClassicDescription":`Último Opus, el más capaz`,"model.opus471mDescription":`Último Opus, contexto 1M`,"model.opusClassicDescription":`El más potente`,"model.opus1mDescription":`El más potente, contexto 1M`,"model.sonnet5Description":`La mejor combinación de velocidad e inteligencia, contexto 1M`,"model.sonnetClassicDescription":`Equilibrado`,"model.sonnet1mDescription":`Equilibrado, contexto 1M`,"model.haikuDescription":`El más rápido`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`El modelo de codificación agéntica más avanzado (requiere autenticación ChatGPT)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Modelo de codificación agéntica equilibrado para el día a día (requiere autenticación ChatGPT)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Modelo de codificación agéntica rápido y económico (requiere autenticación ChatGPT)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recomendado para código complejo (requiere autenticación ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Alternativa por defecto — razonamiento sólido, compatible con clave API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rápido y eficiente — ideal para tareas reactivas y subagentes`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimizado para trabajo profesional y agentes de larga duración`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modelo especializado en código para ingeniería de software compleja`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`ninguno`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Deja que el motor decida`,"reasoning.minimalDescription":`Razonamiento más rápido y superficial`,"reasoning.noneDescription":`Sin razonamiento adicional`,"reasoning.lowDescription":`Más rápido, menos profundidad`,"reasoning.mediumDescription":`Equilibrado`,"reasoning.highDescription":`Más profundidad`,"reasoning.xhighDescription":`Profundidad extendida, tareas largas`,"reasoning.maxDescription":`Profundidad máxima`,"agentPermissionMode.label":`Modo de permisos`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Aceptar ediciones`,"agentPermissionMode.interactive":`Interactivo`,"agentPermissionMode.tooltip":`Cómo gestiona el agente los permisos de las herramientas. Plan: solo lectura, sin escrituras. Bypass: omitir todas las preguntas. Estricto: auto-aceptar ediciones de archivos, respetar allow/deny para el resto. Interactivo: preguntar al usuario antes de cada herramienta mediante el panel de permisos.`,"agentPermissionMode.autoLoopOverride":`El auto-loop fuerza un modo distinto a Plan — Plan bloquea las herramientas MCP y las ediciones que el bucle necesita. Elige Bypass, Estricto o Interactivo.`,"agentPermissionMode.autoLoopLocked":`Bloqueado en Bypass mientras el auto-loop está activo — cualquier otro modo detendría el bucle en las preguntas de permiso. AskUserQuestion sigue funcionando.`,"workspaceList.title":`Workspaces`,"workspaceList.a11y.groupToggle":`Grupo {group}, {count} workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Requiere atención`,"workspaceList.running":`En ejecución`,"workspaceList.idle":`Inactivo`,"workspaceList.archived":`Archivados`,"workspaceList.archivedToast":`«{name}» archivado`,"workspaceList.archivedUndo":`Deshacer`,"workspaceList.unarchiveFailed":`No se pudo desarchivar este workspace`,"workspaceList.noWorkspaces":`Aún no hay workspaces`,"workspaceList.loadFailed":`No se pudieron cargar tus workspaces`,"workspaceList.loadFailedHint":`Es un fallo de conexión, no una cuenta vacía.`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} en ejecución`,"workspaceList.deleteDialog.title":`¿Eliminar workspace?`,"workspaceList.deleteDialog.deleteLocal":`Eliminar rama local`,"workspaceList.deleteDialog.deleteRemote":`Eliminar rama remota`,"workspaceList.deleteDialog.warning":`Advertencia: esta acción es irreversible en el remoto.`,"workspaceList.deleteArchivedDialog.tooltip":`Eliminar todos los workspaces archivados`,"workspaceList.deleteArchivedDialog.title":`¿Eliminar todos los workspaces archivados?`,"workspaceList.deleteArchivedDialog.message":`Esto eliminará permanentemente los {count} workspaces archivados. Esta acción no se puede deshacer.`,"workspacePage.selectWorkspace":`Selecciona un workspace para comenzar`,"workspacePage.commandPalettePlaceholder":`Buscar comandos…`,"workspacePage.commandPaletteEmpty":`No hay comandos coincidentes`,"workspacePage.commandFocusChat":`Enfocar la entrada del chat`,"workspacePage.commandSearchHistory":`Buscar en el historial del workspace`,"workspacePage.commandTogglePanel":`Mostrar u ocultar el panel lateral`,"workspacePage.commandStartAgent":`Iniciar agente`,"workspacePage.commandStopAgent":`Detener agente`,"workspacePage.commandOpenSettings":`Abrir los ajustes`,"workspacePage.commandOpenCreate":`Crear un workspace`,"workspacePage.commandOpenSearch":`Búsqueda global`,"workspacePage.commandOpenHealth":`Página de salud`,"workspacePage.commandOpenChangelog":`Registro de cambios`,"workspacePage.commandGroupWorkspaces":`Ir a un workspace`,"workspacePage.commandPaletteHint":`Paleta de comandos`,"workspacePage.session":`Sesión #{n}`,"workspacePage.newSession":`+ Nueva sesión`,"workspacePage.renameSession":`Renombrar`,"workspacePage.renameSessionTitle":`Renombrar sesión`,"workspacePage.sessionNameLabel":`Nombre de sesión`,"workspacePage.sessionEndedNotice":`Esta sesión ha terminado. Crea una nueva sesión para continuar.`,"workspacePage.renameFailed":`Error al renombrar`,"workspacePage.copySessionId":`Copiar ID de sesión`,"workspacePage.deleteSession":`Eliminar sesión`,"workspacePage.deleteSessionTitle":`¿Eliminar sesión?`,"workspacePage.deleteSessionConfirm":`Esto elimina permanentemente esta sesión y su historial de conversación.`,"workspacePage.deleteSessionFailed":`No se pudo eliminar la sesión`,"workspacePage.noEngineSessionId":`Todavía no hay ID de sesión — el agente aún no ha iniciado esta sesión`,"workspacePage.createSessionFailed":`Error al crear la sesión`,"workspacePage.startFailed":`Error al iniciar`,"workspacePage.stopFailed":`Error al detener`,"workspacePage.interrupt":`Interrumpir`,"workspacePage.interrupted":`Agente interrumpido — esperando tu próximo mensaje`,"workspacePage.lastAgentEvent":`Último evento {when}`,"workspacePage.agentStopping":`Deteniendo…`,"workspacePage.agentNotRunning":`Ningún agente en ejecución — el estado está obsoleto`,"workspacePage.archivedBanner":`Workspace archivado — solo lectura`,"workspacePage.worktreePurgedBanner":`Worktree eliminado — historial conservado, restauración no disponible en esta versión`,"workspacePage.worktreePurgedTooltip":"La carpeta del worktree fue eliminada del disco para recuperar espacio. El historial de mensajes, sesiones y metadatos de la PR siguen consultables aquí, pero el directorio de trabajo ya no existe localmente. Una futura versión de Kōbō podrá reconstruir el worktree desde la PR mergeada — por ahora, recréalo manualmente con `gh pr checkout` o `git worktree add`.","workspacePage.pendingInitialPromptBanner":`Hay un prompt inicial pendiente — el agente nunca lo recibió (el script de setup falló o el workspace nunca se inició). Haz clic en Iniciar para enviarlo ahora.`,"workspacePage.unarchived":`Workspace desarchivado`,"workspacePage.unarchiveFailed":`Error al desarchivar`,"workspacePage.interruptFailed":`Error al interrumpir`,"workspacePage.interruptHint":`Interrumpir el turno actual sin terminar la sesión.`,"workspacePage.interruptTooltip":`Interrupción suave (como Escape) — detiene la herramienta actual pero mantiene la sesión activa`,"workspacePage.pendingNextRun":`Se aplicará en el próximo inicio`,"workspacePage.activeSessionModel":`En uso: {model}`,"workspacePage.activeSessionModelTooltip":`Modelo utilizado actualmente por la sesión seleccionada`,"workspacePage.switchEngine":`Cambiar motor`,"workspacePage.switchEngineHint":`Continuar este workspace con otro motor de agente`,"workspacePage.moreActions":`Más acciones`,"workspacePage.switchEngineTitle":`Cambiar motor de agente`,"workspacePage.switchEngineWarning":`El agente actual se detendrá y se iniciará una sesión nueva en el mismo worktree.`,"workspacePage.engineLabel":`Motor`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Traspaso para el nuevo motor`,"workspacePage.engineHandoffHint":`Revisa o edita el contexto que se enviará al nuevo agente.`,"workspacePage.confirmSwitchEngine":`Cambiar motor`,"workspacePage.switchEngineFailed":`No se pudo cambiar el motor`,"whip.dispatchFailed":`No se pudo enviar el mensaje del látigo`,"whip.phrase1":`¡Más rápido, tocard!`,"whip.phrase2":`¡Acelera el ritmo, tocard!`,"whip.phrase3":`¡Vuelve al trabajo, tocard!`,"whip.phrase4":`¡Demuéstrame velocidad, tocard!`,"whip.phrase5":`¡Menos pensar y más hacer, tocard!`,"search.title":`Búsqueda`,"search.tooltip":`Buscar en el historial de agentes`,"search.placeholder":`Buscar en todos los mensajes de agentes…`,"search.includeArchived":`Incluir workspaces archivados`,"search.loading":`Buscando…`,"search.noResults":`Sin resultados`,"search.error":`Búsqueda fallida: {message}`,"search.resultCount":`{n} resultado(s)`,"search.eventType.userMessage":`Tú`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Aún no hay actividad`,"activityFeed.emptyHint":`Inicia un workspace para ver la salida del agente aquí`,"activityFeed.initialPrompt":`Prompt inicial`,"activityFeed.you":`Tú`,"activityFeed.agent":`Agente`,"activityFeed.question":`Pregunta`,"activityFeed.goToPrevious":`Ir al mensaje anterior`,"activityFeed.scrollToBottom":`Ir al final`,"activityFeed.sendAnswers":`Enviar respuestas`,"agentBusy.banner":`El agente está ocupado`,"agentBusy.subagentsRunning":`1 sub-agente en ejecución | {n} sub-agentes en ejecución`,"agentBusy.viewSubagents":`Ver sub-agentes`,"agentBusy.pendingMessage":`Esperando — el agente está ocupado`,"terminal.title":`Terminal`,"terminal.open":`Abrir terminal`,"terminal.close":`Cerrar terminal`,"terminal.noWorkspace":`Seleccione un espacio de trabajo`,"terminal.noWorktree":`Worktree aún no creado`,"terminal.error":`Error del terminal`,"terminal.exited":`Terminal cerrado`,"terminal.disconnected":`Conexión perdida`,"terminal.reconnecting":`Reconectando… (intento {attempt} de {max})`,"terminal.reconnect":`Reconectar`,"chatInput.placeholder":`Mensaje... (/ para skills)`,"chatInput.fileSearchHint":`buscar un archivo`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Adjuntar imagen`,"chatInput.queueBanner":`Mensaje en cola — se enviará cuando el agente termine`,"chatInput.forceQueue":`Forzar envío`,"chatInput.searchHistory":`buscar`,"chatInput.commandPalette":`comandos`,"chatInput.shortcuts":`Atajos de teclado`,"chatInput.cancelQueue":`Cancelar cola`,"chatInput.autoLoopBanner":`Auto-loop activo — deténlo para enviar un mensaje`,"chatInput.awaitingUserBanner":`El agente espera tu respuesta arriba — responde mediante el panel de la pregunta`,"chatInput.autoLoopStop":`Detener`,"koboCommand.checkProgressDesc":`Verificar el progreso de las tareas y criterios de aceptación`,"chatInput.uploading":`Subiendo...`,"voice.title":`Transcripción de voz`,"voice.enabled":`Activar transcripción de voz local`,"voice.pttKey":`Tecla push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espacio`,"voice.language":`Idioma (auto o código)`,"voice.model":`Modelo activo`,"voice.commandPath":`Ruta del binario Whisper (opcional)`,"voice.ffmpegPath":`Ruta del binario ffmpeg (opcional)`,"voice.temperature":`Temperatura`,"voice.temperatureHint":`Más bajo = más determinista; más alto = más flexible pero potencialmente menos estable.`,"voice.initialPrompt":`Prompt inicial (opcional)`,"voice.initialPromptHint":`Contexto opcional para ayudar a Whisper con nombres, siglas o vocabulario técnico.`,"voice.translateToEnglish":`Traducir al inglés`,"voice.translateToEnglishHint":`Si se activa, el audio no inglés se traduce al inglés en lugar de transcribirse tal cual.`,"voice.suppressNst":`Suprimir tokens no vocales`,"voice.suppressNstHint":`Intenta reducir artefactos no vocales en la transcripción.`,"voice.installLink":`Instalar whisper.cpp`,"voice.installGuideTitle":`Guía de instalación`,"voice.installGuideIntro":`Instala whisper.cpp y ffmpeg, luego configura las rutas de binarios abajo si hace falta.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Después del build con CMake, el binario de Whisper suele estar en: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Después, configura “Ruta del binario Whisper” y “Ruta del binario ffmpeg” en esta sección (o déjalo vacío si están en PATH).`,"voice.noneModel":`Sin modelo activo`,"voice.notInstalled":`no instalado`,"voice.download":`Descargar`,"voice.delete":`Eliminar`,"voice.holdToTalk":`Mantén pulsado para hablar`,"voice.recording":`Grabando...`,"voice.transcribing":`Transcribiendo...`,"voice.notSupported":`La grabación de voz no es compatible con este navegador`,"voice.errorMicPermission":`Permiso de micrófono denegado`,"voice.errorTranscription":`Falló la transcripción de voz`,"voice.downloadFailed":`Falló la descarga del modelo`,"voice.deleteFailed":`Falló la eliminación del modelo`,"voice.errorDisabled":`La transcripción de voz está desactivada en ajustes`,"voice.errorModelMissing":`No hay un modelo de voz activo configurado`,"voice.errorModelNotInstalled":`El modelo de voz activo no está instalado`,"voice.errorAudioInvalid":`La captura de audio es inválida o vacía`,"voice.errorLanguageInvalid":`La configuración del idioma de voz es inválida`,"voice.errorRuntimeMissing":`El runtime de Whisper no está instalado o no está en el PATH`,"voice.maxDurationReached":`Se alcanzó la duración máxima de grabación`,"voice.runtimeReady":`Runtime listo: {command}`,"voice.runtimeMissing":`Falta runtime: {command}`,"voice.ffmpegReady":`ffmpeg listo`,"voice.ffmpegMissing":`falta ffmpeg`,"voice.sectionRuntime":`Estado del runtime`,"voice.sectionActivation":`Activación`,"voice.sectionModels":`Modelos Whisper`,"voice.sectionAdvanced":`Opciones avanzadas`,"voice.sectionBehavior":`Comportamiento de la transcripción`,"voice.sectionBinaries":`Rutas de los binarios`,"voice.downloadModels":`Descargar un modelo`,"voice.cancelFailed":`No se pudo cancelar la descarga`,"createPage.title":`Crear un workspace`,"createPage.subtitle":`Describe la misión, elige un proyecto y configura el agente.`,"createPage.sectionMission":`Misión`,"createPage.sectionMissionHint":`Proporciona al agente un objetivo claro y el contexto necesario.`,"createPage.workspaceNameLabel":`Nombre del workspace`,"createPage.descriptionLabel":`Descripción de la misión`,"createPage.sources":`Fuentes opcionales`,"createPage.sectionGit":`Proyecto Git`,"createPage.sectionGitHint":`Elige el repositorio, la rama de origen y el modo de worktree.`,"createPage.worktreeMode":`Modo de worktree`,"createPage.worktreeNew":`Nuevo worktree aislado`,"createPage.worktreeExisting":`Reutilizar un worktree existente`,"createPage.projectLabel":`Proyecto`,"createPage.sourceBranch":`Rama de origen`,"createPage.workingBranchPreview":`Vista previa de la rama de trabajo`,"createPage.branchNamePending":`nombre-del-workspace`,"createPage.sectionAgent":`Agente`,"createPage.sectionAgentHint":`Revisa los ajustes de ejecución o activa la automatización.`,"createPage.configureAgent":`Configurar el agente`,"createPage.advancedOptions":`Opciones avanzadas`,"createPage.keyboardHint":`Pulsa Ctrl/Cmd + Enter para crear el workspace.`,"createPage.createWorkspace":`Crear workspace`,"createPage.notionEnabled":`Notion activado`,"createPage.importNotion":`Importar desde Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`La URL debe empezar por https://www.notion.so/ o https://app.notion.com/`,"createPage.notionAutoExtract":`Las subtareas y criterios de aceptación se extraerán automáticamente.`,"createPage.notionPanelChoiceLabel":`Esta URL apunta a una subpágina (?p=). ¿Sobre cuál quieres trabajar?`,"createPage.notionPanelOption":`Subpágina (panel)`,"createPage.notionPanelOptionDesc":`La página que estabas viendo — recomendado`,"createPage.notionParentOption":`Página principal`,"createPage.notionParentOptionDesc":`La épica / base de datos a la que pertenece`,"createPage.importSentry":`Importar Sentry`,"createPage.sentryEnabled":`Sentry activado`,"createPage.sentryPlaceholder":`https://tu-org.sentry.io/issues/123456`,"createPage.sentryValidation":`La URL debe apuntar a una issue de Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`La issue de Sentry se importará automáticamente`,"createPage.sentryExtractHint":`Kobo extraerá la issue y la escribirá en .ai/thoughts/`,"createPage.workspaceName":`Nombre del workspace (por defecto el título de la página Notion)`,"createPage.workspaceNamePlaceholder":`Nombre del workspace...`,"createPage.instructions":`Instrucciones adicionales (opcional)...`,"createPage.instructionsPlaceholder":`Describe la tarea...`,"createPage.tasks":`Tareas ({count})`,"createPage.addTask":`Añadir una tarea...`,"createPage.acceptanceCriteria":`Criterios de aceptación ({count})`,"createPage.addCriterion":`Añadir un criterio...`,"createPage.projectPath":`Introduce la ruta del proyecto`,"createPage.branchType":`Tipo de rama`,"createPage.branch":`Rama`,"createPage.noBranches":`No se encontraron ramas`,"createPage.enterPath":`Introduce la ruta del proyecto`,"createPage.skipSetupScript":`Omitir script de setup`,"createPage.worktreePickerLabel":`Worktree existente`,"createPage.noOrphanWorktrees":`No hay worktrees huérfanos en este proyecto`,"createPage.pickWorktreeRequired":`Selecciona un worktree para adjuntar`,"createPage.notionExtractHint":`Las subtareas y criterios de aceptación se extraerán de la página Notion.`,"createPage.errorCreating":`Error al crear el workspace.`,"createPage.branchAdjusted":"La rama ya existía — se creó `{branch}` en su lugar. La carpeta worktree correspondiente usa el mismo sufijo.","createPage.localSourceFallback":`Workspace creado desde la rama local (origin inalcanzable) — la base puede estar desactualizada.`,"createPage.validationNotionUrl":`Introduce una URL de Notion válida (https://www.notion.so/... o https://app.notion.com/...).`,"createPage.validationDescription":`Describe la tarea.`,"createPage.validationName":`Indica un nombre para el workspace.`,"createPage.validationPath":`Introduce la ruta del proyecto.`,"createPage.validationBranch":`Selecciona una rama.`,"createPage.validationFocusHint":`El campo a corregir está resaltado abajo.`,"createPage.progress.validate":`Validando la solicitud…`,"createPage.progress.fetch-source-branch":`Obteniendo la rama de origen desde origin…`,"createPage.progress.inspect-worktree":`Inspeccionando el worktree existente…`,"createPage.progress.extract-notion":`Extrayendo la página de Notion…`,"createPage.progress.extract-sentry":`Extrayendo la incidencia de Sentry…`,"createPage.progress.create-record":`Creando el workspace…`,"createPage.progress.create-tasks":`Creando tareas y criterios de aceptación…`,"createPage.progress.create-worktree":`Creando el worktree de git…`,"createPage.progress.write-conventions":`Escribiendo las convenciones de git…`,"createPage.progress.write-context-files":`Escribiendo los archivos de contexto…`,"createPage.progress.build-prompt":`Construyendo el prompt inicial…`,"createPage.progress.setup-script":`Ejecutando tu script de instalación…`,"createPage.progress.start-agent":`Iniciando el agente…`,"createPage.progress.rollback":`Deshaciendo la creación fallida…`,"createPage.progress.done":`Listo`,"createPage.progress.step":`Paso {index} de {total}`,"createPage.errorAtStep":`La creación falló en el paso «{step}»: {message}`,"createPage.override.title":`Dos de tus opciones fueron sustituidas`,"createPage.override.setup-script-forced":`Script de instalación omitido: volver a ejecutarlo en un worktree que ya preparaste podría destruir su contenido.`,"createPage.override.permission-mode-downgraded":`Modo de permisos cambiado de Plan a Bypass: un bucle autónomo no puede ejecutarse en Plan, que bloquea herramientas y ediciones.`,"settings.title":`Ajustes`,"settings.language":`Idioma`,"settings.projectColor":`Color`,"settings.projectColorClear":`Borrar`,"settings.projectColorDefault":`Por defecto (gris)`,"settings.workspaceListSection":`Lista de workspaces`,"settings.flattenWorkspaceList":`Lista plana de workspaces`,"settings.flattenWorkspaceListHint":`Muestra todos los workspaces en una lista plana con una etiqueta de proyecto, en lugar de agruparlos por proyecto.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personalizado`,"settings.skillSuite.superpowersHint":`Workflow opinado TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Ambas suites se combinan — superpowers para la metodología (brainstorm / TDD / planes / revisión a nivel de principios), gstack para flujos concretos (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Framework de agentes de affaan-m — agents, skills, rules y hooks para planificar, probar, implementar, revisar y memorizar (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Las tres suites se combinan — superpowers para la metodología, gstack para flujos concretos, ECC para pases de revisión/implementación multiagente estructurados.`,"settings.skillSuite.customHint":`Compón los cinco prompts a continuación con los templates que elijas y edítalos libremente.`,"settings.skillSuite.reloadDefaults":`Restaurar predeterminados`,"settings.skillSuite.reloadDefaultsConfirm":`¿Reemplazar los cinco prompts personalizados con los valores agnósticos predeterminados?`,"settings.skillSuite.customPrompts":`Prompts personalizados`,"settings.skillSuite.agnostic":`Base agnóstica`,"settings.skillSuite.importPrompt":`Importar un template`,"settings.skillSuite.imported":`Template importado. Ahora puedes editarlo.`,"settings.skillSuite.importFailed":`No se pudo importar el template`,"settings.skillSuite.reviewTemplate":`Template de revisión`,"settings.skillSuite.autoLoopReviewGate":`Compuerta de revisión auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instrucción de la fase de brainstorming`,"settings.global":`Global`,"settings.projects":`Proyectos`,"settings.globalSettings":`Ajustes globales`,"settings.defaultModel":`Modelo por defecto`,"settings.defaultModelClaude":`Modelo por defecto (Claude Code)`,"settings.defaultModelCodex":`Modelo por defecto (OpenAI Codex)`,"settings.agentPermissions":`Permisos del agente`,"settings.skipPermissions":`Omitir solicitudes de permisos (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Advertencia: desactivar esto hará que todos los permisos de herramientas (Write, Edit, Bash...) se denieguen automáticamente en modo headless. El agente solo podrá leer.`,"settings.notifications":`Notificaciones`,"settings.browserNotifications":`Notificación del navegador cuando el agente termina`,"settings.audioNotifications":`Notificación sonora cuando el agente termina`,"settings.enableBrowserNotifications":`Activar las notificaciones del navegador`,"settings.testBrowserNotification":`Probar la notificación`,"settings.browserNotificationGranted":`Notificaciones del navegador permitidas`,"settings.browserNotificationDenied":`Notificaciones del navegador bloqueadas`,"settings.browserNotificationAsk":`Se requiere permiso del navegador`,"settings.browserNotificationUnsupported":`Notificaciones del navegador no disponibles`,"settings.browserNotificationPermissionNeeded":`Permite las notificaciones del navegador para enviar una prueba.`,"settings.browserNotificationTestTitle":`Prueba de notificación de Kōbō`,"settings.browserNotificationTestBody":`Las notificaciones del navegador funcionan.`,"settings.enableAudio":`Activar el audio`,"settings.notificationSound":`Sonido de notificación`,"settings.notificationSoundHint":`Se reproduce cuando el agente termina o solicita permiso.`,"settings.questionSound":`Sonido de preguntas`,"settings.questionSoundHint":`Se reproduce solo cuando el agente te hace una pregunta.`,"settings.workspaceCreatedSound":`Sonido de creación del espacio de trabajo`,"settings.workspaceCreatedSoundHint":`Se reproduce después de crear un espacio de trabajo.`,"settings.notificationSoundPreview":`Escuchar`,"settings.notificationVolume":`Volumen`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Errores del agente`,"settings.agentErrorSoundHint":`Se reproduce para cuotas, límites de tasa y errores del agente.`,"settings.notificationSoundBasic":`Notificación básica`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Trabajo`,"settings.notificationSoundTravailTermine":`Trabajo terminado`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Va a explotar`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR y CI`,"settings.soundGeneral":`Sonido general`,"settings.soundNone":`Sin sonido`,"settings.prCiFailedSound":`CI fallida`,"settings.prCiRecoveredSound":`CI recuperada`,"settings.prChangesRequestedSound":`Cambios solicitados`,"settings.prApprovedSound":`PR aprobada`,"settings.prMergeConflictSound":`Conflicto de merge`,"settings.prReadyToMergeSound":`Lista para merge`,"settings.prMergedSound":`PR fusionada`,"settings.prCiFailedSoundHint":`Se reproduce cuando la CI pasa a estado fallido.`,"settings.prCiRecoveredSoundHint":`Se reproduce cuando la CI se recupera de un fallo.`,"settings.prChangesRequestedSoundHint":`Se reproduce cuando una revisión solicita cambios.`,"settings.prApprovedSoundHint":`Se reproduce cuando se aprueba la pull request.`,"settings.prMergeConflictSoundHint":`Se reproduce cuando se detecta un conflicto de merge.`,"settings.prReadyToMergeSoundHint":`Se reproduce cuando la pull request está lista para merge.`,"settings.prMergedSoundHint":`Se reproduce cuando se fusiona la pull request.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Modo de permisos por defecto`,"settings.defaultPermissionModeClaude":`Modo de permisos por defecto (Claude Code)`,"settings.defaultPermissionModeCodex":`Modo de permisos por defecto (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modo aplicado al crear un workspace. Plan = solo lectura, Bypass = sin avisos, Estricto = auto-aceptar ediciones con allow-list, Interactivo = preguntar antes de cada herramienta.`,"settings.activityFeed":`Feed de actividad`,"settings.showThinkingBlocks":`Mostrar bloques de razonamiento de los agentes`,"settings.whipSettings":`Látigo`,"settings.whipSettingsHint":`Configura el atajo y el volumen opcionales del látigo.`,"settings.whipEnabled":`Activar el látigo`,"settings.whipEnabledHint":`Muestra el látigo interactivo en los workspaces activos compatibles.`,"settings.whipVolume":`Volumen del látigo`,"settings.whipVolumeMasterAudioDisabled":`El audio principal está desactivado. Activa las notificaciones de audio para ajustar el volumen del látigo; el valor guardado se conserva.`,"whip.overlayLabel":`Látigo interactivo`,"whip.overlayInstructions":`Mueve el puntero para controlar el látigo. Pulsa Intro o Espacio para hacerlo chasquear. Pulsa Escape para cerrar.`,"settings.whipShortcut":`Atajo del látigo`,"settings.whipShortcutHint":`Haz clic y luego pulsa el atajo que quieras usar.`,"settings.whipShortcutRecording":`Pulsa un atajo…`,"settings.whipShortcutButtonLabel":`Atajo del látigo: {shortcut}`,"settings.whipShortcutRecordingLabel":`Grabando el atajo del látigo. Pulsa un atajo…`,"settings.whipShortcutReset":`Restablecer atajo`,"settings.whipShortcutReserved":`Este atajo está reservado por el navegador.`,"settings.testIntegration":`Probar conexión`,"pwa.offline":`No tienes conexión. El chat y los agentes necesitan el servidor Kōbō.`,"pwa.reconnecting":`Reconectando al servidor Kōbō…`,"pwa.installReady":`Instala Kōbō como aplicación.`,"pwa.install":`Instalar`,"pwa.ignore":`Ignorar`,"pwa.updateReady":`Hay una actualización de Kōbō disponible.`,"pwa.reload":`Recargar`,"chat.searchWorkspaceHistory":`Buscar en el historial del workspace`,"chat.historySearch.user":`Tú`,"chat.historySearch.agent":`Agente`,"chat.openInGitDiff":`Abrir en el diff de Git`,"timeline.title":`Cronología de sesiones`,"timeline.export":`Exportar diagnóstico`,"timeline.unnamed":`Sesión de agente`,"timeline.tools":`{count} herramientas`,"timeline.errors":`{count} errores`,"settings.verboseMessages":`Mostrar mensajes detallados del sistema (task_progress, task_started)`,"settings.availableVariables":`Variables disponibles en las plantillas de prompt`,"settings.prPromptTemplate":`Plantilla de prompt PR`,"settings.prPromptPlaceholder":`Instrucciones para el agente al crear PRs en GitHub...`,"settings.prPromptHint":`Usa las variables listadas arriba (sintaxis de dobles llaves).`,"settings.reviewPromptTemplate":`Plantilla de prompt de revisión`,"settings.reviewPromptPlaceholder":`Instrucciones para el agente al revisar los cambios de la rama...`,"settings.ciFixPromptTemplate":`Plantilla de prompt «Reparar CI»`,"settings.ciFixPromptHint":`Se envía al agente cuando un workspace tiene la CI fallando. Variables (sintaxis con dobles llaves): pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Pedir al agente que diagnostique y arregle los jobs de CI que fallan...`,"settings.finalizationPromptTemplate":`Prompt de finalización del auto-loop`,"settings.finalizationPromptHint":`Prompt por defecto para la última iteración del auto-loop (controles de calidad finales). Se usa cuando un proyecto deja vacío su propio prompt de finalización.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Prompt inicial de Notion`,"settings.notionInitialPrompt.help":`Se añade al prompt de creación del workspace cuando el workspace tiene un ticket de Notion. Variables: {variables}.`,"settings.notionInitialPrompt.project":`Prompt inicial de Notion (anulación)`,"settings.sentryInitialPrompt":`Prompt inicial de Sentry`,"settings.sentryInitialPrompt.help":`Se añade al prompt de creación del workspace cuando el workspace tiene una issue de Sentry. Variables: {variables}.`,"settings.sentryInitialPrompt.project":`Prompt inicial de Sentry (anulación)`,"settings.initialPrompt.inheritHint":`Dejar en blanco para heredar. Escribe un carácter en blanco para desactivar la inyección a este nivel.`,"settings.resetToDefault":`Restablecer`,"settings.resetFailed":`No se pudo cargar el valor por defecto`,"settings.sentryIntegration":`Integración Sentry`,"settings.var.prNumber":`Número de PR (ej: 42)`,"settings.var.prUrl":`URL completa de la PR creada`,"settings.var.branchName":`Nombre de la rama de trabajo`,"settings.var.sourceBranch":`Rama fuente a la que apunta la PR`,"settings.var.workspaceName":`Nombre del workspace`,"settings.var.projectName":`Último segmento de la ruta del proyecto`,"settings.var.notionUrl":`URL de Notion si está definida, vacía en caso contrario`,"settings.var.commits":`Lista de commits entre source y head`,"settings.var.diffStats":`Resumen shortstat de Git (archivos, inserciones, eliminaciones)`,"settings.var.tasks":`Tareas regulares como lista de verificación`,"settings.var.acceptanceCriteria":`Criterios de aceptación como lista de verificación`,"settings.gitConventions":`Convenciones Git (global)`,"settings.gitConventionsPlaceholder":`# Convenciones Git...`,"settings.gitConventionsHint":`Estas convenciones se escriben en .ai/.git-conventions.md en cada nuevo workspace y deben ser seguidas por el agente antes de cualquier operación Git. Se anulan con convenciones por proyecto si están definidas.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de limpieza`,"settings.archiveScript":`Script de archivado`,"settings.archiveScriptHint":`Script de shell ejecutado en el servidor en el worktree cuando se archiva un workspace. Dejar vacío para desactivar.`,"settings.archiveScriptPlaceholder":`p. ej. limpiar contenedores, liberar espacio en disco…`,"settings.changeSourceBranchScript":`Script para cambiar la rama de origen`,"settings.changeSourceBranchScript.help":`Reemplaza el cherry-pick integrado cuando no está vacío. El script gestiona git, base de la PR, force-push y conflictos; Kōbō solo rechaza si el agente está corriendo y actualiza los metadatos de la rama de origen en exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nueva rama de origen elegida en el diálogo
|
|
34
|
+
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Take ownership (simpler, loses the "created by root in container" trace but rarely matters):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Tip: you can run these commands directly on the worktrees root (e.g. `~/.worktrees/`) to cover all existing AND future workspaces at once. Once done, Kōbō purge will work without permission errors.","contextMenu.runSetup":`Run setup script`,"contextMenu.exportEvents":`Export events (CSV)`,"contextMenu.dismissChangesRequested":`Mark 'Changes requested' as seen`,"contextMenu.dismissCiFailure":`Mark 'CI failure' as seen`,"contextMenu.restoreChangesRequested":`Mark 'Changes requested' as unseen`,"contextMenu.restoreCiFailure":`Mark 'CI failure' as unseen`,"contextMenu.exportingEvents":`Preparing export…`,"contextMenu.exportEventsError":`Event export failed`,"contextMenu.openNotion":`Open in Notion`,"contextMenu.openSentry":`Open in Sentry`,"contextMenu.openPr":`Open PR`,"contextMenu.ignorePrWatch":`Ignore PR checks`,"contextMenu.resumePrWatch":`Resume PR checks`,"contextMenu.prWatchToggleFailed":`Failed to update PR checks setting`,"workspace.favorite":`Mark as favorite`,"workspace.unfavorite":`Remove from favorites`,"workspace.showFavoritesOnly":`Show favorites only`,"workspace.searchArchivedToggle":`Also search archived workspaces`,"workspace.descriptionPlaceholder":`Add a short description`,"workspace.descriptionDialogHint":`Plain text, 200 characters max. Leave empty to clear.`,"workspace.descriptionTooLong":`Description must be 200 characters or fewer.`,"workspace.descriptionSaveFailed":`Failed to save description.`,"workspace.agentDescriptionTooltip":`Live status maintained by the agent`,"mcp.tool.setWorkspaceDescription":`Set the workspace short description (≤ 200 chars).`,"tags.manage":`Manage tags`,"tags.manageTitle":`Manage workspace tags`,"tags.noTagsDefined":`No tags defined. Add some in Settings > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) are no longer in the global catalog. Uncheck to remove them.`,"settings.tagsTitle":`Workspace tags`,"settings.tagsHint":`Define the tags you can assign to workspaces. Type to add, click the cross to remove.`,"settings.tagsLabel":`Available tags`,"settings.branchPrefixesTitle":`Branch prefixes`,"settings.branchPrefixesHint":`Manage the git branch prefixes available on the workspace creation page. The first one is pre-selected by default.`,"settings.branchPrefixesEmpty":`No branch prefix defined. Add at least one below.`,"settings.branchPrefixesAddLabel":`New prefix`,"settings.branchPrefixesEditHint":`Click to rename`,"settings.branchPrefixesMoveUp":`Move up`,"settings.branchPrefixesMoveDown":`Move down`,"settings.worktreesTitle":`Git worktrees`,"settings.worktreesHint":`Choose where new workspace worktrees are created. Relative paths are project-relative; Linux/macOS and Windows absolute paths, $HOME, ~, and %USERPROFILE% are supported.`,"settings.worktreesPathLabel":`Worktrees path`,"settings.worktreesPathRequired":`Worktrees path is required.`,"settings.worktreesPrefixByProject":`Prefix worktrees by project name`,"settings.worktreesPrefixByProjectHint":`Place each worktree under a sub-directory named after the project, to avoid collisions when multiple projects share the same worktrees root.`,"settings.shareTitle":`Share configuration`,"settings.shareHint":`Export your settings, templates and tags as a JSON bundle. MCP API keys are stripped from exports for security.`,"settings.exportConfig":`Export`,"settings.importConfig":`Import`,"settings.exportSuccess":`Configuration exported`,"settings.importSuccess":`Configuration imported`,"settings.importConfirmTitle":`Import configuration`,"settings.importConfirmMessage":`This will replace your current settings, templates and tags. Your MCP keys are preserved. Continue?`,"settings.network.title":`Network access`,"settings.network.hint":`Control Kōbō from another device on your trusted LAN. Off = localhost only. On = reachable on your network, protected by a token. Restart Kōbō after toggling.`,"settings.network.enable":`Enable network access`,"settings.network.behindProxy":`Behind a reverse proxy`,"settings.network.behindProxyHint":`Kōbō can no longer tell your own machine apart from a proxied request — even localhost will need the token from now on. Enable this only if a reverse proxy (Traefik, nginx, Caddy…) sits in front of Kōbō.`,"settings.network.restartRequired":`Restart Kōbō to apply the new bind address.`,"settings.network.token":`Access token`,"settings.network.copy":`Copy`,"settings.network.copied":`Copied`,"settings.network.regenerate":`Regenerate`,"settings.network.regenerateConfirm":`Regenerate the token? Connected devices will need the new token.`,"settings.network.urls":`LAN URLs`,"settings.network.scan":`Scan to connect`,"settings.network.noUrls":`No LAN address detected.`,"settings.network.loadFailed":`Failed to load network access settings.`,"settings.network.updateFailed":`Failed to update network access settings.`,"settings.unsavedChanges.title":`Unsaved changes`,"settings.unsavedChanges.message":`This project has unsaved changes. Switching projects will discard them.`,"settings.unsavedChanges.discard":`Discard and switch`,"settings.unsavedChanges.cancel":`Cancel`,"settings.loadFailed":`Settings could not be loaded`,"settings.loadFailedHint":`Saving is disabled: the form is showing default values, and writing them would overwrite your real configuration.`,"health.title":`Health`,"health.tooltip":`System health`,"changelog.title":`Changelog`,"changelog.tooltip":`What's new in Kōbō`,"changelog.empty":`No changelog available.`,"changelog.current":`current`,"changelog.currentVersion":`Current version: v{version}`,"health.envTitle":`Environment`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Database`,"health.dbPath":`Path`,"health.dbSize":`Size`,"health.schemaVersion":`Schema version`,"health.settingsSchemaVersion":`Settings schema`,"health.runtimesTitle":`Agent runtimes`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude not on PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`codex binary not resolvable`,"health.forgeCliTitle":`Forge CLI (gh / glab)`,"health.forgeCliMissing":`Neither gh nor glab found — pull requests and CI watching are unavailable`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} total, {archived} archived`,"health.worktreesMissing":`{count} worktree(s) missing on disk`,"health.sessionsTitle":`Agent sessions`,"health.sessionsOrphaned":`{n} orphaned running session(s)`,"health.integrationsTitle":`Integrations`,"health.integrationConfigured":`configured`,"health.integrationMissing":`not configured`,"health.integrationDisabled":`disabled`,"settings.integrationEnabled":`Enable integration`,"health.activeTitle":`Active state`,"health.activeQuotaBackoffs":`Pending quota backoffs`,"health.activeWakeups":`Scheduled wakeups`,"health.activeAutoLoop":`Auto-loop running`,"health.activeAgentSessions":`Live agent sessions`,"health.activeDevServers":`Running dev servers`,"health.noneActive":`None.`,"health.quotaResumeAt":`resumes at {time}`,"health.wakeupAt":`wakes at {time}`,"health.startedAgo":`started {time} ago`,"health.autoLoopReady":`ready, iterating`,"health.autoLoopGrooming":`grooming in progress`,"session.started":`Session started`,"session.ended":`Session ended`,"session.compacted":`Context compacted`,"session.endedCompleted":`Turn finished — send a message to continue`,"session.endedKilled":`Session stopped`,"session.endedError":`Session ended on an error`,"session.endedWatchdog":`Session force-closed after a period of inactivity`,"tool.running":`Running...`,"activity.raw_lines":`Raw output lines ({n})`,"activity.loading_older":`Loading older messages…`,"activity.compacting":`Compacting context…`,"activity.prev_user_message":`Previous user message`,"activity.scroll_to_bottom":`Scroll to bottom`,"activity.empty":`Nothing yet`,"activity.emptyHint":`The agent output will show up here as soon as a session starts.`,"activity.a11y.region":`Agent activity announcements`,"activity.a11y.agentSaid":`Agent: {text}`,"activity.a11y.toolStarted":`Tool {name} started`,"activity.a11y.toolFinished":`Tool {name} finished`,"activity.a11y.toolFailed":`Tool {name} failed`,"chat.systemPrompt":`System prompt`,"chat.agent":`Agent`,"chat.cleanupScript":`Cleanup script`,"chat.archiveScript":`Archive script`,"chat.setupScript":`Setup script`,"chat.scriptDone":`Done`,"chat.scriptComplete":`[{phase}] Complete`,"chat.scriptError":`[{phase}] Error: {message}`,"chat.unknownError":`unknown`,"chat.you":`You`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Last updated at {time}`,"chat.scrollToTurnTop":`Scroll to top of this message`,"migration.backing_up":`Backing up the database…`,"migration.running":`Migrating agent data — {processed}/{total}`,"migration.error":`Migration failed`,"migration.backup_location":`A backup was saved at {path}. Restart Kōbō to retry.`,"migration.retry":`Restart Kōbō to retry.`,"engine.select":`Engine`,"engine.model":`Model`,"engine.effort":`Reasoning effort`,"wakeup.scheduledIn":`Next wakeup in {n}s`,"wakeup.scheduledAt":`Next wakeup at {time}`,"wakeup.firing":`Waking up...`,"wakeup.reason":`Reason: {reason}`,"wakeup.cancel":`Cancel this wakeup`,"wakeup.pendingIndicator":`Wakeup scheduled`,"cron.pendingIndicator":`{n} cron(s) scheduled`,"schedule.tabLabel":`Schedule`,"schedule.panelTitle":`Automation`,"schedule.panelDescription":`Wake this workspace later or run instructions on a schedule.`,"schedule.activeTitle":`Active schedules`,"schedule.emptyTitle":`Nothing scheduled`,"schedule.emptyDescription":`Create a wakeup or recurring task below.`,"schedule.cancelWakeup":`Cancel this wakeup`,"schedule.cancelCron":`Delete this recurring task`,"schedule.createTitle":`Create a schedule`,"schedule.createDescription":`Choose when and how the agent should run.`,"schedule.typeWakeup":`One-time wakeup`,"schedule.typeRecurring":`Recurring task`,"schedule.wakeupDescription":`Run the prompt once after a delay.`,"schedule.cronDescription":`Run the prompt repeatedly on a fixed schedule.`,"schedule.promptHint":`Instructions that will be sent to the agent`,"schedule.frequencyTitle":`Frequency`,"schedule.advancedDescription":`Use a raw cron expression`,"schedule.cronExpressionLabel":`Cron expression`,"schedule.sessionModeTitle":`Execution session`,"schedule.modeResume":`Resume session`,"schedule.oneShotHint":`Remove this schedule after its first run.`,"schedule.wakeupTitle":`Wakeup pending`,"schedule.cronsTitle":`Recurring schedules`,"schedule.noWakeup":`No wakeup scheduled`,"schedule.noCrons":`No cron scheduled`,"schedule.nextFireAt":`next at {time}`,"schedule.lastFiredAt":`last fired {time} ago`,"schedule.addCronTitle":`Add a recurring task`,"schedule.addWakeupTitle":`Schedule a wakeup`,"schedule.every":`Every`,"schedule.unitMinutes":`minutes`,"schedule.unitHours":`hours`,"schedule.unitDays":`days`,"schedule.daysDriftWarning":`The interval may shrink to 1 day at the end of the month (cron limitation).`,"schedule.advancedExpression":`Advanced expression (optional)`,"schedule.advancedHint":`Raw cron (e.g. */15 * * * *) or {'@'}hourly/{'@'}daily — overrides the picker when set.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Label (optional)`,"schedule.delayMinutes":`Delay (minutes)`,"schedule.modeFresh":`New session`,"schedule.oneShot":`Run only once`,"schedule.addCronBtn":`Add cron`,"schedule.addWakeupBtn":`Schedule wakeup`,"schedule.cronCreated":`Recurring task added`,"schedule.wakeupCreated":`Wakeup scheduled`,"askUserQuestion.title":`The agent is asking a question`,"askUserQuestion.submit":`Submit answer`,"askUserQuestion.multiSelectHint":`Select one or more options`,"askUserQuestion.otherOption":`Other`,"askUserQuestion.otherOptionHint":`specify in your next chat message`,"askUserQuestion.freeFormLabel":`Specify your answer`,"askUserQuestion.freeFormHint":`This answer will be sent directly to the agent.`,"askUserQuestion.noPending":`No pending question`,"askUserQuestion.next":`Next`,"askUserQuestion.previous":`Previous`,"askUserQuestion.cancel":`Cancel`,"askUserQuestion.cancelTooltip":`Skip this question — the agent will proceed without an answer`,"askUserQuestion.collapse":`Collapse the question panel`,"askUserQuestion.expand":`Expand the question panel`,"permissionRequest.title":`The agent wants to use a tool`,"permissionRequest.allow":`Allow`,"permissionRequest.allowOnce":`Allow once`,"permissionRequest.allowTurn":`Allow this turn`,"permissionRequest.allowOperation":`Always this operation`,"permissionRequest.allowTool":`Always this tool`,"permissionRequest.deny":`Deny`,"permissionRequest.tool":`Tool`,"permissionRequest.input":`Input`,"permissionRequest.rawInput":`Technical details`,"permissionRequest.collapse":`Collapse the permission panel`,"permissionRequest.expand":`Expand the permission panel`,"permissionRequest.denied":`denied by user`,"workspaceStatus.created":`created`,"workspaceStatus.extracting":`extracting`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.executing":`running`,"workspaceStatus.awaitingUser":`awaiting your answer`,"workspaceStatus.completed":`completed`,"workspaceStatus.idle":`idle`,"workspaceStatus.error":`error`,"workspaceStatus.quota":`quota reached`,"workspaceStatus.retrying":`auto-resuming`,"workspaceList.prOpen":`#{n} — Pull request open`,"workspaceList.prWatchDisabledIndicator":`PR checks ignored for this workspace`,"workspaceList.prChangesRequested":`#{n} — Changes requested`,"workspaceList.attentionCiFailed":`CI failed`,"workspaceList.attentionChangesRequested":`Changes requested`,"workspaceList.attentionReadyToMerge":`Ready to merge`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Start auto-loop`,"autoLoop.prepare":`Prepare for auto-loop`,"autoLoop.reprepare":`Re-prepare for auto-loop`,"autoLoop.reprepareTooltip":`Re-run the grooming pass to add or refresh tasks before resuming the loop`,"autoLoop.prepareBusy":`Wait for the agent to finish before preparing`,"autoLoop.forceReady":`I know what I'm doing — skip grooming`,"autoLoop.forceReadyConfirm":`Skip grooming and mark auto-loop ready? This may cause the loop to stall if tasks aren't atomic.`,"autoLoop.stop":`Stop auto-loop`,"autoLoop.notReady":`Run 'Prepare for auto-loop' first`,"autoLoop.noTasks":`Add tasks first`,"autoLoop.progress":`Auto-loop · {done}/{total} tasks`,"autoLoop.preparing":`Auto-loop · preparing`,"autoLoop.preparingTooltip":`Grooming in progress — the agent is creating / reviewing tasks. The loop will start running once it calls mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop running`,"autoLoop.startInMode":`Start in auto-loop mode`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Model used only for the initial brainstorming session — every task after that uses the model picked above`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Reasoning level used only for the initial brainstorming session`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Model used for every auto-loop task after the initial brainstorming session`,"autoLoop.sessionMode.perTask":`New session per task`,"autoLoop.sessionMode.label":`Session:`,"autoLoop.sessionMode.perTaskTooltip":`Each task starts a fresh Claude Code session with no memory of prior tasks`,"autoLoop.sessionMode.continuous":`Continuous session`,"autoLoop.sessionMode.continuousTooltip":`All tasks run in the same session — the agent keeps full context, but the session grows longer over time`,"koboCommand.prepAutoloopDesc":`Prepare tasks for auto-loop mode (groom for atomicity)`,"staleSessionBanner.title":`Auto-loop running`,"staleSessionBanner.message":`You're viewing an older session — the agent is currently working in the latest one.`,"staleSessionBanner.staleTitle":`Older session`,"staleSessionBanner.staleMessage":`You're viewing an older session — messages you send go to this session, not the latest one.`,"staleSessionBanner.switchToCurrent":`Switch to current`,"network.login.title":`Network access`,"network.login.description":`This Kōbō requires a token to be controlled from the network. Paste the token shown in Settings on the host machine.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Paste your token`,"network.login.connect":`Connect`,"network.login.invalid":`Invalid token`,"network.login.serverError":`Server error — try again.`,"network.login.unreachable":`Kōbō is unreachable — check your connection.`,"layout.toggleWorkspaces":`Toggle workspaces panel`,"layout.togglePanel":`Toggle side panel`,"unsaved.title":`Leave without saving?`,"unsaved.message":`You have unsaved changes. Leaving this page discards them.`,"unsaved.leave":`Leave`,"unsaved.stay":`Stay`,"prCheckout.staleRetriesExhausted":`The repository state kept changing while we tried to apply your choices. Close this dialog and try again from the pull request picker.`,"prPicker.title":`Import from a pull request`,"prPicker.filterAll":`All`,"prPicker.filterMine":`Mine`,"prPicker.filterReviewRequested":`Review requested`,"prPicker.searchPlaceholder":`Search pull requests…`,"prPicker.loadMore":`Load more`,"prPicker.empty":`No open pull request matches.`,"prPicker.forkNotSupported":`This PR comes from a fork; Kōbō cannot check it out.`,"prPicker.loadFailed":`Failed to load pull requests.`,"prPicker.badge.workspaceExists":`Already open in Kōbō`,"prPicker.badge.worktreePresent":`Worktree present`,"prPicker.badge.localBranch":`Local branch`,"prPicker.badge.new":`New`,"prPicker.badge.draft":`Draft`,"prCheckout.title":`Prepare the worktree`,"prCheckout.apply":`Apply`,"prCheckout.cancel":`Cancel`,"prCheckout.retry":`Retry`,"prCheckout.diagnoseFailed":`Failed to diagnose the pull request.`,"prCheckout.resolveFailed":`Failed to resolve the pull request checkout.`,"prCheckout.path.required":`Enter a worktree path that does not already exist.`,"prCheckout.workspace.restoreNotAvailable":"Restoring a purged workspace isn't available yet from here. Recreate its worktree folder on disk (e.g. `git worktree add`) and Kōbō will reattach it automatically within about 30 seconds.","prCheckout.staleReloaded":`The repository changed; the diagnosis has been refreshed.`,"prCheckout.step.blocked":`Cannot continue`,"prCheckout.step.path":`Worktree location`,"prCheckout.step.workspace":`Existing workspace`,"prCheckout.step.worktree":`Existing worktree`,"prCheckout.step.operation":`Git operation in progress`,"prCheckout.step.changes":`Uncommitted changes`,"prCheckout.step.divergence":`Local branch vs origin`,"prCheckout.workspace.activeHint":`A workspace named "{name}" already tracks this branch.`,"prCheckout.workspace.open":`Open that workspace`,"prCheckout.workspace.continue":`Continue on another path`,"prCheckout.workspace.unarchive":`Unarchive and open it`,"prCheckout.workspace.restore":`Recreate its worktree`,"prCheckout.worktree.orphanHint":`A worktree already sits on this branch at {path}.`,"prCheckout.worktree.attach":`Attach it`,"prCheckout.worktree.createElsewhere":`Create another one elsewhere`,"prCheckout.operation.hint":`A {operation} is in progress in that worktree.`,"prCheckout.operation.abort":`Abort it`,"prCheckout.operation.cancel":`Leave it alone and stop here`,"prCheckout.changes.hint":`{modified} modified, {staged} staged, {untracked} untracked.`,"prCheckout.changes.stash":`Stash them`,"prCheckout.changes.commit":`Commit them`,"prCheckout.changes.discard":`Discard them (kept as a labelled stash)`,"prCheckout.changes.keep":`Keep them as they are`,"prCheckout.divergence.behindHint":`Your branch is {behind} commit(s) behind origin.`,"prCheckout.divergence.aheadHint":`Your branch has {ahead} unpushed commit(s).`,"prCheckout.divergence.divergedHint":`{ahead} ahead, {behind} behind origin.`,"prCheckout.divergence.fastForward":`Fast-forward to origin`,"prCheckout.divergence.rebase":`Rebase onto origin`,"prCheckout.divergence.resetHard":`Reset to origin (a backup branch is created first)`,"prCheckout.divergence.keep":`Keep the local state`,"prCheckout.blocked.forgeUnavailable":`The forge CLI is missing or not authenticated.`,"prCheckout.blocked.forkPr":`This PR comes from a fork; Kōbō cannot check it out.`,"prCheckout.blocked.headBranchDeleted":`The branch no longer exists on the remote.`,"prCheckout.blocked.indexLock":`Another git process is running (index.lock is present).`,"prCheckout.blocked.pathOccupied":`{path} already exists and is not a worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} is a worktree on another branch ({branch}).`,"prCheckout.blocked.noCommonAncestor":`A local branch named {branch} exists with unrelated history.`},Mr={"model.tooltip":`Modelo usado por el agente en este workspace`,"reasoning.tooltip":`Nivel de razonamiento usado por el agente en este workspace`,"thinking.label":`Razonamiento`,"thinking.noDetails":`El agente está razonando…`,"common.save":`Guardar`,"common.cancel":`Cancelar`,"common.retry":`Reintentar`,"common.delete":`Eliminar`,"common.close":`Cerrar`,"common.dismiss":`Descartar`,"common.details":`Detalles`,"common.ok":`OK`,"whatsNew.title":`Novedades`,"common.loading":`Cargando...`,"common.search":`Buscar...`,"common.refresh":`Actualizar`,"common.copy":`Copiar`,"common.copied":`Copiado al portapapeles`,"common.copyFailed":`Error al copiar`,"common.add":`Añadir`,"folderPicker.title":`Elegir una carpeta`,"folderPicker.parent":`Carpeta superior`,"folderPicker.empty":`Sin subcarpetas`,"folderPicker.select":`Elegir esta carpeta`,"common.start":`Iniciar`,"common.stop":`Detener`,"common.archive":`Archivar`,"common.unarchive":`Desarchivar`,"common.selectWorkspace":`Selecciona un workspace`,"common.noResults":`Sin resultados para "{query}"`,"common.send":`enviar`,"common.newLine":`nueva línea`,"common.history":`historial`,"common.justNow":`ahora mismo`,"common.minutesAgo":`hace {count}m`,"common.hoursAgo":`hace {count}h`,"common.daysAgo":`hace {count}d`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`El modelo más capaz — sucesor de Opus 4.8, contexto 1M, adaptive thinking`,"model.mythos5Description":`Fable 5 sin clasificadores de seguridad — acceso limitado (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude elige el modelo óptimo`,"model.opus5Description":`Para código agéntico complejo y trabajo empresarial, contexto 1M`,"model.opus48Description":`Opus más capaz — coding agéntico long-horizon, contexto 1M por defecto, esfuerzo high por defecto`,"model.opus47ClassicDescription":`Último Opus, el más capaz`,"model.opus471mDescription":`Último Opus, contexto 1M`,"model.opusClassicDescription":`El más potente`,"model.opus1mDescription":`El más potente, contexto 1M`,"model.sonnet5Description":`La mejor combinación de velocidad e inteligencia, contexto 1M`,"model.sonnetClassicDescription":`Equilibrado`,"model.sonnet1mDescription":`Equilibrado, contexto 1M`,"model.haikuDescription":`El más rápido`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`El modelo de codificación agéntica más avanzado (requiere autenticación ChatGPT)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Modelo de codificación agéntica equilibrado para el día a día (requiere autenticación ChatGPT)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Modelo de codificación agéntica rápido y económico (requiere autenticación ChatGPT)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recomendado para código complejo (requiere autenticación ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Alternativa por defecto — razonamiento sólido, compatible con clave API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rápido y eficiente — ideal para tareas reactivas y subagentes`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimizado para trabajo profesional y agentes de larga duración`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modelo especializado en código para ingeniería de software compleja`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`ninguno`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Deja que el motor decida`,"reasoning.minimalDescription":`Razonamiento más rápido y superficial`,"reasoning.noneDescription":`Sin razonamiento adicional`,"reasoning.lowDescription":`Más rápido, menos profundidad`,"reasoning.mediumDescription":`Equilibrado`,"reasoning.highDescription":`Más profundidad`,"reasoning.xhighDescription":`Profundidad extendida, tareas largas`,"reasoning.maxDescription":`Profundidad máxima`,"agentPermissionMode.label":`Modo de permisos`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Aceptar ediciones`,"agentPermissionMode.interactive":`Interactivo`,"agentPermissionMode.tooltip":`Cómo gestiona el agente los permisos de las herramientas. Plan: solo lectura, sin escrituras. Bypass: omitir todas las preguntas. Estricto: auto-aceptar ediciones de archivos, respetar allow/deny para el resto. Interactivo: preguntar al usuario antes de cada herramienta mediante el panel de permisos.`,"agentPermissionMode.autoLoopOverride":`El auto-loop fuerza un modo distinto a Plan — Plan bloquea las herramientas MCP y las ediciones que el bucle necesita. Elige Bypass, Estricto o Interactivo.`,"agentPermissionMode.autoLoopLocked":`Bloqueado en Bypass mientras el auto-loop está activo — cualquier otro modo detendría el bucle en las preguntas de permiso. AskUserQuestion sigue funcionando.`,"workspaceList.title":`Workspaces`,"workspaceList.a11y.groupToggle":`Grupo {group}, {count} workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Requiere atención`,"workspaceList.running":`En ejecución`,"workspaceList.idle":`Inactivo`,"workspaceList.archived":`Archivados`,"workspaceList.archivedToast":`«{name}» archivado`,"workspaceList.archivedUndo":`Deshacer`,"workspaceList.unarchiveFailed":`No se pudo desarchivar este workspace`,"workspaceList.noWorkspaces":`Aún no hay workspaces`,"workspaceList.loadFailed":`No se pudieron cargar tus workspaces`,"workspaceList.loadFailedHint":`Es un fallo de conexión, no una cuenta vacía.`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} en ejecución`,"workspaceList.deleteDialog.title":`¿Eliminar workspace?`,"workspaceList.deleteDialog.deleteLocal":`Eliminar rama local`,"workspaceList.deleteDialog.deleteRemote":`Eliminar rama remota`,"workspaceList.deleteDialog.warning":`Advertencia: esta acción es irreversible en el remoto.`,"workspaceList.deleteArchivedDialog.tooltip":`Eliminar todos los workspaces archivados`,"workspaceList.deleteArchivedDialog.title":`¿Eliminar todos los workspaces archivados?`,"workspaceList.deleteArchivedDialog.message":`Esto eliminará permanentemente los {count} workspaces archivados. Esta acción no se puede deshacer.`,"workspacePage.selectWorkspace":`Selecciona un workspace para comenzar`,"workspacePage.commandPalettePlaceholder":`Buscar comandos…`,"workspacePage.commandPaletteEmpty":`No hay comandos coincidentes`,"workspacePage.commandFocusChat":`Enfocar la entrada del chat`,"workspacePage.commandSearchHistory":`Buscar en el historial del workspace`,"workspacePage.commandTogglePanel":`Mostrar u ocultar el panel lateral`,"workspacePage.commandStartAgent":`Iniciar agente`,"workspacePage.commandStopAgent":`Detener agente`,"workspacePage.commandOpenSettings":`Abrir los ajustes`,"workspacePage.commandOpenCreate":`Crear un workspace`,"workspacePage.commandOpenSearch":`Búsqueda global`,"workspacePage.commandOpenHealth":`Página de salud`,"workspacePage.commandOpenChangelog":`Registro de cambios`,"workspacePage.commandGroupWorkspaces":`Ir a un workspace`,"workspacePage.commandPaletteHint":`Paleta de comandos`,"workspacePage.session":`Sesión #{n}`,"workspacePage.newSession":`+ Nueva sesión`,"workspacePage.renameSession":`Renombrar`,"workspacePage.renameSessionTitle":`Renombrar sesión`,"workspacePage.sessionNameLabel":`Nombre de sesión`,"workspacePage.sessionEndedNotice":`Esta sesión ha terminado. Crea una nueva sesión para continuar.`,"workspacePage.renameFailed":`Error al renombrar`,"workspacePage.copySessionId":`Copiar ID de sesión`,"workspacePage.deleteSession":`Eliminar sesión`,"workspacePage.deleteSessionTitle":`¿Eliminar sesión?`,"workspacePage.deleteSessionConfirm":`Esto elimina permanentemente esta sesión y su historial de conversación.`,"workspacePage.deleteSessionFailed":`No se pudo eliminar la sesión`,"workspacePage.noEngineSessionId":`Todavía no hay ID de sesión — el agente aún no ha iniciado esta sesión`,"workspacePage.createSessionFailed":`Error al crear la sesión`,"workspacePage.startFailed":`Error al iniciar`,"workspacePage.stopFailed":`Error al detener`,"workspacePage.interrupt":`Interrumpir`,"workspacePage.interrupted":`Agente interrumpido — esperando tu próximo mensaje`,"workspacePage.lastAgentEvent":`Último evento {when}`,"workspacePage.agentStopping":`Deteniendo…`,"workspacePage.agentNotRunning":`Ningún agente en ejecución — el estado está obsoleto`,"workspacePage.archivedBanner":`Workspace archivado — solo lectura`,"workspacePage.worktreePurgedBanner":`Worktree eliminado — historial conservado, restauración no disponible en esta versión`,"workspacePage.worktreePurgedTooltip":"La carpeta del worktree fue eliminada del disco para recuperar espacio. El historial de mensajes, sesiones y metadatos de la PR siguen consultables aquí, pero el directorio de trabajo ya no existe localmente. Una futura versión de Kōbō podrá reconstruir el worktree desde la PR mergeada — por ahora, recréalo manualmente con `gh pr checkout` o `git worktree add`.","workspacePage.pendingInitialPromptBanner":`Hay un prompt inicial pendiente — el agente nunca lo recibió (el script de setup falló o el workspace nunca se inició). Haz clic en Iniciar para enviarlo ahora.`,"workspacePage.unarchived":`Workspace desarchivado`,"workspacePage.unarchiveFailed":`Error al desarchivar`,"workspacePage.interruptFailed":`Error al interrumpir`,"workspacePage.interruptHint":`Interrumpir el turno actual sin terminar la sesión.`,"workspacePage.interruptTooltip":`Interrupción suave (como Escape) — detiene la herramienta actual pero mantiene la sesión activa`,"workspacePage.pendingNextRun":`Se aplicará en el próximo inicio`,"workspacePage.activeSessionModel":`En uso: {model}`,"workspacePage.activeSessionModelTooltip":`Modelo utilizado actualmente por la sesión seleccionada`,"workspacePage.switchEngine":`Cambiar motor`,"workspacePage.switchEngineHint":`Continuar este workspace con otro motor de agente`,"workspacePage.moreActions":`Más acciones`,"workspacePage.switchEngineTitle":`Cambiar motor de agente`,"workspacePage.switchEngineWarning":`El agente actual se detendrá y se iniciará una sesión nueva en el mismo worktree.`,"workspacePage.engineLabel":`Motor`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Traspaso para el nuevo motor`,"workspacePage.engineHandoffHint":`Revisa o edita el contexto que se enviará al nuevo agente.`,"workspacePage.confirmSwitchEngine":`Cambiar motor`,"workspacePage.switchEngineFailed":`No se pudo cambiar el motor`,"whip.dispatchFailed":`No se pudo enviar el mensaje del látigo`,"whip.phrase1":`¡Más rápido, tocard!`,"whip.phrase2":`¡Acelera el ritmo, tocard!`,"whip.phrase3":`¡Vuelve al trabajo, tocard!`,"whip.phrase4":`¡Demuéstrame velocidad, tocard!`,"whip.phrase5":`¡Menos pensar y más hacer, tocard!`,"search.title":`Búsqueda`,"search.tooltip":`Buscar en el historial de agentes`,"search.placeholder":`Buscar en todos los mensajes de agentes…`,"search.includeArchived":`Incluir workspaces archivados`,"search.loading":`Buscando…`,"search.noResults":`Sin resultados`,"search.error":`Búsqueda fallida: {message}`,"search.resultCount":`{n} resultado(s)`,"search.eventType.userMessage":`Tú`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Aún no hay actividad`,"activityFeed.emptyHint":`Inicia un workspace para ver la salida del agente aquí`,"activityFeed.initialPrompt":`Prompt inicial`,"activityFeed.you":`Tú`,"activityFeed.agent":`Agente`,"activityFeed.question":`Pregunta`,"activityFeed.goToPrevious":`Ir al mensaje anterior`,"activityFeed.scrollToBottom":`Ir al final`,"activityFeed.sendAnswers":`Enviar respuestas`,"agentBusy.banner":`El agente está ocupado`,"agentBusy.subagentsRunning":`1 sub-agente en ejecución | {n} sub-agentes en ejecución`,"agentBusy.viewSubagents":`Ver sub-agentes`,"agentBusy.pendingMessage":`Esperando — el agente está ocupado`,"terminal.title":`Terminal`,"terminal.open":`Abrir terminal`,"terminal.close":`Cerrar terminal`,"terminal.noWorkspace":`Seleccione un espacio de trabajo`,"terminal.noWorktree":`Worktree aún no creado`,"terminal.error":`Error del terminal`,"terminal.exited":`Terminal cerrado`,"terminal.disconnected":`Conexión perdida`,"terminal.reconnecting":`Reconectando… (intento {attempt} de {max})`,"terminal.reconnect":`Reconectar`,"chatInput.placeholder":`Mensaje... (/ para skills)`,"chatInput.fileSearchHint":`buscar un archivo`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Adjuntar imagen`,"chatInput.queueBanner":`Mensaje en cola — se enviará cuando el agente termine`,"chatInput.forceQueue":`Forzar envío`,"chatInput.searchHistory":`buscar`,"chatInput.commandPalette":`comandos`,"chatInput.shortcuts":`Atajos de teclado`,"chatInput.cancelQueue":`Cancelar cola`,"chatInput.autoLoopBanner":`Auto-loop activo — deténlo para enviar un mensaje`,"chatInput.awaitingUserBanner":`El agente espera tu respuesta arriba — responde mediante el panel de la pregunta`,"chatInput.autoLoopStop":`Detener`,"koboCommand.checkProgressDesc":`Verificar el progreso de las tareas y criterios de aceptación`,"chatInput.uploading":`Subiendo...`,"voice.title":`Transcripción de voz`,"voice.enabled":`Activar transcripción de voz local`,"voice.pttKey":`Tecla push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espacio`,"voice.language":`Idioma (auto o código)`,"voice.model":`Modelo activo`,"voice.commandPath":`Ruta del binario Whisper (opcional)`,"voice.ffmpegPath":`Ruta del binario ffmpeg (opcional)`,"voice.temperature":`Temperatura`,"voice.temperatureHint":`Más bajo = más determinista; más alto = más flexible pero potencialmente menos estable.`,"voice.initialPrompt":`Prompt inicial (opcional)`,"voice.initialPromptHint":`Contexto opcional para ayudar a Whisper con nombres, siglas o vocabulario técnico.`,"voice.translateToEnglish":`Traducir al inglés`,"voice.translateToEnglishHint":`Si se activa, el audio no inglés se traduce al inglés en lugar de transcribirse tal cual.`,"voice.suppressNst":`Suprimir tokens no vocales`,"voice.suppressNstHint":`Intenta reducir artefactos no vocales en la transcripción.`,"voice.installLink":`Instalar whisper.cpp`,"voice.installGuideTitle":`Guía de instalación`,"voice.installGuideIntro":`Instala whisper.cpp y ffmpeg, luego configura las rutas de binarios abajo si hace falta.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Después del build con CMake, el binario de Whisper suele estar en: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Después, configura “Ruta del binario Whisper” y “Ruta del binario ffmpeg” en esta sección (o déjalo vacío si están en PATH).`,"voice.noneModel":`Sin modelo activo`,"voice.notInstalled":`no instalado`,"voice.download":`Descargar`,"voice.delete":`Eliminar`,"voice.holdToTalk":`Mantén pulsado para hablar`,"voice.recording":`Grabando...`,"voice.transcribing":`Transcribiendo...`,"voice.notSupported":`La grabación de voz no es compatible con este navegador`,"voice.errorMicPermission":`Permiso de micrófono denegado`,"voice.errorTranscription":`Falló la transcripción de voz`,"voice.downloadFailed":`Falló la descarga del modelo`,"voice.deleteFailed":`Falló la eliminación del modelo`,"voice.errorDisabled":`La transcripción de voz está desactivada en ajustes`,"voice.errorModelMissing":`No hay un modelo de voz activo configurado`,"voice.errorModelNotInstalled":`El modelo de voz activo no está instalado`,"voice.errorAudioInvalid":`La captura de audio es inválida o vacía`,"voice.errorLanguageInvalid":`La configuración del idioma de voz es inválida`,"voice.errorRuntimeMissing":`El runtime de Whisper no está instalado o no está en el PATH`,"voice.maxDurationReached":`Se alcanzó la duración máxima de grabación`,"voice.runtimeReady":`Runtime listo: {command}`,"voice.runtimeMissing":`Falta runtime: {command}`,"voice.ffmpegReady":`ffmpeg listo`,"voice.ffmpegMissing":`falta ffmpeg`,"voice.sectionRuntime":`Estado del runtime`,"voice.sectionActivation":`Activación`,"voice.sectionModels":`Modelos Whisper`,"voice.sectionAdvanced":`Opciones avanzadas`,"voice.sectionBehavior":`Comportamiento de la transcripción`,"voice.sectionBinaries":`Rutas de los binarios`,"voice.downloadModels":`Descargar un modelo`,"voice.cancelFailed":`No se pudo cancelar la descarga`,"createPage.title":`Crear un workspace`,"createPage.subtitle":`Describe la misión, elige un proyecto y configura el agente.`,"createPage.sectionMission":`Misión`,"createPage.sectionMissionHint":`Proporciona al agente un objetivo claro y el contexto necesario.`,"createPage.workspaceNameLabel":`Nombre del workspace`,"createPage.descriptionLabel":`Descripción de la misión`,"createPage.sources":`Fuentes opcionales`,"createPage.sectionGit":`Proyecto Git`,"createPage.sectionGitHint":`Elige el repositorio, la rama de origen y el modo de worktree.`,"createPage.worktreeMode":`Modo de worktree`,"createPage.worktreeNew":`Nuevo worktree aislado`,"createPage.worktreeExisting":`Reutilizar un worktree existente`,"createPage.projectLabel":`Proyecto`,"createPage.sourceBranch":`Rama de origen`,"createPage.workingBranchPreview":`Vista previa de la rama de trabajo`,"createPage.branchNamePending":`nombre-del-workspace`,"createPage.sectionAgent":`Agente`,"createPage.sectionAgentHint":`Revisa los ajustes de ejecución o activa la automatización.`,"createPage.configureAgent":`Configurar el agente`,"createPage.advancedOptions":`Opciones avanzadas`,"createPage.keyboardHint":`Pulsa Ctrl/Cmd + Enter para crear el workspace.`,"createPage.createWorkspace":`Crear workspace`,"createPage.notionEnabled":`Notion activado`,"createPage.importNotion":`Importar desde Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`La URL debe empezar por https://www.notion.so/ o https://app.notion.com/`,"createPage.notionAutoExtract":`Las subtareas y criterios de aceptación se extraerán automáticamente.`,"createPage.notionPanelChoiceLabel":`Esta URL apunta a una subpágina (?p=). ¿Sobre cuál quieres trabajar?`,"createPage.notionPanelOption":`Subpágina (panel)`,"createPage.notionPanelOptionDesc":`La página que estabas viendo — recomendado`,"createPage.notionParentOption":`Página principal`,"createPage.notionParentOptionDesc":`La épica / base de datos a la que pertenece`,"createPage.importSentry":`Importar Sentry`,"createPage.sentryEnabled":`Sentry activado`,"createPage.sentryPlaceholder":`https://tu-org.sentry.io/issues/123456`,"createPage.sentryValidation":`La URL debe apuntar a una issue de Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`La issue de Sentry se importará automáticamente`,"createPage.sentryExtractHint":`Kobo extraerá la issue y la escribirá en .ai/thoughts/`,"createPage.importPr":`Importar desde una PR`,"createPage.importPrRequiresProject":`Elige primero un proyecto`,"createPage.importPrNotSupported":`El forge de este proyecto no admite listar pull requests`,"createPage.lockedToPr":`Bloqueado a la PR #{number}`,"createPage.prReadyToCreate":`PR #{number} importada — el workspace puede crearse.`,"createPage.unlockPrCheckout":`Desbloquear`,"createPage.workspaceName":`Nombre del workspace (por defecto el título de la página Notion)`,"createPage.workspaceNamePlaceholder":`Nombre del workspace...`,"createPage.instructions":`Instrucciones adicionales (opcional)...`,"createPage.instructionsPlaceholder":`Describe la tarea...`,"createPage.tasks":`Tareas ({count})`,"createPage.addTask":`Añadir una tarea...`,"createPage.acceptanceCriteria":`Criterios de aceptación ({count})`,"createPage.addCriterion":`Añadir un criterio...`,"createPage.projectPath":`Introduce la ruta del proyecto`,"createPage.branchType":`Tipo de rama`,"createPage.branch":`Rama`,"createPage.noBranches":`No se encontraron ramas`,"createPage.enterPath":`Introduce la ruta del proyecto`,"createPage.skipSetupScript":`Omitir script de setup`,"createPage.worktreePickerLabel":`Worktree existente`,"createPage.noOrphanWorktrees":`No hay worktrees huérfanos en este proyecto`,"createPage.pickWorktreeRequired":`Selecciona un worktree para adjuntar`,"createPage.notionExtractHint":`Las subtareas y criterios de aceptación se extraerán de la página Notion.`,"createPage.errorCreating":`Error al crear el workspace.`,"createPage.branchAdjusted":"La rama ya existía — se creó `{branch}` en su lugar. La carpeta worktree correspondiente usa el mismo sufijo.","createPage.localSourceFallback":`Workspace creado desde la rama local (origin inalcanzable) — la base puede estar desactualizada.`,"createPage.validationNotionUrl":`Introduce una URL de Notion válida (https://www.notion.so/... o https://app.notion.com/...).`,"createPage.validationDescription":`Describe la tarea.`,"createPage.validationName":`Indica un nombre para el workspace.`,"createPage.validationPath":`Introduce la ruta del proyecto.`,"createPage.validationBranch":`Selecciona una rama.`,"createPage.validationFocusHint":`El campo a corregir está resaltado abajo.`,"createPage.progress.validate":`Validando la solicitud…`,"createPage.progress.fetch-source-branch":`Obteniendo la rama de origen desde origin…`,"createPage.progress.inspect-worktree":`Inspeccionando el worktree existente…`,"createPage.progress.extract-notion":`Extrayendo la página de Notion…`,"createPage.progress.extract-sentry":`Extrayendo la incidencia de Sentry…`,"createPage.progress.create-record":`Creando el workspace…`,"createPage.progress.create-tasks":`Creando tareas y criterios de aceptación…`,"createPage.progress.create-worktree":`Creando el worktree de git…`,"createPage.progress.write-conventions":`Escribiendo las convenciones de git…`,"createPage.progress.write-context-files":`Escribiendo los archivos de contexto…`,"createPage.progress.build-prompt":`Construyendo el prompt inicial…`,"createPage.progress.setup-script":`Ejecutando tu script de instalación…`,"createPage.progress.start-agent":`Iniciando el agente…`,"createPage.progress.rollback":`Deshaciendo la creación fallida…`,"createPage.progress.done":`Listo`,"createPage.progress.step":`Paso {index} de {total}`,"createPage.errorAtStep":`La creación falló en el paso «{step}»: {message}`,"createPage.override.title":`Dos de tus opciones fueron sustituidas`,"createPage.override.setup-script-forced":`Script de instalación omitido: volver a ejecutarlo en un worktree que ya preparaste podría destruir su contenido.`,"createPage.override.permission-mode-downgraded":`Modo de permisos cambiado de Plan a Bypass: un bucle autónomo no puede ejecutarse en Plan, que bloquea herramientas y ediciones.`,"settings.title":`Ajustes`,"settings.language":`Idioma`,"settings.projectColor":`Color`,"settings.projectColorClear":`Borrar`,"settings.projectColorDefault":`Por defecto (gris)`,"settings.workspaceListSection":`Lista de workspaces`,"settings.flattenWorkspaceList":`Lista plana de workspaces`,"settings.flattenWorkspaceListHint":`Muestra todos los workspaces en una lista plana con una etiqueta de proyecto, en lugar de agruparlos por proyecto.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personalizado`,"settings.skillSuite.superpowersHint":`Workflow opinado TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Ambas suites se combinan — superpowers para la metodología (brainstorm / TDD / planes / revisión a nivel de principios), gstack para flujos concretos (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Framework de agentes de affaan-m — agents, skills, rules y hooks para planificar, probar, implementar, revisar y memorizar (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Las tres suites se combinan — superpowers para la metodología, gstack para flujos concretos, ECC para pases de revisión/implementación multiagente estructurados.`,"settings.skillSuite.customHint":`Compón los cinco prompts a continuación con los templates que elijas y edítalos libremente.`,"settings.skillSuite.reloadDefaults":`Restaurar predeterminados`,"settings.skillSuite.reloadDefaultsConfirm":`¿Reemplazar los cinco prompts personalizados con los valores agnósticos predeterminados?`,"settings.skillSuite.customPrompts":`Prompts personalizados`,"settings.skillSuite.agnostic":`Base agnóstica`,"settings.skillSuite.importPrompt":`Importar un template`,"settings.skillSuite.imported":`Template importado. Ahora puedes editarlo.`,"settings.skillSuite.importFailed":`No se pudo importar el template`,"settings.skillSuite.reviewTemplate":`Template de revisión`,"settings.skillSuite.autoLoopReviewGate":`Compuerta de revisión auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instrucción de la fase de brainstorming`,"settings.global":`Global`,"settings.projects":`Proyectos`,"settings.globalSettings":`Ajustes globales`,"settings.defaultModel":`Modelo por defecto`,"settings.defaultModelClaude":`Modelo por defecto (Claude Code)`,"settings.defaultModelCodex":`Modelo por defecto (OpenAI Codex)`,"settings.agentPermissions":`Permisos del agente`,"settings.skipPermissions":`Omitir solicitudes de permisos (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Advertencia: desactivar esto hará que todos los permisos de herramientas (Write, Edit, Bash...) se denieguen automáticamente en modo headless. El agente solo podrá leer.`,"settings.notifications":`Notificaciones`,"settings.browserNotifications":`Notificación del navegador cuando el agente termina`,"settings.audioNotifications":`Notificación sonora cuando el agente termina`,"settings.enableBrowserNotifications":`Activar las notificaciones del navegador`,"settings.testBrowserNotification":`Probar la notificación`,"settings.browserNotificationGranted":`Notificaciones del navegador permitidas`,"settings.browserNotificationDenied":`Notificaciones del navegador bloqueadas`,"settings.browserNotificationAsk":`Se requiere permiso del navegador`,"settings.browserNotificationUnsupported":`Notificaciones del navegador no disponibles`,"settings.browserNotificationPermissionNeeded":`Permite las notificaciones del navegador para enviar una prueba.`,"settings.browserNotificationTestTitle":`Prueba de notificación de Kōbō`,"settings.browserNotificationTestBody":`Las notificaciones del navegador funcionan.`,"settings.enableAudio":`Activar el audio`,"settings.notificationSound":`Sonido de notificación`,"settings.notificationSoundHint":`Se reproduce cuando el agente termina o solicita permiso.`,"settings.questionSound":`Sonido de preguntas`,"settings.questionSoundHint":`Se reproduce solo cuando el agente te hace una pregunta.`,"settings.workspaceCreatedSound":`Sonido de creación del espacio de trabajo`,"settings.workspaceCreatedSoundHint":`Se reproduce después de crear un espacio de trabajo.`,"settings.notificationSoundPreview":`Escuchar`,"settings.notificationVolume":`Volumen`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Errores del agente`,"settings.agentErrorSoundHint":`Se reproduce para cuotas, límites de tasa y errores del agente.`,"settings.notificationSoundBasic":`Notificación básica`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Trabajo`,"settings.notificationSoundTravailTermine":`Trabajo terminado`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Va a explotar`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR y CI`,"settings.soundGeneral":`Sonido general`,"settings.soundNone":`Sin sonido`,"settings.prCiFailedSound":`CI fallida`,"settings.prCiRecoveredSound":`CI recuperada`,"settings.prChangesRequestedSound":`Cambios solicitados`,"settings.prApprovedSound":`PR aprobada`,"settings.prMergeConflictSound":`Conflicto de merge`,"settings.prReadyToMergeSound":`Lista para merge`,"settings.prMergedSound":`PR fusionada`,"settings.prCiFailedSoundHint":`Se reproduce cuando la CI pasa a estado fallido.`,"settings.prCiRecoveredSoundHint":`Se reproduce cuando la CI se recupera de un fallo.`,"settings.prChangesRequestedSoundHint":`Se reproduce cuando una revisión solicita cambios.`,"settings.prApprovedSoundHint":`Se reproduce cuando se aprueba la pull request.`,"settings.prMergeConflictSoundHint":`Se reproduce cuando se detecta un conflicto de merge.`,"settings.prReadyToMergeSoundHint":`Se reproduce cuando la pull request está lista para merge.`,"settings.prMergedSoundHint":`Se reproduce cuando se fusiona la pull request.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Modo de permisos por defecto`,"settings.defaultPermissionModeClaude":`Modo de permisos por defecto (Claude Code)`,"settings.defaultPermissionModeCodex":`Modo de permisos por defecto (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modo aplicado al crear un workspace. Plan = solo lectura, Bypass = sin avisos, Estricto = auto-aceptar ediciones con allow-list, Interactivo = preguntar antes de cada herramienta.`,"settings.activityFeed":`Feed de actividad`,"settings.showThinkingBlocks":`Mostrar bloques de razonamiento de los agentes`,"settings.whipSettings":`Látigo`,"settings.whipSettingsHint":`Configura el atajo y el volumen opcionales del látigo.`,"settings.whipEnabled":`Activar el látigo`,"settings.whipEnabledHint":`Muestra el látigo interactivo en los workspaces activos compatibles.`,"settings.whipVolume":`Volumen del látigo`,"settings.whipVolumeMasterAudioDisabled":`El audio principal está desactivado. Activa las notificaciones de audio para ajustar el volumen del látigo; el valor guardado se conserva.`,"whip.overlayLabel":`Látigo interactivo`,"whip.overlayInstructions":`Mueve el puntero para controlar el látigo. Pulsa Intro o Espacio para hacerlo chasquear. Pulsa Escape para cerrar.`,"settings.whipShortcut":`Atajo del látigo`,"settings.whipShortcutHint":`Haz clic y luego pulsa el atajo que quieras usar.`,"settings.whipShortcutRecording":`Pulsa un atajo…`,"settings.whipShortcutButtonLabel":`Atajo del látigo: {shortcut}`,"settings.whipShortcutRecordingLabel":`Grabando el atajo del látigo. Pulsa un atajo…`,"settings.whipShortcutReset":`Restablecer atajo`,"settings.whipShortcutReserved":`Este atajo está reservado por el navegador.`,"settings.testIntegration":`Probar conexión`,"pwa.offline":`No tienes conexión. El chat y los agentes necesitan el servidor Kōbō.`,"pwa.reconnecting":`Reconectando al servidor Kōbō…`,"pwa.installReady":`Instala Kōbō como aplicación.`,"pwa.install":`Instalar`,"pwa.ignore":`Ignorar`,"pwa.updateReady":`Hay una actualización de Kōbō disponible.`,"pwa.reload":`Recargar`,"chat.searchWorkspaceHistory":`Buscar en el historial del workspace`,"chat.historySearch.user":`Tú`,"chat.historySearch.agent":`Agente`,"chat.openInGitDiff":`Abrir en el diff de Git`,"timeline.title":`Cronología de sesiones`,"timeline.export":`Exportar diagnóstico`,"timeline.unnamed":`Sesión de agente`,"timeline.tools":`{count} herramientas`,"timeline.errors":`{count} errores`,"settings.verboseMessages":`Mostrar mensajes detallados del sistema (task_progress, task_started)`,"settings.availableVariables":`Variables disponibles en las plantillas de prompt`,"settings.prPromptTemplate":`Plantilla de prompt PR`,"settings.prPromptPlaceholder":`Instrucciones para el agente al crear PRs en GitHub...`,"settings.prPromptHint":`Usa las variables listadas arriba (sintaxis de dobles llaves).`,"settings.reviewPromptTemplate":`Plantilla de prompt de revisión`,"settings.reviewPromptPlaceholder":`Instrucciones para el agente al revisar los cambios de la rama...`,"settings.ciFixPromptTemplate":`Plantilla de prompt «Reparar CI»`,"settings.ciFixPromptHint":`Se envía al agente cuando un workspace tiene la CI fallando. Variables (sintaxis con dobles llaves): pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Pedir al agente que diagnostique y arregle los jobs de CI que fallan...`,"settings.finalizationPromptTemplate":`Prompt de finalización del auto-loop`,"settings.finalizationPromptHint":`Prompt por defecto para la última iteración del auto-loop (controles de calidad finales). Se usa cuando un proyecto deja vacío su propio prompt de finalización.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Prompt inicial de Notion`,"settings.notionInitialPrompt.help":`Se añade al prompt de creación del workspace cuando el workspace tiene un ticket de Notion. Variables: {variables}.`,"settings.notionInitialPrompt.project":`Prompt inicial de Notion (anulación)`,"settings.sentryInitialPrompt":`Prompt inicial de Sentry`,"settings.sentryInitialPrompt.help":`Se añade al prompt de creación del workspace cuando el workspace tiene una issue de Sentry. Variables: {variables}.`,"settings.sentryInitialPrompt.project":`Prompt inicial de Sentry (anulación)`,"settings.initialPrompt.inheritHint":`Dejar en blanco para heredar. Escribe un carácter en blanco para desactivar la inyección a este nivel.`,"settings.resetToDefault":`Restablecer`,"settings.resetFailed":`No se pudo cargar el valor por defecto`,"settings.sentryIntegration":`Integración Sentry`,"settings.var.prNumber":`Número de PR (ej: 42)`,"settings.var.prUrl":`URL completa de la PR creada`,"settings.var.branchName":`Nombre de la rama de trabajo`,"settings.var.sourceBranch":`Rama fuente a la que apunta la PR`,"settings.var.workspaceName":`Nombre del workspace`,"settings.var.projectName":`Último segmento de la ruta del proyecto`,"settings.var.notionUrl":`URL de Notion si está definida, vacía en caso contrario`,"settings.var.commits":`Lista de commits entre source y head`,"settings.var.diffStats":`Resumen shortstat de Git (archivos, inserciones, eliminaciones)`,"settings.var.tasks":`Tareas regulares como lista de verificación`,"settings.var.acceptanceCriteria":`Criterios de aceptación como lista de verificación`,"settings.gitConventions":`Convenciones Git (global)`,"settings.gitConventionsPlaceholder":`# Convenciones Git...`,"settings.gitConventionsHint":`Estas convenciones se escriben en .ai/.git-conventions.md en cada nuevo workspace y deben ser seguidas por el agente antes de cualquier operación Git. Se anulan con convenciones por proyecto si están definidas.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de limpieza`,"settings.archiveScript":`Script de archivado`,"settings.archiveScriptHint":`Script de shell ejecutado en el servidor en el worktree cuando se archiva un workspace. Dejar vacío para desactivar.`,"settings.archiveScriptPlaceholder":`p. ej. limpiar contenedores, liberar espacio en disco…`,"settings.changeSourceBranchScript":`Script para cambiar la rama de origen`,"settings.changeSourceBranchScript.help":`Reemplaza el cherry-pick integrado cuando no está vacío. El script gestiona git, base de la PR, force-push y conflictos; Kōbō solo rechaza si el agente está corriendo y actualiza los metadatos de la rama de origen en exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nueva rama de origen elegida en el diálogo
|
|
35
35
|
KOBO_OLD_BASE — rama de origen anterior del workspace
|
|
36
36
|
KOBO_WORKING_BRANCH — rama de trabajo del workspace
|
|
37
37
|
KOBO_WORKTREE_PATH — ruta absoluta del worktree (también cwd)
|
|
@@ -47,7 +47,7 @@ KOBO_PR_NUMBER — número de PR/MR en la forge resuelta (vacío si no hay
|
|
|
47
47
|
# O directamente con git (funciona en GitHub aunque la rama se haya borrado):
|
|
48
48
|
git fetch origin pull/[número-pr]/head:[nombre-rama]
|
|
49
49
|
git worktree add [ruta] [nombre-rama]`,"settings.purgeDocsRestoreFootnote":`GitHub mantiene la ref HEAD de la PR accesible mucho tiempo después de borrar la rama origen (meses / años). La autodetección corre en el watcher de 30 s — no hay que tocar la UI una vez que la carpeta vuelve a existir.`,"settings.purgeDocsPermissionsTitle":`Evitar errores de permisos durante el borrado`,"settings.purgeDocsPermissionsIntro":`Docker suele dejar archivos root-owned en node_modules / vendor dentro del worktree. Cuando Kōbō intenta borrarlos, te topas con EACCES / EPERM y el borrado falla. Dos formas de prevenirlo:`,"settings.purgeDocsPermissionsDocker":'Configurar tu contenedor para que se ejecute como tu usuario host — directiva USER en el Dockerfile, o `user: "${UID}:${GID}"` en docker-compose (con UID/GID exportados en tu shell).',"settings.purgeDocsPermissionsAcl":`Pre-establecer una ACL por defecto en la raíz de los worktrees — red de seguridad que funciona en la MAYORÍA de los casos (ext4/btrfs/xfs + bind mount Docker clásico). Cada archivo nuevo hereda entonces una entrada de acceso para tu usuario, además del propietario nominal:`,"settings.purgeDocsPermissionsAclCommand":` setfacl -d -m u:$(whoami):rwX [raíz-worktrees]`,"settings.purgeDocsPermissionsFootnote":"Limitaciones de las ACL: NO funcionan con volúmenes Docker con nombre (usa un bind mount), sistemas de archivos sin soporte ACL (NTFS, exFAT, tmpfs), SELinux estricto con `:Z`, o cuando Docker `userns-remap` está activado. La solución más fiable sigue siendo configurar el usuario dentro del contenedor (opción 1). Consejo: `rwX` (X mayúscula) solo añade el bit de ejecución en directorios y archivos ya ejecutables — más limpio que `rwx` que haría ejecutable cualquier archivo de texto.","settings.purgeDocsPermissionsRecoverTitle":`Desbloquear un worktree ya roto (archivos root-owned existentes)`,"settings.purgeDocsPermissionsRecoverIntro":`Si te encuentras con un worktree ya lleno de archivos root-owned (Docker ya ha ejecutado, vendor / node_modules están bloqueados), las ACL preventivas de arriba no son suficientes — hay que tratar los archivos EXISTENTES. Dos enfoques, a ejecutar dentro de la carpeta del worktree:`,"settings.purgeDocsPermissionsRecoverAclIntro":`Opción A — ACL recursiva (preserva la propiedad root para auditoría, solo añade acceso para tu usuario en paralelo):`,"settings.purgeDocsPermissionsRecoverAclCommand":`# establece ACL por defecto para archivos futuros Y otorga acceso a todo lo existente
|
|
50
|
-
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Opción B — Tomar la propiedad (más simple, pierde la huella "creado por root en el contenedor" pero rara vez importa):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Consejo: puedes ejecutar estos comandos directamente sobre la raíz de tus worktrees (ej. `~/.worktrees/`) para cubrir todos los workspaces existentes Y futuros de una sola vez. Una vez hecho, el borrado de Kōbō funcionará sin errores de permisos.","contextMenu.runSetup":`Ejecutar script de setup`,"contextMenu.exportEvents":`Exportar eventos (CSV)`,"contextMenu.dismissChangesRequested":`Marcar «Cambios solicitados» como visto`,"contextMenu.dismissCiFailure":`Marcar «CI en error» como visto`,"contextMenu.restoreChangesRequested":`Marcar «Cambios solicitados» como no visto`,"contextMenu.restoreCiFailure":`Marcar «CI en error» como no visto`,"contextMenu.exportingEvents":`Preparando la exportación…`,"contextMenu.exportEventsError":`Error al exportar los eventos`,"contextMenu.openNotion":`Abrir en Notion`,"contextMenu.openSentry":`Abrir en Sentry`,"contextMenu.openPr":`Abrir PR`,"contextMenu.ignorePrWatch":`Ignorar comprobaciones de PR`,"contextMenu.resumePrWatch":`Reanudar comprobaciones de PR`,"contextMenu.prWatchToggleFailed":`Error al actualizar las comprobaciones de PR`,"workspace.favorite":`Marcar como favorito`,"workspace.unfavorite":`Quitar de favoritos`,"workspace.showFavoritesOnly":`Mostrar solo favoritos`,"workspace.searchArchivedToggle":`Buscar también en workspaces archivados`,"workspace.descriptionPlaceholder":`Añadir una breve descripción`,"workspace.descriptionDialogHint":`Texto sin formato, máximo 200 caracteres. Dejar vacío para borrar.`,"workspace.descriptionTooLong":`La descripción debe tener 200 caracteres o menos.`,"workspace.descriptionSaveFailed":`No se pudo guardar la descripción.`,"workspace.agentDescriptionTooltip":`Estado en vivo mantenido por el agente`,"mcp.tool.setWorkspaceDescription":`Establece la breve descripción del workspace (≤ 200 caracteres).`,"tags.manage":`Gestionar etiquetas`,"tags.manageTitle":`Gestionar etiquetas del workspace`,"tags.noTagsDefined":`Sin etiquetas. Añádelas en Ajustes > Global > Etiquetas.`,"tags.orphanedHint":`{count} etiqueta(s) ya no están en el catálogo global. Desmárcalas para quitarlas.`,"settings.tagsTitle":`Etiquetas de workspace`,"settings.tagsHint":`Define las etiquetas asignables a los workspaces. Escribe para añadir, clic en la cruz para quitar.`,"settings.tagsLabel":`Etiquetas disponibles`,"settings.branchPrefixesTitle":`Prefijos de rama`,"settings.branchPrefixesHint":`Gestiona los prefijos de rama de Git disponibles en la página de creación de workspaces. El primero se preselecciona por defecto.`,"settings.branchPrefixesEmpty":`No hay ningún prefijo de rama definido. Añade al menos uno abajo.`,"settings.branchPrefixesAddLabel":`Nuevo prefijo`,"settings.branchPrefixesEditHint":`Haz clic para renombrar`,"settings.branchPrefixesMoveUp":`Subir`,"settings.branchPrefixesMoveDown":`Bajar`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Elige dónde se crean los worktrees de nuevos workspaces. Las rutas relativas se resuelven desde el proyecto; se admiten rutas absolutas Linux/macOS y Windows, $HOME, ~ y %USERPROFILE%.`,"settings.worktreesPathLabel":`Ruta de worktrees`,"settings.worktreesPathRequired":`La ruta de worktrees es obligatoria.`,"settings.worktreesPrefixByProject":`Prefijar los worktrees con el nombre del proyecto`,"settings.worktreesPrefixByProjectHint":`Coloca cada worktree en un subdirectorio con el nombre del proyecto para evitar colisiones cuando varios proyectos comparten la misma raíz.`,"settings.shareTitle":`Compartir configuración`,"settings.shareHint":`Exporta tus ajustes, plantillas y etiquetas en un bundle JSON. Las claves MCP no se incluyen por seguridad.`,"settings.exportConfig":`Exportar`,"settings.importConfig":`Importar`,"settings.exportSuccess":`Configuración exportada`,"settings.importSuccess":`Configuración importada`,"settings.importConfirmTitle":`Importar configuración`,"settings.importConfirmMessage":`Esto reemplazará tus ajustes, plantillas y etiquetas actuales. Las claves MCP se conservan. ¿Continuar?`,"settings.network.title":`Acceso de red`,"settings.network.hint":`Controla Kōbō desde otro dispositivo de tu LAN de confianza. Off = solo localhost. On = accesible en tu red, protegido por un token. Reinicia Kōbō tras cambiar.`,"settings.network.enable":`Activar acceso de red`,"settings.network.behindProxy":`Detrás de un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ya no puede distinguir tu propia máquina de una solicitud reenviada — incluso localhost necesitará el token a partir de ahora. Actívalo solo si un reverse proxy (Traefik, nginx, Caddy…) está delante de Kōbō.`,"settings.network.restartRequired":`Reinicia Kōbō para aplicar la nueva dirección de bind.`,"settings.network.token":`Token de acceso`,"settings.network.copy":`Copiar`,"settings.network.copied":`Copiado`,"settings.network.regenerate":`Regenerar`,"settings.network.regenerateConfirm":`¿Regenerar el token? Los dispositivos conectados necesitarán el nuevo token.`,"settings.network.urls":`URLs de LAN`,"settings.network.scan":`Escanea para conectar`,"settings.network.noUrls":`No se detectó ninguna dirección LAN.`,"settings.network.loadFailed":`No se pudieron cargar los ajustes de acceso de red.`,"settings.network.updateFailed":`No se pudieron actualizar los ajustes de acceso de red.`,"settings.unsavedChanges.title":`Cambios sin guardar`,"settings.unsavedChanges.message":`Este proyecto tiene cambios sin guardar. Cambiar de proyecto los descartará.`,"settings.unsavedChanges.discard":`Descartar y cambiar`,"settings.unsavedChanges.cancel":`Cancelar`,"settings.loadFailed":`No se pudieron cargar los ajustes`,"settings.loadFailedHint":`Guardar está desactivado: el formulario muestra valores por defecto y escribirlos sobrescribiría tu configuración real.`,"health.title":`Salud`,"health.tooltip":`Estado del sistema`,"changelog.title":`Changelog`,"changelog.tooltip":`Novedades de Kōbō`,"changelog.empty":`Ningún changelog disponible.`,"changelog.current":`actual`,"changelog.currentVersion":`Versión actual: v{version}`,"health.envTitle":`Entorno`,"health.version":`Versión`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de datos`,"health.dbPath":`Ruta`,"health.dbSize":`Tamaño`,"health.schemaVersion":`Versión del esquema`,"health.settingsSchemaVersion":`Esquema de ajustes`,"health.runtimesTitle":`Motores de agente`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude no encontrado en PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binario codex no resoluble`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`No se encontró ni gh ni glab — pull requests y vigilancia de CI no disponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} en total, {archived} archivados`,"health.worktreesMissing":`{count} worktree(s) faltan en el disco`,"health.sessionsTitle":`Sesiones de agente`,"health.sessionsOrphaned":`{n} sesión/sesiones huérfana(s) en ejecución`,"health.integrationsTitle":`Integraciones`,"health.integrationConfigured":`configurada`,"health.integrationMissing":`sin configurar`,"health.integrationDisabled":`desactivada`,"settings.integrationEnabled":`Activar integración`,"health.activeTitle":`Estado activo`,"health.activeQuotaBackoffs":`Quota backoffs pendientes`,"health.activeWakeups":`Despertares programados`,"health.activeAutoLoop":`Auto-loop en ejecución`,"health.activeAgentSessions":`Sesiones de agente activas`,"health.activeDevServers":`Servidores de desarrollo activos`,"health.noneActive":`Ninguno.`,"health.quotaResumeAt":`reanuda a las {time}`,"health.wakeupAt":`despierta a las {time}`,"health.startedAgo":`iniciada hace {time}`,"health.autoLoopReady":`listo, iterando`,"health.autoLoopGrooming":`grooming en curso`,"session.started":`Sesión iniciada`,"session.ended":`Sesión finalizada`,"session.compacted":`Contexto compactado`,"session.endedCompleted":`Turno finalizado: envía un mensaje para continuar`,"session.endedKilled":`Sesión detenida`,"session.endedError":`La sesión terminó con un error`,"session.endedWatchdog":`Sesión cerrada a la fuerza tras un periodo de inactividad`,"tool.running":`Ejecutando...`,"activity.raw_lines":`Líneas de salida brutas ({n})`,"activity.loading_older":`Cargando mensajes anteriores…`,"activity.compacting":`Compactando el contexto…`,"activity.prev_user_message":`Mensaje anterior del usuario`,"activity.scroll_to_bottom":`Desplazar al final`,"activity.empty":`Nada todavía`,"activity.emptyHint":`La salida del agente aparecerá aquí en cuanto arranque una sesión.`,"activity.a11y.region":`Anuncios de actividad del agente`,"activity.a11y.agentSaid":`Agente: {text}`,"activity.a11y.toolStarted":`Herramienta {name} iniciada`,"activity.a11y.toolFinished":`Herramienta {name} finalizada`,"activity.a11y.toolFailed":`Herramienta {name} falló`,"chat.systemPrompt":`Prompt del sistema`,"chat.agent":`Agente`,"chat.cleanupScript":`Script de limpieza`,"chat.archiveScript":`Script de archivado`,"chat.setupScript":`Script de setup`,"chat.scriptDone":`Hecho`,"chat.scriptComplete":`[{phase}] Completado`,"chat.scriptError":`[{phase}] Error: {message}`,"chat.unknownError":`desconocido`,"chat.you":`Tú`,"chat.session":`Sesión`,"chat.nActions":`{n} acción | {n} acciones`,"chat.lastUpdatedAt":`Última actualización a las {time}`,"chat.scrollToTurnTop":`Desplazar al inicio del mensaje`,"migration.backing_up":`Haciendo copia de seguridad de la base de datos…`,"migration.running":`Migrando datos del agente — {processed}/{total}`,"migration.error":`La migración falló`,"migration.backup_location":`Se guardó una copia de seguridad en {path}. Reinicia Kōbō para reintentar.`,"migration.retry":`Reinicia Kōbō para reintentar.`,"engine.select":`Motor`,"engine.model":`Modelo`,"engine.effort":`Esfuerzo de razonamiento`,"wakeup.scheduledIn":`Próximo despertar en {n}s`,"wakeup.scheduledAt":`Próximo despertar a las {time}`,"wakeup.firing":`Despertando...`,"wakeup.reason":`Razón: {reason}`,"wakeup.cancel":`Cancelar este despertar`,"wakeup.pendingIndicator":`Despertar programado`,"cron.pendingIndicator":`{n} cron(s) programado(s)`,"schedule.tabLabel":`Programación`,"schedule.panelTitle":`Automatización`,"schedule.panelDescription":`Despertar este workspace más tarde o ejecutar instrucciones según una programación.`,"schedule.activeTitle":`Programaciones activas`,"schedule.emptyTitle":`Nada programado`,"schedule.emptyDescription":`Crea un wakeup puntual o una tarea recurrente abajo.`,"schedule.cancelWakeup":`Cancelar este wakeup`,"schedule.cancelCron":`Eliminar esta tarea recurrente`,"schedule.createTitle":`Crear una programación`,"schedule.createDescription":`Elige cuándo y cómo debe ejecutarse el agente.`,"schedule.typeWakeup":`Wakeup puntual`,"schedule.typeRecurring":`Tarea recurrente`,"schedule.wakeupDescription":`Ejecutar el prompt una vez después de un retraso.`,"schedule.cronDescription":`Ejecutar el prompt periódicamente con una frecuencia fija.`,"schedule.promptHint":`Instrucciones que se enviarán al agente`,"schedule.frequencyTitle":`Frecuencia`,"schedule.advancedDescription":`Usar una expresión cron sin procesar`,"schedule.cronExpressionLabel":`Expresión cron`,"schedule.sessionModeTitle":`Sesión de ejecución`,"schedule.modeResume":`Reanudar sesión`,"schedule.oneShotHint":`Eliminar esta programación después de su primera ejecución.`,"schedule.wakeupTitle":`Wakeup pendiente`,"schedule.cronsTitle":`Programaciones recurrentes`,"schedule.noWakeup":`Sin wakeup programado`,"schedule.noCrons":`Sin cron programado`,"schedule.nextFireAt":`próximo a las {time}`,"schedule.lastFiredAt":`último hace {time}`,"schedule.addCronTitle":`Añadir una tarea recurrente`,"schedule.addWakeupTitle":`Programar un wakeup`,"schedule.every":`Cada`,"schedule.unitMinutes":`minutos`,"schedule.unitHours":`horas`,"schedule.unitDays":`días`,"schedule.daysDriftWarning":`El intervalo puede reducirse a 1 día a fin de mes (limitación de cron).`,"schedule.advancedExpression":`Expresión avanzada (opcional)`,"schedule.advancedHint":`Cron sin procesar (p. ej. */15 * * * *) o {'@'}hourly/{'@'}daily — anula el selector si se rellena.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Etiqueta (opcional)`,"schedule.delayMinutes":`Retraso (minutos)`,"schedule.modeFresh":`Nueva sesión`,"schedule.oneShot":`Ejecutar solo una vez`,"schedule.addCronBtn":`Añadir cron`,"schedule.addWakeupBtn":`Programar wakeup`,"schedule.cronCreated":`Tarea recurrente añadida`,"schedule.wakeupCreated":`Wakeup programado`,"askUserQuestion.title":`El agente hace una pregunta`,"askUserQuestion.submit":`Enviar respuesta`,"askUserQuestion.multiSelectHint":`Selecciona una o más opciones`,"askUserQuestion.otherOption":`Otro`,"askUserQuestion.otherOptionHint":`especifíquelo en su próximo mensaje`,"askUserQuestion.freeFormLabel":`Especifique su respuesta`,"askUserQuestion.freeFormHint":`Esta respuesta se enviará directamente al agente.`,"askUserQuestion.noPending":`Ninguna pregunta pendiente`,"askUserQuestion.next":`Siguiente`,"askUserQuestion.previous":`Anterior`,"askUserQuestion.cancel":`Cancelar`,"askUserQuestion.cancelTooltip":`Saltar esta pregunta — el agente continuará sin respuesta`,"askUserQuestion.collapse":`Contraer el panel de pregunta`,"askUserQuestion.expand":`Expandir el panel de pregunta`,"permissionRequest.title":`El agente quiere usar una herramienta`,"permissionRequest.allow":`Permitir`,"permissionRequest.allowOnce":`Permitir una vez`,"permissionRequest.allowTurn":`Permitir este turno`,"permissionRequest.allowOperation":`Permitir siempre esta operación`,"permissionRequest.allowTool":`Permitir siempre esta herramienta`,"permissionRequest.deny":`Denegar`,"permissionRequest.tool":`Herramienta`,"permissionRequest.input":`Entrada`,"permissionRequest.rawInput":`Detalles técnicos`,"permissionRequest.collapse":`Contraer el panel de permisos`,"permissionRequest.expand":`Expandir el panel de permisos`,"permissionRequest.denied":`denegado por el usuario`,"workspaceStatus.created":`creado`,"workspaceStatus.extracting":`extracción`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.executing":`en curso`,"workspaceStatus.awaitingUser":`esperando tu respuesta`,"workspaceStatus.completed":`completado`,"workspaceStatus.idle":`inactivo`,"workspaceStatus.error":`error`,"workspaceStatus.quota":`cuota alcanzada`,"workspaceStatus.retrying":`reanudación automática`,"workspaceList.prOpen":`#{n} — Pull request abierta`,"workspaceList.prWatchDisabledIndicator":`Comprobaciones de PR ignoradas para este workspace`,"workspaceList.prChangesRequested":`#{n} — Cambios solicitados`,"workspaceList.attentionCiFailed":`CI fallida`,"workspaceList.attentionChangesRequested":`Cambios solicitados`,"workspaceList.attentionReadyToMerge":`Listo para merge`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Iniciar auto-loop`,"autoLoop.prepare":`Preparar para auto-loop`,"autoLoop.reprepare":`Volver a preparar para auto-loop`,"autoLoop.reprepareTooltip":`Volver a ejecutar la fase de grooming para añadir o refrescar tareas antes de reanudar el bucle`,"autoLoop.prepareBusy":`Espera a que el agente termine antes de preparar`,"autoLoop.forceReady":`Sé lo que hago — omitir preparación`,"autoLoop.forceReadyConfirm":`¿Omitir la preparación y marcar auto-loop listo? El loop puede quedarse bloqueado si las tareas no son atómicas.`,"autoLoop.stop":`Detener auto-loop`,"autoLoop.notReady":`Ejecute primero 'Preparar para auto-loop'`,"autoLoop.noTasks":`Añada tareas primero`,"autoLoop.progress":`Auto-loop · {done}/{total} tareas`,"autoLoop.preparing":`Auto-loop · preparando`,"autoLoop.preparingTooltip":`Preparación en curso — el agente está creando / revisando tareas. El bucle arrancará cuando llame a mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en ejecución`,"autoLoop.startInMode":`Iniciar en modo auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Modelo usado solo para la sesión de brainstorming inicial — cada tarea posterior usa el modelo elegido arriba`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Nivel de razonamiento usado solo para la sesión de brainstorming inicial`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Modelo usado para cada tarea del auto-loop tras la sesión de brainstorming inicial`,"autoLoop.sessionMode.perTask":`Nueva sesión por tarea`,"autoLoop.sessionMode.label":`Sesión:`,"autoLoop.sessionMode.perTaskTooltip":`Cada tarea inicia una sesión nueva de Claude Code sin memoria de tareas anteriores`,"autoLoop.sessionMode.continuous":`Sesión continua`,"autoLoop.sessionMode.continuousTooltip":`Todas las tareas se encadenan en la misma sesión — el agente conserva todo el contexto, pero la sesión se alarga con el tiempo`,"koboCommand.prepAutoloopDesc":`Preparar tareas para modo auto-loop (atomicidad)`,"staleSessionBanner.title":`Auto-loop en curso`,"staleSessionBanner.message":`Estás viendo una sesión anterior — el agente está trabajando en la más reciente.`,"staleSessionBanner.staleTitle":`Sesión anterior`,"staleSessionBanner.staleMessage":`Estás viendo una sesión anterior — los mensajes que envíes irán a esta sesión, no a la más reciente.`,"staleSessionBanner.switchToCurrent":`Cambiar a la actual`,"network.login.title":`Acceso de red`,"network.login.description":`Este Kōbō requiere un token para controlarse desde la red. Pega el token que aparece en Ajustes en la máquina anfitriona.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Pega tu token`,"network.login.connect":`Conectar`,"network.login.invalid":`Token no válido`,"network.login.serverError":`Error del servidor — inténtalo de nuevo.`,"network.login.unreachable":`Kōbō no es accesible — comprueba tu conexión.`,"layout.toggleWorkspaces":`Mostrar/ocultar el panel de espacios`,"layout.togglePanel":`Mostrar/ocultar el panel lateral`,"unsaved.title":`¿Salir sin guardar?`,"unsaved.message":`Tienes cambios sin guardar. Salir de esta página los descarta.`,"unsaved.leave":`Salir`,"unsaved.stay":`Quedarme`},Nr={"model.tooltip":`Modèle utilisé par l’agent pour ce workspace`,"reasoning.tooltip":`Niveau de raisonnement utilisé par l’agent pour ce workspace`,"thinking.label":`Réflexion`,"thinking.noDetails":`L’agent réfléchit…`,"common.save":`Enregistrer`,"common.cancel":`Annuler`,"common.retry":`Réessayer`,"common.delete":`Supprimer`,"common.close":`Fermer`,"common.dismiss":`Ignorer`,"common.details":`Détails`,"common.ok":`OK`,"whatsNew.title":`Quoi de neuf`,"common.loading":`Chargement...`,"common.search":`Rechercher...`,"common.refresh":`Actualiser`,"common.copy":`Copier`,"common.copied":`Copié dans le presse-papiers`,"common.copyFailed":`Échec de la copie`,"common.add":`Ajouter`,"folderPicker.title":`Choisir un dossier`,"folderPicker.parent":`Dossier parent`,"folderPicker.empty":`Aucun sous-dossier`,"folderPicker.select":`Choisir ce dossier`,"common.start":`Démarrer`,"common.stop":`Arrêter`,"common.archive":`Archiver`,"common.unarchive":`Désarchiver`,"common.selectWorkspace":`Sélectionnez un espace de travail`,"common.noResults":`Aucun résultat pour « {query} »`,"common.send":`envoyer`,"common.newLine":`nouvelle ligne`,"common.history":`historique`,"common.justNow":`a l'instant`,"common.minutesAgo":`il y a {count}m`,"common.hoursAgo":`il y a {count}h`,"common.daysAgo":`il y a {count}j`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`Modèle le plus capable — succède à Opus 4.8, contexte 1M, adaptive thinking`,"model.mythos5Description":`Fable 5 sans classificateurs de sécurité — accès limité (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude choisit le modèle optimal`,"model.opus5Description":`Pour le coding agentique complexe et le travail en entreprise, contexte 1M`,"model.opus48Description":`Opus le plus capable — coding agentique long-horizon, contexte 1M par défaut, effort high par défaut`,"model.opus47ClassicDescription":`Dernier Opus, le plus capable`,"model.opus471mDescription":`Dernier Opus, contexte 1M`,"model.opusClassicDescription":`Le plus puissant`,"model.opus1mDescription":`Le plus puissant, contexte 1M`,"model.sonnet5Description":`Meilleure combinaison vitesse/intelligence, contexte 1M`,"model.sonnetClassicDescription":`Équilibré`,"model.sonnet1mDescription":`Équilibré, contexte 1M`,"model.haikuDescription":`Le plus rapide`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`Dernier modèle de codage agentique de pointe (nécessite une authentification ChatGPT)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Modèle de codage agentique équilibré pour un usage quotidien (nécessite une authentification ChatGPT)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Modèle de codage agentique rapide et économique (nécessite une authentification ChatGPT)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recommandé pour le code complexe (nécessite une authentification ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Repli par défaut — raisonnement solide, compatible avec une clé API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rapide et efficient — idéal pour les tâches réactives et les sous-agents`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimisé pour un usage professionnel et les agents longue durée`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modèle spécialisé code pour l'ingénierie logicielle complexe`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`aucun`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Laisse le moteur choisir`,"reasoning.minimalDescription":`Raisonnement le plus rapide et superficiel`,"reasoning.noneDescription":`Sans raisonnement supplémentaire`,"reasoning.lowDescription":`Plus rapide, moins profond`,"reasoning.mediumDescription":`Équilibré`,"reasoning.highDescription":`Plus de profondeur`,"reasoning.xhighDescription":`Profondeur étendue, tâches longues`,"reasoning.maxDescription":`Profondeur maximale`,"agentPermissionMode.label":`Mode de permission`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Strict (édits)`,"agentPermissionMode.interactive":`Interactif`,"agentPermissionMode.tooltip":`Comment l'agent gère les permissions d'outils. Plan : lecture seule, aucune écriture. Bypass : aucune demande. Strict : auto-accept des éditions de fichiers, respect des allow/deny pour le reste. Interactif : demande à l'utilisateur avant chaque outil via le panneau de permission.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop force un mode autre que Plan — Plan bloque les outils MCP et les éditions dont la boucle a besoin. Choisis Bypass, Strict ou Interactif.`,"agentPermissionMode.autoLoopLocked":`Verrouillé sur Bypass tant que l'auto-loop est activé — un autre mode bloquerait la boucle sur les demandes de permission. AskUserQuestion fonctionne toujours.`,"workspaceList.title":`Espaces de travail`,"workspaceList.a11y.groupToggle":`Groupe {group}, {count} workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Attention requise`,"workspaceList.running":`En cours`,"workspaceList.idle":`Inactif`,"workspaceList.archived":`Archivés`,"workspaceList.archivedToast":`« {name} » archivé`,"workspaceList.archivedUndo":`Annuler`,"workspaceList.unarchiveFailed":`Impossible de désarchiver ce workspace`,"workspaceList.noWorkspaces":`Aucun espace de travail`,"workspaceList.loadFailed":`Impossible de charger vos workspaces`,"workspaceList.loadFailedHint":`Il s’agit d’un échec de connexion, pas d’un compte vide.`,"workspaceList.footer":`{count} espace de travail | {count} espaces de travail`,"workspaceList.footerRunning":`{count} en cours`,"workspaceList.deleteDialog.title":`Supprimer l'espace de travail ?`,"workspaceList.deleteDialog.deleteLocal":`Supprimer la branche locale`,"workspaceList.deleteDialog.deleteRemote":`Supprimer la branche distante`,"workspaceList.deleteDialog.warning":`Attention : cette action est irréversible sur le dépôt distant.`,"workspaceList.deleteArchivedDialog.tooltip":`Supprimer tous les espaces de travail archivés`,"workspaceList.deleteArchivedDialog.title":`Supprimer tous les espaces archivés ?`,"workspaceList.deleteArchivedDialog.message":`Cela supprimera définitivement les {count} espaces de travail archivés. Cette action est irréversible.`,"workspacePage.selectWorkspace":`Sélectionnez un espace de travail pour commencer`,"workspacePage.commandPalettePlaceholder":`Rechercher une commande…`,"workspacePage.commandPaletteEmpty":`Aucune commande correspondante`,"workspacePage.commandFocusChat":`Placer le curseur dans le chat`,"workspacePage.commandSearchHistory":`Rechercher dans l'historique du workspace`,"workspacePage.commandTogglePanel":`Afficher ou masquer le panneau latéral`,"workspacePage.commandStartAgent":`Démarrer l'agent`,"workspacePage.commandStopAgent":`Arrêter l'agent`,"workspacePage.commandOpenSettings":`Ouvrir les réglages`,"workspacePage.commandOpenCreate":`Créer un workspace`,"workspacePage.commandOpenSearch":`Recherche globale`,"workspacePage.commandOpenHealth":`Page Santé`,"workspacePage.commandOpenChangelog":`Journal des versions`,"workspacePage.commandGroupWorkspaces":`Aller à un workspace`,"workspacePage.commandPaletteHint":`Palette de commandes`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ Nouvelle session`,"workspacePage.renameSession":`Renommer`,"workspacePage.renameSessionTitle":`Renommer la session`,"workspacePage.sessionNameLabel":`Nom de la session`,"workspacePage.sessionEndedNotice":`Cette session est terminée. Crée une nouvelle session pour continuer.`,"workspacePage.renameFailed":`Échec du renommage`,"workspacePage.copySessionId":`Copier l'ID de session`,"workspacePage.deleteSession":`Supprimer la session`,"workspacePage.deleteSessionTitle":`Supprimer la session ?`,"workspacePage.deleteSessionConfirm":`Cette action supprime définitivement cette session et son historique de conversation.`,"workspacePage.deleteSessionFailed":`Échec de la suppression de la session`,"workspacePage.noEngineSessionId":`Pas encore d'ID de session — l'agent n'a pas encore démarré cette session`,"workspacePage.createSessionFailed":`Échec de la création de la session`,"workspacePage.startFailed":`Échec du démarrage`,"workspacePage.stopFailed":`Échec de l'arrêt`,"workspacePage.interrupt":`Interrompre`,"workspacePage.interrupted":`Agent interrompu — en attente de votre prochain message`,"workspacePage.lastAgentEvent":`Dernier événement {when}`,"workspacePage.agentStopping":`Arrêt en cours…`,"workspacePage.agentNotRunning":`Aucun agent en cours — le statut est périmé`,"workspacePage.archivedBanner":`Workspace archivé — lecture seule`,"workspacePage.worktreePurgedBanner":`Worktree supprimé — historique conservé, restauration indisponible dans cette version`,"workspacePage.worktreePurgedTooltip":"Le dossier worktree a été supprimé du disque pour libérer de l'espace. L'historique des messages, sessions et métadonnées PR reste consultable ici, mais le répertoire de travail n'existe plus localement. Une future version de Kōbō pourra reconstruire le worktree à partir de la PR mergée — pour l'instant, recrée-le manuellement via `gh pr checkout` ou `git worktree add`.","workspacePage.pendingInitialPromptBanner":`Un prompt initial est en attente — l'agent ne l'a jamais reçu (le script de setup a planté ou le workspace n'a jamais été démarré). Cliquez sur Démarrer pour l'envoyer.`,"workspacePage.unarchived":`Workspace désarchivé`,"workspacePage.unarchiveFailed":`Échec du désarchivage`,"workspacePage.interruptFailed":`Échec de l'interruption`,"workspacePage.interruptHint":`Interrompre le tour en cours sans terminer la session.`,"workspacePage.interruptTooltip":`Interruption douce (comme Escape) — arrête le tool en cours mais garde la session active`,"workspacePage.pendingNextRun":`Appliqué au prochain démarrage`,"workspacePage.activeSessionModel":`En cours : {model}`,"workspacePage.activeSessionModelTooltip":`Modèle effectivement utilisé par la session sélectionnée`,"workspacePage.switchEngine":`Changer d’engine`,"workspacePage.switchEngineHint":`Continuer ce workspace avec un autre engine agent`,"workspacePage.moreActions":`Plus d'actions`,"workspacePage.switchEngineTitle":`Changer d’engine agent`,"workspacePage.switchEngineWarning":`L’agent actuel sera arrêté et une nouvelle session démarrera dans le même worktree.`,"workspacePage.engineLabel":`Engine`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Passation pour le nouvel engine`,"workspacePage.engineHandoffHint":`Relisez ou modifiez le contexte envoyé au nouvel agent.`,"workspacePage.confirmSwitchEngine":`Changer d’engine`,"workspacePage.switchEngineFailed":`Échec du changement d’engine`,"whip.dispatchFailed":`Impossible d'envoyer le message du fouet`,"whip.phrase1":`Plus vite, tocard !`,"whip.phrase2":`Accélère le rythme, tocard !`,"whip.phrase3":`Au travail, tocard !`,"whip.phrase4":`Montre-moi un peu de vitesse, tocard !`,"whip.phrase5":`Moins de réflexion, plus d'action, tocard !`,"search.title":`Recherche`,"search.tooltip":`Rechercher dans l'historique des agents`,"search.placeholder":`Rechercher dans tous les messages agents…`,"search.includeArchived":`Inclure les workspaces archivés`,"search.loading":`Recherche en cours…`,"search.noResults":`Aucun résultat`,"search.error":`Échec de la recherche : {message}`,"search.resultCount":`{n} résultat(s)`,"search.eventType.userMessage":`Vous`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Aucune activité`,"activityFeed.emptyHint":`Démarrez un espace de travail pour voir la sortie de l'agent ici`,"activityFeed.initialPrompt":`Prompt initial`,"activityFeed.you":`Vous`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Aller au message précédent`,"activityFeed.scrollToBottom":`Défiler vers le bas`,"activityFeed.sendAnswers":`Envoyer les réponses`,"agentBusy.banner":`L'agent est occupé`,"agentBusy.subagentsRunning":`1 sub-agent en cours | {n} sub-agents en cours`,"agentBusy.viewSubagents":`Voir les sub-agents`,"agentBusy.pendingMessage":`En attente — l'agent est occupé`,"terminal.title":`Terminal`,"terminal.open":`Ouvrir le terminal`,"terminal.close":`Fermer le terminal`,"terminal.noWorkspace":`Sélectionnez un espace de travail`,"terminal.noWorktree":`Worktree pas encore créé`,"terminal.error":`Erreur du terminal`,"terminal.exited":`Terminal fermé`,"terminal.disconnected":`Connexion perdue`,"terminal.reconnecting":`Reconnexion… (essai {attempt} sur {max})`,"terminal.reconnect":`Reconnecter`,"chatInput.placeholder":`Message... (/ pour les skills)`,"chatInput.fileSearchHint":`chercher un fichier`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Joindre une image`,"chatInput.queueBanner":`Message en file d'attente — sera envoyé quand l'agent aura terminé`,"chatInput.forceQueue":`forcer l’envoi`,"chatInput.searchHistory":`rechercher`,"chatInput.commandPalette":`commandes`,"chatInput.shortcuts":`Raccourcis clavier`,"chatInput.cancelQueue":`Annuler la file d'attente`,"chatInput.autoLoopBanner":`L'auto-loop tourne — arrête-le pour envoyer un message`,"chatInput.awaitingUserBanner":`L'agent attend ta réponse ci-dessus — réponds via le panneau de question`,"chatInput.autoLoopStop":`Arrêter`,"koboCommand.checkProgressDesc":`Vérifier la progression des tâches et critères d'acceptation`,"chatInput.uploading":`Envoi en cours...`,"voice.title":`Transcription vocale`,"voice.enabled":`Activer la transcription vocale locale`,"voice.pttKey":`Touche push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espace`,"voice.language":`Langue (auto ou code)`,"voice.model":`Modèle actif`,"voice.commandPath":`Chemin du binaire Whisper (optionnel)`,"voice.ffmpegPath":`Chemin du binaire ffmpeg (optionnel)`,"voice.temperature":`Température`,"voice.temperatureHint":`Plus bas = plus déterministe ; plus haut = plus flexible mais moins stable.`,"voice.initialPrompt":`Prompt initial (optionnel)`,"voice.initialPromptHint":`Contexte optionnel pour aider Whisper sur les noms, acronymes ou jargon métier.`,"voice.translateToEnglish":`Traduire vers anglais`,"voice.translateToEnglishHint":`Si activé, la parole non anglaise est traduite en anglais au lieu d’être transcrite telle quelle.`,"voice.suppressNst":`Supprimer les tokens non vocaux`,"voice.suppressNstHint":`Essaie de réduire les artefacts non vocaux dans la transcription.`,"voice.installLink":`Installer whisper.cpp`,"voice.installGuideTitle":`Guide d'installation`,"voice.installGuideIntro":`Installe whisper.cpp et ffmpeg, puis renseigne les chemins binaires ci-dessous si nécessaire.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Après le build CMake, le binaire Whisper est généralement ici : whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Ensuite, renseigne "Chemin du binaire Whisper" et "Chemin du binaire ffmpeg" dans cette section (ou laisse vide si c’est dans le PATH).`,"voice.noneModel":`Aucun modèle actif`,"voice.notInstalled":`non installé`,"voice.download":`Télécharger`,"voice.delete":`Supprimer`,"voice.holdToTalk":`Maintiens pour parler`,"voice.recording":`Enregistrement...`,"voice.transcribing":`Transcription...`,"voice.notSupported":`L'enregistrement vocal n'est pas supporté par ce navigateur`,"voice.errorMicPermission":`Permission micro refusée`,"voice.errorTranscription":`La transcription vocale a échoué`,"voice.downloadFailed":`Échec du téléchargement du modèle`,"voice.deleteFailed":`Échec de la suppression du modèle`,"voice.errorDisabled":`La transcription vocale est désactivée dans les réglages`,"voice.errorModelMissing":`Aucun modèle vocal actif n'est configuré`,"voice.errorModelNotInstalled":`Le modèle vocal actif n'est pas installé`,"voice.errorAudioInvalid":`La capture audio est invalide ou vide`,"voice.errorLanguageInvalid":`La configuration de langue vocale est invalide`,"voice.errorRuntimeMissing":`Le runtime Whisper n'est pas installé ou pas dans le PATH`,"voice.maxDurationReached":`Durée maximale d'enregistrement atteinte`,"voice.runtimeReady":`Runtime prêt : {command}`,"voice.runtimeMissing":`Runtime manquant : {command}`,"voice.ffmpegReady":`ffmpeg prêt`,"voice.ffmpegMissing":`ffmpeg manquant`,"voice.sectionRuntime":`État du runtime`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Modèles Whisper`,"voice.sectionAdvanced":`Options avancées`,"voice.sectionBehavior":`Comportement de la transcription`,"voice.sectionBinaries":`Chemins des binaires`,"voice.downloadModels":`Télécharger un modèle`,"voice.cancelFailed":`Échec de l'annulation du téléchargement`,"createPage.title":`Créer un workspace`,"createPage.subtitle":`Décrivez la mission, choisissez un projet, puis configurez l’agent.`,"createPage.sectionMission":`Mission`,"createPage.sectionMissionHint":`Donnez à l’agent un objectif clair et le contexte nécessaire pour le réaliser.`,"createPage.workspaceNameLabel":`Nom du workspace`,"createPage.descriptionLabel":`Description de la mission`,"createPage.sources":`Sources facultatives`,"createPage.sectionGit":`Projet Git`,"createPage.sectionGitHint":`Choisissez le dépôt, la branche de départ et le mode de worktree.`,"createPage.worktreeMode":`Mode de worktree`,"createPage.worktreeNew":`Nouveau worktree isolé`,"createPage.worktreeExisting":`Réutiliser un worktree existant`,"createPage.projectLabel":`Projet`,"createPage.sourceBranch":`Branche de départ`,"createPage.workingBranchPreview":`Aperçu de la branche de travail`,"createPage.branchNamePending":`nom-du-workspace`,"createPage.sectionAgent":`Agent`,"createPage.sectionAgentHint":`Vérifiez les réglages d’exécution ou activez l’automatisation.`,"createPage.configureAgent":`Configurer l’agent`,"createPage.advancedOptions":`Options avancées`,"createPage.keyboardHint":`Appuyez sur Ctrl/Cmd + Entrée pour créer le workspace.`,"createPage.createWorkspace":`Créer le workspace`,"createPage.notionEnabled":`Notion activé`,"createPage.importNotion":`Importer depuis Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL doit commencer par https://www.notion.so/ ou https://app.notion.com/`,"createPage.notionAutoExtract":`Les sous-tâches et critères d'acceptation seront extraits automatiquement.`,"createPage.notionPanelChoiceLabel":`Cette URL pointe vers une sous-page (?p=). Sur laquelle veux-tu travailler ?`,"createPage.notionPanelOption":`Sous-page (panel)`,"createPage.notionPanelOptionDesc":`La page que tu consultais — recommandé`,"createPage.notionParentOption":`Page parente`,"createPage.notionParentOptionDesc":`L'epic / database qui la contient`,"createPage.importSentry":`Importer Sentry`,"createPage.sentryEnabled":`Sentry activé`,"createPage.sentryPlaceholder":`https://votre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL doit pointer vers une issue Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue Sentry sera importée automatiquement`,"createPage.sentryExtractHint":`Kobo va extraire l'issue et l'écrire dans .ai/thoughts/`,"createPage.workspaceName":`Nom de l'espace de travail (par défaut le titre de la page Notion)`,"createPage.workspaceNamePlaceholder":`Nom de l'espace de travail...`,"createPage.instructions":`Instructions supplémentaires (optionnel)...`,"createPage.instructionsPlaceholder":`Décrivez la tâche...`,"createPage.tasks":`Tâches ({count})`,"createPage.addTask":`Ajouter une tâche...`,"createPage.acceptanceCriteria":`Critères d'acceptation ({count})`,"createPage.addCriterion":`Ajouter un critère...`,"createPage.projectPath":`Chemin du projet`,"createPage.branchType":`Type de branche`,"createPage.branch":`Branche`,"createPage.noBranches":`Aucune branche trouvée`,"createPage.enterPath":`Entrez le chemin du projet`,"createPage.skipSetupScript":`Ignorer le script de setup`,"createPage.worktreePickerLabel":`Worktree existant`,"createPage.noOrphanWorktrees":`Aucun worktree orphelin pour ce projet`,"createPage.pickWorktreeRequired":`Sélectionne un worktree à réutiliser`,"createPage.notionExtractHint":`Les sous-tâches et critères d'acceptation seront extraits de la page Notion.`,"createPage.errorCreating":`Erreur lors de la création de l'espace de travail.`,"createPage.branchAdjusted":"Branche déjà existante — création de `{branch}` à la place. Le dossier worktree correspondant utilise le même suffixe.","createPage.localSourceFallback":`Workspace créé à partir de la branche locale (origin injoignable) — la base peut être périmée.`,"createPage.validationNotionUrl":`Veuillez coller une URL Notion valide (https://www.notion.so/... ou https://app.notion.com/...).`,"createPage.validationDescription":`Veuillez décrire la tâche.`,"createPage.validationName":`Veuillez fournir un nom d'espace de travail.`,"createPage.validationPath":`Veuillez entrer le chemin du projet.`,"createPage.validationBranch":`Veuillez sélectionner une branche.`,"createPage.validationFocusHint":`Le champ à corriger est mis en évidence ci-dessous.`,"createPage.progress.validate":`Validation de la demande…`,"createPage.progress.fetch-source-branch":`Récupération de la branche source depuis origin…`,"createPage.progress.inspect-worktree":`Inspection du worktree existant…`,"createPage.progress.extract-notion":`Extraction de la page Notion…`,"createPage.progress.extract-sentry":`Extraction de l’issue Sentry…`,"createPage.progress.create-record":`Création du workspace…`,"createPage.progress.create-tasks":`Création des tâches et critères d’acceptation…`,"createPage.progress.create-worktree":`Création du worktree git…`,"createPage.progress.write-conventions":`Écriture des conventions git…`,"createPage.progress.write-context-files":`Écriture des fichiers de contexte…`,"createPage.progress.build-prompt":`Construction du prompt initial…`,"createPage.progress.setup-script":`Exécution de votre script d’installation…`,"createPage.progress.start-agent":`Démarrage de l’agent…`,"createPage.progress.rollback":`Annulation de la création échouée…`,"createPage.progress.done":`Terminé`,"createPage.progress.step":`Étape {index} sur {total}`,"createPage.errorAtStep":`La création a échoué à l’étape « {step} » : {message}`,"createPage.override.title":`Deux de vos choix ont été remplacés`,"createPage.override.setup-script-forced":`Script d’installation ignoré : le relancer sur un worktree que vous avez déjà préparé pourrait en détruire le contenu.`,"createPage.override.permission-mode-downgraded":`Mode de permission passé de Plan à Bypass : une boucle autonome ne peut pas tourner en Plan, qui bloque les outils et les modifications.`,"settings.title":`Paramètres`,"settings.language":`Langue`,"settings.projectColor":`Couleur`,"settings.projectColorClear":`Effacer`,"settings.projectColorDefault":`Par défaut (gris)`,"settings.workspaceListSection":`Liste des workspaces`,"settings.flattenWorkspaceList":`Afficher en liste plate`,"settings.flattenWorkspaceListHint":`Affiche tous les espaces de travail en liste plate avec un badge projet, plutôt que regroupés par projet.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personnalisé`,"settings.skillSuite.superpowersHint":`Workflow opiné TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Les deux suites s'empilent — superpowers pour la méthodo (brainstorm / TDD / plans / review au niveau principes), gstack pour les workflows concrets (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Framework agentique d'affaan-m — agents, skills, rules et hooks pour planifier, tester, implémenter, relire et mémoriser (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Les trois suites s'empilent — superpowers pour la méthodo, gstack pour les workflows concrets, ECC pour des passes de relecture/implémentation multi-agents structurées.`,"settings.skillSuite.customHint":`Compose les cinq prompts ci-dessous à partir des templates de ton choix, puis modifie-les librement.`,"settings.skillSuite.reloadDefaults":`Recharger les valeurs par défaut`,"settings.skillSuite.reloadDefaultsConfirm":`Remplacer les cinq prompts personnalisés par les valeurs agnostiques par défaut ?`,"settings.skillSuite.customPrompts":`Prompts personnalisés`,"settings.skillSuite.agnostic":`Base agnostique`,"settings.skillSuite.importPrompt":`Importer un template`,"settings.skillSuite.imported":`Template importé. Tu peux maintenant le modifier.`,"settings.skillSuite.importFailed":`Impossible d'importer le template`,"settings.skillSuite.reviewTemplate":`Template de relecture`,"settings.skillSuite.autoLoopReviewGate":`Gate de relecture auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instruction phase brainstorming`,"settings.global":`Général`,"settings.projects":`Projets`,"settings.globalSettings":`Paramètres généraux`,"settings.defaultModel":`Modèle par défaut`,"settings.defaultModelClaude":`Modèle par défaut (Claude Code)`,"settings.defaultModelCodex":`Modèle par défaut (OpenAI Codex)`,"settings.agentPermissions":`Permissions de l'agent`,"settings.skipPermissions":`Ignorer les invites de permission (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attention : désactiver cette option entraînera le refus automatique de toutes les permissions d'outils (Write, Edit, Bash...) en mode headless. L'agent ne pourra que lire.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Notification navigateur quand l'agent termine`,"settings.audioNotifications":`Notification sonore quand l'agent termine`,"settings.enableBrowserNotifications":`Activer les notifications navigateur`,"settings.testBrowserNotification":`Tester la notification`,"settings.browserNotificationGranted":`Notifications du navigateur autorisées`,"settings.browserNotificationDenied":`Notifications du navigateur bloquées`,"settings.browserNotificationAsk":`Autorisation du navigateur requise`,"settings.browserNotificationUnsupported":`Notifications du navigateur indisponibles`,"settings.browserNotificationPermissionNeeded":`Autorisez les notifications du navigateur pour envoyer un test.`,"settings.browserNotificationTestTitle":`Test de notification Kōbō`,"settings.browserNotificationTestBody":`Les notifications du navigateur fonctionnent.`,"settings.enableAudio":`Activer l'audio`,"settings.notificationSound":`Son de notification`,"settings.notificationSoundHint":`Joué quand l'agent termine ou demande une permission.`,"settings.questionSound":`Son des questions`,"settings.questionSoundHint":`Joué uniquement quand l'agent te pose une question.`,"settings.workspaceCreatedSound":`Son de création d'espace de travail`,"settings.workspaceCreatedSoundHint":`Joué après la création d'un espace de travail.`,"settings.notificationSoundPreview":`Écouter`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Erreurs de l’agent`,"settings.agentErrorSoundHint":`Joué pour les quotas, rate limits et erreurs de l’agent.`,"settings.notificationSoundBasic":`Notification basique`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Travail`,"settings.notificationSoundTravailTermine":`Travail terminé`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Ça va péter`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR et CI`,"settings.soundGeneral":`Son général`,"settings.soundNone":`Aucun son`,"settings.prCiFailedSound":`CI en échec`,"settings.prCiRecoveredSound":`CI rétablie`,"settings.prChangesRequestedSound":`Modifications demandées`,"settings.prApprovedSound":`PR approuvée`,"settings.prMergeConflictSound":`Conflit de merge`,"settings.prReadyToMergeSound":`Prête à merger`,"settings.prMergedSound":`PR mergée`,"settings.prCiFailedSoundHint":`Joué quand la CI passe en échec.`,"settings.prCiRecoveredSoundHint":`Joué quand la CI se rétablit après un échec.`,"settings.prChangesRequestedSoundHint":`Joué quand une review demande des modifications.`,"settings.prApprovedSoundHint":`Joué quand la pull request est approuvée.`,"settings.prMergeConflictSoundHint":`Joué quand un conflit de merge est détecté.`,"settings.prReadyToMergeSoundHint":`Joué quand la pull request devient prête à merger.`,"settings.prMergedSoundHint":`Joué quand la pull request est mergée.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Mode de permission par défaut`,"settings.defaultPermissionModeClaude":`Mode de permission par défaut (Claude Code)`,"settings.defaultPermissionModeCodex":`Mode de permission par défaut (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode appliqué à la création d'un workspace. Plan = lecture seule, Bypass = sans prompt, Strict = auto-accept des éditions avec allow-list, Interactif = demande avant chaque outil.`,"settings.activityFeed":`Flux d'activité`,"settings.verboseMessages":`Afficher les messages système détaillés (task_progress, task_started)`,"settings.showThinkingBlocks":`Afficher les blocs de réflexion des agents`,"settings.whipSettings":`Fouet`,"settings.whipSettingsHint":`Configurez le raccourci et le volume du fouet optionnel.`,"settings.whipEnabled":`Activer le fouet`,"settings.whipEnabledHint":`Affiche le fouet interactif dans les workspaces actifs compatibles.`,"settings.whipVolume":`Volume du fouet`,"settings.whipVolumeMasterAudioDisabled":`L’audio principal est désactivé. Activez les notifications audio pour régler le volume du fouet ; la valeur enregistrée est conservée.`,"whip.overlayLabel":`Fouet interactif`,"whip.overlayInstructions":`Déplacez le pointeur pour contrôler le fouet. Appuyez sur Entrée ou Espace pour le faire claquer. Appuyez sur Échap pour fermer.`,"settings.whipShortcut":`Raccourci du fouet`,"settings.whipShortcutHint":`Cliquez, puis appuyez sur le raccourci à utiliser.`,"settings.whipShortcutRecording":`Appuyez sur un raccourci…`,"settings.whipShortcutButtonLabel":`Raccourci du fouet : {shortcut}`,"settings.whipShortcutRecordingLabel":`Enregistrement du raccourci du fouet. Appuyez sur un raccourci…`,"settings.whipShortcutReset":`Réinitialiser le raccourci`,"settings.whipShortcutReserved":`Ce raccourci est réservé par le navigateur.`,"settings.testIntegration":`Tester la connexion`,"pwa.offline":`Vous êtes hors ligne. Le chat et les agents nécessitent le serveur Kōbō.`,"pwa.reconnecting":`Reconnexion au serveur Kōbō…`,"pwa.installReady":`Installez Kōbō comme application.`,"pwa.install":`Installer`,"pwa.ignore":`Ignorer`,"pwa.updateReady":`Une mise à jour de Kōbō est disponible.`,"pwa.reload":`Recharger`,"chat.searchWorkspaceHistory":`Rechercher dans l’historique du workspace`,"chat.historySearch.user":`Vous`,"chat.historySearch.agent":`Agent`,"chat.openInGitDiff":`Ouvrir dans le diff Git`,"timeline.title":`Chronologie des sessions`,"timeline.export":`Exporter le diagnostic`,"timeline.unnamed":`Session agent`,"timeline.tools":`{count} outils`,"timeline.errors":`{count} erreurs`,"settings.availableVariables":`Variables disponibles dans les modèles de prompt`,"settings.prPromptTemplate":`Modèle de prompt PR`,"settings.prPromptPlaceholder":`Instructions pour l'agent lors de la création de PR GitHub...`,"settings.prPromptHint":`Utilisez les variables listées ci-dessus (syntaxe doubles accolades).`,"settings.reviewPromptTemplate":`Modèle de prompt de review`,"settings.reviewPromptPlaceholder":`Instructions pour l'agent lors de la review des changes de la branche...`,"settings.ciFixPromptTemplate":`Modèle de prompt « Fix CI »`,"settings.ciFixPromptHint":`Envoyé à l'agent quand un workspace voit sa CI échouer. Variables (syntaxe double-accolades) : pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Demande à l'agent de diagnostiquer et de corriger les jobs CI en échec...`,"settings.finalizationPromptTemplate":`Prompt de finalisation de l'auto-loop`,"settings.finalizationPromptHint":`Prompt par défaut pour la dernière itération de l'auto-loop (contrôles qualité finaux). Utilisé quand un projet laisse son propre prompt de finalisation vide.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Prompt initial Notion`,"settings.notionInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a un ticket Notion. Variables : {variables}.`,"settings.notionInitialPrompt.project":`Prompt initial Notion (override)`,"settings.sentryInitialPrompt":`Prompt initial Sentry`,"settings.sentryInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a une issue Sentry. Variables : {variables}.`,"settings.sentryInitialPrompt.project":`Prompt initial Sentry (override)`,"settings.initialPrompt.inheritHint":`Laisser vide pour hériter. Saisir un caractère d'espacement pour désactiver l'injection à ce niveau.`,"settings.resetToDefault":`Réinitialiser`,"settings.resetFailed":`Échec du chargement de la valeur par défaut`,"settings.sentryIntegration":`Intégration Sentry`,"settings.var.prNumber":`Numéro de PR (ex : 42)`,"settings.var.prUrl":`URL complète de la PR créée`,"settings.var.branchName":`Nom de la branche de travail`,"settings.var.sourceBranch":`Branche source ciblée par la PR`,"settings.var.workspaceName":`Nom du workspace`,"settings.var.projectName":`Dernier segment du chemin du projet`,"settings.var.notionUrl":`URL Notion si définie, vide sinon`,"settings.var.commits":`Liste à puces des commits entre source et head`,"settings.var.diffStats":`Résumé shortstat Git (fichiers, insertions, suppressions)`,"settings.var.tasks":`Tâches classiques en liste à cocher`,"settings.var.acceptanceCriteria":`Critères d'acceptation en liste à cocher`,"settings.gitConventions":`Conventions Git (global)`,"settings.gitConventionsPlaceholder":`# Conventions Git...`,"settings.gitConventionsHint":`Ces conventions sont écrites dans .ai/.git-conventions.md pour chaque nouvel espace de travail et doivent être respectées par l'agent avant toute opération Git. Remplacées par les conventions par projet si définies.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de cleanup`,"settings.archiveScript":`Script d'archivage`,"settings.archiveScriptHint":`Script shell exécuté côté serveur dans le worktree quand un workspace est archivé. Laisser vide pour désactiver.`,"settings.archiveScriptPlaceholder":`ex. nettoyer des conteneurs, libérer de l'espace disque…`,"settings.changeSourceBranchScript":`Script de changement de branche source`,"settings.changeSourceBranchScript.help":`Remplace le cherry-pick intégré quand non vide. Le script possède git, base de PR, force-push et conflits ; Kōbō refuse seulement si l'agent tourne et met à jour la métadonnée source à exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nouvelle branche source choisie dans le dialogue
|
|
50
|
+
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Opción B — Tomar la propiedad (más simple, pierde la huella "creado por root en el contenedor" pero rara vez importa):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Consejo: puedes ejecutar estos comandos directamente sobre la raíz de tus worktrees (ej. `~/.worktrees/`) para cubrir todos los workspaces existentes Y futuros de una sola vez. Una vez hecho, el borrado de Kōbō funcionará sin errores de permisos.","contextMenu.runSetup":`Ejecutar script de setup`,"contextMenu.exportEvents":`Exportar eventos (CSV)`,"contextMenu.dismissChangesRequested":`Marcar «Cambios solicitados» como visto`,"contextMenu.dismissCiFailure":`Marcar «CI en error» como visto`,"contextMenu.restoreChangesRequested":`Marcar «Cambios solicitados» como no visto`,"contextMenu.restoreCiFailure":`Marcar «CI en error» como no visto`,"contextMenu.exportingEvents":`Preparando la exportación…`,"contextMenu.exportEventsError":`Error al exportar los eventos`,"contextMenu.openNotion":`Abrir en Notion`,"contextMenu.openSentry":`Abrir en Sentry`,"contextMenu.openPr":`Abrir PR`,"contextMenu.ignorePrWatch":`Ignorar comprobaciones de PR`,"contextMenu.resumePrWatch":`Reanudar comprobaciones de PR`,"contextMenu.prWatchToggleFailed":`Error al actualizar las comprobaciones de PR`,"workspace.favorite":`Marcar como favorito`,"workspace.unfavorite":`Quitar de favoritos`,"workspace.showFavoritesOnly":`Mostrar solo favoritos`,"workspace.searchArchivedToggle":`Buscar también en workspaces archivados`,"workspace.descriptionPlaceholder":`Añadir una breve descripción`,"workspace.descriptionDialogHint":`Texto sin formato, máximo 200 caracteres. Dejar vacío para borrar.`,"workspace.descriptionTooLong":`La descripción debe tener 200 caracteres o menos.`,"workspace.descriptionSaveFailed":`No se pudo guardar la descripción.`,"workspace.agentDescriptionTooltip":`Estado en vivo mantenido por el agente`,"mcp.tool.setWorkspaceDescription":`Establece la breve descripción del workspace (≤ 200 caracteres).`,"tags.manage":`Gestionar etiquetas`,"tags.manageTitle":`Gestionar etiquetas del workspace`,"tags.noTagsDefined":`Sin etiquetas. Añádelas en Ajustes > Global > Etiquetas.`,"tags.orphanedHint":`{count} etiqueta(s) ya no están en el catálogo global. Desmárcalas para quitarlas.`,"settings.tagsTitle":`Etiquetas de workspace`,"settings.tagsHint":`Define las etiquetas asignables a los workspaces. Escribe para añadir, clic en la cruz para quitar.`,"settings.tagsLabel":`Etiquetas disponibles`,"settings.branchPrefixesTitle":`Prefijos de rama`,"settings.branchPrefixesHint":`Gestiona los prefijos de rama de Git disponibles en la página de creación de workspaces. El primero se preselecciona por defecto.`,"settings.branchPrefixesEmpty":`No hay ningún prefijo de rama definido. Añade al menos uno abajo.`,"settings.branchPrefixesAddLabel":`Nuevo prefijo`,"settings.branchPrefixesEditHint":`Haz clic para renombrar`,"settings.branchPrefixesMoveUp":`Subir`,"settings.branchPrefixesMoveDown":`Bajar`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Elige dónde se crean los worktrees de nuevos workspaces. Las rutas relativas se resuelven desde el proyecto; se admiten rutas absolutas Linux/macOS y Windows, $HOME, ~ y %USERPROFILE%.`,"settings.worktreesPathLabel":`Ruta de worktrees`,"settings.worktreesPathRequired":`La ruta de worktrees es obligatoria.`,"settings.worktreesPrefixByProject":`Prefijar los worktrees con el nombre del proyecto`,"settings.worktreesPrefixByProjectHint":`Coloca cada worktree en un subdirectorio con el nombre del proyecto para evitar colisiones cuando varios proyectos comparten la misma raíz.`,"settings.shareTitle":`Compartir configuración`,"settings.shareHint":`Exporta tus ajustes, plantillas y etiquetas en un bundle JSON. Las claves MCP no se incluyen por seguridad.`,"settings.exportConfig":`Exportar`,"settings.importConfig":`Importar`,"settings.exportSuccess":`Configuración exportada`,"settings.importSuccess":`Configuración importada`,"settings.importConfirmTitle":`Importar configuración`,"settings.importConfirmMessage":`Esto reemplazará tus ajustes, plantillas y etiquetas actuales. Las claves MCP se conservan. ¿Continuar?`,"settings.network.title":`Acceso de red`,"settings.network.hint":`Controla Kōbō desde otro dispositivo de tu LAN de confianza. Off = solo localhost. On = accesible en tu red, protegido por un token. Reinicia Kōbō tras cambiar.`,"settings.network.enable":`Activar acceso de red`,"settings.network.behindProxy":`Detrás de un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ya no puede distinguir tu propia máquina de una solicitud reenviada — incluso localhost necesitará el token a partir de ahora. Actívalo solo si un reverse proxy (Traefik, nginx, Caddy…) está delante de Kōbō.`,"settings.network.restartRequired":`Reinicia Kōbō para aplicar la nueva dirección de bind.`,"settings.network.token":`Token de acceso`,"settings.network.copy":`Copiar`,"settings.network.copied":`Copiado`,"settings.network.regenerate":`Regenerar`,"settings.network.regenerateConfirm":`¿Regenerar el token? Los dispositivos conectados necesitarán el nuevo token.`,"settings.network.urls":`URLs de LAN`,"settings.network.scan":`Escanea para conectar`,"settings.network.noUrls":`No se detectó ninguna dirección LAN.`,"settings.network.loadFailed":`No se pudieron cargar los ajustes de acceso de red.`,"settings.network.updateFailed":`No se pudieron actualizar los ajustes de acceso de red.`,"settings.unsavedChanges.title":`Cambios sin guardar`,"settings.unsavedChanges.message":`Este proyecto tiene cambios sin guardar. Cambiar de proyecto los descartará.`,"settings.unsavedChanges.discard":`Descartar y cambiar`,"settings.unsavedChanges.cancel":`Cancelar`,"settings.loadFailed":`No se pudieron cargar los ajustes`,"settings.loadFailedHint":`Guardar está desactivado: el formulario muestra valores por defecto y escribirlos sobrescribiría tu configuración real.`,"health.title":`Salud`,"health.tooltip":`Estado del sistema`,"changelog.title":`Changelog`,"changelog.tooltip":`Novedades de Kōbō`,"changelog.empty":`Ningún changelog disponible.`,"changelog.current":`actual`,"changelog.currentVersion":`Versión actual: v{version}`,"health.envTitle":`Entorno`,"health.version":`Versión`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de datos`,"health.dbPath":`Ruta`,"health.dbSize":`Tamaño`,"health.schemaVersion":`Versión del esquema`,"health.settingsSchemaVersion":`Esquema de ajustes`,"health.runtimesTitle":`Motores de agente`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude no encontrado en PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binario codex no resoluble`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`No se encontró ni gh ni glab — pull requests y vigilancia de CI no disponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} en total, {archived} archivados`,"health.worktreesMissing":`{count} worktree(s) faltan en el disco`,"health.sessionsTitle":`Sesiones de agente`,"health.sessionsOrphaned":`{n} sesión/sesiones huérfana(s) en ejecución`,"health.integrationsTitle":`Integraciones`,"health.integrationConfigured":`configurada`,"health.integrationMissing":`sin configurar`,"health.integrationDisabled":`desactivada`,"settings.integrationEnabled":`Activar integración`,"health.activeTitle":`Estado activo`,"health.activeQuotaBackoffs":`Quota backoffs pendientes`,"health.activeWakeups":`Despertares programados`,"health.activeAutoLoop":`Auto-loop en ejecución`,"health.activeAgentSessions":`Sesiones de agente activas`,"health.activeDevServers":`Servidores de desarrollo activos`,"health.noneActive":`Ninguno.`,"health.quotaResumeAt":`reanuda a las {time}`,"health.wakeupAt":`despierta a las {time}`,"health.startedAgo":`iniciada hace {time}`,"health.autoLoopReady":`listo, iterando`,"health.autoLoopGrooming":`grooming en curso`,"session.started":`Sesión iniciada`,"session.ended":`Sesión finalizada`,"session.compacted":`Contexto compactado`,"session.endedCompleted":`Turno finalizado: envía un mensaje para continuar`,"session.endedKilled":`Sesión detenida`,"session.endedError":`La sesión terminó con un error`,"session.endedWatchdog":`Sesión cerrada a la fuerza tras un periodo de inactividad`,"tool.running":`Ejecutando...`,"activity.raw_lines":`Líneas de salida brutas ({n})`,"activity.loading_older":`Cargando mensajes anteriores…`,"activity.compacting":`Compactando el contexto…`,"activity.prev_user_message":`Mensaje anterior del usuario`,"activity.scroll_to_bottom":`Desplazar al final`,"activity.empty":`Nada todavía`,"activity.emptyHint":`La salida del agente aparecerá aquí en cuanto arranque una sesión.`,"activity.a11y.region":`Anuncios de actividad del agente`,"activity.a11y.agentSaid":`Agente: {text}`,"activity.a11y.toolStarted":`Herramienta {name} iniciada`,"activity.a11y.toolFinished":`Herramienta {name} finalizada`,"activity.a11y.toolFailed":`Herramienta {name} falló`,"chat.systemPrompt":`Prompt del sistema`,"chat.agent":`Agente`,"chat.cleanupScript":`Script de limpieza`,"chat.archiveScript":`Script de archivado`,"chat.setupScript":`Script de setup`,"chat.scriptDone":`Hecho`,"chat.scriptComplete":`[{phase}] Completado`,"chat.scriptError":`[{phase}] Error: {message}`,"chat.unknownError":`desconocido`,"chat.you":`Tú`,"chat.session":`Sesión`,"chat.nActions":`{n} acción | {n} acciones`,"chat.lastUpdatedAt":`Última actualización a las {time}`,"chat.scrollToTurnTop":`Desplazar al inicio del mensaje`,"migration.backing_up":`Haciendo copia de seguridad de la base de datos…`,"migration.running":`Migrando datos del agente — {processed}/{total}`,"migration.error":`La migración falló`,"migration.backup_location":`Se guardó una copia de seguridad en {path}. Reinicia Kōbō para reintentar.`,"migration.retry":`Reinicia Kōbō para reintentar.`,"engine.select":`Motor`,"engine.model":`Modelo`,"engine.effort":`Esfuerzo de razonamiento`,"wakeup.scheduledIn":`Próximo despertar en {n}s`,"wakeup.scheduledAt":`Próximo despertar a las {time}`,"wakeup.firing":`Despertando...`,"wakeup.reason":`Razón: {reason}`,"wakeup.cancel":`Cancelar este despertar`,"wakeup.pendingIndicator":`Despertar programado`,"cron.pendingIndicator":`{n} cron(s) programado(s)`,"schedule.tabLabel":`Programación`,"schedule.panelTitle":`Automatización`,"schedule.panelDescription":`Despertar este workspace más tarde o ejecutar instrucciones según una programación.`,"schedule.activeTitle":`Programaciones activas`,"schedule.emptyTitle":`Nada programado`,"schedule.emptyDescription":`Crea un wakeup puntual o una tarea recurrente abajo.`,"schedule.cancelWakeup":`Cancelar este wakeup`,"schedule.cancelCron":`Eliminar esta tarea recurrente`,"schedule.createTitle":`Crear una programación`,"schedule.createDescription":`Elige cuándo y cómo debe ejecutarse el agente.`,"schedule.typeWakeup":`Wakeup puntual`,"schedule.typeRecurring":`Tarea recurrente`,"schedule.wakeupDescription":`Ejecutar el prompt una vez después de un retraso.`,"schedule.cronDescription":`Ejecutar el prompt periódicamente con una frecuencia fija.`,"schedule.promptHint":`Instrucciones que se enviarán al agente`,"schedule.frequencyTitle":`Frecuencia`,"schedule.advancedDescription":`Usar una expresión cron sin procesar`,"schedule.cronExpressionLabel":`Expresión cron`,"schedule.sessionModeTitle":`Sesión de ejecución`,"schedule.modeResume":`Reanudar sesión`,"schedule.oneShotHint":`Eliminar esta programación después de su primera ejecución.`,"schedule.wakeupTitle":`Wakeup pendiente`,"schedule.cronsTitle":`Programaciones recurrentes`,"schedule.noWakeup":`Sin wakeup programado`,"schedule.noCrons":`Sin cron programado`,"schedule.nextFireAt":`próximo a las {time}`,"schedule.lastFiredAt":`último hace {time}`,"schedule.addCronTitle":`Añadir una tarea recurrente`,"schedule.addWakeupTitle":`Programar un wakeup`,"schedule.every":`Cada`,"schedule.unitMinutes":`minutos`,"schedule.unitHours":`horas`,"schedule.unitDays":`días`,"schedule.daysDriftWarning":`El intervalo puede reducirse a 1 día a fin de mes (limitación de cron).`,"schedule.advancedExpression":`Expresión avanzada (opcional)`,"schedule.advancedHint":`Cron sin procesar (p. ej. */15 * * * *) o {'@'}hourly/{'@'}daily — anula el selector si se rellena.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Etiqueta (opcional)`,"schedule.delayMinutes":`Retraso (minutos)`,"schedule.modeFresh":`Nueva sesión`,"schedule.oneShot":`Ejecutar solo una vez`,"schedule.addCronBtn":`Añadir cron`,"schedule.addWakeupBtn":`Programar wakeup`,"schedule.cronCreated":`Tarea recurrente añadida`,"schedule.wakeupCreated":`Wakeup programado`,"askUserQuestion.title":`El agente hace una pregunta`,"askUserQuestion.submit":`Enviar respuesta`,"askUserQuestion.multiSelectHint":`Selecciona una o más opciones`,"askUserQuestion.otherOption":`Otro`,"askUserQuestion.otherOptionHint":`especifíquelo en su próximo mensaje`,"askUserQuestion.freeFormLabel":`Especifique su respuesta`,"askUserQuestion.freeFormHint":`Esta respuesta se enviará directamente al agente.`,"askUserQuestion.noPending":`Ninguna pregunta pendiente`,"askUserQuestion.next":`Siguiente`,"askUserQuestion.previous":`Anterior`,"askUserQuestion.cancel":`Cancelar`,"askUserQuestion.cancelTooltip":`Saltar esta pregunta — el agente continuará sin respuesta`,"askUserQuestion.collapse":`Contraer el panel de pregunta`,"askUserQuestion.expand":`Expandir el panel de pregunta`,"permissionRequest.title":`El agente quiere usar una herramienta`,"permissionRequest.allow":`Permitir`,"permissionRequest.allowOnce":`Permitir una vez`,"permissionRequest.allowTurn":`Permitir este turno`,"permissionRequest.allowOperation":`Permitir siempre esta operación`,"permissionRequest.allowTool":`Permitir siempre esta herramienta`,"permissionRequest.deny":`Denegar`,"permissionRequest.tool":`Herramienta`,"permissionRequest.input":`Entrada`,"permissionRequest.rawInput":`Detalles técnicos`,"permissionRequest.collapse":`Contraer el panel de permisos`,"permissionRequest.expand":`Expandir el panel de permisos`,"permissionRequest.denied":`denegado por el usuario`,"workspaceStatus.created":`creado`,"workspaceStatus.extracting":`extracción`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.executing":`en curso`,"workspaceStatus.awaitingUser":`esperando tu respuesta`,"workspaceStatus.completed":`completado`,"workspaceStatus.idle":`inactivo`,"workspaceStatus.error":`error`,"workspaceStatus.quota":`cuota alcanzada`,"workspaceStatus.retrying":`reanudación automática`,"workspaceList.prOpen":`#{n} — Pull request abierta`,"workspaceList.prWatchDisabledIndicator":`Comprobaciones de PR ignoradas para este workspace`,"workspaceList.prChangesRequested":`#{n} — Cambios solicitados`,"workspaceList.attentionCiFailed":`CI fallida`,"workspaceList.attentionChangesRequested":`Cambios solicitados`,"workspaceList.attentionReadyToMerge":`Listo para merge`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Iniciar auto-loop`,"autoLoop.prepare":`Preparar para auto-loop`,"autoLoop.reprepare":`Volver a preparar para auto-loop`,"autoLoop.reprepareTooltip":`Volver a ejecutar la fase de grooming para añadir o refrescar tareas antes de reanudar el bucle`,"autoLoop.prepareBusy":`Espera a que el agente termine antes de preparar`,"autoLoop.forceReady":`Sé lo que hago — omitir preparación`,"autoLoop.forceReadyConfirm":`¿Omitir la preparación y marcar auto-loop listo? El loop puede quedarse bloqueado si las tareas no son atómicas.`,"autoLoop.stop":`Detener auto-loop`,"autoLoop.notReady":`Ejecute primero 'Preparar para auto-loop'`,"autoLoop.noTasks":`Añada tareas primero`,"autoLoop.progress":`Auto-loop · {done}/{total} tareas`,"autoLoop.preparing":`Auto-loop · preparando`,"autoLoop.preparingTooltip":`Preparación en curso — el agente está creando / revisando tareas. El bucle arrancará cuando llame a mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en ejecución`,"autoLoop.startInMode":`Iniciar en modo auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Modelo usado solo para la sesión de brainstorming inicial — cada tarea posterior usa el modelo elegido arriba`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Nivel de razonamiento usado solo para la sesión de brainstorming inicial`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Modelo usado para cada tarea del auto-loop tras la sesión de brainstorming inicial`,"autoLoop.sessionMode.perTask":`Nueva sesión por tarea`,"autoLoop.sessionMode.label":`Sesión:`,"autoLoop.sessionMode.perTaskTooltip":`Cada tarea inicia una sesión nueva de Claude Code sin memoria de tareas anteriores`,"autoLoop.sessionMode.continuous":`Sesión continua`,"autoLoop.sessionMode.continuousTooltip":`Todas las tareas se encadenan en la misma sesión — el agente conserva todo el contexto, pero la sesión se alarga con el tiempo`,"koboCommand.prepAutoloopDesc":`Preparar tareas para modo auto-loop (atomicidad)`,"staleSessionBanner.title":`Auto-loop en curso`,"staleSessionBanner.message":`Estás viendo una sesión anterior — el agente está trabajando en la más reciente.`,"staleSessionBanner.staleTitle":`Sesión anterior`,"staleSessionBanner.staleMessage":`Estás viendo una sesión anterior — los mensajes que envíes irán a esta sesión, no a la más reciente.`,"staleSessionBanner.switchToCurrent":`Cambiar a la actual`,"network.login.title":`Acceso de red`,"network.login.description":`Este Kōbō requiere un token para controlarse desde la red. Pega el token que aparece en Ajustes en la máquina anfitriona.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Pega tu token`,"network.login.connect":`Conectar`,"network.login.invalid":`Token no válido`,"network.login.serverError":`Error del servidor — inténtalo de nuevo.`,"network.login.unreachable":`Kōbō no es accesible — comprueba tu conexión.`,"layout.toggleWorkspaces":`Mostrar/ocultar el panel de espacios`,"layout.togglePanel":`Mostrar/ocultar el panel lateral`,"unsaved.title":`¿Salir sin guardar?`,"unsaved.message":`Tienes cambios sin guardar. Salir de esta página los descarta.`,"unsaved.leave":`Salir`,"unsaved.stay":`Quedarme`,"prCheckout.staleRetriesExhausted":`El estado del repositorio siguió cambiando mientras intentábamos aplicar tus decisiones. Cierra este diálogo e inténtalo de nuevo desde el selector de pull requests.`,"prPicker.title":`Importar desde una pull request`,"prPicker.filterAll":`Todas`,"prPicker.filterMine":`Las mías`,"prPicker.filterReviewRequested":`Revisión solicitada`,"prPicker.searchPlaceholder":`Buscar pull requests…`,"prPicker.loadMore":`Cargar más`,"prPicker.empty":`Ninguna pull request abierta coincide.`,"prPicker.forkNotSupported":`Esta PR proviene de un fork; Kōbō no puede hacerle checkout.`,"prPicker.loadFailed":`Error al cargar las pull requests.`,"prPicker.badge.workspaceExists":`Ya abierta en Kōbō`,"prPicker.badge.worktreePresent":`Worktree presente`,"prPicker.badge.localBranch":`Branch local`,"prPicker.badge.new":`Nueva`,"prPicker.badge.draft":`Borrador`,"prCheckout.title":`Preparar la worktree`,"prCheckout.apply":`Aplicar`,"prCheckout.cancel":`Cancelar`,"prCheckout.retry":`Reintentar`,"prCheckout.diagnoseFailed":`Error al diagnosticar la pull request.`,"prCheckout.resolveFailed":`Error al resolver el checkout de la pull request.`,"prCheckout.path.required":`Introduce una ruta de worktree que aún no exista.`,"prCheckout.workspace.restoreNotAvailable":"Restaurar un workspace purgado no está disponible todavía desde aquí. Vuelve a crear su carpeta de worktree en disco (por ejemplo, con `git worktree add`) y Kōbō la reconectará automáticamente en unos 30 segundos.","prCheckout.staleReloaded":`El repositorio cambió; el diagnóstico se ha actualizado.`,"prCheckout.step.blocked":`No se puede continuar`,"prCheckout.step.path":`Ubicación de la worktree`,"prCheckout.step.workspace":`Workspace existente`,"prCheckout.step.worktree":`Worktree existente`,"prCheckout.step.operation":`Operación git en curso`,"prCheckout.step.changes":`Cambios sin commitear`,"prCheckout.step.divergence":`Branch local vs origin`,"prCheckout.workspace.activeHint":`Un workspace llamado "{name}" ya sigue este branch.`,"prCheckout.workspace.open":`Abrir ese workspace`,"prCheckout.workspace.continue":`Continuar por otra ruta`,"prCheckout.workspace.unarchive":`Desarchivar y abrirlo`,"prCheckout.workspace.restore":`Recrear su worktree`,"prCheckout.worktree.orphanHint":`Ya existe una worktree en este branch en {path}.`,"prCheckout.worktree.attach":`Adjuntarla`,"prCheckout.worktree.createElsewhere":`Crear otra en otro lugar`,"prCheckout.operation.hint":`Hay un {operation} en curso en esa worktree.`,"prCheckout.operation.abort":`Abortarlo`,"prCheckout.operation.cancel":`Dejarlo tal cual y detenerse aquí`,"prCheckout.changes.hint":`{modified} modificado(s), {staged} en stage, {untracked} sin seguimiento.`,"prCheckout.changes.stash":`Guardarlos en un stash`,"prCheckout.changes.commit":`Commitearlos`,"prCheckout.changes.discard":`Descartarlos (se conservan en un stash etiquetado)`,"prCheckout.changes.keep":`Dejarlos como están`,"prCheckout.divergence.behindHint":`Tu branch está {behind} commit(s) por detrás de origin.`,"prCheckout.divergence.aheadHint":`Tu branch tiene {ahead} commit(s) sin pushear.`,"prCheckout.divergence.divergedHint":`{ahead} por delante, {behind} por detrás de origin.`,"prCheckout.divergence.fastForward":`Fast-forward hacia origin`,"prCheckout.divergence.rebase":`Rebase sobre origin`,"prCheckout.divergence.resetHard":`Restablecer a origin (se crea antes un branch de respaldo)`,"prCheckout.divergence.keep":`Mantener el estado local`,"prCheckout.blocked.forgeUnavailable":`Falta el CLI de la forge o no está autenticado.`,"prCheckout.blocked.forkPr":`Esta PR proviene de un fork; Kōbō no puede hacerle checkout.`,"prCheckout.blocked.headBranchDeleted":`El branch ya no existe en el remote.`,"prCheckout.blocked.indexLock":`Hay otro proceso git en curso (index.lock está presente).`,"prCheckout.blocked.pathOccupied":`{path} ya existe y no es una worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} es una worktree en otro branch ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Ya existe un branch local llamado {branch} con un historial sin relación.`},Nr={"model.tooltip":`Modèle utilisé par l’agent pour ce workspace`,"reasoning.tooltip":`Niveau de raisonnement utilisé par l’agent pour ce workspace`,"thinking.label":`Réflexion`,"thinking.noDetails":`L’agent réfléchit…`,"common.save":`Enregistrer`,"common.cancel":`Annuler`,"common.retry":`Réessayer`,"common.delete":`Supprimer`,"common.close":`Fermer`,"common.dismiss":`Ignorer`,"common.details":`Détails`,"common.ok":`OK`,"whatsNew.title":`Quoi de neuf`,"common.loading":`Chargement...`,"common.search":`Rechercher...`,"common.refresh":`Actualiser`,"common.copy":`Copier`,"common.copied":`Copié dans le presse-papiers`,"common.copyFailed":`Échec de la copie`,"common.add":`Ajouter`,"folderPicker.title":`Choisir un dossier`,"folderPicker.parent":`Dossier parent`,"folderPicker.empty":`Aucun sous-dossier`,"folderPicker.select":`Choisir ce dossier`,"common.start":`Démarrer`,"common.stop":`Arrêter`,"common.archive":`Archiver`,"common.unarchive":`Désarchiver`,"common.selectWorkspace":`Sélectionnez un espace de travail`,"common.noResults":`Aucun résultat pour « {query} »`,"common.send":`envoyer`,"common.newLine":`nouvelle ligne`,"common.history":`historique`,"common.justNow":`a l'instant`,"common.minutesAgo":`il y a {count}m`,"common.hoursAgo":`il y a {count}h`,"common.daysAgo":`il y a {count}j`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`Modèle le plus capable — succède à Opus 4.8, contexte 1M, adaptive thinking`,"model.mythos5Description":`Fable 5 sans classificateurs de sécurité — accès limité (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude choisit le modèle optimal`,"model.opus5Description":`Pour le coding agentique complexe et le travail en entreprise, contexte 1M`,"model.opus48Description":`Opus le plus capable — coding agentique long-horizon, contexte 1M par défaut, effort high par défaut`,"model.opus47ClassicDescription":`Dernier Opus, le plus capable`,"model.opus471mDescription":`Dernier Opus, contexte 1M`,"model.opusClassicDescription":`Le plus puissant`,"model.opus1mDescription":`Le plus puissant, contexte 1M`,"model.sonnet5Description":`Meilleure combinaison vitesse/intelligence, contexte 1M`,"model.sonnetClassicDescription":`Équilibré`,"model.sonnet1mDescription":`Équilibré, contexte 1M`,"model.haikuDescription":`Le plus rapide`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`Dernier modèle de codage agentique de pointe (nécessite une authentification ChatGPT)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Modèle de codage agentique équilibré pour un usage quotidien (nécessite une authentification ChatGPT)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Modèle de codage agentique rapide et économique (nécessite une authentification ChatGPT)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recommandé pour le code complexe (nécessite une authentification ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Repli par défaut — raisonnement solide, compatible avec une clé API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rapide et efficient — idéal pour les tâches réactives et les sous-agents`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimisé pour un usage professionnel et les agents longue durée`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modèle spécialisé code pour l'ingénierie logicielle complexe`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`aucun`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Laisse le moteur choisir`,"reasoning.minimalDescription":`Raisonnement le plus rapide et superficiel`,"reasoning.noneDescription":`Sans raisonnement supplémentaire`,"reasoning.lowDescription":`Plus rapide, moins profond`,"reasoning.mediumDescription":`Équilibré`,"reasoning.highDescription":`Plus de profondeur`,"reasoning.xhighDescription":`Profondeur étendue, tâches longues`,"reasoning.maxDescription":`Profondeur maximale`,"agentPermissionMode.label":`Mode de permission`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Strict (édits)`,"agentPermissionMode.interactive":`Interactif`,"agentPermissionMode.tooltip":`Comment l'agent gère les permissions d'outils. Plan : lecture seule, aucune écriture. Bypass : aucune demande. Strict : auto-accept des éditions de fichiers, respect des allow/deny pour le reste. Interactif : demande à l'utilisateur avant chaque outil via le panneau de permission.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop force un mode autre que Plan — Plan bloque les outils MCP et les éditions dont la boucle a besoin. Choisis Bypass, Strict ou Interactif.`,"agentPermissionMode.autoLoopLocked":`Verrouillé sur Bypass tant que l'auto-loop est activé — un autre mode bloquerait la boucle sur les demandes de permission. AskUserQuestion fonctionne toujours.`,"workspaceList.title":`Espaces de travail`,"workspaceList.a11y.groupToggle":`Groupe {group}, {count} workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Attention requise`,"workspaceList.running":`En cours`,"workspaceList.idle":`Inactif`,"workspaceList.archived":`Archivés`,"workspaceList.archivedToast":`« {name} » archivé`,"workspaceList.archivedUndo":`Annuler`,"workspaceList.unarchiveFailed":`Impossible de désarchiver ce workspace`,"workspaceList.noWorkspaces":`Aucun espace de travail`,"workspaceList.loadFailed":`Impossible de charger vos workspaces`,"workspaceList.loadFailedHint":`Il s’agit d’un échec de connexion, pas d’un compte vide.`,"workspaceList.footer":`{count} espace de travail | {count} espaces de travail`,"workspaceList.footerRunning":`{count} en cours`,"workspaceList.deleteDialog.title":`Supprimer l'espace de travail ?`,"workspaceList.deleteDialog.deleteLocal":`Supprimer la branche locale`,"workspaceList.deleteDialog.deleteRemote":`Supprimer la branche distante`,"workspaceList.deleteDialog.warning":`Attention : cette action est irréversible sur le dépôt distant.`,"workspaceList.deleteArchivedDialog.tooltip":`Supprimer tous les espaces de travail archivés`,"workspaceList.deleteArchivedDialog.title":`Supprimer tous les espaces archivés ?`,"workspaceList.deleteArchivedDialog.message":`Cela supprimera définitivement les {count} espaces de travail archivés. Cette action est irréversible.`,"workspacePage.selectWorkspace":`Sélectionnez un espace de travail pour commencer`,"workspacePage.commandPalettePlaceholder":`Rechercher une commande…`,"workspacePage.commandPaletteEmpty":`Aucune commande correspondante`,"workspacePage.commandFocusChat":`Placer le curseur dans le chat`,"workspacePage.commandSearchHistory":`Rechercher dans l'historique du workspace`,"workspacePage.commandTogglePanel":`Afficher ou masquer le panneau latéral`,"workspacePage.commandStartAgent":`Démarrer l'agent`,"workspacePage.commandStopAgent":`Arrêter l'agent`,"workspacePage.commandOpenSettings":`Ouvrir les réglages`,"workspacePage.commandOpenCreate":`Créer un workspace`,"workspacePage.commandOpenSearch":`Recherche globale`,"workspacePage.commandOpenHealth":`Page Santé`,"workspacePage.commandOpenChangelog":`Journal des versions`,"workspacePage.commandGroupWorkspaces":`Aller à un workspace`,"workspacePage.commandPaletteHint":`Palette de commandes`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ Nouvelle session`,"workspacePage.renameSession":`Renommer`,"workspacePage.renameSessionTitle":`Renommer la session`,"workspacePage.sessionNameLabel":`Nom de la session`,"workspacePage.sessionEndedNotice":`Cette session est terminée. Crée une nouvelle session pour continuer.`,"workspacePage.renameFailed":`Échec du renommage`,"workspacePage.copySessionId":`Copier l'ID de session`,"workspacePage.deleteSession":`Supprimer la session`,"workspacePage.deleteSessionTitle":`Supprimer la session ?`,"workspacePage.deleteSessionConfirm":`Cette action supprime définitivement cette session et son historique de conversation.`,"workspacePage.deleteSessionFailed":`Échec de la suppression de la session`,"workspacePage.noEngineSessionId":`Pas encore d'ID de session — l'agent n'a pas encore démarré cette session`,"workspacePage.createSessionFailed":`Échec de la création de la session`,"workspacePage.startFailed":`Échec du démarrage`,"workspacePage.stopFailed":`Échec de l'arrêt`,"workspacePage.interrupt":`Interrompre`,"workspacePage.interrupted":`Agent interrompu — en attente de votre prochain message`,"workspacePage.lastAgentEvent":`Dernier événement {when}`,"workspacePage.agentStopping":`Arrêt en cours…`,"workspacePage.agentNotRunning":`Aucun agent en cours — le statut est périmé`,"workspacePage.archivedBanner":`Workspace archivé — lecture seule`,"workspacePage.worktreePurgedBanner":`Worktree supprimé — historique conservé, restauration indisponible dans cette version`,"workspacePage.worktreePurgedTooltip":"Le dossier worktree a été supprimé du disque pour libérer de l'espace. L'historique des messages, sessions et métadonnées PR reste consultable ici, mais le répertoire de travail n'existe plus localement. Une future version de Kōbō pourra reconstruire le worktree à partir de la PR mergée — pour l'instant, recrée-le manuellement via `gh pr checkout` ou `git worktree add`.","workspacePage.pendingInitialPromptBanner":`Un prompt initial est en attente — l'agent ne l'a jamais reçu (le script de setup a planté ou le workspace n'a jamais été démarré). Cliquez sur Démarrer pour l'envoyer.`,"workspacePage.unarchived":`Workspace désarchivé`,"workspacePage.unarchiveFailed":`Échec du désarchivage`,"workspacePage.interruptFailed":`Échec de l'interruption`,"workspacePage.interruptHint":`Interrompre le tour en cours sans terminer la session.`,"workspacePage.interruptTooltip":`Interruption douce (comme Escape) — arrête le tool en cours mais garde la session active`,"workspacePage.pendingNextRun":`Appliqué au prochain démarrage`,"workspacePage.activeSessionModel":`En cours : {model}`,"workspacePage.activeSessionModelTooltip":`Modèle effectivement utilisé par la session sélectionnée`,"workspacePage.switchEngine":`Changer d’engine`,"workspacePage.switchEngineHint":`Continuer ce workspace avec un autre engine agent`,"workspacePage.moreActions":`Plus d'actions`,"workspacePage.switchEngineTitle":`Changer d’engine agent`,"workspacePage.switchEngineWarning":`L’agent actuel sera arrêté et une nouvelle session démarrera dans le même worktree.`,"workspacePage.engineLabel":`Engine`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Passation pour le nouvel engine`,"workspacePage.engineHandoffHint":`Relisez ou modifiez le contexte envoyé au nouvel agent.`,"workspacePage.confirmSwitchEngine":`Changer d’engine`,"workspacePage.switchEngineFailed":`Échec du changement d’engine`,"whip.dispatchFailed":`Impossible d'envoyer le message du fouet`,"whip.phrase1":`Plus vite, tocard !`,"whip.phrase2":`Accélère le rythme, tocard !`,"whip.phrase3":`Au travail, tocard !`,"whip.phrase4":`Montre-moi un peu de vitesse, tocard !`,"whip.phrase5":`Moins de réflexion, plus d'action, tocard !`,"search.title":`Recherche`,"search.tooltip":`Rechercher dans l'historique des agents`,"search.placeholder":`Rechercher dans tous les messages agents…`,"search.includeArchived":`Inclure les workspaces archivés`,"search.loading":`Recherche en cours…`,"search.noResults":`Aucun résultat`,"search.error":`Échec de la recherche : {message}`,"search.resultCount":`{n} résultat(s)`,"search.eventType.userMessage":`Vous`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Aucune activité`,"activityFeed.emptyHint":`Démarrez un espace de travail pour voir la sortie de l'agent ici`,"activityFeed.initialPrompt":`Prompt initial`,"activityFeed.you":`Vous`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Aller au message précédent`,"activityFeed.scrollToBottom":`Défiler vers le bas`,"activityFeed.sendAnswers":`Envoyer les réponses`,"agentBusy.banner":`L'agent est occupé`,"agentBusy.subagentsRunning":`1 sub-agent en cours | {n} sub-agents en cours`,"agentBusy.viewSubagents":`Voir les sub-agents`,"agentBusy.pendingMessage":`En attente — l'agent est occupé`,"terminal.title":`Terminal`,"terminal.open":`Ouvrir le terminal`,"terminal.close":`Fermer le terminal`,"terminal.noWorkspace":`Sélectionnez un espace de travail`,"terminal.noWorktree":`Worktree pas encore créé`,"terminal.error":`Erreur du terminal`,"terminal.exited":`Terminal fermé`,"terminal.disconnected":`Connexion perdue`,"terminal.reconnecting":`Reconnexion… (essai {attempt} sur {max})`,"terminal.reconnect":`Reconnecter`,"chatInput.placeholder":`Message... (/ pour les skills)`,"chatInput.fileSearchHint":`chercher un fichier`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Joindre une image`,"chatInput.queueBanner":`Message en file d'attente — sera envoyé quand l'agent aura terminé`,"chatInput.forceQueue":`forcer l’envoi`,"chatInput.searchHistory":`rechercher`,"chatInput.commandPalette":`commandes`,"chatInput.shortcuts":`Raccourcis clavier`,"chatInput.cancelQueue":`Annuler la file d'attente`,"chatInput.autoLoopBanner":`L'auto-loop tourne — arrête-le pour envoyer un message`,"chatInput.awaitingUserBanner":`L'agent attend ta réponse ci-dessus — réponds via le panneau de question`,"chatInput.autoLoopStop":`Arrêter`,"koboCommand.checkProgressDesc":`Vérifier la progression des tâches et critères d'acceptation`,"chatInput.uploading":`Envoi en cours...`,"voice.title":`Transcription vocale`,"voice.enabled":`Activer la transcription vocale locale`,"voice.pttKey":`Touche push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espace`,"voice.language":`Langue (auto ou code)`,"voice.model":`Modèle actif`,"voice.commandPath":`Chemin du binaire Whisper (optionnel)`,"voice.ffmpegPath":`Chemin du binaire ffmpeg (optionnel)`,"voice.temperature":`Température`,"voice.temperatureHint":`Plus bas = plus déterministe ; plus haut = plus flexible mais moins stable.`,"voice.initialPrompt":`Prompt initial (optionnel)`,"voice.initialPromptHint":`Contexte optionnel pour aider Whisper sur les noms, acronymes ou jargon métier.`,"voice.translateToEnglish":`Traduire vers anglais`,"voice.translateToEnglishHint":`Si activé, la parole non anglaise est traduite en anglais au lieu d’être transcrite telle quelle.`,"voice.suppressNst":`Supprimer les tokens non vocaux`,"voice.suppressNstHint":`Essaie de réduire les artefacts non vocaux dans la transcription.`,"voice.installLink":`Installer whisper.cpp`,"voice.installGuideTitle":`Guide d'installation`,"voice.installGuideIntro":`Installe whisper.cpp et ffmpeg, puis renseigne les chemins binaires ci-dessous si nécessaire.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Après le build CMake, le binaire Whisper est généralement ici : whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Ensuite, renseigne "Chemin du binaire Whisper" et "Chemin du binaire ffmpeg" dans cette section (ou laisse vide si c’est dans le PATH).`,"voice.noneModel":`Aucun modèle actif`,"voice.notInstalled":`non installé`,"voice.download":`Télécharger`,"voice.delete":`Supprimer`,"voice.holdToTalk":`Maintiens pour parler`,"voice.recording":`Enregistrement...`,"voice.transcribing":`Transcription...`,"voice.notSupported":`L'enregistrement vocal n'est pas supporté par ce navigateur`,"voice.errorMicPermission":`Permission micro refusée`,"voice.errorTranscription":`La transcription vocale a échoué`,"voice.downloadFailed":`Échec du téléchargement du modèle`,"voice.deleteFailed":`Échec de la suppression du modèle`,"voice.errorDisabled":`La transcription vocale est désactivée dans les réglages`,"voice.errorModelMissing":`Aucun modèle vocal actif n'est configuré`,"voice.errorModelNotInstalled":`Le modèle vocal actif n'est pas installé`,"voice.errorAudioInvalid":`La capture audio est invalide ou vide`,"voice.errorLanguageInvalid":`La configuration de langue vocale est invalide`,"voice.errorRuntimeMissing":`Le runtime Whisper n'est pas installé ou pas dans le PATH`,"voice.maxDurationReached":`Durée maximale d'enregistrement atteinte`,"voice.runtimeReady":`Runtime prêt : {command}`,"voice.runtimeMissing":`Runtime manquant : {command}`,"voice.ffmpegReady":`ffmpeg prêt`,"voice.ffmpegMissing":`ffmpeg manquant`,"voice.sectionRuntime":`État du runtime`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Modèles Whisper`,"voice.sectionAdvanced":`Options avancées`,"voice.sectionBehavior":`Comportement de la transcription`,"voice.sectionBinaries":`Chemins des binaires`,"voice.downloadModels":`Télécharger un modèle`,"voice.cancelFailed":`Échec de l'annulation du téléchargement`,"createPage.title":`Créer un workspace`,"createPage.subtitle":`Décrivez la mission, choisissez un projet, puis configurez l’agent.`,"createPage.sectionMission":`Mission`,"createPage.sectionMissionHint":`Donnez à l’agent un objectif clair et le contexte nécessaire pour le réaliser.`,"createPage.workspaceNameLabel":`Nom du workspace`,"createPage.descriptionLabel":`Description de la mission`,"createPage.sources":`Sources facultatives`,"createPage.sectionGit":`Projet Git`,"createPage.sectionGitHint":`Choisissez le dépôt, la branche de départ et le mode de worktree.`,"createPage.worktreeMode":`Mode de worktree`,"createPage.worktreeNew":`Nouveau worktree isolé`,"createPage.worktreeExisting":`Réutiliser un worktree existant`,"createPage.projectLabel":`Projet`,"createPage.sourceBranch":`Branche de départ`,"createPage.workingBranchPreview":`Aperçu de la branche de travail`,"createPage.branchNamePending":`nom-du-workspace`,"createPage.sectionAgent":`Agent`,"createPage.sectionAgentHint":`Vérifiez les réglages d’exécution ou activez l’automatisation.`,"createPage.configureAgent":`Configurer l’agent`,"createPage.advancedOptions":`Options avancées`,"createPage.keyboardHint":`Appuyez sur Ctrl/Cmd + Entrée pour créer le workspace.`,"createPage.createWorkspace":`Créer le workspace`,"createPage.notionEnabled":`Notion activé`,"createPage.importNotion":`Importer depuis Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL doit commencer par https://www.notion.so/ ou https://app.notion.com/`,"createPage.notionAutoExtract":`Les sous-tâches et critères d'acceptation seront extraits automatiquement.`,"createPage.notionPanelChoiceLabel":`Cette URL pointe vers une sous-page (?p=). Sur laquelle veux-tu travailler ?`,"createPage.notionPanelOption":`Sous-page (panel)`,"createPage.notionPanelOptionDesc":`La page que tu consultais — recommandé`,"createPage.notionParentOption":`Page parente`,"createPage.notionParentOptionDesc":`L'epic / database qui la contient`,"createPage.importSentry":`Importer Sentry`,"createPage.sentryEnabled":`Sentry activé`,"createPage.sentryPlaceholder":`https://votre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL doit pointer vers une issue Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue Sentry sera importée automatiquement`,"createPage.sentryExtractHint":`Kobo va extraire l'issue et l'écrire dans .ai/thoughts/`,"createPage.importPr":`Importer depuis une PR`,"createPage.importPrRequiresProject":`Choisir d'abord un projet`,"createPage.importPrNotSupported":`Le forge de ce projet ne permet pas de lister les pull requests`,"createPage.lockedToPr":`Verrouillé sur la PR #{number}`,"createPage.prReadyToCreate":`PR #{number} importée — le workspace peut être créé.`,"createPage.unlockPrCheckout":`Déverrouiller`,"createPage.workspaceName":`Nom de l'espace de travail (par défaut le titre de la page Notion)`,"createPage.workspaceNamePlaceholder":`Nom de l'espace de travail...`,"createPage.instructions":`Instructions supplémentaires (optionnel)...`,"createPage.instructionsPlaceholder":`Décrivez la tâche...`,"createPage.tasks":`Tâches ({count})`,"createPage.addTask":`Ajouter une tâche...`,"createPage.acceptanceCriteria":`Critères d'acceptation ({count})`,"createPage.addCriterion":`Ajouter un critère...`,"createPage.projectPath":`Chemin du projet`,"createPage.branchType":`Type de branche`,"createPage.branch":`Branche`,"createPage.noBranches":`Aucune branche trouvée`,"createPage.enterPath":`Entrez le chemin du projet`,"createPage.skipSetupScript":`Ignorer le script de setup`,"createPage.worktreePickerLabel":`Worktree existant`,"createPage.noOrphanWorktrees":`Aucun worktree orphelin pour ce projet`,"createPage.pickWorktreeRequired":`Sélectionne un worktree à réutiliser`,"createPage.notionExtractHint":`Les sous-tâches et critères d'acceptation seront extraits de la page Notion.`,"createPage.errorCreating":`Erreur lors de la création de l'espace de travail.`,"createPage.branchAdjusted":"Branche déjà existante — création de `{branch}` à la place. Le dossier worktree correspondant utilise le même suffixe.","createPage.localSourceFallback":`Workspace créé à partir de la branche locale (origin injoignable) — la base peut être périmée.`,"createPage.validationNotionUrl":`Veuillez coller une URL Notion valide (https://www.notion.so/... ou https://app.notion.com/...).`,"createPage.validationDescription":`Veuillez décrire la tâche.`,"createPage.validationName":`Veuillez fournir un nom d'espace de travail.`,"createPage.validationPath":`Veuillez entrer le chemin du projet.`,"createPage.validationBranch":`Veuillez sélectionner une branche.`,"createPage.validationFocusHint":`Le champ à corriger est mis en évidence ci-dessous.`,"createPage.progress.validate":`Validation de la demande…`,"createPage.progress.fetch-source-branch":`Récupération de la branche source depuis origin…`,"createPage.progress.inspect-worktree":`Inspection du worktree existant…`,"createPage.progress.extract-notion":`Extraction de la page Notion…`,"createPage.progress.extract-sentry":`Extraction de l’issue Sentry…`,"createPage.progress.create-record":`Création du workspace…`,"createPage.progress.create-tasks":`Création des tâches et critères d’acceptation…`,"createPage.progress.create-worktree":`Création du worktree git…`,"createPage.progress.write-conventions":`Écriture des conventions git…`,"createPage.progress.write-context-files":`Écriture des fichiers de contexte…`,"createPage.progress.build-prompt":`Construction du prompt initial…`,"createPage.progress.setup-script":`Exécution de votre script d’installation…`,"createPage.progress.start-agent":`Démarrage de l’agent…`,"createPage.progress.rollback":`Annulation de la création échouée…`,"createPage.progress.done":`Terminé`,"createPage.progress.step":`Étape {index} sur {total}`,"createPage.errorAtStep":`La création a échoué à l’étape « {step} » : {message}`,"createPage.override.title":`Deux de vos choix ont été remplacés`,"createPage.override.setup-script-forced":`Script d’installation ignoré : le relancer sur un worktree que vous avez déjà préparé pourrait en détruire le contenu.`,"createPage.override.permission-mode-downgraded":`Mode de permission passé de Plan à Bypass : une boucle autonome ne peut pas tourner en Plan, qui bloque les outils et les modifications.`,"settings.title":`Paramètres`,"settings.language":`Langue`,"settings.projectColor":`Couleur`,"settings.projectColorClear":`Effacer`,"settings.projectColorDefault":`Par défaut (gris)`,"settings.workspaceListSection":`Liste des workspaces`,"settings.flattenWorkspaceList":`Afficher en liste plate`,"settings.flattenWorkspaceListHint":`Affiche tous les espaces de travail en liste plate avec un badge projet, plutôt que regroupés par projet.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personnalisé`,"settings.skillSuite.superpowersHint":`Workflow opiné TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Les deux suites s'empilent — superpowers pour la méthodo (brainstorm / TDD / plans / review au niveau principes), gstack pour les workflows concrets (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Framework agentique d'affaan-m — agents, skills, rules et hooks pour planifier, tester, implémenter, relire et mémoriser (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Les trois suites s'empilent — superpowers pour la méthodo, gstack pour les workflows concrets, ECC pour des passes de relecture/implémentation multi-agents structurées.`,"settings.skillSuite.customHint":`Compose les cinq prompts ci-dessous à partir des templates de ton choix, puis modifie-les librement.`,"settings.skillSuite.reloadDefaults":`Recharger les valeurs par défaut`,"settings.skillSuite.reloadDefaultsConfirm":`Remplacer les cinq prompts personnalisés par les valeurs agnostiques par défaut ?`,"settings.skillSuite.customPrompts":`Prompts personnalisés`,"settings.skillSuite.agnostic":`Base agnostique`,"settings.skillSuite.importPrompt":`Importer un template`,"settings.skillSuite.imported":`Template importé. Tu peux maintenant le modifier.`,"settings.skillSuite.importFailed":`Impossible d'importer le template`,"settings.skillSuite.reviewTemplate":`Template de relecture`,"settings.skillSuite.autoLoopReviewGate":`Gate de relecture auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instruction phase brainstorming`,"settings.global":`Général`,"settings.projects":`Projets`,"settings.globalSettings":`Paramètres généraux`,"settings.defaultModel":`Modèle par défaut`,"settings.defaultModelClaude":`Modèle par défaut (Claude Code)`,"settings.defaultModelCodex":`Modèle par défaut (OpenAI Codex)`,"settings.agentPermissions":`Permissions de l'agent`,"settings.skipPermissions":`Ignorer les invites de permission (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attention : désactiver cette option entraînera le refus automatique de toutes les permissions d'outils (Write, Edit, Bash...) en mode headless. L'agent ne pourra que lire.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Notification navigateur quand l'agent termine`,"settings.audioNotifications":`Notification sonore quand l'agent termine`,"settings.enableBrowserNotifications":`Activer les notifications navigateur`,"settings.testBrowserNotification":`Tester la notification`,"settings.browserNotificationGranted":`Notifications du navigateur autorisées`,"settings.browserNotificationDenied":`Notifications du navigateur bloquées`,"settings.browserNotificationAsk":`Autorisation du navigateur requise`,"settings.browserNotificationUnsupported":`Notifications du navigateur indisponibles`,"settings.browserNotificationPermissionNeeded":`Autorisez les notifications du navigateur pour envoyer un test.`,"settings.browserNotificationTestTitle":`Test de notification Kōbō`,"settings.browserNotificationTestBody":`Les notifications du navigateur fonctionnent.`,"settings.enableAudio":`Activer l'audio`,"settings.notificationSound":`Son de notification`,"settings.notificationSoundHint":`Joué quand l'agent termine ou demande une permission.`,"settings.questionSound":`Son des questions`,"settings.questionSoundHint":`Joué uniquement quand l'agent te pose une question.`,"settings.workspaceCreatedSound":`Son de création d'espace de travail`,"settings.workspaceCreatedSoundHint":`Joué après la création d'un espace de travail.`,"settings.notificationSoundPreview":`Écouter`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Erreurs de l’agent`,"settings.agentErrorSoundHint":`Joué pour les quotas, rate limits et erreurs de l’agent.`,"settings.notificationSoundBasic":`Notification basique`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Travail`,"settings.notificationSoundTravailTermine":`Travail terminé`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Ça va péter`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR et CI`,"settings.soundGeneral":`Son général`,"settings.soundNone":`Aucun son`,"settings.prCiFailedSound":`CI en échec`,"settings.prCiRecoveredSound":`CI rétablie`,"settings.prChangesRequestedSound":`Modifications demandées`,"settings.prApprovedSound":`PR approuvée`,"settings.prMergeConflictSound":`Conflit de merge`,"settings.prReadyToMergeSound":`Prête à merger`,"settings.prMergedSound":`PR mergée`,"settings.prCiFailedSoundHint":`Joué quand la CI passe en échec.`,"settings.prCiRecoveredSoundHint":`Joué quand la CI se rétablit après un échec.`,"settings.prChangesRequestedSoundHint":`Joué quand une review demande des modifications.`,"settings.prApprovedSoundHint":`Joué quand la pull request est approuvée.`,"settings.prMergeConflictSoundHint":`Joué quand un conflit de merge est détecté.`,"settings.prReadyToMergeSoundHint":`Joué quand la pull request devient prête à merger.`,"settings.prMergedSoundHint":`Joué quand la pull request est mergée.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Mode de permission par défaut`,"settings.defaultPermissionModeClaude":`Mode de permission par défaut (Claude Code)`,"settings.defaultPermissionModeCodex":`Mode de permission par défaut (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode appliqué à la création d'un workspace. Plan = lecture seule, Bypass = sans prompt, Strict = auto-accept des éditions avec allow-list, Interactif = demande avant chaque outil.`,"settings.activityFeed":`Flux d'activité`,"settings.verboseMessages":`Afficher les messages système détaillés (task_progress, task_started)`,"settings.showThinkingBlocks":`Afficher les blocs de réflexion des agents`,"settings.whipSettings":`Fouet`,"settings.whipSettingsHint":`Configurez le raccourci et le volume du fouet optionnel.`,"settings.whipEnabled":`Activer le fouet`,"settings.whipEnabledHint":`Affiche le fouet interactif dans les workspaces actifs compatibles.`,"settings.whipVolume":`Volume du fouet`,"settings.whipVolumeMasterAudioDisabled":`L’audio principal est désactivé. Activez les notifications audio pour régler le volume du fouet ; la valeur enregistrée est conservée.`,"whip.overlayLabel":`Fouet interactif`,"whip.overlayInstructions":`Déplacez le pointeur pour contrôler le fouet. Appuyez sur Entrée ou Espace pour le faire claquer. Appuyez sur Échap pour fermer.`,"settings.whipShortcut":`Raccourci du fouet`,"settings.whipShortcutHint":`Cliquez, puis appuyez sur le raccourci à utiliser.`,"settings.whipShortcutRecording":`Appuyez sur un raccourci…`,"settings.whipShortcutButtonLabel":`Raccourci du fouet : {shortcut}`,"settings.whipShortcutRecordingLabel":`Enregistrement du raccourci du fouet. Appuyez sur un raccourci…`,"settings.whipShortcutReset":`Réinitialiser le raccourci`,"settings.whipShortcutReserved":`Ce raccourci est réservé par le navigateur.`,"settings.testIntegration":`Tester la connexion`,"pwa.offline":`Vous êtes hors ligne. Le chat et les agents nécessitent le serveur Kōbō.`,"pwa.reconnecting":`Reconnexion au serveur Kōbō…`,"pwa.installReady":`Installez Kōbō comme application.`,"pwa.install":`Installer`,"pwa.ignore":`Ignorer`,"pwa.updateReady":`Une mise à jour de Kōbō est disponible.`,"pwa.reload":`Recharger`,"chat.searchWorkspaceHistory":`Rechercher dans l’historique du workspace`,"chat.historySearch.user":`Vous`,"chat.historySearch.agent":`Agent`,"chat.openInGitDiff":`Ouvrir dans le diff Git`,"timeline.title":`Chronologie des sessions`,"timeline.export":`Exporter le diagnostic`,"timeline.unnamed":`Session agent`,"timeline.tools":`{count} outils`,"timeline.errors":`{count} erreurs`,"settings.availableVariables":`Variables disponibles dans les modèles de prompt`,"settings.prPromptTemplate":`Modèle de prompt PR`,"settings.prPromptPlaceholder":`Instructions pour l'agent lors de la création de PR GitHub...`,"settings.prPromptHint":`Utilisez les variables listées ci-dessus (syntaxe doubles accolades).`,"settings.reviewPromptTemplate":`Modèle de prompt de review`,"settings.reviewPromptPlaceholder":`Instructions pour l'agent lors de la review des changes de la branche...`,"settings.ciFixPromptTemplate":`Modèle de prompt « Fix CI »`,"settings.ciFixPromptHint":`Envoyé à l'agent quand un workspace voit sa CI échouer. Variables (syntaxe double-accolades) : pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Demande à l'agent de diagnostiquer et de corriger les jobs CI en échec...`,"settings.finalizationPromptTemplate":`Prompt de finalisation de l'auto-loop`,"settings.finalizationPromptHint":`Prompt par défaut pour la dernière itération de l'auto-loop (contrôles qualité finaux). Utilisé quand un projet laisse son propre prompt de finalisation vide.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Prompt initial Notion`,"settings.notionInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a un ticket Notion. Variables : {variables}.`,"settings.notionInitialPrompt.project":`Prompt initial Notion (override)`,"settings.sentryInitialPrompt":`Prompt initial Sentry`,"settings.sentryInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a une issue Sentry. Variables : {variables}.`,"settings.sentryInitialPrompt.project":`Prompt initial Sentry (override)`,"settings.initialPrompt.inheritHint":`Laisser vide pour hériter. Saisir un caractère d'espacement pour désactiver l'injection à ce niveau.`,"settings.resetToDefault":`Réinitialiser`,"settings.resetFailed":`Échec du chargement de la valeur par défaut`,"settings.sentryIntegration":`Intégration Sentry`,"settings.var.prNumber":`Numéro de PR (ex : 42)`,"settings.var.prUrl":`URL complète de la PR créée`,"settings.var.branchName":`Nom de la branche de travail`,"settings.var.sourceBranch":`Branche source ciblée par la PR`,"settings.var.workspaceName":`Nom du workspace`,"settings.var.projectName":`Dernier segment du chemin du projet`,"settings.var.notionUrl":`URL Notion si définie, vide sinon`,"settings.var.commits":`Liste à puces des commits entre source et head`,"settings.var.diffStats":`Résumé shortstat Git (fichiers, insertions, suppressions)`,"settings.var.tasks":`Tâches classiques en liste à cocher`,"settings.var.acceptanceCriteria":`Critères d'acceptation en liste à cocher`,"settings.gitConventions":`Conventions Git (global)`,"settings.gitConventionsPlaceholder":`# Conventions Git...`,"settings.gitConventionsHint":`Ces conventions sont écrites dans .ai/.git-conventions.md pour chaque nouvel espace de travail et doivent être respectées par l'agent avant toute opération Git. Remplacées par les conventions par projet si définies.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de cleanup`,"settings.archiveScript":`Script d'archivage`,"settings.archiveScriptHint":`Script shell exécuté côté serveur dans le worktree quand un workspace est archivé. Laisser vide pour désactiver.`,"settings.archiveScriptPlaceholder":`ex. nettoyer des conteneurs, libérer de l'espace disque…`,"settings.changeSourceBranchScript":`Script de changement de branche source`,"settings.changeSourceBranchScript.help":`Remplace le cherry-pick intégré quand non vide. Le script possède git, base de PR, force-push et conflits ; Kōbō refuse seulement si l'agent tourne et met à jour la métadonnée source à exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nouvelle branche source choisie dans le dialogue
|
|
51
51
|
KOBO_OLD_BASE — précédente branche source du workspace
|
|
52
52
|
KOBO_WORKING_BRANCH — branche de travail du workspace
|
|
53
53
|
KOBO_WORKTREE_PATH — chemin absolu du worktree (et cwd)
|
|
@@ -63,7 +63,7 @@ KOBO_PR_NUMBER — numéro de PR/MR sur la forge résolue (vide si aucune o
|
|
|
63
63
|
# Ou directement via git (fonctionne sur GitHub même après suppression de la branche) :
|
|
64
64
|
git fetch origin pull/[numéro-pr]/head:[nom-branche]
|
|
65
65
|
git worktree add [chemin] [nom-branche]`,"settings.purgeDocsRestoreFootnote":`GitHub conserve la ref HEAD de la PR bien après la suppression de la branche source (mois / années). L'auto-détection tourne dans le watcher 30s — pas besoin d'action dans l'UI une fois le dossier recréé.`,"settings.purgeDocsPermissionsTitle":`Éviter les erreurs de permissions pendant la suppression`,"settings.purgeDocsPermissionsIntro":`Docker laisse souvent des fichiers root-owned dans node_modules / vendor à l'intérieur du worktree. Quand Kōbō essaie de les supprimer, tu tombes sur EACCES / EPERM et la purge échoue. Deux moyens de prévenir :`,"settings.purgeDocsPermissionsDocker":'Configurer ton conteneur pour qu\'il tourne sous ton utilisateur hôte — directive USER dans le Dockerfile, ou `user: "${UID}:${GID}"` dans docker-compose (avec UID/GID exportés dans ton shell).',"settings.purgeDocsPermissionsAcl":`Pré-définir un ACL par défaut sur la racine des worktrees — filet de sécurité qui marche dans la PLUPART des cas (ext4/btrfs/xfs + bind mount Docker classique). Chaque nouveau fichier hérite alors d'une entrée d'accès pour ton user, en plus du propriétaire nominal :`,"settings.purgeDocsPermissionsAclCommand":` setfacl -d -m u:$(whoami):rwX [racine-worktrees]`,"settings.purgeDocsPermissionsFootnote":"Limites des ACL : ne marchent PAS sur les volumes Docker nommés (utilise un bind mount), filesystems sans support ACL (NTFS, exFAT, tmpfs), SELinux strict avec `:Z`, ou `userns-remap` Docker activé. La solution la plus fiable reste de configurer le user dans le conteneur (option 1). Astuce : `rwX` (X majuscule) n'ajoute le bit exécutable qu'aux dossiers et fichiers déjà exécutables — plus propre que `rwx` qui rendrait exécutables tous les fichiers texte.","settings.purgeDocsPermissionsRecoverTitle":`Débloquer un worktree déjà cassé (fichiers root-owned existants)`,"settings.purgeDocsPermissionsRecoverIntro":`Si tu te retrouves avec un worktree déjà rempli de fichiers root-owned (Docker a déjà tourné, vendor / node_modules sont coincés), les ACL préventives ci-dessus ne suffisent pas — il faut traiter les fichiers EXISTANTS. Deux approches, à exécuter dans le dossier du worktree :`,"settings.purgeDocsPermissionsRecoverAclIntro":`Option A — ACL récursive (préserve l'ownership root pour audit, t'ajoute juste un accès en parallèle) :`,"settings.purgeDocsPermissionsRecoverAclCommand":`# pose l'ACL par défaut pour les futurs fichiers ET donne accès à tout l'existant
|
|
66
|
-
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Reprendre la propriété (plus simple, perd l'info "créé par root dans le conteneur" mais osef en pratique) :`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Astuce : tu peux exécuter ces commandes directement sur la racine de tes worktrees (ex. `~/.worktrees/`) pour couvrir tous les workspaces existants ET futurs d'un seul coup. Une fois fait, la purge Kōbō fonctionnera sans erreur de permission.","contextMenu.runSetup":`Lancer le script de setup`,"contextMenu.exportEvents":`Exporter les events (CSV)`,"contextMenu.dismissChangesRequested":`Marquer « Modifications demandées » comme vu`,"contextMenu.dismissCiFailure":`Marquer « CI en échec » comme vu`,"contextMenu.restoreChangesRequested":`Marquer « Modifications demandées » comme non vu`,"contextMenu.restoreCiFailure":`Marquer « CI en échec » comme non vu`,"contextMenu.exportingEvents":`Préparation de l'export…`,"contextMenu.exportEventsError":`Échec de l'export des events`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"contextMenu.openPr":`Ouvrir la PR`,"contextMenu.ignorePrWatch":`Ignorer les checks PR`,"contextMenu.resumePrWatch":`Réactiver les checks PR`,"contextMenu.prWatchToggleFailed":`Échec de la mise à jour des checks PR`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"workspace.searchArchivedToggle":`Inclure les workspaces archivés dans la recherche`,"workspace.descriptionPlaceholder":`Ajouter une courte description`,"workspace.descriptionDialogHint":`Texte brut, 200 caractères maximum. Laisser vide pour effacer.`,"workspace.descriptionTooLong":`La description doit faire 200 caractères ou moins.`,"workspace.descriptionSaveFailed":`Échec de l'enregistrement de la description.`,"workspace.agentDescriptionTooltip":`État en direct maintenu par l'agent`,"mcp.tool.setWorkspaceDescription":`Définit la courte description du workspace (≤ 200 caractères).`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.branchPrefixesTitle":`Préfixes de branche`,"settings.branchPrefixesHint":`Gérez les préfixes de branche Git disponibles sur la page de création. Le premier est présélectionné par défaut.`,"settings.branchPrefixesEmpty":`Aucun préfixe de branche défini. Ajoutez-en au moins un ci-dessous.`,"settings.branchPrefixesAddLabel":`Nouveau préfixe`,"settings.branchPrefixesEditHint":`Cliquer pour renommer`,"settings.branchPrefixesMoveUp":`Monter`,"settings.branchPrefixesMoveDown":`Descendre`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Choisis où créer les worktrees des nouveaux workspaces. Les chemins relatifs sont résolus depuis le projet ; les chemins absolus Linux/macOS et Windows, $HOME, ~ et %USERPROFILE% sont supportés.`,"settings.worktreesPathLabel":`Chemin des worktrees`,"settings.worktreesPathRequired":`Le chemin des worktrees est requis.`,"settings.worktreesPrefixByProject":`Préfixer les worktrees par le nom du projet`,"settings.worktreesPrefixByProjectHint":`Place chaque worktree dans un sous-dossier nommé d'après le projet, pour éviter les collisions quand plusieurs projets partagent la même racine.`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"settings.network.title":`Accès réseau`,"settings.network.hint":`Pilote Kōbō depuis un autre appareil de ton LAN de confiance. Off = localhost uniquement. On = accessible sur ton réseau, protégé par un token. Redémarre Kōbō après bascule.`,"settings.network.enable":`Activer l'accès réseau`,"settings.network.behindProxy":`Derrière un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ne peut plus distinguer ta propre machine d'une requête relayée — même le localhost devra présenter le token désormais. N'active ceci que si un reverse proxy (Traefik, nginx, Caddy…) est devant Kōbō.`,"settings.network.restartRequired":`Redémarre Kōbō pour appliquer la nouvelle adresse de bind.`,"settings.network.token":`Token d'accès`,"settings.network.copy":`Copier`,"settings.network.copied":`Copié`,"settings.network.regenerate":`Régénérer`,"settings.network.regenerateConfirm":`Régénérer le token ? Les appareils connectés devront utiliser le nouveau token.`,"settings.network.urls":`URLs LAN`,"settings.network.scan":`Scanner pour se connecter`,"settings.network.noUrls":`Aucune adresse LAN détectée.`,"settings.network.loadFailed":`Échec du chargement des réglages d'accès réseau.`,"settings.network.updateFailed":`Échec de la mise à jour des réglages d'accès réseau.`,"settings.unsavedChanges.title":`Modifications non enregistrées`,"settings.unsavedChanges.message":`Ce projet a des modifications non enregistrées. Changer de projet les annulera.`,"settings.unsavedChanges.discard":`Ignorer et changer`,"settings.unsavedChanges.cancel":`Annuler`,"settings.loadFailed":`Les réglages n’ont pas pu être chargés`,"settings.loadFailedHint":`L’enregistrement est désactivé : le formulaire affiche les valeurs par défaut, et les écrire remplacerait votre configuration réelle.`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"changelog.title":`Journal des changements`,"changelog.tooltip":`Quoi de neuf dans Kōbō`,"changelog.empty":`Aucun changelog disponible.`,"changelog.current":`actuelle`,"changelog.currentVersion":`Version actuelle : v{version}`,"health.envTitle":`Environnement`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.settingsSchemaVersion":`Schéma settings`,"health.runtimesTitle":`Moteurs d'agent`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude introuvable dans le PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binaire codex introuvable`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`Ni gh ni glab trouvés — pull requests et surveillance de CI indisponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"health.integrationDisabled":`désactivée`,"settings.integrationEnabled":`Activer l’intégration`,"health.activeTitle":`État actif`,"health.activeQuotaBackoffs":`Quota backoffs en attente`,"health.activeWakeups":`Wakeups programmés`,"health.activeAutoLoop":`Auto-loop en cours`,"health.activeAgentSessions":`Sessions agent en cours`,"health.activeDevServers":`Serveurs de dev lancés`,"health.noneActive":`Aucun.`,"health.quotaResumeAt":`reprise à {time}`,"health.wakeupAt":`réveil à {time}`,"health.startedAgo":`démarré il y a {time}`,"health.autoLoopReady":`prêt, itération en cours`,"health.autoLoopGrooming":`grooming en cours`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"session.endedCompleted":`Tour terminé — envoyez un message pour continuer`,"session.endedKilled":`Session arrêtée`,"session.endedError":`Session terminée sur une erreur`,"session.endedWatchdog":`Session fermée de force après une période d'inactivité`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.compacting":`Compaction du contexte…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"activity.empty":`Rien pour l’instant`,"activity.emptyHint":`La sortie de l’agent s’affichera ici dès qu’une session démarrera.`,"activity.a11y.region":`Annonces d’activité de l’agent`,"activity.a11y.agentSaid":`Agent : {text}`,"activity.a11y.toolStarted":`Outil {name} démarré`,"activity.a11y.toolFinished":`Outil {name} terminé`,"activity.a11y.toolFailed":`Outil {name} en échec`,"chat.systemPrompt":`Prompt système`,"chat.agent":`Agent`,"chat.cleanupScript":`Script de cleanup`,"chat.archiveScript":`Script d'archivage`,"chat.setupScript":`Script de setup`,"chat.scriptDone":`Fait`,"chat.scriptComplete":`[{phase}] Terminé`,"chat.scriptError":`[{phase}] Erreur : {message}`,"chat.unknownError":`inconnue`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"cron.pendingIndicator":`{n} cron(s) programmé(s)`,"schedule.tabLabel":`Programmation`,"schedule.panelTitle":`Automatisation`,"schedule.panelDescription":`Réveiller ce workspace plus tard ou exécuter des instructions selon un planning.`,"schedule.activeTitle":`Planifications actives`,"schedule.emptyTitle":`Aucune planification`,"schedule.emptyDescription":`Créez un réveil ponctuel ou une tâche récurrente ci-dessous.`,"schedule.cancelWakeup":`Annuler ce réveil`,"schedule.cancelCron":`Supprimer cette tâche récurrente`,"schedule.createTitle":`Créer une planification`,"schedule.createDescription":`Choisissez quand et comment l'agent doit s'exécuter.`,"schedule.typeWakeup":`Réveil ponctuel`,"schedule.typeRecurring":`Tâche récurrente`,"schedule.wakeupDescription":`Exécuter le prompt une fois après un délai.`,"schedule.cronDescription":`Exécuter le prompt régulièrement selon une fréquence fixe.`,"schedule.promptHint":`Instructions qui seront envoyées à l'agent`,"schedule.frequencyTitle":`Fréquence`,"schedule.advancedDescription":`Utiliser une expression cron brute`,"schedule.cronExpressionLabel":`Expression cron`,"schedule.sessionModeTitle":`Session d'exécution`,"schedule.modeResume":`Reprendre la session`,"schedule.oneShotHint":`Supprimer cette planification après sa première exécution.`,"schedule.wakeupTitle":`Wakeup en attente`,"schedule.cronsTitle":`Tâches récurrentes`,"schedule.noWakeup":`Aucun wakeup programmé`,"schedule.noCrons":`Aucun cron programmé`,"schedule.nextFireAt":`prochain à {time}`,"schedule.lastFiredAt":`dernier fire il y a {time}`,"schedule.addCronTitle":`Ajouter une tâche récurrente`,"schedule.addWakeupTitle":`Programmer un réveil`,"schedule.every":`Toutes les`,"schedule.unitMinutes":`minutes`,"schedule.unitHours":`heures`,"schedule.unitDays":`jours`,"schedule.daysDriftWarning":`L'intervalle peut se réduire à 1 jour en fin de mois (limitation du format cron).`,"schedule.advancedExpression":`Expression avancée (optionnel)`,"schedule.advancedHint":`Cron brut (ex. */15 * * * *) ou {'@'}hourly/{'@'}daily — remplace le sélecteur si rempli.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Libellé (optionnel)`,"schedule.delayMinutes":`Délai (minutes)`,"schedule.modeFresh":`Nouvelle session`,"schedule.oneShot":`Une seule fois`,"schedule.addCronBtn":`Ajouter le cron`,"schedule.addWakeupBtn":`Programmer le réveil`,"schedule.cronCreated":`Tâche récurrente ajoutée`,"schedule.wakeupCreated":`Réveil programmé`,"askUserQuestion.title":`L'agent te pose une question`,"askUserQuestion.submit":`Envoyer la réponse`,"askUserQuestion.multiSelectHint":`Sélectionne une ou plusieurs options`,"askUserQuestion.otherOption":`Autre`,"askUserQuestion.otherOptionHint":`précisez dans votre prochain message`,"askUserQuestion.freeFormLabel":`Précisez votre réponse`,"askUserQuestion.freeFormHint":`Cette réponse sera envoyée directement à l'agent.`,"askUserQuestion.noPending":`Aucune question en attente`,"askUserQuestion.next":`Suivant`,"askUserQuestion.previous":`Précédent`,"askUserQuestion.cancel":`Annuler`,"askUserQuestion.cancelTooltip":`Sauter cette question — l'agent continuera sans réponse`,"askUserQuestion.collapse":`Réduire le panneau de question`,"askUserQuestion.expand":`Agrandir le panneau de question`,"permissionRequest.title":`L'agent veut utiliser un outil`,"permissionRequest.allow":`Autoriser`,"permissionRequest.allowOnce":`Autoriser une fois`,"permissionRequest.allowTurn":`Autoriser ce tour`,"permissionRequest.allowOperation":`Toujours cette opération`,"permissionRequest.allowTool":`Toujours cet outil`,"permissionRequest.deny":`Refuser`,"permissionRequest.tool":`Outil`,"permissionRequest.input":`Entrée`,"permissionRequest.rawInput":`Détails techniques`,"permissionRequest.collapse":`Réduire le panneau de permission`,"permissionRequest.expand":`Agrandir le panneau de permission`,"permissionRequest.denied":`refusé par l'utilisateur`,"workspaceStatus.created":`créé`,"workspaceStatus.extracting":`extraction`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.executing":`en cours`,"workspaceStatus.awaitingUser":`en attente de ta réponse`,"workspaceStatus.completed":`terminé`,"workspaceStatus.idle":`inactif`,"workspaceStatus.error":`erreur`,"workspaceStatus.quota":`quota atteint`,"workspaceStatus.retrying":`reprise automatique`,"workspaceList.prOpen":`#{n} — Pull request ouverte`,"workspaceList.prWatchDisabledIndicator":`Checks PR ignorés pour ce workspace`,"workspaceList.prChangesRequested":`#{n} — Modifications demandées`,"workspaceList.attentionCiFailed":`CI en échec`,"workspaceList.attentionChangesRequested":`Modifications demandées`,"workspaceList.attentionReadyToMerge":`Prêt à merger`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.reprepare":`Re-préparer pour auto-loop`,"autoLoop.reprepareTooltip":`Relancer la phase de grooming pour ajouter ou rafraîchir les tâches avant de relancer la boucle`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm :`,"autoLoop.brainstormModelTooltip":`Modèle utilisé uniquement pour la session de brainstorming initiale — chaque tâche ensuite utilise le modèle choisi au-dessus`,"autoLoop.brainstormReasoningPrefix":`Brainstorm :`,"autoLoop.brainstormReasoningTooltip":`Niveau de raisonnement utilisé uniquement pour la session de brainstorming initiale`,"autoLoop.executionModelPrefix":`Loop :`,"autoLoop.executionModelTooltip":`Modèle utilisé pour chaque tâche de l'auto-loop après la session de brainstorming initiale`,"autoLoop.sessionMode.perTask":`Nouvelle session par tâche`,"autoLoop.sessionMode.label":`Session :`,"autoLoop.sessionMode.perTaskTooltip":`Chaque tâche démarre une session Claude Code neuve, sans mémoire des tâches précédentes`,"autoLoop.sessionMode.continuous":`Session continue`,"autoLoop.sessionMode.continuousTooltip":`Toutes les tâches s'enchaînent dans la même session — l'agent garde tout le contexte, mais la session s'allonge au fil du temps`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.staleTitle":`Session précédente`,"staleSessionBanner.staleMessage":`Vous consultez une ancienne session — les messages envoyés iront dans cette session, pas la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`,"network.login.title":`Accès réseau`,"network.login.description":`Ce Kōbō nécessite un token pour être piloté depuis le réseau. Colle le token affiché dans les Réglages sur la machine hôte.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Colle ton token`,"network.login.connect":`Se connecter`,"network.login.invalid":`Token invalide`,"network.login.serverError":`Erreur serveur — réessaie.`,"network.login.unreachable":`Kōbō est injoignable — vérifie ta connexion.`,"layout.toggleWorkspaces":`Afficher/masquer les espaces de travail`,"layout.togglePanel":`Afficher/masquer le panneau latéral`,"unsaved.title":`Quitter sans enregistrer ?`,"unsaved.message":`Vous avez des modifications non enregistrées. Quitter cette page les abandonne.`,"unsaved.leave":`Quitter`,"unsaved.stay":`Rester`},Pr={"model.tooltip":`Modello usato dall’agente per questo workspace`,"reasoning.tooltip":`Livello di ragionamento usato dall’agente per questo workspace`,"thinking.label":`Ragionamento`,"thinking.noDetails":`L’agente sta ragionando…`,"common.save":`Salva`,"common.cancel":`Annulla`,"common.retry":`Riprova`,"common.delete":`Elimina`,"common.close":`Chiudi`,"common.dismiss":`Ignora`,"common.details":`Dettagli`,"common.ok":`OK`,"whatsNew.title":`Novità`,"common.loading":`Caricamento...`,"common.search":`Cerca...`,"common.refresh":`Aggiorna`,"common.copy":`Copia`,"common.copied":`Copiato negli appunti`,"common.copyFailed":`Copia non riuscita`,"common.add":`Aggiungi`,"folderPicker.title":`Scegli una cartella`,"folderPicker.parent":`Cartella superiore`,"folderPicker.empty":`Nessuna sottocartella`,"folderPicker.select":`Scegli questa cartella`,"common.start":`Avvia`,"common.stop":`Arresta`,"common.archive":`Archivia`,"common.unarchive":`Ripristina`,"common.selectWorkspace":`Seleziona un workspace`,"common.noResults":`Nessun risultato per "{query}"`,"common.send":`invia`,"common.newLine":`nuova riga`,"common.history":`cronologia`,"common.justNow":`adesso`,"common.minutesAgo":`{count}m fa`,"common.hoursAgo":`{count}h fa`,"common.daysAgo":`{count}g fa`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`Modello più capace — successore di Opus 4.8, contesto 1M, adaptive thinking`,"model.mythos5Description":`Fable 5 senza classificatori di sicurezza — accesso limitato (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude sceglie il modello ottimale`,"model.opus5Description":`Per coding agentico complesso e lavoro enterprise, contesto 1M`,"model.opus48Description":`Opus più capace — coding agentico long-horizon, contesto 1M di default, effort high di default`,"model.opus47ClassicDescription":`Ultimo Opus, il più capace`,"model.opus471mDescription":`Ultimo Opus, contesto 1M`,"model.opusClassicDescription":`Più potente`,"model.opus1mDescription":`Più potente, contesto 1M`,"model.sonnet5Description":`Il miglior mix di velocità e intelligenza, contesto 1M`,"model.sonnetClassicDescription":`Bilanciato`,"model.sonnet1mDescription":`Bilanciato, contesto 1M`,"model.haikuDescription":`Più veloce`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`L'ultimo modello all'avanguardia per il coding agentico (richiede autenticazione ChatGPT)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Modello di coding agentico bilanciato per il lavoro quotidiano (richiede autenticazione ChatGPT)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Modello di coding agentico veloce ed economico (richiede autenticazione ChatGPT)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Consigliato per codice complesso (richiede autenticazione ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Ripiego predefinito — ragionamento solido, compatibile con chiave API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Veloce ed efficiente — ideale per attività reattive e subagenti`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Ottimizzato per il lavoro professionale e gli agenti a lungo termine`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modello specializzato in codice per ingegneria software complessa`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`nessuno`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Lascia decidere al motore`,"reasoning.minimalDescription":`Ragionamento più veloce e superficiale`,"reasoning.noneDescription":`Senza ragionamento aggiuntivo`,"reasoning.lowDescription":`Più veloce, meno profondità`,"reasoning.mediumDescription":`Bilanciato`,"reasoning.highDescription":`Più profondità`,"reasoning.xhighDescription":`Profondità estesa, attività lunghe`,"reasoning.maxDescription":`Profondità massima`,"agentPermissionMode.label":`Modalità permessi`,"agentPermissionMode.plan":`Piano`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Accetta edit`,"agentPermissionMode.interactive":`Interattivo`,"agentPermissionMode.tooltip":`Come l'agente gestisce i permessi degli strumenti. Piano: sola lettura, nessuna scrittura. Bypass: salta tutte le richieste. Stretto: auto-accetta le edit dei file, rispetta le allow/deny per il resto. Interattivo: chiedi all'utente prima di ogni strumento tramite il pannello dei permessi.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop forza una modalità diversa da Piano — Piano blocca gli strumenti MCP e le edit di cui il loop ha bisogno. Scegli Bypass, Stretto o Interattivo.`,"agentPermissionMode.autoLoopLocked":`Bloccato su Bypass finché l'auto-loop è attivo — qualsiasi altra modalità fermerebbe il loop sulle richieste di permesso. AskUserQuestion funziona comunque.`,"workspaceList.title":`Workspace`,"workspaceList.a11y.groupToggle":`Gruppo {group}, {count} workspace`,"workspaceList.a11y.list":`Workspace`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Richiede attenzione`,"workspaceList.running":`In esecuzione`,"workspaceList.idle":`Inattivo`,"workspaceList.archived":`Archiviati`,"workspaceList.archivedToast":`«{name}» archiviato`,"workspaceList.archivedUndo":`Annulla`,"workspaceList.unarchiveFailed":`Impossibile ripristinare questo workspace`,"workspaceList.noWorkspaces":`Nessun workspace ancora`,"workspaceList.loadFailed":`Impossibile caricare i tuoi workspace`,"workspaceList.loadFailedHint":`È un errore di connessione, non un account vuoto.`,"workspaceList.footer":`{count} workspace | {count} workspace`,"workspaceList.footerRunning":`{count} in esecuzione`,"workspaceList.deleteDialog.title":`Eliminare il workspace?`,"workspaceList.deleteDialog.deleteLocal":`Elimina branch locale`,"workspaceList.deleteDialog.deleteRemote":`Elimina branch remoto`,"workspaceList.deleteDialog.warning":`Attenzione: questa azione è irreversibile sul remoto.`,"workspaceList.deleteArchivedDialog.tooltip":`Elimina tutti i workspace archiviati`,"workspaceList.deleteArchivedDialog.title":`Eliminare tutti i workspace archiviati?`,"workspaceList.deleteArchivedDialog.message":`Questa operazione eliminerà definitivamente i {count} workspace archiviati. L'azione è irreversibile.`,"workspacePage.selectWorkspace":`Seleziona un workspace per iniziare`,"workspacePage.commandPalettePlaceholder":`Cerca comandi…`,"workspacePage.commandPaletteEmpty":`Nessun comando corrispondente`,"workspacePage.commandFocusChat":`Metti a fuoco il campo chat`,"workspacePage.commandSearchHistory":`Cerca nella cronologia del workspace`,"workspacePage.commandTogglePanel":`Mostra o nascondi il pannello laterale`,"workspacePage.commandStartAgent":`Avvia agente`,"workspacePage.commandStopAgent":`Ferma agente`,"workspacePage.commandOpenSettings":`Apri le impostazioni`,"workspacePage.commandOpenCreate":`Crea un workspace`,"workspacePage.commandOpenSearch":`Ricerca globale`,"workspacePage.commandOpenHealth":`Pagina Salute`,"workspacePage.commandOpenChangelog":`Changelog`,"workspacePage.commandGroupWorkspaces":`Vai a un workspace`,"workspacePage.commandPaletteHint":`Palette dei comandi`,"workspacePage.session":`Sessione #{n}`,"workspacePage.newSession":`+ Nuova sessione`,"workspacePage.renameSession":`Rinomina`,"workspacePage.renameSessionTitle":`Rinomina sessione`,"workspacePage.sessionNameLabel":`Nome sessione`,"workspacePage.sessionEndedNotice":`Questa sessione è terminata. Crea una nuova sessione per continuare.`,"workspacePage.renameFailed":`Rinomina fallita`,"workspacePage.copySessionId":`Copia ID sessione`,"workspacePage.deleteSession":`Elimina sessione`,"workspacePage.deleteSessionTitle":`Eliminare la sessione?`,"workspacePage.deleteSessionConfirm":`Questo elimina definitivamente la sessione e la cronologia della conversazione.`,"workspacePage.deleteSessionFailed":`Impossibile eliminare la sessione`,"workspacePage.noEngineSessionId":`Nessun ID sessione ancora — l'agente non ha ancora avviato questa sessione`,"workspacePage.createSessionFailed":`Creazione sessione fallita`,"workspacePage.startFailed":`Avvio fallito`,"workspacePage.stopFailed":`Arresto fallito`,"workspacePage.interrupt":`Interrompi`,"workspacePage.interrupted":`Agente interrotto — in attesa del tuo prossimo messaggio`,"workspacePage.lastAgentEvent":`Ultimo evento {when}`,"workspacePage.agentStopping":`Arresto in corso…`,"workspacePage.agentNotRunning":`Nessun agente in esecuzione — lo stato è obsoleto`,"workspacePage.archivedBanner":`Workspace archiviato — sola lettura`,"workspacePage.worktreePurgedBanner":`Worktree eliminato — cronologia conservata, ripristino non disponibile in questa versione`,"workspacePage.worktreePurgedTooltip":"La cartella del worktree è stata eliminata dal disco per recuperare spazio. Cronologia di chat, sessioni e metadati della PR restano consultabili qui, ma la directory di lavoro non esiste più localmente. Una versione futura di Kōbō ricostruirà il worktree dalla PR mergiata — per ora ricrealo manualmente con `gh pr checkout` o `git worktree add`.","workspacePage.pendingInitialPromptBanner":`C'è un prompt iniziale in attesa — l'agente non l'ha mai ricevuto (lo script di setup è crashato o il workspace non è mai stato avviato). Clicca Avvia per inviarlo ora.`,"workspacePage.unarchived":`Workspace ripristinato`,"workspacePage.unarchiveFailed":`Ripristino fallito`,"workspacePage.interruptFailed":`Interruzione fallita`,"workspacePage.interruptHint":`Interrompi il turno in corso senza terminare la sessione.`,"workspacePage.interruptTooltip":`Interruzione leggera (come Escape) — ferma lo strumento corrente ma mantiene la sessione attiva`,"workspacePage.pendingNextRun":`Applicato al prossimo avvio`,"workspacePage.activeSessionModel":`In uso: {model}`,"workspacePage.activeSessionModelTooltip":`Modello effettivamente usato dalla sessione selezionata`,"workspacePage.switchEngine":`Cambia motore`,"workspacePage.switchEngineHint":`Continua questo workspace con un altro motore agente`,"workspacePage.moreActions":`Altre azioni`,"workspacePage.switchEngineTitle":`Cambia motore agente`,"workspacePage.switchEngineWarning":`L'agente attuale verrà fermato e una nuova sessione inizierà nello stesso worktree.`,"workspacePage.engineLabel":`Motore`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Passaggio al nuovo motore`,"workspacePage.engineHandoffHint":`Rivedi o modifica il contesto inviato al nuovo agente.`,"workspacePage.confirmSwitchEngine":`Cambia motore`,"workspacePage.switchEngineFailed":`Impossibile cambiare motore`,"whip.dispatchFailed":`Impossibile inviare il messaggio della frusta`,"whip.phrase1":`Più veloce, tocard!`,"whip.phrase2":`Accelera il ritmo, tocard!`,"whip.phrase3":`Torna al lavoro, tocard!`,"whip.phrase4":`Fammi vedere un po' di velocità, tocard!`,"whip.phrase5":`Meno pensieri e più azione, tocard!`,"search.title":`Ricerca`,"search.tooltip":`Cerca nella cronologia degli agenti`,"search.placeholder":`Cerca in tutti i messaggi degli agenti…`,"search.includeArchived":`Includi workspace archiviati`,"search.loading":`Ricerca in corso…`,"search.noResults":`Nessun risultato`,"search.error":`Ricerca fallita: {message}`,"search.resultCount":`{n} risultato/i`,"search.eventType.userMessage":`Tu`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Nessuna attività ancora`,"activityFeed.emptyHint":`Avvia un workspace per vedere l'output dell'agente qui`,"activityFeed.initialPrompt":`Prompt iniziale`,"activityFeed.you":`Tu`,"activityFeed.agent":`Agente`,"activityFeed.question":`Domanda`,"activityFeed.goToPrevious":`Vai al messaggio precedente`,"activityFeed.scrollToBottom":`Vai in fondo`,"activityFeed.sendAnswers":`Invia risposte`,"agentBusy.banner":`L'agente è occupato`,"agentBusy.subagentsRunning":`1 sub-agente in esecuzione | {n} sub-agenti in esecuzione`,"agentBusy.viewSubagents":`Vedi sub-agenti`,"agentBusy.pendingMessage":`In attesa — l'agente è occupato`,"terminal.title":`Terminale`,"terminal.open":`Apri terminale`,"terminal.close":`Chiudi terminale`,"terminal.noWorkspace":`Seleziona un workspace`,"terminal.noWorktree":`Worktree non ancora creato`,"terminal.error":`Errore del terminale`,"terminal.exited":`Terminale chiuso`,"terminal.disconnected":`Connessione persa`,"terminal.reconnecting":`Riconnessione… (tentativo {attempt} di {max})`,"terminal.reconnect":`Riconnetti`,"chatInput.placeholder":`Messaggio... (/ per le skill)`,"chatInput.fileSearchHint":`cercare un file`,"chatInput.skills":`Skill`,"chatInput.attachImage":`Allega immagine`,"chatInput.queueBanner":`Messaggio in coda — verrà inviato quando l'agente avrà terminato`,"chatInput.forceQueue":`Forza invio`,"chatInput.searchHistory":`cerca`,"chatInput.commandPalette":`comandi`,"chatInput.shortcuts":`Scorciatoie da tastiera`,"chatInput.cancelQueue":`Annulla coda`,"chatInput.autoLoopBanner":`Auto-loop attivo — fermalo per inviare un messaggio`,"chatInput.awaitingUserBanner":`L'agente attende la tua risposta sopra — rispondi tramite il pannello della domanda`,"chatInput.autoLoopStop":`Ferma`,"koboCommand.checkProgressDesc":`Verificare il progresso delle attività e dei criteri di accettazione`,"chatInput.uploading":`Caricamento...`,"voice.title":`Trascrizione vocale`,"voice.enabled":`Abilita trascrizione vocale locale`,"voice.pttKey":`Tasto push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Spazio`,"voice.language":`Lingua (auto o codice)`,"voice.model":`Modello attivo`,"voice.commandPath":`Percorso binario Whisper (opzionale)`,"voice.ffmpegPath":`Percorso binario ffmpeg (opzionale)`,"voice.temperature":`Temperatura`,"voice.temperatureHint":`Più basso = più deterministico; più alto = più flessibile ma potenzialmente meno stabile.`,"voice.initialPrompt":`Prompt iniziale (opzionale)`,"voice.initialPromptHint":`Contesto opzionale per aiutare Whisper con nomi propri, sigle o vocabolario tecnico.`,"voice.translateToEnglish":`Traduci in inglese`,"voice.translateToEnglishHint":`Se attivo, il parlato non inglese viene tradotto in inglese invece di essere trascritto così com’è.`,"voice.suppressNst":`Sopprimi token non vocali`,"voice.suppressNstHint":`Prova a ridurre artefatti non vocali nella trascrizione.`,"voice.installLink":`Installa whisper.cpp`,"voice.installGuideTitle":`Guida installazione`,"voice.installGuideIntro":`Installa whisper.cpp e ffmpeg, poi imposta i percorsi dei binari qui sotto se necessario.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Dopo il build con CMake, il binario Whisper di solito è in: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Poi imposta “Percorso binario Whisper” e “Percorso binario ffmpeg” in questa sezione (o lascia vuoto se sono nel PATH).`,"voice.noneModel":`Nessun modello attivo`,"voice.notInstalled":`non installato`,"voice.download":`Scarica`,"voice.delete":`Elimina`,"voice.holdToTalk":`Tieni premuto per parlare`,"voice.recording":`Registrazione...`,"voice.transcribing":`Trascrizione...`,"voice.notSupported":`La registrazione vocale non è supportata da questo browser`,"voice.errorMicPermission":`Permesso microfono negato`,"voice.errorTranscription":`Trascrizione vocale non riuscita`,"voice.downloadFailed":`Download del modello non riuscito`,"voice.deleteFailed":`Eliminazione del modello non riuscita`,"voice.errorDisabled":`La trascrizione vocale è disattivata nelle impostazioni`,"voice.errorModelMissing":`Nessun modello vocale attivo configurato`,"voice.errorModelNotInstalled":`Il modello vocale attivo non è installato`,"voice.errorAudioInvalid":`La cattura audio è non valida o vuota`,"voice.errorLanguageInvalid":`La configurazione lingua vocale non è valida`,"voice.errorRuntimeMissing":`Il runtime Whisper non è installato o non è nel PATH`,"voice.maxDurationReached":`Durata massima di registrazione raggiunta`,"voice.runtimeReady":`Runtime pronto: {command}`,"voice.runtimeMissing":`Runtime mancante: {command}`,"voice.ffmpegReady":`ffmpeg pronto`,"voice.ffmpegMissing":`ffmpeg mancante`,"voice.sectionRuntime":`Stato del runtime`,"voice.sectionActivation":`Attivazione`,"voice.sectionModels":`Modelli Whisper`,"voice.sectionAdvanced":`Opzioni avanzate`,"voice.sectionBehavior":`Comportamento della trascrizione`,"voice.sectionBinaries":`Percorsi dei binari`,"voice.downloadModels":`Scarica un modello`,"voice.cancelFailed":`Annullamento del download non riuscito`,"createPage.title":`Crea un workspace`,"createPage.subtitle":`Descrivi la missione, scegli un progetto e configura l’agente.`,"createPage.sectionMission":`Missione`,"createPage.sectionMissionHint":`Fornisci all’agente un obiettivo chiaro e il contesto necessario.`,"createPage.workspaceNameLabel":`Nome del workspace`,"createPage.descriptionLabel":`Descrizione della missione`,"createPage.sources":`Fonti facoltative`,"createPage.sectionGit":`Progetto Git`,"createPage.sectionGitHint":`Scegli il repository, il branch di partenza e la modalità worktree.`,"createPage.worktreeMode":`Modalità worktree`,"createPage.worktreeNew":`Nuovo worktree isolato`,"createPage.worktreeExisting":`Riutilizza un worktree esistente`,"createPage.projectLabel":`Progetto`,"createPage.sourceBranch":`Branch di partenza`,"createPage.workingBranchPreview":`Anteprima del branch di lavoro`,"createPage.branchNamePending":`nome-del-workspace`,"createPage.sectionAgent":`Agente`,"createPage.sectionAgentHint":`Controlla le impostazioni di esecuzione o attiva l’automazione.`,"createPage.configureAgent":`Configura l’agente`,"createPage.advancedOptions":`Opzioni avanzate`,"createPage.keyboardHint":`Premi Ctrl/Cmd + Invio per creare il workspace.`,"createPage.createWorkspace":`Crea workspace`,"createPage.notionEnabled":`Notion attivato`,"createPage.importNotion":`Importa da Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL deve iniziare con https://www.notion.so/ o https://app.notion.com/`,"createPage.notionAutoExtract":`Le sottotask e i criteri di accettazione verranno estratti automaticamente.`,"createPage.notionPanelChoiceLabel":`Questo URL punta a una sotto-pagina (?p=). Su quale vuoi lavorare?`,"createPage.notionPanelOption":`Sotto-pagina (panel)`,"createPage.notionPanelOptionDesc":`La pagina che stavi visualizzando — consigliato`,"createPage.notionParentOption":`Pagina principale`,"createPage.notionParentOptionDesc":`L'epic / database a cui appartiene`,"createPage.importSentry":`Importa Sentry`,"createPage.sentryEnabled":`Sentry attivato`,"createPage.sentryPlaceholder":`https://tua-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL deve puntare a una issue di Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue di Sentry verrà importata automaticamente`,"createPage.sentryExtractHint":`Kobo estrarrà l'issue e la scriverà in .ai/thoughts/`,"createPage.workspaceName":`Nome del workspace (predefinito: titolo della pagina Notion)`,"createPage.workspaceNamePlaceholder":`Nome del workspace...`,"createPage.instructions":`Istruzioni aggiuntive (opzionale)...`,"createPage.instructionsPlaceholder":`Descrivi il task...`,"createPage.tasks":`Task ({count})`,"createPage.addTask":`Aggiungi un task...`,"createPage.acceptanceCriteria":`Criteri di accettazione ({count})`,"createPage.addCriterion":`Aggiungi un criterio...`,"createPage.projectPath":`Inserisci il percorso del progetto`,"createPage.branchType":`Tipo di branch`,"createPage.branch":`Branch`,"createPage.noBranches":`Nessun branch trovato`,"createPage.enterPath":`Inserisci il percorso del progetto`,"createPage.skipSetupScript":`Salta script di setup`,"createPage.worktreePickerLabel":`Worktree esistente`,"createPage.noOrphanWorktrees":`Nessun worktree orfano in questo progetto`,"createPage.pickWorktreeRequired":`Seleziona un worktree da agganciare`,"createPage.notionExtractHint":`Le sottotask e i criteri di accettazione verranno estratti dalla pagina Notion.`,"createPage.errorCreating":`Errore durante la creazione del workspace.`,"createPage.branchAdjusted":"Il branch esisteva già — creato `{branch}` al suo posto. La cartella worktree corrispondente usa lo stesso suffisso.","createPage.localSourceFallback":`Workspace creato dal branch locale (origin non raggiungibile) — la base potrebbe essere obsoleta.`,"createPage.validationNotionUrl":`Inserisci un URL Notion valido (https://www.notion.so/... o https://app.notion.com/...).`,"createPage.validationDescription":`Descrivi il task.`,"createPage.validationName":`Indica un nome per il workspace.`,"createPage.validationPath":`Inserisci il percorso del progetto.`,"createPage.validationBranch":`Seleziona un branch.`,"createPage.validationFocusHint":`Il campo da correggere è evidenziato qui sotto.`,"createPage.progress.validate":`Validazione della richiesta…`,"createPage.progress.fetch-source-branch":`Recupero del branch sorgente da origin…`,"createPage.progress.inspect-worktree":`Ispezione del worktree esistente…`,"createPage.progress.extract-notion":`Estrazione della pagina Notion…`,"createPage.progress.extract-sentry":`Estrazione dell’issue Sentry…`,"createPage.progress.create-record":`Creazione del workspace…`,"createPage.progress.create-tasks":`Creazione di task e criteri di accettazione…`,"createPage.progress.create-worktree":`Creazione del worktree git…`,"createPage.progress.write-conventions":`Scrittura delle convenzioni git…`,"createPage.progress.write-context-files":`Scrittura dei file di contesto…`,"createPage.progress.build-prompt":`Costruzione del prompt iniziale…`,"createPage.progress.setup-script":`Esecuzione del tuo script di installazione…`,"createPage.progress.start-agent":`Avvio dell’agente…`,"createPage.progress.rollback":`Annullamento della creazione fallita…`,"createPage.progress.done":`Fatto`,"createPage.progress.step":`Passo {index} di {total}`,"createPage.errorAtStep":`Creazione fallita al passo «{step}»: {message}`,"createPage.override.title":`Due delle tue scelte sono state sostituite`,"createPage.override.setup-script-forced":`Script di installazione saltato: rieseguirlo su un worktree già preparato potrebbe distruggerne il contenuto.`,"createPage.override.permission-mode-downgraded":`Modalità permessi passata da Plan a Bypass: un ciclo autonomo non può girare in Plan, che blocca strumenti e modifiche.`,"settings.title":`Impostazioni`,"settings.language":`Lingua`,"settings.projectColor":`Colore`,"settings.projectColorClear":`Cancella`,"settings.projectColorDefault":`Predefinito (grigio)`,"settings.workspaceListSection":`Lista dei workspace`,"settings.flattenWorkspaceList":`Lista piatta dei workspace`,"settings.flattenWorkspaceListHint":`Mostra tutti i workspace in una lista piatta con un badge progetto, invece di raggrupparli per progetto.`,"settings.skillSuite.section":`Suite di skill`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personalizzato`,"settings.skillSuite.superpowersHint":`Workflow opinionato TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite di Garry Tan — /review, /ship, /qa, /office-hours, ecc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Le due suite si combinano — superpowers per la metodologia (brainstorm / TDD / piani / review a livello di principi), gstack per i flussi concreti (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Framework agentico di affaan-m — agents, skills, rules e hooks per pianificare, testare, implementare, rivedere e memorizzare (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Le tre suite si combinano — superpowers per la metodologia, gstack per i flussi concreti, ECC per passaggi di review/implementazione multi-agente strutturati.`,"settings.skillSuite.customHint":`Componi i cinque prompt qui sotto con i template che preferisci, poi modificali liberamente.`,"settings.skillSuite.reloadDefaults":`Ripristina predefiniti`,"settings.skillSuite.reloadDefaultsConfirm":`Sostituire i cinque prompt personalizzati con i valori agnostici predefiniti?`,"settings.skillSuite.customPrompts":`Prompt personalizzati`,"settings.skillSuite.agnostic":`Base agnostica`,"settings.skillSuite.importPrompt":`Importa un template`,"settings.skillSuite.imported":`Template importato. Ora puoi modificarlo.`,"settings.skillSuite.importFailed":`Impossibile importare il template`,"settings.skillSuite.reviewTemplate":`Template di review`,"settings.skillSuite.autoLoopReviewGate":`Gate di review auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro di grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Istruzione fase di brainstorming`,"settings.global":`Globale`,"settings.projects":`Progetti`,"settings.globalSettings":`Impostazioni globali`,"settings.defaultModel":`Modello predefinito`,"settings.defaultModelClaude":`Modello predefinito (Claude Code)`,"settings.defaultModelCodex":`Modello predefinito (OpenAI Codex)`,"settings.agentPermissions":`Permessi dell'agente`,"settings.skipPermissions":`Salta le richieste di permesso (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attenzione: disattivando questa opzione, tutti i permessi degli strumenti (Write, Edit, Bash...) verranno negati automaticamente in modalità headless. L'agente potrà solo leggere.`,"settings.notifications":`Notifiche`,"settings.browserNotifications":`Notifica browser quando l'agente termina`,"settings.audioNotifications":`Notifica sonora quando l'agente termina`,"settings.enableBrowserNotifications":`Attiva le notifiche del browser`,"settings.testBrowserNotification":`Prova notifica`,"settings.browserNotificationGranted":`Notifiche del browser consentite`,"settings.browserNotificationDenied":`Notifiche del browser bloccate`,"settings.browserNotificationAsk":`Autorizzazione del browser richiesta`,"settings.browserNotificationUnsupported":`Notifiche del browser non disponibili`,"settings.browserNotificationPermissionNeeded":`Consenti le notifiche del browser per inviare un test.`,"settings.browserNotificationTestTitle":`Test di notifica Kōbō`,"settings.browserNotificationTestBody":`Le notifiche del browser funzionano.`,"settings.enableAudio":`Attiva l'audio`,"settings.notificationSound":`Suono di notifica`,"settings.notificationSoundHint":`Riprodotto quando l'agente termina o richiede un'autorizzazione.`,"settings.questionSound":`Suono delle domande`,"settings.questionSoundHint":`Riprodotto solo quando l'agente ti pone una domanda.`,"settings.workspaceCreatedSound":`Suono di creazione dello spazio di lavoro`,"settings.workspaceCreatedSoundHint":`Riprodotto dopo la creazione di uno spazio di lavoro.`,"settings.notificationSoundPreview":`Ascolta`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Errori dell’agente`,"settings.agentErrorSoundHint":`Riprodotto per quote, limiti di velocità ed errori dell’agente.`,"settings.notificationSoundBasic":`Notifica di base`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Lavoro`,"settings.notificationSoundTravailTermine":`Lavoro finito`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Sta per esplodere`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR e CI`,"settings.soundGeneral":`Suono generale`,"settings.soundNone":`Nessun suono`,"settings.prCiFailedSound":`CI non riuscita`,"settings.prCiRecoveredSound":`CI ripristinata`,"settings.prChangesRequestedSound":`Modifiche richieste`,"settings.prApprovedSound":`PR approvata`,"settings.prMergeConflictSound":`Conflitto di merge`,"settings.prReadyToMergeSound":`Pronta per il merge`,"settings.prMergedSound":`PR unita`,"settings.prCiFailedSoundHint":`Riprodotto quando la CI passa allo stato non riuscito.`,"settings.prCiRecoveredSoundHint":`Riprodotto quando la CI si riprende da un errore.`,"settings.prChangesRequestedSoundHint":`Riprodotto quando una review richiede modifiche.`,"settings.prApprovedSoundHint":`Riprodotto quando la pull request viene approvata.`,"settings.prMergeConflictSoundHint":`Riprodotto quando viene rilevato un conflitto di merge.`,"settings.prReadyToMergeSoundHint":`Riprodotto quando la pull request è pronta per il merge.`,"settings.prMergedSoundHint":`Riprodotto quando la pull request viene unita.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Modalità permessi predefinita`,"settings.defaultPermissionModeClaude":`Modalità permessi predefinita (Claude Code)`,"settings.defaultPermissionModeCodex":`Modalità permessi predefinita (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modalità applicata alla creazione di un workspace. Piano = sola lettura, Bypass = senza richieste, Stretto = auto-accetta le edit con allow-list, Interattivo = chiedi prima di ogni strumento.`,"settings.activityFeed":`Feed attività`,"settings.showThinkingBlocks":`Mostra i blocchi di ragionamento degli agenti`,"settings.whipSettings":`Frusta`,"settings.whipSettingsHint":`Configura la scorciatoia e il volume opzionali della frusta.`,"settings.whipEnabled":`Attiva la frusta`,"settings.whipEnabledHint":`Mostra la frusta interattiva nei workspace attivi compatibili.`,"settings.whipVolume":`Volume della frusta`,"settings.whipVolumeMasterAudioDisabled":`L’audio principale è disattivato. Attiva le notifiche audio per regolare il volume della frusta; il valore salvato viene mantenuto.`,"whip.overlayLabel":`Frusta interattiva`,"whip.overlayInstructions":`Muovi il puntatore per controllare la frusta. Premi Invio o Spazio per farla schioccare. Premi Esc per chiudere.`,"settings.whipShortcut":`Scorciatoia della frusta`,"settings.whipShortcutHint":`Fai clic, poi premi la scorciatoia da usare.`,"settings.whipShortcutRecording":`Premi una scorciatoia…`,"settings.whipShortcutButtonLabel":`Scorciatoia della frusta: {shortcut}`,"settings.whipShortcutRecordingLabel":`Registrazione della scorciatoia della frusta. Premi una scorciatoia…`,"settings.whipShortcutReset":`Ripristina scorciatoia`,"settings.whipShortcutReserved":`Questa scorciatoia è riservata dal browser.`,"settings.testIntegration":`Testa connessione`,"pwa.offline":`Sei offline. Chat e agenti richiedono il server Kōbō.`,"pwa.reconnecting":`Riconnessione al server Kōbō…`,"pwa.installReady":`Installa Kōbō come app.`,"pwa.install":`Installa`,"pwa.ignore":`Ignora`,"pwa.updateReady":`È disponibile un aggiornamento di Kōbō.`,"pwa.reload":`Ricarica`,"chat.searchWorkspaceHistory":`Cerca nella cronologia del workspace`,"chat.historySearch.user":`Tu`,"chat.historySearch.agent":`Agente`,"chat.openInGitDiff":`Apri nel diff Git`,"timeline.title":`Cronologia delle sessioni`,"timeline.export":`Esporta diagnostica`,"timeline.unnamed":`Sessione agente`,"timeline.tools":`{count} strumenti`,"timeline.errors":`{count} errori`,"settings.verboseMessages":`Mostra messaggi di sistema dettagliati (task_progress, task_started)`,"settings.availableVariables":`Variabili disponibili nei template del prompt`,"settings.prPromptTemplate":`Template del prompt PR`,"settings.prPromptPlaceholder":`Istruzioni per l'agente durante la creazione di PR su GitHub...`,"settings.prPromptHint":`Usa le variabili elencate sopra (sintassi doppia parentesi graffa).`,"settings.reviewPromptTemplate":`Template del prompt di revisione`,"settings.reviewPromptPlaceholder":`Istruzioni per l'agente durante la revisione delle modifiche del branch...`,"settings.ciFixPromptTemplate":`Template del prompt «Ripara CI»`,"settings.ciFixPromptHint":`Inviato all'agente quando un workspace ha la CI in errore. Variabili (sintassi doppie graffe): pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Chiedi all'agente di diagnosticare e correggere i job di CI in errore...`,"settings.finalizationPromptTemplate":`Prompt di finalizzazione dell'auto-loop`,"settings.finalizationPromptHint":`Prompt predefinito per l'ultima iterazione dell'auto-loop (controlli di qualità finali). Usato quando un progetto lascia vuoto il proprio prompt di finalizzazione.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Prompt iniziale Notion`,"settings.notionInitialPrompt.help":`Aggiunto al prompt di creazione del workspace quando il workspace ha un ticket Notion. Variabili: {variables}.`,"settings.notionInitialPrompt.project":`Prompt iniziale Notion (override)`,"settings.sentryInitialPrompt":`Prompt iniziale Sentry`,"settings.sentryInitialPrompt.help":`Aggiunto al prompt di creazione del workspace quando il workspace ha una issue Sentry. Variabili: {variables}.`,"settings.sentryInitialPrompt.project":`Prompt iniziale Sentry (override)`,"settings.initialPrompt.inheritHint":`Lasciare vuoto per ereditare. Digita un carattere di spazio bianco per disattivare l'iniezione a questo livello.`,"settings.resetToDefault":`Ripristina`,"settings.resetFailed":`Impossibile caricare il valore predefinito`,"settings.sentryIntegration":`Integrazione Sentry`,"settings.var.prNumber":`Numero della PR (es: 42)`,"settings.var.prUrl":`URL completo della PR creata`,"settings.var.branchName":`Nome del branch di lavoro`,"settings.var.sourceBranch":`Branch sorgente a cui punta la PR`,"settings.var.workspaceName":`Nome del workspace`,"settings.var.projectName":`Ultimo segmento del percorso del progetto`,"settings.var.notionUrl":`URL Notion se impostato, vuoto altrimenti`,"settings.var.commits":`Elenco puntato dei commit tra source e head`,"settings.var.diffStats":`Riepilogo shortstat Git (file, inserimenti, eliminazioni)`,"settings.var.tasks":`Attività regolari come lista di controllo`,"settings.var.acceptanceCriteria":`Criteri di accettazione come lista di controllo`,"settings.gitConventions":`Convenzioni Git (globale)`,"settings.gitConventionsPlaceholder":`# Convenzioni Git...`,"settings.gitConventionsHint":`Queste convenzioni vengono scritte in .ai/.git-conventions.md in ogni nuovo workspace e devono essere seguite dall'agente prima di qualsiasi operazione Git. Sovrascritte dalle convenzioni per progetto se definite.`,"settings.setupScript":`Script di setup`,"settings.cleanupScript":`Script di pulizia`,"settings.archiveScript":`Script di archiviazione`,"settings.archiveScriptHint":`Script di shell eseguito lato server nel worktree quando un workspace viene archiviato. Lascia vuoto per disattivare.`,"settings.archiveScriptPlaceholder":`es. pulire container, liberare spazio su disco…`,"settings.changeSourceBranchScript":`Script di cambio del branch di origine`,"settings.changeSourceBranchScript.help":`Sostituisce il cherry-pick integrato quando non vuoto. Lo script gestisce git, base della PR, force-push e conflitti; Kōbō rifiuta solo se l'agente è in esecuzione e aggiorna i metadati del branch di origine all'uscita 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nuovo branch di origine scelto nella finestra di dialogo
|
|
66
|
+
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Reprendre la propriété (plus simple, perd l'info "créé par root dans le conteneur" mais osef en pratique) :`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Astuce : tu peux exécuter ces commandes directement sur la racine de tes worktrees (ex. `~/.worktrees/`) pour couvrir tous les workspaces existants ET futurs d'un seul coup. Une fois fait, la purge Kōbō fonctionnera sans erreur de permission.","contextMenu.runSetup":`Lancer le script de setup`,"contextMenu.exportEvents":`Exporter les events (CSV)`,"contextMenu.dismissChangesRequested":`Marquer « Modifications demandées » comme vu`,"contextMenu.dismissCiFailure":`Marquer « CI en échec » comme vu`,"contextMenu.restoreChangesRequested":`Marquer « Modifications demandées » comme non vu`,"contextMenu.restoreCiFailure":`Marquer « CI en échec » comme non vu`,"contextMenu.exportingEvents":`Préparation de l'export…`,"contextMenu.exportEventsError":`Échec de l'export des events`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"contextMenu.openPr":`Ouvrir la PR`,"contextMenu.ignorePrWatch":`Ignorer les checks PR`,"contextMenu.resumePrWatch":`Réactiver les checks PR`,"contextMenu.prWatchToggleFailed":`Échec de la mise à jour des checks PR`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"workspace.searchArchivedToggle":`Inclure les workspaces archivés dans la recherche`,"workspace.descriptionPlaceholder":`Ajouter une courte description`,"workspace.descriptionDialogHint":`Texte brut, 200 caractères maximum. Laisser vide pour effacer.`,"workspace.descriptionTooLong":`La description doit faire 200 caractères ou moins.`,"workspace.descriptionSaveFailed":`Échec de l'enregistrement de la description.`,"workspace.agentDescriptionTooltip":`État en direct maintenu par l'agent`,"mcp.tool.setWorkspaceDescription":`Définit la courte description du workspace (≤ 200 caractères).`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.branchPrefixesTitle":`Préfixes de branche`,"settings.branchPrefixesHint":`Gérez les préfixes de branche Git disponibles sur la page de création. Le premier est présélectionné par défaut.`,"settings.branchPrefixesEmpty":`Aucun préfixe de branche défini. Ajoutez-en au moins un ci-dessous.`,"settings.branchPrefixesAddLabel":`Nouveau préfixe`,"settings.branchPrefixesEditHint":`Cliquer pour renommer`,"settings.branchPrefixesMoveUp":`Monter`,"settings.branchPrefixesMoveDown":`Descendre`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Choisis où créer les worktrees des nouveaux workspaces. Les chemins relatifs sont résolus depuis le projet ; les chemins absolus Linux/macOS et Windows, $HOME, ~ et %USERPROFILE% sont supportés.`,"settings.worktreesPathLabel":`Chemin des worktrees`,"settings.worktreesPathRequired":`Le chemin des worktrees est requis.`,"settings.worktreesPrefixByProject":`Préfixer les worktrees par le nom du projet`,"settings.worktreesPrefixByProjectHint":`Place chaque worktree dans un sous-dossier nommé d'après le projet, pour éviter les collisions quand plusieurs projets partagent la même racine.`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"settings.network.title":`Accès réseau`,"settings.network.hint":`Pilote Kōbō depuis un autre appareil de ton LAN de confiance. Off = localhost uniquement. On = accessible sur ton réseau, protégé par un token. Redémarre Kōbō après bascule.`,"settings.network.enable":`Activer l'accès réseau`,"settings.network.behindProxy":`Derrière un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ne peut plus distinguer ta propre machine d'une requête relayée — même le localhost devra présenter le token désormais. N'active ceci que si un reverse proxy (Traefik, nginx, Caddy…) est devant Kōbō.`,"settings.network.restartRequired":`Redémarre Kōbō pour appliquer la nouvelle adresse de bind.`,"settings.network.token":`Token d'accès`,"settings.network.copy":`Copier`,"settings.network.copied":`Copié`,"settings.network.regenerate":`Régénérer`,"settings.network.regenerateConfirm":`Régénérer le token ? Les appareils connectés devront utiliser le nouveau token.`,"settings.network.urls":`URLs LAN`,"settings.network.scan":`Scanner pour se connecter`,"settings.network.noUrls":`Aucune adresse LAN détectée.`,"settings.network.loadFailed":`Échec du chargement des réglages d'accès réseau.`,"settings.network.updateFailed":`Échec de la mise à jour des réglages d'accès réseau.`,"settings.unsavedChanges.title":`Modifications non enregistrées`,"settings.unsavedChanges.message":`Ce projet a des modifications non enregistrées. Changer de projet les annulera.`,"settings.unsavedChanges.discard":`Ignorer et changer`,"settings.unsavedChanges.cancel":`Annuler`,"settings.loadFailed":`Les réglages n’ont pas pu être chargés`,"settings.loadFailedHint":`L’enregistrement est désactivé : le formulaire affiche les valeurs par défaut, et les écrire remplacerait votre configuration réelle.`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"changelog.title":`Journal des changements`,"changelog.tooltip":`Quoi de neuf dans Kōbō`,"changelog.empty":`Aucun changelog disponible.`,"changelog.current":`actuelle`,"changelog.currentVersion":`Version actuelle : v{version}`,"health.envTitle":`Environnement`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.settingsSchemaVersion":`Schéma settings`,"health.runtimesTitle":`Moteurs d'agent`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude introuvable dans le PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binaire codex introuvable`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`Ni gh ni glab trouvés — pull requests et surveillance de CI indisponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"health.integrationDisabled":`désactivée`,"settings.integrationEnabled":`Activer l’intégration`,"health.activeTitle":`État actif`,"health.activeQuotaBackoffs":`Quota backoffs en attente`,"health.activeWakeups":`Wakeups programmés`,"health.activeAutoLoop":`Auto-loop en cours`,"health.activeAgentSessions":`Sessions agent en cours`,"health.activeDevServers":`Serveurs de dev lancés`,"health.noneActive":`Aucun.`,"health.quotaResumeAt":`reprise à {time}`,"health.wakeupAt":`réveil à {time}`,"health.startedAgo":`démarré il y a {time}`,"health.autoLoopReady":`prêt, itération en cours`,"health.autoLoopGrooming":`grooming en cours`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"session.endedCompleted":`Tour terminé — envoyez un message pour continuer`,"session.endedKilled":`Session arrêtée`,"session.endedError":`Session terminée sur une erreur`,"session.endedWatchdog":`Session fermée de force après une période d'inactivité`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.compacting":`Compaction du contexte…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"activity.empty":`Rien pour l’instant`,"activity.emptyHint":`La sortie de l’agent s’affichera ici dès qu’une session démarrera.`,"activity.a11y.region":`Annonces d’activité de l’agent`,"activity.a11y.agentSaid":`Agent : {text}`,"activity.a11y.toolStarted":`Outil {name} démarré`,"activity.a11y.toolFinished":`Outil {name} terminé`,"activity.a11y.toolFailed":`Outil {name} en échec`,"chat.systemPrompt":`Prompt système`,"chat.agent":`Agent`,"chat.cleanupScript":`Script de cleanup`,"chat.archiveScript":`Script d'archivage`,"chat.setupScript":`Script de setup`,"chat.scriptDone":`Fait`,"chat.scriptComplete":`[{phase}] Terminé`,"chat.scriptError":`[{phase}] Erreur : {message}`,"chat.unknownError":`inconnue`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"cron.pendingIndicator":`{n} cron(s) programmé(s)`,"schedule.tabLabel":`Programmation`,"schedule.panelTitle":`Automatisation`,"schedule.panelDescription":`Réveiller ce workspace plus tard ou exécuter des instructions selon un planning.`,"schedule.activeTitle":`Planifications actives`,"schedule.emptyTitle":`Aucune planification`,"schedule.emptyDescription":`Créez un réveil ponctuel ou une tâche récurrente ci-dessous.`,"schedule.cancelWakeup":`Annuler ce réveil`,"schedule.cancelCron":`Supprimer cette tâche récurrente`,"schedule.createTitle":`Créer une planification`,"schedule.createDescription":`Choisissez quand et comment l'agent doit s'exécuter.`,"schedule.typeWakeup":`Réveil ponctuel`,"schedule.typeRecurring":`Tâche récurrente`,"schedule.wakeupDescription":`Exécuter le prompt une fois après un délai.`,"schedule.cronDescription":`Exécuter le prompt régulièrement selon une fréquence fixe.`,"schedule.promptHint":`Instructions qui seront envoyées à l'agent`,"schedule.frequencyTitle":`Fréquence`,"schedule.advancedDescription":`Utiliser une expression cron brute`,"schedule.cronExpressionLabel":`Expression cron`,"schedule.sessionModeTitle":`Session d'exécution`,"schedule.modeResume":`Reprendre la session`,"schedule.oneShotHint":`Supprimer cette planification après sa première exécution.`,"schedule.wakeupTitle":`Wakeup en attente`,"schedule.cronsTitle":`Tâches récurrentes`,"schedule.noWakeup":`Aucun wakeup programmé`,"schedule.noCrons":`Aucun cron programmé`,"schedule.nextFireAt":`prochain à {time}`,"schedule.lastFiredAt":`dernier fire il y a {time}`,"schedule.addCronTitle":`Ajouter une tâche récurrente`,"schedule.addWakeupTitle":`Programmer un réveil`,"schedule.every":`Toutes les`,"schedule.unitMinutes":`minutes`,"schedule.unitHours":`heures`,"schedule.unitDays":`jours`,"schedule.daysDriftWarning":`L'intervalle peut se réduire à 1 jour en fin de mois (limitation du format cron).`,"schedule.advancedExpression":`Expression avancée (optionnel)`,"schedule.advancedHint":`Cron brut (ex. */15 * * * *) ou {'@'}hourly/{'@'}daily — remplace le sélecteur si rempli.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Libellé (optionnel)`,"schedule.delayMinutes":`Délai (minutes)`,"schedule.modeFresh":`Nouvelle session`,"schedule.oneShot":`Une seule fois`,"schedule.addCronBtn":`Ajouter le cron`,"schedule.addWakeupBtn":`Programmer le réveil`,"schedule.cronCreated":`Tâche récurrente ajoutée`,"schedule.wakeupCreated":`Réveil programmé`,"askUserQuestion.title":`L'agent te pose une question`,"askUserQuestion.submit":`Envoyer la réponse`,"askUserQuestion.multiSelectHint":`Sélectionne une ou plusieurs options`,"askUserQuestion.otherOption":`Autre`,"askUserQuestion.otherOptionHint":`précisez dans votre prochain message`,"askUserQuestion.freeFormLabel":`Précisez votre réponse`,"askUserQuestion.freeFormHint":`Cette réponse sera envoyée directement à l'agent.`,"askUserQuestion.noPending":`Aucune question en attente`,"askUserQuestion.next":`Suivant`,"askUserQuestion.previous":`Précédent`,"askUserQuestion.cancel":`Annuler`,"askUserQuestion.cancelTooltip":`Sauter cette question — l'agent continuera sans réponse`,"askUserQuestion.collapse":`Réduire le panneau de question`,"askUserQuestion.expand":`Agrandir le panneau de question`,"permissionRequest.title":`L'agent veut utiliser un outil`,"permissionRequest.allow":`Autoriser`,"permissionRequest.allowOnce":`Autoriser une fois`,"permissionRequest.allowTurn":`Autoriser ce tour`,"permissionRequest.allowOperation":`Toujours cette opération`,"permissionRequest.allowTool":`Toujours cet outil`,"permissionRequest.deny":`Refuser`,"permissionRequest.tool":`Outil`,"permissionRequest.input":`Entrée`,"permissionRequest.rawInput":`Détails techniques`,"permissionRequest.collapse":`Réduire le panneau de permission`,"permissionRequest.expand":`Agrandir le panneau de permission`,"permissionRequest.denied":`refusé par l'utilisateur`,"workspaceStatus.created":`créé`,"workspaceStatus.extracting":`extraction`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.executing":`en cours`,"workspaceStatus.awaitingUser":`en attente de ta réponse`,"workspaceStatus.completed":`terminé`,"workspaceStatus.idle":`inactif`,"workspaceStatus.error":`erreur`,"workspaceStatus.quota":`quota atteint`,"workspaceStatus.retrying":`reprise automatique`,"workspaceList.prOpen":`#{n} — Pull request ouverte`,"workspaceList.prWatchDisabledIndicator":`Checks PR ignorés pour ce workspace`,"workspaceList.prChangesRequested":`#{n} — Modifications demandées`,"workspaceList.attentionCiFailed":`CI en échec`,"workspaceList.attentionChangesRequested":`Modifications demandées`,"workspaceList.attentionReadyToMerge":`Prêt à merger`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.reprepare":`Re-préparer pour auto-loop`,"autoLoop.reprepareTooltip":`Relancer la phase de grooming pour ajouter ou rafraîchir les tâches avant de relancer la boucle`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm :`,"autoLoop.brainstormModelTooltip":`Modèle utilisé uniquement pour la session de brainstorming initiale — chaque tâche ensuite utilise le modèle choisi au-dessus`,"autoLoop.brainstormReasoningPrefix":`Brainstorm :`,"autoLoop.brainstormReasoningTooltip":`Niveau de raisonnement utilisé uniquement pour la session de brainstorming initiale`,"autoLoop.executionModelPrefix":`Loop :`,"autoLoop.executionModelTooltip":`Modèle utilisé pour chaque tâche de l'auto-loop après la session de brainstorming initiale`,"autoLoop.sessionMode.perTask":`Nouvelle session par tâche`,"autoLoop.sessionMode.label":`Session :`,"autoLoop.sessionMode.perTaskTooltip":`Chaque tâche démarre une session Claude Code neuve, sans mémoire des tâches précédentes`,"autoLoop.sessionMode.continuous":`Session continue`,"autoLoop.sessionMode.continuousTooltip":`Toutes les tâches s'enchaînent dans la même session — l'agent garde tout le contexte, mais la session s'allonge au fil du temps`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.staleTitle":`Session précédente`,"staleSessionBanner.staleMessage":`Vous consultez une ancienne session — les messages envoyés iront dans cette session, pas la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`,"network.login.title":`Accès réseau`,"network.login.description":`Ce Kōbō nécessite un token pour être piloté depuis le réseau. Colle le token affiché dans les Réglages sur la machine hôte.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Colle ton token`,"network.login.connect":`Se connecter`,"network.login.invalid":`Token invalide`,"network.login.serverError":`Erreur serveur — réessaie.`,"network.login.unreachable":`Kōbō est injoignable — vérifie ta connexion.`,"layout.toggleWorkspaces":`Afficher/masquer les espaces de travail`,"layout.togglePanel":`Afficher/masquer le panneau latéral`,"unsaved.title":`Quitter sans enregistrer ?`,"unsaved.message":`Vous avez des modifications non enregistrées. Quitter cette page les abandonne.`,"unsaved.leave":`Quitter`,"unsaved.stay":`Rester`,"prCheckout.staleRetriesExhausted":`L'état du dépôt a continué de changer pendant l'application de vos choix. Fermez cette fenêtre et réessayez depuis le sélecteur de pull request.`,"prPicker.title":`Importer depuis une pull request`,"prPicker.filterAll":`Toutes`,"prPicker.filterMine":`Les miennes`,"prPicker.filterReviewRequested":`Revue demandée`,"prPicker.searchPlaceholder":`Rechercher des pull requests…`,"prPicker.loadMore":`Charger plus`,"prPicker.empty":`Aucune pull request ouverte ne correspond.`,"prPicker.forkNotSupported":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prPicker.loadFailed":`Échec du chargement des pull requests.`,"prPicker.badge.workspaceExists":`Déjà ouverte dans Kōbō`,"prPicker.badge.worktreePresent":`Worktree présente`,"prPicker.badge.localBranch":`Branche locale`,"prPicker.badge.new":`Nouvelle`,"prPicker.badge.draft":`Brouillon`,"prCheckout.title":`Préparer la worktree`,"prCheckout.apply":`Appliquer`,"prCheckout.cancel":`Annuler`,"prCheckout.retry":`Réessayer`,"prCheckout.diagnoseFailed":`Échec du diagnostic de la pull request.`,"prCheckout.resolveFailed":`Échec de la résolution du checkout de la pull request.`,"prCheckout.path.required":`Saisir un chemin de worktree qui n'existe pas encore.`,"prCheckout.workspace.restoreNotAvailable":"La restauration d'un workspace purgé n'est pas encore possible depuis cet écran. Recréez son dossier de worktree sur le disque (par ex. `git worktree add`) : Kōbō le rattachera automatiquement sous 30 secondes environ.","prCheckout.staleReloaded":`Le dépôt a changé ; le diagnostic a été rafraîchi.`,"prCheckout.step.blocked":`Impossible de continuer`,"prCheckout.step.path":`Emplacement de la worktree`,"prCheckout.step.workspace":`Workspace existant`,"prCheckout.step.worktree":`Worktree existante`,"prCheckout.step.operation":`Opération git en cours`,"prCheckout.step.changes":`Modifications non commitées`,"prCheckout.step.divergence":`Branche locale vs origin`,"prCheckout.workspace.activeHint":`Un workspace nommé « {name} » suit déjà cette branche.`,"prCheckout.workspace.open":`Ouvrir ce workspace`,"prCheckout.workspace.continue":`Continuer sur un autre chemin`,"prCheckout.workspace.unarchive":`Désarchiver et l'ouvrir`,"prCheckout.workspace.restore":`Recréer sa worktree`,"prCheckout.worktree.orphanHint":`Une worktree existe déjà sur cette branche à {path}.`,"prCheckout.worktree.attach":`L'attacher`,"prCheckout.worktree.createElsewhere":`En créer une autre ailleurs`,"prCheckout.operation.hint":`Un {operation} est en cours dans cette worktree.`,"prCheckout.operation.abort":`Abandonner`,"prCheckout.operation.cancel":`Ne pas y toucher et s'arrêter ici`,"prCheckout.changes.hint":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s).`,"prCheckout.changes.stash":`Les stash`,"prCheckout.changes.commit":`Les commit`,"prCheckout.changes.discard":`Les abandonner (conservées dans un stash étiqueté)`,"prCheckout.changes.keep":`Les laisser telles quelles`,"prCheckout.divergence.behindHint":`Votre branche a {behind} commit(s) de retard sur origin.`,"prCheckout.divergence.aheadHint":`Votre branche a {ahead} commit(s) non pushé(s).`,"prCheckout.divergence.divergedHint":`{ahead} en avance, {behind} en retard sur origin.`,"prCheckout.divergence.fastForward":`Fast-forward vers origin`,"prCheckout.divergence.rebase":`Rebase sur origin`,"prCheckout.divergence.resetHard":`Réinitialiser sur origin (une branche de sauvegarde est créée d'abord)`,"prCheckout.divergence.keep":`Conserver l'état local`,"prCheckout.blocked.forgeUnavailable":`Le CLI de la forge est absent ou non authentifié.`,"prCheckout.blocked.forkPr":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prCheckout.blocked.headBranchDeleted":`La branche n'existe plus sur le remote.`,"prCheckout.blocked.indexLock":`Un autre processus git est en cours (index.lock est présent).`,"prCheckout.blocked.pathOccupied":`{path} existe déjà et n'est pas une worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} est une worktree sur une autre branche ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Une branche locale nommée {branch} existe avec un historique sans rapport.`},Pr={"model.tooltip":`Modello usato dall’agente per questo workspace`,"reasoning.tooltip":`Livello di ragionamento usato dall’agente per questo workspace`,"thinking.label":`Ragionamento`,"thinking.noDetails":`L’agente sta ragionando…`,"common.save":`Salva`,"common.cancel":`Annulla`,"common.retry":`Riprova`,"common.delete":`Elimina`,"common.close":`Chiudi`,"common.dismiss":`Ignora`,"common.details":`Dettagli`,"common.ok":`OK`,"whatsNew.title":`Novità`,"common.loading":`Caricamento...`,"common.search":`Cerca...`,"common.refresh":`Aggiorna`,"common.copy":`Copia`,"common.copied":`Copiato negli appunti`,"common.copyFailed":`Copia non riuscita`,"common.add":`Aggiungi`,"folderPicker.title":`Scegli una cartella`,"folderPicker.parent":`Cartella superiore`,"folderPicker.empty":`Nessuna sottocartella`,"folderPicker.select":`Scegli questa cartella`,"common.start":`Avvia`,"common.stop":`Arresta`,"common.archive":`Archivia`,"common.unarchive":`Ripristina`,"common.selectWorkspace":`Seleziona un workspace`,"common.noResults":`Nessun risultato per "{query}"`,"common.send":`invia`,"common.newLine":`nuova riga`,"common.history":`cronologia`,"common.justNow":`adesso`,"common.minutesAgo":`{count}m fa`,"common.hoursAgo":`{count}h fa`,"common.daysAgo":`{count}g fa`,"model.auto":`Auto`,"model.fable5":`Fable 5`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable5Description":`Modello più capace — successore di Opus 4.8, contesto 1M, adaptive thinking`,"model.mythos5Description":`Fable 5 senza classificatori di sicurezza — accesso limitato (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude sceglie il modello ottimale`,"model.opus5Description":`Per coding agentico complesso e lavoro enterprise, contesto 1M`,"model.opus48Description":`Opus più capace — coding agentico long-horizon, contesto 1M di default, effort high di default`,"model.opus47ClassicDescription":`Ultimo Opus, il più capace`,"model.opus471mDescription":`Ultimo Opus, contesto 1M`,"model.opusClassicDescription":`Più potente`,"model.opus1mDescription":`Più potente, contesto 1M`,"model.sonnet5Description":`Il miglior mix di velocità e intelligenza, contesto 1M`,"model.sonnetClassicDescription":`Bilanciato`,"model.sonnet1mDescription":`Bilanciato, contesto 1M`,"model.haikuDescription":`Più veloce`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`L'ultimo modello all'avanguardia per il coding agentico (richiede autenticazione ChatGPT)`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Modello di coding agentico bilanciato per il lavoro quotidiano (richiede autenticazione ChatGPT)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Modello di coding agentico veloce ed economico (richiede autenticazione ChatGPT)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Consigliato per codice complesso (richiede autenticazione ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Ripiego predefinito — ragionamento solido, compatibile con chiave API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Veloce ed efficiente — ideale per attività reattive e subagenti`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Ottimizzato per il lavoro professionale e gli agenti a lungo termine`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modello specializzato in codice per ingegneria software complessa`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`nessuno`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Lascia decidere al motore`,"reasoning.minimalDescription":`Ragionamento più veloce e superficiale`,"reasoning.noneDescription":`Senza ragionamento aggiuntivo`,"reasoning.lowDescription":`Più veloce, meno profondità`,"reasoning.mediumDescription":`Bilanciato`,"reasoning.highDescription":`Più profondità`,"reasoning.xhighDescription":`Profondità estesa, attività lunghe`,"reasoning.maxDescription":`Profondità massima`,"agentPermissionMode.label":`Modalità permessi`,"agentPermissionMode.plan":`Piano`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Accetta edit`,"agentPermissionMode.interactive":`Interattivo`,"agentPermissionMode.tooltip":`Come l'agente gestisce i permessi degli strumenti. Piano: sola lettura, nessuna scrittura. Bypass: salta tutte le richieste. Stretto: auto-accetta le edit dei file, rispetta le allow/deny per il resto. Interattivo: chiedi all'utente prima di ogni strumento tramite il pannello dei permessi.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop forza una modalità diversa da Piano — Piano blocca gli strumenti MCP e le edit di cui il loop ha bisogno. Scegli Bypass, Stretto o Interattivo.`,"agentPermissionMode.autoLoopLocked":`Bloccato su Bypass finché l'auto-loop è attivo — qualsiasi altra modalità fermerebbe il loop sulle richieste di permesso. AskUserQuestion funziona comunque.`,"workspaceList.title":`Workspace`,"workspaceList.a11y.groupToggle":`Gruppo {group}, {count} workspace`,"workspaceList.a11y.list":`Workspace`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Richiede attenzione`,"workspaceList.running":`In esecuzione`,"workspaceList.idle":`Inattivo`,"workspaceList.archived":`Archiviati`,"workspaceList.archivedToast":`«{name}» archiviato`,"workspaceList.archivedUndo":`Annulla`,"workspaceList.unarchiveFailed":`Impossibile ripristinare questo workspace`,"workspaceList.noWorkspaces":`Nessun workspace ancora`,"workspaceList.loadFailed":`Impossibile caricare i tuoi workspace`,"workspaceList.loadFailedHint":`È un errore di connessione, non un account vuoto.`,"workspaceList.footer":`{count} workspace | {count} workspace`,"workspaceList.footerRunning":`{count} in esecuzione`,"workspaceList.deleteDialog.title":`Eliminare il workspace?`,"workspaceList.deleteDialog.deleteLocal":`Elimina branch locale`,"workspaceList.deleteDialog.deleteRemote":`Elimina branch remoto`,"workspaceList.deleteDialog.warning":`Attenzione: questa azione è irreversibile sul remoto.`,"workspaceList.deleteArchivedDialog.tooltip":`Elimina tutti i workspace archiviati`,"workspaceList.deleteArchivedDialog.title":`Eliminare tutti i workspace archiviati?`,"workspaceList.deleteArchivedDialog.message":`Questa operazione eliminerà definitivamente i {count} workspace archiviati. L'azione è irreversibile.`,"workspacePage.selectWorkspace":`Seleziona un workspace per iniziare`,"workspacePage.commandPalettePlaceholder":`Cerca comandi…`,"workspacePage.commandPaletteEmpty":`Nessun comando corrispondente`,"workspacePage.commandFocusChat":`Metti a fuoco il campo chat`,"workspacePage.commandSearchHistory":`Cerca nella cronologia del workspace`,"workspacePage.commandTogglePanel":`Mostra o nascondi il pannello laterale`,"workspacePage.commandStartAgent":`Avvia agente`,"workspacePage.commandStopAgent":`Ferma agente`,"workspacePage.commandOpenSettings":`Apri le impostazioni`,"workspacePage.commandOpenCreate":`Crea un workspace`,"workspacePage.commandOpenSearch":`Ricerca globale`,"workspacePage.commandOpenHealth":`Pagina Salute`,"workspacePage.commandOpenChangelog":`Changelog`,"workspacePage.commandGroupWorkspaces":`Vai a un workspace`,"workspacePage.commandPaletteHint":`Palette dei comandi`,"workspacePage.session":`Sessione #{n}`,"workspacePage.newSession":`+ Nuova sessione`,"workspacePage.renameSession":`Rinomina`,"workspacePage.renameSessionTitle":`Rinomina sessione`,"workspacePage.sessionNameLabel":`Nome sessione`,"workspacePage.sessionEndedNotice":`Questa sessione è terminata. Crea una nuova sessione per continuare.`,"workspacePage.renameFailed":`Rinomina fallita`,"workspacePage.copySessionId":`Copia ID sessione`,"workspacePage.deleteSession":`Elimina sessione`,"workspacePage.deleteSessionTitle":`Eliminare la sessione?`,"workspacePage.deleteSessionConfirm":`Questo elimina definitivamente la sessione e la cronologia della conversazione.`,"workspacePage.deleteSessionFailed":`Impossibile eliminare la sessione`,"workspacePage.noEngineSessionId":`Nessun ID sessione ancora — l'agente non ha ancora avviato questa sessione`,"workspacePage.createSessionFailed":`Creazione sessione fallita`,"workspacePage.startFailed":`Avvio fallito`,"workspacePage.stopFailed":`Arresto fallito`,"workspacePage.interrupt":`Interrompi`,"workspacePage.interrupted":`Agente interrotto — in attesa del tuo prossimo messaggio`,"workspacePage.lastAgentEvent":`Ultimo evento {when}`,"workspacePage.agentStopping":`Arresto in corso…`,"workspacePage.agentNotRunning":`Nessun agente in esecuzione — lo stato è obsoleto`,"workspacePage.archivedBanner":`Workspace archiviato — sola lettura`,"workspacePage.worktreePurgedBanner":`Worktree eliminato — cronologia conservata, ripristino non disponibile in questa versione`,"workspacePage.worktreePurgedTooltip":"La cartella del worktree è stata eliminata dal disco per recuperare spazio. Cronologia di chat, sessioni e metadati della PR restano consultabili qui, ma la directory di lavoro non esiste più localmente. Una versione futura di Kōbō ricostruirà il worktree dalla PR mergiata — per ora ricrealo manualmente con `gh pr checkout` o `git worktree add`.","workspacePage.pendingInitialPromptBanner":`C'è un prompt iniziale in attesa — l'agente non l'ha mai ricevuto (lo script di setup è crashato o il workspace non è mai stato avviato). Clicca Avvia per inviarlo ora.`,"workspacePage.unarchived":`Workspace ripristinato`,"workspacePage.unarchiveFailed":`Ripristino fallito`,"workspacePage.interruptFailed":`Interruzione fallita`,"workspacePage.interruptHint":`Interrompi il turno in corso senza terminare la sessione.`,"workspacePage.interruptTooltip":`Interruzione leggera (come Escape) — ferma lo strumento corrente ma mantiene la sessione attiva`,"workspacePage.pendingNextRun":`Applicato al prossimo avvio`,"workspacePage.activeSessionModel":`In uso: {model}`,"workspacePage.activeSessionModelTooltip":`Modello effettivamente usato dalla sessione selezionata`,"workspacePage.switchEngine":`Cambia motore`,"workspacePage.switchEngineHint":`Continua questo workspace con un altro motore agente`,"workspacePage.moreActions":`Altre azioni`,"workspacePage.switchEngineTitle":`Cambia motore agente`,"workspacePage.switchEngineWarning":`L'agente attuale verrà fermato e una nuova sessione inizierà nello stesso worktree.`,"workspacePage.engineLabel":`Motore`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Passaggio al nuovo motore`,"workspacePage.engineHandoffHint":`Rivedi o modifica il contesto inviato al nuovo agente.`,"workspacePage.confirmSwitchEngine":`Cambia motore`,"workspacePage.switchEngineFailed":`Impossibile cambiare motore`,"whip.dispatchFailed":`Impossibile inviare il messaggio della frusta`,"whip.phrase1":`Più veloce, tocard!`,"whip.phrase2":`Accelera il ritmo, tocard!`,"whip.phrase3":`Torna al lavoro, tocard!`,"whip.phrase4":`Fammi vedere un po' di velocità, tocard!`,"whip.phrase5":`Meno pensieri e più azione, tocard!`,"search.title":`Ricerca`,"search.tooltip":`Cerca nella cronologia degli agenti`,"search.placeholder":`Cerca in tutti i messaggi degli agenti…`,"search.includeArchived":`Includi workspace archiviati`,"search.loading":`Ricerca in corso…`,"search.noResults":`Nessun risultato`,"search.error":`Ricerca fallita: {message}`,"search.resultCount":`{n} risultato/i`,"search.eventType.userMessage":`Tu`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Nessuna attività ancora`,"activityFeed.emptyHint":`Avvia un workspace per vedere l'output dell'agente qui`,"activityFeed.initialPrompt":`Prompt iniziale`,"activityFeed.you":`Tu`,"activityFeed.agent":`Agente`,"activityFeed.question":`Domanda`,"activityFeed.goToPrevious":`Vai al messaggio precedente`,"activityFeed.scrollToBottom":`Vai in fondo`,"activityFeed.sendAnswers":`Invia risposte`,"agentBusy.banner":`L'agente è occupato`,"agentBusy.subagentsRunning":`1 sub-agente in esecuzione | {n} sub-agenti in esecuzione`,"agentBusy.viewSubagents":`Vedi sub-agenti`,"agentBusy.pendingMessage":`In attesa — l'agente è occupato`,"terminal.title":`Terminale`,"terminal.open":`Apri terminale`,"terminal.close":`Chiudi terminale`,"terminal.noWorkspace":`Seleziona un workspace`,"terminal.noWorktree":`Worktree non ancora creato`,"terminal.error":`Errore del terminale`,"terminal.exited":`Terminale chiuso`,"terminal.disconnected":`Connessione persa`,"terminal.reconnecting":`Riconnessione… (tentativo {attempt} di {max})`,"terminal.reconnect":`Riconnetti`,"chatInput.placeholder":`Messaggio... (/ per le skill)`,"chatInput.fileSearchHint":`cercare un file`,"chatInput.skills":`Skill`,"chatInput.attachImage":`Allega immagine`,"chatInput.queueBanner":`Messaggio in coda — verrà inviato quando l'agente avrà terminato`,"chatInput.forceQueue":`Forza invio`,"chatInput.searchHistory":`cerca`,"chatInput.commandPalette":`comandi`,"chatInput.shortcuts":`Scorciatoie da tastiera`,"chatInput.cancelQueue":`Annulla coda`,"chatInput.autoLoopBanner":`Auto-loop attivo — fermalo per inviare un messaggio`,"chatInput.awaitingUserBanner":`L'agente attende la tua risposta sopra — rispondi tramite il pannello della domanda`,"chatInput.autoLoopStop":`Ferma`,"koboCommand.checkProgressDesc":`Verificare il progresso delle attività e dei criteri di accettazione`,"chatInput.uploading":`Caricamento...`,"voice.title":`Trascrizione vocale`,"voice.enabled":`Abilita trascrizione vocale locale`,"voice.pttKey":`Tasto push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Spazio`,"voice.language":`Lingua (auto o codice)`,"voice.model":`Modello attivo`,"voice.commandPath":`Percorso binario Whisper (opzionale)`,"voice.ffmpegPath":`Percorso binario ffmpeg (opzionale)`,"voice.temperature":`Temperatura`,"voice.temperatureHint":`Più basso = più deterministico; più alto = più flessibile ma potenzialmente meno stabile.`,"voice.initialPrompt":`Prompt iniziale (opzionale)`,"voice.initialPromptHint":`Contesto opzionale per aiutare Whisper con nomi propri, sigle o vocabolario tecnico.`,"voice.translateToEnglish":`Traduci in inglese`,"voice.translateToEnglishHint":`Se attivo, il parlato non inglese viene tradotto in inglese invece di essere trascritto così com’è.`,"voice.suppressNst":`Sopprimi token non vocali`,"voice.suppressNstHint":`Prova a ridurre artefatti non vocali nella trascrizione.`,"voice.installLink":`Installa whisper.cpp`,"voice.installGuideTitle":`Guida installazione`,"voice.installGuideIntro":`Installa whisper.cpp e ffmpeg, poi imposta i percorsi dei binari qui sotto se necessario.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Dopo il build con CMake, il binario Whisper di solito è in: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Poi imposta “Percorso binario Whisper” e “Percorso binario ffmpeg” in questa sezione (o lascia vuoto se sono nel PATH).`,"voice.noneModel":`Nessun modello attivo`,"voice.notInstalled":`non installato`,"voice.download":`Scarica`,"voice.delete":`Elimina`,"voice.holdToTalk":`Tieni premuto per parlare`,"voice.recording":`Registrazione...`,"voice.transcribing":`Trascrizione...`,"voice.notSupported":`La registrazione vocale non è supportata da questo browser`,"voice.errorMicPermission":`Permesso microfono negato`,"voice.errorTranscription":`Trascrizione vocale non riuscita`,"voice.downloadFailed":`Download del modello non riuscito`,"voice.deleteFailed":`Eliminazione del modello non riuscita`,"voice.errorDisabled":`La trascrizione vocale è disattivata nelle impostazioni`,"voice.errorModelMissing":`Nessun modello vocale attivo configurato`,"voice.errorModelNotInstalled":`Il modello vocale attivo non è installato`,"voice.errorAudioInvalid":`La cattura audio è non valida o vuota`,"voice.errorLanguageInvalid":`La configurazione lingua vocale non è valida`,"voice.errorRuntimeMissing":`Il runtime Whisper non è installato o non è nel PATH`,"voice.maxDurationReached":`Durata massima di registrazione raggiunta`,"voice.runtimeReady":`Runtime pronto: {command}`,"voice.runtimeMissing":`Runtime mancante: {command}`,"voice.ffmpegReady":`ffmpeg pronto`,"voice.ffmpegMissing":`ffmpeg mancante`,"voice.sectionRuntime":`Stato del runtime`,"voice.sectionActivation":`Attivazione`,"voice.sectionModels":`Modelli Whisper`,"voice.sectionAdvanced":`Opzioni avanzate`,"voice.sectionBehavior":`Comportamento della trascrizione`,"voice.sectionBinaries":`Percorsi dei binari`,"voice.downloadModels":`Scarica un modello`,"voice.cancelFailed":`Annullamento del download non riuscito`,"createPage.title":`Crea un workspace`,"createPage.subtitle":`Descrivi la missione, scegli un progetto e configura l’agente.`,"createPage.sectionMission":`Missione`,"createPage.sectionMissionHint":`Fornisci all’agente un obiettivo chiaro e il contesto necessario.`,"createPage.workspaceNameLabel":`Nome del workspace`,"createPage.descriptionLabel":`Descrizione della missione`,"createPage.sources":`Fonti facoltative`,"createPage.sectionGit":`Progetto Git`,"createPage.sectionGitHint":`Scegli il repository, il branch di partenza e la modalità worktree.`,"createPage.worktreeMode":`Modalità worktree`,"createPage.worktreeNew":`Nuovo worktree isolato`,"createPage.worktreeExisting":`Riutilizza un worktree esistente`,"createPage.projectLabel":`Progetto`,"createPage.sourceBranch":`Branch di partenza`,"createPage.workingBranchPreview":`Anteprima del branch di lavoro`,"createPage.branchNamePending":`nome-del-workspace`,"createPage.sectionAgent":`Agente`,"createPage.sectionAgentHint":`Controlla le impostazioni di esecuzione o attiva l’automazione.`,"createPage.configureAgent":`Configura l’agente`,"createPage.advancedOptions":`Opzioni avanzate`,"createPage.keyboardHint":`Premi Ctrl/Cmd + Invio per creare il workspace.`,"createPage.createWorkspace":`Crea workspace`,"createPage.notionEnabled":`Notion attivato`,"createPage.importNotion":`Importa da Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL deve iniziare con https://www.notion.so/ o https://app.notion.com/`,"createPage.notionAutoExtract":`Le sottotask e i criteri di accettazione verranno estratti automaticamente.`,"createPage.notionPanelChoiceLabel":`Questo URL punta a una sotto-pagina (?p=). Su quale vuoi lavorare?`,"createPage.notionPanelOption":`Sotto-pagina (panel)`,"createPage.notionPanelOptionDesc":`La pagina che stavi visualizzando — consigliato`,"createPage.notionParentOption":`Pagina principale`,"createPage.notionParentOptionDesc":`L'epic / database a cui appartiene`,"createPage.importSentry":`Importa Sentry`,"createPage.sentryEnabled":`Sentry attivato`,"createPage.sentryPlaceholder":`https://tua-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL deve puntare a una issue di Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue di Sentry verrà importata automaticamente`,"createPage.sentryExtractHint":`Kobo estrarrà l'issue e la scriverà in .ai/thoughts/`,"createPage.importPr":`Importa da una PR`,"createPage.importPrRequiresProject":`Scegli prima un progetto`,"createPage.importPrNotSupported":`Il forge di questo progetto non supporta l'elenco delle pull request`,"createPage.lockedToPr":`Bloccato sulla PR #{number}`,"createPage.prReadyToCreate":`PR #{number} importata — il workspace può essere creato.`,"createPage.unlockPrCheckout":`Sblocca`,"createPage.workspaceName":`Nome del workspace (predefinito: titolo della pagina Notion)`,"createPage.workspaceNamePlaceholder":`Nome del workspace...`,"createPage.instructions":`Istruzioni aggiuntive (opzionale)...`,"createPage.instructionsPlaceholder":`Descrivi il task...`,"createPage.tasks":`Task ({count})`,"createPage.addTask":`Aggiungi un task...`,"createPage.acceptanceCriteria":`Criteri di accettazione ({count})`,"createPage.addCriterion":`Aggiungi un criterio...`,"createPage.projectPath":`Inserisci il percorso del progetto`,"createPage.branchType":`Tipo di branch`,"createPage.branch":`Branch`,"createPage.noBranches":`Nessun branch trovato`,"createPage.enterPath":`Inserisci il percorso del progetto`,"createPage.skipSetupScript":`Salta script di setup`,"createPage.worktreePickerLabel":`Worktree esistente`,"createPage.noOrphanWorktrees":`Nessun worktree orfano in questo progetto`,"createPage.pickWorktreeRequired":`Seleziona un worktree da agganciare`,"createPage.notionExtractHint":`Le sottotask e i criteri di accettazione verranno estratti dalla pagina Notion.`,"createPage.errorCreating":`Errore durante la creazione del workspace.`,"createPage.branchAdjusted":"Il branch esisteva già — creato `{branch}` al suo posto. La cartella worktree corrispondente usa lo stesso suffisso.","createPage.localSourceFallback":`Workspace creato dal branch locale (origin non raggiungibile) — la base potrebbe essere obsoleta.`,"createPage.validationNotionUrl":`Inserisci un URL Notion valido (https://www.notion.so/... o https://app.notion.com/...).`,"createPage.validationDescription":`Descrivi il task.`,"createPage.validationName":`Indica un nome per il workspace.`,"createPage.validationPath":`Inserisci il percorso del progetto.`,"createPage.validationBranch":`Seleziona un branch.`,"createPage.validationFocusHint":`Il campo da correggere è evidenziato qui sotto.`,"createPage.progress.validate":`Validazione della richiesta…`,"createPage.progress.fetch-source-branch":`Recupero del branch sorgente da origin…`,"createPage.progress.inspect-worktree":`Ispezione del worktree esistente…`,"createPage.progress.extract-notion":`Estrazione della pagina Notion…`,"createPage.progress.extract-sentry":`Estrazione dell’issue Sentry…`,"createPage.progress.create-record":`Creazione del workspace…`,"createPage.progress.create-tasks":`Creazione di task e criteri di accettazione…`,"createPage.progress.create-worktree":`Creazione del worktree git…`,"createPage.progress.write-conventions":`Scrittura delle convenzioni git…`,"createPage.progress.write-context-files":`Scrittura dei file di contesto…`,"createPage.progress.build-prompt":`Costruzione del prompt iniziale…`,"createPage.progress.setup-script":`Esecuzione del tuo script di installazione…`,"createPage.progress.start-agent":`Avvio dell’agente…`,"createPage.progress.rollback":`Annullamento della creazione fallita…`,"createPage.progress.done":`Fatto`,"createPage.progress.step":`Passo {index} di {total}`,"createPage.errorAtStep":`Creazione fallita al passo «{step}»: {message}`,"createPage.override.title":`Due delle tue scelte sono state sostituite`,"createPage.override.setup-script-forced":`Script di installazione saltato: rieseguirlo su un worktree già preparato potrebbe distruggerne il contenuto.`,"createPage.override.permission-mode-downgraded":`Modalità permessi passata da Plan a Bypass: un ciclo autonomo non può girare in Plan, che blocca strumenti e modifiche.`,"settings.title":`Impostazioni`,"settings.language":`Lingua`,"settings.projectColor":`Colore`,"settings.projectColorClear":`Cancella`,"settings.projectColorDefault":`Predefinito (grigio)`,"settings.workspaceListSection":`Lista dei workspace`,"settings.flattenWorkspaceList":`Lista piatta dei workspace`,"settings.flattenWorkspaceListHint":`Mostra tutti i workspace in una lista piatta con un badge progetto, invece di raggrupparli per progetto.`,"settings.skillSuite.section":`Suite di skill`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personalizzato`,"settings.skillSuite.superpowersHint":`Workflow opinionato TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite di Garry Tan — /review, /ship, /qa, /office-hours, ecc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Le due suite si combinano — superpowers per la metodologia (brainstorm / TDD / piani / review a livello di principi), gstack per i flussi concreti (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Framework agentico di affaan-m — agents, skills, rules e hooks per pianificare, testare, implementare, rivedere e memorizzare (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Le tre suite si combinano — superpowers per la metodologia, gstack per i flussi concreti, ECC per passaggi di review/implementazione multi-agente strutturati.`,"settings.skillSuite.customHint":`Componi i cinque prompt qui sotto con i template che preferisci, poi modificali liberamente.`,"settings.skillSuite.reloadDefaults":`Ripristina predefiniti`,"settings.skillSuite.reloadDefaultsConfirm":`Sostituire i cinque prompt personalizzati con i valori agnostici predefiniti?`,"settings.skillSuite.customPrompts":`Prompt personalizzati`,"settings.skillSuite.agnostic":`Base agnostica`,"settings.skillSuite.importPrompt":`Importa un template`,"settings.skillSuite.imported":`Template importato. Ora puoi modificarlo.`,"settings.skillSuite.importFailed":`Impossibile importare il template`,"settings.skillSuite.reviewTemplate":`Template di review`,"settings.skillSuite.autoLoopReviewGate":`Gate di review auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro di grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Istruzione fase di brainstorming`,"settings.global":`Globale`,"settings.projects":`Progetti`,"settings.globalSettings":`Impostazioni globali`,"settings.defaultModel":`Modello predefinito`,"settings.defaultModelClaude":`Modello predefinito (Claude Code)`,"settings.defaultModelCodex":`Modello predefinito (OpenAI Codex)`,"settings.agentPermissions":`Permessi dell'agente`,"settings.skipPermissions":`Salta le richieste di permesso (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attenzione: disattivando questa opzione, tutti i permessi degli strumenti (Write, Edit, Bash...) verranno negati automaticamente in modalità headless. L'agente potrà solo leggere.`,"settings.notifications":`Notifiche`,"settings.browserNotifications":`Notifica browser quando l'agente termina`,"settings.audioNotifications":`Notifica sonora quando l'agente termina`,"settings.enableBrowserNotifications":`Attiva le notifiche del browser`,"settings.testBrowserNotification":`Prova notifica`,"settings.browserNotificationGranted":`Notifiche del browser consentite`,"settings.browserNotificationDenied":`Notifiche del browser bloccate`,"settings.browserNotificationAsk":`Autorizzazione del browser richiesta`,"settings.browserNotificationUnsupported":`Notifiche del browser non disponibili`,"settings.browserNotificationPermissionNeeded":`Consenti le notifiche del browser per inviare un test.`,"settings.browserNotificationTestTitle":`Test di notifica Kōbō`,"settings.browserNotificationTestBody":`Le notifiche del browser funzionano.`,"settings.enableAudio":`Attiva l'audio`,"settings.notificationSound":`Suono di notifica`,"settings.notificationSoundHint":`Riprodotto quando l'agente termina o richiede un'autorizzazione.`,"settings.questionSound":`Suono delle domande`,"settings.questionSoundHint":`Riprodotto solo quando l'agente ti pone una domanda.`,"settings.workspaceCreatedSound":`Suono di creazione dello spazio di lavoro`,"settings.workspaceCreatedSoundHint":`Riprodotto dopo la creazione di uno spazio di lavoro.`,"settings.notificationSoundPreview":`Ascolta`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Errori dell’agente`,"settings.agentErrorSoundHint":`Riprodotto per quote, limiti di velocità ed errori dell’agente.`,"settings.notificationSoundBasic":`Notifica di base`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Lavoro`,"settings.notificationSoundTravailTermine":`Lavoro finito`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Sta per esplodere`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR e CI`,"settings.soundGeneral":`Suono generale`,"settings.soundNone":`Nessun suono`,"settings.prCiFailedSound":`CI non riuscita`,"settings.prCiRecoveredSound":`CI ripristinata`,"settings.prChangesRequestedSound":`Modifiche richieste`,"settings.prApprovedSound":`PR approvata`,"settings.prMergeConflictSound":`Conflitto di merge`,"settings.prReadyToMergeSound":`Pronta per il merge`,"settings.prMergedSound":`PR unita`,"settings.prCiFailedSoundHint":`Riprodotto quando la CI passa allo stato non riuscito.`,"settings.prCiRecoveredSoundHint":`Riprodotto quando la CI si riprende da un errore.`,"settings.prChangesRequestedSoundHint":`Riprodotto quando una review richiede modifiche.`,"settings.prApprovedSoundHint":`Riprodotto quando la pull request viene approvata.`,"settings.prMergeConflictSoundHint":`Riprodotto quando viene rilevato un conflitto di merge.`,"settings.prReadyToMergeSoundHint":`Riprodotto quando la pull request è pronta per il merge.`,"settings.prMergedSoundHint":`Riprodotto quando la pull request viene unita.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Modalità permessi predefinita`,"settings.defaultPermissionModeClaude":`Modalità permessi predefinita (Claude Code)`,"settings.defaultPermissionModeCodex":`Modalità permessi predefinita (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modalità applicata alla creazione di un workspace. Piano = sola lettura, Bypass = senza richieste, Stretto = auto-accetta le edit con allow-list, Interattivo = chiedi prima di ogni strumento.`,"settings.activityFeed":`Feed attività`,"settings.showThinkingBlocks":`Mostra i blocchi di ragionamento degli agenti`,"settings.whipSettings":`Frusta`,"settings.whipSettingsHint":`Configura la scorciatoia e il volume opzionali della frusta.`,"settings.whipEnabled":`Attiva la frusta`,"settings.whipEnabledHint":`Mostra la frusta interattiva nei workspace attivi compatibili.`,"settings.whipVolume":`Volume della frusta`,"settings.whipVolumeMasterAudioDisabled":`L’audio principale è disattivato. Attiva le notifiche audio per regolare il volume della frusta; il valore salvato viene mantenuto.`,"whip.overlayLabel":`Frusta interattiva`,"whip.overlayInstructions":`Muovi il puntatore per controllare la frusta. Premi Invio o Spazio per farla schioccare. Premi Esc per chiudere.`,"settings.whipShortcut":`Scorciatoia della frusta`,"settings.whipShortcutHint":`Fai clic, poi premi la scorciatoia da usare.`,"settings.whipShortcutRecording":`Premi una scorciatoia…`,"settings.whipShortcutButtonLabel":`Scorciatoia della frusta: {shortcut}`,"settings.whipShortcutRecordingLabel":`Registrazione della scorciatoia della frusta. Premi una scorciatoia…`,"settings.whipShortcutReset":`Ripristina scorciatoia`,"settings.whipShortcutReserved":`Questa scorciatoia è riservata dal browser.`,"settings.testIntegration":`Testa connessione`,"pwa.offline":`Sei offline. Chat e agenti richiedono il server Kōbō.`,"pwa.reconnecting":`Riconnessione al server Kōbō…`,"pwa.installReady":`Installa Kōbō come app.`,"pwa.install":`Installa`,"pwa.ignore":`Ignora`,"pwa.updateReady":`È disponibile un aggiornamento di Kōbō.`,"pwa.reload":`Ricarica`,"chat.searchWorkspaceHistory":`Cerca nella cronologia del workspace`,"chat.historySearch.user":`Tu`,"chat.historySearch.agent":`Agente`,"chat.openInGitDiff":`Apri nel diff Git`,"timeline.title":`Cronologia delle sessioni`,"timeline.export":`Esporta diagnostica`,"timeline.unnamed":`Sessione agente`,"timeline.tools":`{count} strumenti`,"timeline.errors":`{count} errori`,"settings.verboseMessages":`Mostra messaggi di sistema dettagliati (task_progress, task_started)`,"settings.availableVariables":`Variabili disponibili nei template del prompt`,"settings.prPromptTemplate":`Template del prompt PR`,"settings.prPromptPlaceholder":`Istruzioni per l'agente durante la creazione di PR su GitHub...`,"settings.prPromptHint":`Usa le variabili elencate sopra (sintassi doppia parentesi graffa).`,"settings.reviewPromptTemplate":`Template del prompt di revisione`,"settings.reviewPromptPlaceholder":`Istruzioni per l'agente durante la revisione delle modifiche del branch...`,"settings.ciFixPromptTemplate":`Template del prompt «Ripara CI»`,"settings.ciFixPromptHint":`Inviato all'agente quando un workspace ha la CI in errore. Variabili (sintassi doppie graffe): pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Chiedi all'agente di diagnosticare e correggere i job di CI in errore...`,"settings.finalizationPromptTemplate":`Prompt di finalizzazione dell'auto-loop`,"settings.finalizationPromptHint":`Prompt predefinito per l'ultima iterazione dell'auto-loop (controlli di qualità finali). Usato quando un progetto lascia vuoto il proprio prompt di finalizzazione.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Prompt iniziale Notion`,"settings.notionInitialPrompt.help":`Aggiunto al prompt di creazione del workspace quando il workspace ha un ticket Notion. Variabili: {variables}.`,"settings.notionInitialPrompt.project":`Prompt iniziale Notion (override)`,"settings.sentryInitialPrompt":`Prompt iniziale Sentry`,"settings.sentryInitialPrompt.help":`Aggiunto al prompt di creazione del workspace quando il workspace ha una issue Sentry. Variabili: {variables}.`,"settings.sentryInitialPrompt.project":`Prompt iniziale Sentry (override)`,"settings.initialPrompt.inheritHint":`Lasciare vuoto per ereditare. Digita un carattere di spazio bianco per disattivare l'iniezione a questo livello.`,"settings.resetToDefault":`Ripristina`,"settings.resetFailed":`Impossibile caricare il valore predefinito`,"settings.sentryIntegration":`Integrazione Sentry`,"settings.var.prNumber":`Numero della PR (es: 42)`,"settings.var.prUrl":`URL completo della PR creata`,"settings.var.branchName":`Nome del branch di lavoro`,"settings.var.sourceBranch":`Branch sorgente a cui punta la PR`,"settings.var.workspaceName":`Nome del workspace`,"settings.var.projectName":`Ultimo segmento del percorso del progetto`,"settings.var.notionUrl":`URL Notion se impostato, vuoto altrimenti`,"settings.var.commits":`Elenco puntato dei commit tra source e head`,"settings.var.diffStats":`Riepilogo shortstat Git (file, inserimenti, eliminazioni)`,"settings.var.tasks":`Attività regolari come lista di controllo`,"settings.var.acceptanceCriteria":`Criteri di accettazione come lista di controllo`,"settings.gitConventions":`Convenzioni Git (globale)`,"settings.gitConventionsPlaceholder":`# Convenzioni Git...`,"settings.gitConventionsHint":`Queste convenzioni vengono scritte in .ai/.git-conventions.md in ogni nuovo workspace e devono essere seguite dall'agente prima di qualsiasi operazione Git. Sovrascritte dalle convenzioni per progetto se definite.`,"settings.setupScript":`Script di setup`,"settings.cleanupScript":`Script di pulizia`,"settings.archiveScript":`Script di archiviazione`,"settings.archiveScriptHint":`Script di shell eseguito lato server nel worktree quando un workspace viene archiviato. Lascia vuoto per disattivare.`,"settings.archiveScriptPlaceholder":`es. pulire container, liberare spazio su disco…`,"settings.changeSourceBranchScript":`Script di cambio del branch di origine`,"settings.changeSourceBranchScript.help":`Sostituisce il cherry-pick integrato quando non vuoto. Lo script gestisce git, base della PR, force-push e conflitti; Kōbō rifiuta solo se l'agente è in esecuzione e aggiorna i metadati del branch di origine all'uscita 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nuovo branch di origine scelto nella finestra di dialogo
|
|
67
67
|
KOBO_OLD_BASE — branch di origine precedente del workspace
|
|
68
68
|
KOBO_WORKING_BRANCH — branch di lavoro del workspace
|
|
69
69
|
KOBO_WORKTREE_PATH — percorso assoluto del worktree (anche cwd)
|
|
@@ -79,4 +79,4 @@ KOBO_PR_NUMBER — numero della PR/MR sulla forge risolta (vuoto se nessuna
|
|
|
79
79
|
# Oppure direttamente con git (funziona su GitHub anche dopo eliminazione del branch):
|
|
80
80
|
git fetch origin pull/[numero-pr]/head:[nome-branch]
|
|
81
81
|
git worktree add [percorso] [nome-branch]`,"settings.purgeDocsRestoreFootnote":`GitHub mantiene il ref HEAD della PR accessibile a lungo dopo l'eliminazione del branch sorgente (mesi / anni). Il rilevamento automatico gira nel watcher 30 s — nessuna azione UI necessaria una volta che la cartella riappare.`,"settings.purgeDocsPermissionsTitle":`Evitare errori di permessi durante la pulizia`,"settings.purgeDocsPermissionsIntro":`Docker spesso lascia file root-owned in node_modules / vendor dentro il worktree. Quando Kōbō prova a rimuoverli, ricevi EACCES / EPERM e la pulizia fallisce. Due modi per prevenirlo:`,"settings.purgeDocsPermissionsDocker":'Configurare il container per girare come utente host — direttiva USER nel Dockerfile, o `user: "${UID}:${GID}"` in docker-compose (con UID/GID esportati nella shell).',"settings.purgeDocsPermissionsAcl":`Pre-impostare una ACL di default sulla root dei worktrees — rete di sicurezza che funziona nella MAGGIOR PARTE dei casi (ext4/btrfs/xfs + bind mount Docker classico). Ogni nuovo file eredita allora una voce di accesso per il tuo utente, oltre al proprietario nominale:`,"settings.purgeDocsPermissionsAclCommand":` setfacl -d -m u:$(whoami):rwX [root-worktrees]`,"settings.purgeDocsPermissionsFootnote":"Limiti delle ACL: NON funzionano sui volumi Docker con nome (usa un bind mount), filesystem senza supporto ACL (NTFS, exFAT, tmpfs), SELinux strict con `:Z`, o quando Docker `userns-remap` è attivato. La soluzione più affidabile resta configurare l'utente nel container (opzione 1). Suggerimento: `rwX` (X maiuscola) aggiunge il bit eseguibile solo a directory e file già eseguibili — più pulito di `rwx` che renderebbe eseguibile ogni file di testo.","settings.purgeDocsPermissionsRecoverTitle":`Sbloccare un worktree già rotto (file root-owned esistenti)`,"settings.purgeDocsPermissionsRecoverIntro":`Se ti ritrovi con un worktree già pieno di file root-owned (Docker ha già girato, vendor / node_modules sono bloccati), l'ACL preventiva sopra non basta — devi sistemare i file ESISTENTI. Due approcci, entrambi da eseguire dentro la cartella del worktree:`,"settings.purgeDocsPermissionsRecoverAclIntro":`Opzione A — ACL ricorsiva (preserva l'ownership root per audit, aggiunge solo accesso per il tuo utente in parallelo):`,"settings.purgeDocsPermissionsRecoverAclCommand":`# imposta ACL di default per i file futuri E concede accesso a tutto l'esistente
|
|
82
|
-
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Opzione B — Prendere la proprietà (più semplice, perde la traccia "creato da root nel container" ma raramente conta):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Suggerimento: puoi eseguire questi comandi direttamente sulla root dei worktrees (es. `~/.worktrees/`) per coprire tutti i workspace esistenti E futuri in un colpo solo. Una volta fatto, la pulizia Kōbō funzionerà senza errori di permessi.","contextMenu.runSetup":`Esegui script di setup`,"contextMenu.exportEvents":`Esporta eventi (CSV)`,"contextMenu.dismissChangesRequested":`Segna «Modifiche richieste» come visto`,"contextMenu.dismissCiFailure":`Segna «CI in errore» come visto`,"contextMenu.restoreChangesRequested":`Segna «Modifiche richieste» come non visto`,"contextMenu.restoreCiFailure":`Segna «CI in errore» come non visto`,"contextMenu.exportingEvents":`Preparazione dell'esportazione…`,"contextMenu.exportEventsError":`Esportazione degli eventi non riuscita`,"contextMenu.openNotion":`Apri in Notion`,"contextMenu.openSentry":`Apri in Sentry`,"contextMenu.openPr":`Apri PR`,"contextMenu.ignorePrWatch":`Ignora i controlli PR`,"contextMenu.resumePrWatch":`Riprendi i controlli PR`,"contextMenu.prWatchToggleFailed":`Aggiornamento dei controlli PR non riuscito`,"workspace.favorite":`Segna come preferito`,"workspace.unfavorite":`Rimuovi dai preferiti`,"workspace.showFavoritesOnly":`Mostra solo i preferiti`,"workspace.searchArchivedToggle":`Cerca anche nei workspace archiviati`,"workspace.descriptionPlaceholder":`Aggiungi una breve descrizione`,"workspace.descriptionDialogHint":`Testo semplice, massimo 200 caratteri. Lasciare vuoto per cancellare.`,"workspace.descriptionTooLong":`La descrizione deve avere al massimo 200 caratteri.`,"workspace.descriptionSaveFailed":`Impossibile salvare la descrizione.`,"workspace.agentDescriptionTooltip":`Stato live mantenuto dall'agente`,"mcp.tool.setWorkspaceDescription":`Imposta la breve descrizione del workspace (≤ 200 caratteri).`,"tags.manage":`Gestisci tag`,"tags.manageTitle":`Gestisci i tag del workspace`,"tags.noTagsDefined":`Nessun tag definito. Aggiungine in Impostazioni > Globale > Tag.`,"tags.orphanedHint":`{count} tag non sono più nel catalogo globale. Deseleziona per rimuoverli.`,"settings.tagsTitle":`Tag dei workspace`,"settings.tagsHint":`Definisci i tag assegnabili ai workspace. Digita per aggiungere, clicca la croce per rimuovere.`,"settings.tagsLabel":`Tag disponibili`,"settings.branchPrefixesTitle":`Prefissi di branch`,"settings.branchPrefixesHint":`Gestisci i prefissi di branch Git disponibili nella pagina di creazione del workspace. Il primo è preselezionato per impostazione predefinita.`,"settings.branchPrefixesEmpty":`Nessun prefisso di branch definito. Aggiungine almeno uno qui sotto.`,"settings.branchPrefixesAddLabel":`Nuovo prefisso`,"settings.branchPrefixesEditHint":`Clicca per rinominare`,"settings.branchPrefixesMoveUp":`Sposta su`,"settings.branchPrefixesMoveDown":`Sposta giù`,"settings.worktreesTitle":`Worktree Git`,"settings.worktreesHint":`Scegli dove creare i worktree dei nuovi workspace. I percorsi relativi sono risolti dal progetto; sono supportati percorsi assoluti Linux/macOS e Windows, $HOME, ~ e %USERPROFILE%.`,"settings.worktreesPathLabel":`Percorso worktree`,"settings.worktreesPathRequired":`Il percorso worktree è obbligatorio.`,"settings.worktreesPrefixByProject":`Aggiungi il nome del progetto come prefisso ai worktree`,"settings.worktreesPrefixByProjectHint":`Posiziona ogni worktree in una sottocartella con il nome del progetto per evitare collisioni quando più progetti condividono la stessa radice.`,"settings.shareTitle":`Condividi configurazione`,"settings.shareHint":`Esporta impostazioni, template e tag come bundle JSON. Le chiavi MCP sono escluse per sicurezza.`,"settings.exportConfig":`Esporta`,"settings.importConfig":`Importa`,"settings.exportSuccess":`Configurazione esportata`,"settings.importSuccess":`Configurazione importata`,"settings.importConfirmTitle":`Importa configurazione`,"settings.importConfirmMessage":`Questo sostituirà le tue impostazioni, template e tag attuali. Le chiavi MCP vengono preservate. Continuare?`,"settings.network.title":`Accesso di rete`,"settings.network.hint":`Controlla Kōbō da un altro dispositivo della tua LAN affidabile. Off = solo localhost. On = raggiungibile sulla rete, protetto da un token. Riavvia Kōbō dopo il cambio.`,"settings.network.enable":`Abilita accesso di rete`,"settings.network.behindProxy":`Dietro un reverse proxy`,"settings.network.behindProxyHint":`Kōbō non può più distinguere la tua macchina da una richiesta inoltrata — anche localhost dovrà presentare il token d'ora in poi. Attivalo solo se un reverse proxy (Traefik, nginx, Caddy…) si trova davanti a Kōbō.`,"settings.network.restartRequired":`Riavvia Kōbō per applicare il nuovo indirizzo di bind.`,"settings.network.token":`Token di accesso`,"settings.network.copy":`Copia`,"settings.network.copied":`Copiato`,"settings.network.regenerate":`Rigenera`,"settings.network.regenerateConfirm":`Rigenerare il token? I dispositivi connessi avranno bisogno del nuovo token.`,"settings.network.urls":`URL LAN`,"settings.network.scan":`Scansiona per connetterti`,"settings.network.noUrls":`Nessun indirizzo LAN rilevato.`,"settings.network.loadFailed":`Impossibile caricare le impostazioni di accesso di rete.`,"settings.network.updateFailed":`Impossibile aggiornare le impostazioni di accesso di rete.`,"settings.unsavedChanges.title":`Modifiche non salvate`,"settings.unsavedChanges.message":`Questo progetto ha modifiche non salvate. Cambiando progetto andranno perse.`,"settings.unsavedChanges.discard":`Scarta e cambia`,"settings.unsavedChanges.cancel":`Annulla`,"settings.loadFailed":`Impossibile caricare le impostazioni`,"settings.loadFailedHint":`Il salvataggio è disattivato: il modulo mostra i valori predefiniti e scriverli sovrascriverebbe la tua configurazione reale.`,"health.title":`Stato`,"health.tooltip":`Stato del sistema`,"changelog.title":`Changelog`,"changelog.tooltip":`Novità di Kōbō`,"changelog.empty":`Nessun changelog disponibile.`,"changelog.current":`corrente`,"changelog.currentVersion":`Versione corrente: v{version}`,"health.envTitle":`Ambiente`,"health.version":`Versione`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Database`,"health.dbPath":`Percorso`,"health.dbSize":`Dimensione`,"health.schemaVersion":`Versione schema`,"health.settingsSchemaVersion":`Schema impostazioni`,"health.runtimesTitle":`Runtime agente`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude non trovato nel PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binario codex non risolvibile`,"health.forgeCliTitle":`CLI di forge (gh / glab)`,"health.forgeCliMissing":`Né gh né glab trovati — pull request e monitoraggio CI non disponibili`,"health.workspacesTitle":`Workspace`,"health.workspacesCount":`{total} totali, {archived} archiviati`,"health.worktreesMissing":`{count} worktree mancanti sul disco`,"health.sessionsTitle":`Sessioni agente`,"health.sessionsOrphaned":`{n} sessione/sessioni orfana/e in esecuzione`,"health.integrationsTitle":`Integrazioni`,"health.integrationConfigured":`configurata`,"health.integrationMissing":`non configurata`,"health.integrationDisabled":`disabilitata`,"settings.integrationEnabled":`Attiva integrazione`,"health.activeTitle":`Stato attivo`,"health.activeQuotaBackoffs":`Quota backoff in attesa`,"health.activeWakeups":`Wakeup programmati`,"health.activeAutoLoop":`Auto-loop in esecuzione`,"health.activeAgentSessions":`Sessioni agente attive`,"health.activeDevServers":`Dev server in esecuzione`,"health.noneActive":`Nessuno.`,"health.quotaResumeAt":`riprende alle {time}`,"health.wakeupAt":`sveglia alle {time}`,"health.startedAgo":`avviata {time} fa`,"health.autoLoopReady":`pronto, in iterazione`,"health.autoLoopGrooming":`grooming in corso`,"session.started":`Sessione avviata`,"session.ended":`Sessione terminata`,"session.compacted":`Contesto compattato`,"session.endedCompleted":`Turno terminato — invia un messaggio per continuare`,"session.endedKilled":`Sessione interrotta`,"session.endedError":`Sessione terminata con un errore`,"session.endedWatchdog":`Sessione chiusa forzatamente dopo un periodo di inattività`,"tool.running":`In corso...`,"activity.raw_lines":`Righe di output grezze ({n})`,"activity.loading_older":`Caricamento messaggi precedenti…`,"activity.compacting":`Compattazione del contesto…`,"activity.prev_user_message":`Messaggio utente precedente`,"activity.scroll_to_bottom":`Scorri in fondo`,"activity.empty":`Ancora nulla`,"activity.emptyHint":`L’output dell’agente comparirà qui appena una sessione parte.`,"activity.a11y.region":`Annunci di attività dell’agente`,"activity.a11y.agentSaid":`Agente: {text}`,"activity.a11y.toolStarted":`Strumento {name} avviato`,"activity.a11y.toolFinished":`Strumento {name} completato`,"activity.a11y.toolFailed":`Strumento {name} fallito`,"chat.systemPrompt":`Prompt di sistema`,"chat.agent":`Agente`,"chat.cleanupScript":`Script di pulizia`,"chat.archiveScript":`Script di archiviazione`,"chat.setupScript":`Script di setup`,"chat.scriptDone":`Fatto`,"chat.scriptComplete":`[{phase}] Completato`,"chat.scriptError":`[{phase}] Errore: {message}`,"chat.unknownError":`sconosciuto`,"chat.you":`Tu`,"chat.session":`Sessione`,"chat.nActions":`{n} azione | {n} azioni`,"chat.lastUpdatedAt":`Ultimo aggiornamento alle {time}`,"chat.scrollToTurnTop":`Scorri all'inizio del messaggio`,"migration.backing_up":`Backup del database in corso…`,"migration.running":`Migrazione dei dati dell'agente — {processed}/{total}`,"migration.error":`Migrazione non riuscita`,"migration.backup_location":`Un backup è stato salvato in {path}. Riavvia Kōbō per riprovare.`,"migration.retry":`Riavvia Kōbō per riprovare.`,"engine.select":`Engine`,"engine.model":`Modello`,"engine.effort":`Livello di ragionamento`,"wakeup.scheduledIn":`Prossimo risveglio tra {n}s`,"wakeup.scheduledAt":`Prossimo risveglio alle {time}`,"wakeup.firing":`Risveglio in corso...`,"wakeup.reason":`Motivo: {reason}`,"wakeup.cancel":`Annulla questo risveglio`,"wakeup.pendingIndicator":`Risveglio programmato`,"cron.pendingIndicator":`{n} cron programmato/i`,"schedule.tabLabel":`Pianificazione`,"schedule.panelTitle":`Automazione`,"schedule.panelDescription":`Risvegliare questo workspace più tardi o eseguire istruzioni secondo una pianificazione.`,"schedule.activeTitle":`Pianificazioni attive`,"schedule.emptyTitle":`Nessuna pianificazione`,"schedule.emptyDescription":`Crea un wakeup singolo o un’attività ricorrente qui sotto.`,"schedule.cancelWakeup":`Annulla questo wakeup`,"schedule.cancelCron":`Elimina questa attività ricorrente`,"schedule.createTitle":`Crea una pianificazione`,"schedule.createDescription":`Scegli quando e come deve essere eseguito l'agente.`,"schedule.typeWakeup":`Wakeup singolo`,"schedule.typeRecurring":`Attività ricorrente`,"schedule.wakeupDescription":`Esegui il prompt una volta dopo un intervallo.`,"schedule.cronDescription":`Esegui il prompt periodicamente con una frequenza fissa.`,"schedule.promptHint":`Istruzioni che verranno inviate all'agente`,"schedule.frequencyTitle":`Frequenza`,"schedule.advancedDescription":`Usa un’espressione cron grezza`,"schedule.cronExpressionLabel":`Espressione cron`,"schedule.sessionModeTitle":`Sessione di esecuzione`,"schedule.modeResume":`Riprendi sessione`,"schedule.oneShotHint":`Rimuovi questa pianificazione dopo la prima esecuzione.`,"schedule.wakeupTitle":`Wakeup in attesa`,"schedule.cronsTitle":`Pianificazioni ricorrenti`,"schedule.noWakeup":`Nessun wakeup pianificato`,"schedule.noCrons":`Nessun cron pianificato`,"schedule.nextFireAt":`prossimo alle {time}`,"schedule.lastFiredAt":`ultimo {time} fa`,"schedule.addCronTitle":`Aggiungi un'attività ricorrente`,"schedule.addWakeupTitle":`Programma un wakeup`,"schedule.every":`Ogni`,"schedule.unitMinutes":`minuti`,"schedule.unitHours":`ore`,"schedule.unitDays":`giorni`,"schedule.daysDriftWarning":`L'intervallo può ridursi a 1 giorno a fine mese (limite di cron).`,"schedule.advancedExpression":`Espressione avanzata (opzionale)`,"schedule.advancedHint":`Cron grezzo (es. */15 * * * *) o {'@'}hourly/{'@'}daily — sostituisce il selettore se compilato.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Etichetta (opzionale)`,"schedule.delayMinutes":`Ritardo (minuti)`,"schedule.modeFresh":`Nuova sessione`,"schedule.oneShot":`Esegui una sola volta`,"schedule.addCronBtn":`Aggiungi cron`,"schedule.addWakeupBtn":`Programma wakeup`,"schedule.cronCreated":`Attività ricorrente aggiunta`,"schedule.wakeupCreated":`Wakeup programmato`,"askUserQuestion.title":`L'agente sta facendo una domanda`,"askUserQuestion.submit":`Invia risposta`,"askUserQuestion.multiSelectHint":`Seleziona una o più opzioni`,"askUserQuestion.otherOption":`Altro`,"askUserQuestion.otherOptionHint":`specifica nel prossimo messaggio`,"askUserQuestion.freeFormLabel":`Specifica la tua risposta`,"askUserQuestion.freeFormHint":`Questa risposta verrà inviata direttamente all'agente.`,"askUserQuestion.noPending":`Nessuna domanda in attesa`,"askUserQuestion.next":`Avanti`,"askUserQuestion.previous":`Indietro`,"askUserQuestion.cancel":`Annulla`,"askUserQuestion.cancelTooltip":`Salta questa domanda — l'agente proseguirà senza risposta`,"askUserQuestion.collapse":`Riduci il pannello della domanda`,"askUserQuestion.expand":`Espandi il pannello della domanda`,"permissionRequest.title":`L'agente vuole usare uno strumento`,"permissionRequest.allow":`Consenti`,"permissionRequest.allowOnce":`Consenti una volta`,"permissionRequest.allowTurn":`Consenti questo turno`,"permissionRequest.allowOperation":`Consenti sempre questa operazione`,"permissionRequest.allowTool":`Consenti sempre questo strumento`,"permissionRequest.deny":`Nega`,"permissionRequest.tool":`Strumento`,"permissionRequest.input":`Input`,"permissionRequest.rawInput":`Dettagli tecnici`,"permissionRequest.collapse":`Riduci il pannello dei permessi`,"permissionRequest.expand":`Espandi il pannello dei permessi`,"permissionRequest.denied":`negato dall'utente`,"workspaceStatus.created":`creato`,"workspaceStatus.extracting":`estrazione`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.executing":`in corso`,"workspaceStatus.awaitingUser":`in attesa della tua risposta`,"workspaceStatus.completed":`completato`,"workspaceStatus.idle":`inattivo`,"workspaceStatus.error":`errore`,"workspaceStatus.quota":`quota raggiunta`,"workspaceStatus.retrying":`ripresa automatica`,"workspaceList.prOpen":`#{n} — Pull request aperta`,"workspaceList.prWatchDisabledIndicator":`Controlli PR ignorati per questo workspace`,"workspaceList.prChangesRequested":`#{n} — Modifiche richieste`,"workspaceList.attentionCiFailed":`CI fallita`,"workspaceList.attentionChangesRequested":`Modifiche richieste`,"workspaceList.attentionReadyToMerge":`Pronto per il merge`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Avvia l'auto-loop`,"autoLoop.prepare":`Prepara per l'auto-loop`,"autoLoop.reprepare":`Ri-prepara per l'auto-loop`,"autoLoop.reprepareTooltip":`Rilancia la fase di grooming per aggiungere o aggiornare le attività prima di riavviare il loop`,"autoLoop.prepareBusy":`Attendi che l'agente finisca prima di preparare`,"autoLoop.forceReady":`So cosa faccio — salta la preparazione`,"autoLoop.forceReadyConfirm":`Saltare la preparazione e segnare auto-loop pronto? Il loop potrebbe bloccarsi se le attività non sono atomiche.`,"autoLoop.stop":`Ferma l'auto-loop`,"autoLoop.notReady":`Esegui prima «Prepara per l'auto-loop»`,"autoLoop.noTasks":`Aggiungi prima delle attività`,"autoLoop.progress":`Auto-loop · {done}/{total} attività`,"autoLoop.preparing":`Auto-loop · preparazione`,"autoLoop.preparingTooltip":`Grooming in corso — l'agente sta creando / revisionando le attività. Il loop partirà quando chiamerà mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop in corso`,"autoLoop.startInMode":`Avvia in modalità auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Modello usato solo per la sessione di brainstorming iniziale — ogni attività successiva usa il modello scelto sopra`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Livello di ragionamento usato solo per la sessione di brainstorming iniziale`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Modello usato per ogni attività dell'auto-loop dopo la sessione di brainstorming iniziale`,"autoLoop.sessionMode.perTask":`Nuova sessione per attività`,"autoLoop.sessionMode.label":`Sessione:`,"autoLoop.sessionMode.perTaskTooltip":`Ogni attività avvia una nuova sessione Claude Code senza memoria delle attività precedenti`,"autoLoop.sessionMode.continuous":`Sessione continua`,"autoLoop.sessionMode.continuousTooltip":`Tutte le attività si susseguono nella stessa sessione — l'agente mantiene tutto il contesto, ma la sessione si allunga nel tempo`,"koboCommand.prepAutoloopDesc":`Preparare le attività per la modalità auto-loop (atomicità)`,"staleSessionBanner.title":`Auto-loop in corso`,"staleSessionBanner.message":`Stai visualizzando una sessione precedente — l'agente sta lavorando nella più recente.`,"staleSessionBanner.staleTitle":`Sessione precedente`,"staleSessionBanner.staleMessage":`Stai visualizzando una sessione precedente — i messaggi inviati andranno a questa sessione, non alla più recente.`,"staleSessionBanner.switchToCurrent":`Passa a quella corrente`,"network.login.title":`Accesso di rete`,"network.login.description":`Questo Kōbō richiede un token per essere controllato dalla rete. Incolla il token mostrato nelle Impostazioni sulla macchina host.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Incolla il tuo token`,"network.login.connect":`Connetti`,"network.login.invalid":`Token non valido`,"network.login.serverError":`Errore del server — riprova.`,"network.login.unreachable":`Kōbō non è raggiungibile — controlla la connessione.`,"layout.toggleWorkspaces":`Mostra/nascondi il pannello degli spazi`,"layout.togglePanel":`Mostra/nascondi il pannello laterale`,"unsaved.title":`Uscire senza salvare?`,"unsaved.message":`Hai modifiche non salvate. Uscire da questa pagina le scarta.`,"unsaved.leave":`Esci`,"unsaved.stay":`Resta`},Fr=`kobo:locale`,Ir=[`en`,`fr`,`de`,`es`,`it`];function Lr(e){return Ir.includes(e)}function Rr(){let e=localStorage.getItem(Fr);if(e&&Lr(e))return e;let t=navigator.language.split(`-`)[0];return t&&Lr(t)?(localStorage.setItem(Fr,t),t):(localStorage.setItem(Fr,`en`),`en`)}var zr=Rr(),Br=t({legacy:!1,locale:zr,fallbackLocale:`en`,messages:{en:jr,fr:Nr,de:Ar,es:Mr,it:Pr}});function Vr(e){typeof document>`u`||(document.documentElement.lang=e)}Vr(zr);var Hr=5e3,Ur=Ie(`agent-stream`,()=>{let e=i(new Map),t=i(new Map),n=i(new Map),r=i(new Map),a=i(new Map),o=i(new Map),s=i(new Map),c=i(new Map),l=i(new Map);function u(e){l.value.get(e)}function d(e){l.value.set(e,(l.value.get(e)??0)+1)}function f(e){return l.value.get(e)??0}function p(e){let t=c.value.get(e);return t||(t=new Set,c.value.set(e,t)),t}function m(e){return u(e),s.value.get(e)??!1}function h(e,t){(s.value.get(e)??!1)!==t&&(s.value.set(e,t),d(e))}function g(t){return u(t),e.value.get(t)??[]}function _(e){return u(e),t.value.get(e)??[]}function v(e){return u(e),n.value.get(e)??[]}function y(e){return u(e),r.value.get(e)??[]}function b(e){return u(e),a.value.get(e)}function x(e){return u(e),o.value.get(e)??!0}function S(i,o,s,c,l){let u=e.value.get(i)??[],f=t.value.get(i)??[],m=n.value.get(i)??[],h=r.value.get(i)??[],g=p(i);if(c&&g.has(c))return;let _=u.length===0;u.push(o),f.push(s??new Date().toISOString()),m.push(l??null),h.push(c??null),c&&g.add(c),e.value.set(i,u),t.value.set(i,f),n.value.set(i,m),r.value.set(i,h),_&&c&&a.value.set(i,c),C(i,u,f,m,h),d(i)}function C(e,t,n,r,i){let s=t.length-Hr;if(s<=0)return;let c=i.slice(0,s),l=p(e);for(let e of c)e&&l.delete(e);t.splice(0,s),n.splice(0,s),r.splice(0,s),i.splice(0,s);let u=i.find(e=>typeof e==`string`);u?a.value.set(e,u):a.value.delete(e),o.value.set(e,!0)}function w(i,o,s,c){let l=e.value.get(i)??[],u=t.value.get(i)??[],f=n.value.get(i)??[],m=r.value.get(i)??[],h=p(i),g=[];for(let e=0;e<o.length;e++){let t=o[e];if(!t)continue;let n=c.eventIds[e]??null;n&&h.has(n)||(l.push(t),u.push(s[e]??new Date().toISOString()),f.push(c.sessionIds[e]??null),m.push(n),n&&h.add(n),g.push(e))}if(g.length===0)return g;if(e.value.set(i,l),t.value.set(i,u),n.value.set(i,f),r.value.set(i,m),!a.value.has(i)){let e=m.find(e=>typeof e==`string`);e&&a.value.set(i,e)}return C(i,l,u,f,m),d(i),g}function T(i,s,c,l){e.value.set(i,[...s]),t.value.set(i,c?[...c]:s.map(()=>new Date().toISOString())),n.value.set(i,l?.sessionIds?[...l.sessionIds]:s.map(()=>null));let u=l?.eventIds?[...l.eventIds]:s.map(()=>null);r.value.set(i,u);let f=p(i);f.clear();for(let e of u)e&&f.add(e);l?.oldestId?a.value.set(i,l.oldestId):a.value.delete(i),l&&typeof l.hasMoreOlder==`boolean`?o.value.set(i,l.hasMoreOlder):o.value.delete(i),d(i)}function E(i,s,c,l){if(s.length===0){o.value.set(i,l.hasMoreOlder),d(i);return}let u=e.value.get(i)??[],f=t.value.get(i)??[],m=n.value.get(i)??[],h=r.value.get(i)??[],g=l.sessionIds??s.map(()=>null),_=l.eventIds??s.map(()=>null);e.value.set(i,[...s,...u]),t.value.set(i,[...c,...f]),n.value.set(i,[...g,...m]),r.value.set(i,[..._,...h]);let v=p(i);for(let e of _)e&&v.add(e);l.oldestId&&a.value.set(i,l.oldestId),o.value.set(i,l.hasMoreOlder),d(i)}function D(i,a){let o=e.value.get(i),s=r.value.get(i);if(!o||!s)return;let c=s.indexOf(a);if(c===-1)return;let l=t.value.get(i),u=n.value.get(i);o.splice(c,1),s.splice(c,1),l&&l.splice(c,1),u&&u.splice(c,1),p(i).delete(a),d(i)}function O(i){e.value.delete(i),t.value.delete(i),n.value.delete(i),r.value.delete(i),a.value.delete(i),o.value.delete(i),s.value.delete(i),c.value.delete(i),d(i)}return{events:e,timestamps:t,sessionIds:n,eventIds:r,versions:l,versionFor:f,eventsFor:g,timestampsFor:_,sessionIdsFor:v,eventIdsFor:y,oldestIdFor:b,hasMoreOlderFor:x,isCompacting:m,setCompacting:h,append:S,merge:w,reset:T,prepend:E,removeByEventId:D,clear:O}}),Wr=class extends Error{constructor(e,t,n,r){super(e),on(this,`status`,void 0),on(this,`code`,void 0),on(this,`body`,void 0),this.name=`ApiError`,this.status=t,this.code=n,this.body=r}},Gr=class extends Error{constructor(e){super(`Request timed out after ${e} ms`),on(this,`timeoutMs`,void 0),this.name=`ApiTimeoutError`,this.timeoutMs=e}},Kr=3e4;function qr(e,t){let n=e.trim();if(n.length===0)return{message:`HTTP ${t}`,code:void 0};try{let e=JSON.parse(n),r=typeof e.code==`string`?e.code:void 0;return typeof e.error==`string`&&e.error.length>0?{message:e.error,code:r}:typeof e.message==`string`&&e.message.length>0?{message:e.message,code:r}:{message:`HTTP ${t}`,code:r}}catch{return{message:n.slice(0,500),code:void 0}}}async function q(e,t={}){let{body:n,timeoutMs:r=Kr,signal:i,headers:a,...o}=t,s=new AbortController,c=!1,l=r>0?setTimeout(()=>{c=!0,s.abort()},r):null,u=()=>s.abort();i?.addEventListener(`abort`,u);let d={...o,signal:s.signal};n===void 0?a&&(d.headers=a):typeof n==`string`||n instanceof FormData||n instanceof Blob?(d.body=n,a&&(d.headers=a)):(d.body=JSON.stringify(n),d.headers={"Content-Type":`application/json`,...a??{}});let f;try{f=await fetch(e,d)}catch(e){throw c?new Gr(r):e}finally{l!==null&&clearTimeout(l),i?.removeEventListener(`abort`,u)}if(!f.ok){let e=await f.text().catch(()=>``),{message:t,code:n}=qr(e,f.status);throw new Wr(t,f.status,n,e)}if(f.status===204)return;let p=await f.text();if(p.length!==0)try{return JSON.parse(p)}catch(e){throw new Wr(`Server returned a non-JSON body for a successful response: ${e instanceof Error?e.message:String(e)}`,f.status,void 0,p)}}var Jr=`/sounds`,Yr=[{id:`basic-notification.mp3`,labelKey:`settings.notificationSoundBasic`},{id:`hey.mp3`,labelKey:`settings.notificationSoundHey`},{id:`warcraft-3-humain-travail.mp3`,labelKey:`settings.notificationSoundWorkspaceCreated`},{id:`travail_termine.mp3`,labelKey:`settings.notificationSoundTravailTermine`},{id:`faaah.mp3`,labelKey:`settings.notificationSoundFaaah`},{id:`ca_va_peter.mp3`,labelKey:`settings.notificationSoundCaVaPeter`},{id:`dry-fart.mp3`,labelKey:`settings.notificationSoundDryFart`},{id:`for-shure.mp3`,labelKey:`settings.notificationSoundForShure`},{id:`7eme-compagnie-03.mp3`,labelKey:`settings.notificationSoundSeptiemeCompagnie03`},{id:`aller-ftg.mp3`,labelKey:`settings.notificationSoundAllerFtg`},{id:`arrete-de-mentir.mp3`,labelKey:`settings.notificationSoundArreteDeMentir`},{id:`arretez-les-messages.mp3`,labelKey:`settings.notificationSoundArretezLesMessages`},{id:`bah-alors-on-est-nul.mp3`,labelKey:`settings.notificationSoundBahAlorsOnEstNul`},{id:`gta-v-death.mp3`,labelKey:`settings.notificationSoundGtaVDeath`},{id:`nan-tu-degages.mp3`,labelKey:`settings.notificationSoundNanTuDegages`},{id:`nan-wallah-pardon.mp3`,labelKey:`settings.notificationSoundNanWallahPardon`},{id:`ouais-cest-greg.mp3`,labelKey:`settings.notificationSoundOuaisCestGreg`},{id:`pas-ca-zinedine.mp3`,labelKey:`settings.notificationSoundPasCaZinedine`},{id:`ta-gueule.mp3`,labelKey:`settings.notificationSoundTaGueule`},{id:`tu-vas-la-fermer.mp3`,labelKey:`settings.notificationSoundTuVasLaFermer`},{id:`yaaa.mp3`,labelKey:`settings.notificationSoundYaaa`},{id:`mais-laisse-moi-dormir-zebi.mp3`,labelKey:`settings.notificationSoundMaisLaisseMoiDormirZebi`}],Xr=`hey.mp3`,Zr=`inherit`,Qr=`none`,$r=[`audioPrCiFailedSound`,`audioPrCiRecoveredSound`,`audioPrChangesRequestedSound`,`audioPrApprovedSound`,`audioPrMergeConflictSound`,`audioPrReadyToMergeSound`,`audioPrMergedSound`],ei=[`audioPrCiFailedEnabled`,`audioPrCiFailedVolume`,`audioPrCiRecoveredEnabled`,`audioPrCiRecoveredVolume`,`audioPrChangesRequestedEnabled`,`audioPrChangesRequestedVolume`,`audioPrApprovedEnabled`,`audioPrApprovedVolume`,`audioPrMergeConflictEnabled`,`audioPrMergeConflictVolume`,`audioPrReadyToMergeEnabled`,`audioPrReadyToMergeVolume`,`audioPrMergedEnabled`,`audioPrMergedVolume`],ti={audioPrCiFailedSound:Zr,audioPrCiRecoveredSound:Zr,audioPrChangesRequestedSound:Zr,audioPrApprovedSound:Zr,audioPrMergeConflictSound:Zr,audioPrReadyToMergeSound:Zr,audioPrMergedSound:Zr,audioPrCiFailedEnabled:!1,audioPrCiFailedVolume:1,audioPrCiRecoveredEnabled:!1,audioPrCiRecoveredVolume:1,audioPrChangesRequestedEnabled:!1,audioPrChangesRequestedVolume:1,audioPrApprovedEnabled:!1,audioPrApprovedVolume:1,audioPrMergeConflictEnabled:!1,audioPrMergeConflictVolume:1,audioPrReadyToMergeEnabled:!1,audioPrReadyToMergeVolume:1,audioPrMergedEnabled:!1,audioPrMergedVolume:1};function ni(e){return Yr.some(t=>t.id===e)}function ri(e){return e&&ni(e)?e:Xr}function ii(e){if(e===`none`)return null;if(e!==`inherit`)return typeof e==`string`&&ni(e)?e:void 0}function ai(e){let t=ii(e);return t===null?Qr:t??`inherit`}function oi(e){return`${Jr}/${ri(e)}`}var si=`mod+shift+x`,ci=[`mod`,`ctrl`,`meta`,`alt`,`shift`],li=new Set([`mod+w`,`mod+shift+w`,`ctrl+w`,`ctrl+shift+w`,`meta+w`,`meta+shift+w`]),ui=new Set([`control`,...ci]);function di(e){return li.has(e)}function fi(e){if(typeof e!=`string`||e.length===0||e!==e.toLowerCase()||di(e))return null;let t=e.split(`+`);if(t.some(e=>e.length===0))return null;let n=t.at(-1);if(!n||!/^[a-z0-9][a-z0-9_-]*$/.test(n)||ui.has(n))return null;let r=t.slice(0,-1),i=new Set,a=-1;for(let e of r){let t=ci.indexOf(e);if(t<=a)return null;a=t,i.add(e)}return{modifiers:i,key:n}}var pi=new Set([`control`,`meta`,`alt`,`shift`]),mi={" ":`space`,"+":`plus`,"-":`minus`,"=":`equal`,",":`comma`,".":`period`,"/":`slash`,"\\":`backslash`,";":`semicolon`,"'":`quote`,"[":`bracketleft`,"]":`bracketright`,"`":`backquote`};function hi(e){let t=mi[e]??e.toLowerCase();return/^[a-z0-9][a-z0-9_-]*$/.test(t)?t:null}function gi(e=globalThis.navigator?.platform??``){return/mac|iphone|ipad|ipod/i.test(e)?`mac`:`other`}function _i(e,t){if(e.key===`Escape`)return{status:`cancelled`};if(pi.has(e.key.toLowerCase()))return{status:`pending`};let n=hi(e.key);if(!n)return{status:`pending`};let r=new Set;(t===`mac`?e.metaKey:e.ctrlKey)&&r.add(`mod`),t===`mac`&&e.ctrlKey&&r.add(`ctrl`),t===`other`&&e.metaKey&&r.add(`meta`),e.altKey&&r.add(`alt`),e.shiftKey&&r.add(`shift`);let i=[...ci.filter(e=>r.has(e)),n].join(`+`);return di(i)?{status:`reserved`}:{status:`accepted`,shortcut:i}}function vi(e,t,n){let r=fi(t),i=hi(e.key);if(!r||!i||i!==r.key)return!1;let a=r.modifiers.has(`ctrl`)||n===`other`&&r.modifiers.has(`mod`),o=r.modifiers.has(`meta`)||n===`mac`&&r.modifiers.has(`mod`);return e.ctrlKey===a&&e.metaKey===o&&e.altKey===r.modifiers.has(`alt`)&&e.shiftKey===r.modifiers.has(`shift`)}function yi(e){return{space:`Space`,arrowup:`↑`,arrowdown:`↓`,arrowleft:`←`,arrowright:`→`}[e]??e.toUpperCase()}function bi(e,t){let n=fi(e);return n?t===`mac`?`${[n.modifiers.has(`mod`)||n.modifiers.has(`meta`)?`⌘`:``,n.modifiers.has(`ctrl`)?`⌃`:``,n.modifiers.has(`alt`)?`⌥`:``,n.modifiers.has(`shift`)?`⇧`:``].join(``)}${yi(n.key)}`:[n.modifiers.has(`mod`)||n.modifiers.has(`ctrl`)?`Ctrl`:``,n.modifiers.has(`meta`)?`Meta`:``,n.modifiers.has(`alt`)?`Alt`:``,n.modifiers.has(`shift`)?`Shift`:``,yi(n.key)].filter(Boolean).join(`+`):e}var xi=`.worktrees`;function Si(e){return btoa(e).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}var Ci=Ie(`settings`,{state:()=>({global:{defaultModelByEngine:{"claude-code":`auto`,codex:`auto`},dangerouslySkipPermissions:!0,prPromptTemplate:``,reviewPromptTemplate:``,ciFixPromptTemplate:``,finalizationPrompt:``,notionInitialPromptTemplate:``,sentryInitialPromptTemplate:``,gitConventions:``,editorCommand:``,fileManagerCommand:``,terminalCommand:``,autoPurgeOnPrMerged:!1,autoLoopMaxRetries:5,wsEventsRetentionDays:0,wsEventsKeepPerWorkspace:0,browserNotifications:!0,audioNotifications:!0,audioQuestionNotifications:!1,audioWorkspaceCreatedNotifications:!1,audioAgentErrorNotifications:!1,audioNotificationSound:`hey.mp3`,audioQuestionSound:`inherit`,audioWorkspaceCreatedSound:`inherit`,audioAgentErrorSound:`inherit`,...ti,audioNotificationVolume:1,audioQuestionVolume:1,audioWorkspaceCreatedVolume:1,audioAgentErrorVolume:1,notionStatusProperty:``,notionInProgressStatus:``,notionAssigneeProperty:``,notionUserId:``,defaultPermissionModeByEngine:{"claude-code":`plan`,codex:`plan`},notionMcpKey:``,sentryMcpKey:``,bitbucketToken:``,bitbucketUsername:``,notionEnabled:!0,sentryEnabled:!0,showThinkingBlocks:!0,whipEnabled:!1,whipShortcut:si,whipVolume:1,tags:[],branchPrefixes:[],setupScript:``,cleanupScript:``,cleanupScriptMode:`no-tasks`,cleanupScriptOnlyOnChanges:!1,archiveScript:``,changeSourceBranchScript:``,worktreesPath:xi,worktreesPrefixByProject:!1,voiceEnabled:!1,voicePttKey:`alt`,voiceLanguage:`auto`,voiceModel:null,voiceCommandPath:``,voiceFfmpegPath:``,voiceTemperature:0,voicePrompt:``,voiceTranslateToEnglish:!1,voiceSuppressNonSpeechTokens:!0,flattenWorkspaceList:!1,skillSuite:`superpowers`,customReviewTemplate:``,customAutoLoopReviewGate:``,customAutoLoopGroomingIntro:``,customQaPromptTemplate:``,customBrainstormingInstruction:``},voiceModels:[],voiceModelsLoading:!1,voiceModelsDir:``,voiceRuntime:null,activeMcpServers:[],projects:[],loading:!1,loaded:!1,loadError:null,showVerboseSystemMessages:localStorage.getItem(`kobo:showVerboseSystemMessages`)===`true`}),getters:{getProjectByPath:e=>t=>e.projects.find(e=>e.path===t)??null,projectPaths:e=>e.projects.map(e=>e.path)},actions:{_assertLoaded(){if(!this.loaded)throw Error(`Settings were never loaded successfully — refusing to overwrite the stored configuration`)},async fetchSettings(){this.loading=!0;try{let e=await q(`/api/settings`);this.global=e.global,this.projects=e.projects,this.loadError=null,this.loaded=!0}catch(e){this.loadError=e instanceof Error?e.message:String(e),this.loaded=!1,console.error(`[settings store] fetchSettings failed:`,e)}finally{this.loading=!1}},async fetchActiveMcpServers(){try{this.activeMcpServers=await q(`/api/settings/mcp-servers`)}catch(e){console.error(`[settings store] fetchActiveMcpServers failed:`,e),this.activeMcpServers=[]}},async fetchGlobalDefaults(){return q(`/api/settings/defaults`)},async previewRetention(e,t){return q(`/api/settings/ws-events-retention-preview?days=${e}&keep=${t}`)},async updateGlobal(e){this._assertLoaded(),this.global=await q(`/api/settings/global`,{method:`PUT`,body:e})},async upsertProject(e,t){this._assertLoaded();let n=await q(`/api/settings/projects/${Si(e)}`,{method:`PUT`,body:t}),r=this.projects.findIndex(t=>t.path===e);r>=0?this.projects[r]=n:this.projects.push(n)},toggleVerboseSystemMessages(){this.setVerboseSystemMessages(!this.showVerboseSystemMessages)},setVerboseSystemMessages(e){this.showVerboseSystemMessages=e,localStorage.setItem(`kobo:showVerboseSystemMessages`,String(e))},async deleteProject(e){this._assertLoaded(),await q(`/api/settings/projects/${Si(e)}`,{method:`DELETE`}),this.projects=this.projects.filter(t=>t.path!==e)},async fetchVoiceModels(){this.voiceModelsLoading=!0;try{let e=await q(`/api/voice/models`);this.voiceModels=e.available,this.voiceModelsDir=e.modelsDir,this.global.voiceModel=e.activeModel}catch(e){console.error(`[settings store] fetchVoiceModels failed:`,e)}finally{this.voiceModelsLoading=!1}},async cancelVoiceModelDownload(e){try{await q(`/api/voice/models/${encodeURIComponent(e)}/download`,{method:`DELETE`})}catch(e){if(!(e instanceof Wr)||e.status!==404)throw e}await this.fetchVoiceModels()},async fetchVoiceRuntime(){try{this.voiceRuntime=await q(`/api/voice/runtime`)}catch(e){console.error(`[settings store] fetchVoiceRuntime failed:`,e)}},async downloadVoiceModel(e){await q(`/api/voice/models/${encodeURIComponent(e)}/download`,{method:`POST`}),await this.fetchVoiceModels()},async deleteVoiceModel(e){await q(`/api/voice/models/${encodeURIComponent(e)}`,{method:`DELETE`}),await this.fetchVoiceModels()}}}),wi=6e3,Ti=new Map,Ei=[],Di=!1;function Oi(e){let t=Ti.get(e);return t||(t=new Audio(oi(e)),Ti.set(e,t)),t}function ki(e,t){let n=new Audio(oi(ri(e)));n.preload=`auto`,n.volume=t,n.play().catch(()=>{})}function Ai(){`Notification`in window&&Notification.permission==="default"&&Notification.requestPermission()}function ji(e){return typeof e!=`number`||!Number.isFinite(e)?1:Math.max(0,Math.min(1,e))}function Mi(){let e=Ei.shift();if(!e){Di=!1;return}Di=!0;let t=Oi(ri(e.soundId));t.volume=e.volume,t.currentTime=0;let n=!1,r=()=>{n||(n=!0,t.removeEventListener(`ended`,r),t.removeEventListener(`error`,r),Mi())};t.addEventListener(`ended`,r,{once:!0}),t.addEventListener(`error`,r,{once:!0}),t.play().catch(r)}function Ni(e,t){let n={soundId:ri(e),volume:ji(t)};if(document.visibilityState===`hidden`){ki(n.soundId,n.volume);return}Ei.push(n),Di||Mi()}function Pi(e,t){let n=Oi(ri(e));n.volume=ji(t),n.currentTime=0,n.play().catch(()=>{})}function Fi(e,t,n,r,i,a){let o=Ci();if(!document.hasFocus()&&o.global.browserNotifications&&`Notification`in window&&Notification.permission===`granted`){let r=new Notification(e,{body:t,icon:`/favicon.ico`});n&&(r.onclick=()=>{window.focus(),window.location.hash=`#/workspace/${n}`,r.close()})}(a??o.global.audioNotifications)&&r!==null&&Ni(r&&r.length>0?r:o.global.audioNotificationSound??`hey.mp3`,i??o.global.audioNotificationVolume)}function Ii(e,t){let n=[{label:t.retryLabel,color:`white`,handler:t.onRetry}];t.detailsLabel&&t.onDetails&&n.push({label:t.detailsLabel,color:`white`,handler:t.onDetails}),n.push({label:t.dismissLabel,color:`grey-5`}),kr.create({type:`negative`,position:`top`,multiLine:!0,message:e,timeout:t.timeout??0,actions:n})}var Li=Ie(`devServer`,{state:()=>({statuses:{},logs:{}}),getters:{getStatus:e=>t=>e.statuses[t]??null},actions:{async fetchStatus(e){try{let t=await fetch(`/api/dev-server/${e}/status`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){console.error(`[dev-server store] fetchStatus failed:`,e)}},async startDevServer(e){try{let t=await fetch(`/api/dev-server/${e}/start`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){throw console.error(`[dev-server store] startDevServer failed:`,e),e}},async stopDevServer(e){try{let t=await fetch(`/api/dev-server/${e}/stop`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){throw console.error(`[dev-server store] stopDevServer failed:`,e),e}},async fetchLogs(e,t=200){try{let n=await fetch(`/api/dev-server/${e}/logs?tail=${t}`);if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json();return this.logs[e]=r.logs,r.logs}catch(e){return console.error(`[dev-server store] fetchLogs failed:`,e),``}},updateFromWsEvent(e,t){this.statuses[e]=t}}});function Ri(e){return e.state===`OPEN`&&e.reviewDecision===`CHANGES_REQUESTED`&&e.reviewers.some(e=>e.state===`CHANGES_REQUESTED`)}function zi(e){return e.state===`OPEN`&&e.ci.rollup===`FAILURE`}function Bi(e){return e?zi(e)||Ri(e):!1}var Vi=[`executing`,`extracting`,`brainstorming`];function Hi(e){return!!e&&Vi.includes(e)}function Ui(e,t){return Hi(e)&&!t}function Wi(e,t,n){return Ui(e,!t||n)}var Gi={created:`workspaceStatus.created`,extracting:`workspaceStatus.extracting`,brainstorming:`workspaceStatus.brainstorming`,executing:`workspaceStatus.executing`,"awaiting-user":`workspaceStatus.awaitingUser`,completed:`workspaceStatus.completed`,idle:`workspaceStatus.idle`,error:`workspaceStatus.error`,quota:`workspaceStatus.quota`};function Ki(e){return e?Gi[e]??null:null}var qi=class extends Error{constructor(e,t){super(e),on(this,`code`,void 0),this.name=`WorkspaceActionError`,this.code=t}};function Ji(e){return e===`running`?`in_progress`:e}var Yi=5e3,Xi=500,Zi=null,Qi=0,$i=0,ea=new Map,ta=new Map,na=new Map,ra=new Map;function ia(e){ta.set(e,(ta.get(e)??0)+1)}function aa(e,t,n){let r={...e},i=new Set([...Object.keys(e),...Object.keys(t)]);for(let a of i){let i=t[a],o=e[a],s=(ta.get(a)??0)!==(n.get(a)??0),c=i?Date.parse(i.updatedAt):NaN,l=o?Date.parse(o.updatedAt):NaN;(s||Number.isFinite(c)&&c>l)&&(i?r[a]=i:delete r[a])}return r}function oa(e){return e===`claude-code`?`claude-code`:null}var J=Ie(`workspace`,{state:()=>({workspaces:[],selectedWorkspaceId:null,tasks:[],activityFeeds:{},activityFeedIds:{},activityCounts:{},subagents:{},agentTodos:{},sessions:[],selectedSessionId:null,archivedWorkspaces:[],archivedLoaded:!1,loading:!1,listLoadError:null,listPollFailureStreak:0,activeListLoadFailed:!1,loadingOlderEvents:!1,hasMoreEvents:{},providerUsage:{},chatDraft:``,queuedMessages:{},activeAgentSessionIds:{},settledAgentSessionIds:{},gitRefreshTrigger:0,gitStatsCache:{},pendingWakeups:{},pendingQuotaBackoffs:{},pendingDeferred:{},pendingQueue:{},prSnapshots:{},autoLoopStates:{},crons:{},creationProgress:null,agentLiveness:{},agentLivenessLoaded:{}}),getters:{selectedWorkspace:e=>e.workspaces.find(t=>t.id===e.selectedWorkspaceId)??e.archivedWorkspaces.find(t=>t.id===e.selectedWorkspaceId)??null,needsAttention(e){return e.workspaces.filter(t=>[`error`,`quota`,`awaiting-user`].includes(t.status)||Bi(e.prSnapshots[t.id])||!Hi(t.status)&&!!e.prSnapshots[t.id]?.readyToMerge)},running(e){return e.workspaces.filter(t=>Hi(t.status)&&!Bi(e.prSnapshots[t.id]))},idle(e){return e.workspaces.filter(t=>[`completed`,`idle`,`created`].includes(t.status)&&!Bi(e.prSnapshots[t.id])&&!e.prSnapshots[t.id]?.readyToMerge)},favorites(e){return e.workspaces.filter(e=>e.favoritedAt!==null)},currentAgentTodos:e=>e.selectedWorkspaceId?e.agentTodos[e.selectedWorkspaceId]??[]:[],currentSubagents:e=>{if(!e.selectedWorkspaceId)return[];let t=e.subagents[e.selectedWorkspaceId]??{};return Object.values(t).sort((e,t)=>e.startedAt.localeCompare(t.startedAt))},activityFeed:e=>{if(!e.selectedWorkspaceId)return[];let t=e.activityFeeds[e.selectedWorkspaceId]??[];if(!e.selectedSessionId)return e.sessions.length===0?t:[];let n=e.sessions.find(t=>t.id===e.selectedSessionId)?.engineSessionId??null,r=e.sessions.length>0?e.sessions[e.sessions.length-1].id:null,i=e.selectedSessionId===r;return t.filter(t=>t.sessionId?t.sessionId===e.selectedSessionId||n!==null&&t.sessionId===n:i)},acceptanceCriteria:e=>e.tasks.filter(e=>e.isAcceptanceCriterion),archived:e=>e.archivedWorkspaces,currentProviderUsage(e){let t=e.workspaces.find(t=>t.id===e.selectedWorkspaceId);if(!t)return null;let n=oa(t.engine);return n?e.providerUsage[n]??null:null}},actions:{clearWorkspaceLocalState(e){delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e],delete this.subagents[e],delete this.agentTodos[e],delete this.hasMoreEvents[e],delete this.gitStatsCache[e],delete this.pendingWakeups[e],delete this.pendingQuotaBackoffs[e],delete this.pendingDeferred[e],delete this.pendingQueue[e],delete this.prSnapshots[e],delete this.autoLoopStates[e],delete this.crons[e],delete this.activeAgentSessionIds[e];for(let t of Object.keys(this.queuedMessages))t.startsWith(`${e}:`)&&delete this.queuedMessages[t];ea.delete(e),ta.delete(e),na.delete(e),ra.delete(e),Ur().clear(e),localStorage.removeItem(`kobo:session:${e}`)},setCreationProgress(e){this.creationProgress=e},clearCreationProgress(){this.creationProgress=null},async toggleFavorite(e){let t=this.workspaces.find(t=>t.id===e);if(!t)return;let n=t.favoritedAt,r=n===null,i=r?new Date().toISOString():null;this.workspaces=this.workspaces.map(t=>t.id===e?{...t,favoritedAt:i}:t);try{let t=await fetch(`/api/workspaces/${e}/favorite`,{method:r?`POST`:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.workspaces=this.workspaces.map(t=>t.id===e?n:t)}catch(t){throw this.workspaces=this.workspaces.map(t=>t.id===e?{...t,favoritedAt:n}:t),t}},async togglePrWatch(e){let t=this.workspaces.find(t=>t.id===e);if(!t)return;let n=t.prWatchDisabledAt===null,r=n?new Date().toISOString():null;this.workspaces=this.workspaces.map(t=>t.id===e?{...t,prWatchDisabledAt:r}:t);try{let t=await fetch(`/api/workspaces/${e}/pr-watch-disabled`,{method:n?`POST`:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`);if(n){let n=await t.json();this.workspaces=this.workspaces.map(t=>t.id===e?n:t),delete this.prSnapshots[e],ia(e)}else{let{workspace:n,prSnapshot:r}=await t.json();this.workspaces=this.workspaces.map(t=>t.id===e?n:t),r?this.prSnapshots[e]=r:delete this.prSnapshots[e],ia(e)}}catch(n){throw this.workspaces=this.workspaces.map(n=>n.id===e?{...n,prWatchDisabledAt:t.prWatchDisabledAt}:n),n}},async setWorkspaceTags(e,t){let n=this.workspaces.find(t=>t.id===e);if(!n)return;let r=n.tags,i=[...t];this.workspaces=this.workspaces.map(t=>t.id===e?{...t,tags:i}:t);try{let n=await fetch(`/api/workspaces/${e}/tags`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tags:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json();this.workspaces=this.workspaces.map(t=>t.id===e?r:t)}catch(t){throw this.workspaces=this.workspaces.map(t=>t.id===e?{...t,tags:r}:t),t}},async fetchOrphanWorktrees(e){return q(`/api/git/orphan-worktrees?projectPath=${encodeURIComponent(e)}`,{cache:`no-store`})},async fetchWorkspaces(){this.loading=!0;try{let e=await q(`/api/workspaces`);this.workspaces=Array.isArray(e)?e:e.workspaces??[],this.listLoadError=null,this.activeListLoadFailed=!1,this.listPollFailureStreak=0;for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id)}catch(e){this.listLoadError=e instanceof Error?e.message:String(e),this.activeListLoadFailed=!0,console.error(`[workspace store] fetchWorkspaces failed:`,e)}finally{this.loading=!1}},async retryLoadWorkspaces(){await this.fetchWorkspaces(),this.archivedLoaded&&await this.fetchArchivedWorkspaces()},async fetchArchivedWorkspaces(){try{this.archivedWorkspaces=await q(`/api/workspaces/archived`),this.archivedLoaded=!0,this.activeListLoadFailed||(this.listLoadError=null)}catch(e){this.listLoadError=e instanceof Error?e.message:String(e),console.error(`[workspace store] fetchArchivedWorkspaces failed:`,e)}},async fetchWorkspaceDetails(e){let t=(ra.get(e)??0)+1;ra.set(e,t);let n=ea.get(e)??0;try{let r=await q(`/api/workspaces/${e}`);if(this.selectedWorkspaceId!==e||ra.get(e)!==t)return;let i=(ea.get(e)??0)!==n,a=r.workspace??r,o=i?{...a}:a;i&&delete o.status;let s=this.workspaces.findIndex(t=>t.id===e);if(s>=0)this.workspaces[s]={...this.workspaces[s],...o};else{let t=this.archivedWorkspaces.findIndex(t=>t.id===e);t>=0?this.archivedWorkspaces[t]={...this.archivedWorkspaces[t],...o}:o?.archivedAt&&this.archivedWorkspaces.unshift(o)}r.tasks&&(this.tasks=r.tasks),`agentLiveness`in r&&this.applyAgentLiveness(e,r.agentLiveness)}catch(e){console.error(`[workspace store] fetchWorkspaceDetails failed:`,e)}},applyAgentLiveness(e,t){if(this.agentLivenessLoaded={...this.agentLivenessLoaded,[e]:!0},t){this.agentLiveness={...this.agentLiveness,[e]:t};return}if(e in this.agentLiveness){let t={...this.agentLiveness};delete t[e],this.agentLiveness=t}},async createWorkspace(e){try{let t=await fetch(`/api/workspaces`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>({}));throw new qi(typeof e.error==`string`?e.error:`HTTP ${t.status}`,typeof e.step==`string`?e.step:void 0)}let n=t.headers.get(`X-Kobo-Branch-Adjusted`)===`1`,r=t.headers.get(`X-Kobo-Source-Fallback`)===`local`,i=await t.json(),a=i.workspace??i,o=this.workspaces.findIndex(e=>e.id===a.id);return o>=0?this.workspaces[o]=a:this.workspaces.push(a),e.autoLoop&&this.fetchAutoLoopStates(),a._branchAdjusted=n,a._sourceFallback=r,a}catch(e){throw console.error(`[workspace store] createWorkspace failed:`,e),e}},async startWorkspace(e,t,n,r){try{await q(`/api/workspaces/${e}/start`,{method:`POST`,body:{prompt:t,agentSessionId:n,resume:r}}),await this.fetchWorkspaces()}catch(e){throw console.error(`[workspace store] startWorkspace failed:`,e),e}},async previewEngineHandoff(e,t){let n=await fetch(`/api/workspaces/${e}/engine-handoff-preview`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({engine:t})}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error??`HTTP ${n.status}`);return r.handoff},async switchEngine(e,t){let n=await fetch(`/api/workspaces/${e}/switch-engine`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error??`HTTP ${n.status}`);let i=r.workspace,a=this.workspaces.findIndex(t=>t.id===e);return a>=0&&(this.workspaces[a]=i),await this.fetchSessions(e,r.sessionId),{sessionId:r.sessionId}},async stopWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/stop`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);await this.fetchWorkspaces()}catch(e){throw console.error(`[workspace store] stopWorkspace failed:`,e),e}},async interruptAgent(e,t={}){try{let n=await fetch(`/api/workspaces/${e}/interrupt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>void 0),t=typeof e==`object`&&e&&!Array.isArray(e)?e:void 0,r=typeof t?.error==`string`?t.error:`HTTP ${n.status}`,i=t?.code;throw new qi(r,n.status===409&&(i===`no_agent_running`||i===`session_not_active`)||n.status===500&&i===`interrupt_failed`?i:void 0)}}catch(e){throw console.error(`[workspace store] interruptAgent failed:`,e),e}},async deleteWorkspace(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t??{})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=[];if(n.status===200){let e=await n.json().catch(()=>({}));r=Array.isArray(e.warnings)?e.warnings:[]}return this.workspaces=this.workspaces.filter(t=>t.id!==e),this.archivedWorkspaces=this.archivedWorkspaces.filter(t=>t.id!==e),this.clearWorkspaceLocalState(e),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]),{warnings:r}}catch(e){throw console.error(`[workspace store] deleteWorkspace failed:`,e),e}},async deleteAllArchived(e){try{let t=this.archivedWorkspaces.map(e=>e.id),n=await fetch(`/api/workspaces/archived`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e??{})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json().catch(()=>({})),i=typeof r.deleted==`number`?r.deleted:0,a=Array.isArray(r.warnings)?r.warnings:[];this.archivedWorkspaces=[];for(let e of t)this.clearWorkspaceLocalState(e),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]);return{deleted:i,warnings:a,ids:t}}catch(e){throw console.error(`[workspace store] deleteAllArchived failed:`,e),e}},async updateModel(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({model:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updateModel failed:`,e),e}},async updateWorkspaceDescription(e,t){let n=this.workspaces.findIndex(t=>t.id===e);if(n<0)throw Error(`Workspace '${e}' not found in store`);let r=this.workspaces[n].description;this.workspaces[n]={...this.workspaces[n],description:t};try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({description:t})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json();this.workspaces=this.workspaces.map(t=>t.id===e?{...t,...r}:t)}catch(n){let i=this.workspaces.findIndex(t=>t.id===e);throw i>=0&&this.workspaces[i].description===t&&(this.workspaces[i]={...this.workspaces[i],description:r}),n}},async updateReasoningEffort(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({reasoningEffort:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updateReasoningEffort failed:`,e),e}},async renameWorkspaceBranch(e,t){let n=await fetch(`/api/workspaces/${e}/rename-branch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({newName:t})}),r=await n.json().catch(()=>null);if(!n.ok)throw new qi(r?.error??`Rename failed`,r?.code);let i=r,a=this.workspaces.findIndex(t=>t.id===e);return a>=0&&(this.workspaces[a]=i),i},async resyncWorkspaceBranch(e){let t=await fetch(`/api/workspaces/${e}/resync-branch`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();if(n.changed){let t=this.workspaces.findIndex(t=>t.id===e);t>=0&&(this.workspaces[t]={...this.workspaces[t],workingBranch:n.workingBranch})}return n},async updateAgentPermissionMode(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({agentPermissionMode:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updateAgentPermissionMode failed:`,e),e}},async pushBranch(e,t={}){let n=await fetch(`/api/workspaces/${e}/push`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({force:t.force===!0})});if(!n.ok){let e=await n.json().catch(()=>({error:`Push failed`}));throw new qi(e.error??`Push failed`,e.code)}},async fetchGitStats(e,t={}){let n=await q(`/api/workspaces/${e}/git-stats${t.freshFetch?`?freshFetch=1`:``}`,{signal:t.signal,timeoutMs:6e4});return this.gitStatsCache[e]=n,n},async fetchBranchDivergence(e,t={}){let n=`/api/workspaces/${e}/branch-divergence?limit=${t.limit??50}`,r=await fetch(n,{signal:t.signal});if(!r.ok)throw Error(`HTTP ${r.status}`);return await r.json()},async openPullRequest(e){let t=await fetch(`/api/workspaces/${e}/open-pr`,{method:`POST`}),n=await t.json().catch(()=>null);if(!t.ok)throw new qi(n?.error??`Open PR failed`,n?.code);return n},async archiveWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/archive`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();return this.workspaces=this.workspaces.filter(t=>t.id!==e),this.archivedLoaded&&this.archivedWorkspaces.unshift(n),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]),n}catch(e){throw console.error(`[workspace store] archiveWorkspace failed:`,e),e}},async unarchiveWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/unarchive`,{method:`POST`});if(!t.ok){if(t.status===409){let e=await t.json().catch(()=>({})),n=Error(e.error??`worktree-purged`);throw n.code=`worktree-purged`,n}throw Error(`HTTP ${t.status}`)}let n=await t.json();return this.archivedWorkspaces=this.archivedWorkspaces.filter(t=>t.id!==e),this.workspaces.unshift(n),n}catch(e){throw console.error(`[workspace store] unarchiveWorkspace failed:`,e),e}},async createTask(e,t,n){try{let r=await fetch(`/api/workspaces/${e}/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:t,isAcceptanceCriterion:n})});if(!r.ok)throw Error(`HTTP ${r.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] createTask failed:`,e),e}},async updateTaskTitle(e,t,n){try{let r=await fetch(`/api/workspaces/${e}/tasks/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:n})});if(!r.ok)throw Error(`HTTP ${r.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] updateTaskTitle failed:`,e),e}},async deleteTask(e,t){try{let n=await fetch(`/api/workspaces/${e}/tasks/${t}`,{method:`DELETE`});if(!n.ok)throw Error(`HTTP ${n.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] deleteTask failed:`,e),e}},selectWorkspace(e){this.selectedWorkspaceId=e,this.selectedSessionId=null,this.sessions=[],this.tasks=[],this.markRead(e),this.fetchWorkspaceDetails(e),this.fetchSessions(e),this.fetchPendingQuotaBackoff(e),this.fetchGitStats(e).catch(()=>{}),this.activityFeeds[e]?.length||ya().subscribe(e)},async fetchSessions(e,t){let n=(na.get(e)??0)+1;na.set(e,n);try{let r=await fetch(`/api/workspaces/${e}/sessions`);if(!r.ok)throw Error(`HTTP ${r.status}`);let i=await r.json();if(this.selectedWorkspaceId!==e||na.get(e)!==n)return;if(this.sessions=i,t&&this.sessions.some(e=>e.id===t)){this.selectSession(t);return}let a=this.selectedSessionId&&this.sessions.some(e=>e.id===this.selectedSessionId);if(this.sessions.length>0&&!a){let t=localStorage.getItem(`kobo:session:${e}`),n=t?this.sessions.find(e=>e.id===t):null;this.selectSession(n?n.id:this.sessions[0].id)}}catch(e){console.error(`[workspace store] fetchSessions failed:`,e)}},async fetchOlderEvents(e){if(this.loadingOlderEvents||this.hasMoreEvents[e]===!1)return!1;let t=this.activityFeeds[e];if(!t?.length)return!1;let n=t[0].id;this.loadingOlderEvents=!0;try{let t=await fetch(`/api/workspaces/${e}/events?before=${encodeURIComponent(n)}&limit=100`);if(!t.ok)throw Error(`HTTP ${t.status}`);let r=await t.json();if(this.hasMoreEvents[e]=r.hasMore,r.events.length>0){let e=ya();for(let t of r.events)e._routeMessage(t)}return r.events.length>0}catch(e){return console.error(`[workspace store] fetchOlderEvents failed:`,e),!1}finally{this.loadingOlderEvents=!1}},selectSession(e){this.selectedSessionId=e,this.selectedWorkspaceId&&localStorage.setItem(`kobo:session:${this.selectedWorkspaceId}`,e)},async createSession(e){try{let t=await fetch(`/api/workspaces/${e}/sessions`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}let n=await t.json();return this.sessions.unshift(n),this.selectSession(n.id),n}catch(e){throw console.error(`[workspace store] createSession failed:`,e),e}},async renameWorkspace(e,t){let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]={...this.workspaces[i],...r});let a=this.archivedWorkspaces.findIndex(t=>t.id===e);a>=0&&(this.archivedWorkspaces[a]={...this.archivedWorkspaces[a],...r})},async renameSession(e,t,n){let r=await fetch(`/api/workspaces/${e}/sessions/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:n})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`HTTP ${r.status}`)}let i=await r.json().catch(()=>null),a=this.sessions.find(e=>e.id===t);a&&(a.name=i?.name??n)},async deleteSession(e,t){let n=await fetch(`/api/workspaces/${e}/sessions/${t}`,{method:`DELETE`}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error??`HTTP ${n.status}`);let i=this.selectedSessionId===t,a=r.workspace;if(a){let t=this.workspaces.findIndex(t=>t.id===e);t>=0&&(this.workspaces[t]=a)}await this.fetchSessions(e),i&&this.selectedWorkspaceId===e&&this.selectSession(this.sessions[0]?.id??null)},addActivityItem(e,t){if(this.activityFeeds[e]||(this.activityFeeds[e]=[]),this.activityFeedIds[e]||(this.activityFeedIds[e]=new Set),this.activityCounts[e]||(this.activityCounts[e]={toolUses:0,agentMessages:0,userMessages:0,errors:0}),t.meta?.sender!==`user`&&t.meta?.sender!==`system-prompt`)for(let t of this.activityFeeds[e])t.meta?.pending&&(t.meta.pending=!1);if(!this.activityFeedIds[e].has(t.id)){this.activityFeedIds[e].add(t.id),this.activityFeeds[e].push(t);let n=this.activityCounts[e];t.type===`tool_use`?n.toolUses++:t.type===`error`&&n.errors++,t.meta?.sender===`user`?n.userMessages++:t.type===`text`&&t.meta?.sender!==`system-prompt`&&n.agentMessages++}let n=this.activityFeeds[e];if(n.length>Yi){let t=n.splice(0,n.length-Yi),r=this.activityFeedIds[e];for(let e of t)r.delete(e.id)}},removeActivityItem(e,t){let n=this.activityFeeds[e],r=this.activityFeedIds[e];if(!n||!r)return;let i=n.findIndex(e=>e.id===t);if(i<0)return;let[a]=n.splice(i,1);r.delete(t);let o=this.activityCounts[e];o&&a&&(a.type===`tool_use`?o.toolUses=Math.max(0,o.toolUses-1):a.type===`error`&&(o.errors=Math.max(0,o.errors-1)),a.meta?.sender===`user`?o.userMessages=Math.max(0,o.userMessages-1):a.type===`text`&&a.meta?.sender!==`system-prompt`&&(o.agentMessages=Math.max(0,o.agentMessages-1)))},clearActivityFeed(e){e?(delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e]):(this.activityFeeds={},this.activityFeedIds={},this.activityCounts={})},applyUsageSnapshot(e){this.providerUsage[e.providerId]=e.snapshot},async requestUsageRefresh(e){try{await fetch(`/api/usage/${e}/refresh`,{method:`POST`})}catch(e){console.error(`[workspace store] requestUsageRefresh failed:`,e)}},triggerGitRefresh(){this.gitRefreshTrigger++,this.schedulePrSnapshotsRefresh()},schedulePrSnapshotsRefresh(){Zi!==null&&clearTimeout(Zi),Zi=setTimeout(()=>{Zi=null,this.fetchPrSnapshots()},Xi)},async fetchPrSnapshots(){let e=++$i,t=new Map(ta);try{let n=await fetch(`/api/workspaces/pr-states`,{cache:`no-store`});if(!n.ok)return;let r=await n.json();if(e!==$i)return;this.prSnapshots=aa(r,this.prSnapshots,t)}catch(e){console.error(`[workspace-store] fetchPrSnapshots failed:`,e)}},async fetchWorkspacesInfo(){let e=++Qi,t=new Map(ea),n=new Map(ta);try{let r=await q(`/api/workspaces/info`,{cache:`no-store`});if(this.listPollFailureStreak=0,this.activeListLoadFailed=!1,this.listLoadError=null,e!==Qi)return;this.agentLiveness=r.agentLiveness??{};let i={...this.agentLivenessLoaded};for(let e of r.workspaces)i[e.id]=!0;this.agentLivenessLoaded=i;let a=new Map(this.workspaces.map(e=>[e.id,e]));this.workspaces=r.workspaces.map(e=>{let n=a.get(e.id),r=(ea.get(e.id)??0)!==(t.get(e.id)??0);return n&&r?{...e,...n}:e});for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id);this.prSnapshots=aa(r.prSnapshots,this.prSnapshots,n);let o={...this.gitStatsCache};for(let[e,t]of Object.entries(r.gitStats)){let n=o[e];(!n||(t.computedAt??0)>=(n.computedAt??0))&&(o[e]=t)}this.gitStatsCache=o}catch(e){console.error(`[workspace-store] fetchWorkspacesInfo failed:`,e),this.listPollFailureStreak+=1,this.listPollFailureStreak>=2&&(this.activeListLoadFailed=!0,this.listLoadError=e instanceof Error?e.message:String(e))}},async refreshPrSnapshot(e){try{let t=await fetch(`/api/workspaces/pr-snapshot/refresh/${e}`,{method:`POST`});if(t.status===404){let t={...this.prSnapshots};return delete t[e],this.prSnapshots=t,ia(e),null}if(!t.ok)return console.error(`[workspace-store] refreshPrSnapshot non-OK:`,t.status),null;let n=await t.json();return this.prSnapshots={...this.prSnapshots,[e]:n.snapshot},ia(e),n.snapshot}catch(e){return console.error(`[workspace-store] refreshPrSnapshot failed:`,e),null}},async fetchAutoLoopStates(){try{let e=await fetch(`/api/workspaces/auto-loop-states`,{cache:`no-store`});if(!e.ok)return;let t=await e.json();this.autoLoopStates=t}catch(e){console.error(`[workspace-store] fetchAutoLoopStates failed:`,e)}},async enableAutoLoop(e){let t=this.workspaces.find(t=>t.id===e);if(t&&t.agentPermissionMode===`plan`)try{await this.updateAgentPermissionMode(e,`bypass`)}catch{}let n=await fetch(`/api/workspaces/${e}/auto-loop`,{method:`POST`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}await this.fetchAutoLoopStates()},async disableAutoLoop(e){let t=await fetch(`/api/workspaces/${e}/auto-loop`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}await this.fetchAutoLoopStates()},async forceAutoLoopReady(e){let t=await fetch(`/api/workspaces/${e}/auto-loop-ready`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);await this.fetchAutoLoopStates()},setAutoLoopState(e,t){this.autoLoopStates[e]=t},clearAutoLoopState(e){delete this.autoLoopStates[e]},async fetchCrons(e){try{let t=await fetch(`/api/workspaces/${e}/crons`);if(!t.ok)return;let n=await t.json();this.crons[e]=n.crons}catch(e){console.error(`[workspace-store] fetchCrons failed:`,e)}},async cancelCron(e,t){let n=this.crons[e]??[];this.crons[e]=n.filter(e=>e.id!==t);try{let n=await fetch(`/api/workspaces/${e}/crons/${t}`,{method:`DELETE`});if(!n.ok)throw Error(`HTTP ${n.status}`)}catch(t){throw this.crons[e]=n,t}},async createCron(e,t){let n=await fetch(`/api/workspaces/${e}/crons`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}await this.fetchCrons(e)},async scheduleManualWakeup(e,t){let n=await fetch(`/api/workspaces/${e}/pending-wakeup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json();r.pending&&(this.pendingWakeups[e]=r.pending)},async fetchPendingWakeup(e){try{let t=await fetch(`/api/workspaces/${e}/pending-wakeup`,{cache:`no-store`});if(!t.ok)return;let n=await t.json();n?this.pendingWakeups[e]=n:delete this.pendingWakeups[e]}catch(e){console.error(`[workspace-store] fetchPendingWakeup failed:`,e)}},setPendingWakeup(e,t){this.pendingWakeups[e]=t},clearPendingWakeup(e){delete this.pendingWakeups[e]},async cancelPendingWakeup(e){let t=this.pendingWakeups[e]!==void 0;delete this.pendingWakeups[e];try{let t=await fetch(`/api/workspaces/${e}/pending-wakeup`,{method:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`)}catch(n){console.error(`[workspace-store] cancelPendingWakeup failed:`,n),t&&await this.fetchPendingWakeup(e)}},async fetchPendingQuotaBackoff(e){try{let t=await fetch(`/api/workspaces/${e}/quota-backoff`,{cache:`no-store`});if(!t.ok)return;let n=await t.json();n?this.pendingQuotaBackoffs[e]=n:delete this.pendingQuotaBackoffs[e]}catch(e){console.error(`[workspace-store] fetchPendingQuotaBackoff failed:`,e)}},setPendingQuotaBackoff(e,t){this.pendingQuotaBackoffs[e]=t},clearPendingQuotaBackoff(e){delete this.pendingQuotaBackoffs[e]},async cancelQuotaBackoff(e){let t=this.pendingQuotaBackoffs[e]!==void 0;delete this.pendingQuotaBackoffs[e];try{let t=await fetch(`/api/workspaces/${e}/quota-backoff`,{method:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`)}catch(n){console.error(`[workspace-store] cancelQuotaBackoff failed:`,n),t&&await this.fetchPendingQuotaBackoff(e)}},async resumeQuotaBackoffNow(e){await this.startWorkspace(e)},enqueuePending(e,t){let n=this.pendingQueue[e]??[];n.some(e=>e.toolCallId===t.toolCallId)||(n.push(t),this.pendingQueue[e]=n,t.kind===`question`&&(this.pendingDeferred[e]={toolCallId:t.toolCallId,toolName:t.toolName,input:t.input,agentSessionId:t.agentSessionId}))},peekPending(e){return this.pendingQueue[e]?.[0]},dequeuePending(e){let t=this.pendingQueue[e];if(!t||t.length===0)return;let n=t.shift();t.length===0&&delete this.pendingQueue[e];let r=this.pendingQueue[e]?.[0];return r&&r.kind===`question`?this.pendingDeferred[e]={toolCallId:r.toolCallId,toolName:r.toolName,input:r.input,agentSessionId:r.agentSessionId}:delete this.pendingDeferred[e],n},clearPendingForSession(e,t){if(t===null)return;let n=this.pendingQueue[e];if(!n)return;let r=n.filter(e=>e.agentSessionId!==t);r.length===0?delete this.pendingQueue[e]:this.pendingQueue[e]=r;let i=this.pendingDeferred[e];i&&i.agentSessionId===t&&delete this.pendingDeferred[e]},clearAllPending(e){delete this.pendingQueue[e],delete this.pendingDeferred[e]},setPendingDeferred(e,t){this.enqueuePending(e,{kind:`question`,agentSessionId:t.agentSessionId,toolCallId:t.toolCallId,toolName:t.toolName,input:t.input})},clearPendingDeferred(e,t=null){if(t===null){this.clearAllPending(e);return}this.clearPendingForSession(e,t)},getPendingDeferred(e){let t=this.peekPending(e);if(t?.kind===`question`)return{toolCallId:t.toolCallId,toolName:t.toolName,input:t.input,agentSessionId:t.agentSessionId}},async submitDeferredAnswer(e,t,n,r,i){let a=await fetch(`/api/workspaces/${e}/deferred-tool-use/answer`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({answers:t,toolCallId:n,awaitingFreeForm:r,response:i})});if(!a.ok){let t=(await a.json().catch(()=>({}))).error??`HTTP ${a.status}`;if(/no deferred tool use pending|no agent running|no active engine process|no pending callback/i.test(t)){console.warn(`[workspace] submitDeferredAnswer: deferred callback expired — clearing zombie panel locally`),this.dequeuePending(e),this.fetchWorkspaces();return}throw Error(t)}this.dequeuePending(e),this.fetchWorkspaces()},async cancelDeferredAnswer(e,t,n){let r=await fetch(`/api/workspaces/${e}/deferred-tool-use/cancel`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({reason:t,toolCallId:n})});if(!r.ok){let t=(await r.json().catch(()=>({}))).error??`HTTP ${r.status}`;if(/no deferred tool use pending/i.test(t)){console.warn(`[workspace] cancelDeferredAnswer: backend has no pending — clearing zombie panel locally`),this.dequeuePending(e),this.fetchWorkspaces();return}throw Error(t)}this.dequeuePending(e),this.fetchWorkspaces()},async submitDeferredPermission(e,t,n,r,i=`once`){let a=await fetch(`/api/workspaces/${e}/deferred-permission/decision`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({toolCallId:t,decision:n,reason:r,scope:i})});if(!a.ok){let e=await a.json().catch(()=>({}));throw Error(e.error??`HTTP ${a.status}`)}this.dequeuePending(e),this.fetchWorkspaces()},updateAgentTodos(e,t){this.agentTodos[e]=t},agentTaskCreate(e,t,n){let r=this.agentTodos[e]?[...this.agentTodos[e]]:[];r.some(e=>e.id===t)||(r.push({id:t,content:n.subject||n.description||``,status:`pending`,activeForm:n.activeForm}),this.agentTodos[e]=r)},agentTaskSetNumber(e,t,n){let r=this.agentTodos[e];r&&(this.agentTodos[e]=r.map(e=>e.id===t?{...e,taskNumber:n}:e))},agentTaskUpdate(e,t,n){let r=this.agentTodos[e];if(r){if(n.status===`deleted`){this.agentTodos[e]=r.filter(e=>e.taskNumber!==t);return}this.agentTodos[e]=r.map(e=>e.taskNumber===t?{...e,status:n.status?Ji(n.status):e.status,content:n.content??e.content,activeForm:n.activeForm??e.activeForm}:e)}},finalizeRunningSubagents(e){let t=this.subagents[e];if(!t)return;let n=new Date().toISOString();for(let e of Object.keys(t)){let r=t[e];r.status===`running`&&(t[e]={...r,status:`done`,updatedAt:n})}},upsertSubagent(e,t){this.subagents[e]||(this.subagents[e]={});let n=this.subagents[e][t.toolUseId],r=new Date().toISOString(),i=n?.status===`done`?`done`:t.status??n?.status??`running`;this.subagents[e][t.toolUseId]={toolUseId:t.toolUseId,description:t.description??n?.description??``,taskType:t.taskType??n?.taskType,status:i,lastToolName:t.lastToolName??n?.lastToolName,lastDescription:t.lastDescription??n?.lastDescription,totalTokens:t.totalTokens??n?.totalTokens,toolUses:t.toolUses??n?.toolUses,durationMs:t.durationMs??n?.durationMs,startedAt:n?.startedAt??r,updatedAt:r}},async markRead(e){try{let t=await fetch(`/api/workspaces/${e}/mark-read`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=this.workspaces.findIndex(t=>t.id===e);n>=0&&(this.workspaces[n]={...this.workspaces[n],hasUnread:!1})}catch(e){console.error(`[workspace store] markRead failed:`,e)}},async purgeWorktree(e){try{let t=await fetch(`/api/workspaces/${e}/purge-worktree`,{method:`POST`}),n=await t.json();if(!t.ok)return{ok:!1,error:n.error??`HTTP ${t.status}`};let r=n.workspace;return r&&(this.updateWorkspaceFromEvent(e,{archivedAt:r.archivedAt,worktreePurgedAt:r.worktreePurgedAt,worktreePurgeRestoreData:r.worktreePurgeRestoreData}),r.archivedAt&&this.archivedLoaded&&(this.archivedWorkspaces.some(t=>t.id===e)||this.archivedWorkspaces.unshift(r),this.workspaces=this.workspaces.filter(t=>t.id!==e),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]))),{ok:!0,warnings:n.warnings??[]}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},async dismissPrAttention(e,t){let n=this.prSnapshots[e];if(n)try{let r=await fetch(`/api/workspaces/${e}/dismiss-pr-attention`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({kind:t,prUpdatedAt:n.updatedAt})});if(!r.ok)throw Error(`HTTP ${r.status}`);let i=t===`changes-requested`?{prChangesDismissedAt:n.updatedAt}:{prCiFailureDismissedAt:n.updatedAt};this.updateWorkspaceFromEvent(e,i)}catch(e){console.error(`[workspace store] dismissPrAttention failed:`,e)}},async restorePrAttention(e,t){try{let n=await fetch(`/api/workspaces/${e}/restore-pr-attention`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({kind:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=t===`changes-requested`?{prChangesDismissedAt:null}:{prCiFailureDismissedAt:null};this.updateWorkspaceFromEvent(e,r)}catch(e){console.error(`[workspace store] restorePrAttention failed:`,e)}},queuedMessageKey(e,t){return`${e}:${t}`},getQueuedMessage(e,t){return t?this.queuedMessages[this.queuedMessageKey(e,t)]:void 0},queueMessage(e,t,n){this.queuedMessages[this.queuedMessageKey(e,n)]={content:t,sessionId:n}},cancelQueuedMessage(e,t){t&&delete this.queuedMessages[this.queuedMessageKey(e,t)]},flushQueuedMessage(e,t){let n=this.getQueuedMessage(e,t);n&&(this.cancelQueuedMessage(e,t),ya().sendChatMessage(e,n.content,t))},setActiveAgentSession(e,t){this.activeAgentSessionIds[e]=t,delete this.settledAgentSessionIds[e]},markAgentTurnSettled(e,t){this.activeAgentSessionIds[e]===t&&(this.settledAgentSessionIds[e]=t)},isAgentTurnSettled(e){let t=this.activeAgentSessionIds[e];return t!==void 0&&this.settledAgentSessionIds[e]===t},clearActiveAgentSession(e,t){this.activeAgentSessionIds[e]===t&&(delete this.activeAgentSessionIds[e],delete this.settledAgentSessionIds[e])},clearActiveAgentSessionOwner(e){delete this.activeAgentSessionIds[e],delete this.settledAgentSessionIds[e]},updateWorkspaceFromEvent(e,t){ea.set(e,(ea.get(e)??0)+1);let n=this.workspaces.findIndex(t=>t.id===e);if(n>=0&&(this.workspaces[n]={...this.workspaces[n],...t}),t.status!==void 0){if(e in this.agentLivenessLoaded){let t={...this.agentLivenessLoaded};delete t[e],this.agentLivenessLoaded=t}e===this.selectedWorkspaceId&&this.fetchWorkspaceDetails(e)}if(t.status&&[`completed`,`idle`,`error`,`quota`].includes(t.status)){let t=this.activityFeeds[e];if(t)for(let e of t)e.meta?.pending&&(e.meta.pending=!1);let n=this.subagents[e];if(n)for(let[e,t]of Object.entries(n))t.status===`running`&&(n[e]={...t,status:`done`})}}}}),Y=Br.global.t,sa={"pr:ci-failed":{soundKey:`audioPrCiFailedSound`,enabledKey:`audioPrCiFailedEnabled`,volumeKey:`audioPrCiFailedVolume`},"pr:ci-recovered":{soundKey:`audioPrCiRecoveredSound`,enabledKey:`audioPrCiRecoveredEnabled`,volumeKey:`audioPrCiRecoveredVolume`},"pr:changes-requested":{soundKey:`audioPrChangesRequestedSound`,enabledKey:`audioPrChangesRequestedEnabled`,volumeKey:`audioPrChangesRequestedVolume`},"pr:approved":{soundKey:`audioPrApprovedSound`,enabledKey:`audioPrApprovedEnabled`,volumeKey:`audioPrApprovedVolume`},"pr:merge-conflict":{soundKey:`audioPrMergeConflictSound`,enabledKey:`audioPrMergeConflictEnabled`,volumeKey:`audioPrMergeConflictVolume`},"pr:ready-to-merge":{soundKey:`audioPrReadyToMergeSound`,enabledKey:`audioPrReadyToMergeEnabled`,volumeKey:`audioPrReadyToMergeVolume`},"pr:merged":{soundKey:`audioPrMergedSound`,enabledKey:`audioPrMergedEnabled`,volumeKey:`audioPrMergedVolume`}};function ca(e,t,n){let r=Ci().global,i=sa[n];Fi(e,void 0,t,ii(r[i.soundKey]),Number(r[i.volumeKey]),!!r[i.enabledKey])}function la(e,t){let n=[];return t&&n.push({label:Y(`pr.openPr`),color:`white`,noDismiss:!0,handler:()=>window.open(t,`_blank`)}),n.push({label:Y(`pr.openWorkspace`),color:`white`,noDismiss:!0,handler:()=>{window.location.hash=`#/workspace/${e}`}}),n.push({label:Y(`pr.dismiss`),color:`white`}),n}var X=null,ua=null,da=0,fa=!1,pa=!1,ma=!1;function ha(e){ma=e}function ga(e,t,n){if(t.kind!==`session:started`)return;let r=J();if(n){r.setActiveAgentSession(e,n);let t=r.peekPending(e);t&&t.agentSessionId===n&&r.dequeuePending(e)}let i=r.workspaces.find(t=>t.id===e);i&&(i.status===`completed`||i.status===`idle`||i.status===`error`||i.status===`quota`)&&r.updateWorkspaceFromEvent(e,{status:`executing`}),!ma&&n&&r.selectedWorkspaceId===e&&r.selectedSessionId!==n&&r.fetchSessions(e,n).catch(e=>{console.error(`[websocket] fetchSessions on session:started failed:`,e)})}function _a(e,t){let n=J();if(t.kind===`tool:call`&&t.name===`TodoWrite`){let r=t.input?.todos;return Array.isArray(r)&&n.updateAgentTodos(e,r.map(e=>({content:typeof e.content==`string`?e.content:``,status:typeof e.status==`string`?e.status:`pending`,activeForm:typeof e.activeForm==`string`?e.activeForm:void 0}))),!0}if(t.kind===`tool:call`&&t.name===`TaskCreate`){let r=t.input??{};return n.agentTaskCreate(e,t.toolCallId,{subject:typeof r.subject==`string`?r.subject:void 0,description:typeof r.description==`string`?r.description:void 0,activeForm:typeof r.activeForm==`string`?r.activeForm:void 0}),!0}if(t.kind===`tool:result`&&typeof t.output==`string`){let r=t.output.match(/^Task #(\d+) created successfully/);if(r)return n.agentTaskSetNumber(e,t.toolCallId,Number(r[1])),!0}if(t.kind===`tool:call`&&t.name===`TaskUpdate`){let r=t.input??{},i=r.task_id??r.taskId??r.id,a=typeof i==`number`?i:typeof i==`string`?Number(i):NaN;return Number.isFinite(a)&&n.agentTaskUpdate(e,a,{status:typeof r.status==`string`?r.status:void 0,content:typeof r.subject==`string`?r.subject:void 0,activeForm:typeof r.activeForm==`string`?r.activeForm:void 0}),!0}return!1}function va(e,t,n,r,i){let a=Ur();if(t.kind===`session:compacting`){a.setCompacting(e,t.active);return}a.append(e,t,n,r,i),(t.kind===`session:compacted`||t.kind===`message:text`||t.kind===`tool:call`)&&a.setCompacting(e,!1),ga(e,t,i??void 0);let o=J();if(t.kind===`session:user-input-requested`){if(t.requestKind===`question`?o.enqueuePending(e,{kind:`question`,agentSessionId:i??null,toolCallId:t.toolCallId,toolName:t.toolName,input:t.payload}):o.enqueuePending(e,{kind:`permission`,agentSessionId:i??null,toolCallId:t.toolCallId,toolName:t.toolName,toolInput:t.payload}),o.updateWorkspaceFromEvent(e,{status:`awaiting-user`}),!ma){let n=o.workspaces.find(t=>t.id===e)?.name??``,r=t.requestKind===`question`?Y(`notification.agentQuestion`,{name:n}):Y(`notification.agentPermissionRequest`,{name:n}),i=Ci().global;Fi(r,void 0,e,t.requestKind===`question`?i.audioQuestionSound:void 0,t.requestKind===`question`?i.audioQuestionVolume:void 0,i.audioQuestionNotifications)}return}if(t.kind===`subagent:progress`){o.upsertSubagent(e,{toolUseId:t.toolCallId,status:t.status,description:t.description,taskType:t.taskType,lastToolName:t.lastToolName,totalTokens:t.totalTokens,toolUses:t.toolUses,durationMs:t.durationMs});return}if(!_a(e,t)){if(t.kind===`tool:call`&&t.name===`Bash`){let n=t.input,r=`${n?.command??``} ${n?.description??``}`;/\bgit\b|commit|push|pull|merge|rebase|checkout|branch/i.test(r)&&o.triggerGitRefresh(),/\bgit\s+branch\s+-m\b/i.test(r)&&setTimeout(()=>{o.resyncWorkspaceBranch(e).catch(e=>{console.error(`[websocket] Branch resync failed:`,e)})},2500),/\bgh\s+pr\s+create\b/i.test(r)&&setTimeout(()=>o.triggerGitRefresh(),3e3)}if(t.kind===`tool:call`&&t.name===`ExitPlanMode`&&o.workspaces.find(t=>t.id===e)?.agentPermissionMode===`plan`&&(o.updateWorkspaceFromEvent(e,{agentPermissionMode:`bypass`}),o.updateAgentPermissionMode(e,`bypass`).catch(e=>{console.error(`[websocket] failed to persist ExitPlanMode flip:`,e)})),t.kind!==`session:started`){if(t.kind===`turn:completed`){i&&o.markAgentTurnSettled(e,i);return}if(t.kind===`session:ended`){i&&o.clearPendingForSession(e,i);let n=o.activeAgentSessionIds[e];if(t.superseded===!0||typeof i==`string`&&i.length>0&&n!==void 0&&i!==n){o.cancelQueuedMessage(e,i),i&&o.clearActiveAgentSession(e,i);return}a.setCompacting(e,!1),i?o.clearActiveAgentSession(e,i):o.clearActiveAgentSessionOwner(e);let r=o.workspaces.find(t=>t.id===e)?.status===`quota`?`quota`:t.reason===`completed`?`completed`:t.reason===`error`?`error`:`idle`;o.updateWorkspaceFromEvent(e,{status:r}),i&&t.reason===`completed`&&o.flushQueuedMessage(e,i),o.finalizeRunningSubagents(e),o.fetchWorkspaces(),!ma&&t.reason!==`killed`&&t.reason!==`error`&&o.autoLoopStates[e]?.auto_loop!==!0&&Fi(Y(`notification.agentFinished`,{name:o.workspaces.find(t=>t.id===e)?.name??``}),void 0,e);return}if(t.kind===`error`&&(t.category===`quota`&&(o.updateWorkspaceFromEvent(e,{status:`quota`}),o.fetchWorkspaces()),!ma)){let t=Ci().global;Fi(Y(`notification.agentError`,{name:o.workspaces.find(t=>t.id===e)?.name??``}),void 0,e,t.audioAgentErrorSound,t.audioAgentErrorVolume,t.audioAgentErrorNotifications)}}}}var ya=Ie(`websocket`,{state:()=>({connected:!1,reconnecting:!1,reconnectAttempt:0,lastEventId:null,_replaying:!1}),actions:{connect(){if(X)return;if(fa=!0,pa||(pa=!0,window.addEventListener(`online`,()=>{fa&&this.connect()}),window.addEventListener(`offline`,()=>{this.connected=!1,this.reconnecting=fa,ua&&=(clearTimeout(ua),null)})),!navigator.onLine){this.connected=!1,this.reconnecting=!0;return}let e=ar(`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/ws`,nr()),t=new WebSocket(e);X=t,t.addEventListener(`open`,()=>{this.connected=!0,this.reconnecting=!1,da=0,this.reconnectAttempt=0;let e=J().workspaces.map(e=>e.id);for(let t of e)this._send({type:`subscribe`,payload:{workspaceId:t}});this.lastEventId&&this._send({type:`sync:request`,payload:{lastEventId:this.lastEventId,workspaceIds:e}})}),t.addEventListener(`message`,e=>{try{let t=JSON.parse(e.data);this._routeMessage(t)}catch{}}),t.addEventListener(`close`,()=>{this.connected=!1,X=null,fa&&this._scheduleReconnect()}),t.addEventListener(`error`,()=>{})},disconnect(){fa=!1,ua&&=(clearTimeout(ua),null),X&&=(X.close(),null),this.connected=!1,this.reconnecting=!1,this.reconnectAttempt=0},subscribe(e){this._send({type:`subscribe`,payload:{workspaceId:e}}),this._send({type:`sync:request`,payload:{workspaceIds:[e]}})},unsubscribe(e){this._send({type:`unsubscribe`,payload:{workspaceId:e}})},subscribeChannel(e){this._send({type:`subscribe`,payload:{workspaceId:e}})},sendChatMessage(e,t,n,r,i=!1){let a=this._send({type:`chat:message`,payload:{workspaceId:e,content:t,sessionId:n,agentPermissionModeOverride:r,force:i}});if(/^\/compact(\s|$)/.test(t.trim())&&Ur().setCompacting(e,!0),!a)return!1;let o=J(),s=o.workspaces.find(t=>t.id===e);return s&&(s.status===`completed`||s.status===`idle`||s.status===`error`||s.status===`quota`)&&o.updateWorkspaceFromEvent(e,{status:`executing`}),!0},_send(e){return X&&X.readyState===WebSocket.OPEN?(X.send(JSON.stringify(e)),!0):!1},isConnected(){return X!==null&&X.readyState===WebSocket.OPEN},_scheduleReconnect(){if(ua)return;if(!fa||!navigator.onLine){this.reconnecting=fa;return}let e=Math.min(1e3*2**da,3e4),t=Math.round(e*(.8+Math.random()*.4));da++,this.reconnecting=!0,this.reconnectAttempt=da,da===4&&nr()&&sr(),ua=setTimeout(()=>{ua=null,this.connect()},t)},_routeMessage(e){let t=J();e.replayable!==!1&&e.id?this.lastEventId=e.id:e.replayable!==!1&&e.eventId&&(this.lastEventId=e.eventId);let n=e.payload??{},r=e.workspaceId??n.workspaceId??``;switch(e.type){case`chat:accepted`:{let e=typeof n.sessionId==`string`?n.sessionId:void 0;r&&e&&t.cancelQueuedMessage(r,e);break}case`chat:rejected`:{let e=typeof n.sessionId==`string`?n.sessionId:void 0,i=typeof n.content==`string`?n.content:void 0,a=typeof n.message==`string`?n.message:Y(`network.login.unreachable`);if(r&&i){let n=(t.activityFeeds[r]??[]).find(e=>e.meta?.sender===`user`&&e.meta?.pending&&e.content===i);n&&t.removeActivityItem(r,n.id),e&&t.queueMessage(r,i,e)}kr.create({type:`negative`,message:a,position:`top`,timeout:6e3});break}case`agent:event`:{if(!r)break;let t=e.createdAt;va(r,n,t,e.id??e.eventId,e.sessionId??null);break}case`agent:progress`:n.tasks&&Array.isArray(n.tasks)&&(t.tasks=n.tasks);break;case`user:message`:if(r&&n.content){let i=n.content,a=n.sender??`user`,o=e.sessionId,s=e.id??e.eventId??`user-${Date.now()}`,c=typeof e.createdAt==`string`?e.createdAt:void 0,l=c??new Date().toISOString(),u=t.activityFeeds[r]??[];if(a===`user`&&u.some(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending)){let e=u.findIndex(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending);e>=0&&(u[e]={...u[e],id:s,sessionId:o,...c?{timestamp:c}:{}})}else t.addActivityItem(r,{id:s,type:`text`,content:i,timestamp:l,sessionId:o,meta:{sender:a}})}break;case`sync:response`:this._replaying=!0,ha(!0);try{let e=n.events??[],t=n.mode===`delta`?`delta`:`snapshot`,r=new Map;for(let t of e)if(t.type!==`sync:response`){if(t.type===`agent:event`&&t.workspaceId){let e=r.get(t.workspaceId)??{events:[],timestamps:[],sessionIds:[],eventIds:[],oldestId:void 0};e.events.push(t.payload),e.timestamps.push(t.createdAt),e.sessionIds.push(t.sessionId??null),e.eventIds.push(t.id??null),e.oldestId||=t.id,r.set(t.workspaceId,e);continue}this._routeMessage(t)}if(r.size>0){let e=Ur();for(let[n,{events:i,timestamps:a,sessionIds:o,eventIds:s,oldestId:c}]of r){let r=t===`delta`?e.merge(n,i,a,{sessionIds:o,eventIds:s}):i.map((e,t)=>t);t===`snapshot`&&e.reset(n,i,a,{oldestId:c,hasMoreOlder:!0,sessionIds:o,eventIds:s}),t===`snapshot`&&J().updateAgentTodos(n,[]);for(let e of r){let t=i[e];if(!t)continue;let r=o[e]??null;if(t.kind===`session:user-input-requested`){t.requestKind===`question`?J().enqueuePending(n,{kind:`question`,agentSessionId:r,toolCallId:t.toolCallId,toolName:t.toolName,input:t.payload}):J().enqueuePending(n,{kind:`permission`,agentSessionId:r,toolCallId:t.toolCallId,toolName:t.toolName,toolInput:t.payload});continue}if(t.kind===`session:started`){if(r){let e=J();e.setActiveAgentSession(n,r);let t=e.peekPending(n);t&&t.agentSessionId===r&&e.dequeuePending(n)}continue}if(t.kind===`session:ended`){let e=J();r?(e.clearPendingForSession(n,r),e.cancelQueuedMessage(n,r),e.clearActiveAgentSession(n,r)):t.superseded!==!0&&e.clearActiveAgentSessionOwner(n);continue}if(t.kind===`subagent:progress`){J().upsertSubagent(n,{toolUseId:t.toolCallId,status:t.status,description:t.description,taskType:t.taskType,lastToolName:t.lastToolName,totalTokens:t.totalTokens,toolUses:t.toolUses,durationMs:t.durationMs});continue}_a(n,t)}}}let i=e.findLast(e=>e.replayable!==!1&&typeof e.id==`string`);i&&(this.lastEventId=i.id)}finally{this._replaying=!1,ha(!1)}break;case`usage:snapshot`:{let e=n;e.providerId&&e.snapshot&&t.applyUsageSnapshot({providerId:e.providerId,snapshot:e.snapshot});break}case`devserver:status`:{let e=Li();r&&e.updateFromWsEvent(r,n);break}case`task:updated`:r&&t.fetchWorkspaceDetails(r);break;case`setup:output`:t.addActivityItem(r,{id:e.id??`setup-${Date.now()}`,type:`text`,content:e.payload?.text??``,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`setup`}});break;case`setup:complete`:t.addActivityItem(r,{id:e.id??`setup-complete-${Date.now()}`,type:`text`,content:e.payload?.hadOutput===!1?Y(`chat.scriptDone`):Y(`chat.scriptComplete`,{phase:`setup`}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`setup`}});break;case`setup:error`:t.addActivityItem(r,{id:e.id??`setup-error-${Date.now()}`,type:`text`,content:Y(`chat.scriptError`,{phase:`setup`,message:e.payload?.message??Y(`chat.unknownError`)}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`setup`}});break;case`cleanup:output`:t.addActivityItem(r,{id:e.id??`cleanup-${Date.now()}`,type:`text`,content:e.payload?.text??``,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`cleanup`}});break;case`cleanup:complete`:t.addActivityItem(r,{id:e.id??`cleanup-complete-${Date.now()}`,type:`text`,content:e.payload?.hadOutput===!1?Y(`chat.scriptDone`):Y(`chat.scriptComplete`,{phase:`cleanup`}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`cleanup`}});break;case`cleanup:error`:t.addActivityItem(r,{id:e.id??`cleanup-error-${Date.now()}`,type:`text`,content:Y(`chat.scriptError`,{phase:`cleanup`,message:e.payload?.message??Y(`chat.unknownError`)}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`cleanup`}});break;case`archive:output`:t.addActivityItem(r,{id:e.id??`archive-${Date.now()}`,type:`text`,content:e.payload?.text??``,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`archive`}});break;case`archive:complete`:t.addActivityItem(r,{id:e.id??`archive-complete-${Date.now()}`,type:`text`,content:e.payload?.hadOutput===!1?Y(`chat.scriptDone`):Y(`chat.scriptComplete`,{phase:`archive`}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`archive`}});break;case`archive:error`:t.addActivityItem(r,{id:e.id??`archive-error-${Date.now()}`,type:`text`,content:Y(`chat.scriptError`,{phase:`archive`,message:e.payload?.message??Y(`chat.unknownError`)}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`archive`}});break;case`workspace:unread`:if(r){let e=n.hasUnread??!1;t.updateWorkspaceFromEvent(r,{hasUnread:e})}break;case`workspace:pr-attention-dismissed`:if(r){let e=n.kind,i=n.prUpdatedAt;e&&i&&t.updateWorkspaceFromEvent(r,e===`changes-requested`?{prChangesDismissedAt:i}:{prCiFailureDismissedAt:i})}break;case`workspace:description-updated`:{if(!r)break;let e=n.description??null;t.updateWorkspaceFromEvent(r,{description:e});break}case`workspace:agent-description-updated`:{if(!r)break;let e=n.agentDescription??null;t.updateWorkspaceFromEvent(r,{agentDescription:e});break}case`cron:created`:{if(!r)break;let e=n.cron;if(!e)break;let i=t.crons[r]??[];i.some(t=>t.id===e.id)||(t.crons[r]=[...i,e]);let a=t.autoLoopStates[r];a&&(a.crons_count=t.crons[r].length);break}case`cron:fired`:{if(!r)break;let e=n,i=t.crons[r]??[];t.crons[r]=i.map(t=>t.id===e.id?{...t,nextFireAt:e.nextFireAt??t.nextFireAt,lastFiredAt:e.lastFiredAt??new Date().toISOString()}:t);break}case`cron:cancelled`:{if(!r)break;let e=n.id;if(!e)break;t.crons[r]=(t.crons[r]??[]).filter(t=>t.id!==e);let i=t.autoLoopStates[r];i&&(i.crons_count=t.crons[r].length);break}case`cron:updated`:{if(!r)break;let e=n.crons;if(Array.isArray(e)){t.crons[r]=e;let n=t.autoLoopStates[r];n&&(n.crons_count=e.length)}break}case`workspace:archived`:case`workspace:unarchived`:case`workspace:worktree-restored`:case`workspace:worktree-purged`:e.type===`workspace:archived`&&r&&t.selectedWorkspaceId===r&&(t.selectedWorkspaceId=null),t.fetchWorkspaces(),t.archivedLoaded&&t.fetchArchivedWorkspaces();break;case`pr:base-changed`:{if(!r)break;let e=n,i=e.oldBase??``,a=e.newBase??``;t.updateWorkspaceFromEvent(r,{sourceBranch:a}),kr.create({type:`info`,position:`top`,timeout:wi,message:Y(`pr.baseChanged`,{oldBase:i,newBase:a}),actions:la(r,e.prUrl)}),Fi(Y(`pr.baseChanged`,{oldBase:i,newBase:a}),void 0,r);break}case`pr:ci-failed`:case`pr:ci-recovered`:case`pr:merge-conflict`:case`pr:merged`:{if(!r)break;let i=e.type,a=n,o=a.prNumber??0,s={"pr:ci-failed":{key:`toast.prCiFailed`,type:`negative`,timeout:4e3},"pr:ci-recovered":{key:`toast.prCiRecovered`,type:`positive`,timeout:5e3},"pr:merge-conflict":{key:`toast.prMergeConflict`,type:`warning`,timeout:wi},"pr:merged":{key:`toast.prMerged`,type:`positive`,timeout:5e3}}[i],c=Y(s.key,{n:o});kr.create({type:s.type,position:`top`,timeout:s.timeout,message:c,actions:la(r,a.prUrl)}),ca(c,r,i),i!==`pr:merged`&&t.refreshPrSnapshot(r);break}case`pr:changes-requested`:{if(!r)break;let e=n,i=Y(`toast.prChangesRequested`,{n:e.prNumber??0});kr.create({type:`warning`,position:`top`,timeout:wi,message:i,actions:la(r,e.prUrl)}),ca(i,r,`pr:changes-requested`),t.refreshPrSnapshot(r);break}case`pr:approved`:{if(!r)break;let e=n,i=Y(`toast.prApproved`,{n:e.prNumber??0});kr.create({type:`positive`,position:`top`,timeout:5e3,message:i,actions:la(r,e.prUrl)}),ca(i,r,`pr:approved`),t.refreshPrSnapshot(r);break}case`pr:ready-to-merge`:{if(!r)break;let e=n,i=Y(`toast.prReadyToMerge`,{n:e.prNumber??0});kr.create({type:`positive`,position:`top`,timeout:5e3,message:i,actions:la(r,e.prUrl)}),ca(i,r,`pr:ready-to-merge`),t.refreshPrSnapshot(r);break}case`wakeup:scheduled`:if(r){let e=n;typeof e.targetAt==`string`&&t.setPendingWakeup(r,{targetAt:e.targetAt,reason:e.reason})}break;case`wakeup:cancelled`:case`wakeup:fired`:case`wakeup:skipped`:r&&t.clearPendingWakeup(r);break;case`agent:quota-backoff`:{if(!r)break;let e=n;typeof e.targetAt==`string`&&typeof e.source==`string`&&t.setPendingQuotaBackoff(r,{targetAt:e.targetAt,resetsAt:e.resetsAt??null,source:e.source});break}case`agent:quota-backoff-cancelled`:r&&t.clearPendingQuotaBackoff(r);break;case`autoloop:enabled`:case`autoloop:iteration-started`:case`autoloop:ready-flipped`:t.fetchAutoLoopStates();break;case`autoloop:permission-overridden`:r&&Fi(Y(`notification.autoLoopPermissionOverridden`,{name:t.workspaces.find(e=>e.id===r)?.name??``}),void 0,r);break;case`autoloop:disabled`:if(t.fetchAutoLoopStates(),r){let e=n?.reason,i=t.workspaces.find(e=>e.id===r)?.name??``,a=e===`error`?`notification.autoLoopError`:e===`stall`?`notification.autoLoopStalled`:e===`completed`?`notification.autoLoopCompleted`:e===`awaiting-clarification`?`notification.autoLoopAwaitingClarification`:null;a&&Fi(Y(a,{name:i}),void 0,r)}break;case`workspace:create-progress`:{let e=typeof n.step==`string`?n.step:``,r=typeof n.creationId==`string`?n.creationId:``;r&&e&&t.setCreationProgress({creationId:r,step:e,index:typeof n.index==`number`?n.index:0,total:typeof n.total==`number`?n.total:0});break}case`workspace:create-failed`:{let e=typeof n.creationId==`string`?n.creationId:``,r=typeof n.step==`string`?n.step:``;e&&r&&t.setCreationProgress({creationId:e,step:r,index:-1,total:0});break}case`migration:progress`:case`migration:error`:sn().update(n)}}}}),ba=u({__name:`App`,setup(e){let t=ya(),n=fr();return b(()=>{t.connect(),n.fetchTemplates(),Ai()}),v(()=>{t.disconnect()}),(e,t)=>{let n=y(`router-view`);return S(),E(d,null,[D(n),D(mn),D(dr)],64)}}}),xa=e=>e,Sa=xa,Ca=xa,wa=xa(()=>Be()),Ta={true:`inset`,item:`item-inset`,"item-thumbnail":`item-thumbnail-inset`},Ea={xs:2,sm:4,md:8,lg:16,xl:24},Da=B({name:`QSeparator`,props:{...Le,spaced:[Boolean,String],inset:[Boolean,String],vertical:Boolean,color:String,size:String},setup(e){let t=M(),n=Ae(e,t.proxy.$q),r=p(()=>e.vertical?`vertical`:`horizontal`),i=p(()=>` q-separator--${r.value}`),a=p(()=>e.inset?`${i.value}-${Ta[e.inset]}`:``),o=p(()=>`q-separator${i.value}${a.value}`+(e.color===void 0?``:` bg-${e.color}`)+(n.value?` q-separator--dark`:``)),s=p(()=>{let t={};if(e.size!==void 0&&(t[e.vertical?`width`:`height`]=e.size),e.spaced){let n=e.spaced===!0?`${Ea.md}px`:e.spaced in Ea?`${Ea[e.spaced]}px`:e.spaced,r=e.vertical?[`Left`,`Right`]:[`Top`,`Bottom`];t[`margin${r[0]}`]=t[`margin${r[1]}`]=n}return t});return()=>N(`hr`,{class:o.value,style:s.value,"aria-orientation":r.value})}}),Oa=()=>N(`svg`,{key:`svg`,class:`q-radio__bg absolute non-selectable`,viewBox:`0 0 24 24`},[N(`path`,{d:`M12,22a10,10 0 0 1 -10,-10a10,10 0 0 1 10,-10a10,10 0 0 1 10,10a10,10 0 0 1 -10,10m0,-22a12,12 0 0 0 -12,12a12,12 0 0 0 12,12a12,12 0 0 0 12,-12a12,12 0 0 0 -12,-12`}),N(`path`,{class:`q-radio__check`,d:`M12,6a6,6 0 0 0 -6,6a6,6 0 0 0 6,6a6,6 0 0 0 6,-6a6,6 0 0 0 -6,-6`})]);function ka(e){(e.keyCode===13||e.keyCode===32)&&se(e)}var Aa=B({name:`QRadio`,props:{...Le,...L,...Ke,modelValue:{required:!0},val:{required:!0},label:String,leftLabel:Boolean,checkedIcon:String,uncheckedIcon:String,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},emits:[`update:modelValue`],setup(e,{slots:t,emit:r}){let{proxy:a}=M(),o=Ae(e,a.$q),s=ie(e,Xe),c=i(null),{refocusTargetEl:l,refocusTarget:u}=Ye(e,c),d=p(()=>n(e.modelValue)===n(e.val)),f=p(()=>`q-radio cursor-pointer no-outline row inline no-wrap items-center`+(e.disable?` disabled`:``)+(o.value?` q-radio--dark`:``)+(e.dense?` q-radio--dense`:``)+(e.leftLabel?` reverse`:``)),m=p(()=>{let t=e.color!==void 0&&(e.keepColor||d.value)?` text-${e.color}`:``;return`q-radio__inner relative-position q-radio__inner--${d.value?`truthy`:`falsy`}${t}`}),h=p(()=>(d.value?e.checkedIcon:e.uncheckedIcon)||null),g=p(()=>e.disable?-1:e.tabindex||0),_=p(()=>{let t={type:`radio`};return e.name!==void 0&&Object.assign(t,{".checked":d.value,"^checked":d.value?`checked`:void 0,name:e.name,value:e.val}),t}),v=qe(_);function y(t){t!==void 0&&(se(t),u(t)),!e.disable&&!d.value&&r(`update:modelValue`,e.val,t)}function b(e){(e.keyCode===13||e.keyCode===32)&&y(e)}Object.assign(a,{set:y});let x=Oa();return()=>{let n=h.value===null?[x]:[N(`div`,{key:`icon`,class:`q-radio__icon-container absolute-full flex flex-center no-wrap`},[N(pe,{class:`q-radio__icon`,name:h.value})])];e.disable||v(n,`unshift`,` q-radio__native q-ma-none q-pa-none`);let r=[N(`div`,{class:m.value,style:s.value,"aria-hidden":`true`},n)];l.value!==null&&r.push(l.value);let i=e.label===void 0?R(t.default):le(t.default,[e.label]);return i!==void 0&&r.push(N(`div`,{class:`q-radio__label q-anchor--skip`},i)),N(`div`,{ref:c,class:f.value,tabindex:g.value,role:`radio`,"aria-label":e.label,"aria-checked":d.value?`true`:`false`,"aria-disabled":e.disable?`true`:void 0,onClick:y,onKeydown:ka,onKeyup:b},r)}}}),ja=()=>N(`div`,{key:`svg`,class:`q-checkbox__bg absolute`},[N(`svg`,{class:`q-checkbox__svg fit absolute-full`,viewBox:`0 0 24 24`},[N(`path`,{class:`q-checkbox__truthy`,fill:`none`,d:`M1.73,12.91 8.1,19.28 22.79,4.59`}),N(`path`,{class:`q-checkbox__indet`,d:`M4,14H20V10H4`})])]),Ma=B({name:`QCheckbox`,props:Qe,emits:Ze,setup(e){let t=ja();function n(n,r){let i=p(()=>(n.value?e.checkedIcon:r.value?e.indeterminateIcon:e.uncheckedIcon)||null);return()=>i.value===null?[t]:[N(`div`,{key:`icon`,class:`q-checkbox__icon-container absolute-full flex flex-center no-wrap`},[N(pe,{class:`q-checkbox__icon`,name:i.value})])]}return $e(`checkbox`,n)}}),Na=B({name:`QToggle`,props:{...Qe,icon:String,iconColor:String},emits:Ze,setup(e){function t(t,n){let r=p(()=>(t.value?e.checkedIcon:n.value?e.indeterminateIcon:e.uncheckedIcon)||e.icon),i=p(()=>t.value?e.iconColor:null);return()=>[N(`div`,{class:`q-toggle__track`}),N(`div`,{class:`q-toggle__thumb absolute flex flex-center no-wrap`},r.value===void 0?void 0:[N(pe,{name:r.value,color:i.value})])]}return $e(`toggle`,t)}}),Pa={radio:Aa,checkbox:Ma,toggle:Na},Fa=Object.keys(Pa);function Ia(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>e[n]}var La=B({name:`QOptionGroup`,props:{...Le,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(U),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:`radio`,validator:e=>Fa.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(e,{emit:t,slots:n}){let{proxy:{$q:r}}=M(),i=Array.isArray(e.modelValue);e.type===`radio`?i&&console.error(`q-option-group: model should not be array`):i||console.error(`q-option-group: model should be array in your case`);let a=Ae(e,r),o=p(()=>Pa[e.type]),s=p(()=>Ia(e.optionValue,`value`)),c=p(()=>Ia(e.optionLabel,`label`)),l=p(()=>Ia(e.optionDisable,`disable`)),u=p(()=>e.options.map(t=>({val:s.value(t),name:t.name===void 0?e.name:t.name,disable:e.disable||l.value(t),leftLabel:t.leftLabel===void 0?e.leftLabel:t.leftLabel,color:t.color===void 0?e.color:t.color,checkedIcon:t.checkedIcon,uncheckedIcon:t.uncheckedIcon,dark:t.dark===void 0?a.value:t.dark,size:t.size===void 0?e.size:t.size,dense:e.dense,keepColor:t.keepColor===void 0?e.keepColor:t.keepColor}))),d=p(()=>`q-option-group q-gutter-x-sm`+(e.inline?` q-option-group--inline`:``)),f=p(()=>{let t={role:`group`};return e.type===`radio`&&(t.role=`radiogroup`,e.disable&&(t[`aria-disabled`]=`true`)),t});function m(e){t(`update:modelValue`,e)}return()=>N(`div`,{class:d.value,...f.value},e.options.map((t,r)=>{let i=n[`label-`+r]===void 0?n.label===void 0?void 0:()=>n.label(t):()=>n[`label-`+r](t);return N(`div`,[N(o.value,{label:i===void 0?c.value(t):null,modelValue:e.modelValue,"onUpdate:modelValue":m,...u.value[r]},i)])}))}}),Ra=B({name:`DialogPluginComponent`,props:{...Le,title:String,message:String,prompt:Object,options:Object,progress:[Boolean,Object],html:Boolean,ok:{type:[String,Object,Boolean],default:!0},cancel:[String,Object,Boolean],focus:{type:String,default:`ok`,validator:e=>[`ok`,`cancel`,`none`].includes(e)},stackButtons:Boolean,color:String,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:[`ok`,`hide`],setup(e,{emit:t}){let{proxy:r}=M(),{$q:a}=r,o=Ae(e,a),s=i(null),c=i(e.prompt===void 0?e.options===void 0?void 0:e.options.model:e.prompt.model),l=p(()=>`q-dialog-plugin`+(o.value?` q-dialog-plugin--dark q-dark`:``)+(e.progress===!1?``:` q-dialog-plugin--progress`)),u=p(()=>e.color||(o.value?`amber`:`primary`)),d=p(()=>e.progress===!1?null:U(e.progress)?{component:e.progress.spinner||Ce,props:{color:e.progress.color||u.value}}:{component:Ce,props:{color:u.value}}),f=p(()=>e.prompt!==void 0||e.options!==void 0),m=p(()=>{if(!f.value)return{};let{model:t,isValid:n,items:r,...i}=e.prompt===void 0?e.options:e.prompt;return i}),h=p(()=>U(e.ok)||e.ok===!0?a.lang.label.ok:e.ok),g=p(()=>U(e.cancel)||e.cancel===!0?a.lang.label.cancel:e.cancel),_=p(()=>e.prompt===void 0?e.options!==void 0&&e.options.isValid!==void 0&&!e.options.isValid(c.value):e.prompt.isValid!==void 0&&!e.prompt.isValid(c.value)),v=p(()=>({color:u.value,label:h.value,ripple:!1,disable:_.value,...U(e.ok)?e.ok:{flat:!0},"data-autofocus":e.focus===`ok`&&!f.value||void 0,onClick:S})),y=p(()=>({color:u.value,label:g.value,ripple:!1,...U(e.cancel)?e.cancel:{flat:!0},"data-autofocus":e.focus===`cancel`&&!f.value||void 0,onClick:C}));k(()=>e.prompt&&e.prompt.model,T),k(()=>e.options&&e.options.model,T);function b(){s.value.show()}function x(){s.value.hide()}function S(){t(`ok`,n(c.value)),x()}function C(){x()}function w(){t(`hide`)}function T(e){c.value=e}function E(t){!_.value&&e.prompt.type!==`textarea`&&oe(t,13)&&S()}function D(t,n){return e.html?N(W,{class:t,innerHTML:n}):N(W,{class:t},()=>n)}function O(){return[N($n,{color:u.value,dense:!0,autofocus:!0,dark:o.value,...m.value,modelValue:c.value,"onUpdate:modelValue":T,onKeyup:E})]}function A(){return[N(La,{color:u.value,options:e.options.items,dark:o.value,...m.value,modelValue:c.value,"onUpdate:modelValue":T})]}function ee(){let t=[];return e.cancel&&t.push(N(xe,y.value)),e.ok&&t.push(N(xe,v.value)),N(er,{class:e.stackButtons?`items-end`:``,vertical:e.stackButtons,align:`right`},()=>t)}function j(){let t=[];return e.title&&t.push(D(`q-dialog__title`,e.title)),e.progress!==!1&&t.push(N(W,{class:`q-dialog__progress`},()=>N(d.value.component,d.value.props))),e.message&&t.push(D(`q-dialog__message`,e.message)),e.prompt===void 0?e.options!==void 0&&t.push(N(Da,{dark:o.value}),N(W,{class:`scroll q-dialog-plugin__form`},A),N(Da,{dark:o.value})):t.push(N(W,{class:`scroll q-dialog-plugin__form`},O)),(e.ok||e.cancel)&&t.push(ee()),t}function te(){return[N(kt,{class:[l.value,e.cardClass],style:e.cardStyle,dark:o.value},j)]}return Object.assign(r,{show:b,hide:x}),()=>N(tn,{ref:s,onHide:w},te)}});function za(e,t){for(let n in t)n!==`spinner`&&Object(t[n])===t[n]&&!Array.isArray(t[n])?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},za(e[n],t[n])):e[n]=t[n]}function Ba(e,t,n){return r=>{let a,o,s=t&&r.component!==void 0;if(s){let{component:e,componentProps:t}=r;a=typeof e==`string`?n.component(e):e,o=t||{}}else{let{class:t,style:n,...i}=r;a=e,o=i,t!==void 0&&(i.cardClass=t),n!==void 0&&(i.cardStyle=n)}let c,l=!1,u=i(null),d=_e(!1,`dialog`),f=e=>{if(u.value?.[e]!==void 0){u.value[e]();return}let t=c.$.subTree;if(t?.component){if(t.component.proxy&&t.component.proxy[e]){t.component.proxy[e]();return}if(t.component.subTree&&t.component.subTree.component&&t.component.subTree.component.proxy&&t.component.subTree.component.proxy[e]){t.component.subTree.component.proxy[e]();return}}console.error(`[Quasar] Incorrectly defined Dialog component`)},p=[],m=[],h={onOk(e){return p.push(e),h},onCancel(e){return m.push(e),h},onDismiss(e){return p.push(e),m.push(e),h},hide(){return f(`hide`),h},update(e){if(c!==null){if(s)Object.assign(o,e);else{let{class:t,style:n,...r}=e;t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n),za(o,r)}c.$forceUpdate()}return h}},g=e=>{l=!0,p.forEach(t=>{t(e)})},_=()=>{v.unmount(d),me(d),v=null,c=null,l||m.forEach(e=>{e()})},v=St({name:`QGlobalDialog`,setup:()=>()=>N(a,{...o,ref:u,onOk:g,onHide:_,onVnodeMounted(...e){typeof o.onVnodeMounted==`function`&&o.onVnodeMounted(...e),C(()=>f(`show`))}})},n);return c=v.mount(d),h}}var Va={install({$q:e,parentApp:t}){e.dialog=this.create=Ba(Ra,!0,t)}},Ha=new Map;function Ua(e,t){Ha.set(e,t)}function Wa(e){Ha.delete(e)}function Ga(){let e=[];for(let[t,n]of Ha)try{n()&&e.push(t)}catch{}return e}function Ka(){return Ga().length>0}function qa(e){return typeof e==`object`||`displayName`in e||`props`in e||`__vccOpts`in e}function Ja(e){return e.__esModule||e[Symbol.toStringTag]===`Module`||e.default&&qa(e.default)}var Z=Object.assign;function Ya(e,t){let n={};for(let r in t){let i=t[r];n[r]=Q(i)?i.map(e):e(i)}return n}var Xa=()=>{},Q=Array.isArray;function Za(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var Qa=Symbol(``);function $a(e,t){return Z(Error(),{type:e,[Qa]:!0},t)}function eo(e,t){return e instanceof Error&&Qa in e&&(t==null||!!(e.type&t))}var to=Symbol(``),no=Symbol(``),ro=Symbol(``),io=Symbol(``),ao=Symbol(``);function oo(){return P(ro)}function so(e){return P(io)}var co=typeof document<`u`,lo=/#/g,uo=/&/g,fo=/\//g,po=/=/g,mo=/\?/g,ho=/\+/g,go=/%5B/g,_o=/%5D/g,vo=/%5E/g,yo=/%60/g,bo=/%7B/g,xo=/%7C/g,So=/%7D/g,Co=/%20/g;function wo(e){return e==null?``:encodeURI(``+e).replace(xo,`|`).replace(go,`[`).replace(_o,`]`)}function To(e){return wo(e).replace(bo,`{`).replace(So,`}`).replace(vo,`^`)}function Eo(e){return wo(e).replace(ho,`%2B`).replace(Co,`+`).replace(lo,`%23`).replace(uo,`%26`).replace(yo,"`").replace(bo,`{`).replace(So,`}`).replace(vo,`^`)}function Do(e){return Eo(e).replace(po,`%3D`)}function Oo(e){return wo(e).replace(lo,`%23`).replace(mo,`%3F`)}function ko(e){return Oo(e).replace(fo,`%2F`)}function Ao(e){if(e==null)return null;try{return decodeURIComponent(``+e)}catch{}return``+e}var jo=/\/$/,Mo=e=>e.replace(jo,``);function No(e,t,n=`/`){let r,i={},a=``,o=``,s=t.indexOf(`#`),c=t.indexOf(`?`);return c=s>=0&&c>s?-1:c,c>=0&&(r=t.slice(0,c),a=t.slice(c,s>0?s:t.length),i=e(a.slice(1))),s>=0&&(r||=t.slice(0,s),o=t.slice(s,t.length)),r=Vo(r??t,n),{fullPath:r+a+o,path:r,query:i,hash:Ao(o)}}function Po(e,t){let n=t.query?e(t.query):``;return t.path+(n&&`?`)+n+(t.hash||``)}function Fo(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||`/`}function Io(e,t,n){let r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&Lo(t.matched[r],n.matched[i])&&Ro(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Lo(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Ro(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!zo(e[n],t[n]))return!1;return!0}function zo(e,t){return Q(e)?Bo(e,t):Q(t)?Bo(t,e):(e&&e.valueOf())===(t&&t.valueOf())}function Bo(e,t){return Q(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function Vo(e,t){if(e.startsWith(`/`))return e;if(!e)return t;let n=t.split(`/`),r=e.split(`/`),i=r[r.length-1];(i===`..`||i===`.`)&&r.push(``);let a=n.length-1,o,s;for(o=0;o<r.length;o++)if(s=r[o],s!==`.`){if(s===`..`)a>1&&a--;else break}return n.slice(0,a).join(`/`)+`/`+r.slice(o).join(`/`)}var Ho={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0};function Uo(e){if(!e){if(co){let t=document.querySelector(`base`);e=t&&t.getAttribute(`href`)||`/`,e=e.replace(/^\w+:\/\/[^/]+/,``)}else e=`/`}return e[0]!==`/`&&e[0]!==`#`&&(e=`/`+e),Mo(e)}var Wo=/^[^#]+#/;function Go(e,t){return e.replace(Wo,`#`)+t}function Ko(e,t){let n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}var qo=()=>({left:window.scrollX,top:window.scrollY});function Jo(e){let t;if(`el`in e){let n=e.el,r=typeof n==`string`&&n.startsWith(`#`),i=typeof n==`string`?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;t=Ko(i,e)}else t=e;`scrollBehavior`in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left==null?window.scrollX:t.left,t.top==null?window.scrollY:t.top)}function Yo(e,t){return(history.state?history.state.position-t:-1)+e}var Xo=new Map;function Zo(e,t){Xo.set(e,t)}function Qo(e){let t=Xo.get(e);return Xo.delete(e),t}function $o(e){return typeof e==`string`||e&&typeof e==`object`}function es(e){return typeof e==`string`||typeof e==`symbol`}function ts(e){let t={};if(e===``||e===`?`)return t;let n=(e[0]===`?`?e.slice(1):e).split(`&`);for(let e=0;e<n.length;++e){let r=n[e].replace(ho,` `),i=r.indexOf(`=`),a=Ao(i<0?r:r.slice(0,i)),o=i<0?null:Ao(r.slice(i+1));if(a in t){let e=t[a];Q(e)||(e=t[a]=[e]),e.push(o)}else t[a]=o}return t}function ns(e){let t=``;for(let n in e){let r=e[n];if(n=Do(n),r==null){r!==void 0&&(t+=(t.length?`&`:``)+n);continue}(Q(r)?r.map(e=>e&&Eo(e)):[r&&Eo(r)]).forEach(e=>{e!==void 0&&(t+=(t.length?`&`:``)+n,e!=null&&(t+=`=`+e))})}return t}function rs(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=Q(r)?r.map(e=>e==null?null:``+e):r==null?r:``+r)}return t}function is(){let e=[];function t(t){return e.push(t),()=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function as(e,t,n,r,i,a=e=>e()){let o=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((s,c)=>{let l=e=>{e===!1?c($a(4,{from:n,to:t})):e instanceof Error?c(e):$o(e)?c($a(2,{from:t,to:e})):(o&&r.enterCallbacks[i]===o&&typeof e==`function`&&o.push(e),s())},u=a(()=>e.call(r&&r.instances[i],t,n,l)),d=Promise.resolve(u);e.length<3&&(d=d.then(l)),d.catch(e=>c(e))})}function os(e,t,n,r,i=e=>e()){let a=[];for(let o of e)for(let e in o.components){let s=o.components[e];if(!(t!==`beforeRouteEnter`&&!o.instances[e])){if(qa(s)){let c=(s.__vccOpts||s)[t];c&&a.push(as(c,n,r,o,e,i))}else{let c=s();a.push(()=>c.then(a=>{if(!a)throw Error(`Couldn't resolve component "${e}" at "${o.path}"`);let s=Ja(a)?a.default:a;o.mods[e]=a,o.components[e]=s;let c=(s.__vccOpts||s)[t];return c&&as(c,n,r,o,e,i)()}))}}}return a}function ss(e,t){let n=[],r=[],i=[],a=Math.max(t.matched.length,e.matched.length);for(let o=0;o<a;o++){let a=t.matched[o];a&&(e.matched.find(e=>Lo(e,a))?r.push(a):n.push(a));let s=e.matched[o];s&&(t.matched.find(e=>Lo(e,s))||i.push(s))}return[n,r,i]}var cs=()=>location.protocol+`//`+location.host;function ls(e,t){let{pathname:n,search:r,hash:i}=t,a=e.indexOf(`#`);if(a>-1){let t=i.includes(e.slice(a))?e.slice(a).length:1,n=i.slice(t);return n[0]!==`/`&&(n=`/`+n),Fo(n,``)}return Fo(n,e)+r+i}function us(e,t,n,r){let i=[],a=[],o=null,s=({state:a})=>{let s=ls(e,location),c=n.value,l=t.value,u=0;if(a){if(n.value=s,t.value=a,o&&o===c){o=null;return}u=l?a.position-l.position:0}else r(s);i.forEach(e=>{e(n.value,c,{delta:u,type:`pop`,direction:u?u>0?`forward`:`back`:``})})};function c(){o=n.value}function l(e){i.push(e);let t=()=>{let t=i.indexOf(e);t>-1&&i.splice(t,1)};return a.push(t),t}function u(){if(document.visibilityState===`hidden`){let{history:e}=window;if(!e.state)return;e.replaceState(Z({},e.state,{scroll:qo()}),``)}}function d(){for(let e of a)e();a=[],window.removeEventListener(`popstate`,s),window.removeEventListener(`pagehide`,u),document.removeEventListener(`visibilitychange`,u)}return window.addEventListener(`popstate`,s),window.addEventListener(`pagehide`,u),document.addEventListener(`visibilitychange`,u),{pauseListeners:c,listen:l,destroy:d}}function ds(e,t,n,r=!1,i=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:i?qo():null}}function fs(e){let{history:t,location:n}=window,r={value:ls(e,n)},i={value:t.state};i.value||a(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(r,a,o){let s=e.indexOf(`#`),c=s>-1?(n.host&&document.querySelector(`base`)?e:e.slice(s))+r:cs()+e+r;try{t[o?`replaceState`:`pushState`](a,``,c),i.value=a}catch(e){console.error(e),n[o?`replace`:`assign`](c)}}function o(e,n){a(e,Z({},t.state,ds(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),r.value=e}function s(e,n){let o=Z({},i.value,t.state,{forward:e,scroll:qo()});a(o.current,o,!0),a(e,Z({},ds(r.value,e,null),{position:o.position+1},n),!1),r.value=e}return{location:r,state:i,push:s,replace:o}}function ps(e){e=Uo(e);let t=fs(e),n=us(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}let i=Z({location:``,base:e,go:r,createHref:Go.bind(null,e)},t,n);return Object.defineProperty(i,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,"state",{enumerable:!0,get:()=>t.state.value}),i}function ms(e){return e=location.host?e||location.pathname+location.search:``,e.includes(`#`)||(e+=`#`),ps(e)}var hs={type:0,value:``},gs=/[a-zA-Z0-9_]/;function _s(e){if(!e)return[[]];if(e===`/`)return[[hs]];if(!e.startsWith(`/`))throw Error(`Invalid path "${e}"`);function t(e){throw Error(`ERR (${n})/"${l}": ${e}`)}let n=0,r=n,i=[],a;function o(){a&&i.push(a),a=[]}let s=0,c,l=``,u=``;function d(){l&&=(n===0?a.push({type:0,value:l}):n===1||n===2||n===3?(a.length>1&&(c===`*`||c===`+`)&&t(`A repeatable param (${l}) must be alone in its segment. eg: '/:ids+.`),a.push({type:1,value:l,regexp:u,repeatable:c===`*`||c===`+`,optional:c===`*`||c===`?`})):t(`Invalid state to consume buffer`),``)}function f(){l+=c}for(;s<e.length;)switch(c=e[s++],n){case 0:c===`\\`?(r=n,n=4):c===`/`?(l&&d(),o()):c===`:`?(d(),n=1):f();break;case 4:f(),n=r;break;case 1:c===`(`?n=2:gs.test(c)?f():(d(),n=0,c!==`*`&&c!==`?`&&c!==`+`&&s--);break;case 2:c===`)`?u[u.length-1]==`\\`?u=u.slice(0,-1)+c:n=3:u+=c;break;case 3:d(),n=0,c!==`*`&&c!==`?`&&c!==`+`&&s--,u=``;break;default:t(`Unknown state`)}return n===2&&t(`Unfinished custom RegExp for param "${l}"`),d(),o(),i}var vs=`[^/]+?`,ys={sensitive:!1,strict:!1,start:!0,end:!0},bs=/[.+*?^${}()[\]/\\]/g;function xs(e,t){let n=Z({},ys,t),r=[],i=n.start?`^`:``,a=[];for(let t of e){let e=t.length?[]:[90];n.strict&&!t.length&&(i+=`/`);for(let r=0;r<t.length;r++){let o=t[r],s=40+(n.sensitive?.25:0);if(o.type===0)r||(i+=`/`),i+=o.value.replace(bs,`\\$&`),s+=40;else if(o.type===1){let{value:e,repeatable:n,optional:c,regexp:l}=o;a.push({name:e,repeatable:n,optional:c});let u=l||vs;if(u!==vs){s+=10;try{RegExp(`(${u})`)}catch(t){throw Error(`Invalid custom RegExp for param "${e}" (${u}): `+t.message)}}let d=n?`((?:${u})(?:/(?:${u}))*)`:`(${u})`;r||(d=c&&t.length<2?`(?:/${d})`:`/`+d),c&&(d+=`?`),i+=d,s+=20,c&&(s+=-8),n&&(s+=-20),u===`.*`&&(s+=-50)}e.push(s)}r.push(e)}if(n.strict&&n.end){let e=r.length-1;r[e][r[e].length-1]+=.7000000000000001}n.strict||(i+=`/?`),n.end?i+=`$`:n.strict&&!i.endsWith(`/`)&&(i+=`(?:/|$)`);let o=new RegExp(i,n.sensitive?``:`i`);function s(e){let t=e.match(o),n={};if(!t)return null;for(let e=1;e<t.length;e++){let r=t[e]||``,i=a[e-1];n[i.name]=r&&i.repeatable?r.split(`/`):r}return n}function c(t){let n=``,r=!1;for(let i of e){(!r||!n.endsWith(`/`))&&(n+=`/`),r=!1;for(let e of i)if(e.type===0)n+=e.value;else if(e.type===1){let{value:a,repeatable:o,optional:s}=e,c=a in t?t[a]:``;if(Q(c)&&!o)throw Error(`Provided param "${a}" is an array but it is not repeatable (* or + modifiers)`);let l=Q(c)?c.join(`/`):c;if(!l){if(s)i.length<2&&(n.endsWith(`/`)?n=n.slice(0,-1):r=!0);else throw Error(`Missing required param "${a}"`)}n+=l}}return n||`/`}return{re:o,score:r,keys:a,parse:s,stringify:c}}function Ss(e,t){let n=0;for(;n<e.length&&n<t.length;){let r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?e.length===1&&e[0]===80?-1:1:e.length>t.length?t.length===1&&t[0]===80?1:-1:0}function Cs(e,t){let n=0,r=e.score,i=t.score;for(;n<r.length&&n<i.length;){let e=Ss(r[n],i[n]);if(e)return e;n++}if(Math.abs(i.length-r.length)===1){if(ws(r))return 1;if(ws(i))return-1}return i.length-r.length}function ws(e){let t=e[e.length-1];return e.length>0&&t[t.length-1]<0}var Ts={strict:!1,end:!0,sensitive:!1};function Es(e,t,n){let r=Z(xs(_s(e.path),n),{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function Ds(e,t){let n=[],r=new Map;t=Za(Ts,t);function i(e){return r.get(e)}function a(e,n,r){let i=!r,s=ks(e);s.aliasOf=r&&r.record;let l=Za(t,e),u=[s];if(`alias`in e){let t=typeof e.alias==`string`?[e.alias]:e.alias;for(let e of t)u.push(ks(Z({},s,{components:r?r.record.components:s.components,path:e,aliasOf:r?r.record:s})))}let d,f;for(let t of u){let{path:u}=t;if(n&&u[0]!==`/`){let e=n.record.path,r=e[e.length-1]===`/`?``:`/`;t.path=n.record.path+(u&&r+u)}if(d=Es(t,n,l),r?r.alias.push(d):(f||=d,f!==d&&f.alias.push(d),i&&e.name&&!js(d)&&o(e.name)),Fs(d)&&c(d),s.children){let e=s.children;for(let t=0;t<e.length;t++)a(e[t],d,r&&r.children[t])}r||=d}return f?()=>{o(f)}:Xa}function o(e){if(es(e)){let t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(o),t.alias.forEach(o))}else{let t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(o),e.alias.forEach(o))}}function s(){return n}function c(e){let t=Ns(e,n);n.splice(t,0,e),e.record.name&&!js(e)&&r.set(e.record.name,e)}function l(e,t){let i,a={},o,s;if(`name`in e&&e.name){if(i=r.get(e.name),!i)throw $a(1,{location:e});s=i.record.name,a=Z(Os(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&Os(e.params,i.keys.map(e=>e.name))),o=i.stringify(a)}else if(e.path!=null)o=e.path,i=n.find(e=>e.re.test(o)),i&&(a=i.parse(o),s=i.record.name,i.keys.forEach(e=>{e.optional&&!a[e.name]&&delete a[e.name]}));else{if(i=t.name?r.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw $a(1,{location:e,currentLocation:t});s=i.record.name,a=Z({},t.params,e.params),o=i.stringify(a)}let c=[],l=i;for(;l;)c.unshift(l.record),l=l.parent;return{name:s,path:o,params:a,matched:c,meta:Ms(c)}}e.forEach(e=>a(e));function u(){n.length=0,r.clear()}return{addRoute:a,resolve:l,removeRoute:o,clearRoutes:u,getRoutes:s,getRecordMatcher:i}}function Os(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function ks(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:As(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:`components`in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function As(e){let t={},n=e.props||!1;if(`component`in e)t.default=n;else for(let r in e.components)t[r]=typeof n==`object`?n[r]:n;return t}function js(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Ms(e){return e.reduce((e,t)=>Z(e,t.meta),{})}function Ns(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;Cs(e,t[i])<0?r=i:n=i+1}let i=Ps(e);return i&&(r=t.lastIndexOf(i,r-1)),r}function Ps(e){let t=e;for(;t=t.parent;)if(Fs(t)&&Cs(e,t)===0)return t}function Fs({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Is(e){let t=P(ro),n=P(io),i=p(()=>{let n=r(e.to);return t.resolve(n)}),a=p(()=>{let{matched:e}=i.value,{length:t}=e,r=e[t-1],a=n.matched;if(!r||!a.length)return-1;let o=a.findIndex(Lo.bind(null,r));if(o>-1)return o;let s=Vs(e[t-2]);return t>1&&Vs(r)===s&&a[a.length-1].path!==s?a.findIndex(Lo.bind(null,e[t-2])):o}),o=p(()=>a.value>-1&&Bs(n.params,i.value.params)),s=p(()=>a.value>-1&&a.value===n.matched.length-1&&Ro(n.params,i.value.params));function c(n={}){if(zs(n)){let n=t[r(e.replace)?`replace`:`push`](r(e.to)).catch(Xa);return e.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}return{route:i,href:p(()=>i.value.href),isActive:o,isExactActive:s,navigate:c}}function Ls(e){return e.length===1?e[0]:e}var Rs=u({name:`RouterLink`,compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:`page`},viewTransition:Boolean},useLink:Is,setup(e,{slots:t}){let n=l(Is(e)),{options:r}=P(ro),i=p(()=>({[Hs(e.activeClass,r.linkActiveClass,`router-link-active`)]:n.isActive,[Hs(e.exactActiveClass,r.linkExactActiveClass,`router-link-exact-active`)]:n.isExactActive}));return()=>{let r=t.default&&Ls(t.default(n));return e.custom?r:N(`a`,{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},r)}}});function zs(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(e.button===void 0||e.button===0)){if(e.currentTarget&&e.currentTarget.getAttribute){let t=e.currentTarget.getAttribute(`target`);if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Bs(e,t){for(let n in t){let r=t[n],i=e[n];if(typeof r==`string`){if(r!==i)return!1}else if(!Q(i)||i.length!==r.length||r.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}function Vs(e){return e?e.aliasOf?e.aliasOf.path:e.path:``}var Hs=(e,t,n)=>e??t??n,Us=u({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){let a=P(ao),o=p(()=>e.route||a.value),s=P(no,0),c=p(()=>{let e=r(s),{matched:t}=o.value,n;for(;(n=t[e])&&!n.components;)e++;return e}),l=p(()=>o.value.matched[c.value]);m(no,p(()=>c.value+1)),m(to,l),m(ao,o);let u=i();return k(()=>[u.value,l.value,e.name],([e,t,n],[r,i,a])=>{t&&(t.instances[n]=e,i&&i!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=i.leaveGuards),t.updateGuards.size||(t.updateGuards=i.updateGuards))),e&&t&&(!i||!Lo(t,i)||!r)&&(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:`post`}),()=>{let r=o.value,i=e.name,a=l.value,s=a&&a.components[i];if(!s)return Ws(n.default,{Component:s,route:r});let c=a.props[i],d=c?c===!0?r.params:typeof c==`function`?c(r):c:null,f=N(s,Z({},d,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(a.instances[i]=null)},ref:u}));return Ws(n.default,{Component:f,route:r})||f}}});function Ws(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var Gs=Us;function Ks(e){let t=Ds(e.routes,e),n=e.parseQuery||ts,i=e.stringifyQuery||ns,s=e.history,c=is(),l=is(),u=is(),d=a(Ho),f=Ho;co&&e.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let p=Ya.bind(null,e=>``+e),m=Ya.bind(null,ko),h=Ya.bind(null,Ao);function g(e,n){let r,i;return es(e)?(r=t.getRecordMatcher(e),i=n):i=e,t.addRoute(i,r)}function _(e){let n=t.getRecordMatcher(e);n&&t.removeRoute(n)}function v(){return t.getRoutes().map(e=>e.record)}function y(e){return!!t.getRecordMatcher(e)}function b(e,r){if(r=Z({},r||d.value),typeof e==`string`){let i=No(n,e,r.path),a=t.resolve({path:i.path},r),o=s.createHref(i.fullPath);return Z(i,a,{params:h(a.params),redirectedFrom:void 0,href:o})}let a;if(e.path!=null)a=Z({},e,{path:No(n,e.path,r.path).path});else{let t=Z({},e.params);for(let e in t)t[e]??delete t[e];a=Z({},e,{params:m(t)}),r.params=m(r.params)}let o=t.resolve(a,r),c=e.hash||``;o.params=p(h(o.params));let l=Po(i,Z({},e,{hash:To(c),path:o.path})),u=s.createHref(l);return Z({fullPath:l,hash:c,query:i===ns?rs(e.query):e.query||{}},o,{redirectedFrom:void 0,href:u})}function x(e){return typeof e==`string`?No(n,e,d.value.path):Z({},e)}function S(e,t){if(f!==e)return $a(8,{from:t,to:e})}function w(e){return D(e)}function T(e){return w(Z(x(e),{replace:!0}))}function E(e,t){let n=e.matched[e.matched.length-1];if(n&&n.redirect){let{redirect:r}=n,i=typeof r==`function`?r(e,t):r;return typeof i==`string`&&(i=i.includes(`?`)||i.includes(`#`)?i=x(i):{path:i},i.params={}),Z({query:e.query,hash:e.hash,params:i.path==null?e.params:{}},i)}}function D(e,t){let n=f=b(e),r=d.value,a=e.state,o=e.force,s=e.replace===!0,c=E(n,r);if(c)return D(Z(x(c),{state:typeof c==`object`?Z({},a,c.state):a,force:o,replace:s}),t||n);let l=n;l.redirectedFrom=t;let u;return!o&&Io(i,r,n)&&(u=$a(16,{to:l,from:r}),I(r,r,!0,!1)),(u?Promise.resolve(u):A(l,r)).catch(e=>eo(e)?eo(e,2)?e:ie(e):ne(e,l,r)).then(e=>{if(e){if(eo(e,2))return D(Z({replace:s},x(e.to),{state:typeof e.to==`object`?Z({},a,e.to.state):a,force:o}),t||l)}else e=j(l,r,!0,s,a);return ee(l,r,e),e})}function O(e,t){let n=S(e,t);return n?Promise.reject(n):Promise.resolve()}function k(e){let t=oe.values().next().value;return t&&typeof t.runWithContext==`function`?t.runWithContext(e):e()}function A(e,t){let n,[r,i,a]=ss(e,t);n=os(r.reverse(),`beforeRouteLeave`,e,t);for(let i of r)i.leaveGuards.forEach(r=>{n.push(as(r,e,t))});let o=O.bind(null,e,t);return n.push(o),z(n).then(()=>{n=[];for(let r of c.list())n.push(as(r,e,t));return n.push(o),z(n)}).then(()=>{n=os(i,`beforeRouteUpdate`,e,t);for(let r of i)r.updateGuards.forEach(r=>{n.push(as(r,e,t))});return n.push(o),z(n)}).then(()=>{n=[];for(let r of a)if(r.beforeEnter){if(Q(r.beforeEnter))for(let i of r.beforeEnter)n.push(as(i,e,t));else n.push(as(r.beforeEnter,e,t))}return n.push(o),z(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=os(a,`beforeRouteEnter`,e,t,k),n.push(o),z(n))).then(()=>{n=[];for(let r of l.list())n.push(as(r,e,t));return n.push(o),z(n)}).catch(e=>eo(e,8)?e:Promise.reject(e))}function ee(e,t,n){u.list().forEach(r=>k(()=>r(e,t,n)))}function j(e,t,n,r,i){let a=S(e,t);if(a)return a;let o=t===Ho,c=co?history.state:{};n&&(r||o?s.replace(e.fullPath,Z({scroll:o&&c&&c.scroll},i)):s.push(e.fullPath,i)),d.value=e,I(e,t,n,o),ie()}let M;function te(){M||=s.listen((e,t,n)=>{if(!R.listening)return;let r=b(e),i=E(r,R.currentRoute.value);if(i){D(Z(i,{replace:!0,force:!0}),r).catch(Xa);return}f=r;let a=d.value;co&&Zo(Yo(a.fullPath,n.delta),qo()),A(r,a).catch(e=>eo(e,12)?e:eo(e,2)?(D(Z(x(e.to),{force:!0}),r).then(e=>{eo(e,20)&&!n.delta&&n.type===`pop`&&s.go(-1,!1)}).catch(Xa),Promise.reject()):(n.delta&&s.go(-n.delta,!1),ne(e,r,a))).then(e=>{e||=j(r,a,!1),e&&(n.delta&&!eo(e,8)?s.go(-n.delta,!1):n.type===`pop`&&eo(e,20)&&s.go(-1,!1)),ee(r,a,e)}).catch(Xa)})}let N=is(),P=is(),F;function ne(e,t,n){ie(e);let r=P.list();return r.length?r.forEach(r=>r(e,t,n)):console.error(e),Promise.reject(e)}function re(){return F&&d.value!==Ho?Promise.resolve():new Promise((e,t)=>{N.add([e,t])})}function ie(e){return F||(F=!e,te(),N.list().forEach(([t,n])=>e?n(e):t()),N.reset()),e}function I(t,n,r,i){let{scrollBehavior:a}=e;if(!co||!a)return Promise.resolve();let o=!r&&Qo(Yo(t.fullPath,0))||(i||!r)&&history.state&&history.state.scroll||null;return C().then(()=>a(t,n,o)).then(e=>t===d.value&&e&&Jo(e)).catch(e=>t===d.value&&ne(e,t,n))}let ae=e=>s.go(e),L,oe=new Set,R={currentRoute:d,listening:!0,addRoute:g,removeRoute:_,clearRoutes:t.clearRoutes,hasRoute:y,getRoutes:v,resolve:b,options:e,push:w,replace:T,go:ae,back:()=>ae(-1),forward:()=>ae(1),beforeEach:c.add,beforeResolve:l.add,afterEach:u.add,onError:P.add,isReady:re,install(e){e.component(`RouterLink`,Rs),e.component(`RouterView`,Gs),e.config.globalProperties.$router=R,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>r(d)}),co&&!L&&d.value===Ho&&(L=!0,w(s.location).catch(e=>{}));let t={};for(let e in Ho)Object.defineProperty(t,e,{get:()=>d.value[e],enumerable:!0});e.provide(ro,R),e.provide(io,o(t)),e.provide(ao,d);let n=e.unmount;oe.add(e),e.unmount=function(){oe.delete(e),oe.size<1&&(f=Ho,M&&M(),M=null,d.value=Ho,L=!1,F=!1),n()}}};function z(e){return e.reduce((e,t)=>e.then(()=>k(t)),Promise.resolve())}return R}var qs=`modulepreload`,Js=function(e){return`/`+e},Ys={},$=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=Js(t,n),t=s(t),t in Ys)return;Ys[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`:qs,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}`)))})}))}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)})},Xs=[{path:`/`,component:()=>$(()=>import(`./MainLayout-aDNwgrrT.js`).then(e=>e.t),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25])),children:[{path:``,redirect:{name:`workspace`}},{path:`workspace/:id?`,name:`workspace`,component:()=>$(()=>import(`./WorkspacePage-Cyoc2Mvs.js`).then(e=>e.t),__vite__mapDeps([26,1,2,3,4,5,27,6,7,8,9,10,11,12,14,15,16,17,18,19,28,23,29,30,31,32,33]))},{path:`create`,name:`create`,component:()=>$(()=>import(`./CreatePage-BhcHSOqz.js`),__vite__mapDeps([34,1,2,3,4,27,7,8,5,9,10,11,12,35,36,18,24,29,37,30,31,38]))},{path:`settings`,name:`settings`,component:()=>$(()=>import(`./SettingsPage-kx7aNmeH.js`),__vite__mapDeps([39,1,2,3,4,5,9,6,7,8,10,11,12,14,21,17,40,36,20,22,24,29,37,32,41]))},{path:`search`,name:`search`,component:()=>$(()=>import(`./SearchPage-CBQqJmmb.js`),__vite__mapDeps([42,1,2,3,4,5,11,16,17,23,29,37,43]))},{path:`health`,name:`health`,component:()=>$(()=>import(`./HealthPage-YqOn5Ig0.js`),__vite__mapDeps([44,2,3,4,6,5,10,11,16,17,29,37,45]))},{path:`changelog`,name:`changelog`,component:()=>$(()=>import(`./ChangelogPage-D5FtafDI.js`),__vite__mapDeps([46,2,3,4,11,5,15,17,12,29,37,47]))}]},{path:`/:catchAll(.*)*`,redirect:`/`}],Zs=Ca(()=>{let e=Ks({scrollBehavior:()=>({left:0,top:0}),routes:Xs,history:ms()});return e.beforeEach((e,t)=>{if(e.fullPath===t.fullPath||!Ka())return!0;let n=Br.global.t;return new Promise(e=>{Va.create({title:n(`unsaved.title`),message:n(`unsaved.message`),dark:!0,cancel:{flat:!0,label:n(`unsaved.stay`),color:`grey-5`},ok:{flat:!0,label:n(`unsaved.leave`),color:`negative`}}).onOk(()=>e(!0)).onCancel(()=>e(!1))})}),window.addEventListener(`beforeunload`,e=>{Ka()&&(e.preventDefault(),e.returnValue=``)}),e});async function Qs(e,t){let n=e(ba);n.use(Tt,t);let r=typeof wa==`function`?await wa({}):wa;n.use(r);let i=s(typeof Zs==`function`?await Zs({store:r}):Zs);return r.use(({store:e})=>{e.router=i}),{app:n,store:r,router:i}}var $s={config:{dark:!0,brand:{primary:`#6c63ff`,secondary:`#26a69a`,accent:`#9c27b0`,dark:`#1a1a2e`,"dark-page":`#1a1a2e`,positive:`#21ba45`,negative:`#c10015`,info:`#31ccec`,warning:`#f2c037`}},plugins:{Notify:kr,Dialog:Va}},ec=function(){return!!(window.location.hostname===`localhost`||window.location.hostname===`[::1]`||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/))},tc;typeof window<`u`&&(tc=typeof Promise<`u`?new Promise(function(e){return window.addEventListener(`load`,e)}):{then:function(e){return window.addEventListener(`load`,e)}});function nc(e,t){t===void 0&&(t={});var n=t.registrationOptions;n===void 0&&(n={}),delete t.registrationOptions;var r=function(e){for(var n=[],r=arguments.length-1;r-->0;)n[r]=arguments[r+1];t&&t[e]&&t[e].apply(t,n)};`serviceWorker`in navigator&&tc.then(function(){ec()?(ac(e,r,n),navigator.serviceWorker.ready.then(function(e){r(`ready`,e)}).catch(function(e){return rc(r,e)})):(ic(e,r,n),navigator.serviceWorker.ready.then(function(e){r(`ready`,e)}).catch(function(e){return rc(r,e)}))})}function rc(e,t){navigator.onLine||e(`offline`),e(`error`,t)}function ic(e,t,n){navigator.serviceWorker.register(e,n).then(function(e){if(t(`registered`,e),e.waiting){t(`updated`,e);return}e.onupdatefound=function(){t(`updatefound`,e);var n=e.installing;n.onstatechange=function(){n.state===`installed`&&(navigator.serviceWorker.controller?t(`updated`,e):t(`cached`,e))}}}).catch(function(e){return rc(t,e)})}function ac(e,t,n){fetch(e).then(function(r){r.status===404?(t(`error`,Error(`Service worker not found at `+e)),oc()):r.headers.get(`content-type`).indexOf(`javascript`)===-1?(t(`error`,Error(`Expected `+e+` to have javascript content-type, but received `+r.headers.get(`content-type`))),oc()):ic(e,t,n)}).catch(function(e){return rc(t,e)})}function oc(){`serviceWorker`in navigator&&navigator.serviceWorker.ready.then(function(e){e.unregister()}).catch(function(e){return rc(emit,e)})}nc(`/sw.js`);var sc=`/`;async function cc({app:e,router:t,store:n},r){let i=!1,a=e=>{try{return t.resolve(e).href}catch{}return Object(e)===e?null:e},o=e=>{if(i=!0,typeof e==`string`&&/^https?:\/\//.test(e)){window.location.href=e;return}let t=a(e);t!==null&&(window.location.href=t,window.location.reload())},s=window.location.href.replace(window.location.origin,``);for(let a=0;i===!1&&a<r.length;a++)try{await r[a]({app:e,router:t,store:n,ssrContext:null,redirect:o,urlPath:s,publicPath:sc})}catch(e){i||console.error(`[Quasar] boot error:`,e);return}i||(e.use(t),e.mount(`#q-app`))}Qs(A,$s).then(e=>{let[t,n]=Promise.allSettled===void 0?[`all`,e=>e.map(e=>e.default)]:[`allSettled`,e=>e.map(e=>{if(e.status===`rejected`){console.error(`[Quasar] boot error:`,e.reason);return}return e.value.default})];return Promise[t]([$(()=>import(`./i18n-C-chrpJN.js`),[]),$(()=>import(`./network-auth-BP2CrR3z.js`),[]),$(()=>import(`./notify-theme-DIVwJeyL.js`),[])]).then(t=>{cc(e,n(t).filter(e=>typeof e==`function`))})});export{ir as $,si as A,Wr as B,wi as C,gi as D,_i as E,ei as F,zr as G,Ur as H,$r as I,fr as J,kr as K,ai as L,ti as M,Zr as N,bi as O,Yr as P,rr as Q,ii as R,Pi as S,xi as T,Vr as U,q as V,Br as W,ar as X,sr as Y,nr as Z,Ki as _,W as _t,Wa as a,Pn as at,Li as b,U as bt,Ma as c,on as ct,Sa as d,qt as dt,er as et,ya as f,Jt as ft,Wi as g,Ot as gt,Hi as h,kt as ht,Ua as i,Ln as it,Xr as j,vi as k,Aa as l,tn as lt,J as m,At as mt,so as n,Qn as nt,La as o,Nn as ot,qi as p,Wt as pt,pr as q,oo as r,Mn as rt,Na as s,Fn as st,$ as t,$n as tt,Da as u,Zt as ut,Ri as v,yt as vt,Ci as w,Ii as x,zi as y,bt as yt,ri as z};
|
|
82
|
+
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Opzione B — Prendere la proprietà (più semplice, perde la traccia "creato da root nel container" ma raramente conta):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Suggerimento: puoi eseguire questi comandi direttamente sulla root dei worktrees (es. `~/.worktrees/`) per coprire tutti i workspace esistenti E futuri in un colpo solo. Una volta fatto, la pulizia Kōbō funzionerà senza errori di permessi.","contextMenu.runSetup":`Esegui script di setup`,"contextMenu.exportEvents":`Esporta eventi (CSV)`,"contextMenu.dismissChangesRequested":`Segna «Modifiche richieste» come visto`,"contextMenu.dismissCiFailure":`Segna «CI in errore» come visto`,"contextMenu.restoreChangesRequested":`Segna «Modifiche richieste» come non visto`,"contextMenu.restoreCiFailure":`Segna «CI in errore» come non visto`,"contextMenu.exportingEvents":`Preparazione dell'esportazione…`,"contextMenu.exportEventsError":`Esportazione degli eventi non riuscita`,"contextMenu.openNotion":`Apri in Notion`,"contextMenu.openSentry":`Apri in Sentry`,"contextMenu.openPr":`Apri PR`,"contextMenu.ignorePrWatch":`Ignora i controlli PR`,"contextMenu.resumePrWatch":`Riprendi i controlli PR`,"contextMenu.prWatchToggleFailed":`Aggiornamento dei controlli PR non riuscito`,"workspace.favorite":`Segna come preferito`,"workspace.unfavorite":`Rimuovi dai preferiti`,"workspace.showFavoritesOnly":`Mostra solo i preferiti`,"workspace.searchArchivedToggle":`Cerca anche nei workspace archiviati`,"workspace.descriptionPlaceholder":`Aggiungi una breve descrizione`,"workspace.descriptionDialogHint":`Testo semplice, massimo 200 caratteri. Lasciare vuoto per cancellare.`,"workspace.descriptionTooLong":`La descrizione deve avere al massimo 200 caratteri.`,"workspace.descriptionSaveFailed":`Impossibile salvare la descrizione.`,"workspace.agentDescriptionTooltip":`Stato live mantenuto dall'agente`,"mcp.tool.setWorkspaceDescription":`Imposta la breve descrizione del workspace (≤ 200 caratteri).`,"tags.manage":`Gestisci tag`,"tags.manageTitle":`Gestisci i tag del workspace`,"tags.noTagsDefined":`Nessun tag definito. Aggiungine in Impostazioni > Globale > Tag.`,"tags.orphanedHint":`{count} tag non sono più nel catalogo globale. Deseleziona per rimuoverli.`,"settings.tagsTitle":`Tag dei workspace`,"settings.tagsHint":`Definisci i tag assegnabili ai workspace. Digita per aggiungere, clicca la croce per rimuovere.`,"settings.tagsLabel":`Tag disponibili`,"settings.branchPrefixesTitle":`Prefissi di branch`,"settings.branchPrefixesHint":`Gestisci i prefissi di branch Git disponibili nella pagina di creazione del workspace. Il primo è preselezionato per impostazione predefinita.`,"settings.branchPrefixesEmpty":`Nessun prefisso di branch definito. Aggiungine almeno uno qui sotto.`,"settings.branchPrefixesAddLabel":`Nuovo prefisso`,"settings.branchPrefixesEditHint":`Clicca per rinominare`,"settings.branchPrefixesMoveUp":`Sposta su`,"settings.branchPrefixesMoveDown":`Sposta giù`,"settings.worktreesTitle":`Worktree Git`,"settings.worktreesHint":`Scegli dove creare i worktree dei nuovi workspace. I percorsi relativi sono risolti dal progetto; sono supportati percorsi assoluti Linux/macOS e Windows, $HOME, ~ e %USERPROFILE%.`,"settings.worktreesPathLabel":`Percorso worktree`,"settings.worktreesPathRequired":`Il percorso worktree è obbligatorio.`,"settings.worktreesPrefixByProject":`Aggiungi il nome del progetto come prefisso ai worktree`,"settings.worktreesPrefixByProjectHint":`Posiziona ogni worktree in una sottocartella con il nome del progetto per evitare collisioni quando più progetti condividono la stessa radice.`,"settings.shareTitle":`Condividi configurazione`,"settings.shareHint":`Esporta impostazioni, template e tag come bundle JSON. Le chiavi MCP sono escluse per sicurezza.`,"settings.exportConfig":`Esporta`,"settings.importConfig":`Importa`,"settings.exportSuccess":`Configurazione esportata`,"settings.importSuccess":`Configurazione importata`,"settings.importConfirmTitle":`Importa configurazione`,"settings.importConfirmMessage":`Questo sostituirà le tue impostazioni, template e tag attuali. Le chiavi MCP vengono preservate. Continuare?`,"settings.network.title":`Accesso di rete`,"settings.network.hint":`Controlla Kōbō da un altro dispositivo della tua LAN affidabile. Off = solo localhost. On = raggiungibile sulla rete, protetto da un token. Riavvia Kōbō dopo il cambio.`,"settings.network.enable":`Abilita accesso di rete`,"settings.network.behindProxy":`Dietro un reverse proxy`,"settings.network.behindProxyHint":`Kōbō non può più distinguere la tua macchina da una richiesta inoltrata — anche localhost dovrà presentare il token d'ora in poi. Attivalo solo se un reverse proxy (Traefik, nginx, Caddy…) si trova davanti a Kōbō.`,"settings.network.restartRequired":`Riavvia Kōbō per applicare il nuovo indirizzo di bind.`,"settings.network.token":`Token di accesso`,"settings.network.copy":`Copia`,"settings.network.copied":`Copiato`,"settings.network.regenerate":`Rigenera`,"settings.network.regenerateConfirm":`Rigenerare il token? I dispositivi connessi avranno bisogno del nuovo token.`,"settings.network.urls":`URL LAN`,"settings.network.scan":`Scansiona per connetterti`,"settings.network.noUrls":`Nessun indirizzo LAN rilevato.`,"settings.network.loadFailed":`Impossibile caricare le impostazioni di accesso di rete.`,"settings.network.updateFailed":`Impossibile aggiornare le impostazioni di accesso di rete.`,"settings.unsavedChanges.title":`Modifiche non salvate`,"settings.unsavedChanges.message":`Questo progetto ha modifiche non salvate. Cambiando progetto andranno perse.`,"settings.unsavedChanges.discard":`Scarta e cambia`,"settings.unsavedChanges.cancel":`Annulla`,"settings.loadFailed":`Impossibile caricare le impostazioni`,"settings.loadFailedHint":`Il salvataggio è disattivato: il modulo mostra i valori predefiniti e scriverli sovrascriverebbe la tua configurazione reale.`,"health.title":`Stato`,"health.tooltip":`Stato del sistema`,"changelog.title":`Changelog`,"changelog.tooltip":`Novità di Kōbō`,"changelog.empty":`Nessun changelog disponibile.`,"changelog.current":`corrente`,"changelog.currentVersion":`Versione corrente: v{version}`,"health.envTitle":`Ambiente`,"health.version":`Versione`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Database`,"health.dbPath":`Percorso`,"health.dbSize":`Dimensione`,"health.schemaVersion":`Versione schema`,"health.settingsSchemaVersion":`Schema impostazioni`,"health.runtimesTitle":`Runtime agente`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude non trovato nel PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binario codex non risolvibile`,"health.forgeCliTitle":`CLI di forge (gh / glab)`,"health.forgeCliMissing":`Né gh né glab trovati — pull request e monitoraggio CI non disponibili`,"health.workspacesTitle":`Workspace`,"health.workspacesCount":`{total} totali, {archived} archiviati`,"health.worktreesMissing":`{count} worktree mancanti sul disco`,"health.sessionsTitle":`Sessioni agente`,"health.sessionsOrphaned":`{n} sessione/sessioni orfana/e in esecuzione`,"health.integrationsTitle":`Integrazioni`,"health.integrationConfigured":`configurata`,"health.integrationMissing":`non configurata`,"health.integrationDisabled":`disabilitata`,"settings.integrationEnabled":`Attiva integrazione`,"health.activeTitle":`Stato attivo`,"health.activeQuotaBackoffs":`Quota backoff in attesa`,"health.activeWakeups":`Wakeup programmati`,"health.activeAutoLoop":`Auto-loop in esecuzione`,"health.activeAgentSessions":`Sessioni agente attive`,"health.activeDevServers":`Dev server in esecuzione`,"health.noneActive":`Nessuno.`,"health.quotaResumeAt":`riprende alle {time}`,"health.wakeupAt":`sveglia alle {time}`,"health.startedAgo":`avviata {time} fa`,"health.autoLoopReady":`pronto, in iterazione`,"health.autoLoopGrooming":`grooming in corso`,"session.started":`Sessione avviata`,"session.ended":`Sessione terminata`,"session.compacted":`Contesto compattato`,"session.endedCompleted":`Turno terminato — invia un messaggio per continuare`,"session.endedKilled":`Sessione interrotta`,"session.endedError":`Sessione terminata con un errore`,"session.endedWatchdog":`Sessione chiusa forzatamente dopo un periodo di inattività`,"tool.running":`In corso...`,"activity.raw_lines":`Righe di output grezze ({n})`,"activity.loading_older":`Caricamento messaggi precedenti…`,"activity.compacting":`Compattazione del contesto…`,"activity.prev_user_message":`Messaggio utente precedente`,"activity.scroll_to_bottom":`Scorri in fondo`,"activity.empty":`Ancora nulla`,"activity.emptyHint":`L’output dell’agente comparirà qui appena una sessione parte.`,"activity.a11y.region":`Annunci di attività dell’agente`,"activity.a11y.agentSaid":`Agente: {text}`,"activity.a11y.toolStarted":`Strumento {name} avviato`,"activity.a11y.toolFinished":`Strumento {name} completato`,"activity.a11y.toolFailed":`Strumento {name} fallito`,"chat.systemPrompt":`Prompt di sistema`,"chat.agent":`Agente`,"chat.cleanupScript":`Script di pulizia`,"chat.archiveScript":`Script di archiviazione`,"chat.setupScript":`Script di setup`,"chat.scriptDone":`Fatto`,"chat.scriptComplete":`[{phase}] Completato`,"chat.scriptError":`[{phase}] Errore: {message}`,"chat.unknownError":`sconosciuto`,"chat.you":`Tu`,"chat.session":`Sessione`,"chat.nActions":`{n} azione | {n} azioni`,"chat.lastUpdatedAt":`Ultimo aggiornamento alle {time}`,"chat.scrollToTurnTop":`Scorri all'inizio del messaggio`,"migration.backing_up":`Backup del database in corso…`,"migration.running":`Migrazione dei dati dell'agente — {processed}/{total}`,"migration.error":`Migrazione non riuscita`,"migration.backup_location":`Un backup è stato salvato in {path}. Riavvia Kōbō per riprovare.`,"migration.retry":`Riavvia Kōbō per riprovare.`,"engine.select":`Engine`,"engine.model":`Modello`,"engine.effort":`Livello di ragionamento`,"wakeup.scheduledIn":`Prossimo risveglio tra {n}s`,"wakeup.scheduledAt":`Prossimo risveglio alle {time}`,"wakeup.firing":`Risveglio in corso...`,"wakeup.reason":`Motivo: {reason}`,"wakeup.cancel":`Annulla questo risveglio`,"wakeup.pendingIndicator":`Risveglio programmato`,"cron.pendingIndicator":`{n} cron programmato/i`,"schedule.tabLabel":`Pianificazione`,"schedule.panelTitle":`Automazione`,"schedule.panelDescription":`Risvegliare questo workspace più tardi o eseguire istruzioni secondo una pianificazione.`,"schedule.activeTitle":`Pianificazioni attive`,"schedule.emptyTitle":`Nessuna pianificazione`,"schedule.emptyDescription":`Crea un wakeup singolo o un’attività ricorrente qui sotto.`,"schedule.cancelWakeup":`Annulla questo wakeup`,"schedule.cancelCron":`Elimina questa attività ricorrente`,"schedule.createTitle":`Crea una pianificazione`,"schedule.createDescription":`Scegli quando e come deve essere eseguito l'agente.`,"schedule.typeWakeup":`Wakeup singolo`,"schedule.typeRecurring":`Attività ricorrente`,"schedule.wakeupDescription":`Esegui il prompt una volta dopo un intervallo.`,"schedule.cronDescription":`Esegui il prompt periodicamente con una frequenza fissa.`,"schedule.promptHint":`Istruzioni che verranno inviate all'agente`,"schedule.frequencyTitle":`Frequenza`,"schedule.advancedDescription":`Usa un’espressione cron grezza`,"schedule.cronExpressionLabel":`Espressione cron`,"schedule.sessionModeTitle":`Sessione di esecuzione`,"schedule.modeResume":`Riprendi sessione`,"schedule.oneShotHint":`Rimuovi questa pianificazione dopo la prima esecuzione.`,"schedule.wakeupTitle":`Wakeup in attesa`,"schedule.cronsTitle":`Pianificazioni ricorrenti`,"schedule.noWakeup":`Nessun wakeup pianificato`,"schedule.noCrons":`Nessun cron pianificato`,"schedule.nextFireAt":`prossimo alle {time}`,"schedule.lastFiredAt":`ultimo {time} fa`,"schedule.addCronTitle":`Aggiungi un'attività ricorrente`,"schedule.addWakeupTitle":`Programma un wakeup`,"schedule.every":`Ogni`,"schedule.unitMinutes":`minuti`,"schedule.unitHours":`ore`,"schedule.unitDays":`giorni`,"schedule.daysDriftWarning":`L'intervallo può ridursi a 1 giorno a fine mese (limite di cron).`,"schedule.advancedExpression":`Espressione avanzata (opzionale)`,"schedule.advancedHint":`Cron grezzo (es. */15 * * * *) o {'@'}hourly/{'@'}daily — sostituisce il selettore se compilato.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Etichetta (opzionale)`,"schedule.delayMinutes":`Ritardo (minuti)`,"schedule.modeFresh":`Nuova sessione`,"schedule.oneShot":`Esegui una sola volta`,"schedule.addCronBtn":`Aggiungi cron`,"schedule.addWakeupBtn":`Programma wakeup`,"schedule.cronCreated":`Attività ricorrente aggiunta`,"schedule.wakeupCreated":`Wakeup programmato`,"askUserQuestion.title":`L'agente sta facendo una domanda`,"askUserQuestion.submit":`Invia risposta`,"askUserQuestion.multiSelectHint":`Seleziona una o più opzioni`,"askUserQuestion.otherOption":`Altro`,"askUserQuestion.otherOptionHint":`specifica nel prossimo messaggio`,"askUserQuestion.freeFormLabel":`Specifica la tua risposta`,"askUserQuestion.freeFormHint":`Questa risposta verrà inviata direttamente all'agente.`,"askUserQuestion.noPending":`Nessuna domanda in attesa`,"askUserQuestion.next":`Avanti`,"askUserQuestion.previous":`Indietro`,"askUserQuestion.cancel":`Annulla`,"askUserQuestion.cancelTooltip":`Salta questa domanda — l'agente proseguirà senza risposta`,"askUserQuestion.collapse":`Riduci il pannello della domanda`,"askUserQuestion.expand":`Espandi il pannello della domanda`,"permissionRequest.title":`L'agente vuole usare uno strumento`,"permissionRequest.allow":`Consenti`,"permissionRequest.allowOnce":`Consenti una volta`,"permissionRequest.allowTurn":`Consenti questo turno`,"permissionRequest.allowOperation":`Consenti sempre questa operazione`,"permissionRequest.allowTool":`Consenti sempre questo strumento`,"permissionRequest.deny":`Nega`,"permissionRequest.tool":`Strumento`,"permissionRequest.input":`Input`,"permissionRequest.rawInput":`Dettagli tecnici`,"permissionRequest.collapse":`Riduci il pannello dei permessi`,"permissionRequest.expand":`Espandi il pannello dei permessi`,"permissionRequest.denied":`negato dall'utente`,"workspaceStatus.created":`creato`,"workspaceStatus.extracting":`estrazione`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.executing":`in corso`,"workspaceStatus.awaitingUser":`in attesa della tua risposta`,"workspaceStatus.completed":`completato`,"workspaceStatus.idle":`inattivo`,"workspaceStatus.error":`errore`,"workspaceStatus.quota":`quota raggiunta`,"workspaceStatus.retrying":`ripresa automatica`,"workspaceList.prOpen":`#{n} — Pull request aperta`,"workspaceList.prWatchDisabledIndicator":`Controlli PR ignorati per questo workspace`,"workspaceList.prChangesRequested":`#{n} — Modifiche richieste`,"workspaceList.attentionCiFailed":`CI fallita`,"workspaceList.attentionChangesRequested":`Modifiche richieste`,"workspaceList.attentionReadyToMerge":`Pronto per il merge`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Avvia l'auto-loop`,"autoLoop.prepare":`Prepara per l'auto-loop`,"autoLoop.reprepare":`Ri-prepara per l'auto-loop`,"autoLoop.reprepareTooltip":`Rilancia la fase di grooming per aggiungere o aggiornare le attività prima di riavviare il loop`,"autoLoop.prepareBusy":`Attendi che l'agente finisca prima di preparare`,"autoLoop.forceReady":`So cosa faccio — salta la preparazione`,"autoLoop.forceReadyConfirm":`Saltare la preparazione e segnare auto-loop pronto? Il loop potrebbe bloccarsi se le attività non sono atomiche.`,"autoLoop.stop":`Ferma l'auto-loop`,"autoLoop.notReady":`Esegui prima «Prepara per l'auto-loop»`,"autoLoop.noTasks":`Aggiungi prima delle attività`,"autoLoop.progress":`Auto-loop · {done}/{total} attività`,"autoLoop.preparing":`Auto-loop · preparazione`,"autoLoop.preparingTooltip":`Grooming in corso — l'agente sta creando / revisionando le attività. Il loop partirà quando chiamerà mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop in corso`,"autoLoop.startInMode":`Avvia in modalità auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Modello usato solo per la sessione di brainstorming iniziale — ogni attività successiva usa il modello scelto sopra`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Livello di ragionamento usato solo per la sessione di brainstorming iniziale`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Modello usato per ogni attività dell'auto-loop dopo la sessione di brainstorming iniziale`,"autoLoop.sessionMode.perTask":`Nuova sessione per attività`,"autoLoop.sessionMode.label":`Sessione:`,"autoLoop.sessionMode.perTaskTooltip":`Ogni attività avvia una nuova sessione Claude Code senza memoria delle attività precedenti`,"autoLoop.sessionMode.continuous":`Sessione continua`,"autoLoop.sessionMode.continuousTooltip":`Tutte le attività si susseguono nella stessa sessione — l'agente mantiene tutto il contesto, ma la sessione si allunga nel tempo`,"koboCommand.prepAutoloopDesc":`Preparare le attività per la modalità auto-loop (atomicità)`,"staleSessionBanner.title":`Auto-loop in corso`,"staleSessionBanner.message":`Stai visualizzando una sessione precedente — l'agente sta lavorando nella più recente.`,"staleSessionBanner.staleTitle":`Sessione precedente`,"staleSessionBanner.staleMessage":`Stai visualizzando una sessione precedente — i messaggi inviati andranno a questa sessione, non alla più recente.`,"staleSessionBanner.switchToCurrent":`Passa a quella corrente`,"network.login.title":`Accesso di rete`,"network.login.description":`Questo Kōbō richiede un token per essere controllato dalla rete. Incolla il token mostrato nelle Impostazioni sulla macchina host.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Incolla il tuo token`,"network.login.connect":`Connetti`,"network.login.invalid":`Token non valido`,"network.login.serverError":`Errore del server — riprova.`,"network.login.unreachable":`Kōbō non è raggiungibile — controlla la connessione.`,"layout.toggleWorkspaces":`Mostra/nascondi il pannello degli spazi`,"layout.togglePanel":`Mostra/nascondi il pannello laterale`,"unsaved.title":`Uscire senza salvare?`,"unsaved.message":`Hai modifiche non salvate. Uscire da questa pagina le scarta.`,"unsaved.leave":`Esci`,"unsaved.stay":`Resta`,"prCheckout.staleRetriesExhausted":`Lo stato del repository ha continuato a cambiare mentre applicavamo le tue scelte. Chiudi questa finestra e riprova dal selettore delle pull request.`,"prPicker.title":`Importa da una pull request`,"prPicker.filterAll":`Tutte`,"prPicker.filterMine":`Le mie`,"prPicker.filterReviewRequested":`Revisione richiesta`,"prPicker.searchPlaceholder":`Cerca pull request…`,"prPicker.loadMore":`Carica altre`,"prPicker.empty":`Nessuna pull request aperta corrisponde.`,"prPicker.forkNotSupported":`Questa PR proviene da un fork; Kōbō non può eseguirne il checkout.`,"prPicker.loadFailed":`Impossibile caricare le pull request.`,"prPicker.badge.workspaceExists":`Già aperta in Kōbō`,"prPicker.badge.worktreePresent":`Worktree presente`,"prPicker.badge.localBranch":`Branch locale`,"prPicker.badge.new":`Nuova`,"prPicker.badge.draft":`Bozza`,"prCheckout.title":`Prepara la worktree`,"prCheckout.apply":`Applica`,"prCheckout.cancel":`Annulla`,"prCheckout.retry":`Riprova`,"prCheckout.diagnoseFailed":`Impossibile diagnosticare la pull request.`,"prCheckout.resolveFailed":`Impossibile risolvere il checkout della pull request.`,"prCheckout.path.required":`Inserisci un percorso di worktree che non esista già.`,"prCheckout.workspace.restoreNotAvailable":"Il ripristino di un workspace eliminato non è ancora disponibile da qui. Ricrea la sua cartella worktree su disco (ad es. con `git worktree add`) e Kōbō la ricollegherà automaticamente entro circa 30 secondi.","prCheckout.staleReloaded":`Il repository è cambiato; la diagnosi è stata aggiornata.`,"prCheckout.step.blocked":`Impossibile continuare`,"prCheckout.step.path":`Posizione della worktree`,"prCheckout.step.workspace":`Workspace esistente`,"prCheckout.step.worktree":`Worktree esistente`,"prCheckout.step.operation":`Operazione git in corso`,"prCheckout.step.changes":`Modifiche non commitate`,"prCheckout.step.divergence":`Branch locale vs origin`,"prCheckout.workspace.activeHint":`Un workspace chiamato "{name}" segue già questo branch.`,"prCheckout.workspace.open":`Apri quel workspace`,"prCheckout.workspace.continue":`Continua su un altro percorso`,"prCheckout.workspace.unarchive":`Ripristina e aprilo`,"prCheckout.workspace.restore":`Ricrea la sua worktree`,"prCheckout.worktree.orphanHint":`Esiste già una worktree su questo branch in {path}.`,"prCheckout.worktree.attach":`Collegala`,"prCheckout.worktree.createElsewhere":`Creane un'altra altrove`,"prCheckout.operation.hint":`Un {operation} è in corso in quella worktree.`,"prCheckout.operation.abort":`Interrompilo`,"prCheckout.operation.cancel":`Lascialo stare e fermati qui`,"prCheckout.changes.hint":`{modified} modificati, {staged} in stage, {untracked} non tracciati.`,"prCheckout.changes.stash":`Metti in stash`,"prCheckout.changes.commit":`Fai il commit`,"prCheckout.changes.discard":`Scartale (conservate in uno stash etichettato)`,"prCheckout.changes.keep":`Lasciale come sono`,"prCheckout.divergence.behindHint":`Il tuo branch è indietro di {behind} commit rispetto a origin.`,"prCheckout.divergence.aheadHint":`Il tuo branch ha {ahead} commit non pushati.`,"prCheckout.divergence.divergedHint":`{ahead} avanti, {behind} indietro rispetto a origin.`,"prCheckout.divergence.fastForward":`Fast-forward su origin`,"prCheckout.divergence.rebase":`Rebase su origin`,"prCheckout.divergence.resetHard":`Reimposta su origin (viene prima creato un branch di backup)`,"prCheckout.divergence.keep":`Mantieni lo stato locale`,"prCheckout.blocked.forgeUnavailable":`Il CLI della forge manca o non è autenticato.`,"prCheckout.blocked.forkPr":`Questa PR proviene da un fork; Kōbō non può eseguirne il checkout.`,"prCheckout.blocked.headBranchDeleted":`Il branch non esiste più sul remote.`,"prCheckout.blocked.indexLock":`È in corso un altro processo git (index.lock è presente).`,"prCheckout.blocked.pathOccupied":`{path} esiste già e non è una worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} è una worktree su un altro branch ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Esiste già un branch locale chiamato {branch} con una storia non correlata.`},Fr=`kobo:locale`,Ir=[`en`,`fr`,`de`,`es`,`it`];function Lr(e){return Ir.includes(e)}function Rr(){let e=localStorage.getItem(Fr);if(e&&Lr(e))return e;let t=navigator.language.split(`-`)[0];return t&&Lr(t)?(localStorage.setItem(Fr,t),t):(localStorage.setItem(Fr,`en`),`en`)}var zr=Rr(),Br=t({legacy:!1,locale:zr,fallbackLocale:`en`,messages:{en:jr,fr:Nr,de:Ar,es:Mr,it:Pr}});function Vr(e){typeof document>`u`||(document.documentElement.lang=e)}Vr(zr);var Hr=5e3,Ur=Ie(`agent-stream`,()=>{let e=i(new Map),t=i(new Map),n=i(new Map),r=i(new Map),a=i(new Map),o=i(new Map),s=i(new Map),c=i(new Map),l=i(new Map);function u(e){l.value.get(e)}function d(e){l.value.set(e,(l.value.get(e)??0)+1)}function f(e){return l.value.get(e)??0}function p(e){let t=c.value.get(e);return t||(t=new Set,c.value.set(e,t)),t}function m(e){return u(e),s.value.get(e)??!1}function h(e,t){(s.value.get(e)??!1)!==t&&(s.value.set(e,t),d(e))}function g(t){return u(t),e.value.get(t)??[]}function _(e){return u(e),t.value.get(e)??[]}function v(e){return u(e),n.value.get(e)??[]}function y(e){return u(e),r.value.get(e)??[]}function b(e){return u(e),a.value.get(e)}function x(e){return u(e),o.value.get(e)??!0}function S(i,o,s,c,l){let u=e.value.get(i)??[],f=t.value.get(i)??[],m=n.value.get(i)??[],h=r.value.get(i)??[],g=p(i);if(c&&g.has(c))return;let _=u.length===0;u.push(o),f.push(s??new Date().toISOString()),m.push(l??null),h.push(c??null),c&&g.add(c),e.value.set(i,u),t.value.set(i,f),n.value.set(i,m),r.value.set(i,h),_&&c&&a.value.set(i,c),C(i,u,f,m,h),d(i)}function C(e,t,n,r,i){let s=t.length-Hr;if(s<=0)return;let c=i.slice(0,s),l=p(e);for(let e of c)e&&l.delete(e);t.splice(0,s),n.splice(0,s),r.splice(0,s),i.splice(0,s);let u=i.find(e=>typeof e==`string`);u?a.value.set(e,u):a.value.delete(e),o.value.set(e,!0)}function w(i,o,s,c){let l=e.value.get(i)??[],u=t.value.get(i)??[],f=n.value.get(i)??[],m=r.value.get(i)??[],h=p(i),g=[];for(let e=0;e<o.length;e++){let t=o[e];if(!t)continue;let n=c.eventIds[e]??null;n&&h.has(n)||(l.push(t),u.push(s[e]??new Date().toISOString()),f.push(c.sessionIds[e]??null),m.push(n),n&&h.add(n),g.push(e))}if(g.length===0)return g;if(e.value.set(i,l),t.value.set(i,u),n.value.set(i,f),r.value.set(i,m),!a.value.has(i)){let e=m.find(e=>typeof e==`string`);e&&a.value.set(i,e)}return C(i,l,u,f,m),d(i),g}function T(i,s,c,l){e.value.set(i,[...s]),t.value.set(i,c?[...c]:s.map(()=>new Date().toISOString())),n.value.set(i,l?.sessionIds?[...l.sessionIds]:s.map(()=>null));let u=l?.eventIds?[...l.eventIds]:s.map(()=>null);r.value.set(i,u);let f=p(i);f.clear();for(let e of u)e&&f.add(e);l?.oldestId?a.value.set(i,l.oldestId):a.value.delete(i),l&&typeof l.hasMoreOlder==`boolean`?o.value.set(i,l.hasMoreOlder):o.value.delete(i),d(i)}function E(i,s,c,l){if(s.length===0){o.value.set(i,l.hasMoreOlder),d(i);return}let u=e.value.get(i)??[],f=t.value.get(i)??[],m=n.value.get(i)??[],h=r.value.get(i)??[],g=l.sessionIds??s.map(()=>null),_=l.eventIds??s.map(()=>null);e.value.set(i,[...s,...u]),t.value.set(i,[...c,...f]),n.value.set(i,[...g,...m]),r.value.set(i,[..._,...h]);let v=p(i);for(let e of _)e&&v.add(e);l.oldestId&&a.value.set(i,l.oldestId),o.value.set(i,l.hasMoreOlder),d(i)}function D(i,a){let o=e.value.get(i),s=r.value.get(i);if(!o||!s)return;let c=s.indexOf(a);if(c===-1)return;let l=t.value.get(i),u=n.value.get(i);o.splice(c,1),s.splice(c,1),l&&l.splice(c,1),u&&u.splice(c,1),p(i).delete(a),d(i)}function O(i){e.value.delete(i),t.value.delete(i),n.value.delete(i),r.value.delete(i),a.value.delete(i),o.value.delete(i),s.value.delete(i),c.value.delete(i),d(i)}return{events:e,timestamps:t,sessionIds:n,eventIds:r,versions:l,versionFor:f,eventsFor:g,timestampsFor:_,sessionIdsFor:v,eventIdsFor:y,oldestIdFor:b,hasMoreOlderFor:x,isCompacting:m,setCompacting:h,append:S,merge:w,reset:T,prepend:E,removeByEventId:D,clear:O}}),Wr=class extends Error{constructor(e,t,n,r){super(e),on(this,`status`,void 0),on(this,`code`,void 0),on(this,`body`,void 0),this.name=`ApiError`,this.status=t,this.code=n,this.body=r}},Gr=class extends Error{constructor(e){super(`Request timed out after ${e} ms`),on(this,`timeoutMs`,void 0),this.name=`ApiTimeoutError`,this.timeoutMs=e}},Kr=3e4;function qr(e,t){let n=e.trim();if(n.length===0)return{message:`HTTP ${t}`,code:void 0};try{let e=JSON.parse(n),r=typeof e.code==`string`?e.code:void 0;return typeof e.error==`string`&&e.error.length>0?{message:e.error,code:r}:typeof e.message==`string`&&e.message.length>0?{message:e.message,code:r}:{message:`HTTP ${t}`,code:r}}catch{return{message:n.slice(0,500),code:void 0}}}async function q(e,t={}){let{body:n,timeoutMs:r=Kr,signal:i,headers:a,...o}=t,s=new AbortController,c=!1,l=r>0?setTimeout(()=>{c=!0,s.abort()},r):null,u=()=>s.abort();i?.addEventListener(`abort`,u);let d={...o,signal:s.signal};n===void 0?a&&(d.headers=a):typeof n==`string`||n instanceof FormData||n instanceof Blob?(d.body=n,a&&(d.headers=a)):(d.body=JSON.stringify(n),d.headers={"Content-Type":`application/json`,...a??{}});let f;try{f=await fetch(e,d)}catch(e){throw c?new Gr(r):e}finally{l!==null&&clearTimeout(l),i?.removeEventListener(`abort`,u)}if(!f.ok){let e=await f.text().catch(()=>``),{message:t,code:n}=qr(e,f.status);throw new Wr(t,f.status,n,e)}if(f.status===204)return;let p=await f.text();if(p.length!==0)try{return JSON.parse(p)}catch(e){throw new Wr(`Server returned a non-JSON body for a successful response: ${e instanceof Error?e.message:String(e)}`,f.status,void 0,p)}}var Jr=`/sounds`,Yr=[{id:`basic-notification.mp3`,labelKey:`settings.notificationSoundBasic`},{id:`hey.mp3`,labelKey:`settings.notificationSoundHey`},{id:`warcraft-3-humain-travail.mp3`,labelKey:`settings.notificationSoundWorkspaceCreated`},{id:`travail_termine.mp3`,labelKey:`settings.notificationSoundTravailTermine`},{id:`faaah.mp3`,labelKey:`settings.notificationSoundFaaah`},{id:`ca_va_peter.mp3`,labelKey:`settings.notificationSoundCaVaPeter`},{id:`dry-fart.mp3`,labelKey:`settings.notificationSoundDryFart`},{id:`for-shure.mp3`,labelKey:`settings.notificationSoundForShure`},{id:`7eme-compagnie-03.mp3`,labelKey:`settings.notificationSoundSeptiemeCompagnie03`},{id:`aller-ftg.mp3`,labelKey:`settings.notificationSoundAllerFtg`},{id:`arrete-de-mentir.mp3`,labelKey:`settings.notificationSoundArreteDeMentir`},{id:`arretez-les-messages.mp3`,labelKey:`settings.notificationSoundArretezLesMessages`},{id:`bah-alors-on-est-nul.mp3`,labelKey:`settings.notificationSoundBahAlorsOnEstNul`},{id:`gta-v-death.mp3`,labelKey:`settings.notificationSoundGtaVDeath`},{id:`nan-tu-degages.mp3`,labelKey:`settings.notificationSoundNanTuDegages`},{id:`nan-wallah-pardon.mp3`,labelKey:`settings.notificationSoundNanWallahPardon`},{id:`ouais-cest-greg.mp3`,labelKey:`settings.notificationSoundOuaisCestGreg`},{id:`pas-ca-zinedine.mp3`,labelKey:`settings.notificationSoundPasCaZinedine`},{id:`ta-gueule.mp3`,labelKey:`settings.notificationSoundTaGueule`},{id:`tu-vas-la-fermer.mp3`,labelKey:`settings.notificationSoundTuVasLaFermer`},{id:`yaaa.mp3`,labelKey:`settings.notificationSoundYaaa`},{id:`mais-laisse-moi-dormir-zebi.mp3`,labelKey:`settings.notificationSoundMaisLaisseMoiDormirZebi`}],Xr=`hey.mp3`,Zr=`inherit`,Qr=`none`,$r=[`audioPrCiFailedSound`,`audioPrCiRecoveredSound`,`audioPrChangesRequestedSound`,`audioPrApprovedSound`,`audioPrMergeConflictSound`,`audioPrReadyToMergeSound`,`audioPrMergedSound`],ei=[`audioPrCiFailedEnabled`,`audioPrCiFailedVolume`,`audioPrCiRecoveredEnabled`,`audioPrCiRecoveredVolume`,`audioPrChangesRequestedEnabled`,`audioPrChangesRequestedVolume`,`audioPrApprovedEnabled`,`audioPrApprovedVolume`,`audioPrMergeConflictEnabled`,`audioPrMergeConflictVolume`,`audioPrReadyToMergeEnabled`,`audioPrReadyToMergeVolume`,`audioPrMergedEnabled`,`audioPrMergedVolume`],ti={audioPrCiFailedSound:Zr,audioPrCiRecoveredSound:Zr,audioPrChangesRequestedSound:Zr,audioPrApprovedSound:Zr,audioPrMergeConflictSound:Zr,audioPrReadyToMergeSound:Zr,audioPrMergedSound:Zr,audioPrCiFailedEnabled:!1,audioPrCiFailedVolume:1,audioPrCiRecoveredEnabled:!1,audioPrCiRecoveredVolume:1,audioPrChangesRequestedEnabled:!1,audioPrChangesRequestedVolume:1,audioPrApprovedEnabled:!1,audioPrApprovedVolume:1,audioPrMergeConflictEnabled:!1,audioPrMergeConflictVolume:1,audioPrReadyToMergeEnabled:!1,audioPrReadyToMergeVolume:1,audioPrMergedEnabled:!1,audioPrMergedVolume:1};function ni(e){return Yr.some(t=>t.id===e)}function ri(e){return e&&ni(e)?e:Xr}function ii(e){if(e===`none`)return null;if(e!==`inherit`)return typeof e==`string`&&ni(e)?e:void 0}function ai(e){let t=ii(e);return t===null?Qr:t??`inherit`}function oi(e){return`${Jr}/${ri(e)}`}var si=`mod+shift+x`,ci=[`mod`,`ctrl`,`meta`,`alt`,`shift`],li=new Set([`mod+w`,`mod+shift+w`,`ctrl+w`,`ctrl+shift+w`,`meta+w`,`meta+shift+w`]),ui=new Set([`control`,...ci]);function di(e){return li.has(e)}function fi(e){if(typeof e!=`string`||e.length===0||e!==e.toLowerCase()||di(e))return null;let t=e.split(`+`);if(t.some(e=>e.length===0))return null;let n=t.at(-1);if(!n||!/^[a-z0-9][a-z0-9_-]*$/.test(n)||ui.has(n))return null;let r=t.slice(0,-1),i=new Set,a=-1;for(let e of r){let t=ci.indexOf(e);if(t<=a)return null;a=t,i.add(e)}return{modifiers:i,key:n}}var pi=new Set([`control`,`meta`,`alt`,`shift`]),mi={" ":`space`,"+":`plus`,"-":`minus`,"=":`equal`,",":`comma`,".":`period`,"/":`slash`,"\\":`backslash`,";":`semicolon`,"'":`quote`,"[":`bracketleft`,"]":`bracketright`,"`":`backquote`};function hi(e){let t=mi[e]??e.toLowerCase();return/^[a-z0-9][a-z0-9_-]*$/.test(t)?t:null}function gi(e=globalThis.navigator?.platform??``){return/mac|iphone|ipad|ipod/i.test(e)?`mac`:`other`}function _i(e,t){if(e.key===`Escape`)return{status:`cancelled`};if(pi.has(e.key.toLowerCase()))return{status:`pending`};let n=hi(e.key);if(!n)return{status:`pending`};let r=new Set;(t===`mac`?e.metaKey:e.ctrlKey)&&r.add(`mod`),t===`mac`&&e.ctrlKey&&r.add(`ctrl`),t===`other`&&e.metaKey&&r.add(`meta`),e.altKey&&r.add(`alt`),e.shiftKey&&r.add(`shift`);let i=[...ci.filter(e=>r.has(e)),n].join(`+`);return di(i)?{status:`reserved`}:{status:`accepted`,shortcut:i}}function vi(e,t,n){let r=fi(t),i=hi(e.key);if(!r||!i||i!==r.key)return!1;let a=r.modifiers.has(`ctrl`)||n===`other`&&r.modifiers.has(`mod`),o=r.modifiers.has(`meta`)||n===`mac`&&r.modifiers.has(`mod`);return e.ctrlKey===a&&e.metaKey===o&&e.altKey===r.modifiers.has(`alt`)&&e.shiftKey===r.modifiers.has(`shift`)}function yi(e){return{space:`Space`,arrowup:`↑`,arrowdown:`↓`,arrowleft:`←`,arrowright:`→`}[e]??e.toUpperCase()}function bi(e,t){let n=fi(e);return n?t===`mac`?`${[n.modifiers.has(`mod`)||n.modifiers.has(`meta`)?`⌘`:``,n.modifiers.has(`ctrl`)?`⌃`:``,n.modifiers.has(`alt`)?`⌥`:``,n.modifiers.has(`shift`)?`⇧`:``].join(``)}${yi(n.key)}`:[n.modifiers.has(`mod`)||n.modifiers.has(`ctrl`)?`Ctrl`:``,n.modifiers.has(`meta`)?`Meta`:``,n.modifiers.has(`alt`)?`Alt`:``,n.modifiers.has(`shift`)?`Shift`:``,yi(n.key)].filter(Boolean).join(`+`):e}var xi=`.worktrees`;function Si(e){return btoa(e).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}var Ci=Ie(`settings`,{state:()=>({global:{defaultModelByEngine:{"claude-code":`auto`,codex:`auto`},dangerouslySkipPermissions:!0,prPromptTemplate:``,reviewPromptTemplate:``,ciFixPromptTemplate:``,finalizationPrompt:``,notionInitialPromptTemplate:``,sentryInitialPromptTemplate:``,gitConventions:``,editorCommand:``,fileManagerCommand:``,terminalCommand:``,autoPurgeOnPrMerged:!1,autoLoopMaxRetries:5,wsEventsRetentionDays:0,wsEventsKeepPerWorkspace:0,browserNotifications:!0,audioNotifications:!0,audioQuestionNotifications:!1,audioWorkspaceCreatedNotifications:!1,audioAgentErrorNotifications:!1,audioNotificationSound:`hey.mp3`,audioQuestionSound:`inherit`,audioWorkspaceCreatedSound:`inherit`,audioAgentErrorSound:`inherit`,...ti,audioNotificationVolume:1,audioQuestionVolume:1,audioWorkspaceCreatedVolume:1,audioAgentErrorVolume:1,notionStatusProperty:``,notionInProgressStatus:``,notionAssigneeProperty:``,notionUserId:``,defaultPermissionModeByEngine:{"claude-code":`plan`,codex:`plan`},notionMcpKey:``,sentryMcpKey:``,bitbucketToken:``,bitbucketUsername:``,notionEnabled:!0,sentryEnabled:!0,showThinkingBlocks:!0,whipEnabled:!1,whipShortcut:si,whipVolume:1,tags:[],branchPrefixes:[],setupScript:``,cleanupScript:``,cleanupScriptMode:`no-tasks`,cleanupScriptOnlyOnChanges:!1,archiveScript:``,changeSourceBranchScript:``,worktreesPath:xi,worktreesPrefixByProject:!1,voiceEnabled:!1,voicePttKey:`alt`,voiceLanguage:`auto`,voiceModel:null,voiceCommandPath:``,voiceFfmpegPath:``,voiceTemperature:0,voicePrompt:``,voiceTranslateToEnglish:!1,voiceSuppressNonSpeechTokens:!0,flattenWorkspaceList:!1,skillSuite:`superpowers`,customReviewTemplate:``,customAutoLoopReviewGate:``,customAutoLoopGroomingIntro:``,customQaPromptTemplate:``,customBrainstormingInstruction:``},voiceModels:[],voiceModelsLoading:!1,voiceModelsDir:``,voiceRuntime:null,activeMcpServers:[],projects:[],loading:!1,loaded:!1,loadError:null,showVerboseSystemMessages:localStorage.getItem(`kobo:showVerboseSystemMessages`)===`true`}),getters:{getProjectByPath:e=>t=>e.projects.find(e=>e.path===t)??null,projectPaths:e=>e.projects.map(e=>e.path)},actions:{_assertLoaded(){if(!this.loaded)throw Error(`Settings were never loaded successfully — refusing to overwrite the stored configuration`)},async fetchSettings(){this.loading=!0;try{let e=await q(`/api/settings`);this.global=e.global,this.projects=e.projects,this.loadError=null,this.loaded=!0}catch(e){this.loadError=e instanceof Error?e.message:String(e),this.loaded=!1,console.error(`[settings store] fetchSettings failed:`,e)}finally{this.loading=!1}},async fetchActiveMcpServers(){try{this.activeMcpServers=await q(`/api/settings/mcp-servers`)}catch(e){console.error(`[settings store] fetchActiveMcpServers failed:`,e),this.activeMcpServers=[]}},async fetchGlobalDefaults(){return q(`/api/settings/defaults`)},async previewRetention(e,t){return q(`/api/settings/ws-events-retention-preview?days=${e}&keep=${t}`)},async updateGlobal(e){this._assertLoaded(),this.global=await q(`/api/settings/global`,{method:`PUT`,body:e})},async upsertProject(e,t){this._assertLoaded();let n=await q(`/api/settings/projects/${Si(e)}`,{method:`PUT`,body:t}),r=this.projects.findIndex(t=>t.path===e);r>=0?this.projects[r]=n:this.projects.push(n)},toggleVerboseSystemMessages(){this.setVerboseSystemMessages(!this.showVerboseSystemMessages)},setVerboseSystemMessages(e){this.showVerboseSystemMessages=e,localStorage.setItem(`kobo:showVerboseSystemMessages`,String(e))},async deleteProject(e){this._assertLoaded(),await q(`/api/settings/projects/${Si(e)}`,{method:`DELETE`}),this.projects=this.projects.filter(t=>t.path!==e)},async fetchVoiceModels(){this.voiceModelsLoading=!0;try{let e=await q(`/api/voice/models`);this.voiceModels=e.available,this.voiceModelsDir=e.modelsDir,this.global.voiceModel=e.activeModel}catch(e){console.error(`[settings store] fetchVoiceModels failed:`,e)}finally{this.voiceModelsLoading=!1}},async cancelVoiceModelDownload(e){try{await q(`/api/voice/models/${encodeURIComponent(e)}/download`,{method:`DELETE`})}catch(e){if(!(e instanceof Wr)||e.status!==404)throw e}await this.fetchVoiceModels()},async fetchVoiceRuntime(){try{this.voiceRuntime=await q(`/api/voice/runtime`)}catch(e){console.error(`[settings store] fetchVoiceRuntime failed:`,e)}},async downloadVoiceModel(e){await q(`/api/voice/models/${encodeURIComponent(e)}/download`,{method:`POST`}),await this.fetchVoiceModels()},async deleteVoiceModel(e){await q(`/api/voice/models/${encodeURIComponent(e)}`,{method:`DELETE`}),await this.fetchVoiceModels()}}}),wi=6e3,Ti=new Map,Ei=[],Di=!1;function Oi(e){let t=Ti.get(e);return t||(t=new Audio(oi(e)),Ti.set(e,t)),t}function ki(e,t){let n=new Audio(oi(ri(e)));n.preload=`auto`,n.volume=t,n.play().catch(()=>{})}function Ai(){`Notification`in window&&Notification.permission==="default"&&Notification.requestPermission()}function ji(e){return typeof e!=`number`||!Number.isFinite(e)?1:Math.max(0,Math.min(1,e))}function Mi(){let e=Ei.shift();if(!e){Di=!1;return}Di=!0;let t=Oi(ri(e.soundId));t.volume=e.volume,t.currentTime=0;let n=!1,r=()=>{n||(n=!0,t.removeEventListener(`ended`,r),t.removeEventListener(`error`,r),Mi())};t.addEventListener(`ended`,r,{once:!0}),t.addEventListener(`error`,r,{once:!0}),t.play().catch(r)}function Ni(e,t){let n={soundId:ri(e),volume:ji(t)};if(document.visibilityState===`hidden`){ki(n.soundId,n.volume);return}Ei.push(n),Di||Mi()}function Pi(e,t){let n=Oi(ri(e));n.volume=ji(t),n.currentTime=0,n.play().catch(()=>{})}function Fi(e,t,n,r,i,a){let o=Ci();if(!document.hasFocus()&&o.global.browserNotifications&&`Notification`in window&&Notification.permission===`granted`){let r=new Notification(e,{body:t,icon:`/favicon.ico`});n&&(r.onclick=()=>{window.focus(),window.location.hash=`#/workspace/${n}`,r.close()})}(a??o.global.audioNotifications)&&r!==null&&Ni(r&&r.length>0?r:o.global.audioNotificationSound??`hey.mp3`,i??o.global.audioNotificationVolume)}function Ii(e,t){let n=[{label:t.retryLabel,color:`white`,handler:t.onRetry}];t.detailsLabel&&t.onDetails&&n.push({label:t.detailsLabel,color:`white`,handler:t.onDetails}),n.push({label:t.dismissLabel,color:`grey-5`}),kr.create({type:`negative`,position:`top`,multiLine:!0,message:e,timeout:t.timeout??0,actions:n})}var Li=Ie(`devServer`,{state:()=>({statuses:{},logs:{}}),getters:{getStatus:e=>t=>e.statuses[t]??null},actions:{async fetchStatus(e){try{let t=await fetch(`/api/dev-server/${e}/status`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){console.error(`[dev-server store] fetchStatus failed:`,e)}},async startDevServer(e){try{let t=await fetch(`/api/dev-server/${e}/start`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){throw console.error(`[dev-server store] startDevServer failed:`,e),e}},async stopDevServer(e){try{let t=await fetch(`/api/dev-server/${e}/stop`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){throw console.error(`[dev-server store] stopDevServer failed:`,e),e}},async fetchLogs(e,t=200){try{let n=await fetch(`/api/dev-server/${e}/logs?tail=${t}`);if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json();return this.logs[e]=r.logs,r.logs}catch(e){return console.error(`[dev-server store] fetchLogs failed:`,e),``}},updateFromWsEvent(e,t){this.statuses[e]=t}}});function Ri(e){return e.state===`OPEN`&&e.reviewDecision===`CHANGES_REQUESTED`&&e.reviewers.some(e=>e.state===`CHANGES_REQUESTED`)}function zi(e){return e.state===`OPEN`&&e.ci.rollup===`FAILURE`}function Bi(e){return e?zi(e)||Ri(e):!1}var Vi=[`executing`,`extracting`,`brainstorming`];function Hi(e){return!!e&&Vi.includes(e)}function Ui(e,t){return Hi(e)&&!t}function Wi(e,t,n){return Ui(e,!t||n)}var Gi={created:`workspaceStatus.created`,extracting:`workspaceStatus.extracting`,brainstorming:`workspaceStatus.brainstorming`,executing:`workspaceStatus.executing`,"awaiting-user":`workspaceStatus.awaitingUser`,completed:`workspaceStatus.completed`,idle:`workspaceStatus.idle`,error:`workspaceStatus.error`,quota:`workspaceStatus.quota`};function Ki(e){return e?Gi[e]??null:null}var qi=class extends Error{constructor(e,t){super(e),on(this,`code`,void 0),this.name=`WorkspaceActionError`,this.code=t}};function Ji(e){return e===`running`?`in_progress`:e}var Yi=5e3,Xi=500,Zi=null,Qi=0,$i=0,ea=new Map,ta=new Map,na=new Map,ra=new Map;function ia(e){ta.set(e,(ta.get(e)??0)+1)}function aa(e,t,n){let r={...e},i=new Set([...Object.keys(e),...Object.keys(t)]);for(let a of i){let i=t[a],o=e[a],s=(ta.get(a)??0)!==(n.get(a)??0),c=i?Date.parse(i.updatedAt):NaN,l=o?Date.parse(o.updatedAt):NaN;(s||Number.isFinite(c)&&c>l)&&(i?r[a]=i:delete r[a])}return r}function oa(e){return e===`claude-code`?`claude-code`:null}var J=Ie(`workspace`,{state:()=>({workspaces:[],selectedWorkspaceId:null,tasks:[],activityFeeds:{},activityFeedIds:{},activityCounts:{},subagents:{},agentTodos:{},sessions:[],selectedSessionId:null,archivedWorkspaces:[],archivedLoaded:!1,loading:!1,listLoadError:null,listPollFailureStreak:0,activeListLoadFailed:!1,loadingOlderEvents:!1,hasMoreEvents:{},providerUsage:{},chatDraft:``,queuedMessages:{},activeAgentSessionIds:{},settledAgentSessionIds:{},gitRefreshTrigger:0,gitStatsCache:{},pendingWakeups:{},pendingQuotaBackoffs:{},pendingDeferred:{},pendingQueue:{},prSnapshots:{},autoLoopStates:{},crons:{},creationProgress:null,agentLiveness:{},agentLivenessLoaded:{}}),getters:{selectedWorkspace:e=>e.workspaces.find(t=>t.id===e.selectedWorkspaceId)??e.archivedWorkspaces.find(t=>t.id===e.selectedWorkspaceId)??null,needsAttention(e){return e.workspaces.filter(t=>[`error`,`quota`,`awaiting-user`].includes(t.status)||Bi(e.prSnapshots[t.id])||!Hi(t.status)&&!!e.prSnapshots[t.id]?.readyToMerge)},running(e){return e.workspaces.filter(t=>Hi(t.status)&&!Bi(e.prSnapshots[t.id]))},idle(e){return e.workspaces.filter(t=>[`completed`,`idle`,`created`].includes(t.status)&&!Bi(e.prSnapshots[t.id])&&!e.prSnapshots[t.id]?.readyToMerge)},favorites(e){return e.workspaces.filter(e=>e.favoritedAt!==null)},currentAgentTodos:e=>e.selectedWorkspaceId?e.agentTodos[e.selectedWorkspaceId]??[]:[],currentSubagents:e=>{if(!e.selectedWorkspaceId)return[];let t=e.subagents[e.selectedWorkspaceId]??{};return Object.values(t).sort((e,t)=>e.startedAt.localeCompare(t.startedAt))},activityFeed:e=>{if(!e.selectedWorkspaceId)return[];let t=e.activityFeeds[e.selectedWorkspaceId]??[];if(!e.selectedSessionId)return e.sessions.length===0?t:[];let n=e.sessions.find(t=>t.id===e.selectedSessionId)?.engineSessionId??null,r=e.sessions.length>0?e.sessions[e.sessions.length-1].id:null,i=e.selectedSessionId===r;return t.filter(t=>t.sessionId?t.sessionId===e.selectedSessionId||n!==null&&t.sessionId===n:i)},acceptanceCriteria:e=>e.tasks.filter(e=>e.isAcceptanceCriterion),archived:e=>e.archivedWorkspaces,currentProviderUsage(e){let t=e.workspaces.find(t=>t.id===e.selectedWorkspaceId);if(!t)return null;let n=oa(t.engine);return n?e.providerUsage[n]??null:null}},actions:{clearWorkspaceLocalState(e){delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e],delete this.subagents[e],delete this.agentTodos[e],delete this.hasMoreEvents[e],delete this.gitStatsCache[e],delete this.pendingWakeups[e],delete this.pendingQuotaBackoffs[e],delete this.pendingDeferred[e],delete this.pendingQueue[e],delete this.prSnapshots[e],delete this.autoLoopStates[e],delete this.crons[e],delete this.activeAgentSessionIds[e];for(let t of Object.keys(this.queuedMessages))t.startsWith(`${e}:`)&&delete this.queuedMessages[t];ea.delete(e),ta.delete(e),na.delete(e),ra.delete(e),Ur().clear(e),localStorage.removeItem(`kobo:session:${e}`)},setCreationProgress(e){this.creationProgress=e},clearCreationProgress(){this.creationProgress=null},async toggleFavorite(e){let t=this.workspaces.find(t=>t.id===e);if(!t)return;let n=t.favoritedAt,r=n===null,i=r?new Date().toISOString():null;this.workspaces=this.workspaces.map(t=>t.id===e?{...t,favoritedAt:i}:t);try{let t=await fetch(`/api/workspaces/${e}/favorite`,{method:r?`POST`:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.workspaces=this.workspaces.map(t=>t.id===e?n:t)}catch(t){throw this.workspaces=this.workspaces.map(t=>t.id===e?{...t,favoritedAt:n}:t),t}},async togglePrWatch(e){let t=this.workspaces.find(t=>t.id===e);if(!t)return;let n=t.prWatchDisabledAt===null,r=n?new Date().toISOString():null;this.workspaces=this.workspaces.map(t=>t.id===e?{...t,prWatchDisabledAt:r}:t);try{let t=await fetch(`/api/workspaces/${e}/pr-watch-disabled`,{method:n?`POST`:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`);if(n){let n=await t.json();this.workspaces=this.workspaces.map(t=>t.id===e?n:t),delete this.prSnapshots[e],ia(e)}else{let{workspace:n,prSnapshot:r}=await t.json();this.workspaces=this.workspaces.map(t=>t.id===e?n:t),r?this.prSnapshots[e]=r:delete this.prSnapshots[e],ia(e)}}catch(n){throw this.workspaces=this.workspaces.map(n=>n.id===e?{...n,prWatchDisabledAt:t.prWatchDisabledAt}:n),n}},async setWorkspaceTags(e,t){let n=this.workspaces.find(t=>t.id===e);if(!n)return;let r=n.tags,i=[...t];this.workspaces=this.workspaces.map(t=>t.id===e?{...t,tags:i}:t);try{let n=await fetch(`/api/workspaces/${e}/tags`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tags:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json();this.workspaces=this.workspaces.map(t=>t.id===e?r:t)}catch(t){throw this.workspaces=this.workspaces.map(t=>t.id===e?{...t,tags:r}:t),t}},async fetchOrphanWorktrees(e){return q(`/api/git/orphan-worktrees?projectPath=${encodeURIComponent(e)}`,{cache:`no-store`})},async fetchWorkspaces(){this.loading=!0;try{let e=await q(`/api/workspaces`);this.workspaces=Array.isArray(e)?e:e.workspaces??[],this.listLoadError=null,this.activeListLoadFailed=!1,this.listPollFailureStreak=0;for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id)}catch(e){this.listLoadError=e instanceof Error?e.message:String(e),this.activeListLoadFailed=!0,console.error(`[workspace store] fetchWorkspaces failed:`,e)}finally{this.loading=!1}},async retryLoadWorkspaces(){await this.fetchWorkspaces(),this.archivedLoaded&&await this.fetchArchivedWorkspaces()},async fetchArchivedWorkspaces(){try{this.archivedWorkspaces=await q(`/api/workspaces/archived`),this.archivedLoaded=!0,this.activeListLoadFailed||(this.listLoadError=null)}catch(e){this.listLoadError=e instanceof Error?e.message:String(e),console.error(`[workspace store] fetchArchivedWorkspaces failed:`,e)}},async fetchWorkspaceDetails(e){let t=(ra.get(e)??0)+1;ra.set(e,t);let n=ea.get(e)??0;try{let r=await q(`/api/workspaces/${e}`);if(this.selectedWorkspaceId!==e||ra.get(e)!==t)return;let i=(ea.get(e)??0)!==n,a=r.workspace??r,o=i?{...a}:a;i&&delete o.status;let s=this.workspaces.findIndex(t=>t.id===e);if(s>=0)this.workspaces[s]={...this.workspaces[s],...o};else{let t=this.archivedWorkspaces.findIndex(t=>t.id===e);t>=0?this.archivedWorkspaces[t]={...this.archivedWorkspaces[t],...o}:o?.archivedAt&&this.archivedWorkspaces.unshift(o)}r.tasks&&(this.tasks=r.tasks),`agentLiveness`in r&&this.applyAgentLiveness(e,r.agentLiveness)}catch(e){console.error(`[workspace store] fetchWorkspaceDetails failed:`,e)}},applyAgentLiveness(e,t){if(this.agentLivenessLoaded={...this.agentLivenessLoaded,[e]:!0},t){this.agentLiveness={...this.agentLiveness,[e]:t};return}if(e in this.agentLiveness){let t={...this.agentLiveness};delete t[e],this.agentLiveness=t}},async createWorkspace(e){try{let t=await fetch(`/api/workspaces`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>({}));throw new qi(typeof e.error==`string`?e.error:`HTTP ${t.status}`,typeof e.step==`string`?e.step:void 0)}let n=t.headers.get(`X-Kobo-Branch-Adjusted`)===`1`,r=t.headers.get(`X-Kobo-Source-Fallback`)===`local`,i=await t.json(),a=i.workspace??i,o=this.workspaces.findIndex(e=>e.id===a.id);return o>=0?this.workspaces[o]=a:this.workspaces.push(a),e.autoLoop&&this.fetchAutoLoopStates(),a._branchAdjusted=n,a._sourceFallback=r,a}catch(e){throw console.error(`[workspace store] createWorkspace failed:`,e),e}},async startWorkspace(e,t,n,r){try{await q(`/api/workspaces/${e}/start`,{method:`POST`,body:{prompt:t,agentSessionId:n,resume:r}}),await this.fetchWorkspaces()}catch(e){throw console.error(`[workspace store] startWorkspace failed:`,e),e}},async previewEngineHandoff(e,t){let n=await fetch(`/api/workspaces/${e}/engine-handoff-preview`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({engine:t})}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error??`HTTP ${n.status}`);return r.handoff},async switchEngine(e,t){let n=await fetch(`/api/workspaces/${e}/switch-engine`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error??`HTTP ${n.status}`);let i=r.workspace,a=this.workspaces.findIndex(t=>t.id===e);return a>=0&&(this.workspaces[a]=i),await this.fetchSessions(e,r.sessionId),{sessionId:r.sessionId}},async stopWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/stop`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);await this.fetchWorkspaces()}catch(e){throw console.error(`[workspace store] stopWorkspace failed:`,e),e}},async interruptAgent(e,t={}){try{let n=await fetch(`/api/workspaces/${e}/interrupt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>void 0),t=typeof e==`object`&&e&&!Array.isArray(e)?e:void 0,r=typeof t?.error==`string`?t.error:`HTTP ${n.status}`,i=t?.code;throw new qi(r,n.status===409&&(i===`no_agent_running`||i===`session_not_active`)||n.status===500&&i===`interrupt_failed`?i:void 0)}}catch(e){throw console.error(`[workspace store] interruptAgent failed:`,e),e}},async deleteWorkspace(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t??{})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=[];if(n.status===200){let e=await n.json().catch(()=>({}));r=Array.isArray(e.warnings)?e.warnings:[]}return this.workspaces=this.workspaces.filter(t=>t.id!==e),this.archivedWorkspaces=this.archivedWorkspaces.filter(t=>t.id!==e),this.clearWorkspaceLocalState(e),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]),{warnings:r}}catch(e){throw console.error(`[workspace store] deleteWorkspace failed:`,e),e}},async deleteAllArchived(e){try{let t=this.archivedWorkspaces.map(e=>e.id),n=await fetch(`/api/workspaces/archived`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e??{})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json().catch(()=>({})),i=typeof r.deleted==`number`?r.deleted:0,a=Array.isArray(r.warnings)?r.warnings:[];this.archivedWorkspaces=[];for(let e of t)this.clearWorkspaceLocalState(e),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]);return{deleted:i,warnings:a,ids:t}}catch(e){throw console.error(`[workspace store] deleteAllArchived failed:`,e),e}},async updateModel(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({model:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updateModel failed:`,e),e}},async updateWorkspaceDescription(e,t){let n=this.workspaces.findIndex(t=>t.id===e);if(n<0)throw Error(`Workspace '${e}' not found in store`);let r=this.workspaces[n].description;this.workspaces[n]={...this.workspaces[n],description:t};try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({description:t})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json();this.workspaces=this.workspaces.map(t=>t.id===e?{...t,...r}:t)}catch(n){let i=this.workspaces.findIndex(t=>t.id===e);throw i>=0&&this.workspaces[i].description===t&&(this.workspaces[i]={...this.workspaces[i],description:r}),n}},async updateReasoningEffort(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({reasoningEffort:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updateReasoningEffort failed:`,e),e}},async renameWorkspaceBranch(e,t){let n=await fetch(`/api/workspaces/${e}/rename-branch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({newName:t})}),r=await n.json().catch(()=>null);if(!n.ok)throw new qi(r?.error??`Rename failed`,r?.code);let i=r,a=this.workspaces.findIndex(t=>t.id===e);return a>=0&&(this.workspaces[a]=i),i},async resyncWorkspaceBranch(e){let t=await fetch(`/api/workspaces/${e}/resync-branch`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();if(n.changed){let t=this.workspaces.findIndex(t=>t.id===e);t>=0&&(this.workspaces[t]={...this.workspaces[t],workingBranch:n.workingBranch})}return n},async updateAgentPermissionMode(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({agentPermissionMode:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updateAgentPermissionMode failed:`,e),e}},async pushBranch(e,t={}){let n=await fetch(`/api/workspaces/${e}/push`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({force:t.force===!0})});if(!n.ok){let e=await n.json().catch(()=>({error:`Push failed`}));throw new qi(e.error??`Push failed`,e.code)}},async fetchGitStats(e,t={}){let n=await q(`/api/workspaces/${e}/git-stats${t.freshFetch?`?freshFetch=1`:``}`,{signal:t.signal,timeoutMs:6e4});return this.gitStatsCache[e]=n,n},async fetchBranchDivergence(e,t={}){let n=`/api/workspaces/${e}/branch-divergence?limit=${t.limit??50}`,r=await fetch(n,{signal:t.signal});if(!r.ok)throw Error(`HTTP ${r.status}`);return await r.json()},async openPullRequest(e){let t=await fetch(`/api/workspaces/${e}/open-pr`,{method:`POST`}),n=await t.json().catch(()=>null);if(!t.ok)throw new qi(n?.error??`Open PR failed`,n?.code);return n},async archiveWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/archive`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();return this.workspaces=this.workspaces.filter(t=>t.id!==e),this.archivedLoaded&&this.archivedWorkspaces.unshift(n),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]),n}catch(e){throw console.error(`[workspace store] archiveWorkspace failed:`,e),e}},async unarchiveWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/unarchive`,{method:`POST`});if(!t.ok){if(t.status===409){let e=await t.json().catch(()=>({})),n=Error(e.error??`worktree-purged`);throw n.code=`worktree-purged`,n}throw Error(`HTTP ${t.status}`)}let n=await t.json();return this.archivedWorkspaces=this.archivedWorkspaces.filter(t=>t.id!==e),this.workspaces.unshift(n),n}catch(e){throw console.error(`[workspace store] unarchiveWorkspace failed:`,e),e}},async createTask(e,t,n){try{let r=await fetch(`/api/workspaces/${e}/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:t,isAcceptanceCriterion:n})});if(!r.ok)throw Error(`HTTP ${r.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] createTask failed:`,e),e}},async updateTaskTitle(e,t,n){try{let r=await fetch(`/api/workspaces/${e}/tasks/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:n})});if(!r.ok)throw Error(`HTTP ${r.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] updateTaskTitle failed:`,e),e}},async deleteTask(e,t){try{let n=await fetch(`/api/workspaces/${e}/tasks/${t}`,{method:`DELETE`});if(!n.ok)throw Error(`HTTP ${n.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] deleteTask failed:`,e),e}},selectWorkspace(e){this.selectedWorkspaceId=e,this.selectedSessionId=null,this.sessions=[],this.tasks=[],this.markRead(e),this.fetchWorkspaceDetails(e),this.fetchSessions(e),this.fetchPendingQuotaBackoff(e),this.fetchGitStats(e).catch(()=>{}),this.activityFeeds[e]?.length||ya().subscribe(e)},async fetchSessions(e,t){let n=(na.get(e)??0)+1;na.set(e,n);try{let r=await fetch(`/api/workspaces/${e}/sessions`);if(!r.ok)throw Error(`HTTP ${r.status}`);let i=await r.json();if(this.selectedWorkspaceId!==e||na.get(e)!==n)return;if(this.sessions=i,t&&this.sessions.some(e=>e.id===t)){this.selectSession(t);return}let a=this.selectedSessionId&&this.sessions.some(e=>e.id===this.selectedSessionId);if(this.sessions.length>0&&!a){let t=localStorage.getItem(`kobo:session:${e}`),n=t?this.sessions.find(e=>e.id===t):null;this.selectSession(n?n.id:this.sessions[0].id)}}catch(e){console.error(`[workspace store] fetchSessions failed:`,e)}},async fetchOlderEvents(e){if(this.loadingOlderEvents||this.hasMoreEvents[e]===!1)return!1;let t=this.activityFeeds[e];if(!t?.length)return!1;let n=t[0].id;this.loadingOlderEvents=!0;try{let t=await fetch(`/api/workspaces/${e}/events?before=${encodeURIComponent(n)}&limit=100`);if(!t.ok)throw Error(`HTTP ${t.status}`);let r=await t.json();if(this.hasMoreEvents[e]=r.hasMore,r.events.length>0){let e=ya();for(let t of r.events)e._routeMessage(t)}return r.events.length>0}catch(e){return console.error(`[workspace store] fetchOlderEvents failed:`,e),!1}finally{this.loadingOlderEvents=!1}},selectSession(e){this.selectedSessionId=e,this.selectedWorkspaceId&&localStorage.setItem(`kobo:session:${this.selectedWorkspaceId}`,e)},async createSession(e){try{let t=await fetch(`/api/workspaces/${e}/sessions`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}let n=await t.json();return this.sessions.unshift(n),this.selectSession(n.id),n}catch(e){throw console.error(`[workspace store] createSession failed:`,e),e}},async renameWorkspace(e,t){let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]={...this.workspaces[i],...r});let a=this.archivedWorkspaces.findIndex(t=>t.id===e);a>=0&&(this.archivedWorkspaces[a]={...this.archivedWorkspaces[a],...r})},async renameSession(e,t,n){let r=await fetch(`/api/workspaces/${e}/sessions/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:n})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`HTTP ${r.status}`)}let i=await r.json().catch(()=>null),a=this.sessions.find(e=>e.id===t);a&&(a.name=i?.name??n)},async deleteSession(e,t){let n=await fetch(`/api/workspaces/${e}/sessions/${t}`,{method:`DELETE`}),r=await n.json().catch(()=>({}));if(!n.ok)throw Error(r.error??`HTTP ${n.status}`);let i=this.selectedSessionId===t,a=r.workspace;if(a){let t=this.workspaces.findIndex(t=>t.id===e);t>=0&&(this.workspaces[t]=a)}await this.fetchSessions(e),i&&this.selectedWorkspaceId===e&&this.selectSession(this.sessions[0]?.id??null)},addActivityItem(e,t){if(this.activityFeeds[e]||(this.activityFeeds[e]=[]),this.activityFeedIds[e]||(this.activityFeedIds[e]=new Set),this.activityCounts[e]||(this.activityCounts[e]={toolUses:0,agentMessages:0,userMessages:0,errors:0}),t.meta?.sender!==`user`&&t.meta?.sender!==`system-prompt`)for(let t of this.activityFeeds[e])t.meta?.pending&&(t.meta.pending=!1);if(!this.activityFeedIds[e].has(t.id)){this.activityFeedIds[e].add(t.id),this.activityFeeds[e].push(t);let n=this.activityCounts[e];t.type===`tool_use`?n.toolUses++:t.type===`error`&&n.errors++,t.meta?.sender===`user`?n.userMessages++:t.type===`text`&&t.meta?.sender!==`system-prompt`&&n.agentMessages++}let n=this.activityFeeds[e];if(n.length>Yi){let t=n.splice(0,n.length-Yi),r=this.activityFeedIds[e];for(let e of t)r.delete(e.id)}},removeActivityItem(e,t){let n=this.activityFeeds[e],r=this.activityFeedIds[e];if(!n||!r)return;let i=n.findIndex(e=>e.id===t);if(i<0)return;let[a]=n.splice(i,1);r.delete(t);let o=this.activityCounts[e];o&&a&&(a.type===`tool_use`?o.toolUses=Math.max(0,o.toolUses-1):a.type===`error`&&(o.errors=Math.max(0,o.errors-1)),a.meta?.sender===`user`?o.userMessages=Math.max(0,o.userMessages-1):a.type===`text`&&a.meta?.sender!==`system-prompt`&&(o.agentMessages=Math.max(0,o.agentMessages-1)))},clearActivityFeed(e){e?(delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e]):(this.activityFeeds={},this.activityFeedIds={},this.activityCounts={})},applyUsageSnapshot(e){this.providerUsage[e.providerId]=e.snapshot},async requestUsageRefresh(e){try{await fetch(`/api/usage/${e}/refresh`,{method:`POST`})}catch(e){console.error(`[workspace store] requestUsageRefresh failed:`,e)}},triggerGitRefresh(){this.gitRefreshTrigger++,this.schedulePrSnapshotsRefresh()},schedulePrSnapshotsRefresh(){Zi!==null&&clearTimeout(Zi),Zi=setTimeout(()=>{Zi=null,this.fetchPrSnapshots()},Xi)},async fetchPrSnapshots(){let e=++$i,t=new Map(ta);try{let n=await fetch(`/api/workspaces/pr-states`,{cache:`no-store`});if(!n.ok)return;let r=await n.json();if(e!==$i)return;this.prSnapshots=aa(r,this.prSnapshots,t)}catch(e){console.error(`[workspace-store] fetchPrSnapshots failed:`,e)}},async fetchWorkspacesInfo(){let e=++Qi,t=new Map(ea),n=new Map(ta);try{let r=await q(`/api/workspaces/info`,{cache:`no-store`});if(this.listPollFailureStreak=0,this.activeListLoadFailed=!1,this.listLoadError=null,e!==Qi)return;this.agentLiveness=r.agentLiveness??{};let i={...this.agentLivenessLoaded};for(let e of r.workspaces)i[e.id]=!0;this.agentLivenessLoaded=i;let a=new Map(this.workspaces.map(e=>[e.id,e]));this.workspaces=r.workspaces.map(e=>{let n=a.get(e.id),r=(ea.get(e.id)??0)!==(t.get(e.id)??0);return n&&r?{...e,...n}:e});for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id);this.prSnapshots=aa(r.prSnapshots,this.prSnapshots,n);let o={...this.gitStatsCache};for(let[e,t]of Object.entries(r.gitStats)){let n=o[e];(!n||(t.computedAt??0)>=(n.computedAt??0))&&(o[e]=t)}this.gitStatsCache=o}catch(e){console.error(`[workspace-store] fetchWorkspacesInfo failed:`,e),this.listPollFailureStreak+=1,this.listPollFailureStreak>=2&&(this.activeListLoadFailed=!0,this.listLoadError=e instanceof Error?e.message:String(e))}},async refreshPrSnapshot(e){try{let t=await fetch(`/api/workspaces/pr-snapshot/refresh/${e}`,{method:`POST`});if(t.status===404){let t={...this.prSnapshots};return delete t[e],this.prSnapshots=t,ia(e),null}if(!t.ok)return console.error(`[workspace-store] refreshPrSnapshot non-OK:`,t.status),null;let n=await t.json();return this.prSnapshots={...this.prSnapshots,[e]:n.snapshot},ia(e),n.snapshot}catch(e){return console.error(`[workspace-store] refreshPrSnapshot failed:`,e),null}},async fetchAutoLoopStates(){try{let e=await fetch(`/api/workspaces/auto-loop-states`,{cache:`no-store`});if(!e.ok)return;let t=await e.json();this.autoLoopStates=t}catch(e){console.error(`[workspace-store] fetchAutoLoopStates failed:`,e)}},async enableAutoLoop(e){let t=this.workspaces.find(t=>t.id===e);if(t&&t.agentPermissionMode===`plan`)try{await this.updateAgentPermissionMode(e,`bypass`)}catch{}let n=await fetch(`/api/workspaces/${e}/auto-loop`,{method:`POST`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}await this.fetchAutoLoopStates()},async disableAutoLoop(e){let t=await fetch(`/api/workspaces/${e}/auto-loop`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}await this.fetchAutoLoopStates()},async forceAutoLoopReady(e){let t=await fetch(`/api/workspaces/${e}/auto-loop-ready`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);await this.fetchAutoLoopStates()},setAutoLoopState(e,t){this.autoLoopStates[e]=t},clearAutoLoopState(e){delete this.autoLoopStates[e]},async fetchCrons(e){try{let t=await fetch(`/api/workspaces/${e}/crons`);if(!t.ok)return;let n=await t.json();this.crons[e]=n.crons}catch(e){console.error(`[workspace-store] fetchCrons failed:`,e)}},async cancelCron(e,t){let n=this.crons[e]??[];this.crons[e]=n.filter(e=>e.id!==t);try{let n=await fetch(`/api/workspaces/${e}/crons/${t}`,{method:`DELETE`});if(!n.ok)throw Error(`HTTP ${n.status}`)}catch(t){throw this.crons[e]=n,t}},async createCron(e,t){let n=await fetch(`/api/workspaces/${e}/crons`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}await this.fetchCrons(e)},async scheduleManualWakeup(e,t){let n=await fetch(`/api/workspaces/${e}/pending-wakeup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json();r.pending&&(this.pendingWakeups[e]=r.pending)},async fetchPendingWakeup(e){try{let t=await fetch(`/api/workspaces/${e}/pending-wakeup`,{cache:`no-store`});if(!t.ok)return;let n=await t.json();n?this.pendingWakeups[e]=n:delete this.pendingWakeups[e]}catch(e){console.error(`[workspace-store] fetchPendingWakeup failed:`,e)}},setPendingWakeup(e,t){this.pendingWakeups[e]=t},clearPendingWakeup(e){delete this.pendingWakeups[e]},async cancelPendingWakeup(e){let t=this.pendingWakeups[e]!==void 0;delete this.pendingWakeups[e];try{let t=await fetch(`/api/workspaces/${e}/pending-wakeup`,{method:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`)}catch(n){console.error(`[workspace-store] cancelPendingWakeup failed:`,n),t&&await this.fetchPendingWakeup(e)}},async fetchPendingQuotaBackoff(e){try{let t=await fetch(`/api/workspaces/${e}/quota-backoff`,{cache:`no-store`});if(!t.ok)return;let n=await t.json();n?this.pendingQuotaBackoffs[e]=n:delete this.pendingQuotaBackoffs[e]}catch(e){console.error(`[workspace-store] fetchPendingQuotaBackoff failed:`,e)}},setPendingQuotaBackoff(e,t){this.pendingQuotaBackoffs[e]=t},clearPendingQuotaBackoff(e){delete this.pendingQuotaBackoffs[e]},async cancelQuotaBackoff(e){let t=this.pendingQuotaBackoffs[e]!==void 0;delete this.pendingQuotaBackoffs[e];try{let t=await fetch(`/api/workspaces/${e}/quota-backoff`,{method:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`)}catch(n){console.error(`[workspace-store] cancelQuotaBackoff failed:`,n),t&&await this.fetchPendingQuotaBackoff(e)}},async resumeQuotaBackoffNow(e){await this.startWorkspace(e)},enqueuePending(e,t){let n=this.pendingQueue[e]??[];n.some(e=>e.toolCallId===t.toolCallId)||(n.push(t),this.pendingQueue[e]=n,t.kind===`question`&&(this.pendingDeferred[e]={toolCallId:t.toolCallId,toolName:t.toolName,input:t.input,agentSessionId:t.agentSessionId}))},peekPending(e){return this.pendingQueue[e]?.[0]},dequeuePending(e){let t=this.pendingQueue[e];if(!t||t.length===0)return;let n=t.shift();t.length===0&&delete this.pendingQueue[e];let r=this.pendingQueue[e]?.[0];return r&&r.kind===`question`?this.pendingDeferred[e]={toolCallId:r.toolCallId,toolName:r.toolName,input:r.input,agentSessionId:r.agentSessionId}:delete this.pendingDeferred[e],n},clearPendingForSession(e,t){if(t===null)return;let n=this.pendingQueue[e];if(!n)return;let r=n.filter(e=>e.agentSessionId!==t);r.length===0?delete this.pendingQueue[e]:this.pendingQueue[e]=r;let i=this.pendingDeferred[e];i&&i.agentSessionId===t&&delete this.pendingDeferred[e]},clearAllPending(e){delete this.pendingQueue[e],delete this.pendingDeferred[e]},setPendingDeferred(e,t){this.enqueuePending(e,{kind:`question`,agentSessionId:t.agentSessionId,toolCallId:t.toolCallId,toolName:t.toolName,input:t.input})},clearPendingDeferred(e,t=null){if(t===null){this.clearAllPending(e);return}this.clearPendingForSession(e,t)},getPendingDeferred(e){let t=this.peekPending(e);if(t?.kind===`question`)return{toolCallId:t.toolCallId,toolName:t.toolName,input:t.input,agentSessionId:t.agentSessionId}},async submitDeferredAnswer(e,t,n,r,i){let a=await fetch(`/api/workspaces/${e}/deferred-tool-use/answer`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({answers:t,toolCallId:n,awaitingFreeForm:r,response:i})});if(!a.ok){let t=(await a.json().catch(()=>({}))).error??`HTTP ${a.status}`;if(/no deferred tool use pending|no agent running|no active engine process|no pending callback/i.test(t)){console.warn(`[workspace] submitDeferredAnswer: deferred callback expired — clearing zombie panel locally`),this.dequeuePending(e),this.fetchWorkspaces();return}throw Error(t)}this.dequeuePending(e),this.fetchWorkspaces()},async cancelDeferredAnswer(e,t,n){let r=await fetch(`/api/workspaces/${e}/deferred-tool-use/cancel`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({reason:t,toolCallId:n})});if(!r.ok){let t=(await r.json().catch(()=>({}))).error??`HTTP ${r.status}`;if(/no deferred tool use pending/i.test(t)){console.warn(`[workspace] cancelDeferredAnswer: backend has no pending — clearing zombie panel locally`),this.dequeuePending(e),this.fetchWorkspaces();return}throw Error(t)}this.dequeuePending(e),this.fetchWorkspaces()},async submitDeferredPermission(e,t,n,r,i=`once`){let a=await fetch(`/api/workspaces/${e}/deferred-permission/decision`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({toolCallId:t,decision:n,reason:r,scope:i})});if(!a.ok){let e=await a.json().catch(()=>({}));throw Error(e.error??`HTTP ${a.status}`)}this.dequeuePending(e),this.fetchWorkspaces()},updateAgentTodos(e,t){this.agentTodos[e]=t},agentTaskCreate(e,t,n){let r=this.agentTodos[e]?[...this.agentTodos[e]]:[];r.some(e=>e.id===t)||(r.push({id:t,content:n.subject||n.description||``,status:`pending`,activeForm:n.activeForm}),this.agentTodos[e]=r)},agentTaskSetNumber(e,t,n){let r=this.agentTodos[e];r&&(this.agentTodos[e]=r.map(e=>e.id===t?{...e,taskNumber:n}:e))},agentTaskUpdate(e,t,n){let r=this.agentTodos[e];if(r){if(n.status===`deleted`){this.agentTodos[e]=r.filter(e=>e.taskNumber!==t);return}this.agentTodos[e]=r.map(e=>e.taskNumber===t?{...e,status:n.status?Ji(n.status):e.status,content:n.content??e.content,activeForm:n.activeForm??e.activeForm}:e)}},finalizeRunningSubagents(e){let t=this.subagents[e];if(!t)return;let n=new Date().toISOString();for(let e of Object.keys(t)){let r=t[e];r.status===`running`&&(t[e]={...r,status:`done`,updatedAt:n})}},upsertSubagent(e,t){this.subagents[e]||(this.subagents[e]={});let n=this.subagents[e][t.toolUseId],r=new Date().toISOString(),i=n?.status===`done`?`done`:t.status??n?.status??`running`;this.subagents[e][t.toolUseId]={toolUseId:t.toolUseId,description:t.description??n?.description??``,taskType:t.taskType??n?.taskType,status:i,lastToolName:t.lastToolName??n?.lastToolName,lastDescription:t.lastDescription??n?.lastDescription,totalTokens:t.totalTokens??n?.totalTokens,toolUses:t.toolUses??n?.toolUses,durationMs:t.durationMs??n?.durationMs,startedAt:n?.startedAt??r,updatedAt:r}},async markRead(e){try{let t=await fetch(`/api/workspaces/${e}/mark-read`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=this.workspaces.findIndex(t=>t.id===e);n>=0&&(this.workspaces[n]={...this.workspaces[n],hasUnread:!1})}catch(e){console.error(`[workspace store] markRead failed:`,e)}},async purgeWorktree(e){try{let t=await fetch(`/api/workspaces/${e}/purge-worktree`,{method:`POST`}),n=await t.json();if(!t.ok)return{ok:!1,error:n.error??`HTTP ${t.status}`};let r=n.workspace;return r&&(this.updateWorkspaceFromEvent(e,{archivedAt:r.archivedAt,worktreePurgedAt:r.worktreePurgedAt,worktreePurgeRestoreData:r.worktreePurgeRestoreData}),r.archivedAt&&this.archivedLoaded&&(this.archivedWorkspaces.some(t=>t.id===e)||this.archivedWorkspaces.unshift(r),this.workspaces=this.workspaces.filter(t=>t.id!==e),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]))),{ok:!0,warnings:n.warnings??[]}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},async dismissPrAttention(e,t){let n=this.prSnapshots[e];if(n)try{let r=await fetch(`/api/workspaces/${e}/dismiss-pr-attention`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({kind:t,prUpdatedAt:n.updatedAt})});if(!r.ok)throw Error(`HTTP ${r.status}`);let i=t===`changes-requested`?{prChangesDismissedAt:n.updatedAt}:{prCiFailureDismissedAt:n.updatedAt};this.updateWorkspaceFromEvent(e,i)}catch(e){console.error(`[workspace store] dismissPrAttention failed:`,e)}},async restorePrAttention(e,t){try{let n=await fetch(`/api/workspaces/${e}/restore-pr-attention`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({kind:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=t===`changes-requested`?{prChangesDismissedAt:null}:{prCiFailureDismissedAt:null};this.updateWorkspaceFromEvent(e,r)}catch(e){console.error(`[workspace store] restorePrAttention failed:`,e)}},queuedMessageKey(e,t){return`${e}:${t}`},getQueuedMessage(e,t){return t?this.queuedMessages[this.queuedMessageKey(e,t)]:void 0},queueMessage(e,t,n){this.queuedMessages[this.queuedMessageKey(e,n)]={content:t,sessionId:n}},cancelQueuedMessage(e,t){t&&delete this.queuedMessages[this.queuedMessageKey(e,t)]},flushQueuedMessage(e,t){let n=this.getQueuedMessage(e,t);n&&(this.cancelQueuedMessage(e,t),ya().sendChatMessage(e,n.content,t))},setActiveAgentSession(e,t){this.activeAgentSessionIds[e]=t,delete this.settledAgentSessionIds[e]},markAgentTurnSettled(e,t){this.activeAgentSessionIds[e]===t&&(this.settledAgentSessionIds[e]=t)},isAgentTurnSettled(e){let t=this.activeAgentSessionIds[e];return t!==void 0&&this.settledAgentSessionIds[e]===t},clearActiveAgentSession(e,t){this.activeAgentSessionIds[e]===t&&(delete this.activeAgentSessionIds[e],delete this.settledAgentSessionIds[e])},clearActiveAgentSessionOwner(e){delete this.activeAgentSessionIds[e],delete this.settledAgentSessionIds[e]},updateWorkspaceFromEvent(e,t){ea.set(e,(ea.get(e)??0)+1);let n=this.workspaces.findIndex(t=>t.id===e);if(n>=0&&(this.workspaces[n]={...this.workspaces[n],...t}),t.status!==void 0){if(e in this.agentLivenessLoaded){let t={...this.agentLivenessLoaded};delete t[e],this.agentLivenessLoaded=t}e===this.selectedWorkspaceId&&this.fetchWorkspaceDetails(e)}if(t.status&&[`completed`,`idle`,`error`,`quota`].includes(t.status)){let t=this.activityFeeds[e];if(t)for(let e of t)e.meta?.pending&&(e.meta.pending=!1);let n=this.subagents[e];if(n)for(let[e,t]of Object.entries(n))t.status===`running`&&(n[e]={...t,status:`done`})}}}}),Y=Br.global.t,sa={"pr:ci-failed":{soundKey:`audioPrCiFailedSound`,enabledKey:`audioPrCiFailedEnabled`,volumeKey:`audioPrCiFailedVolume`},"pr:ci-recovered":{soundKey:`audioPrCiRecoveredSound`,enabledKey:`audioPrCiRecoveredEnabled`,volumeKey:`audioPrCiRecoveredVolume`},"pr:changes-requested":{soundKey:`audioPrChangesRequestedSound`,enabledKey:`audioPrChangesRequestedEnabled`,volumeKey:`audioPrChangesRequestedVolume`},"pr:approved":{soundKey:`audioPrApprovedSound`,enabledKey:`audioPrApprovedEnabled`,volumeKey:`audioPrApprovedVolume`},"pr:merge-conflict":{soundKey:`audioPrMergeConflictSound`,enabledKey:`audioPrMergeConflictEnabled`,volumeKey:`audioPrMergeConflictVolume`},"pr:ready-to-merge":{soundKey:`audioPrReadyToMergeSound`,enabledKey:`audioPrReadyToMergeEnabled`,volumeKey:`audioPrReadyToMergeVolume`},"pr:merged":{soundKey:`audioPrMergedSound`,enabledKey:`audioPrMergedEnabled`,volumeKey:`audioPrMergedVolume`}};function ca(e,t,n){let r=Ci().global,i=sa[n];Fi(e,void 0,t,ii(r[i.soundKey]),Number(r[i.volumeKey]),!!r[i.enabledKey])}function la(e,t){let n=[];return t&&n.push({label:Y(`pr.openPr`),color:`white`,noDismiss:!0,handler:()=>window.open(t,`_blank`)}),n.push({label:Y(`pr.openWorkspace`),color:`white`,noDismiss:!0,handler:()=>{window.location.hash=`#/workspace/${e}`}}),n.push({label:Y(`pr.dismiss`),color:`white`}),n}var X=null,ua=null,da=0,fa=!1,pa=!1,ma=!1;function ha(e){ma=e}function ga(e,t,n){if(t.kind!==`session:started`)return;let r=J();if(n){r.setActiveAgentSession(e,n);let t=r.peekPending(e);t&&t.agentSessionId===n&&r.dequeuePending(e)}let i=r.workspaces.find(t=>t.id===e);i&&(i.status===`completed`||i.status===`idle`||i.status===`error`||i.status===`quota`)&&r.updateWorkspaceFromEvent(e,{status:`executing`}),!ma&&n&&r.selectedWorkspaceId===e&&r.selectedSessionId!==n&&r.fetchSessions(e,n).catch(e=>{console.error(`[websocket] fetchSessions on session:started failed:`,e)})}function _a(e,t){let n=J();if(t.kind===`tool:call`&&t.name===`TodoWrite`){let r=t.input?.todos;return Array.isArray(r)&&n.updateAgentTodos(e,r.map(e=>({content:typeof e.content==`string`?e.content:``,status:typeof e.status==`string`?e.status:`pending`,activeForm:typeof e.activeForm==`string`?e.activeForm:void 0}))),!0}if(t.kind===`tool:call`&&t.name===`TaskCreate`){let r=t.input??{};return n.agentTaskCreate(e,t.toolCallId,{subject:typeof r.subject==`string`?r.subject:void 0,description:typeof r.description==`string`?r.description:void 0,activeForm:typeof r.activeForm==`string`?r.activeForm:void 0}),!0}if(t.kind===`tool:result`&&typeof t.output==`string`){let r=t.output.match(/^Task #(\d+) created successfully/);if(r)return n.agentTaskSetNumber(e,t.toolCallId,Number(r[1])),!0}if(t.kind===`tool:call`&&t.name===`TaskUpdate`){let r=t.input??{},i=r.task_id??r.taskId??r.id,a=typeof i==`number`?i:typeof i==`string`?Number(i):NaN;return Number.isFinite(a)&&n.agentTaskUpdate(e,a,{status:typeof r.status==`string`?r.status:void 0,content:typeof r.subject==`string`?r.subject:void 0,activeForm:typeof r.activeForm==`string`?r.activeForm:void 0}),!0}return!1}function va(e,t,n,r,i){let a=Ur();if(t.kind===`session:compacting`){a.setCompacting(e,t.active);return}a.append(e,t,n,r,i),(t.kind===`session:compacted`||t.kind===`message:text`||t.kind===`tool:call`)&&a.setCompacting(e,!1),ga(e,t,i??void 0);let o=J();if(t.kind===`session:user-input-requested`){if(t.requestKind===`question`?o.enqueuePending(e,{kind:`question`,agentSessionId:i??null,toolCallId:t.toolCallId,toolName:t.toolName,input:t.payload}):o.enqueuePending(e,{kind:`permission`,agentSessionId:i??null,toolCallId:t.toolCallId,toolName:t.toolName,toolInput:t.payload}),o.updateWorkspaceFromEvent(e,{status:`awaiting-user`}),!ma){let n=o.workspaces.find(t=>t.id===e)?.name??``,r=t.requestKind===`question`?Y(`notification.agentQuestion`,{name:n}):Y(`notification.agentPermissionRequest`,{name:n}),i=Ci().global;Fi(r,void 0,e,t.requestKind===`question`?i.audioQuestionSound:void 0,t.requestKind===`question`?i.audioQuestionVolume:void 0,i.audioQuestionNotifications)}return}if(t.kind===`subagent:progress`){o.upsertSubagent(e,{toolUseId:t.toolCallId,status:t.status,description:t.description,taskType:t.taskType,lastToolName:t.lastToolName,totalTokens:t.totalTokens,toolUses:t.toolUses,durationMs:t.durationMs});return}if(!_a(e,t)){if(t.kind===`tool:call`&&t.name===`Bash`){let n=t.input,r=`${n?.command??``} ${n?.description??``}`;/\bgit\b|commit|push|pull|merge|rebase|checkout|branch/i.test(r)&&o.triggerGitRefresh(),/\bgit\s+branch\s+-m\b/i.test(r)&&setTimeout(()=>{o.resyncWorkspaceBranch(e).catch(e=>{console.error(`[websocket] Branch resync failed:`,e)})},2500),/\bgh\s+pr\s+create\b/i.test(r)&&setTimeout(()=>o.triggerGitRefresh(),3e3)}if(t.kind===`tool:call`&&t.name===`ExitPlanMode`&&o.workspaces.find(t=>t.id===e)?.agentPermissionMode===`plan`&&(o.updateWorkspaceFromEvent(e,{agentPermissionMode:`bypass`}),o.updateAgentPermissionMode(e,`bypass`).catch(e=>{console.error(`[websocket] failed to persist ExitPlanMode flip:`,e)})),t.kind!==`session:started`){if(t.kind===`turn:completed`){i&&o.markAgentTurnSettled(e,i);return}if(t.kind===`session:ended`){i&&o.clearPendingForSession(e,i);let n=o.activeAgentSessionIds[e];if(t.superseded===!0||typeof i==`string`&&i.length>0&&n!==void 0&&i!==n){o.cancelQueuedMessage(e,i),i&&o.clearActiveAgentSession(e,i);return}a.setCompacting(e,!1),i?o.clearActiveAgentSession(e,i):o.clearActiveAgentSessionOwner(e);let r=o.workspaces.find(t=>t.id===e)?.status===`quota`?`quota`:t.reason===`completed`?`completed`:t.reason===`error`?`error`:`idle`;o.updateWorkspaceFromEvent(e,{status:r}),i&&t.reason===`completed`&&o.flushQueuedMessage(e,i),o.finalizeRunningSubagents(e),o.fetchWorkspaces(),!ma&&t.reason!==`killed`&&t.reason!==`error`&&o.autoLoopStates[e]?.auto_loop!==!0&&Fi(Y(`notification.agentFinished`,{name:o.workspaces.find(t=>t.id===e)?.name??``}),void 0,e);return}if(t.kind===`error`&&(t.category===`quota`&&(o.updateWorkspaceFromEvent(e,{status:`quota`}),o.fetchWorkspaces()),!ma)){let t=Ci().global;Fi(Y(`notification.agentError`,{name:o.workspaces.find(t=>t.id===e)?.name??``}),void 0,e,t.audioAgentErrorSound,t.audioAgentErrorVolume,t.audioAgentErrorNotifications)}}}}var ya=Ie(`websocket`,{state:()=>({connected:!1,reconnecting:!1,reconnectAttempt:0,lastEventId:null,_replaying:!1}),actions:{connect(){if(X)return;if(fa=!0,pa||(pa=!0,window.addEventListener(`online`,()=>{fa&&this.connect()}),window.addEventListener(`offline`,()=>{this.connected=!1,this.reconnecting=fa,ua&&=(clearTimeout(ua),null)})),!navigator.onLine){this.connected=!1,this.reconnecting=!0;return}let e=ar(`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/ws`,nr()),t=new WebSocket(e);X=t,t.addEventListener(`open`,()=>{this.connected=!0,this.reconnecting=!1,da=0,this.reconnectAttempt=0;let e=J().workspaces.map(e=>e.id);for(let t of e)this._send({type:`subscribe`,payload:{workspaceId:t}});this.lastEventId&&this._send({type:`sync:request`,payload:{lastEventId:this.lastEventId,workspaceIds:e}})}),t.addEventListener(`message`,e=>{try{let t=JSON.parse(e.data);this._routeMessage(t)}catch{}}),t.addEventListener(`close`,()=>{this.connected=!1,X=null,fa&&this._scheduleReconnect()}),t.addEventListener(`error`,()=>{})},disconnect(){fa=!1,ua&&=(clearTimeout(ua),null),X&&=(X.close(),null),this.connected=!1,this.reconnecting=!1,this.reconnectAttempt=0},subscribe(e){this._send({type:`subscribe`,payload:{workspaceId:e}}),this._send({type:`sync:request`,payload:{workspaceIds:[e]}})},unsubscribe(e){this._send({type:`unsubscribe`,payload:{workspaceId:e}})},subscribeChannel(e){this._send({type:`subscribe`,payload:{workspaceId:e}})},sendChatMessage(e,t,n,r,i=!1){let a=this._send({type:`chat:message`,payload:{workspaceId:e,content:t,sessionId:n,agentPermissionModeOverride:r,force:i}});if(/^\/compact(\s|$)/.test(t.trim())&&Ur().setCompacting(e,!0),!a)return!1;let o=J(),s=o.workspaces.find(t=>t.id===e);return s&&(s.status===`completed`||s.status===`idle`||s.status===`error`||s.status===`quota`)&&o.updateWorkspaceFromEvent(e,{status:`executing`}),!0},_send(e){return X&&X.readyState===WebSocket.OPEN?(X.send(JSON.stringify(e)),!0):!1},isConnected(){return X!==null&&X.readyState===WebSocket.OPEN},_scheduleReconnect(){if(ua)return;if(!fa||!navigator.onLine){this.reconnecting=fa;return}let e=Math.min(1e3*2**da,3e4),t=Math.round(e*(.8+Math.random()*.4));da++,this.reconnecting=!0,this.reconnectAttempt=da,da===4&&nr()&&sr(),ua=setTimeout(()=>{ua=null,this.connect()},t)},_routeMessage(e){let t=J();e.replayable!==!1&&e.id?this.lastEventId=e.id:e.replayable!==!1&&e.eventId&&(this.lastEventId=e.eventId);let n=e.payload??{},r=e.workspaceId??n.workspaceId??``;switch(e.type){case`chat:accepted`:{let e=typeof n.sessionId==`string`?n.sessionId:void 0;r&&e&&t.cancelQueuedMessage(r,e);break}case`chat:rejected`:{let e=typeof n.sessionId==`string`?n.sessionId:void 0,i=typeof n.content==`string`?n.content:void 0,a=typeof n.message==`string`?n.message:Y(`network.login.unreachable`);if(r&&i){let n=(t.activityFeeds[r]??[]).find(e=>e.meta?.sender===`user`&&e.meta?.pending&&e.content===i);n&&t.removeActivityItem(r,n.id),e&&t.queueMessage(r,i,e)}kr.create({type:`negative`,message:a,position:`top`,timeout:6e3});break}case`agent:event`:{if(!r)break;let t=e.createdAt;va(r,n,t,e.id??e.eventId,e.sessionId??null);break}case`agent:progress`:n.tasks&&Array.isArray(n.tasks)&&(t.tasks=n.tasks);break;case`user:message`:if(r&&n.content){let i=n.content,a=n.sender??`user`,o=e.sessionId,s=e.id??e.eventId??`user-${Date.now()}`,c=typeof e.createdAt==`string`?e.createdAt:void 0,l=c??new Date().toISOString(),u=t.activityFeeds[r]??[];if(a===`user`&&u.some(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending)){let e=u.findIndex(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending);e>=0&&(u[e]={...u[e],id:s,sessionId:o,...c?{timestamp:c}:{}})}else t.addActivityItem(r,{id:s,type:`text`,content:i,timestamp:l,sessionId:o,meta:{sender:a}})}break;case`sync:response`:this._replaying=!0,ha(!0);try{let e=n.events??[],t=n.mode===`delta`?`delta`:`snapshot`,r=new Map;for(let t of e)if(t.type!==`sync:response`){if(t.type===`agent:event`&&t.workspaceId){let e=r.get(t.workspaceId)??{events:[],timestamps:[],sessionIds:[],eventIds:[],oldestId:void 0};e.events.push(t.payload),e.timestamps.push(t.createdAt),e.sessionIds.push(t.sessionId??null),e.eventIds.push(t.id??null),e.oldestId||=t.id,r.set(t.workspaceId,e);continue}this._routeMessage(t)}if(r.size>0){let e=Ur();for(let[n,{events:i,timestamps:a,sessionIds:o,eventIds:s,oldestId:c}]of r){let r=t===`delta`?e.merge(n,i,a,{sessionIds:o,eventIds:s}):i.map((e,t)=>t);t===`snapshot`&&e.reset(n,i,a,{oldestId:c,hasMoreOlder:!0,sessionIds:o,eventIds:s}),t===`snapshot`&&J().updateAgentTodos(n,[]);for(let e of r){let t=i[e];if(!t)continue;let r=o[e]??null;if(t.kind===`session:user-input-requested`){t.requestKind===`question`?J().enqueuePending(n,{kind:`question`,agentSessionId:r,toolCallId:t.toolCallId,toolName:t.toolName,input:t.payload}):J().enqueuePending(n,{kind:`permission`,agentSessionId:r,toolCallId:t.toolCallId,toolName:t.toolName,toolInput:t.payload});continue}if(t.kind===`session:started`){if(r){let e=J();e.setActiveAgentSession(n,r);let t=e.peekPending(n);t&&t.agentSessionId===r&&e.dequeuePending(n)}continue}if(t.kind===`session:ended`){let e=J();r?(e.clearPendingForSession(n,r),e.cancelQueuedMessage(n,r),e.clearActiveAgentSession(n,r)):t.superseded!==!0&&e.clearActiveAgentSessionOwner(n);continue}if(t.kind===`subagent:progress`){J().upsertSubagent(n,{toolUseId:t.toolCallId,status:t.status,description:t.description,taskType:t.taskType,lastToolName:t.lastToolName,totalTokens:t.totalTokens,toolUses:t.toolUses,durationMs:t.durationMs});continue}_a(n,t)}}}let i=e.findLast(e=>e.replayable!==!1&&typeof e.id==`string`);i&&(this.lastEventId=i.id)}finally{this._replaying=!1,ha(!1)}break;case`usage:snapshot`:{let e=n;e.providerId&&e.snapshot&&t.applyUsageSnapshot({providerId:e.providerId,snapshot:e.snapshot});break}case`devserver:status`:{let e=Li();r&&e.updateFromWsEvent(r,n);break}case`task:updated`:r&&t.fetchWorkspaceDetails(r);break;case`setup:output`:t.addActivityItem(r,{id:e.id??`setup-${Date.now()}`,type:`text`,content:e.payload?.text??``,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`setup`}});break;case`setup:complete`:t.addActivityItem(r,{id:e.id??`setup-complete-${Date.now()}`,type:`text`,content:e.payload?.hadOutput===!1?Y(`chat.scriptDone`):Y(`chat.scriptComplete`,{phase:`setup`}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`setup`}});break;case`setup:error`:t.addActivityItem(r,{id:e.id??`setup-error-${Date.now()}`,type:`text`,content:Y(`chat.scriptError`,{phase:`setup`,message:e.payload?.message??Y(`chat.unknownError`)}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`setup`}});break;case`cleanup:output`:t.addActivityItem(r,{id:e.id??`cleanup-${Date.now()}`,type:`text`,content:e.payload?.text??``,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`cleanup`}});break;case`cleanup:complete`:t.addActivityItem(r,{id:e.id??`cleanup-complete-${Date.now()}`,type:`text`,content:e.payload?.hadOutput===!1?Y(`chat.scriptDone`):Y(`chat.scriptComplete`,{phase:`cleanup`}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`cleanup`}});break;case`cleanup:error`:t.addActivityItem(r,{id:e.id??`cleanup-error-${Date.now()}`,type:`text`,content:Y(`chat.scriptError`,{phase:`cleanup`,message:e.payload?.message??Y(`chat.unknownError`)}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`cleanup`}});break;case`archive:output`:t.addActivityItem(r,{id:e.id??`archive-${Date.now()}`,type:`text`,content:e.payload?.text??``,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`archive`}});break;case`archive:complete`:t.addActivityItem(r,{id:e.id??`archive-complete-${Date.now()}`,type:`text`,content:e.payload?.hadOutput===!1?Y(`chat.scriptDone`):Y(`chat.scriptComplete`,{phase:`archive`}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`archive`}});break;case`archive:error`:t.addActivityItem(r,{id:e.id??`archive-error-${Date.now()}`,type:`text`,content:Y(`chat.scriptError`,{phase:`archive`,message:e.payload?.message??Y(`chat.unknownError`)}),timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`archive`}});break;case`workspace:unread`:if(r){let e=n.hasUnread??!1;t.updateWorkspaceFromEvent(r,{hasUnread:e})}break;case`workspace:pr-attention-dismissed`:if(r){let e=n.kind,i=n.prUpdatedAt;e&&i&&t.updateWorkspaceFromEvent(r,e===`changes-requested`?{prChangesDismissedAt:i}:{prCiFailureDismissedAt:i})}break;case`workspace:description-updated`:{if(!r)break;let e=n.description??null;t.updateWorkspaceFromEvent(r,{description:e});break}case`workspace:agent-description-updated`:{if(!r)break;let e=n.agentDescription??null;t.updateWorkspaceFromEvent(r,{agentDescription:e});break}case`cron:created`:{if(!r)break;let e=n.cron;if(!e)break;let i=t.crons[r]??[];i.some(t=>t.id===e.id)||(t.crons[r]=[...i,e]);let a=t.autoLoopStates[r];a&&(a.crons_count=t.crons[r].length);break}case`cron:fired`:{if(!r)break;let e=n,i=t.crons[r]??[];t.crons[r]=i.map(t=>t.id===e.id?{...t,nextFireAt:e.nextFireAt??t.nextFireAt,lastFiredAt:e.lastFiredAt??new Date().toISOString()}:t);break}case`cron:cancelled`:{if(!r)break;let e=n.id;if(!e)break;t.crons[r]=(t.crons[r]??[]).filter(t=>t.id!==e);let i=t.autoLoopStates[r];i&&(i.crons_count=t.crons[r].length);break}case`cron:updated`:{if(!r)break;let e=n.crons;if(Array.isArray(e)){t.crons[r]=e;let n=t.autoLoopStates[r];n&&(n.crons_count=e.length)}break}case`workspace:archived`:case`workspace:unarchived`:case`workspace:worktree-restored`:case`workspace:worktree-purged`:e.type===`workspace:archived`&&r&&t.selectedWorkspaceId===r&&(t.selectedWorkspaceId=null),t.fetchWorkspaces(),t.archivedLoaded&&t.fetchArchivedWorkspaces();break;case`pr:base-changed`:{if(!r)break;let e=n,i=e.oldBase??``,a=e.newBase??``;t.updateWorkspaceFromEvent(r,{sourceBranch:a}),kr.create({type:`info`,position:`top`,timeout:wi,message:Y(`pr.baseChanged`,{oldBase:i,newBase:a}),actions:la(r,e.prUrl)}),Fi(Y(`pr.baseChanged`,{oldBase:i,newBase:a}),void 0,r);break}case`pr:ci-failed`:case`pr:ci-recovered`:case`pr:merge-conflict`:case`pr:merged`:{if(!r)break;let i=e.type,a=n,o=a.prNumber??0,s={"pr:ci-failed":{key:`toast.prCiFailed`,type:`negative`,timeout:4e3},"pr:ci-recovered":{key:`toast.prCiRecovered`,type:`positive`,timeout:5e3},"pr:merge-conflict":{key:`toast.prMergeConflict`,type:`warning`,timeout:wi},"pr:merged":{key:`toast.prMerged`,type:`positive`,timeout:5e3}}[i],c=Y(s.key,{n:o});kr.create({type:s.type,position:`top`,timeout:s.timeout,message:c,actions:la(r,a.prUrl)}),ca(c,r,i),i!==`pr:merged`&&t.refreshPrSnapshot(r);break}case`pr:changes-requested`:{if(!r)break;let e=n,i=Y(`toast.prChangesRequested`,{n:e.prNumber??0});kr.create({type:`warning`,position:`top`,timeout:wi,message:i,actions:la(r,e.prUrl)}),ca(i,r,`pr:changes-requested`),t.refreshPrSnapshot(r);break}case`pr:approved`:{if(!r)break;let e=n,i=Y(`toast.prApproved`,{n:e.prNumber??0});kr.create({type:`positive`,position:`top`,timeout:5e3,message:i,actions:la(r,e.prUrl)}),ca(i,r,`pr:approved`),t.refreshPrSnapshot(r);break}case`pr:ready-to-merge`:{if(!r)break;let e=n,i=Y(`toast.prReadyToMerge`,{n:e.prNumber??0});kr.create({type:`positive`,position:`top`,timeout:5e3,message:i,actions:la(r,e.prUrl)}),ca(i,r,`pr:ready-to-merge`),t.refreshPrSnapshot(r);break}case`wakeup:scheduled`:if(r){let e=n;typeof e.targetAt==`string`&&t.setPendingWakeup(r,{targetAt:e.targetAt,reason:e.reason})}break;case`wakeup:cancelled`:case`wakeup:fired`:case`wakeup:skipped`:r&&t.clearPendingWakeup(r);break;case`agent:quota-backoff`:{if(!r)break;let e=n;typeof e.targetAt==`string`&&typeof e.source==`string`&&t.setPendingQuotaBackoff(r,{targetAt:e.targetAt,resetsAt:e.resetsAt??null,source:e.source});break}case`agent:quota-backoff-cancelled`:r&&t.clearPendingQuotaBackoff(r);break;case`autoloop:enabled`:case`autoloop:iteration-started`:case`autoloop:ready-flipped`:t.fetchAutoLoopStates();break;case`autoloop:permission-overridden`:r&&Fi(Y(`notification.autoLoopPermissionOverridden`,{name:t.workspaces.find(e=>e.id===r)?.name??``}),void 0,r);break;case`autoloop:disabled`:if(t.fetchAutoLoopStates(),r){let e=n?.reason,i=t.workspaces.find(e=>e.id===r)?.name??``,a=e===`error`?`notification.autoLoopError`:e===`stall`?`notification.autoLoopStalled`:e===`completed`?`notification.autoLoopCompleted`:e===`awaiting-clarification`?`notification.autoLoopAwaitingClarification`:null;a&&Fi(Y(a,{name:i}),void 0,r)}break;case`workspace:create-progress`:{let e=typeof n.step==`string`?n.step:``,r=typeof n.creationId==`string`?n.creationId:``;r&&e&&t.setCreationProgress({creationId:r,step:e,index:typeof n.index==`number`?n.index:0,total:typeof n.total==`number`?n.total:0});break}case`workspace:create-failed`:{let e=typeof n.creationId==`string`?n.creationId:``,r=typeof n.step==`string`?n.step:``;e&&r&&t.setCreationProgress({creationId:e,step:r,index:-1,total:0});break}case`migration:progress`:case`migration:error`:sn().update(n)}}}}),ba=u({__name:`App`,setup(e){let t=ya(),n=fr();return b(()=>{t.connect(),n.fetchTemplates(),Ai()}),v(()=>{t.disconnect()}),(e,t)=>{let n=y(`router-view`);return S(),E(d,null,[D(n),D(mn),D(dr)],64)}}}),xa=e=>e,Sa=xa,Ca=xa,wa=xa(()=>Be()),Ta={true:`inset`,item:`item-inset`,"item-thumbnail":`item-thumbnail-inset`},Ea={xs:2,sm:4,md:8,lg:16,xl:24},Da=B({name:`QSeparator`,props:{...Le,spaced:[Boolean,String],inset:[Boolean,String],vertical:Boolean,color:String,size:String},setup(e){let t=M(),n=Ae(e,t.proxy.$q),r=p(()=>e.vertical?`vertical`:`horizontal`),i=p(()=>` q-separator--${r.value}`),a=p(()=>e.inset?`${i.value}-${Ta[e.inset]}`:``),o=p(()=>`q-separator${i.value}${a.value}`+(e.color===void 0?``:` bg-${e.color}`)+(n.value?` q-separator--dark`:``)),s=p(()=>{let t={};if(e.size!==void 0&&(t[e.vertical?`width`:`height`]=e.size),e.spaced){let n=e.spaced===!0?`${Ea.md}px`:e.spaced in Ea?`${Ea[e.spaced]}px`:e.spaced,r=e.vertical?[`Left`,`Right`]:[`Top`,`Bottom`];t[`margin${r[0]}`]=t[`margin${r[1]}`]=n}return t});return()=>N(`hr`,{class:o.value,style:s.value,"aria-orientation":r.value})}}),Oa=()=>N(`svg`,{key:`svg`,class:`q-radio__bg absolute non-selectable`,viewBox:`0 0 24 24`},[N(`path`,{d:`M12,22a10,10 0 0 1 -10,-10a10,10 0 0 1 10,-10a10,10 0 0 1 10,10a10,10 0 0 1 -10,10m0,-22a12,12 0 0 0 -12,12a12,12 0 0 0 12,12a12,12 0 0 0 12,-12a12,12 0 0 0 -12,-12`}),N(`path`,{class:`q-radio__check`,d:`M12,6a6,6 0 0 0 -6,6a6,6 0 0 0 6,6a6,6 0 0 0 6,-6a6,6 0 0 0 -6,-6`})]);function ka(e){(e.keyCode===13||e.keyCode===32)&&se(e)}var Aa=B({name:`QRadio`,props:{...Le,...L,...Ke,modelValue:{required:!0},val:{required:!0},label:String,leftLabel:Boolean,checkedIcon:String,uncheckedIcon:String,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},emits:[`update:modelValue`],setup(e,{slots:t,emit:r}){let{proxy:a}=M(),o=Ae(e,a.$q),s=ie(e,Xe),c=i(null),{refocusTargetEl:l,refocusTarget:u}=Ye(e,c),d=p(()=>n(e.modelValue)===n(e.val)),f=p(()=>`q-radio cursor-pointer no-outline row inline no-wrap items-center`+(e.disable?` disabled`:``)+(o.value?` q-radio--dark`:``)+(e.dense?` q-radio--dense`:``)+(e.leftLabel?` reverse`:``)),m=p(()=>{let t=e.color!==void 0&&(e.keepColor||d.value)?` text-${e.color}`:``;return`q-radio__inner relative-position q-radio__inner--${d.value?`truthy`:`falsy`}${t}`}),h=p(()=>(d.value?e.checkedIcon:e.uncheckedIcon)||null),g=p(()=>e.disable?-1:e.tabindex||0),_=p(()=>{let t={type:`radio`};return e.name!==void 0&&Object.assign(t,{".checked":d.value,"^checked":d.value?`checked`:void 0,name:e.name,value:e.val}),t}),v=qe(_);function y(t){t!==void 0&&(se(t),u(t)),!e.disable&&!d.value&&r(`update:modelValue`,e.val,t)}function b(e){(e.keyCode===13||e.keyCode===32)&&y(e)}Object.assign(a,{set:y});let x=Oa();return()=>{let n=h.value===null?[x]:[N(`div`,{key:`icon`,class:`q-radio__icon-container absolute-full flex flex-center no-wrap`},[N(pe,{class:`q-radio__icon`,name:h.value})])];e.disable||v(n,`unshift`,` q-radio__native q-ma-none q-pa-none`);let r=[N(`div`,{class:m.value,style:s.value,"aria-hidden":`true`},n)];l.value!==null&&r.push(l.value);let i=e.label===void 0?R(t.default):le(t.default,[e.label]);return i!==void 0&&r.push(N(`div`,{class:`q-radio__label q-anchor--skip`},i)),N(`div`,{ref:c,class:f.value,tabindex:g.value,role:`radio`,"aria-label":e.label,"aria-checked":d.value?`true`:`false`,"aria-disabled":e.disable?`true`:void 0,onClick:y,onKeydown:ka,onKeyup:b},r)}}}),ja=()=>N(`div`,{key:`svg`,class:`q-checkbox__bg absolute`},[N(`svg`,{class:`q-checkbox__svg fit absolute-full`,viewBox:`0 0 24 24`},[N(`path`,{class:`q-checkbox__truthy`,fill:`none`,d:`M1.73,12.91 8.1,19.28 22.79,4.59`}),N(`path`,{class:`q-checkbox__indet`,d:`M4,14H20V10H4`})])]),Ma=B({name:`QCheckbox`,props:Qe,emits:Ze,setup(e){let t=ja();function n(n,r){let i=p(()=>(n.value?e.checkedIcon:r.value?e.indeterminateIcon:e.uncheckedIcon)||null);return()=>i.value===null?[t]:[N(`div`,{key:`icon`,class:`q-checkbox__icon-container absolute-full flex flex-center no-wrap`},[N(pe,{class:`q-checkbox__icon`,name:i.value})])]}return $e(`checkbox`,n)}}),Na=B({name:`QToggle`,props:{...Qe,icon:String,iconColor:String},emits:Ze,setup(e){function t(t,n){let r=p(()=>(t.value?e.checkedIcon:n.value?e.indeterminateIcon:e.uncheckedIcon)||e.icon),i=p(()=>t.value?e.iconColor:null);return()=>[N(`div`,{class:`q-toggle__track`}),N(`div`,{class:`q-toggle__thumb absolute flex flex-center no-wrap`},r.value===void 0?void 0:[N(pe,{name:r.value,color:i.value})])]}return $e(`toggle`,t)}}),Pa={radio:Aa,checkbox:Ma,toggle:Na},Fa=Object.keys(Pa);function Ia(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>e[n]}var La=B({name:`QOptionGroup`,props:{...Le,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(U),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:`radio`,validator:e=>Fa.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(e,{emit:t,slots:n}){let{proxy:{$q:r}}=M(),i=Array.isArray(e.modelValue);e.type===`radio`?i&&console.error(`q-option-group: model should not be array`):i||console.error(`q-option-group: model should be array in your case`);let a=Ae(e,r),o=p(()=>Pa[e.type]),s=p(()=>Ia(e.optionValue,`value`)),c=p(()=>Ia(e.optionLabel,`label`)),l=p(()=>Ia(e.optionDisable,`disable`)),u=p(()=>e.options.map(t=>({val:s.value(t),name:t.name===void 0?e.name:t.name,disable:e.disable||l.value(t),leftLabel:t.leftLabel===void 0?e.leftLabel:t.leftLabel,color:t.color===void 0?e.color:t.color,checkedIcon:t.checkedIcon,uncheckedIcon:t.uncheckedIcon,dark:t.dark===void 0?a.value:t.dark,size:t.size===void 0?e.size:t.size,dense:e.dense,keepColor:t.keepColor===void 0?e.keepColor:t.keepColor}))),d=p(()=>`q-option-group q-gutter-x-sm`+(e.inline?` q-option-group--inline`:``)),f=p(()=>{let t={role:`group`};return e.type===`radio`&&(t.role=`radiogroup`,e.disable&&(t[`aria-disabled`]=`true`)),t});function m(e){t(`update:modelValue`,e)}return()=>N(`div`,{class:d.value,...f.value},e.options.map((t,r)=>{let i=n[`label-`+r]===void 0?n.label===void 0?void 0:()=>n.label(t):()=>n[`label-`+r](t);return N(`div`,[N(o.value,{label:i===void 0?c.value(t):null,modelValue:e.modelValue,"onUpdate:modelValue":m,...u.value[r]},i)])}))}}),Ra=B({name:`DialogPluginComponent`,props:{...Le,title:String,message:String,prompt:Object,options:Object,progress:[Boolean,Object],html:Boolean,ok:{type:[String,Object,Boolean],default:!0},cancel:[String,Object,Boolean],focus:{type:String,default:`ok`,validator:e=>[`ok`,`cancel`,`none`].includes(e)},stackButtons:Boolean,color:String,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:[`ok`,`hide`],setup(e,{emit:t}){let{proxy:r}=M(),{$q:a}=r,o=Ae(e,a),s=i(null),c=i(e.prompt===void 0?e.options===void 0?void 0:e.options.model:e.prompt.model),l=p(()=>`q-dialog-plugin`+(o.value?` q-dialog-plugin--dark q-dark`:``)+(e.progress===!1?``:` q-dialog-plugin--progress`)),u=p(()=>e.color||(o.value?`amber`:`primary`)),d=p(()=>e.progress===!1?null:U(e.progress)?{component:e.progress.spinner||Ce,props:{color:e.progress.color||u.value}}:{component:Ce,props:{color:u.value}}),f=p(()=>e.prompt!==void 0||e.options!==void 0),m=p(()=>{if(!f.value)return{};let{model:t,isValid:n,items:r,...i}=e.prompt===void 0?e.options:e.prompt;return i}),h=p(()=>U(e.ok)||e.ok===!0?a.lang.label.ok:e.ok),g=p(()=>U(e.cancel)||e.cancel===!0?a.lang.label.cancel:e.cancel),_=p(()=>e.prompt===void 0?e.options!==void 0&&e.options.isValid!==void 0&&!e.options.isValid(c.value):e.prompt.isValid!==void 0&&!e.prompt.isValid(c.value)),v=p(()=>({color:u.value,label:h.value,ripple:!1,disable:_.value,...U(e.ok)?e.ok:{flat:!0},"data-autofocus":e.focus===`ok`&&!f.value||void 0,onClick:S})),y=p(()=>({color:u.value,label:g.value,ripple:!1,...U(e.cancel)?e.cancel:{flat:!0},"data-autofocus":e.focus===`cancel`&&!f.value||void 0,onClick:C}));k(()=>e.prompt&&e.prompt.model,T),k(()=>e.options&&e.options.model,T);function b(){s.value.show()}function x(){s.value.hide()}function S(){t(`ok`,n(c.value)),x()}function C(){x()}function w(){t(`hide`)}function T(e){c.value=e}function E(t){!_.value&&e.prompt.type!==`textarea`&&oe(t,13)&&S()}function D(t,n){return e.html?N(W,{class:t,innerHTML:n}):N(W,{class:t},()=>n)}function O(){return[N($n,{color:u.value,dense:!0,autofocus:!0,dark:o.value,...m.value,modelValue:c.value,"onUpdate:modelValue":T,onKeyup:E})]}function A(){return[N(La,{color:u.value,options:e.options.items,dark:o.value,...m.value,modelValue:c.value,"onUpdate:modelValue":T})]}function ee(){let t=[];return e.cancel&&t.push(N(xe,y.value)),e.ok&&t.push(N(xe,v.value)),N(er,{class:e.stackButtons?`items-end`:``,vertical:e.stackButtons,align:`right`},()=>t)}function j(){let t=[];return e.title&&t.push(D(`q-dialog__title`,e.title)),e.progress!==!1&&t.push(N(W,{class:`q-dialog__progress`},()=>N(d.value.component,d.value.props))),e.message&&t.push(D(`q-dialog__message`,e.message)),e.prompt===void 0?e.options!==void 0&&t.push(N(Da,{dark:o.value}),N(W,{class:`scroll q-dialog-plugin__form`},A),N(Da,{dark:o.value})):t.push(N(W,{class:`scroll q-dialog-plugin__form`},O)),(e.ok||e.cancel)&&t.push(ee()),t}function te(){return[N(kt,{class:[l.value,e.cardClass],style:e.cardStyle,dark:o.value},j)]}return Object.assign(r,{show:b,hide:x}),()=>N(tn,{ref:s,onHide:w},te)}});function za(e,t){for(let n in t)n!==`spinner`&&Object(t[n])===t[n]&&!Array.isArray(t[n])?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},za(e[n],t[n])):e[n]=t[n]}function Ba(e,t,n){return r=>{let a,o,s=t&&r.component!==void 0;if(s){let{component:e,componentProps:t}=r;a=typeof e==`string`?n.component(e):e,o=t||{}}else{let{class:t,style:n,...i}=r;a=e,o=i,t!==void 0&&(i.cardClass=t),n!==void 0&&(i.cardStyle=n)}let c,l=!1,u=i(null),d=_e(!1,`dialog`),f=e=>{if(u.value?.[e]!==void 0){u.value[e]();return}let t=c.$.subTree;if(t?.component){if(t.component.proxy&&t.component.proxy[e]){t.component.proxy[e]();return}if(t.component.subTree&&t.component.subTree.component&&t.component.subTree.component.proxy&&t.component.subTree.component.proxy[e]){t.component.subTree.component.proxy[e]();return}}console.error(`[Quasar] Incorrectly defined Dialog component`)},p=[],m=[],h={onOk(e){return p.push(e),h},onCancel(e){return m.push(e),h},onDismiss(e){return p.push(e),m.push(e),h},hide(){return f(`hide`),h},update(e){if(c!==null){if(s)Object.assign(o,e);else{let{class:t,style:n,...r}=e;t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n),za(o,r)}c.$forceUpdate()}return h}},g=e=>{l=!0,p.forEach(t=>{t(e)})},_=()=>{v.unmount(d),me(d),v=null,c=null,l||m.forEach(e=>{e()})},v=St({name:`QGlobalDialog`,setup:()=>()=>N(a,{...o,ref:u,onOk:g,onHide:_,onVnodeMounted(...e){typeof o.onVnodeMounted==`function`&&o.onVnodeMounted(...e),C(()=>f(`show`))}})},n);return c=v.mount(d),h}}var Va={install({$q:e,parentApp:t}){e.dialog=this.create=Ba(Ra,!0,t)}},Ha=new Map;function Ua(e,t){Ha.set(e,t)}function Wa(e){Ha.delete(e)}function Ga(){let e=[];for(let[t,n]of Ha)try{n()&&e.push(t)}catch{}return e}function Ka(){return Ga().length>0}function qa(e){return typeof e==`object`||`displayName`in e||`props`in e||`__vccOpts`in e}function Ja(e){return e.__esModule||e[Symbol.toStringTag]===`Module`||e.default&&qa(e.default)}var Z=Object.assign;function Ya(e,t){let n={};for(let r in t){let i=t[r];n[r]=Q(i)?i.map(e):e(i)}return n}var Xa=()=>{},Q=Array.isArray;function Za(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var Qa=Symbol(``);function $a(e,t){return Z(Error(),{type:e,[Qa]:!0},t)}function eo(e,t){return e instanceof Error&&Qa in e&&(t==null||!!(e.type&t))}var to=Symbol(``),no=Symbol(``),ro=Symbol(``),io=Symbol(``),ao=Symbol(``);function oo(){return P(ro)}function so(e){return P(io)}var co=typeof document<`u`,lo=/#/g,uo=/&/g,fo=/\//g,po=/=/g,mo=/\?/g,ho=/\+/g,go=/%5B/g,_o=/%5D/g,vo=/%5E/g,yo=/%60/g,bo=/%7B/g,xo=/%7C/g,So=/%7D/g,Co=/%20/g;function wo(e){return e==null?``:encodeURI(``+e).replace(xo,`|`).replace(go,`[`).replace(_o,`]`)}function To(e){return wo(e).replace(bo,`{`).replace(So,`}`).replace(vo,`^`)}function Eo(e){return wo(e).replace(ho,`%2B`).replace(Co,`+`).replace(lo,`%23`).replace(uo,`%26`).replace(yo,"`").replace(bo,`{`).replace(So,`}`).replace(vo,`^`)}function Do(e){return Eo(e).replace(po,`%3D`)}function Oo(e){return wo(e).replace(lo,`%23`).replace(mo,`%3F`)}function ko(e){return Oo(e).replace(fo,`%2F`)}function Ao(e){if(e==null)return null;try{return decodeURIComponent(``+e)}catch{}return``+e}var jo=/\/$/,Mo=e=>e.replace(jo,``);function No(e,t,n=`/`){let r,i={},a=``,o=``,s=t.indexOf(`#`),c=t.indexOf(`?`);return c=s>=0&&c>s?-1:c,c>=0&&(r=t.slice(0,c),a=t.slice(c,s>0?s:t.length),i=e(a.slice(1))),s>=0&&(r||=t.slice(0,s),o=t.slice(s,t.length)),r=Vo(r??t,n),{fullPath:r+a+o,path:r,query:i,hash:Ao(o)}}function Po(e,t){let n=t.query?e(t.query):``;return t.path+(n&&`?`)+n+(t.hash||``)}function Fo(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||`/`}function Io(e,t,n){let r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&Lo(t.matched[r],n.matched[i])&&Ro(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Lo(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Ro(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!zo(e[n],t[n]))return!1;return!0}function zo(e,t){return Q(e)?Bo(e,t):Q(t)?Bo(t,e):(e&&e.valueOf())===(t&&t.valueOf())}function Bo(e,t){return Q(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function Vo(e,t){if(e.startsWith(`/`))return e;if(!e)return t;let n=t.split(`/`),r=e.split(`/`),i=r[r.length-1];(i===`..`||i===`.`)&&r.push(``);let a=n.length-1,o,s;for(o=0;o<r.length;o++)if(s=r[o],s!==`.`){if(s===`..`)a>1&&a--;else break}return n.slice(0,a).join(`/`)+`/`+r.slice(o).join(`/`)}var Ho={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0};function Uo(e){if(!e){if(co){let t=document.querySelector(`base`);e=t&&t.getAttribute(`href`)||`/`,e=e.replace(/^\w+:\/\/[^/]+/,``)}else e=`/`}return e[0]!==`/`&&e[0]!==`#`&&(e=`/`+e),Mo(e)}var Wo=/^[^#]+#/;function Go(e,t){return e.replace(Wo,`#`)+t}function Ko(e,t){let n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}var qo=()=>({left:window.scrollX,top:window.scrollY});function Jo(e){let t;if(`el`in e){let n=e.el,r=typeof n==`string`&&n.startsWith(`#`),i=typeof n==`string`?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;t=Ko(i,e)}else t=e;`scrollBehavior`in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left==null?window.scrollX:t.left,t.top==null?window.scrollY:t.top)}function Yo(e,t){return(history.state?history.state.position-t:-1)+e}var Xo=new Map;function Zo(e,t){Xo.set(e,t)}function Qo(e){let t=Xo.get(e);return Xo.delete(e),t}function $o(e){return typeof e==`string`||e&&typeof e==`object`}function es(e){return typeof e==`string`||typeof e==`symbol`}function ts(e){let t={};if(e===``||e===`?`)return t;let n=(e[0]===`?`?e.slice(1):e).split(`&`);for(let e=0;e<n.length;++e){let r=n[e].replace(ho,` `),i=r.indexOf(`=`),a=Ao(i<0?r:r.slice(0,i)),o=i<0?null:Ao(r.slice(i+1));if(a in t){let e=t[a];Q(e)||(e=t[a]=[e]),e.push(o)}else t[a]=o}return t}function ns(e){let t=``;for(let n in e){let r=e[n];if(n=Do(n),r==null){r!==void 0&&(t+=(t.length?`&`:``)+n);continue}(Q(r)?r.map(e=>e&&Eo(e)):[r&&Eo(r)]).forEach(e=>{e!==void 0&&(t+=(t.length?`&`:``)+n,e!=null&&(t+=`=`+e))})}return t}function rs(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=Q(r)?r.map(e=>e==null?null:``+e):r==null?r:``+r)}return t}function is(){let e=[];function t(t){return e.push(t),()=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function as(e,t,n,r,i,a=e=>e()){let o=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((s,c)=>{let l=e=>{e===!1?c($a(4,{from:n,to:t})):e instanceof Error?c(e):$o(e)?c($a(2,{from:t,to:e})):(o&&r.enterCallbacks[i]===o&&typeof e==`function`&&o.push(e),s())},u=a(()=>e.call(r&&r.instances[i],t,n,l)),d=Promise.resolve(u);e.length<3&&(d=d.then(l)),d.catch(e=>c(e))})}function os(e,t,n,r,i=e=>e()){let a=[];for(let o of e)for(let e in o.components){let s=o.components[e];if(!(t!==`beforeRouteEnter`&&!o.instances[e])){if(qa(s)){let c=(s.__vccOpts||s)[t];c&&a.push(as(c,n,r,o,e,i))}else{let c=s();a.push(()=>c.then(a=>{if(!a)throw Error(`Couldn't resolve component "${e}" at "${o.path}"`);let s=Ja(a)?a.default:a;o.mods[e]=a,o.components[e]=s;let c=(s.__vccOpts||s)[t];return c&&as(c,n,r,o,e,i)()}))}}}return a}function ss(e,t){let n=[],r=[],i=[],a=Math.max(t.matched.length,e.matched.length);for(let o=0;o<a;o++){let a=t.matched[o];a&&(e.matched.find(e=>Lo(e,a))?r.push(a):n.push(a));let s=e.matched[o];s&&(t.matched.find(e=>Lo(e,s))||i.push(s))}return[n,r,i]}var cs=()=>location.protocol+`//`+location.host;function ls(e,t){let{pathname:n,search:r,hash:i}=t,a=e.indexOf(`#`);if(a>-1){let t=i.includes(e.slice(a))?e.slice(a).length:1,n=i.slice(t);return n[0]!==`/`&&(n=`/`+n),Fo(n,``)}return Fo(n,e)+r+i}function us(e,t,n,r){let i=[],a=[],o=null,s=({state:a})=>{let s=ls(e,location),c=n.value,l=t.value,u=0;if(a){if(n.value=s,t.value=a,o&&o===c){o=null;return}u=l?a.position-l.position:0}else r(s);i.forEach(e=>{e(n.value,c,{delta:u,type:`pop`,direction:u?u>0?`forward`:`back`:``})})};function c(){o=n.value}function l(e){i.push(e);let t=()=>{let t=i.indexOf(e);t>-1&&i.splice(t,1)};return a.push(t),t}function u(){if(document.visibilityState===`hidden`){let{history:e}=window;if(!e.state)return;e.replaceState(Z({},e.state,{scroll:qo()}),``)}}function d(){for(let e of a)e();a=[],window.removeEventListener(`popstate`,s),window.removeEventListener(`pagehide`,u),document.removeEventListener(`visibilitychange`,u)}return window.addEventListener(`popstate`,s),window.addEventListener(`pagehide`,u),document.addEventListener(`visibilitychange`,u),{pauseListeners:c,listen:l,destroy:d}}function ds(e,t,n,r=!1,i=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:i?qo():null}}function fs(e){let{history:t,location:n}=window,r={value:ls(e,n)},i={value:t.state};i.value||a(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(r,a,o){let s=e.indexOf(`#`),c=s>-1?(n.host&&document.querySelector(`base`)?e:e.slice(s))+r:cs()+e+r;try{t[o?`replaceState`:`pushState`](a,``,c),i.value=a}catch(e){console.error(e),n[o?`replace`:`assign`](c)}}function o(e,n){a(e,Z({},t.state,ds(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),r.value=e}function s(e,n){let o=Z({},i.value,t.state,{forward:e,scroll:qo()});a(o.current,o,!0),a(e,Z({},ds(r.value,e,null),{position:o.position+1},n),!1),r.value=e}return{location:r,state:i,push:s,replace:o}}function ps(e){e=Uo(e);let t=fs(e),n=us(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}let i=Z({location:``,base:e,go:r,createHref:Go.bind(null,e)},t,n);return Object.defineProperty(i,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,"state",{enumerable:!0,get:()=>t.state.value}),i}function ms(e){return e=location.host?e||location.pathname+location.search:``,e.includes(`#`)||(e+=`#`),ps(e)}var hs={type:0,value:``},gs=/[a-zA-Z0-9_]/;function _s(e){if(!e)return[[]];if(e===`/`)return[[hs]];if(!e.startsWith(`/`))throw Error(`Invalid path "${e}"`);function t(e){throw Error(`ERR (${n})/"${l}": ${e}`)}let n=0,r=n,i=[],a;function o(){a&&i.push(a),a=[]}let s=0,c,l=``,u=``;function d(){l&&=(n===0?a.push({type:0,value:l}):n===1||n===2||n===3?(a.length>1&&(c===`*`||c===`+`)&&t(`A repeatable param (${l}) must be alone in its segment. eg: '/:ids+.`),a.push({type:1,value:l,regexp:u,repeatable:c===`*`||c===`+`,optional:c===`*`||c===`?`})):t(`Invalid state to consume buffer`),``)}function f(){l+=c}for(;s<e.length;)switch(c=e[s++],n){case 0:c===`\\`?(r=n,n=4):c===`/`?(l&&d(),o()):c===`:`?(d(),n=1):f();break;case 4:f(),n=r;break;case 1:c===`(`?n=2:gs.test(c)?f():(d(),n=0,c!==`*`&&c!==`?`&&c!==`+`&&s--);break;case 2:c===`)`?u[u.length-1]==`\\`?u=u.slice(0,-1)+c:n=3:u+=c;break;case 3:d(),n=0,c!==`*`&&c!==`?`&&c!==`+`&&s--,u=``;break;default:t(`Unknown state`)}return n===2&&t(`Unfinished custom RegExp for param "${l}"`),d(),o(),i}var vs=`[^/]+?`,ys={sensitive:!1,strict:!1,start:!0,end:!0},bs=/[.+*?^${}()[\]/\\]/g;function xs(e,t){let n=Z({},ys,t),r=[],i=n.start?`^`:``,a=[];for(let t of e){let e=t.length?[]:[90];n.strict&&!t.length&&(i+=`/`);for(let r=0;r<t.length;r++){let o=t[r],s=40+(n.sensitive?.25:0);if(o.type===0)r||(i+=`/`),i+=o.value.replace(bs,`\\$&`),s+=40;else if(o.type===1){let{value:e,repeatable:n,optional:c,regexp:l}=o;a.push({name:e,repeatable:n,optional:c});let u=l||vs;if(u!==vs){s+=10;try{RegExp(`(${u})`)}catch(t){throw Error(`Invalid custom RegExp for param "${e}" (${u}): `+t.message)}}let d=n?`((?:${u})(?:/(?:${u}))*)`:`(${u})`;r||(d=c&&t.length<2?`(?:/${d})`:`/`+d),c&&(d+=`?`),i+=d,s+=20,c&&(s+=-8),n&&(s+=-20),u===`.*`&&(s+=-50)}e.push(s)}r.push(e)}if(n.strict&&n.end){let e=r.length-1;r[e][r[e].length-1]+=.7000000000000001}n.strict||(i+=`/?`),n.end?i+=`$`:n.strict&&!i.endsWith(`/`)&&(i+=`(?:/|$)`);let o=new RegExp(i,n.sensitive?``:`i`);function s(e){let t=e.match(o),n={};if(!t)return null;for(let e=1;e<t.length;e++){let r=t[e]||``,i=a[e-1];n[i.name]=r&&i.repeatable?r.split(`/`):r}return n}function c(t){let n=``,r=!1;for(let i of e){(!r||!n.endsWith(`/`))&&(n+=`/`),r=!1;for(let e of i)if(e.type===0)n+=e.value;else if(e.type===1){let{value:a,repeatable:o,optional:s}=e,c=a in t?t[a]:``;if(Q(c)&&!o)throw Error(`Provided param "${a}" is an array but it is not repeatable (* or + modifiers)`);let l=Q(c)?c.join(`/`):c;if(!l){if(s)i.length<2&&(n.endsWith(`/`)?n=n.slice(0,-1):r=!0);else throw Error(`Missing required param "${a}"`)}n+=l}}return n||`/`}return{re:o,score:r,keys:a,parse:s,stringify:c}}function Ss(e,t){let n=0;for(;n<e.length&&n<t.length;){let r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?e.length===1&&e[0]===80?-1:1:e.length>t.length?t.length===1&&t[0]===80?1:-1:0}function Cs(e,t){let n=0,r=e.score,i=t.score;for(;n<r.length&&n<i.length;){let e=Ss(r[n],i[n]);if(e)return e;n++}if(Math.abs(i.length-r.length)===1){if(ws(r))return 1;if(ws(i))return-1}return i.length-r.length}function ws(e){let t=e[e.length-1];return e.length>0&&t[t.length-1]<0}var Ts={strict:!1,end:!0,sensitive:!1};function Es(e,t,n){let r=Z(xs(_s(e.path),n),{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function Ds(e,t){let n=[],r=new Map;t=Za(Ts,t);function i(e){return r.get(e)}function a(e,n,r){let i=!r,s=ks(e);s.aliasOf=r&&r.record;let l=Za(t,e),u=[s];if(`alias`in e){let t=typeof e.alias==`string`?[e.alias]:e.alias;for(let e of t)u.push(ks(Z({},s,{components:r?r.record.components:s.components,path:e,aliasOf:r?r.record:s})))}let d,f;for(let t of u){let{path:u}=t;if(n&&u[0]!==`/`){let e=n.record.path,r=e[e.length-1]===`/`?``:`/`;t.path=n.record.path+(u&&r+u)}if(d=Es(t,n,l),r?r.alias.push(d):(f||=d,f!==d&&f.alias.push(d),i&&e.name&&!js(d)&&o(e.name)),Fs(d)&&c(d),s.children){let e=s.children;for(let t=0;t<e.length;t++)a(e[t],d,r&&r.children[t])}r||=d}return f?()=>{o(f)}:Xa}function o(e){if(es(e)){let t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(o),t.alias.forEach(o))}else{let t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(o),e.alias.forEach(o))}}function s(){return n}function c(e){let t=Ns(e,n);n.splice(t,0,e),e.record.name&&!js(e)&&r.set(e.record.name,e)}function l(e,t){let i,a={},o,s;if(`name`in e&&e.name){if(i=r.get(e.name),!i)throw $a(1,{location:e});s=i.record.name,a=Z(Os(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&Os(e.params,i.keys.map(e=>e.name))),o=i.stringify(a)}else if(e.path!=null)o=e.path,i=n.find(e=>e.re.test(o)),i&&(a=i.parse(o),s=i.record.name,i.keys.forEach(e=>{e.optional&&!a[e.name]&&delete a[e.name]}));else{if(i=t.name?r.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw $a(1,{location:e,currentLocation:t});s=i.record.name,a=Z({},t.params,e.params),o=i.stringify(a)}let c=[],l=i;for(;l;)c.unshift(l.record),l=l.parent;return{name:s,path:o,params:a,matched:c,meta:Ms(c)}}e.forEach(e=>a(e));function u(){n.length=0,r.clear()}return{addRoute:a,resolve:l,removeRoute:o,clearRoutes:u,getRoutes:s,getRecordMatcher:i}}function Os(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function ks(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:As(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:`components`in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function As(e){let t={},n=e.props||!1;if(`component`in e)t.default=n;else for(let r in e.components)t[r]=typeof n==`object`?n[r]:n;return t}function js(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Ms(e){return e.reduce((e,t)=>Z(e,t.meta),{})}function Ns(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;Cs(e,t[i])<0?r=i:n=i+1}let i=Ps(e);return i&&(r=t.lastIndexOf(i,r-1)),r}function Ps(e){let t=e;for(;t=t.parent;)if(Fs(t)&&Cs(e,t)===0)return t}function Fs({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Is(e){let t=P(ro),n=P(io),i=p(()=>{let n=r(e.to);return t.resolve(n)}),a=p(()=>{let{matched:e}=i.value,{length:t}=e,r=e[t-1],a=n.matched;if(!r||!a.length)return-1;let o=a.findIndex(Lo.bind(null,r));if(o>-1)return o;let s=Vs(e[t-2]);return t>1&&Vs(r)===s&&a[a.length-1].path!==s?a.findIndex(Lo.bind(null,e[t-2])):o}),o=p(()=>a.value>-1&&Bs(n.params,i.value.params)),s=p(()=>a.value>-1&&a.value===n.matched.length-1&&Ro(n.params,i.value.params));function c(n={}){if(zs(n)){let n=t[r(e.replace)?`replace`:`push`](r(e.to)).catch(Xa);return e.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}return{route:i,href:p(()=>i.value.href),isActive:o,isExactActive:s,navigate:c}}function Ls(e){return e.length===1?e[0]:e}var Rs=u({name:`RouterLink`,compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:`page`},viewTransition:Boolean},useLink:Is,setup(e,{slots:t}){let n=l(Is(e)),{options:r}=P(ro),i=p(()=>({[Hs(e.activeClass,r.linkActiveClass,`router-link-active`)]:n.isActive,[Hs(e.exactActiveClass,r.linkExactActiveClass,`router-link-exact-active`)]:n.isExactActive}));return()=>{let r=t.default&&Ls(t.default(n));return e.custom?r:N(`a`,{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},r)}}});function zs(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(e.button===void 0||e.button===0)){if(e.currentTarget&&e.currentTarget.getAttribute){let t=e.currentTarget.getAttribute(`target`);if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Bs(e,t){for(let n in t){let r=t[n],i=e[n];if(typeof r==`string`){if(r!==i)return!1}else if(!Q(i)||i.length!==r.length||r.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}function Vs(e){return e?e.aliasOf?e.aliasOf.path:e.path:``}var Hs=(e,t,n)=>e??t??n,Us=u({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){let a=P(ao),o=p(()=>e.route||a.value),s=P(no,0),c=p(()=>{let e=r(s),{matched:t}=o.value,n;for(;(n=t[e])&&!n.components;)e++;return e}),l=p(()=>o.value.matched[c.value]);m(no,p(()=>c.value+1)),m(to,l),m(ao,o);let u=i();return k(()=>[u.value,l.value,e.name],([e,t,n],[r,i,a])=>{t&&(t.instances[n]=e,i&&i!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=i.leaveGuards),t.updateGuards.size||(t.updateGuards=i.updateGuards))),e&&t&&(!i||!Lo(t,i)||!r)&&(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:`post`}),()=>{let r=o.value,i=e.name,a=l.value,s=a&&a.components[i];if(!s)return Ws(n.default,{Component:s,route:r});let c=a.props[i],d=c?c===!0?r.params:typeof c==`function`?c(r):c:null,f=N(s,Z({},d,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(a.instances[i]=null)},ref:u}));return Ws(n.default,{Component:f,route:r})||f}}});function Ws(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var Gs=Us;function Ks(e){let t=Ds(e.routes,e),n=e.parseQuery||ts,i=e.stringifyQuery||ns,s=e.history,c=is(),l=is(),u=is(),d=a(Ho),f=Ho;co&&e.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let p=Ya.bind(null,e=>``+e),m=Ya.bind(null,ko),h=Ya.bind(null,Ao);function g(e,n){let r,i;return es(e)?(r=t.getRecordMatcher(e),i=n):i=e,t.addRoute(i,r)}function _(e){let n=t.getRecordMatcher(e);n&&t.removeRoute(n)}function v(){return t.getRoutes().map(e=>e.record)}function y(e){return!!t.getRecordMatcher(e)}function b(e,r){if(r=Z({},r||d.value),typeof e==`string`){let i=No(n,e,r.path),a=t.resolve({path:i.path},r),o=s.createHref(i.fullPath);return Z(i,a,{params:h(a.params),redirectedFrom:void 0,href:o})}let a;if(e.path!=null)a=Z({},e,{path:No(n,e.path,r.path).path});else{let t=Z({},e.params);for(let e in t)t[e]??delete t[e];a=Z({},e,{params:m(t)}),r.params=m(r.params)}let o=t.resolve(a,r),c=e.hash||``;o.params=p(h(o.params));let l=Po(i,Z({},e,{hash:To(c),path:o.path})),u=s.createHref(l);return Z({fullPath:l,hash:c,query:i===ns?rs(e.query):e.query||{}},o,{redirectedFrom:void 0,href:u})}function x(e){return typeof e==`string`?No(n,e,d.value.path):Z({},e)}function S(e,t){if(f!==e)return $a(8,{from:t,to:e})}function w(e){return D(e)}function T(e){return w(Z(x(e),{replace:!0}))}function E(e,t){let n=e.matched[e.matched.length-1];if(n&&n.redirect){let{redirect:r}=n,i=typeof r==`function`?r(e,t):r;return typeof i==`string`&&(i=i.includes(`?`)||i.includes(`#`)?i=x(i):{path:i},i.params={}),Z({query:e.query,hash:e.hash,params:i.path==null?e.params:{}},i)}}function D(e,t){let n=f=b(e),r=d.value,a=e.state,o=e.force,s=e.replace===!0,c=E(n,r);if(c)return D(Z(x(c),{state:typeof c==`object`?Z({},a,c.state):a,force:o,replace:s}),t||n);let l=n;l.redirectedFrom=t;let u;return!o&&Io(i,r,n)&&(u=$a(16,{to:l,from:r}),I(r,r,!0,!1)),(u?Promise.resolve(u):A(l,r)).catch(e=>eo(e)?eo(e,2)?e:ie(e):ne(e,l,r)).then(e=>{if(e){if(eo(e,2))return D(Z({replace:s},x(e.to),{state:typeof e.to==`object`?Z({},a,e.to.state):a,force:o}),t||l)}else e=j(l,r,!0,s,a);return ee(l,r,e),e})}function O(e,t){let n=S(e,t);return n?Promise.reject(n):Promise.resolve()}function k(e){let t=oe.values().next().value;return t&&typeof t.runWithContext==`function`?t.runWithContext(e):e()}function A(e,t){let n,[r,i,a]=ss(e,t);n=os(r.reverse(),`beforeRouteLeave`,e,t);for(let i of r)i.leaveGuards.forEach(r=>{n.push(as(r,e,t))});let o=O.bind(null,e,t);return n.push(o),z(n).then(()=>{n=[];for(let r of c.list())n.push(as(r,e,t));return n.push(o),z(n)}).then(()=>{n=os(i,`beforeRouteUpdate`,e,t);for(let r of i)r.updateGuards.forEach(r=>{n.push(as(r,e,t))});return n.push(o),z(n)}).then(()=>{n=[];for(let r of a)if(r.beforeEnter){if(Q(r.beforeEnter))for(let i of r.beforeEnter)n.push(as(i,e,t));else n.push(as(r.beforeEnter,e,t))}return n.push(o),z(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=os(a,`beforeRouteEnter`,e,t,k),n.push(o),z(n))).then(()=>{n=[];for(let r of l.list())n.push(as(r,e,t));return n.push(o),z(n)}).catch(e=>eo(e,8)?e:Promise.reject(e))}function ee(e,t,n){u.list().forEach(r=>k(()=>r(e,t,n)))}function j(e,t,n,r,i){let a=S(e,t);if(a)return a;let o=t===Ho,c=co?history.state:{};n&&(r||o?s.replace(e.fullPath,Z({scroll:o&&c&&c.scroll},i)):s.push(e.fullPath,i)),d.value=e,I(e,t,n,o),ie()}let M;function te(){M||=s.listen((e,t,n)=>{if(!R.listening)return;let r=b(e),i=E(r,R.currentRoute.value);if(i){D(Z(i,{replace:!0,force:!0}),r).catch(Xa);return}f=r;let a=d.value;co&&Zo(Yo(a.fullPath,n.delta),qo()),A(r,a).catch(e=>eo(e,12)?e:eo(e,2)?(D(Z(x(e.to),{force:!0}),r).then(e=>{eo(e,20)&&!n.delta&&n.type===`pop`&&s.go(-1,!1)}).catch(Xa),Promise.reject()):(n.delta&&s.go(-n.delta,!1),ne(e,r,a))).then(e=>{e||=j(r,a,!1),e&&(n.delta&&!eo(e,8)?s.go(-n.delta,!1):n.type===`pop`&&eo(e,20)&&s.go(-1,!1)),ee(r,a,e)}).catch(Xa)})}let N=is(),P=is(),F;function ne(e,t,n){ie(e);let r=P.list();return r.length?r.forEach(r=>r(e,t,n)):console.error(e),Promise.reject(e)}function re(){return F&&d.value!==Ho?Promise.resolve():new Promise((e,t)=>{N.add([e,t])})}function ie(e){return F||(F=!e,te(),N.list().forEach(([t,n])=>e?n(e):t()),N.reset()),e}function I(t,n,r,i){let{scrollBehavior:a}=e;if(!co||!a)return Promise.resolve();let o=!r&&Qo(Yo(t.fullPath,0))||(i||!r)&&history.state&&history.state.scroll||null;return C().then(()=>a(t,n,o)).then(e=>t===d.value&&e&&Jo(e)).catch(e=>t===d.value&&ne(e,t,n))}let ae=e=>s.go(e),L,oe=new Set,R={currentRoute:d,listening:!0,addRoute:g,removeRoute:_,clearRoutes:t.clearRoutes,hasRoute:y,getRoutes:v,resolve:b,options:e,push:w,replace:T,go:ae,back:()=>ae(-1),forward:()=>ae(1),beforeEach:c.add,beforeResolve:l.add,afterEach:u.add,onError:P.add,isReady:re,install(e){e.component(`RouterLink`,Rs),e.component(`RouterView`,Gs),e.config.globalProperties.$router=R,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>r(d)}),co&&!L&&d.value===Ho&&(L=!0,w(s.location).catch(e=>{}));let t={};for(let e in Ho)Object.defineProperty(t,e,{get:()=>d.value[e],enumerable:!0});e.provide(ro,R),e.provide(io,o(t)),e.provide(ao,d);let n=e.unmount;oe.add(e),e.unmount=function(){oe.delete(e),oe.size<1&&(f=Ho,M&&M(),M=null,d.value=Ho,L=!1,F=!1),n()}}};function z(e){return e.reduce((e,t)=>e.then(()=>k(t)),Promise.resolve())}return R}var qs=`modulepreload`,Js=function(e){return`/`+e},Ys={},$=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=Js(t,n),t=s(t),t in Ys)return;Ys[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`:qs,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}`)))})}))}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)})},Xs=[{path:`/`,component:()=>$(()=>import(`./MainLayout-Cl26t1Yw.js`).then(e=>e.t),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24])),children:[{path:``,redirect:{name:`workspace`}},{path:`workspace/:id?`,name:`workspace`,component:()=>$(()=>import(`./WorkspacePage-C8SAYVkt.js`).then(e=>e.t),__vite__mapDeps([25,1,2,3,4,26,6,5,7,8,9,10,11,13,14,15,16,17,27,21,22,28,29,30,31,32]))},{path:`create`,name:`create`,component:()=>$(()=>import(`./CreatePage-P4N9bro4.js`),__vite__mapDeps([33,1,2,3,4,26,6,5,7,8,9,10,11,14,34,35,17,23,28,36,29,30,37]))},{path:`settings`,name:`settings`,component:()=>$(()=>import(`./SettingsPage-BmSaJrE5.js`),__vite__mapDeps([38,1,2,3,4,5,9,6,7,8,10,11,19,15,16,39,35,18,20,23,28,36,31,40]))},{path:`search`,name:`search`,component:()=>$(()=>import(`./SearchPage-B5Wndh73.js`),__vite__mapDeps([41,1,2,3,4,5,10,14,15,22,28,36,42]))},{path:`health`,name:`health`,component:()=>$(()=>import(`./HealthPage-B0_v81_H.js`),__vite__mapDeps([43,2,3,4,6,5,10,14,15,28,36,44]))},{path:`changelog`,name:`changelog`,component:()=>$(()=>import(`./ChangelogPage-7pgilQJn.js`),__vite__mapDeps([45,2,3,4,10,5,13,15,11,28,36,46]))}]},{path:`/:catchAll(.*)*`,redirect:`/`}],Zs=Ca(()=>{let e=Ks({scrollBehavior:()=>({left:0,top:0}),routes:Xs,history:ms()});return e.beforeEach((e,t)=>{if(e.fullPath===t.fullPath||!Ka())return!0;let n=Br.global.t;return new Promise(e=>{Va.create({title:n(`unsaved.title`),message:n(`unsaved.message`),dark:!0,cancel:{flat:!0,label:n(`unsaved.stay`),color:`grey-5`},ok:{flat:!0,label:n(`unsaved.leave`),color:`negative`}}).onOk(()=>e(!0)).onCancel(()=>e(!1))})}),window.addEventListener(`beforeunload`,e=>{Ka()&&(e.preventDefault(),e.returnValue=``)}),e});async function Qs(e,t){let n=e(ba);n.use(Tt,t);let r=typeof wa==`function`?await wa({}):wa;n.use(r);let i=s(typeof Zs==`function`?await Zs({store:r}):Zs);return r.use(({store:e})=>{e.router=i}),{app:n,store:r,router:i}}var $s={config:{dark:!0,brand:{primary:`#6c63ff`,secondary:`#26a69a`,accent:`#9c27b0`,dark:`#1a1a2e`,"dark-page":`#1a1a2e`,positive:`#21ba45`,negative:`#c10015`,info:`#31ccec`,warning:`#f2c037`}},plugins:{Notify:kr,Dialog:Va}},ec=function(){return!!(window.location.hostname===`localhost`||window.location.hostname===`[::1]`||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/))},tc;typeof window<`u`&&(tc=typeof Promise<`u`?new Promise(function(e){return window.addEventListener(`load`,e)}):{then:function(e){return window.addEventListener(`load`,e)}});function nc(e,t){t===void 0&&(t={});var n=t.registrationOptions;n===void 0&&(n={}),delete t.registrationOptions;var r=function(e){for(var n=[],r=arguments.length-1;r-->0;)n[r]=arguments[r+1];t&&t[e]&&t[e].apply(t,n)};`serviceWorker`in navigator&&tc.then(function(){ec()?(ac(e,r,n),navigator.serviceWorker.ready.then(function(e){r(`ready`,e)}).catch(function(e){return rc(r,e)})):(ic(e,r,n),navigator.serviceWorker.ready.then(function(e){r(`ready`,e)}).catch(function(e){return rc(r,e)}))})}function rc(e,t){navigator.onLine||e(`offline`),e(`error`,t)}function ic(e,t,n){navigator.serviceWorker.register(e,n).then(function(e){if(t(`registered`,e),e.waiting){t(`updated`,e);return}e.onupdatefound=function(){t(`updatefound`,e);var n=e.installing;n.onstatechange=function(){n.state===`installed`&&(navigator.serviceWorker.controller?t(`updated`,e):t(`cached`,e))}}}).catch(function(e){return rc(t,e)})}function ac(e,t,n){fetch(e).then(function(r){r.status===404?(t(`error`,Error(`Service worker not found at `+e)),oc()):r.headers.get(`content-type`).indexOf(`javascript`)===-1?(t(`error`,Error(`Expected `+e+` to have javascript content-type, but received `+r.headers.get(`content-type`))),oc()):ic(e,t,n)}).catch(function(e){return rc(t,e)})}function oc(){`serviceWorker`in navigator&&navigator.serviceWorker.ready.then(function(e){e.unregister()}).catch(function(e){return rc(emit,e)})}nc(`/sw.js`);var sc=`/`;async function cc({app:e,router:t,store:n},r){let i=!1,a=e=>{try{return t.resolve(e).href}catch{}return Object(e)===e?null:e},o=e=>{if(i=!0,typeof e==`string`&&/^https?:\/\//.test(e)){window.location.href=e;return}let t=a(e);t!==null&&(window.location.href=t,window.location.reload())},s=window.location.href.replace(window.location.origin,``);for(let a=0;i===!1&&a<r.length;a++)try{await r[a]({app:e,router:t,store:n,ssrContext:null,redirect:o,urlPath:s,publicPath:sc})}catch(e){i||console.error(`[Quasar] boot error:`,e);return}i||(e.use(t),e.mount(`#q-app`))}Qs(A,$s).then(e=>{let[t,n]=Promise.allSettled===void 0?[`all`,e=>e.map(e=>e.default)]:[`allSettled`,e=>e.map(e=>{if(e.status===`rejected`){console.error(`[Quasar] boot error:`,e.reason);return}return e.value.default})];return Promise[t]([$(()=>import(`./i18n-BQFPc-Bc.js`),[]),$(()=>import(`./network-auth-D9vq0xDI.js`),[]),$(()=>import(`./notify-theme-kRr6YTnZ.js`),[])]).then(t=>{cc(e,n(t).filter(e=>typeof e==`function`))})});export{ir as $,si as A,Wr as B,wi as C,gi as D,_i as E,ei as F,zr as G,Ur as H,$r as I,fr as J,kr as K,ai as L,ti as M,Zr as N,bi as O,Yr as P,rr as Q,ii as R,Pi as S,xi as T,Vr as U,q as V,Br as W,ar as X,sr as Y,nr as Z,Ki as _,W as _t,Wa as a,Pn as at,Li as b,U as bt,Ma as c,on as ct,Sa as d,qt as dt,er as et,ya as f,Jt as ft,Wi as g,Ot as gt,Hi as h,kt as ht,Ua as i,Ln as it,Xr as j,vi as k,Aa as l,tn as lt,J as m,At as mt,so as n,Qn as nt,La as o,Nn as ot,qi as p,Wt as pt,pr as q,oo as r,Mn as rt,Na as s,Fn as st,$ as t,$n as tt,Da as u,Zt as ut,Ri as v,yt as vt,Ci as w,Ii as x,zi as y,bt as yt,ri as z};
|