@loicngr/kobo 1.11.19 → 1.11.21
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 +10 -0
- package/dist/server/routes/settings.js +11 -0
- package/dist/server/routes/workspaces.js +4 -0
- package/dist/server/services/agent/engines/claude-code/engine.js +22 -5
- package/package.json +3 -3
- package/src/client/dist/pwa/assets/{ActivityFeed-DccO7DTb.css → ActivityFeed-DUjY6lCm.css} +1 -1
- package/src/client/dist/pwa/assets/{ActivityFeed-lkeL2lQi.js → ActivityFeed-DtsapcUb.js} +2 -2
- package/src/client/dist/pwa/assets/{ChangelogPage-C2x8Y9Db.js → ChangelogPage-D5FtafDI.js} +1 -1
- package/src/client/dist/pwa/assets/{CreatePage-BkaOk8cP.js → CreatePage-BhcHSOqz.js} +1 -1
- package/src/client/dist/pwa/assets/{DiffViewer-CfAoiuky.js → DiffViewer-B7CQC4kD.js} +3 -3
- package/src/client/dist/pwa/assets/{DocumentsPanel-T-rRRWru.js → DocumentsPanel-BgIrc-i0.js} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-DHvRFdbB.js +3 -0
- package/src/client/dist/pwa/assets/{HealthPage-CumhcFln.js → HealthPage-YqOn5Ig0.js} +1 -1
- package/src/client/dist/pwa/assets/{MainLayout-_WMLKlQ5.js → MainLayout-aDNwgrrT.js} +2 -2
- package/src/client/dist/pwa/assets/QBtnDropdown-COnv-9Kx.js +1 -0
- package/src/client/dist/pwa/assets/{SchedulePanel-DNAccoHC.js → SchedulePanel-CS__azUn.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-zLztBgSJ.js → SearchPage-CBQqJmmb.js} +1 -1
- package/src/client/dist/pwa/assets/{SettingsPage-dMAg4JP8.css → SettingsPage-CDZhPV6A.css} +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-kx7aNmeH.js +16 -0
- package/src/client/dist/pwa/assets/{TerminalPanel-BmVUy1id.js → TerminalPanel-lsPJEdE-.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspacePage-Cyoc2Mvs.js +4 -0
- package/src/client/dist/pwa/assets/WorkspacePage-xKaXyg_O.css +1 -0
- package/src/client/dist/pwa/assets/{build-path-tree-Wa8yj7QK.js → build-path-tree-CmNRcZvN.js} +1 -1
- package/src/client/dist/pwa/assets/{cssMode-HhxDIsCM.js → cssMode-DuFZt6Ie.js} +1 -1
- package/src/client/dist/pwa/assets/{editor.api-B5MwI9d4.js → editor.api-Dt5YHQkt.js} +1 -1
- package/src/client/dist/pwa/assets/{efforts-CdYNf6hH.js → efforts-C3gjASPy.js} +1 -1
- package/src/client/dist/pwa/assets/{engineFeatures-D1YuJ-DC.js → engineFeatures-DkgYepOC.js} +1 -1
- package/src/client/dist/pwa/assets/{expand-template-waz-D9d1.js → expand-template-CLqglUAa.js} +1 -1
- package/src/client/dist/pwa/assets/{freemarker2-jLQfsCvW.js → freemarker2-DQWkQIhe.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-CVC4Zbcc.js → handlebars-C8DkGF05.js} +1 -1
- package/src/client/dist/pwa/assets/{html-B13Gq4HD.js → html-DlhhK7Jm.js} +1 -1
- package/src/client/dist/pwa/assets/{htmlMode-zIxDJkV4.js → htmlMode-BVmEqAhh.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-C-chrpJN.js +1 -0
- package/src/client/dist/pwa/assets/{index-DTUtjyFL.js → index-B29y2aJO.js} +12 -12
- package/src/client/dist/pwa/assets/{index-Bri8-39E.css → index-BpmxQlZi.css} +1 -1
- package/src/client/dist/pwa/assets/{javascript-BH_oRQGk.js → javascript-C80MQqD5.js} +1 -1
- package/src/client/dist/pwa/assets/{jsonMode-DEZXT4tt.js → jsonMode-r9kfqNya.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-DupJ60S9.js → liquid-DT_yR5El.js} +1 -1
- package/src/client/dist/pwa/assets/{lspLanguageFeatures-8WuKcueM.js → lspLanguageFeatures-CY9UVeSD.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-krREYbpQ.js → mdx-C_PbX1dC.js} +1 -1
- package/src/client/dist/pwa/assets/{network-auth-CimyJZRs.js → network-auth-BP2CrR3z.js} +1 -1
- package/src/client/dist/pwa/assets/{notify-theme-Vqins57F.js → notify-theme-DIVwJeyL.js} +1 -1
- package/src/client/dist/pwa/assets/{pending-diff-open-Dzot60iG.js → pending-diff-open-B9fNhQic.js} +1 -1
- package/src/client/dist/pwa/assets/{permissionModes-CyTo3Uw7.js → permissionModes-Be3ZDmns.js} +1 -1
- package/src/client/dist/pwa/assets/{project-color-D2kPSvYd.js → project-color-Bc8ih-HF.js} +1 -1
- package/src/client/dist/pwa/assets/{python-CPyFKDpG.js → python-8G6qNwxa.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-DH0LB4f3.js → razor-BazUxiHR.js} +1 -1
- package/src/client/dist/pwa/assets/{render-chat-markdown-DKNMRgai.js → render-chat-markdown-CI48Q5rA.js} +1 -1
- package/src/client/dist/pwa/assets/{tsMode-CU_5ct2k.js → tsMode-BUJh8zAj.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-cUNbTjV8.js → typescript-C5pPIpSU.js} +1 -1
- package/src/client/dist/pwa/assets/{use-onboarding-DbIAv89p.js → use-onboarding-BQCOq7nO.js} +1 -1
- package/src/client/dist/pwa/assets/{vs-CDru4zWA.js → vs-QND9VumP.js} +3 -3
- package/src/client/dist/pwa/assets/{workers-CLWxCt-g.js → workers-CXEAdpVt.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-D2cBpO2j.js → xml-DNCFiQ9N.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-C1ITptUE.js → yaml-Ck1iNNOE.js} +1 -1
- package/src/client/dist/pwa/index.html +2 -2
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/client/dist/pwa/assets/GitPanel-DV8S3KFD.js +0 -3
- package/src/client/dist/pwa/assets/SettingsPage-D7dz4XsR.js +0 -16
- package/src/client/dist/pwa/assets/WorkspacePage-C94HHaL4.css +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-CsiPeq2V.js +0 -4
- package/src/client/dist/pwa/assets/i18n-CRyFzJ0j.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":`Bearbeite die vier Prompts unten selbst. Beginnt mit der agnostischen Basis.`,"settings.skillSuite.reloadDefaults":`Standard wiederherstellen`,"settings.skillSuite.reloadDefaultsConfirm":`Die vier benutzerdefinierten Prompts durch die agnostischen Standardwerte ersetzen?`,"settings.skillSuite.customPrompts":`Benutzerdefinierte Prompts`,"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-aDNwgrrT.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/QList-Ccqhimcb.js","assets/permissionModes-Be3ZDmns.js","assets/debounce-CDIE7CV6.js","assets/private.use-form-D8Yuc3aU.js","assets/QItemSection-CDBweQnA.js","assets/layout-nWIyHeJf.js","assets/QChip-BzB_GF4Z.js","assets/documents-B6eOZeFK.js","assets/ClosePopup-DEy0yFXE.js","assets/render-chat-markdown-CI48Q5rA.js","assets/QBadge-BgS0-MXB.js","assets/QSpace-D3PNLwa4.js","assets/efforts-C3gjASPy.js","assets/engineFeatures-DkgYepOC.js","assets/use-onboarding-BQCOq7nO.js","assets/TouchPan-DnEDaTFL.js","assets/use-onboarding-CTZuBZOi.css","assets/formatters-D0dU6VcA.js","assets/project-color-Bc8ih-HF.js","assets/MainLayout-BCIURScy.css","assets/WorkspacePage-Cyoc2Mvs.js","assets/QSpinnerDots-DWOFEezR.js","assets/clipboard-t9qe6lK7.js","assets/QPage-RpDxx5ah.js","assets/expand-template-CLqglUAa.js","assets/expand-template-B4LAsXAF.css","assets/QBanner-BoAbhM1O.js","assets/WorkspacePage-xKaXyg_O.css","assets/CreatePage-BhcHSOqz.js","assets/QBtnToggle-eMu_yinY.js","assets/QBtnGroup-BMQlX2YS.js","assets/DrawerToggleButton-CBdOJzVZ.js","assets/CreatePage-RMBX-Zjn.css","assets/SettingsPage-kx7aNmeH.js","assets/QBtnDropdown-COnv-9Kx.js","assets/SettingsPage-CDZhPV6A.css","assets/SearchPage-CBQqJmmb.js","assets/SearchPage-DdWM01rq.css","assets/HealthPage-YqOn5Ig0.js","assets/HealthPage-BbqLoFQj.css","assets/ChangelogPage-D5FtafDI.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.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)
|
|
@@ -9,13 +9,13 @@ KOBO_WORKSPACE_ID — Kōbō-Workspace-ID (auch nach Umbenennung stabil)
|
|
|
9
9
|
KOBO_WORKSPACE_NAME — Anzeigename des Workspaces
|
|
10
10
|
KOBO_FORGE — aufgelöste Forge: github / gitlab / none
|
|
11
11
|
KOBO_PR_NUMBER — PR-/MR-Nummer auf der aufgelösten Forge (leer wenn keine offen)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
|
|
12
|
-
# Dein Skript — benutze $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Auf Kōbō-Standard zurücksetzen`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Skript zurücksetzen?`,"settings.changeSourceBranchScript.replaceConfirm":`Deine Änderungen werden durch das Kōbō-Standardskript ersetzt. Fortfahren?`,"settings.cleanupScriptHint":`Shell-Skript, das im Worktree nach jeder Sitzung des Agenten ausgeführt wird. Im Auto-Loop läuft es nur, wenn alle Aufgaben erledigt sind. Leer lassen zum Deaktivieren.`,"settings.cleanupScriptPlaceholder":`z. B. temporäre Dateien löschen, Container stoppen…`,"settings.cleanupScriptMode":`Wann ausführen`,"settings.cleanupScriptMode.idle":`Nach jeder Sitzung — auch wenn Aufgaben übrig sind`,"settings.cleanupScriptMode.noTasks":`Nur wenn keine Kōbō-Aufgabe übrig ist`,"settings.cleanupScriptOnlyOnChanges":`Nur ausführen, wenn Dateien geändert, hinzugefügt oder gelöscht wurden`,"settings.cleanupScriptMode.inherit":`Globale Einstellung übernehmen`,"settings.taskPromptTemplate":`Aufgaben-Prompt`,"settings.taskPromptTemplatePlaceholder":`Prompt, der automatisch in die Aufgabenbeschreibung eingefügt wird…`,"settings.taskPromptTemplateHint":`Wird automatisch in die Aufgabenbeschreibung auf der Erstellungsseite eingefügt, wenn dieses Projekt ausgewählt ist. Unverändert wird er beim Projektwechsel ersetzt; sobald Sie ihn bearbeiten, bleibt Ihr Text erhalten.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Wird mit bash im Worktree nach der Erstellung ausgeführt, bevor der Agent startet. Kein Shebang erforderlich. Bei Fehler wird der Workspace auf Fehler gesetzt. Timeout: 5 Minuten.`,"settings.e2e.title":`E2E-Tests`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Keiner`,"settings.e2e.frameworkOther":`Anderer`,"settings.e2e.skill":`Skill (optional)`,"settings.e2e.skillPlaceholder":`z.B. cypress-tester`,"settings.e2e.prompt":`Eigene Anleitung (optional)`,"settings.e2e.promptPlaceholder":`z.B. Page-Object-Pattern, data-testid-Attribute verwenden`,"settings.e2e.helpText":`Wenn konfiguriert, fügt der Auto-Loop-Grooming-Agent E2E-Unteraufgaben für UI-Funktionen ein.`,"settings.finalization.title":`Auto-loop-Finalisierung`,"settings.finalization.helpText":`Optional: ein Prompt, den der Agent als allerletzte Auto-loop-Iteration ausführt. Wird typischerweise für finale Quality-Checks (Lint, Typecheck, Tests) verwendet. Die Grooming-Phase erstellt eine mit [FINAL] präfixierte Aufgabe, die diesen Prompt nutzt.`,"settings.finalization.prompt":`Finalisierungs-Prompt`,"settings.finalization.promptPlaceholder":`z. B. Führe npm run lint und npm test aus, dann markiere diese Aufgabe als erledigt.`,"settings.editorCommand":`Editor-Befehl`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Editor. Der Worktree-Pfad wird als Argument übergeben.`,"settings.fileManagerCommand":`Dateimanager-Befehl`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Dateimanager. Der Worktree-Pfad wird als Argument übergeben. Leer lassen, um den Button auszublenden.`,"settings.terminalCommand":`Terminal-Befehl`,"settings.terminalCommandHint":`Befehl zum Starten des Terminals im Worktree. Optionaler {path}-Platzhalter für das Verzeichnis.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Claude-MCP-Auswahl`,"settings.mcpAutoSelect":`Auto (erster passender aktiver MCP)`,"settings.notionMcp":`Notion-MCP-Schlüssel`,"settings.sentryMcp":`Sentry-MCP-Schlüssel`,"settings.mcpSelectionHint":`Aktive Einträge werden aus ~/.claude.json gelesen. Auto belassen für das Standard-Matching.`,"settings.configuredProjects":`Konfigurierte Projekte`,"settings.noProjects":`Keine Projekte konfiguriert`,"settings.addProject":`Projekt hinzufügen`,"settings.copyFrom":`Einstellungen kopieren von`,"settings.copyFromPlaceholder":`(keine — Standardwerte verwenden)`,"settings.copyFromHint":`Kopiert alle Einstellungen außer Pfad, Anzeigename und Quell-Branch.`,"settings.copyFromConfirmTitle":`Aktuelle Werte überschreiben?`,"settings.copyFromConfirm":`Damit werden die aktuellen Formularwerte durch die Einstellungen von „{project}" ersetzt. Fortfahren?`,"settings.newProject":`Neues Projekt`,"settings.editProject":`Projekt bearbeiten`,"settings.onboardingTitle":`Geführte Tour`,"settings.onboardingHint":`Spiele die Vorstellung der wichtigsten Oberflächenelemente erneut ab.`,"settings.onboardingReplay":`Geführte Tour erneut ansehen`,"onboarding.list.title":`Arbeitsbereiche`,"onboarding.list.description":`Jede Mission lebt in ihrem eigenen Bereich — ein dediziertes git-Worktree, ein Branch und eine Agent-Sitzung. Sie erscheinen alle hier.`,"onboarding.create.title":`Arbeitsbereich erstellen`,"onboarding.create.description":`Klicke auf +, um eine neue Mission zu starten — aus einem Notion-Ticket, einem Sentry-Issue oder von Grund auf.`,"onboarding.search.title":`Suche`,"onboarding.search.description":`Filtere deine Arbeitsbereiche nach Namen oder durchsuche den Verlauf der Agent-Konversationen.`,"onboarding.health.title":`Status`,"onboarding.health.description":`Prüfe den Zustand von Kōbō: Datenbank, aktive Agenten, Integrationen, Backups.`,"onboarding.changelog.title":`Was ist neu`,"onboarding.changelog.description":`Blättere durch die neuesten Kōbō-Releases: neue Funktionen, Fixes, Verhaltensänderungen. Ein Marker erscheint, wenn ein noch ungelesenes Release verfügbar ist.`,"onboarding.settings.title":`Einstellungen`,"onboarding.settings.description":`Modelle, Lifecycle-Skripte, Integrationen, Sprache — die gesamte Konfiguration von Kōbō findest du hier. Klicke auf Weiter für eine Tour durch jeden Bereich.`,"onboarding.settings-general.title":`Allgemein`,"onboarding.settings-general.description":`Oberflächensprache, Standardprojekt und globales Verhalten, das für jeden neuen Workspace gilt.`,"onboarding.settings-agents.title":`Agenten & Modelle`,"onboarding.settings-agents.description":`Wähle die Standard-Engine — Claude Code oder Codex —, das Modell und den Berechtigungsmodus der Agenten.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Wähle die Skill-Suite, die Agenten laden: die empfohlene Voreinstellung oder deine eigene Auswahl.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`PR-Beschreibungsvorlage und weitere wiederverwendbare Prompt-Texte für Agenten.`,"onboarding.settings-scripts.title":`Skripte`,"onboarding.settings-scripts.description":`Lifecycle-Skripte für Cleanup, Archivierung und Workspace-Setup — global oder pro Projekt.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Verbinde deinen Notion-Integrationstoken, um Tickets als Workspace-Missionen zu importieren.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Ein Sentry-Issue als Quelle der Wahrheit für einen Workspace importieren.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Wähle pro Projekt GitHub, GitLab oder keine. Kōbō steuert deine eigene gh-/glab-CLI — es liefert keine Zugangsdaten mit.`,"onboarding.settings-voice.title":`Sprache`,"onboarding.settings-voice.description":`Sprachdiktat: aktiviere es, wähle das Whisper-Modell und verwalte die lokale Spracherkennungs-Runtime.`,"onboarding.settings-notifications.title":`Benachrichtigungen`,"onboarding.settings-notifications.description":`Ton- und Browser-Benachrichtigungen für Agent-Ereignisse und Statusänderungen.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Git-Branch-Präfixe und der Ordner, in dem Workspace-Worktrees erstellt werden.`,"onboarding.settings-worktrees-purge.title":`Speicherplatz automatisch freigeben`,"onboarding.settings-worktrees-purge.description":"Aktiviere diesen Schalter, damit Kōbō den Worktree-Ordner (oft hunderte MB node_modules / vendor) entfernt, sobald eine PR gemerged wird. Chat-Verlauf und PR-Metadaten bleiben erhalten. Du kannst den Worktree später mit `gh pr checkout <pr>` neu erstellen — Kōbō erkennt die Wiederherstellung automatisch innerhalb von 30 Sekunden und reaktiviert den Workspace.","onboarding.settings-projects.title":`Projekte`,"onboarding.settings-projects.description":`Registriere die Repositories, an denen du arbeitest. Klicke auf „Projekt hinzufügen“, um Kōbō auf ein lokales Repository zu verweisen — jeder Workspace zielt auf eines dieser Projekte.`,"onboarding.settings-templates.title":`Vorlagen`,"onboarding.settings-templates.description":`Deine Bibliothek wiederverwendbarer Prompt-Vorlagen — wähle eine aus, um den Auftrag beim Erstellen eines Workspace vorzubefüllen.`,"onboarding.settings-export.title":`Import / Export`,"onboarding.settings-export.description":`Sichere oder teile deine Kōbō-Konfiguration und exportiere Workspace-Daten in eine Datei.`,"onboarding.firstWorkspace.title":`Erstelle deinen ersten Workspace`,"onboarding.firstWorkspace.description":`Darum geht es: eine Mission, ein Worktree, ein Agent. Öffne die Erstellungsseite, um loszulegen.`,"onboarding.next":`Weiter`,"onboarding.prev":`Zurück`,"onboarding.done":`Fertig`,"onboarding.exitConfirm":`Geführte Tour beenden? Du kannst sie jederzeit in den Einstellungen erneut starten.`,"settings.projectGroup.identity":`Identität`,"settings.projectGroup.defaults":`Standardwerte`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Skripte`,"settings.projectPath":`Projektpfad`,"settings.projectPathPlaceholder":`/pfad/zum/projekt`,"settings.displayName":`Anzeigename`,"settings.displayNamePlaceholder":`Mein Projekt`,"settings.defaultSourceBranch":`Standard-Quellbranch`,"settings.defaultModel.project":`Standardmodell`,"settings.skipPermissions.project":`Berechtigungsabfragen überspringen`,"settings.prPromptTemplate.project":`PR-Prompt-Vorlage`,"settings.prPromptPlaceholder.project":`Projektspezifische Anweisungen für PR-Erstellung...`,"settings.reviewPromptTemplate.project":`Review-Prompt-Vorlage`,"settings.ciFixPromptTemplate.project":`CI-Fix-Prompt-Vorlage`,"settings.gitConventions.project":`Git-Konventionen (Projekt)`,"settings.gitConventionsEmpty":`Leer lassen, um die globalen Konventionen zu verwenden.`,"settings.notionStatus":`Notion-Ticket-Status`,"settings.notionStatusProperty":`Eigenschaftsname`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Zu setzender Wert`,"settings.notionInProgressStatusPlaceholder":`In Bearbeitung, In progress...`,"settings.notionStatusHint":`Wenn ein Workspace mit einem Notion-Ticket erstellt wird, wird die angegebene Eigenschaft auf diesen Wert gesetzt. Beide Felder sind erforderlich. Leer lassen zum Deaktivieren.`,"settings.notionAssignee":`Notion-Zuweisung`,"settings.notionAssigneeHint":`Wenn ein Workspace mit einem Notion-Ticket erstellt wird, wird der über den Notion-MCP authentifizierte Benutzer dieser People-Eigenschaft hinzugefügt — nur wenn sie noch keinen Zuweisungsempfänger hat. Leer lassen zum Deaktivieren.`,"settings.notionAssigneeProperty":`Eigenschaftsname`,"settings.notionAssigneePropertyPlaceholder":`Entwickler, Assignees...`,"settings.notionUserId":`Deine Notion-UUID`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Wähle dein Konto aus der Liste. Notion lehnt Bot-Zuweisungen in People-Eigenschaften ab — dieses Feld ist erforderlich, um die automatische Zuweisung zu aktivieren.`,"settings.notionUsersRefresh":`Aktualisieren`,"settings.notionUsersLoading":`Notion-Benutzer werden geladen…`,"settings.notionUsersLoadFailed":`Liste konnte nicht geladen werden: {error}`,"settings.notionUsersManualFallback":`Liste nicht verfügbar — füge deine Notion-UUID manuell ein.`,"settings.devServer":`Dev-Server`,"settings.devServerStart":`Startskript`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Stoppskript`,"settings.devServerStopPlaceholder":`Optional — der Prozess wird automatisch beendet, wenn leer`,"settings.selectProject":`Projekt auswählen oder neues hinzufügen`,"settings.useGlobal":`Global verwenden`,"settings.saved":`Allgemeine Einstellungen gespeichert.`,"settings.unsavedChanges":`Nicht gespeicherte Änderungen`,"settings.nav.general":`Allgemein`,"settings.nav.agents":`Agenten`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Skripte`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Zugangsdaten bleiben lokal und werden nur von bkt verwendet.`,"settings.bitbucketUsername":`Atlassian-E-Mail`,"settings.bitbucketToken":`Bitbucket-API-Token`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Sprache`,"settings.nav.notifications":`Benachrichtigungen`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.openNav":`Navigation öffnen`,"settings.saveError":`Fehler beim Speichern der Einstellungen.`,"settings.projectSaved":`Projekt gespeichert.`,"settings.projectSaveError":`Fehler beim Speichern des Projekts.`,"settings.projectDeleted":`Projekt gelöscht.`,"settings.deleteProjectConfirmTitle":`Projekt löschen?`,"settings.deleteProjectConfirmMessage":`„{name}" aus Ihren Projekten entfernen? Dies löscht nur die Kōbō-Einstellungen — Ihr Code und Ihre Worktrees bleiben unberührt.`,"settings.projectDeleteError":`Fehler beim Löschen des Projekts.`,"settings.projectPathRequired":`Projektpfad ist erforderlich.`,"templates.title":`Vorlagen`,"templates.newTemplate":`Neue Vorlage`,"templates.editTemplate":`Vorlage bearbeiten`,"templates.deleteTemplate":`Vorlage löschen`,"templates.deleteConfirm":`Vorlage '/{slug}' löschen?`,"templates.deleteConfirmMessage":`Dies kann nicht rückgängig gemacht werden.`,"templates.slug":`Slug`,"templates.slugHint":`Kleinbuchstaben, Ziffern, Bindestriche. Max. 64 Zeichen.`,"templates.slugInvalid":`Slug darf nur Kleinbuchstaben, Ziffern und Bindestriche enthalten`,"templates.slugDuplicate":`Eine Vorlage mit diesem Slug existiert bereits`,"templates.description":`Beschreibung`,"templates.descriptionHint":`Kurzes Label, das im Dropdown angezeigt wird.`,"templates.descriptionRequired":`Beschreibung ist erforderlich`,"templates.contentRequired":`Inhalt ist erforderlich`,"templates.content":`Inhalt`,"templates.contentHint":`Vorlageninhalt. Verwende {variable_name} für Substitutionen.`,"templates.availableVars":`Verfügbare Variablen`,"templates.filePath":`Datei: {path}`,"templates.empty":`Noch keine Vorlagen.`,"templates.createFailed":`Vorlage konnte nicht erstellt werden`,"templates.updateFailed":`Vorlage konnte nicht aktualisiert werden`,"templates.deleteFailed":`Vorlage konnte nicht gelöscht werden`,"templates.save":`Speichern`,"templates.create":`Erstellen`,"templates.reloadDefaults":`Standardvorlagen neu laden`,"templates.reloadDefaultsHint":`Fügt nur fehlende Standardvorlagen hinzu. Bestehende Vorlagen (auch geänderte) werden nie überschrieben.`,"templates.reloadDefaultsConfirmMessage":`Diese Aktion fügt die fehlenden Standardvorlagen wieder zur Liste hinzu. Bestehende Vorlagen — einschließlich derjenigen, die du angepasst hast — werden nicht berührt. Wenn du eine geänderte Standardvorlage zurücksetzen möchtest, lösche sie zuerst und führe diese Aktion dann erneut aus.`,"templates.reloadDefaultsSuccess":`{added} hinzugefügt, {kept} beibehalten`,"templates.reloadDefaultsFailed":`Standardvorlagen konnten nicht neu geladen werden`,"templates.resetToDefault":`Auf Standard zurücksetzen`,"templates.resetConfirmTitle":`Template auf Standard zurücksetzen?`,"templates.resetConfirmMessage":`Dies überschreibt deine lokalen Änderungen an /{slug} mit dem Standard. Kann nicht rückgängig gemacht werden.`,"templates.resetSuccess":`Template /{slug} auf Standard zurückgesetzt`,"templates.resetFailed":`Zurücksetzen des Templates fehlgeschlagen`,"chatInput.dropdownSkills":`Claude-Skills`,"chatInput.dropdownKobo":`Kōbō-Befehle`,"chatInput.dropdownTemplates":`Vorlagen`,"documents.title":`Dokumente`,"documents.empty":`Keine Dokumente gefunden`,"documents.refresh":`Aktualisieren`,"documents.back":`Zurück`,"documents.loadFailed":`Dokument konnte nicht geladen werden`,"git.title":`Git`,"git.outputDialogTitle":`Git hat einen Fehler gemeldet`,"git.statsFailed":`Der Git-Status konnte nicht gelesen werden`,"git.section.repository":`Repository`,"git.section.changes":`Änderungen`,"git.section.pullRequest":`Pull Request`,"git.section.actions":`Aktionen`,"git.actions.more":`Mehr`,"git.localOnly":`nur lokal`,"git.pushed":`gepusht`,"git.unpushed":`{count} nicht gepusht`,"git.commits":`{count} Commit | {count} Commits`,"git.commits.loading":`Commits werden geladen…`,"git.commits.empty":`Keine Commits auf diesem Branch`,"git.commits.pushed":`Gepusht`,"git.commits.unpushed":`Ungepusht`,"git.commits.clickToAppend":`klicken, um SHA an Chat anzuhängen`,"git.commits.diffThisCommit":`Diff dieses Commits (vs Parent)`,"git.compareCommits":`Commits vergleichen…`,"git.files":`{count} Datei | {count} Dateien`,"git.staged":`{count} vorgemerkt`,"git.modified":`{count} geändert`,"git.untracked":`{count} nicht verfolgt`,"git.workingTreeEmpty":`Keine nicht committeten Änderungen`,"git.fileStaged":`Bereitgestellt`,"git.fileModified":`Geändert`,"git.fileUntracked":`Nicht verfolgt`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Sicherer als --force: Der Push wird abgelehnt, wenn der Remote Commits hat, die du nicht gesehen hast. Nach einem Rebase oder Amend bereits gepushter Commits verwenden.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`Kein Upstream für diesen Branch gesetzt — pushe ihn zuerst, um Pull zu aktivieren.`,"git.sync":`Sync`,"git.createPrNoRemote":`Branch zuerst pushen`,"git.viewRequest":`{request} anzeigen`,"git.createRequest":`{request} erstellen`,"git.changeRequestBase":`Zielbranch der {request} ändern`,"git.forgeCliMissing":`{cli} ist nicht installiert — installieren Sie es für {request}-Funktionen`,"git.forgeNotAuthenticated":`Nicht authentifiziert — {cli} auth login ausführen`,"settings.forge":`Forge`,"settings.forge.auto":`Automatisch erkennen`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Keine`,"git.pullConfirmTitle":`Branch pullen?`,"git.pullConfirmMessage":`{branch} vom Remote pullen (nur Fast-Forward).`,"git.branchPulled":`Branch gepullt`,"git.pullFailed":`Pull fehlgeschlagen`,"git.renameBranch":`Branch umbenennen`,"git.renameBranchPrompt":"`{branch}` umbenennen in:","git.renameBranchSuccess":"Branch umbenannt in `{branch}`","git.renameBranchFailed":`Branch umbenennen fehlgeschlagen`,"git.renameBranchExists":"Branch `{branch}` existiert bereits lokal oder auf origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Diff-Viewer im Review-Modus öffnen — Inline-Kommentare + Batch-Übergabe an den Agenten`,"pr.baseChanged":`PR-Base geändert: {oldBase} → {newBase}`,"pr.openPr":`PR öffnen`,"pr.openWorkspace":`Workspace öffnen`,"pr.dismiss":`Schließen`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Branch rebasen?`,"git.rebaseConfirmMessage":`Rebase auf {branch}. Es können Konflikte auftreten.`,"git.rebaseSuccess":`Rebase abgeschlossen`,"git.rebaseFailed":`Rebase fehlgeschlagen`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repository abgerufen`,"git.fetchFailed":`Fetch fehlgeschlagen: {error}`,"git.mergeConfirmTitle":`Branch mergen?`,"git.mergeConfirmMessage":`{branch} in diesen Branch mergen. Konflikte möglich.`,"git.mergeSuccess":`Merge abgeschlossen`,"git.mergeFailed":`Merge fehlgeschlagen`,"git.commitFailed":`Commit fehlgeschlagen`,"git.commitChanges":`Änderungen committen`,"git.commitDialogTitle":`Nicht committete Änderungen committen`,"git.commitDialogDescription":`Geben Sie Ihre Nachricht ein oder bitten Sie den Agenten, den Commit zu prüfen und zu erstellen.`,"git.commitMessage":`Commit-Nachricht`,"git.commitManual":`Committen`,"git.commitWithAgent":`Agenten fragen`,"git.commitAgentSuccess":`Commit-Anfrage an den Agenten gesendet`,"git.discardFailed":`Verwerfen fehlgeschlagen`,"git.conflictTitleMerge":`Merge-Konflikte erkannt`,"git.conflictTitleRebase":`Rebase-Konflikte erkannt`,"git.operationPausedTitle":`Git-Vorgang fortsetzen`,"git.operationPausedSubtitle":`Keine Dateien stehen im Konflikt. Git wartet nur darauf, dass du den Vorgang fortsetzt.`,"git.conflictSubtitle":`{count} Datei(en) mit Konflikten. Wie soll fortgefahren werden?`,"git.conflictAbortConfirmTitle":`Konfliktlösung verwerfen?`,"git.conflictAbortConfirmMessage":`Alles, was du in diesem {op} gelöst hast, wird verworfen und der Worktree kehrt in den Zustand davor zurück. Das lässt sich nicht rückgängig machen.`,"git.conflictAbort":`Abbrechen`,"git.conflictContinue":`Fortsetzen`,"git.conflictContinued":`Git-Vorgang fortgesetzt`,"git.conflictResolveWithAgent":`Agent soll auflösen`,"git.conflictAborted":`Vorgang abgebrochen`,"git.conflictHandoffSuccess":`Agent löst die Konflikte`,"git.dirtyTitleRebase":`Nicht committete Änderungen blockieren den Rebase`,"git.dirtyTitleMerge":`Nicht committete Änderungen blockieren den Merge`,"git.dirtyTitlePull":`Nicht committete Änderungen blockieren den Pull`,"git.dirtySubtitle":`{modified} geändert, {staged} bereitgestellt, {untracked} nicht verfolgt. Wähle, wie es weitergeht.`,"git.dirtyStash":`Stash & erneut versuchen`,"git.dirtyCommit":`Commit zuerst`,"git.dirtyCommitPlaceholder":`Commit-Nachricht`,"git.dirtyCommitConfirm":`Commit & erneut versuchen`,"git.dirtyDiscard":`Änderungen verwerfen`,"git.dirtyDiscardConfirmTitle":`Alle nicht committeten Änderungen verwerfen?`,"git.dirtyDiscardConfirmMessage":`Verfolgte Änderungen gehen verloren (git reset --hard). Nicht verfolgte Dateien bleiben erhalten. Nicht umkehrbar.`,"git.pushConfirmTitle":`Branch pushen?`,"git.pushConfirmMessage":`{branch} zum Remote pushen.`,"git.pushConfirmMessagePrefix":`Branch`,"git.pushConfirmMessageSuffix":`zum Remote pushen.`,"git.changePrBaseTitle":`Zielbranch ändern`,"git.changePrBaseMessage":`Geben Sie den neuen Zielbranch für den {request} ein.`,"git.changePrBaseSuccess":`{request}-Zielbranch aktualisiert`,"git.changePrBaseFailed":`{request}-Zielbranch konnte nicht geändert werden`,"git.mergeRequest":`{request} mergen`,"git.mergeRequestConfirmTitle":`{request} mergen?`,"git.mergeRequestConfirmMessage":`Dadurch wird die offene {request} in ihren Zielbranch gemergt.`,"git.mergeRequestSuccess":`{request} gemergt`,"git.mergeRequestFailed":`{request} konnte nicht gemergt werden`,"git.deleteRemoteBranch":`Remote-Branch löschen`,"git.deleteRemoteBranchTitle":`Remote-Branch löschen?`,"git.deleteRemoteBranchMessage":`Die Anfrage wurde gemergt. Remote-Branch {branch} löschen?`,"git.deleteRemoteBranchSuccess":`Remote-Branch {branch} gelöscht`,"git.deleteRemoteBranchFailed":`Remote-Branch konnte nicht gelöscht werden`,"git.changeSourceBranch":`Quellbranch ändern`,"git.changeSourceBranchTitle":`Quellbranch ändern`,"git.changeSourceBranchMessage":`Wähle den neuen Quellbranch. Der Arbeitsbranch wird darauf neu aufgebaut.`,"git.changeSourceBranchDone":`Quellbranch auf {branch} geändert`,"git.changeSourceBranchAligned":`Quellbranch auf {branch} geändert (Branch hatte keine eigenen Commits)`,"git.changeSourceBranchTooMany":`Der Branch hat zu viele eigene Commits ({n}) — bitte manuell rebasen`,"git.changeSourceBranchDirty":`Committe oder stashe deine Änderungen, bevor du den Quellbranch änderst`,"git.changeSourceBranchAgentRunning":`Stoppe den Agenten, bevor du den Quellbranch änderst`,"git.changeSourceBranchErrorTitle":`Quellbranch-Wechsel fehlgeschlagen`,"git.changeSourceBranchErrorOngoing":`Eine {op}-Operation läuft noch im Worktree. Brich sie ab, um zu einem sauberen Zustand zurückzukehren.`,"git.changeSourceBranchErrorAbort":`Operation abbrechen`,"git.changeSourceBranchLoading":`Quellbranch wird geändert…`,"git.changeSourceForcePushTitle":`Neu geschriebenen Branch force-pushen?`,"git.changeSourceForcePushMessage":`Die Branch-Historie wurde neu geschrieben. Mit --force-with-lease zum Remote pushen?`,"git.changeSourceForcePushDone":`Branch force-gepusht`,"git.openEditor":`Im Editor öffnen`,"git.openEditorFailed":`Editor konnte nicht geöffnet werden`,"git.branchPushed":`Branch gepusht`,"git.pushFirst":`Der Branch ist nicht auf dem Remote. Klicken Sie zuerst auf Push.`,"git.unpushedCommits":`Lokale Commits sind nicht gepusht. Klicken Sie zuerst auf Push.`,"git.from":`von`,"git.aheadBehindTooltip":`{ahead} commits voraus, {behind} hinterher gegenüber {source}`,"git.divergence.title":`Branch-Divergenz`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} voraus`,"git.divergence.behind":`↓ {count} hinterher`,"git.divergence.empty.ahead":`Keine Commits voraus.`,"git.divergence.empty.behind":`Keine Commits hinterher.`,"git.divergence.close":`Schließen`,"git.divergence.loading":`Commits werden geladen…`,"git.divergence.failed":`Divergenz konnte nicht geladen werden`,"git.divergence.retry":`Erneut versuchen`,"git.prCreated":`{request} #{n} erstellt`,"git.pr.author":`Autor`,"git.pr.reviewers":`Reviewer`,"git.pr.assignees":`Zugewiesen`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Änderungen angefordert`,"git.pr.approvedBadge":`Genehmigt`,"git.pr.ci.passed":`CI erfolgreich`,"git.pr.ci.failed":`CI fehlgeschlagen`,"git.pr.ci.pending":`CI läuft`,"git.pr.ci.failedCount":`{n} fehlgeschlagen`,"git.pr.ci.pendingCount":`{n} laufend`,"git.pr.ci.passedCount":`{n} erfolgreich`,"git.pr.ci.skippedCount":`{n} übersprungen`,"git.pr.ci.showPassed":`{n} erfolgreiche Jobs anzeigen`,"git.pr.ci.hidePassed":`Erfolgreiche Jobs ausblenden`,"toast.prChangesRequested":`Für PR #{n} wurden Änderungen angefordert`,"toast.prApproved":`PR #{n} wurde genehmigt`,"toast.prReadyToMerge":`PR #{n} ist bereit zum Mergen`,"toast.prCiFailed":`CI für PR #{n} ist fehlgeschlagen`,"toast.prCiRecovered":`CI für PR #{n} ist wieder erfolgreich`,"toast.prMergeConflict":`PR #{n} hat Merge-Konflikte`,"toast.prMerged":`PR #{n} wurde gemergt`,"devServer.title":`Dev-Server`,"devServer.noWorkspace":`Kein Arbeitsbereich ausgewählt`,"devServer.notConfigured":`Nicht konfiguriert —`,"devServer.goToSettings":`Einstellungen`,"devServer.logs":`Logs`,"devServer.running":`Läuft`,"devServer.starting":`Startet`,"devServer.stopping":`Wird gestoppt`,"devServer.error":`Fehler`,"devServer.stopped":`Gestoppt`,"devServer.unknown":`Unbekannt`,"devServer.containers":`{count} Container | {count} Container`,"devServer.logDialog.title":`Dev-Server-Logs`,"devServer.logDialog.empty":`Keine Logs verfügbar`,"notion.title":`Notion`,"tasks.title":`Aufgaben`,"notion.addTask":`Aufgabe hinzufügen`,"notion.noUrl":`Keine Notion-URL`,"notion.subtasks":`{done}/{total} Unteraufgaben`,"notion.noTasks":`Keine Aufgaben`,"notion.newTask":`Neue Aufgabe... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.title":`Akzeptanzkriterien`,"acceptance.addCriterion":`Kriterium hinzufügen`,"acceptance.newCriterion":`Neues Kriterium... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.empty":`Keine Akzeptanzkriterien`,"tasks.askProgress":`Agent auffordern, Fortschritt zu prüfen`,"agentTodos.title":`Agent-Todos`,"agentTodos.empty":`Keine Agent-Todos`,"subagents.title":`Sub-Agents`,"subagents.empty":`Noch keine Sub-Agent-Aktivität`,"subagents.tools":`{count} Tools`,"subagents.running":`Aktiv: `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Nutzungs-Bucket {n}`,"quotaFooter.lastUpdated":`Letzte Aktualisierung: {time}`,"quotaFooter.empty":`Lädt…`,"quotaFooter.popover.title":`Claude Code-Nutzung`,"quotaFooter.popover.refreshNow":`Aktualisieren`,"quotaFooter.popover.resetsIn":`Setzt sich zurück um {value}`,"quotaFooter.popover.unauthenticated":`Auth erforderlich`,"quotaFooter.popover.unauthenticatedHint":`Führe "claude" einmal aus, um dich zu authentifizieren.`,"quotaFooter.popover.error":`Fehler`,"quotaFooter.bucket.fiveHour":`5-Stunden`,"quotaFooter.bucket.sevenDay":`7 Tage`,"agent.error.spawn_failed":`Agent konnte nicht gestartet werden`,"agent.error.parse_error":`Eine Agent-Nachricht konnte nicht verarbeitet werden`,"agent.error.rate_limit":`Ratenlimit erreicht`,"agent.error.resume_failed":`Sitzung nicht gefunden — neue Sitzung wird gestartet`,"agent.error.other":`Agent-Fehler`,"quotaBackoff.banner.title":`Auto-Wiederaufnahme um {time}`,"quotaBackoff.banner.tooltip":`Claude-Kontingent erschöpft. Der Auto-Loop wird automatisch fortgesetzt, sobald sich das Kontingent bei {resets_at} zurücksetzt.`,"quotaBackoff.banner.cancel":`Wiederaufnahme abbrechen`,"quotaBackoff.cancelled":`Auto-Wiederaufnahme abgebrochen — du kannst jederzeit manuell fortfahren`,"rateLimitType.fiveHour":`5h-Sitzung`,"rateLimitType.sevenDay":`Wöchentlich`,"tooltip.addTask":`Aufgabe hinzufügen`,"tooltip.removeTask":`Aufgabe entfernen`,"tooltip.addCriterion":`Kriterium hinzufügen`,"tooltip.removeCriterion":`Kriterium entfernen`,"tooltip.startDevServer":`Dev-Server starten`,"tooltip.stopDevServer":`Dev-Server stoppen`,"tooltip.closeDiffViewer":`Diff schließen`,"tooltip.refreshLogs":`Logs aktualisieren`,"tooltip.closeDialog":`Schließen`,"tooltip.refreshGitStats":`Git-Statistiken aktualisieren`,"tooltip.removeImage":`Bild entfernen`,"tooltip.sendMessage":`Nachricht senden`,"tools.title":`Werkzeuge`,"tools.runSetupScript":`Setup-Skript erneut ausführen`,"tools.runSetupScriptTooltip":`Das Setup-Skript des Projekts im Worktree ausführen`,"tools.runSetupScriptConfirm":`Setup-Skript in diesem Workspace erneut ausführen? Vorhandene Artefakte können überschrieben werden.`,"tools.runSetupScriptBusy":`Setup kann nicht erneut ausgeführt werden, während der Agent arbeitet.`,"tools.noSetupScript":`Kein Setup-Skript konfiguriert —`,"tools.setupScriptSuccess":`Setup-Skript erfolgreich abgeschlossen.`,"tools.setupScriptFailed":`Setup-Skript fehlgeschlagen.`,"tools.openNotion":`In Notion öffnen`,"tools.openSentry":`In Sentry öffnen`,"tools.review":`Änderungen prüfen`,"tools.reviewTooltip":`Den Agenten bitten, die Änderungen auf diesem Branch zu prüfen`,"tools.reviewBusy":`Agent ist beschäftigt — warte, bis er inaktiv ist`,"tools.fixCi":`CI reparieren`,"tools.fixCiTooltip":`Den Agenten bitten, die fehlschlagenden CI-Jobs zu diagnostizieren und zu beheben`,"tools.fixCiLaunched":`CI-Fix-Aktion an den Agenten gesendet`,"tools.fixCiFailed":`CI-Fix-Aktion konnte nicht gestartet werden`,"tools.openFileManager":`Im Dateimanager öffnen`,"tools.openFileManagerTooltip":`Worktree-Ordner im konfigurierten Dateimanager öffnen`,"tools.openFileManagerFailed":`Dateimanager konnte nicht geöffnet werden`,"tools.openTerminal":`Im Terminal öffnen`,"tools.openTerminalTooltip":`Den Worktree im konfigurierten Terminal öffnen`,"tools.openTerminalFailed":`Terminal konnte nicht geöffnet werden`,"review.title":`Review starten`,"review.subtitle":`Bitte den Agenten, deine Änderungen zu prüfen und Feedback zu geben.`,"review.additionalInstructions":`Zusätzliche Anweisungen (optional)`,"review.additionalInstructionsPlaceholder":`Spezifische Hinweise für die Review hinzufügen…`,"review.newSession":`Neue Sitzung`,"review.newSessionHint":`Eine neue Agenten-Sitzung starten statt die aktuelle fortzusetzen.`,"review.start":`Review starten`,"review.cancel":`Abbrechen`,"review.launched":`Review gestartet`,"review.failed":`Review konnte nicht gestartet werden`,"diff.title":`Diff`,"diff.side":`Nebeneinander`,"diff.inline":`Inline`,"diff.hideUnchanged":`Unveränderten Code ausblenden`,"diff.showUnchanged":`Unveränderten Code anzeigen`,"diff.showUntracked":`Nicht versionierte Dateien anzeigen`,"diff.hideUntracked":`Nicht versionierte Dateien ausblenden`,"diff.rollbackToRemote":`Auf Remote-Version zurücksetzen`,"diff.rollbackConfirm":`{path} auf die Remote-Version (origin) zurücksetzen? Lokale Änderungen an dieser Datei gehen verloren.`,"diff.rollbackConfirmOk":`Zurücksetzen`,"diff.rollbackDone":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneRemote":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneHead":`Lokale Änderungen verworfen (Datei auf letzten Commit zurückgesetzt)`,"diff.rollbackDoneDeleted":`Nicht versionierte Datei gelöscht`,"diff.deleteUntracked":`Nicht versionierte Datei löschen`,"diff.deleteUntrackedConfirm":`{path} dauerhaft löschen? Diese Datei wird nicht von Git verfolgt — ihr Inhalt geht verloren.`,"diff.deleteUntrackedConfirmOk":`Löschen`,"diff.rollbackFailed":`Rollback fehlgeschlagen`,"diff.rollbackFailedDetail":`Rollback fehlgeschlagen: {error}`,"diff.modeInspect":`Bearbeiten`,"diff.modeReview":`Review`,"diff.addComment":`Kommentar hinzufügen`,"diff.replyComment":`Antworten`,"diff.editComment":`Bearbeiten`,"diff.deleteComment":`Löschen`,"diff.deleteCommentConfirm":`Diesen Kommentar löschen?`,"diff.commentPlaceholder":`Review-Kommentar schreiben… (Markdown unterstützt)`,"diff.reviewDraft":`Review-Entwurf`,"diff.reviewEmpty":`Noch keine Kommentare — fahre mit der Maus über eine Zeile im Diff und klicke +, um einen hinzuzufügen.`,"diff.reviewGlobalPlaceholder":`Optionale Gesamtnachricht zur Review`,"diff.submitReview":`Review absenden ({n})`,"diff.reviewSubmitted":`Review an den Agenten gesendet`,"diff.reviewSubmitFailed":`Review konnte nicht gesendet werden: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Ungepusht`,"diff.noChanges":`Keine Änderungen`,"diff.searchFiles":`Dateien suchen…`,"diff.noFileMatch":`Keine passende Datei`,"diff.selectFile":`Datei auswählen, um den Diff anzuzeigen`,"diff.fileLoadFailed":`Dieser Diff konnte nicht geladen werden`,"diff.fileLoadFailedHint":`Die Datei auf der Festplatte ist unverändert — nur der Diff konnte nicht geladen werden.`,"diff.fileListLoadFailed":`Die Dateiliste konnte nicht geladen werden`,"diff.fileListLoadFailedHint":`Das ist eine fehlgeschlagene Anfrage, kein Branch ohne Änderungen.`,"diff.addToChat":`Zum Chat hinzufügen`,"diff.compareTitle":`Commits vergleichen`,"diff.compareFrom":`Von`,"diff.compareTo":`Bis`,"diff.compareSubmit":`Vergleichen`,"diff.compareSourceBase":`{branch} (Branch-Basis)`,"diff.commitsReadOnly":`schreibgeschützt`,"diffViewer.save":`Speichern`,"diffViewer.savedAt":`Gespeichert`,"diffViewer.saveFailed":`Speichern fehlgeschlagen`,"diffViewer.saveFailedDetail":`Speichern fehlgeschlagen: {error}`,"diffViewer.unsavedChanges.title":`Nicht gespeicherte Änderungen`,"diffViewer.unsavedChanges.message":`Du hast nicht gespeicherte Änderungen. Was möchtest du tun?`,"diffViewer.unsavedChanges.save":`Speichern`,"diffViewer.unsavedChanges.cancel":`Abbrechen`,"diffViewer.conflict.title":`Datei wurde extern geändert`,"diffViewer.conflict.message":`Die Datei wurde außerhalb von Kōbō geändert, seit du sie geöffnet hast.`,"diffViewer.conflict.reload":`Neu laden (lokale Änderungen verwerfen)`,"diffViewer.conflict.keep":`Eigene behalten`,"diffViewer.conflict.overwrite":`Trotzdem überschreiben`,"diffViewer.conflict.overwriteHint":`Ersetzt die Datei auf der Festplatte durch deine Version. Die andere Änderung geht verloren.`,"diffViewer.conflict.keepHint":`Behält deine Änderungen im Editor und übernimmt die neue Signatur der Datei, damit das nächste Speichern funktioniert.`,"diffViewer.saveBlocked":`Der Agent läuft — stoppe ihn, um deine Änderungen zu speichern.`,"diffViewer.unsavedBanner":`Ungespeicherte Änderungen. Stoppe den Agenten, um sie zu sichern.`,"diffViewer.closeConfirm.title":`Ungespeicherte Änderungen`,"diffViewer.closeConfirm.message":`Diese Datei enthält nie gespeicherte Änderungen. Beim Schließen des Diff-Viewers gehen sie verloren.`,"diffViewer.closeConfirm.discard":`Ohne Speichern schließen`,"diffViewer.criteriaRail":`Review-Checkliste`,"diffViewer.criteriaRailShow":`Review-Checkliste einblenden`,"diffViewer.criteriaRailHide":`Review-Checkliste ausblenden`,"diffViewer.fileTreeShow":`Dateibaum einblenden`,"diffViewer.fileTreeHide":`Dateibaum ausblenden`,"diffViewer.closeConfirm.saveAndClose":`Speichern und schließen`,"diffViewer.agentRunning":`Agent läuft — stoppe ihn zum Bearbeiten`,"diffViewer.fileDeleted":`Datei gelöscht`,"notification.agentFinished":`{name} — Agent fertig`,"notification.agentQuestion":`{name} — Agent stellt eine Frage`,"notification.agentPermissionRequest":`{name} — Agent fragt nach einer Berechtigung`,"notification.autoLoopCompleted":`{name} — Auto-Loop abgeschlossen`,"notification.autoLoopStalled":`{name} — Auto-Loop blockiert (kein Fortschritt)`,"notification.autoLoopError":`{name} — Auto-Loop wegen Fehler gestoppt`,"notification.autoLoopAwaitingClarification":`{name} — Auto-Loop pausiert, wartet auf Ihre Klärung`,"notification.autoLoopPermissionOverridden":`{name} — Auto-Loop hat plan-Modus auf bypass erzwungen`,"notification.agentError":`{name} — Agent-Fehler`,"contextMenu.rename":`Umbenennen`,"contextMenu.editDescription":`Beschreibung bearbeiten`,"contextMenu.copyPath":`Worktree-Pfad kopieren`,"contextMenu.openEditor":`Im Editor öffnen`,"contextMenu.openFileManager":`Im Dateimanager öffnen`,"contextMenu.unarchiveDisabledPurged":"Der Worktree wurde von der Festplatte entfernt. Erstelle ihn manuell neu (`gh pr checkout` oder `git worktree add`) — Kōbō erkennt die Wiederherstellung innerhalb von 30 s und reaktiviert den Workspace automatisch.","workspaceList.unarchiveBlockedPurged":"Wiederherstellen nicht möglich: Der Worktree existiert nicht mehr auf der Festplatte. Erstelle ihn manuell neu (`gh pr checkout` oder `git worktree add`) — Kōbō erkennt ihn innerhalb von 30 s und reaktiviert den Workspace.","contextMenu.purgeWorktree":`Speicherplatz freigeben (Worktree löschen)`,"contextMenu.purgeWorktreeTooltip":`Löscht den Worktree von der Festplatte zur Speicherplatz-Rückgewinnung — Chat- und Sitzungsverlauf bleiben erhalten. Archiviert den Workspace automatisch.`,"contextMenu.purgeWorktreeDialogTitle":`Speicherplatz freigeben?`,"contextMenu.purgeWorktreeDialogMessage":`Der Worktree-Ordner von „{name}" wird von der Festplatte gelöscht. Chat- und Sitzungsverlauf bleiben erhalten. Der Workspace wird automatisch archiviert. In der aktuellen Version nicht rückgängig zu machen.`,"contextMenu.purgeWorktreeDialogConfirm":`Worktree löschen`,"contextMenu.purgeWorktreeSuccess":`Worktree gelöscht — Speicherplatz zurückgewonnen.`,"settings.autoPurgeOnPrMerged":`Worktree automatisch löschen, wenn PR gemerged`,"settings.autoPurgeOnPrMergedHint":`Wenn aktiviert, wird der Worktree von der Festplatte gelöscht, sobald die PR gemerged wird (zusätzlich zur automatischen Archivierung). Chat-Verlauf bleibt erhalten.`,"settings.autoLoopMaxRetries":`Maximale automatische Wiederholungen`,"settings.autoLoopMaxRetriesHint":`Stoppt die Auto-Loop nach dieser Anzahl von Quota- oder vorübergehenden Serverfehlern.`,"settings.retentionTitle":`Aufbewahrung des Konversationsverlaufs (standardmäßig aus)`,"settings.retentionWarning":`Wird diese Option aktiviert, löscht sie den Konversationsverlauf der Agenten endgültig aus der Datenbank — zuerst alles, was bereits älter als das Zeitfenster ist. Gelöschte Ereignisse lassen sich nicht wiederherstellen.`,"settings.retentionHint":`Läuft einmal beim Start des Servers. Workspaces, Aufgaben, Sessions, Branches und Worktrees bleiben unberührt — betroffen ist nur die aufgezeichnete Agentenausgabe.`,"settings.retentionDaysLabel":`Ereignisse löschen, die älter sind als (Tage)`,"settings.retentionDaysHint":`0 — der Standard — behält alle Ereignisse dauerhaft. Tragen Sie einen Wert ein, um die Aufbewahrung zu aktivieren.`,"settings.retentionKeepLabel":`Immer behaltene Ereignisse pro Workspace`,"settings.retentionKeepHint":`Die neuesten Ereignisse jedes Workspace bleiben unabhängig von ihrem Alter erhalten, damit ein alter, aber noch offener Workspace einen lesbaren Verlauf behält. Empfohlen: 5000.`,"settings.retentionDisabledHint":`Aufbewahrung deaktiviert: Es wird nie etwas gelöscht.`,"settings.retentionConfirmTitle":`Konversationsverlauf endgültig löschen?`,"settings.retentionConfirmMessage":`Nur {days} Tag(e) Verlauf zu behalten löscht beim nächsten Serverstart endgültig {count} der {total} aufgezeichneten Agentenereignisse — einschließlich allem, was bereits älter ist. Das lässt sich nicht rückgängig machen. Fortfahren?`,"settings.retentionConfirmMessageUnknown":`Nur {days} Tag(e) Verlauf zu behalten löscht beim nächsten Serverstart endgültig alle älteren Agentenereignisse — einschließlich allem, was bereits angesammelt wurde. Die genaue Menge konnte nicht ermittelt werden. Das lässt sich nicht rückgängig machen. Fortfahren?`,"settings.purgeDocsTitle":`Wie Purge funktioniert — Wiederherstellung & Berechtigungen`,"settings.purgeDocsRestoreTitle":`Einen bereinigten Worktree wiederherstellen (automatisch erkannt)`,"settings.purgeDocsRestoreIntro":`Ein bereinigter Workspace behält seinen Chat-Verlauf und die PR-Metadaten, aber der Worktree-Ordner ist weg. Baue ihn manuell mit einem dieser Befehle wieder auf — Kōbō erkennt das Wiedererscheinen des Ordners innerhalb von 30 Sekunden und reaktiviert den Workspace automatisch (entarchivieren + Purge-Flag löschen):`,"settings.purgeDocsRestoreCommands":`# GitHub (mit gh CLI):
|
|
12
|
+
# Dein Skript — benutze $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Auf Kōbō-Standard zurücksetzen`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Skript zurücksetzen?`,"settings.changeSourceBranchScript.replaceConfirm":`Deine Änderungen werden durch das Kōbō-Standardskript ersetzt. Fortfahren?`,"settings.cleanupScriptHint":`Shell-Skript, das im Worktree nach jeder Sitzung des Agenten ausgeführt wird. Im Auto-Loop läuft es nur, wenn alle Aufgaben erledigt sind. Leer lassen zum Deaktivieren.`,"settings.cleanupScriptPlaceholder":`z. B. temporäre Dateien löschen, Container stoppen…`,"settings.cleanupScriptMode":`Wann ausführen`,"settings.cleanupScriptMode.idle":`Nach jeder Sitzung — auch wenn Aufgaben übrig sind`,"settings.cleanupScriptMode.noTasks":`Nur wenn keine Kōbō-Aufgabe übrig ist`,"settings.cleanupScriptOnlyOnChanges":`Nur ausführen, wenn Dateien geändert, hinzugefügt oder gelöscht wurden`,"settings.cleanupScriptMode.inherit":`Globale Einstellung übernehmen`,"settings.taskPromptTemplate":`Aufgaben-Prompt`,"settings.taskPromptTemplatePlaceholder":`Prompt, der automatisch in die Aufgabenbeschreibung eingefügt wird…`,"settings.taskPromptTemplateHint":`Wird automatisch in die Aufgabenbeschreibung auf der Erstellungsseite eingefügt, wenn dieses Projekt ausgewählt ist. Unverändert wird er beim Projektwechsel ersetzt; sobald Sie ihn bearbeiten, bleibt Ihr Text erhalten.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Wird mit bash im Worktree nach der Erstellung ausgeführt, bevor der Agent startet. Kein Shebang erforderlich. Bei Fehler wird der Workspace auf Fehler gesetzt. Timeout: 5 Minuten.`,"settings.e2e.title":`E2E-Tests`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Keiner`,"settings.e2e.frameworkOther":`Anderer`,"settings.e2e.skill":`Skill (optional)`,"settings.e2e.skillPlaceholder":`z.B. cypress-tester`,"settings.e2e.prompt":`Eigene Anleitung (optional)`,"settings.e2e.promptPlaceholder":`z.B. Page-Object-Pattern, data-testid-Attribute verwenden`,"settings.e2e.helpText":`Wenn konfiguriert, fügt der Auto-Loop-Grooming-Agent E2E-Unteraufgaben für UI-Funktionen ein.`,"settings.finalization.title":`Auto-loop-Finalisierung`,"settings.finalization.helpText":`Optional: ein Prompt, den der Agent als allerletzte Auto-loop-Iteration ausführt. Wird typischerweise für finale Quality-Checks (Lint, Typecheck, Tests) verwendet. Die Grooming-Phase erstellt eine mit [FINAL] präfixierte Aufgabe, die diesen Prompt nutzt.`,"settings.finalization.prompt":`Finalisierungs-Prompt`,"settings.finalization.promptPlaceholder":`z. B. Führe npm run lint und npm test aus, dann markiere diese Aufgabe als erledigt.`,"settings.editorCommand":`Editor-Befehl`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Editor. Der Worktree-Pfad wird als Argument übergeben.`,"settings.fileManagerCommand":`Dateimanager-Befehl`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Dateimanager. Der Worktree-Pfad wird als Argument übergeben. Leer lassen, um den Button auszublenden.`,"settings.terminalCommand":`Terminal-Befehl`,"settings.terminalCommandHint":`Befehl zum Starten des Terminals im Worktree. Optionaler {path}-Platzhalter für das Verzeichnis.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Claude-MCP-Auswahl`,"settings.mcpAutoSelect":`Auto (erster passender aktiver MCP)`,"settings.notionMcp":`Notion-MCP-Schlüssel`,"settings.sentryMcp":`Sentry-MCP-Schlüssel`,"settings.mcpSelectionHint":`Aktive Einträge werden aus ~/.claude.json gelesen. Auto belassen für das Standard-Matching.`,"settings.configuredProjects":`Konfigurierte Projekte`,"settings.noProjects":`Keine Projekte konfiguriert`,"settings.addProject":`Projekt hinzufügen`,"settings.copyFrom":`Einstellungen kopieren von`,"settings.copyFromPlaceholder":`(keine — Standardwerte verwenden)`,"settings.copyFromHint":`Kopiert alle Einstellungen außer Pfad, Anzeigename und Quell-Branch.`,"settings.copyFromConfirmTitle":`Aktuelle Werte überschreiben?`,"settings.copyFromConfirm":`Damit werden die aktuellen Formularwerte durch die Einstellungen von „{project}" ersetzt. Fortfahren?`,"settings.newProject":`Neues Projekt`,"settings.editProject":`Projekt bearbeiten`,"settings.onboardingTitle":`Geführte Tour`,"settings.onboardingHint":`Spiele die Vorstellung der wichtigsten Oberflächenelemente erneut ab.`,"settings.onboardingReplay":`Geführte Tour erneut ansehen`,"onboarding.list.title":`Arbeitsbereiche`,"onboarding.list.description":`Jede Mission lebt in ihrem eigenen Bereich — ein dediziertes git-Worktree, ein Branch und eine Agent-Sitzung. Sie erscheinen alle hier.`,"onboarding.create.title":`Arbeitsbereich erstellen`,"onboarding.create.description":`Klicke auf +, um eine neue Mission zu starten — aus einem Notion-Ticket, einem Sentry-Issue oder von Grund auf.`,"onboarding.search.title":`Suche`,"onboarding.search.description":`Filtere deine Arbeitsbereiche nach Namen oder durchsuche den Verlauf der Agent-Konversationen.`,"onboarding.health.title":`Status`,"onboarding.health.description":`Prüfe den Zustand von Kōbō: Datenbank, aktive Agenten, Integrationen, Backups.`,"onboarding.changelog.title":`Was ist neu`,"onboarding.changelog.description":`Blättere durch die neuesten Kōbō-Releases: neue Funktionen, Fixes, Verhaltensänderungen. Ein Marker erscheint, wenn ein noch ungelesenes Release verfügbar ist.`,"onboarding.settings.title":`Einstellungen`,"onboarding.settings.description":`Modelle, Lifecycle-Skripte, Integrationen, Sprache — die gesamte Konfiguration von Kōbō findest du hier. Klicke auf Weiter für eine Tour durch jeden Bereich.`,"onboarding.settings-general.title":`Allgemein`,"onboarding.settings-general.description":`Oberflächensprache, Standardprojekt und globales Verhalten, das für jeden neuen Workspace gilt.`,"onboarding.settings-agents.title":`Agenten & Modelle`,"onboarding.settings-agents.description":`Wähle die Standard-Engine — Claude Code oder Codex —, das Modell und den Berechtigungsmodus der Agenten.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Wähle die Skill-Suite, die Agenten laden: die empfohlene Voreinstellung oder deine eigene Auswahl.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`PR-Beschreibungsvorlage und weitere wiederverwendbare Prompt-Texte für Agenten.`,"onboarding.settings-scripts.title":`Skripte`,"onboarding.settings-scripts.description":`Lifecycle-Skripte für Cleanup, Archivierung und Workspace-Setup — global oder pro Projekt.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Verbinde deinen Notion-Integrationstoken, um Tickets als Workspace-Missionen zu importieren.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Ein Sentry-Issue als Quelle der Wahrheit für einen Workspace importieren.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Wähle pro Projekt GitHub, GitLab oder keine. Kōbō steuert deine eigene gh-/glab-CLI — es liefert keine Zugangsdaten mit.`,"onboarding.settings-voice.title":`Sprache`,"onboarding.settings-voice.description":`Sprachdiktat: aktiviere es, wähle das Whisper-Modell und verwalte die lokale Spracherkennungs-Runtime.`,"onboarding.settings-notifications.title":`Benachrichtigungen`,"onboarding.settings-notifications.description":`Ton- und Browser-Benachrichtigungen für Agent-Ereignisse und Statusänderungen.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Git-Branch-Präfixe und der Ordner, in dem Workspace-Worktrees erstellt werden.`,"onboarding.settings-worktrees-purge.title":`Speicherplatz automatisch freigeben`,"onboarding.settings-worktrees-purge.description":"Aktiviere diesen Schalter, damit Kōbō den Worktree-Ordner (oft hunderte MB node_modules / vendor) entfernt, sobald eine PR gemerged wird. Chat-Verlauf und PR-Metadaten bleiben erhalten. Du kannst den Worktree später mit `gh pr checkout <pr>` neu erstellen — Kōbō erkennt die Wiederherstellung automatisch innerhalb von 30 Sekunden und reaktiviert den Workspace.","onboarding.settings-projects.title":`Projekte`,"onboarding.settings-projects.description":`Registriere die Repositories, an denen du arbeitest. Klicke auf „Projekt hinzufügen“, um Kōbō auf ein lokales Repository zu verweisen — jeder Workspace zielt auf eines dieser Projekte.`,"onboarding.settings-templates.title":`Vorlagen`,"onboarding.settings-templates.description":`Deine Bibliothek wiederverwendbarer Prompt-Vorlagen — wähle eine aus, um den Auftrag beim Erstellen eines Workspace vorzubefüllen.`,"onboarding.settings-export.title":`Import / Export`,"onboarding.settings-export.description":`Sichere oder teile deine Kōbō-Konfiguration und exportiere Workspace-Daten in eine Datei.`,"onboarding.firstWorkspace.title":`Erstelle deinen ersten Workspace`,"onboarding.firstWorkspace.description":`Darum geht es: eine Mission, ein Worktree, ein Agent. Öffne die Erstellungsseite, um loszulegen.`,"onboarding.next":`Weiter`,"onboarding.prev":`Zurück`,"onboarding.done":`Fertig`,"onboarding.exitConfirm":`Geführte Tour beenden? Du kannst sie jederzeit in den Einstellungen erneut starten.`,"settings.projectGroup.identity":`Identität`,"settings.projectGroup.defaults":`Standardwerte`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Skripte`,"settings.projectPath":`Projektpfad`,"settings.projectPathPlaceholder":`/pfad/zum/projekt`,"settings.displayName":`Anzeigename`,"settings.displayNamePlaceholder":`Mein Projekt`,"settings.defaultSourceBranch":`Standard-Quellbranch`,"settings.defaultModel.project":`Standardmodell`,"settings.skipPermissions.project":`Berechtigungsabfragen überspringen`,"settings.prPromptTemplate.project":`PR-Prompt-Vorlage`,"settings.prPromptPlaceholder.project":`Projektspezifische Anweisungen für PR-Erstellung...`,"settings.reviewPromptTemplate.project":`Review-Prompt-Vorlage`,"settings.ciFixPromptTemplate.project":`CI-Fix-Prompt-Vorlage`,"settings.gitConventions.project":`Git-Konventionen (Projekt)`,"settings.gitConventionsEmpty":`Leer lassen, um die globalen Konventionen zu verwenden.`,"settings.notionStatus":`Notion-Ticket-Status`,"settings.notionStatusProperty":`Eigenschaftsname`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Zu setzender Wert`,"settings.notionInProgressStatusPlaceholder":`In Bearbeitung, In progress...`,"settings.notionStatusHint":`Wenn ein Workspace mit einem Notion-Ticket erstellt wird, wird die angegebene Eigenschaft auf diesen Wert gesetzt. Beide Felder sind erforderlich. Leer lassen zum Deaktivieren.`,"settings.notionAssignee":`Notion-Zuweisung`,"settings.notionAssigneeHint":`Wenn ein Workspace mit einem Notion-Ticket erstellt wird, wird der über den Notion-MCP authentifizierte Benutzer dieser People-Eigenschaft hinzugefügt — nur wenn sie noch keinen Zuweisungsempfänger hat. Leer lassen zum Deaktivieren.`,"settings.notionAssigneeProperty":`Eigenschaftsname`,"settings.notionAssigneePropertyPlaceholder":`Entwickler, Assignees...`,"settings.notionUserId":`Deine Notion-UUID`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Wähle dein Konto aus der Liste. Notion lehnt Bot-Zuweisungen in People-Eigenschaften ab — dieses Feld ist erforderlich, um die automatische Zuweisung zu aktivieren.`,"settings.notionUsersRefresh":`Aktualisieren`,"settings.notionUsersLoading":`Notion-Benutzer werden geladen…`,"settings.notionUsersLoadFailed":`Liste konnte nicht geladen werden: {error}`,"settings.notionUsersManualFallback":`Liste nicht verfügbar — füge deine Notion-UUID manuell ein.`,"settings.devServer":`Dev-Server`,"settings.devServerStart":`Startskript`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Stoppskript`,"settings.devServerStopPlaceholder":`Optional — der Prozess wird automatisch beendet, wenn leer`,"settings.selectProject":`Projekt auswählen oder neues hinzufügen`,"settings.useGlobal":`Global verwenden`,"settings.saved":`Allgemeine Einstellungen gespeichert.`,"settings.unsavedChanges":`Nicht gespeicherte Änderungen`,"settings.nav.general":`Allgemein`,"settings.nav.agents":`Agenten`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Skripte`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Zugangsdaten bleiben lokal und werden nur von bkt verwendet.`,"settings.bitbucketUsername":`Atlassian-E-Mail`,"settings.bitbucketToken":`Bitbucket-API-Token`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Sprache`,"settings.nav.notifications":`Benachrichtigungen`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.openNav":`Navigation öffnen`,"settings.saveError":`Fehler beim Speichern der Einstellungen.`,"settings.projectSaved":`Projekt gespeichert.`,"settings.projectSaveError":`Fehler beim Speichern des Projekts.`,"settings.projectDeleted":`Projekt gelöscht.`,"settings.deleteProjectConfirmTitle":`Projekt löschen?`,"settings.deleteProjectConfirmMessage":`„{name}" aus Ihren Projekten entfernen? Dies löscht nur die Kōbō-Einstellungen — Ihr Code und Ihre Worktrees bleiben unberührt.`,"settings.projectDeleteError":`Fehler beim Löschen des Projekts.`,"settings.projectPathRequired":`Projektpfad ist erforderlich.`,"templates.title":`Vorlagen`,"templates.newTemplate":`Neue Vorlage`,"templates.editTemplate":`Vorlage bearbeiten`,"templates.deleteTemplate":`Vorlage löschen`,"templates.deleteConfirm":`Vorlage '/{slug}' löschen?`,"templates.deleteConfirmMessage":`Dies kann nicht rückgängig gemacht werden.`,"templates.slug":`Slug`,"templates.slugHint":`Kleinbuchstaben, Ziffern, Bindestriche. Max. 64 Zeichen.`,"templates.slugInvalid":`Slug darf nur Kleinbuchstaben, Ziffern und Bindestriche enthalten`,"templates.slugDuplicate":`Eine Vorlage mit diesem Slug existiert bereits`,"templates.description":`Beschreibung`,"templates.descriptionHint":`Kurzes Label, das im Dropdown angezeigt wird.`,"templates.descriptionRequired":`Beschreibung ist erforderlich`,"templates.contentRequired":`Inhalt ist erforderlich`,"templates.content":`Inhalt`,"templates.contentHint":`Vorlageninhalt. Verwende {variable_name} für Substitutionen.`,"templates.availableVars":`Verfügbare Variablen`,"templates.filePath":`Datei: {path}`,"templates.empty":`Noch keine Vorlagen.`,"templates.createFailed":`Vorlage konnte nicht erstellt werden`,"templates.updateFailed":`Vorlage konnte nicht aktualisiert werden`,"templates.deleteFailed":`Vorlage konnte nicht gelöscht werden`,"templates.save":`Speichern`,"templates.create":`Erstellen`,"templates.reloadDefaults":`Standardvorlagen neu laden`,"templates.reloadDefaultsHint":`Fügt nur fehlende Standardvorlagen hinzu. Bestehende Vorlagen (auch geänderte) werden nie überschrieben.`,"templates.reloadDefaultsConfirmMessage":`Diese Aktion fügt die fehlenden Standardvorlagen wieder zur Liste hinzu. Bestehende Vorlagen — einschließlich derjenigen, die du angepasst hast — werden nicht berührt. Wenn du eine geänderte Standardvorlage zurücksetzen möchtest, lösche sie zuerst und führe diese Aktion dann erneut aus.`,"templates.reloadDefaultsSuccess":`{added} hinzugefügt, {kept} beibehalten`,"templates.reloadDefaultsFailed":`Standardvorlagen konnten nicht neu geladen werden`,"templates.resetToDefault":`Auf Standard zurücksetzen`,"templates.resetConfirmTitle":`Template auf Standard zurücksetzen?`,"templates.resetConfirmMessage":`Dies überschreibt deine lokalen Änderungen an /{slug} mit dem Standard. Kann nicht rückgängig gemacht werden.`,"templates.resetSuccess":`Template /{slug} auf Standard zurückgesetzt`,"templates.resetFailed":`Zurücksetzen des Templates fehlgeschlagen`,"chatInput.dropdownSkills":`Claude-Skills`,"chatInput.dropdownKobo":`Kōbō-Befehle`,"chatInput.dropdownTemplates":`Vorlagen`,"documents.title":`Dokumente`,"documents.empty":`Keine Dokumente gefunden`,"documents.refresh":`Aktualisieren`,"documents.back":`Zurück`,"documents.loadFailed":`Dokument konnte nicht geladen werden`,"git.title":`Git`,"git.outputDialogTitle":`Git hat einen Fehler gemeldet`,"git.statsFailed":`Der Git-Status konnte nicht gelesen werden`,"git.section.repository":`Repository`,"git.section.changes":`Änderungen`,"git.section.pullRequest":`Pull Request`,"git.section.actions":`Aktionen`,"git.actions.more":`Mehr`,"git.localOnly":`nur lokal`,"git.pushed":`gepusht`,"git.unpushed":`{count} nicht gepusht`,"git.commits":`{count} Commit | {count} Commits`,"git.commits.loading":`Commits werden geladen…`,"git.commits.empty":`Keine Commits auf diesem Branch`,"git.commits.pushed":`Gepusht`,"git.commits.unpushed":`Ungepusht`,"git.commits.clickToAppend":`klicken, um SHA an Chat anzuhängen`,"git.commits.diffThisCommit":`Diff dieses Commits (vs Parent)`,"git.compareCommits":`Commits vergleichen…`,"git.files":`{count} Datei | {count} Dateien`,"git.staged":`{count} vorgemerkt`,"git.modified":`{count} geändert`,"git.untracked":`{count} nicht verfolgt`,"git.workingTreeEmpty":`Keine nicht committeten Änderungen`,"git.fileStaged":`Bereitgestellt`,"git.fileModified":`Geändert`,"git.fileUntracked":`Nicht verfolgt`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Sicherer als --force: Der Push wird abgelehnt, wenn der Remote Commits hat, die du nicht gesehen hast. Nach einem Rebase oder Amend bereits gepushter Commits verwenden.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`Kein Upstream für diesen Branch gesetzt — pushe ihn zuerst, um Pull zu aktivieren.`,"git.sync":`Sync`,"git.createPrNoRemote":`Branch zuerst pushen`,"git.viewRequest":`{request} anzeigen`,"git.createRequest":`{request} erstellen`,"git.changeRequestBase":`Zielbranch der {request} ändern`,"git.forgeCliMissing":`{cli} ist nicht installiert — installieren Sie es für {request}-Funktionen`,"git.forgeNotAuthenticated":`Nicht authentifiziert — {cli} auth login ausführen`,"settings.forge":`Forge`,"settings.forge.auto":`Automatisch erkennen`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Keine`,"git.pullConfirmTitle":`Branch pullen?`,"git.pullConfirmMessage":`{branch} vom Remote pullen (nur Fast-Forward).`,"git.branchPulled":`Branch gepullt`,"git.pullFailed":`Pull fehlgeschlagen`,"git.renameBranch":`Branch umbenennen`,"git.renameBranchPrompt":"`{branch}` umbenennen in:","git.renameBranchSuccess":"Branch umbenannt in `{branch}`","git.renameBranchFailed":`Branch umbenennen fehlgeschlagen`,"git.renameBranchExists":"Branch `{branch}` existiert bereits lokal oder auf origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Diff-Viewer im Review-Modus öffnen — Inline-Kommentare + Batch-Übergabe an den Agenten`,"pr.baseChanged":`PR-Base geändert: {oldBase} → {newBase}`,"pr.openPr":`PR öffnen`,"pr.openWorkspace":`Workspace öffnen`,"pr.dismiss":`Schließen`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Branch rebasen?`,"git.rebaseConfirmMessage":`Rebase auf {branch}. Es können Konflikte auftreten.`,"git.rebaseSuccess":`Rebase abgeschlossen`,"git.rebaseFailed":`Rebase fehlgeschlagen`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repository abgerufen`,"git.fetchFailed":`Fetch fehlgeschlagen: {error}`,"git.mergeConfirmTitle":`Branch mergen?`,"git.mergeConfirmMessage":`{branch} in diesen Branch mergen. Konflikte möglich.`,"git.mergeSuccess":`Merge abgeschlossen`,"git.mergeFailed":`Merge fehlgeschlagen`,"git.commitFailed":`Commit fehlgeschlagen`,"git.commitChanges":`Änderungen committen`,"git.commitDialogTitle":`Nicht committete Änderungen committen`,"git.commitDialogDescription":`Geben Sie Ihre Nachricht ein oder bitten Sie den Agenten, den Commit zu prüfen und zu erstellen.`,"git.commitMessage":`Commit-Nachricht`,"git.commitManual":`Committen`,"git.commitWithAgent":`Agenten fragen`,"git.commitAgentSuccess":`Commit-Anfrage an den Agenten gesendet`,"git.discardFailed":`Verwerfen fehlgeschlagen`,"git.conflictTitleMerge":`Merge-Konflikte erkannt`,"git.conflictTitleRebase":`Rebase-Konflikte erkannt`,"git.operationPausedTitle":`Git-Vorgang fortsetzen`,"git.operationPausedSubtitle":`Keine Dateien stehen im Konflikt. Git wartet nur darauf, dass du den Vorgang fortsetzt.`,"git.conflictSubtitle":`{count} Datei(en) mit Konflikten. Wie soll fortgefahren werden?`,"git.conflictAbortConfirmTitle":`Konfliktlösung verwerfen?`,"git.conflictAbortConfirmMessage":`Alles, was du in diesem {op} gelöst hast, wird verworfen und der Worktree kehrt in den Zustand davor zurück. Das lässt sich nicht rückgängig machen.`,"git.conflictAbort":`Abbrechen`,"git.conflictContinue":`Fortsetzen`,"git.conflictContinued":`Git-Vorgang fortgesetzt`,"git.conflictResolveWithAgent":`Agent soll auflösen`,"git.conflictAborted":`Vorgang abgebrochen`,"git.conflictHandoffSuccess":`Agent löst die Konflikte`,"git.dirtyTitleRebase":`Nicht committete Änderungen blockieren den Rebase`,"git.dirtyTitleMerge":`Nicht committete Änderungen blockieren den Merge`,"git.dirtyTitlePull":`Nicht committete Änderungen blockieren den Pull`,"git.dirtySubtitle":`{modified} geändert, {staged} bereitgestellt, {untracked} nicht verfolgt. Wähle, wie es weitergeht.`,"git.dirtyStash":`Stash & erneut versuchen`,"git.dirtyCommit":`Commit zuerst`,"git.dirtyCommitPlaceholder":`Commit-Nachricht`,"git.dirtyCommitConfirm":`Commit & erneut versuchen`,"git.dirtyDiscard":`Änderungen verwerfen`,"git.dirtyDiscardConfirmTitle":`Alle nicht committeten Änderungen verwerfen?`,"git.dirtyDiscardConfirmMessage":`Verfolgte Änderungen gehen verloren (git reset --hard). Nicht verfolgte Dateien bleiben erhalten. Nicht umkehrbar.`,"git.pushConfirmTitle":`Branch pushen?`,"git.pushConfirmMessage":`{branch} zum Remote pushen.`,"git.pushConfirmMessagePrefix":`Branch`,"git.pushConfirmMessageSuffix":`zum Remote pushen.`,"git.changePrBaseTitle":`Zielbranch ändern`,"git.changePrBaseMessage":`Geben Sie den neuen Zielbranch für den {request} ein.`,"git.changePrBaseSuccess":`{request}-Zielbranch aktualisiert`,"git.changePrBaseFailed":`{request}-Zielbranch konnte nicht geändert werden`,"git.mergeRequest":`{request} mergen`,"git.mergeRequestConfirmTitle":`{request} mergen?`,"git.mergeRequestConfirmMessage":`Dadurch wird die offene {request} in ihren Zielbranch gemergt.`,"git.mergeRequestSuccess":`{request} gemergt`,"git.mergeRequestFailed":`{request} konnte nicht gemergt werden`,"git.deleteRemoteBranch":`Remote-Branch löschen`,"git.deleteRemoteBranchTitle":`Remote-Branch löschen?`,"git.deleteRemoteBranchMessage":`Die Anfrage wurde gemergt. Remote-Branch {branch} löschen?`,"git.deleteRemoteBranchSuccess":`Remote-Branch {branch} gelöscht`,"git.deleteRemoteBranchFailed":`Remote-Branch konnte nicht gelöscht werden`,"git.changeSourceBranch":`Quellbranch ändern`,"git.changeSourceBranchTitle":`Quellbranch ändern`,"git.changeSourceBranchMessage":`Wähle den neuen Quellbranch. Der Arbeitsbranch wird darauf neu aufgebaut.`,"git.changeSourceBranchDone":`Quellbranch auf {branch} geändert`,"git.changeSourceBranchAligned":`Quellbranch auf {branch} geändert (Branch hatte keine eigenen Commits)`,"git.changeSourceBranchTooMany":`Der Branch hat zu viele eigene Commits ({n}) — bitte manuell rebasen`,"git.changeSourceBranchDirty":`Committe oder stashe deine Änderungen, bevor du den Quellbranch änderst`,"git.changeSourceBranchAgentRunning":`Stoppe den Agenten, bevor du den Quellbranch änderst`,"git.changeSourceBranchErrorTitle":`Quellbranch-Wechsel fehlgeschlagen`,"git.changeSourceBranchErrorOngoing":`Eine {op}-Operation läuft noch im Worktree. Brich sie ab, um zu einem sauberen Zustand zurückzukehren.`,"git.changeSourceBranchErrorAbort":`Operation abbrechen`,"git.changeSourceBranchLoading":`Quellbranch wird geändert…`,"git.changeSourceForcePushTitle":`Neu geschriebenen Branch force-pushen?`,"git.changeSourceForcePushMessage":`Die Branch-Historie wurde neu geschrieben. Mit --force-with-lease zum Remote pushen?`,"git.changeSourceForcePushDone":`Branch force-gepusht`,"git.openEditor":`Im Editor öffnen`,"git.openEditorFailed":`Editor konnte nicht geöffnet werden`,"git.branchPushed":`Branch gepusht`,"git.pushFirst":`Der Branch ist nicht auf dem Remote. Klicken Sie zuerst auf Push.`,"git.unpushedCommits":`Lokale Commits sind nicht gepusht. Klicken Sie zuerst auf Push.`,"git.from":`von`,"git.aheadBehindTooltip":`{ahead} commits voraus, {behind} hinterher gegenüber {source}`,"git.divergence.title":`Branch-Divergenz`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} voraus`,"git.divergence.behind":`↓ {count} hinterher`,"git.divergence.empty.ahead":`Keine Commits voraus.`,"git.divergence.empty.behind":`Keine Commits hinterher.`,"git.divergence.close":`Schließen`,"git.divergence.loading":`Commits werden geladen…`,"git.divergence.failed":`Divergenz konnte nicht geladen werden`,"git.divergence.retry":`Erneut versuchen`,"git.prCreated":`{request} #{n} erstellt`,"git.pr.author":`Autor`,"git.pr.reviewers":`Reviewer`,"git.pr.assignees":`Zugewiesen`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Änderungen angefordert`,"git.pr.approvedBadge":`Genehmigt`,"git.pr.ci.passed":`CI erfolgreich`,"git.pr.ci.failed":`CI fehlgeschlagen`,"git.pr.ci.pending":`CI läuft`,"git.pr.ci.failedCount":`{n} fehlgeschlagen`,"git.pr.ci.pendingCount":`{n} laufend`,"git.pr.ci.passedCount":`{n} erfolgreich`,"git.pr.ci.skippedCount":`{n} übersprungen`,"git.pr.ci.showPassed":`{n} erfolgreiche Jobs anzeigen`,"git.pr.ci.hidePassed":`Erfolgreiche Jobs ausblenden`,"toast.prChangesRequested":`Für PR #{n} wurden Änderungen angefordert`,"toast.prApproved":`PR #{n} wurde genehmigt`,"toast.prReadyToMerge":`PR #{n} ist bereit zum Mergen`,"toast.prCiFailed":`CI für PR #{n} ist fehlgeschlagen`,"toast.prCiRecovered":`CI für PR #{n} ist wieder erfolgreich`,"toast.prMergeConflict":`PR #{n} hat Merge-Konflikte`,"toast.prMerged":`PR #{n} wurde gemergt`,"devServer.title":`Dev-Server`,"devServer.noWorkspace":`Kein Arbeitsbereich ausgewählt`,"devServer.notConfigured":`Nicht konfiguriert —`,"devServer.goToSettings":`Einstellungen`,"devServer.logs":`Logs`,"devServer.running":`Läuft`,"devServer.starting":`Startet`,"devServer.stopping":`Wird gestoppt`,"devServer.error":`Fehler`,"devServer.stopped":`Gestoppt`,"devServer.unknown":`Unbekannt`,"devServer.containers":`{count} Container | {count} Container`,"devServer.logDialog.title":`Dev-Server-Logs`,"devServer.logDialog.empty":`Keine Logs verfügbar`,"notion.title":`Notion`,"tasks.title":`Aufgaben`,"notion.addTask":`Aufgabe hinzufügen`,"notion.noUrl":`Keine Notion-URL`,"notion.subtasks":`{done}/{total} Unteraufgaben`,"notion.noTasks":`Keine Aufgaben`,"notion.newTask":`Neue Aufgabe... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.title":`Akzeptanzkriterien`,"acceptance.addCriterion":`Kriterium hinzufügen`,"acceptance.newCriterion":`Neues Kriterium... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.empty":`Keine Akzeptanzkriterien`,"tasks.askProgress":`Agent auffordern, Fortschritt zu prüfen`,"agentTodos.title":`Agent-Todos`,"agentTodos.empty":`Keine Agent-Todos`,"subagents.title":`Sub-Agents`,"subagents.empty":`Noch keine Sub-Agent-Aktivität`,"subagents.tools":`{count} Tools`,"subagents.running":`Aktiv: `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Nutzungs-Bucket {n}`,"quotaFooter.lastUpdated":`Letzte Aktualisierung: {time}`,"quotaFooter.empty":`Lädt…`,"quotaFooter.popover.title":`Claude Code-Nutzung`,"quotaFooter.popover.refreshNow":`Aktualisieren`,"quotaFooter.popover.resetsIn":`Setzt sich zurück um {value}`,"quotaFooter.popover.unauthenticated":`Auth erforderlich`,"quotaFooter.popover.unauthenticatedHint":`Führe "claude" einmal aus, um dich zu authentifizieren.`,"quotaFooter.popover.error":`Fehler`,"quotaFooter.bucket.fiveHour":`5-Stunden`,"quotaFooter.bucket.sevenDay":`7 Tage`,"agent.error.spawn_failed":`Agent konnte nicht gestartet werden`,"agent.error.parse_error":`Eine Agent-Nachricht konnte nicht verarbeitet werden`,"agent.error.rate_limit":`Ratenlimit erreicht`,"agent.error.resume_failed":`Sitzung nicht gefunden — neue Sitzung wird gestartet`,"agent.error.other":`Agent-Fehler`,"quotaBackoff.banner.title":`Auto-Wiederaufnahme um {time}`,"quotaBackoff.banner.transientTitle":`Auto-Wiederaufnahme nach Unterbrechung um {time}`,"quotaBackoff.resumeNow":`Jetzt fortsetzen`,"quotaBackoff.banner.tooltip":`Claude-Kontingent erschöpft. Der Auto-Loop wird automatisch fortgesetzt, sobald sich das Kontingent bei {resets_at} zurücksetzt.`,"quotaBackoff.banner.cancel":`Wiederaufnahme abbrechen`,"quotaBackoff.cancelled":`Auto-Wiederaufnahme abgebrochen — du kannst jederzeit manuell fortfahren`,"rateLimitType.fiveHour":`5h-Sitzung`,"rateLimitType.sevenDay":`Wöchentlich`,"tooltip.addTask":`Aufgabe hinzufügen`,"tooltip.removeTask":`Aufgabe entfernen`,"tooltip.addCriterion":`Kriterium hinzufügen`,"tooltip.removeCriterion":`Kriterium entfernen`,"tooltip.startDevServer":`Dev-Server starten`,"tooltip.stopDevServer":`Dev-Server stoppen`,"tooltip.closeDiffViewer":`Diff schließen`,"tooltip.refreshLogs":`Logs aktualisieren`,"tooltip.closeDialog":`Schließen`,"tooltip.refreshGitStats":`Git-Statistiken aktualisieren`,"tooltip.removeImage":`Bild entfernen`,"tooltip.sendMessage":`Nachricht senden`,"tools.title":`Werkzeuge`,"tools.runSetupScript":`Setup-Skript erneut ausführen`,"tools.runSetupScriptTooltip":`Das Setup-Skript des Projekts im Worktree ausführen`,"tools.runSetupScriptConfirm":`Setup-Skript in diesem Workspace erneut ausführen? Vorhandene Artefakte können überschrieben werden.`,"tools.runSetupScriptBusy":`Setup kann nicht erneut ausgeführt werden, während der Agent arbeitet.`,"tools.noSetupScript":`Kein Setup-Skript konfiguriert —`,"tools.setupScriptSuccess":`Setup-Skript erfolgreich abgeschlossen.`,"tools.setupScriptFailed":`Setup-Skript fehlgeschlagen.`,"tools.openNotion":`In Notion öffnen`,"tools.openSentry":`In Sentry öffnen`,"tools.review":`Änderungen prüfen`,"tools.reviewTooltip":`Den Agenten bitten, die Änderungen auf diesem Branch zu prüfen`,"tools.reviewBusy":`Agent ist beschäftigt — warte, bis er inaktiv ist`,"tools.fixCi":`CI reparieren`,"tools.fixCiTooltip":`Den Agenten bitten, die fehlschlagenden CI-Jobs zu diagnostizieren und zu beheben`,"tools.fixCiLaunched":`CI-Fix-Aktion an den Agenten gesendet`,"tools.fixCiFailed":`CI-Fix-Aktion konnte nicht gestartet werden`,"tools.openFileManager":`Im Dateimanager öffnen`,"tools.openFileManagerTooltip":`Worktree-Ordner im konfigurierten Dateimanager öffnen`,"tools.openFileManagerFailed":`Dateimanager konnte nicht geöffnet werden`,"tools.openTerminal":`Im Terminal öffnen`,"tools.openTerminalTooltip":`Den Worktree im konfigurierten Terminal öffnen`,"tools.openTerminalFailed":`Terminal konnte nicht geöffnet werden`,"review.title":`Review starten`,"review.subtitle":`Bitte den Agenten, deine Änderungen zu prüfen und Feedback zu geben.`,"review.additionalInstructions":`Zusätzliche Anweisungen (optional)`,"review.additionalInstructionsPlaceholder":`Spezifische Hinweise für die Review hinzufügen…`,"review.newSession":`Neue Sitzung`,"review.newSessionHint":`Eine neue Agenten-Sitzung starten statt die aktuelle fortzusetzen.`,"review.start":`Review starten`,"review.cancel":`Abbrechen`,"review.launched":`Review gestartet`,"review.failed":`Review konnte nicht gestartet werden`,"diff.title":`Diff`,"diff.side":`Nebeneinander`,"diff.inline":`Inline`,"diff.hideUnchanged":`Unveränderten Code ausblenden`,"diff.showUnchanged":`Unveränderten Code anzeigen`,"diff.showUntracked":`Nicht versionierte Dateien anzeigen`,"diff.hideUntracked":`Nicht versionierte Dateien ausblenden`,"diff.rollbackToRemote":`Auf Remote-Version zurücksetzen`,"diff.rollbackConfirm":`{path} auf die Remote-Version (origin) zurücksetzen? Lokale Änderungen an dieser Datei gehen verloren.`,"diff.rollbackConfirmOk":`Zurücksetzen`,"diff.rollbackDone":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneRemote":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneHead":`Lokale Änderungen verworfen (Datei auf letzten Commit zurückgesetzt)`,"diff.rollbackDoneDeleted":`Nicht versionierte Datei gelöscht`,"diff.deleteUntracked":`Nicht versionierte Datei löschen`,"diff.deleteUntrackedConfirm":`{path} dauerhaft löschen? Diese Datei wird nicht von Git verfolgt — ihr Inhalt geht verloren.`,"diff.deleteUntrackedConfirmOk":`Löschen`,"diff.rollbackFailed":`Rollback fehlgeschlagen`,"diff.rollbackFailedDetail":`Rollback fehlgeschlagen: {error}`,"diff.modeInspect":`Bearbeiten`,"diff.modeReview":`Review`,"diff.addComment":`Kommentar hinzufügen`,"diff.replyComment":`Antworten`,"diff.editComment":`Bearbeiten`,"diff.deleteComment":`Löschen`,"diff.deleteCommentConfirm":`Diesen Kommentar löschen?`,"diff.commentPlaceholder":`Review-Kommentar schreiben… (Markdown unterstützt)`,"diff.reviewDraft":`Review-Entwurf`,"diff.reviewEmpty":`Noch keine Kommentare — fahre mit der Maus über eine Zeile im Diff und klicke +, um einen hinzuzufügen.`,"diff.reviewGlobalPlaceholder":`Optionale Gesamtnachricht zur Review`,"diff.submitReview":`Review absenden ({n})`,"diff.reviewSubmitted":`Review an den Agenten gesendet`,"diff.reviewSubmitFailed":`Review konnte nicht gesendet werden: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Ungepusht`,"diff.noChanges":`Keine Änderungen`,"diff.searchFiles":`Dateien suchen…`,"diff.noFileMatch":`Keine passende Datei`,"diff.selectFile":`Datei auswählen, um den Diff anzuzeigen`,"diff.fileLoadFailed":`Dieser Diff konnte nicht geladen werden`,"diff.fileLoadFailedHint":`Die Datei auf der Festplatte ist unverändert — nur der Diff konnte nicht geladen werden.`,"diff.fileListLoadFailed":`Die Dateiliste konnte nicht geladen werden`,"diff.fileListLoadFailedHint":`Das ist eine fehlgeschlagene Anfrage, kein Branch ohne Änderungen.`,"diff.addToChat":`Zum Chat hinzufügen`,"diff.compareTitle":`Commits vergleichen`,"diff.compareFrom":`Von`,"diff.compareTo":`Bis`,"diff.compareSubmit":`Vergleichen`,"diff.compareSourceBase":`{branch} (Branch-Basis)`,"diff.commitsReadOnly":`schreibgeschützt`,"diffViewer.save":`Speichern`,"diffViewer.savedAt":`Gespeichert`,"diffViewer.saveFailed":`Speichern fehlgeschlagen`,"diffViewer.saveFailedDetail":`Speichern fehlgeschlagen: {error}`,"diffViewer.unsavedChanges.title":`Nicht gespeicherte Änderungen`,"diffViewer.unsavedChanges.message":`Du hast nicht gespeicherte Änderungen. Was möchtest du tun?`,"diffViewer.unsavedChanges.save":`Speichern`,"diffViewer.unsavedChanges.cancel":`Abbrechen`,"diffViewer.conflict.title":`Datei wurde extern geändert`,"diffViewer.conflict.message":`Die Datei wurde außerhalb von Kōbō geändert, seit du sie geöffnet hast.`,"diffViewer.conflict.reload":`Neu laden (lokale Änderungen verwerfen)`,"diffViewer.conflict.keep":`Eigene behalten`,"diffViewer.conflict.overwrite":`Trotzdem überschreiben`,"diffViewer.conflict.overwriteHint":`Ersetzt die Datei auf der Festplatte durch deine Version. Die andere Änderung geht verloren.`,"diffViewer.conflict.keepHint":`Behält deine Änderungen im Editor und übernimmt die neue Signatur der Datei, damit das nächste Speichern funktioniert.`,"diffViewer.saveBlocked":`Der Agent läuft — stoppe ihn, um deine Änderungen zu speichern.`,"diffViewer.unsavedBanner":`Ungespeicherte Änderungen. Stoppe den Agenten, um sie zu sichern.`,"diffViewer.closeConfirm.title":`Ungespeicherte Änderungen`,"diffViewer.closeConfirm.message":`Diese Datei enthält nie gespeicherte Änderungen. Beim Schließen des Diff-Viewers gehen sie verloren.`,"diffViewer.closeConfirm.discard":`Ohne Speichern schließen`,"diffViewer.criteriaRail":`Review-Checkliste`,"diffViewer.criteriaRailShow":`Review-Checkliste einblenden`,"diffViewer.criteriaRailHide":`Review-Checkliste ausblenden`,"diffViewer.fileTreeShow":`Dateibaum einblenden`,"diffViewer.fileTreeHide":`Dateibaum ausblenden`,"diffViewer.closeConfirm.saveAndClose":`Speichern und schließen`,"diffViewer.agentRunning":`Agent läuft — stoppe ihn zum Bearbeiten`,"diffViewer.fileDeleted":`Datei gelöscht`,"notification.agentFinished":`{name} — Agent fertig`,"notification.agentQuestion":`{name} — Agent stellt eine Frage`,"notification.agentPermissionRequest":`{name} — Agent fragt nach einer Berechtigung`,"notification.autoLoopCompleted":`{name} — Auto-Loop abgeschlossen`,"notification.autoLoopStalled":`{name} — Auto-Loop blockiert (kein Fortschritt)`,"notification.autoLoopError":`{name} — Auto-Loop wegen Fehler gestoppt`,"notification.autoLoopAwaitingClarification":`{name} — Auto-Loop pausiert, wartet auf Ihre Klärung`,"notification.autoLoopPermissionOverridden":`{name} — Auto-Loop hat plan-Modus auf bypass erzwungen`,"notification.agentError":`{name} — Agent-Fehler`,"contextMenu.rename":`Umbenennen`,"contextMenu.editDescription":`Beschreibung bearbeiten`,"contextMenu.copyPath":`Worktree-Pfad kopieren`,"contextMenu.openEditor":`Im Editor öffnen`,"contextMenu.openFileManager":`Im Dateimanager öffnen`,"contextMenu.unarchiveDisabledPurged":"Der Worktree wurde von der Festplatte entfernt. Erstelle ihn manuell neu (`gh pr checkout` oder `git worktree add`) — Kōbō erkennt die Wiederherstellung innerhalb von 30 s und reaktiviert den Workspace automatisch.","workspaceList.unarchiveBlockedPurged":"Wiederherstellen nicht möglich: Der Worktree existiert nicht mehr auf der Festplatte. Erstelle ihn manuell neu (`gh pr checkout` oder `git worktree add`) — Kōbō erkennt ihn innerhalb von 30 s und reaktiviert den Workspace.","contextMenu.purgeWorktree":`Speicherplatz freigeben (Worktree löschen)`,"contextMenu.purgeWorktreeTooltip":`Löscht den Worktree von der Festplatte zur Speicherplatz-Rückgewinnung — Chat- und Sitzungsverlauf bleiben erhalten. Archiviert den Workspace automatisch.`,"contextMenu.purgeWorktreeDialogTitle":`Speicherplatz freigeben?`,"contextMenu.purgeWorktreeDialogMessage":`Der Worktree-Ordner von „{name}" wird von der Festplatte gelöscht. Chat- und Sitzungsverlauf bleiben erhalten. Der Workspace wird automatisch archiviert. In der aktuellen Version nicht rückgängig zu machen.`,"contextMenu.purgeWorktreeDialogConfirm":`Worktree löschen`,"contextMenu.purgeWorktreeSuccess":`Worktree gelöscht — Speicherplatz zurückgewonnen.`,"settings.autoPurgeOnPrMerged":`Worktree automatisch löschen, wenn PR gemerged`,"settings.autoPurgeOnPrMergedHint":`Wenn aktiviert, wird der Worktree von der Festplatte gelöscht, sobald die PR gemerged wird (zusätzlich zur automatischen Archivierung). Chat-Verlauf bleibt erhalten.`,"settings.autoLoopMaxRetries":`Maximale automatische Wiederholungen`,"settings.autoLoopMaxRetriesHint":`Stoppt die Auto-Loop nach dieser Anzahl von Quota- oder vorübergehenden Serverfehlern.`,"settings.retentionTitle":`Aufbewahrung des Konversationsverlaufs (standardmäßig aus)`,"settings.retentionWarning":`Wird diese Option aktiviert, löscht sie den Konversationsverlauf der Agenten endgültig aus der Datenbank — zuerst alles, was bereits älter als das Zeitfenster ist. Gelöschte Ereignisse lassen sich nicht wiederherstellen.`,"settings.retentionHint":`Läuft einmal beim Start des Servers. Workspaces, Aufgaben, Sessions, Branches und Worktrees bleiben unberührt — betroffen ist nur die aufgezeichnete Agentenausgabe.`,"settings.retentionDaysLabel":`Ereignisse löschen, die älter sind als (Tage)`,"settings.retentionDaysHint":`0 — der Standard — behält alle Ereignisse dauerhaft. Tragen Sie einen Wert ein, um die Aufbewahrung zu aktivieren.`,"settings.retentionKeepLabel":`Immer behaltene Ereignisse pro Workspace`,"settings.retentionKeepHint":`Die neuesten Ereignisse jedes Workspace bleiben unabhängig von ihrem Alter erhalten, damit ein alter, aber noch offener Workspace einen lesbaren Verlauf behält. Empfohlen: 5000.`,"settings.retentionDisabledHint":`Aufbewahrung deaktiviert: Es wird nie etwas gelöscht.`,"settings.retentionConfirmTitle":`Konversationsverlauf endgültig löschen?`,"settings.retentionConfirmMessage":`Nur {days} Tag(e) Verlauf zu behalten löscht beim nächsten Serverstart endgültig {count} der {total} aufgezeichneten Agentenereignisse — einschließlich allem, was bereits älter ist. Das lässt sich nicht rückgängig machen. Fortfahren?`,"settings.retentionConfirmMessageUnknown":`Nur {days} Tag(e) Verlauf zu behalten löscht beim nächsten Serverstart endgültig alle älteren Agentenereignisse — einschließlich allem, was bereits angesammelt wurde. Die genaue Menge konnte nicht ermittelt werden. Das lässt sich nicht rückgängig machen. Fortfahren?`,"settings.purgeDocsTitle":`Wie Purge funktioniert — Wiederherstellung & Berechtigungen`,"settings.purgeDocsRestoreTitle":`Einen bereinigten Worktree wiederherstellen (automatisch erkannt)`,"settings.purgeDocsRestoreIntro":`Ein bereinigter Workspace behält seinen Chat-Verlauf und die PR-Metadaten, aber der Worktree-Ordner ist weg. Baue ihn manuell mit einem dieser Befehle wieder auf — Kōbō erkennt das Wiedererscheinen des Ordners innerhalb von 30 Sekunden und reaktiviert den Workspace automatisch (entarchivieren + Purge-Flag löschen):`,"settings.purgeDocsRestoreCommands":`# GitHub (mit gh CLI):
|
|
13
13
|
gh pr checkout [pr-nummer] --recurse-submodules
|
|
14
14
|
|
|
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`,"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":`Edit the four prompts below yourself. Starts from the agnostic baseline.`,"settings.skillSuite.reloadDefaults":`Reload defaults`,"settings.skillSuite.reloadDefaultsConfirm":`Replace the four custom prompts with the agnostic defaults?`,"settings.skillSuite.customPrompts":`Custom prompts`,"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`},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
|
|
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)
|
|
@@ -25,13 +25,13 @@ KOBO_WORKSPACE_ID — Kōbō workspace id (stable across renames)
|
|
|
25
25
|
KOBO_WORKSPACE_NAME — workspace display name
|
|
26
26
|
KOBO_FORGE — resolved forge: github / gitlab / none
|
|
27
27
|
KOBO_PR_NUMBER — PR/MR number on the resolved forge (empty if none open)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
|
|
28
|
-
# your script — use $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Reset to Kōbō default`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Reset the script?`,"settings.changeSourceBranchScript.replaceConfirm":`Your edits will be replaced by the Kōbō default script. Continue?`,"settings.cleanupScriptHint":`Shell script run in the worktree after the agent finishes a session. In auto-loop mode it runs only once every task is done. Leave empty to disable.`,"settings.cleanupScriptPlaceholder":`e.g. remove temp files, stop containers…`,"settings.cleanupScriptMode":`When to run`,"settings.cleanupScriptMode.idle":`After every session — even if tasks remain`,"settings.cleanupScriptMode.noTasks":`Only when no Kōbō task remains`,"settings.cleanupScriptOnlyOnChanges":`Run only if files were modified, added or deleted`,"settings.cleanupScriptMode.inherit":`Inherit global setting`,"settings.taskPromptTemplate":`Task prompt`,"settings.taskPromptTemplatePlaceholder":`Prompt automatically inserted into the task description…`,"settings.taskPromptTemplateHint":`Automatically injected into the task description on the creation page when this project is selected. Left untouched, it is replaced when you switch projects; once you edit it, your text is kept.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Executed with bash in the worktree after creation, before the agent starts. No shebang needed. If it fails, the workspace is set to error. Timeout: 5 minutes.`,"settings.e2e.title":`E2E tests`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`None`,"settings.e2e.frameworkOther":`Other`,"settings.e2e.skill":`Skill (optional)`,"settings.e2e.skillPlaceholder":`e.g. cypress-tester`,"settings.e2e.prompt":`Custom guidance (optional)`,"settings.e2e.promptPlaceholder":`e.g. use page-object pattern, target data-testid attributes`,"settings.e2e.helpText":`When configured, the auto-loop grooming agent inserts E2E sub-tasks for user-visible features.`,"settings.finalization.title":`Auto-loop finalization`,"settings.finalization.helpText":`Optional: a prompt the agent runs as the very last auto-loop iteration. Typically used for final quality checks (lint, typecheck, tests). The grooming step will create a [FINAL]-prefixed task that uses this prompt.`,"settings.finalization.prompt":`Finalization prompt`,"settings.finalization.promptPlaceholder":`e.g. Run npm run lint and npm test, then mark this task done.`,"settings.editorCommand":`Editor command`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Command used to open the worktree in your editor. The worktree path is passed as argument.`,"settings.fileManagerCommand":`File manager command`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Command used to open the worktree in your file manager. The worktree path is passed as argument. Leave empty to hide the button.`,"settings.terminalCommand":`Terminal command`,"settings.terminalCommandHint":`Command to launch your terminal in the worktree. Optional {path} placeholder for the directory.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Claude MCP selection`,"settings.mcpAutoSelect":`Auto (first matching active MCP)`,"settings.notionMcp":`Notion MCP key`,"settings.sentryMcp":`Sentry MCP key`,"settings.mcpSelectionHint":`Active entries are read from ~/.claude.json. Leave Auto to use default matching behavior.`,"settings.configuredProjects":`Configured projects`,"settings.noProjects":`No projects configured`,"settings.addProject":`Add project`,"settings.copyFrom":`Copy settings from`,"settings.copyFromPlaceholder":`(none — start from defaults)`,"settings.copyFromHint":`Copies all settings except path, display name, and source branch.`,"settings.copyFromConfirmTitle":`Overwrite current values?`,"settings.copyFromConfirm":`This will overwrite the current form values with settings from "{project}". Continue?`,"settings.newProject":`New project`,"settings.editProject":`Edit project`,"settings.onboardingTitle":`Guided tour`,"settings.onboardingHint":`Replay the walkthrough of the main interface elements.`,"settings.onboardingReplay":`Replay the guided tour`,"onboarding.list.title":`Workspaces`,"onboarding.list.description":`Each mission lives in its own space — a dedicated git worktree, branch, and agent session. They all appear here.`,"onboarding.create.title":`Create a workspace`,"onboarding.create.description":`Click + to start a new mission — from a Notion ticket, a Sentry issue, or from scratch.`,"onboarding.search.title":`Search`,"onboarding.search.description":`Filter your workspaces by name, or search across agent conversation history.`,"onboarding.health.title":`Health`,"onboarding.health.description":`Check Kōbō's status: database, active agents, integrations, backups.`,"onboarding.changelog.title":`What's new`,"onboarding.changelog.description":`Browse Kōbō's latest releases: new features, fixes, behaviour changes. A badge appears when an unread release is available.`,"onboarding.settings.title":`Settings`,"onboarding.settings.description":`Models, lifecycle scripts, integrations, voice — all of Kōbō’s configuration lives here. Click Next for a tour of each section.`,"onboarding.settings-general.title":`General`,"onboarding.settings-general.description":`Interface language, default project, and global behaviour applied to every new workspace.`,"onboarding.settings-agents.title":`Agents & models`,"onboarding.settings-agents.description":`Pick the default engine — Claude Code or Codex — the model, and the permission mode agents run with.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Choose the skill suite agents load: the recommended preset or your own custom selection.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`PR description template and other reusable prompt text used by agents.`,"onboarding.settings-scripts.title":`Scripts`,"onboarding.settings-scripts.description":`Lifecycle scripts run on cleanup, archive, and workspace setup — set globally or per project.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Connect your Notion integration token to import tickets as workspace missions.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Import an issue from Sentry as the source of truth for a workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Choose GitHub, GitLab or none per project. Kōbō drives your own gh / glab CLI — it ships no credentials.`,"onboarding.settings-voice.title":`Voice`,"onboarding.settings-voice.description":`Voice dictation: enable it, pick the Whisper model, and manage the local speech runtime.`,"onboarding.settings-notifications.title":`Notifications`,"onboarding.settings-notifications.description":`Sound and browser notifications for agent events and status changes.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Git branch prefixes and the folder where workspace worktrees are created.`,"onboarding.settings-worktrees-purge.title":`Free disk space automatically`,"onboarding.settings-worktrees-purge.description":"Enable this toggle so Kōbō removes the worktree folder (often hundreds of MB of node_modules / vendor) as soon as a PR is merged. Chat history and PR metadata are kept. You can recreate the worktree later with `gh pr checkout <pr>` — Kōbō auto-detects the restoration within 30 seconds and reactivates the workspace.","onboarding.settings-projects.title":`Projects`,"onboarding.settings-projects.description":`Register the repositories you work on. Click “Add a project” to point Kōbō at a local codebase — every workspace targets one of these.`,"onboarding.settings-templates.title":`Templates`,"onboarding.settings-templates.description":`Your library of reusable prompt templates — pick one to pre-fill the brief when creating a workspace.`,"onboarding.settings-export.title":`Import / Export`,"onboarding.settings-export.description":`Back up or share your Kōbō configuration, and export workspace data to a file.`,"onboarding.firstWorkspace.title":`Create your first workspace`,"onboarding.firstWorkspace.description":`That is the whole point: one mission, one worktree, one agent. Open the creation page to get started.`,"onboarding.next":`Next`,"onboarding.prev":`Back`,"onboarding.done":`Done`,"onboarding.exitConfirm":`Exit the guided tour? You can replay it anytime from Settings.`,"settings.projectGroup.identity":`Identity`,"settings.projectGroup.defaults":`Defaults`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Project path`,"settings.projectPathPlaceholder":`/path/to/project`,"settings.displayName":`Display name`,"settings.displayNamePlaceholder":`My project`,"settings.defaultSourceBranch":`Default source branch`,"settings.defaultModel.project":`Default model`,"settings.skipPermissions.project":`Skip permission prompts`,"settings.prPromptTemplate.project":`PR prompt template`,"settings.prPromptPlaceholder.project":`Project-specific instructions for PR creation...`,"settings.reviewPromptTemplate.project":`Review prompt template`,"settings.ciFixPromptTemplate.project":`CI fix prompt template`,"settings.gitConventions.project":`Git conventions (project override)`,"settings.gitConventionsEmpty":`Leave empty to use the global conventions.`,"settings.notionStatus":`Notion ticket status`,"settings.notionStatusProperty":`Property name`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Value to set`,"settings.notionInProgressStatusPlaceholder":`In progress, En cours...`,"settings.notionStatusHint":`When a workspace is created with a Notion ticket, the specified property is set to this value. Both fields are required. Leave empty to disable.`,"settings.notionAssignee":`Notion assignment`,"settings.notionAssigneeHint":`When a workspace is created with a Notion ticket, the user authenticated with the Notion MCP is added to this People property — only if it doesn't already have an assignee. Leave empty to disable.`,"settings.notionAssigneeProperty":`Property name`,"settings.notionAssigneePropertyPlaceholder":`Developers, Assignees...`,"settings.notionUserId":`Your Notion UUID`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Pick your account from the list. Notion rejects bot assignment in People properties — this field is required to enable auto-assignment.`,"settings.notionUsersRefresh":`Refresh`,"settings.notionUsersLoading":`Loading Notion users…`,"settings.notionUsersLoadFailed":`Failed to load list: {error}`,"settings.notionUsersManualFallback":`List unavailable — paste your Notion UUID manually.`,"settings.devServer":`Dev server`,"settings.devServerStart":`Script start`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script stop`,"settings.devServerStopPlaceholder":`Optional — the process will be killed automatically if empty`,"settings.selectProject":`Select a project or add a new one`,"settings.projectPathRequired":`Project path is required.`,"settings.useGlobal":`Use global`,"settings.saved":`Global settings saved.`,"settings.unsavedChanges":`Unsaved changes`,"settings.nav.general":`General`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Credentials are kept locally and used only by bkt.`,"settings.bitbucketUsername":`Atlassian email`,"settings.bitbucketToken":`Bitbucket API token`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voice`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.openNav":`Open navigation`,"settings.saveError":`Error saving settings.`,"settings.projectSaved":`Project saved.`,"settings.projectSaveError":`Error saving project.`,"settings.projectDeleted":`Project deleted.`,"settings.deleteProjectConfirmTitle":`Delete project?`,"settings.deleteProjectConfirmMessage":`Remove "{name}" from your projects? This only deletes its Kōbō settings — your code and worktrees are left untouched.`,"settings.projectDeleteError":`Error deleting project.`,"templates.title":`Templates`,"templates.newTemplate":`New template`,"templates.editTemplate":`Edit template`,"templates.deleteTemplate":`Delete template`,"templates.deleteConfirm":`Delete template '/{slug}'?`,"templates.deleteConfirmMessage":`This cannot be undone.`,"templates.slug":`Slug`,"templates.slugHint":`Lowercase letters, digits, hyphens. Max 64 chars.`,"templates.slugInvalid":`Slug must contain only lowercase letters, digits, and hyphens`,"templates.slugDuplicate":`A template with this slug already exists`,"templates.description":`Description`,"templates.descriptionHint":`Short label shown in the dropdown.`,"templates.descriptionRequired":`Description is required`,"templates.contentRequired":`Content is required`,"templates.content":`Content`,"templates.contentHint":`Template content. Use {variable_name} for substitutions.`,"templates.availableVars":`Available variables`,"templates.filePath":`File: {path}`,"templates.empty":`No templates yet.`,"templates.createFailed":`Failed to create template`,"templates.updateFailed":`Failed to update template`,"templates.deleteFailed":`Failed to delete template`,"templates.save":`Save`,"templates.create":`Create`,"templates.reloadDefaults":`Reload default templates`,"templates.reloadDefaultsHint":`Only adds default templates that are missing. Existing templates (modified or not) are never overwritten.`,"templates.reloadDefaultsConfirmMessage":`This action will add any missing default templates back to the list. Existing templates — including ones you've customized — will not be touched. If you want to restore a default template you've modified, delete it first, then run this action.`,"templates.reloadDefaultsSuccess":`{added} added, {kept} kept`,"templates.reloadDefaultsFailed":`Failed to reload default templates`,"templates.resetToDefault":`Reset to default`,"templates.resetConfirmTitle":`Reset template to default?`,"templates.resetConfirmMessage":`This overwrites your local changes to /{slug} with the built-in default. This cannot be undone.`,"templates.resetSuccess":`Template /{slug} reset to default`,"templates.resetFailed":`Failed to reset template`,"chatInput.dropdownSkills":`Claude skills`,"chatInput.dropdownKobo":`Kōbō commands`,"chatInput.dropdownTemplates":`Templates`,"documents.title":`Documents`,"documents.empty":`No documents found`,"documents.refresh":`Refresh`,"documents.back":`Back`,"documents.loadFailed":`Failed to load document`,"git.title":`Git`,"git.outputDialogTitle":`Git reported an error`,"git.statsFailed":`Git status could not be read`,"git.section.repository":`Repository`,"git.section.changes":`Changes`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`More`,"git.localOnly":`local only`,"git.pushed":`pushed`,"git.unpushed":`{count} unpushed`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Loading commits…`,"git.commits.empty":`No commits on this branch`,"git.commits.pushed":`Pushed`,"git.commits.unpushed":`Not pushed`,"git.commits.clickToAppend":`click to append SHA to chat`,"git.commits.diffThisCommit":`Diff this commit (vs parent)`,"git.compareCommits":`Compare commits…`,"git.files":`{count} file | {count} files`,"git.staged":`{count} staged`,"git.modified":`{count} modified`,"git.untracked":`{count} untracked`,"git.workingTreeEmpty":`No uncommitted changes`,"git.fileStaged":`Staged`,"git.fileModified":`Modified`,"git.fileUntracked":`Untracked`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Safer than plain --force: the push is rejected if the remote has commits you haven’t seen. Use after rebasing or amending already-pushed commits.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No upstream set for this branch — push it first to enable pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push the branch first`,"git.viewRequest":`View {request}`,"git.createRequest":`Create {request}`,"git.changeRequestBase":`Change {request} base branch`,"git.forgeCliMissing":`{cli} is not installed — install it to use {request} features`,"git.forgeNotAuthenticated":`Not authenticated — run {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Auto-detect`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`None`,"git.pullConfirmTitle":`Pull branch?`,"git.pullConfirmMessage":`Pull {branch} from remote (fast-forward only).`,"git.branchPulled":`Branch pulled`,"git.pullFailed":`Pull failed`,"git.renameBranch":`Rename branch`,"git.renameBranchPrompt":"Rename `{branch}` to:","git.renameBranchSuccess":"Branch renamed to `{branch}`","git.renameBranchFailed":`Failed to rename branch`,"git.renameBranchExists":"Branch `{branch}` already exists locally or on origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Open the diff viewer in Review mode — inline comments + batch submit to the agent`,"pr.baseChanged":`PR base changed: {oldBase} → {newBase}`,"pr.openPr":`Open PR`,"pr.openWorkspace":`Open workspace`,"pr.dismiss":`Dismiss`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase branch?`,"git.rebaseConfirmMessage":`Rebase onto {branch}. This may cause conflicts.`,"git.rebaseSuccess":`Rebase completed`,"git.rebaseFailed":`Rebase failed`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repository fetched`,"git.fetchFailed":`Fetch failed: {error}`,"git.mergeConfirmTitle":`Merge branch?`,"git.mergeConfirmMessage":`Merge {branch} into this branch. This may cause conflicts.`,"git.mergeSuccess":`Merge completed`,"git.mergeFailed":`Merge failed`,"git.commitFailed":`Commit failed`,"git.commitChanges":`Commit changes`,"git.commitDialogTitle":`Commit uncommitted changes`,"git.commitDialogDescription":`Enter your own message or ask the agent to inspect and create the commit.`,"git.commitMessage":`Commit message`,"git.commitManual":`Commit`,"git.commitWithAgent":`Ask agent`,"git.commitAgentSuccess":`Commit request sent to the agent`,"git.discardFailed":`Discard failed`,"git.conflictTitleMerge":`Merge conflicts detected`,"git.conflictTitleRebase":`Rebase conflicts detected`,"git.operationPausedTitle":`Git operation ready to continue`,"git.operationPausedSubtitle":`No files are in conflict. Git is simply waiting for you to continue the operation.`,"git.conflictSubtitle":`{count} file(s) have conflicts. Choose how to continue.`,"git.conflictAbortConfirmTitle":`Discard the conflict resolution?`,"git.conflictAbortConfirmMessage":`Everything you resolved in this {op} is thrown away and the worktree goes back to its pre-{op} state. This cannot be undone.`,"git.conflictAbort":`Abort`,"git.conflictContinue":`Continue`,"git.conflictContinued":`Git operation continued`,"git.conflictResolveWithAgent":`Ask agent to resolve`,"git.conflictAborted":`Operation aborted`,"git.conflictHandoffSuccess":`Agent is resolving the conflicts`,"git.dirtyTitleRebase":`Uncommitted changes block the rebase`,"git.dirtyTitleMerge":`Uncommitted changes block the merge`,"git.dirtyTitlePull":`Uncommitted changes block the pull`,"git.dirtySubtitle":`{modified} modified, {staged} staged, {untracked} untracked. Choose how to proceed.`,"git.dirtyStash":`Stash & retry`,"git.dirtyCommit":`Commit first`,"git.dirtyCommitPlaceholder":`Commit message`,"git.dirtyCommitConfirm":`Commit & retry`,"git.dirtyDiscard":`Discard changes`,"git.dirtyDiscardConfirmTitle":`Discard all uncommitted changes?`,"git.dirtyDiscardConfirmMessage":`Tracked changes will be lost (git reset --hard). Untracked files are kept. This cannot be undone.`,"git.pushConfirmTitle":`Push branch?`,"git.pushConfirmMessage":`Push {branch} to remote.`,"git.pushConfirmMessagePrefix":`Push branch`,"git.pushConfirmMessageSuffix":`to remote.`,"git.changePrBaseTitle":`Change base branch`,"git.changePrBaseMessage":`Enter the new target branch for the {request}.`,"git.changePrBaseSuccess":`{request} base branch updated`,"git.changePrBaseFailed":`Failed to change {request} base branch`,"git.mergeRequest":`Merge {request}`,"git.mergeRequestConfirmTitle":`Merge {request}?`,"git.mergeRequestConfirmMessage":`This merges the open {request} into its target branch.`,"git.mergeRequestSuccess":`{request} merged`,"git.mergeRequestFailed":`Failed to merge {request}`,"git.deleteRemoteBranch":`Delete remote branch`,"git.deleteRemoteBranchTitle":`Delete remote branch?`,"git.deleteRemoteBranchMessage":`The request was merged. Delete the remote branch {branch}?`,"git.deleteRemoteBranchSuccess":`Remote branch {branch} deleted`,"git.deleteRemoteBranchFailed":`Failed to delete remote branch`,"git.changeSourceBranch":`Change source branch`,"git.changeSourceBranchTitle":`Change source branch`,"git.changeSourceBranchMessage":`Pick the new source branch. The working branch will be rebuilt on top of it.`,"git.changeSourceBranchDone":`Source branch changed to {branch}`,"git.changeSourceBranchAligned":`Source branch changed to {branch} (branch had no own commits)`,"git.changeSourceBranchTooMany":`The branch has too many own commits ({n}) — rebase it manually`,"git.changeSourceBranchDirty":`Commit or stash your changes before changing the source branch`,"git.changeSourceBranchAgentRunning":`Stop the agent before changing the source branch`,"git.changeSourceBranchErrorTitle":`Source branch change failed`,"git.changeSourceBranchErrorOngoing":`A {op} operation is still in progress on the worktree. Abort it to return to a clean state.`,"git.changeSourceBranchErrorAbort":`Abort the operation`,"git.changeSourceBranchLoading":`Changing source branch…`,"git.changeSourceForcePushTitle":`Force-push the rewritten branch?`,"git.changeSourceForcePushMessage":`The branch history was rewritten. Force-push it to the remote with --force-with-lease?`,"git.changeSourceForcePushDone":`Branch force-pushed`,"git.openEditor":`Open in editor`,"git.openEditorFailed":`Failed to open editor`,"git.branchPushed":`Branch pushed`,"git.pushFirst":`Branch is not on remote. Click Push first.`,"git.unpushedCommits":`Local commits are not pushed. Click Push first.`,"git.from":`from`,"git.aheadBehindTooltip":`{ahead} commits ahead, {behind} behind {source}`,"git.divergence.title":`Branch divergence`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} ahead`,"git.divergence.behind":`↓ {count} behind`,"git.divergence.empty.ahead":`No commits ahead.`,"git.divergence.empty.behind":`No commits behind.`,"git.divergence.close":`Close`,"git.divergence.loading":`Loading commits…`,"git.divergence.failed":`Failed to load divergence`,"git.divergence.retry":`Retry`,"git.prCreated":`{request} #{n} created`,"git.pr.author":`Author`,"git.pr.reviewers":`Reviewers`,"git.pr.assignees":`Assignees`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Changes requested`,"git.pr.approvedBadge":`Approved`,"git.pr.ci.passed":`CI passed`,"git.pr.ci.failed":`CI failed`,"git.pr.ci.pending":`CI running`,"git.pr.ci.failedCount":`{n} failed`,"git.pr.ci.pendingCount":`{n} pending`,"git.pr.ci.passedCount":`{n} passed`,"git.pr.ci.skippedCount":`{n} skipped`,"git.pr.ci.showPassed":`Show {n} passing jobs`,"git.pr.ci.hidePassed":`Hide passing jobs`,"toast.prChangesRequested":`PR #{n} has changes requested`,"toast.prApproved":`PR #{n} has been approved`,"toast.prReadyToMerge":`PR #{n} is ready to merge`,"toast.prCiFailed":`CI failed for PR #{n}`,"toast.prCiRecovered":`CI recovered for PR #{n}`,"toast.prMergeConflict":`PR #{n} has merge conflicts`,"toast.prMerged":`PR #{n} has been merged`,"devServer.title":`Dev Server`,"devServer.noWorkspace":`No workspace selected`,"devServer.notConfigured":`Not configured —`,"devServer.goToSettings":`Settings`,"devServer.logs":`Logs`,"devServer.running":`Running`,"devServer.starting":`Starting`,"devServer.stopping":`Stopping`,"devServer.error":`Error`,"devServer.stopped":`Stopped`,"devServer.unknown":`Unknown`,"devServer.containers":`{count} container | {count} containers`,"devServer.logDialog.title":`Logs Dev Server`,"devServer.logDialog.empty":`No logs available`,"notion.title":`Notion`,"tasks.title":`Tasks`,"notion.addTask":`Add task`,"notion.noUrl":`No Notion URL`,"notion.subtasks":`{done}/{total} subtasks`,"notion.noTasks":`No tasks`,"notion.newTask":`New task... (Enter to add, Esc to cancel)`,"acceptance.title":`Acceptance Criteria`,"acceptance.addCriterion":`Add criterion`,"acceptance.newCriterion":`New criterion... (Enter to add, Esc to cancel)`,"acceptance.empty":`No acceptance criteria`,"tasks.askProgress":`Ask agent to review progress`,"agentTodos.title":`Agent Todos`,"agentTodos.empty":`No agent todos`,"subagents.title":`Sub-agents`,"subagents.empty":`No sub-agent activity yet`,"subagents.tools":`{count} tools`,"subagents.running":`Running: `,"stats.resetsAt":`Resets {value}`,"stats.usageBucket":`Usage bucket {n}`,"quotaFooter.lastUpdated":`Last update: {time}`,"quotaFooter.empty":`Loading…`,"quotaFooter.popover.title":`Claude Code usage`,"quotaFooter.popover.refreshNow":`Refresh now`,"quotaFooter.popover.resetsIn":`Resets at {value}`,"quotaFooter.popover.unauthenticated":`Auth required`,"quotaFooter.popover.unauthenticatedHint":`Run "claude" once to authenticate.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5-hour`,"quotaFooter.bucket.sevenDay":`7-day`,"agent.error.spawn_failed":`Failed to launch the agent`,"agent.error.parse_error":`Unable to parse an agent message`,"agent.error.rate_limit":`Rate limit hit`,"agent.error.resume_failed":`Session not found — starting fresh`,"agent.error.other":`Agent error`,"quotaBackoff.banner.title":`Auto-resume at {time}`,"quotaBackoff.banner.tooltip":`Claude quota exhausted. Auto-loop will resume automatically when the quota resets at {resets_at}.`,"quotaBackoff.banner.cancel":`Cancel resume`,"quotaBackoff.cancelled":`Auto-resume cancelled — you can re-engage manually anytime`,"rateLimitType.fiveHour":`5h session`,"rateLimitType.sevenDay":`Weekly`,"tooltip.addTask":`Add task`,"tooltip.removeTask":`Remove task`,"tooltip.addCriterion":`Add criterion`,"tooltip.removeCriterion":`Remove criterion`,"tooltip.startDevServer":`Start dev server`,"tooltip.stopDevServer":`Stop dev server`,"tooltip.closeDiffViewer":`Close diff viewer`,"tooltip.refreshLogs":`Refresh logs`,"tooltip.closeDialog":`Close`,"tooltip.refreshGitStats":`Refresh Git stats`,"tooltip.removeImage":`Remove image`,"tooltip.sendMessage":`Send message`,"tools.title":`Tools`,"tools.runSetupScript":`Re-run setup script`,"tools.runSetupScriptTooltip":`Execute the project setup script in the worktree`,"tools.runSetupScriptConfirm":`Re-run the setup script in this workspace? Existing artifacts may be overwritten.`,"tools.runSetupScriptBusy":`Cannot re-run setup while the agent is working.`,"tools.noSetupScript":`No setup script configured —`,"tools.setupScriptSuccess":`Setup script completed successfully.`,"tools.setupScriptFailed":`Setup script failed.`,"tools.openNotion":`Open in Notion`,"tools.openSentry":`Open in Sentry`,"tools.review":`Review changes`,"tools.reviewTooltip":`Ask the agent to review the changes on this branch`,"tools.reviewBusy":`Agent is busy — wait until it's idle`,"tools.fixCi":`Fix CI`,"tools.fixCiTooltip":`Ask the agent to diagnose and fix the failing CI jobs`,"tools.fixCiLaunched":`Fix-CI action dispatched to the agent`,"tools.fixCiFailed":`Failed to launch the Fix-CI action`,"tools.openFileManager":`Open in file manager`,"tools.openFileManagerTooltip":`Open the worktree folder in your configured file manager`,"tools.openFileManagerFailed":`Failed to open the file manager`,"tools.openTerminal":`Open in terminal`,"tools.openTerminalTooltip":`Open the worktree in your configured terminal`,"tools.openTerminalFailed":`Failed to open terminal`,"review.title":`Start review`,"review.subtitle":`Ask the agent to review your changes and provide feedback.`,"review.additionalInstructions":`Additional instructions (optional)`,"review.additionalInstructionsPlaceholder":`Add any specific instructions for the review…`,"review.newSession":`New session`,"review.newSessionHint":`Start a fresh agent session instead of continuing the current one.`,"review.start":`Start Review`,"review.cancel":`Cancel`,"review.launched":`Review started`,"review.failed":`Failed to start review`,"diff.title":`Diff`,"diff.side":`Side`,"diff.inline":`Inline`,"diff.hideUnchanged":`Hide unchanged code`,"diff.showUnchanged":`Show unchanged code`,"diff.showUntracked":`Show untracked files`,"diff.hideUntracked":`Hide untracked files`,"diff.rollbackToRemote":`Rollback to remote`,"diff.rollbackConfirm":`Reset {path} to its remote (origin) version? Local edits to this file will be lost.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`File reset to remote version`,"diff.rollbackDoneRemote":`File reset to remote version`,"diff.rollbackDoneHead":`Local edits discarded (file reset to last commit)`,"diff.rollbackDoneDeleted":`Untracked file deleted`,"diff.deleteUntracked":`Delete untracked file`,"diff.deleteUntrackedConfirm":`Permanently delete {path}? This file is not tracked — its content will be lost.`,"diff.deleteUntrackedConfirmOk":`Delete`,"diff.rollbackFailed":`Rollback failed`,"diff.rollbackFailedDetail":`Rollback failed: {error}`,"diff.modeInspect":`Edit`,"diff.modeReview":`Review`,"diff.addComment":`Add comment`,"diff.replyComment":`Reply`,"diff.editComment":`Edit`,"diff.deleteComment":`Delete`,"diff.deleteCommentConfirm":`Delete this comment?`,"diff.commentPlaceholder":`Write a review comment… (Markdown supported)`,"diff.reviewDraft":`Review draft`,"diff.reviewEmpty":`No comments yet — hover a line in the diff and click + to add one.`,"diff.reviewGlobalPlaceholder":`Add an overall review message (optional)`,"diff.submitReview":`Submit review ({n})`,"diff.reviewSubmitted":`Review submitted to agent`,"diff.reviewSubmitFailed":`Failed to submit review: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Unpushed`,"diff.noChanges":`No changes`,"diff.searchFiles":`Search files…`,"diff.noFileMatch":`No file matches`,"diff.selectFile":`Select a file to view diff`,"diff.fileLoadFailed":`This diff could not be loaded`,"diff.fileLoadFailedHint":`The file is unchanged on disk — only its diff failed to load.`,"diff.fileListLoadFailed":`The file list could not be loaded`,"diff.fileListLoadFailedHint":`This is a failed request, not a branch without changes.`,"diff.addToChat":`Add to chat`,"diff.compareTitle":`Compare commits`,"diff.compareFrom":`From`,"diff.compareTo":`To`,"diff.compareSubmit":`Compare`,"diff.compareSourceBase":`{branch} (branch base)`,"diff.commitsReadOnly":`read-only`,"diffViewer.save":`Save`,"diffViewer.savedAt":`Saved`,"diffViewer.saveFailed":`Save failed`,"diffViewer.saveFailedDetail":`Save failed: {error}`,"diffViewer.unsavedChanges.title":`Unsaved changes`,"diffViewer.unsavedChanges.message":`You have unsaved edits. What do you want to do?`,"diffViewer.unsavedChanges.save":`Save`,"diffViewer.unsavedChanges.cancel":`Cancel`,"diffViewer.conflict.title":`File changed on disk`,"diffViewer.conflict.message":`The file was modified outside Kōbō since you opened it.`,"diffViewer.conflict.reload":`Reload (discard local)`,"diffViewer.conflict.keep":`Keep mine`,"diffViewer.conflict.overwrite":`Overwrite anyway`,"diffViewer.conflict.overwriteHint":`Replaces the file on disk with your version. The other change is lost.`,"diffViewer.conflict.keepHint":`Keeps your edits in the editor and accepts the new on-disk signature, so the next save works.`,"diffViewer.saveBlocked":`The agent is running — stop it to save your edits.`,"diffViewer.unsavedBanner":`Unsaved edits. Stop the agent to save them.`,"diffViewer.closeConfirm.title":`Unsaved changes`,"diffViewer.closeConfirm.message":`This file has edits that were never saved. Closing the diff viewer discards them.`,"diffViewer.closeConfirm.discard":`Close without saving`,"diffViewer.criteriaRail":`Review checklist`,"diffViewer.criteriaRailShow":`Show the review checklist`,"diffViewer.criteriaRailHide":`Hide the review checklist`,"diffViewer.fileTreeShow":`Show the file tree`,"diffViewer.fileTreeHide":`Hide the file tree`,"diffViewer.closeConfirm.saveAndClose":`Save and close`,"diffViewer.agentRunning":`Agent runs — stop it to edit`,"diffViewer.fileDeleted":`File deleted`,"notification.agentFinished":`{name} — Agent finished`,"notification.agentQuestion":`{name} — Agent is asking a question`,"notification.agentPermissionRequest":`{name} — Agent is requesting a permission`,"notification.autoLoopCompleted":`{name} — Auto-loop completed`,"notification.autoLoopStalled":`{name} — Auto-loop stalled (no progress)`,"notification.autoLoopError":`{name} — Auto-loop stopped on error`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop paused, waiting for your clarification`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop promoted plan mode to bypass`,"notification.agentError":`{name} — Agent error`,"contextMenu.rename":`Rename`,"contextMenu.editDescription":`Edit description`,"contextMenu.copyPath":`Copy worktree path`,"contextMenu.openEditor":`Open in editor`,"contextMenu.openFileManager":`Open in file manager`,"contextMenu.unarchiveDisabledPurged":"The worktree was removed from disk. Recreate it manually (`gh pr checkout` or `git worktree add`) — Kōbō auto-detects the restoration within 30s and reactivates the workspace.","workspaceList.unarchiveBlockedPurged":"Can't unarchive: the worktree no longer exists on disk. Recreate it manually (`gh pr checkout` or `git worktree add`) — Kōbō detects it within 30s and reactivates the workspace.","contextMenu.purgeWorktree":`Free disk space (delete worktree)`,"contextMenu.purgeWorktreeTooltip":`Deletes the worktree from disk to reclaim space — chat / session history is preserved. Auto-archives the workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Free disk space?`,"contextMenu.purgeWorktreeDialogMessage":`The worktree folder for «{name}» will be deleted from disk. Chat and session history are kept. The workspace is auto-archived. This cannot be undone in the current version.`,"contextMenu.purgeWorktreeDialogConfirm":`Delete the worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree deleted — disk space reclaimed.`,"settings.autoPurgeOnPrMerged":`Auto-purge worktree on PR merged`,"settings.autoPurgeOnPrMergedHint":`When ON, the worktree is deleted from disk as soon as the PR is merged (in addition to the auto-archive). Chat history is kept.`,"settings.autoLoopMaxRetries":`Maximum automatic retries`,"settings.autoLoopMaxRetriesHint":`Stops the auto-loop after this many quota or temporary server failures.`,"settings.retentionTitle":`Conversation history retention (off by default)`,"settings.retentionWarning":`Turning this on permanently deletes agent conversation history from the database, starting with everything already older than the window. Deleted events cannot be recovered.`,"settings.retentionHint":`Runs once at server start-up. Workspaces, tasks, sessions, branches and worktrees are never touched — only the recorded agent output.`,"settings.retentionDaysLabel":`Delete events older than (days)`,"settings.retentionDaysHint":`0 — the default — keeps every event for ever. Set a value to enable retention.`,"settings.retentionKeepLabel":`Events always kept per workspace`,"settings.retentionKeepHint":`The most recent events of each workspace survive whatever their age, so an old but still-open workspace keeps a readable history. Suggested: 5000.`,"settings.retentionDisabledHint":`Retention is disabled: nothing will ever be deleted.`,"settings.retentionConfirmTitle":`Permanently delete conversation history?`,"settings.retentionConfirmMessage":`Keeping only {days} day(s) of history will permanently delete {count} of the {total} recorded agent events at the next server start-up, including everything already older than that. This cannot be undone. Continue?`,"settings.retentionConfirmMessageUnknown":`Keeping only {days} day(s) of history will permanently delete every older agent event at the next server start-up, including everything already accumulated. The exact volume could not be counted. This cannot be undone. Continue?`,"settings.purgeDocsTitle":`How purge works — restore & permissions`,"settings.purgeDocsRestoreTitle":`Restoring a purged worktree (auto-detected)`,"settings.purgeDocsRestoreIntro":`A purged workspace keeps its chat history and PR metadata but the worktree folder is gone. Rebuild it manually with one of these commands — Kōbō detects the folder reappearing within 30 seconds and automatically reactivates the workspace (unarchive + clear purge flag):`,"settings.purgeDocsRestoreCommands":`# GitHub (using gh CLI):
|
|
28
|
+
# your script — use $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Reset to Kōbō default`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Reset the script?`,"settings.changeSourceBranchScript.replaceConfirm":`Your edits will be replaced by the Kōbō default script. Continue?`,"settings.cleanupScriptHint":`Shell script run in the worktree after the agent finishes a session. In auto-loop mode it runs only once every task is done. Leave empty to disable.`,"settings.cleanupScriptPlaceholder":`e.g. remove temp files, stop containers…`,"settings.cleanupScriptMode":`When to run`,"settings.cleanupScriptMode.idle":`After every session — even if tasks remain`,"settings.cleanupScriptMode.noTasks":`Only when no Kōbō task remains`,"settings.cleanupScriptOnlyOnChanges":`Run only if files were modified, added or deleted`,"settings.cleanupScriptMode.inherit":`Inherit global setting`,"settings.taskPromptTemplate":`Task prompt`,"settings.taskPromptTemplatePlaceholder":`Prompt automatically inserted into the task description…`,"settings.taskPromptTemplateHint":`Automatically injected into the task description on the creation page when this project is selected. Left untouched, it is replaced when you switch projects; once you edit it, your text is kept.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Executed with bash in the worktree after creation, before the agent starts. No shebang needed. If it fails, the workspace is set to error. Timeout: 5 minutes.`,"settings.e2e.title":`E2E tests`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`None`,"settings.e2e.frameworkOther":`Other`,"settings.e2e.skill":`Skill (optional)`,"settings.e2e.skillPlaceholder":`e.g. cypress-tester`,"settings.e2e.prompt":`Custom guidance (optional)`,"settings.e2e.promptPlaceholder":`e.g. use page-object pattern, target data-testid attributes`,"settings.e2e.helpText":`When configured, the auto-loop grooming agent inserts E2E sub-tasks for user-visible features.`,"settings.finalization.title":`Auto-loop finalization`,"settings.finalization.helpText":`Optional: a prompt the agent runs as the very last auto-loop iteration. Typically used for final quality checks (lint, typecheck, tests). The grooming step will create a [FINAL]-prefixed task that uses this prompt.`,"settings.finalization.prompt":`Finalization prompt`,"settings.finalization.promptPlaceholder":`e.g. Run npm run lint and npm test, then mark this task done.`,"settings.editorCommand":`Editor command`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Command used to open the worktree in your editor. The worktree path is passed as argument.`,"settings.fileManagerCommand":`File manager command`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Command used to open the worktree in your file manager. The worktree path is passed as argument. Leave empty to hide the button.`,"settings.terminalCommand":`Terminal command`,"settings.terminalCommandHint":`Command to launch your terminal in the worktree. Optional {path} placeholder for the directory.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Claude MCP selection`,"settings.mcpAutoSelect":`Auto (first matching active MCP)`,"settings.notionMcp":`Notion MCP key`,"settings.sentryMcp":`Sentry MCP key`,"settings.mcpSelectionHint":`Active entries are read from ~/.claude.json. Leave Auto to use default matching behavior.`,"settings.configuredProjects":`Configured projects`,"settings.noProjects":`No projects configured`,"settings.addProject":`Add project`,"settings.copyFrom":`Copy settings from`,"settings.copyFromPlaceholder":`(none — start from defaults)`,"settings.copyFromHint":`Copies all settings except path, display name, and source branch.`,"settings.copyFromConfirmTitle":`Overwrite current values?`,"settings.copyFromConfirm":`This will overwrite the current form values with settings from "{project}". Continue?`,"settings.newProject":`New project`,"settings.editProject":`Edit project`,"settings.onboardingTitle":`Guided tour`,"settings.onboardingHint":`Replay the walkthrough of the main interface elements.`,"settings.onboardingReplay":`Replay the guided tour`,"onboarding.list.title":`Workspaces`,"onboarding.list.description":`Each mission lives in its own space — a dedicated git worktree, branch, and agent session. They all appear here.`,"onboarding.create.title":`Create a workspace`,"onboarding.create.description":`Click + to start a new mission — from a Notion ticket, a Sentry issue, or from scratch.`,"onboarding.search.title":`Search`,"onboarding.search.description":`Filter your workspaces by name, or search across agent conversation history.`,"onboarding.health.title":`Health`,"onboarding.health.description":`Check Kōbō's status: database, active agents, integrations, backups.`,"onboarding.changelog.title":`What's new`,"onboarding.changelog.description":`Browse Kōbō's latest releases: new features, fixes, behaviour changes. A badge appears when an unread release is available.`,"onboarding.settings.title":`Settings`,"onboarding.settings.description":`Models, lifecycle scripts, integrations, voice — all of Kōbō’s configuration lives here. Click Next for a tour of each section.`,"onboarding.settings-general.title":`General`,"onboarding.settings-general.description":`Interface language, default project, and global behaviour applied to every new workspace.`,"onboarding.settings-agents.title":`Agents & models`,"onboarding.settings-agents.description":`Pick the default engine — Claude Code or Codex — the model, and the permission mode agents run with.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Choose the skill suite agents load: the recommended preset or your own custom selection.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`PR description template and other reusable prompt text used by agents.`,"onboarding.settings-scripts.title":`Scripts`,"onboarding.settings-scripts.description":`Lifecycle scripts run on cleanup, archive, and workspace setup — set globally or per project.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Connect your Notion integration token to import tickets as workspace missions.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Import an issue from Sentry as the source of truth for a workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Choose GitHub, GitLab or none per project. Kōbō drives your own gh / glab CLI — it ships no credentials.`,"onboarding.settings-voice.title":`Voice`,"onboarding.settings-voice.description":`Voice dictation: enable it, pick the Whisper model, and manage the local speech runtime.`,"onboarding.settings-notifications.title":`Notifications`,"onboarding.settings-notifications.description":`Sound and browser notifications for agent events and status changes.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Git branch prefixes and the folder where workspace worktrees are created.`,"onboarding.settings-worktrees-purge.title":`Free disk space automatically`,"onboarding.settings-worktrees-purge.description":"Enable this toggle so Kōbō removes the worktree folder (often hundreds of MB of node_modules / vendor) as soon as a PR is merged. Chat history and PR metadata are kept. You can recreate the worktree later with `gh pr checkout <pr>` — Kōbō auto-detects the restoration within 30 seconds and reactivates the workspace.","onboarding.settings-projects.title":`Projects`,"onboarding.settings-projects.description":`Register the repositories you work on. Click “Add a project” to point Kōbō at a local codebase — every workspace targets one of these.`,"onboarding.settings-templates.title":`Templates`,"onboarding.settings-templates.description":`Your library of reusable prompt templates — pick one to pre-fill the brief when creating a workspace.`,"onboarding.settings-export.title":`Import / Export`,"onboarding.settings-export.description":`Back up or share your Kōbō configuration, and export workspace data to a file.`,"onboarding.firstWorkspace.title":`Create your first workspace`,"onboarding.firstWorkspace.description":`That is the whole point: one mission, one worktree, one agent. Open the creation page to get started.`,"onboarding.next":`Next`,"onboarding.prev":`Back`,"onboarding.done":`Done`,"onboarding.exitConfirm":`Exit the guided tour? You can replay it anytime from Settings.`,"settings.projectGroup.identity":`Identity`,"settings.projectGroup.defaults":`Defaults`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Project path`,"settings.projectPathPlaceholder":`/path/to/project`,"settings.displayName":`Display name`,"settings.displayNamePlaceholder":`My project`,"settings.defaultSourceBranch":`Default source branch`,"settings.defaultModel.project":`Default model`,"settings.skipPermissions.project":`Skip permission prompts`,"settings.prPromptTemplate.project":`PR prompt template`,"settings.prPromptPlaceholder.project":`Project-specific instructions for PR creation...`,"settings.reviewPromptTemplate.project":`Review prompt template`,"settings.ciFixPromptTemplate.project":`CI fix prompt template`,"settings.gitConventions.project":`Git conventions (project override)`,"settings.gitConventionsEmpty":`Leave empty to use the global conventions.`,"settings.notionStatus":`Notion ticket status`,"settings.notionStatusProperty":`Property name`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Value to set`,"settings.notionInProgressStatusPlaceholder":`In progress, En cours...`,"settings.notionStatusHint":`When a workspace is created with a Notion ticket, the specified property is set to this value. Both fields are required. Leave empty to disable.`,"settings.notionAssignee":`Notion assignment`,"settings.notionAssigneeHint":`When a workspace is created with a Notion ticket, the user authenticated with the Notion MCP is added to this People property — only if it doesn't already have an assignee. Leave empty to disable.`,"settings.notionAssigneeProperty":`Property name`,"settings.notionAssigneePropertyPlaceholder":`Developers, Assignees...`,"settings.notionUserId":`Your Notion UUID`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Pick your account from the list. Notion rejects bot assignment in People properties — this field is required to enable auto-assignment.`,"settings.notionUsersRefresh":`Refresh`,"settings.notionUsersLoading":`Loading Notion users…`,"settings.notionUsersLoadFailed":`Failed to load list: {error}`,"settings.notionUsersManualFallback":`List unavailable — paste your Notion UUID manually.`,"settings.devServer":`Dev server`,"settings.devServerStart":`Script start`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script stop`,"settings.devServerStopPlaceholder":`Optional — the process will be killed automatically if empty`,"settings.selectProject":`Select a project or add a new one`,"settings.projectPathRequired":`Project path is required.`,"settings.useGlobal":`Use global`,"settings.saved":`Global settings saved.`,"settings.unsavedChanges":`Unsaved changes`,"settings.nav.general":`General`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Credentials are kept locally and used only by bkt.`,"settings.bitbucketUsername":`Atlassian email`,"settings.bitbucketToken":`Bitbucket API token`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voice`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.openNav":`Open navigation`,"settings.saveError":`Error saving settings.`,"settings.projectSaved":`Project saved.`,"settings.projectSaveError":`Error saving project.`,"settings.projectDeleted":`Project deleted.`,"settings.deleteProjectConfirmTitle":`Delete project?`,"settings.deleteProjectConfirmMessage":`Remove "{name}" from your projects? This only deletes its Kōbō settings — your code and worktrees are left untouched.`,"settings.projectDeleteError":`Error deleting project.`,"templates.title":`Templates`,"templates.newTemplate":`New template`,"templates.editTemplate":`Edit template`,"templates.deleteTemplate":`Delete template`,"templates.deleteConfirm":`Delete template '/{slug}'?`,"templates.deleteConfirmMessage":`This cannot be undone.`,"templates.slug":`Slug`,"templates.slugHint":`Lowercase letters, digits, hyphens. Max 64 chars.`,"templates.slugInvalid":`Slug must contain only lowercase letters, digits, and hyphens`,"templates.slugDuplicate":`A template with this slug already exists`,"templates.description":`Description`,"templates.descriptionHint":`Short label shown in the dropdown.`,"templates.descriptionRequired":`Description is required`,"templates.contentRequired":`Content is required`,"templates.content":`Content`,"templates.contentHint":`Template content. Use {variable_name} for substitutions.`,"templates.availableVars":`Available variables`,"templates.filePath":`File: {path}`,"templates.empty":`No templates yet.`,"templates.createFailed":`Failed to create template`,"templates.updateFailed":`Failed to update template`,"templates.deleteFailed":`Failed to delete template`,"templates.save":`Save`,"templates.create":`Create`,"templates.reloadDefaults":`Reload default templates`,"templates.reloadDefaultsHint":`Only adds default templates that are missing. Existing templates (modified or not) are never overwritten.`,"templates.reloadDefaultsConfirmMessage":`This action will add any missing default templates back to the list. Existing templates — including ones you've customized — will not be touched. If you want to restore a default template you've modified, delete it first, then run this action.`,"templates.reloadDefaultsSuccess":`{added} added, {kept} kept`,"templates.reloadDefaultsFailed":`Failed to reload default templates`,"templates.resetToDefault":`Reset to default`,"templates.resetConfirmTitle":`Reset template to default?`,"templates.resetConfirmMessage":`This overwrites your local changes to /{slug} with the built-in default. This cannot be undone.`,"templates.resetSuccess":`Template /{slug} reset to default`,"templates.resetFailed":`Failed to reset template`,"chatInput.dropdownSkills":`Claude skills`,"chatInput.dropdownKobo":`Kōbō commands`,"chatInput.dropdownTemplates":`Templates`,"documents.title":`Documents`,"documents.empty":`No documents found`,"documents.refresh":`Refresh`,"documents.back":`Back`,"documents.loadFailed":`Failed to load document`,"git.title":`Git`,"git.outputDialogTitle":`Git reported an error`,"git.statsFailed":`Git status could not be read`,"git.section.repository":`Repository`,"git.section.changes":`Changes`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`More`,"git.localOnly":`local only`,"git.pushed":`pushed`,"git.unpushed":`{count} unpushed`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Loading commits…`,"git.commits.empty":`No commits on this branch`,"git.commits.pushed":`Pushed`,"git.commits.unpushed":`Not pushed`,"git.commits.clickToAppend":`click to append SHA to chat`,"git.commits.diffThisCommit":`Diff this commit (vs parent)`,"git.compareCommits":`Compare commits…`,"git.files":`{count} file | {count} files`,"git.staged":`{count} staged`,"git.modified":`{count} modified`,"git.untracked":`{count} untracked`,"git.workingTreeEmpty":`No uncommitted changes`,"git.fileStaged":`Staged`,"git.fileModified":`Modified`,"git.fileUntracked":`Untracked`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Safer than plain --force: the push is rejected if the remote has commits you haven’t seen. Use after rebasing or amending already-pushed commits.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No upstream set for this branch — push it first to enable pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push the branch first`,"git.viewRequest":`View {request}`,"git.createRequest":`Create {request}`,"git.changeRequestBase":`Change {request} base branch`,"git.forgeCliMissing":`{cli} is not installed — install it to use {request} features`,"git.forgeNotAuthenticated":`Not authenticated — run {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Auto-detect`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`None`,"git.pullConfirmTitle":`Pull branch?`,"git.pullConfirmMessage":`Pull {branch} from remote (fast-forward only).`,"git.branchPulled":`Branch pulled`,"git.pullFailed":`Pull failed`,"git.renameBranch":`Rename branch`,"git.renameBranchPrompt":"Rename `{branch}` to:","git.renameBranchSuccess":"Branch renamed to `{branch}`","git.renameBranchFailed":`Failed to rename branch`,"git.renameBranchExists":"Branch `{branch}` already exists locally or on origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Open the diff viewer in Review mode — inline comments + batch submit to the agent`,"pr.baseChanged":`PR base changed: {oldBase} → {newBase}`,"pr.openPr":`Open PR`,"pr.openWorkspace":`Open workspace`,"pr.dismiss":`Dismiss`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase branch?`,"git.rebaseConfirmMessage":`Rebase onto {branch}. This may cause conflicts.`,"git.rebaseSuccess":`Rebase completed`,"git.rebaseFailed":`Rebase failed`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repository fetched`,"git.fetchFailed":`Fetch failed: {error}`,"git.mergeConfirmTitle":`Merge branch?`,"git.mergeConfirmMessage":`Merge {branch} into this branch. This may cause conflicts.`,"git.mergeSuccess":`Merge completed`,"git.mergeFailed":`Merge failed`,"git.commitFailed":`Commit failed`,"git.commitChanges":`Commit changes`,"git.commitDialogTitle":`Commit uncommitted changes`,"git.commitDialogDescription":`Enter your own message or ask the agent to inspect and create the commit.`,"git.commitMessage":`Commit message`,"git.commitManual":`Commit`,"git.commitWithAgent":`Ask agent`,"git.commitAgentSuccess":`Commit request sent to the agent`,"git.discardFailed":`Discard failed`,"git.conflictTitleMerge":`Merge conflicts detected`,"git.conflictTitleRebase":`Rebase conflicts detected`,"git.operationPausedTitle":`Git operation ready to continue`,"git.operationPausedSubtitle":`No files are in conflict. Git is simply waiting for you to continue the operation.`,"git.conflictSubtitle":`{count} file(s) have conflicts. Choose how to continue.`,"git.conflictAbortConfirmTitle":`Discard the conflict resolution?`,"git.conflictAbortConfirmMessage":`Everything you resolved in this {op} is thrown away and the worktree goes back to its pre-{op} state. This cannot be undone.`,"git.conflictAbort":`Abort`,"git.conflictContinue":`Continue`,"git.conflictContinued":`Git operation continued`,"git.conflictResolveWithAgent":`Ask agent to resolve`,"git.conflictAborted":`Operation aborted`,"git.conflictHandoffSuccess":`Agent is resolving the conflicts`,"git.dirtyTitleRebase":`Uncommitted changes block the rebase`,"git.dirtyTitleMerge":`Uncommitted changes block the merge`,"git.dirtyTitlePull":`Uncommitted changes block the pull`,"git.dirtySubtitle":`{modified} modified, {staged} staged, {untracked} untracked. Choose how to proceed.`,"git.dirtyStash":`Stash & retry`,"git.dirtyCommit":`Commit first`,"git.dirtyCommitPlaceholder":`Commit message`,"git.dirtyCommitConfirm":`Commit & retry`,"git.dirtyDiscard":`Discard changes`,"git.dirtyDiscardConfirmTitle":`Discard all uncommitted changes?`,"git.dirtyDiscardConfirmMessage":`Tracked changes will be lost (git reset --hard). Untracked files are kept. This cannot be undone.`,"git.pushConfirmTitle":`Push branch?`,"git.pushConfirmMessage":`Push {branch} to remote.`,"git.pushConfirmMessagePrefix":`Push branch`,"git.pushConfirmMessageSuffix":`to remote.`,"git.changePrBaseTitle":`Change base branch`,"git.changePrBaseMessage":`Enter the new target branch for the {request}.`,"git.changePrBaseSuccess":`{request} base branch updated`,"git.changePrBaseFailed":`Failed to change {request} base branch`,"git.mergeRequest":`Merge {request}`,"git.mergeRequestConfirmTitle":`Merge {request}?`,"git.mergeRequestConfirmMessage":`This merges the open {request} into its target branch.`,"git.mergeRequestSuccess":`{request} merged`,"git.mergeRequestFailed":`Failed to merge {request}`,"git.deleteRemoteBranch":`Delete remote branch`,"git.deleteRemoteBranchTitle":`Delete remote branch?`,"git.deleteRemoteBranchMessage":`The request was merged. Delete the remote branch {branch}?`,"git.deleteRemoteBranchSuccess":`Remote branch {branch} deleted`,"git.deleteRemoteBranchFailed":`Failed to delete remote branch`,"git.changeSourceBranch":`Change source branch`,"git.changeSourceBranchTitle":`Change source branch`,"git.changeSourceBranchMessage":`Pick the new source branch. The working branch will be rebuilt on top of it.`,"git.changeSourceBranchDone":`Source branch changed to {branch}`,"git.changeSourceBranchAligned":`Source branch changed to {branch} (branch had no own commits)`,"git.changeSourceBranchTooMany":`The branch has too many own commits ({n}) — rebase it manually`,"git.changeSourceBranchDirty":`Commit or stash your changes before changing the source branch`,"git.changeSourceBranchAgentRunning":`Stop the agent before changing the source branch`,"git.changeSourceBranchErrorTitle":`Source branch change failed`,"git.changeSourceBranchErrorOngoing":`A {op} operation is still in progress on the worktree. Abort it to return to a clean state.`,"git.changeSourceBranchErrorAbort":`Abort the operation`,"git.changeSourceBranchLoading":`Changing source branch…`,"git.changeSourceForcePushTitle":`Force-push the rewritten branch?`,"git.changeSourceForcePushMessage":`The branch history was rewritten. Force-push it to the remote with --force-with-lease?`,"git.changeSourceForcePushDone":`Branch force-pushed`,"git.openEditor":`Open in editor`,"git.openEditorFailed":`Failed to open editor`,"git.branchPushed":`Branch pushed`,"git.pushFirst":`Branch is not on remote. Click Push first.`,"git.unpushedCommits":`Local commits are not pushed. Click Push first.`,"git.from":`from`,"git.aheadBehindTooltip":`{ahead} commits ahead, {behind} behind {source}`,"git.divergence.title":`Branch divergence`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} ahead`,"git.divergence.behind":`↓ {count} behind`,"git.divergence.empty.ahead":`No commits ahead.`,"git.divergence.empty.behind":`No commits behind.`,"git.divergence.close":`Close`,"git.divergence.loading":`Loading commits…`,"git.divergence.failed":`Failed to load divergence`,"git.divergence.retry":`Retry`,"git.prCreated":`{request} #{n} created`,"git.pr.author":`Author`,"git.pr.reviewers":`Reviewers`,"git.pr.assignees":`Assignees`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Changes requested`,"git.pr.approvedBadge":`Approved`,"git.pr.ci.passed":`CI passed`,"git.pr.ci.failed":`CI failed`,"git.pr.ci.pending":`CI running`,"git.pr.ci.failedCount":`{n} failed`,"git.pr.ci.pendingCount":`{n} pending`,"git.pr.ci.passedCount":`{n} passed`,"git.pr.ci.skippedCount":`{n} skipped`,"git.pr.ci.showPassed":`Show {n} passing jobs`,"git.pr.ci.hidePassed":`Hide passing jobs`,"toast.prChangesRequested":`PR #{n} has changes requested`,"toast.prApproved":`PR #{n} has been approved`,"toast.prReadyToMerge":`PR #{n} is ready to merge`,"toast.prCiFailed":`CI failed for PR #{n}`,"toast.prCiRecovered":`CI recovered for PR #{n}`,"toast.prMergeConflict":`PR #{n} has merge conflicts`,"toast.prMerged":`PR #{n} has been merged`,"devServer.title":`Dev Server`,"devServer.noWorkspace":`No workspace selected`,"devServer.notConfigured":`Not configured —`,"devServer.goToSettings":`Settings`,"devServer.logs":`Logs`,"devServer.running":`Running`,"devServer.starting":`Starting`,"devServer.stopping":`Stopping`,"devServer.error":`Error`,"devServer.stopped":`Stopped`,"devServer.unknown":`Unknown`,"devServer.containers":`{count} container | {count} containers`,"devServer.logDialog.title":`Logs Dev Server`,"devServer.logDialog.empty":`No logs available`,"notion.title":`Notion`,"tasks.title":`Tasks`,"notion.addTask":`Add task`,"notion.noUrl":`No Notion URL`,"notion.subtasks":`{done}/{total} subtasks`,"notion.noTasks":`No tasks`,"notion.newTask":`New task... (Enter to add, Esc to cancel)`,"acceptance.title":`Acceptance Criteria`,"acceptance.addCriterion":`Add criterion`,"acceptance.newCriterion":`New criterion... (Enter to add, Esc to cancel)`,"acceptance.empty":`No acceptance criteria`,"tasks.askProgress":`Ask agent to review progress`,"agentTodos.title":`Agent Todos`,"agentTodos.empty":`No agent todos`,"subagents.title":`Sub-agents`,"subagents.empty":`No sub-agent activity yet`,"subagents.tools":`{count} tools`,"subagents.running":`Running: `,"stats.resetsAt":`Resets {value}`,"stats.usageBucket":`Usage bucket {n}`,"quotaFooter.lastUpdated":`Last update: {time}`,"quotaFooter.empty":`Loading…`,"quotaFooter.popover.title":`Claude Code usage`,"quotaFooter.popover.refreshNow":`Refresh now`,"quotaFooter.popover.resetsIn":`Resets at {value}`,"quotaFooter.popover.unauthenticated":`Auth required`,"quotaFooter.popover.unauthenticatedHint":`Run "claude" once to authenticate.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5-hour`,"quotaFooter.bucket.sevenDay":`7-day`,"agent.error.spawn_failed":`Failed to launch the agent`,"agent.error.parse_error":`Unable to parse an agent message`,"agent.error.rate_limit":`Rate limit hit`,"agent.error.resume_failed":`Session not found — starting fresh`,"agent.error.other":`Agent error`,"quotaBackoff.banner.title":`Auto-resume at {time}`,"quotaBackoff.banner.transientTitle":`Auto-resume after interruption at {time}`,"quotaBackoff.resumeNow":`Resume now`,"quotaBackoff.banner.tooltip":`Claude quota exhausted. Auto-loop will resume automatically when the quota resets at {resets_at}.`,"quotaBackoff.banner.cancel":`Cancel resume`,"quotaBackoff.cancelled":`Auto-resume cancelled — you can re-engage manually anytime`,"rateLimitType.fiveHour":`5h session`,"rateLimitType.sevenDay":`Weekly`,"tooltip.addTask":`Add task`,"tooltip.removeTask":`Remove task`,"tooltip.addCriterion":`Add criterion`,"tooltip.removeCriterion":`Remove criterion`,"tooltip.startDevServer":`Start dev server`,"tooltip.stopDevServer":`Stop dev server`,"tooltip.closeDiffViewer":`Close diff viewer`,"tooltip.refreshLogs":`Refresh logs`,"tooltip.closeDialog":`Close`,"tooltip.refreshGitStats":`Refresh Git stats`,"tooltip.removeImage":`Remove image`,"tooltip.sendMessage":`Send message`,"tools.title":`Tools`,"tools.runSetupScript":`Re-run setup script`,"tools.runSetupScriptTooltip":`Execute the project setup script in the worktree`,"tools.runSetupScriptConfirm":`Re-run the setup script in this workspace? Existing artifacts may be overwritten.`,"tools.runSetupScriptBusy":`Cannot re-run setup while the agent is working.`,"tools.noSetupScript":`No setup script configured —`,"tools.setupScriptSuccess":`Setup script completed successfully.`,"tools.setupScriptFailed":`Setup script failed.`,"tools.openNotion":`Open in Notion`,"tools.openSentry":`Open in Sentry`,"tools.review":`Review changes`,"tools.reviewTooltip":`Ask the agent to review the changes on this branch`,"tools.reviewBusy":`Agent is busy — wait until it's idle`,"tools.fixCi":`Fix CI`,"tools.fixCiTooltip":`Ask the agent to diagnose and fix the failing CI jobs`,"tools.fixCiLaunched":`Fix-CI action dispatched to the agent`,"tools.fixCiFailed":`Failed to launch the Fix-CI action`,"tools.openFileManager":`Open in file manager`,"tools.openFileManagerTooltip":`Open the worktree folder in your configured file manager`,"tools.openFileManagerFailed":`Failed to open the file manager`,"tools.openTerminal":`Open in terminal`,"tools.openTerminalTooltip":`Open the worktree in your configured terminal`,"tools.openTerminalFailed":`Failed to open terminal`,"review.title":`Start review`,"review.subtitle":`Ask the agent to review your changes and provide feedback.`,"review.additionalInstructions":`Additional instructions (optional)`,"review.additionalInstructionsPlaceholder":`Add any specific instructions for the review…`,"review.newSession":`New session`,"review.newSessionHint":`Start a fresh agent session instead of continuing the current one.`,"review.start":`Start Review`,"review.cancel":`Cancel`,"review.launched":`Review started`,"review.failed":`Failed to start review`,"diff.title":`Diff`,"diff.side":`Side`,"diff.inline":`Inline`,"diff.hideUnchanged":`Hide unchanged code`,"diff.showUnchanged":`Show unchanged code`,"diff.showUntracked":`Show untracked files`,"diff.hideUntracked":`Hide untracked files`,"diff.rollbackToRemote":`Rollback to remote`,"diff.rollbackConfirm":`Reset {path} to its remote (origin) version? Local edits to this file will be lost.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`File reset to remote version`,"diff.rollbackDoneRemote":`File reset to remote version`,"diff.rollbackDoneHead":`Local edits discarded (file reset to last commit)`,"diff.rollbackDoneDeleted":`Untracked file deleted`,"diff.deleteUntracked":`Delete untracked file`,"diff.deleteUntrackedConfirm":`Permanently delete {path}? This file is not tracked — its content will be lost.`,"diff.deleteUntrackedConfirmOk":`Delete`,"diff.rollbackFailed":`Rollback failed`,"diff.rollbackFailedDetail":`Rollback failed: {error}`,"diff.modeInspect":`Edit`,"diff.modeReview":`Review`,"diff.addComment":`Add comment`,"diff.replyComment":`Reply`,"diff.editComment":`Edit`,"diff.deleteComment":`Delete`,"diff.deleteCommentConfirm":`Delete this comment?`,"diff.commentPlaceholder":`Write a review comment… (Markdown supported)`,"diff.reviewDraft":`Review draft`,"diff.reviewEmpty":`No comments yet — hover a line in the diff and click + to add one.`,"diff.reviewGlobalPlaceholder":`Add an overall review message (optional)`,"diff.submitReview":`Submit review ({n})`,"diff.reviewSubmitted":`Review submitted to agent`,"diff.reviewSubmitFailed":`Failed to submit review: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Unpushed`,"diff.noChanges":`No changes`,"diff.searchFiles":`Search files…`,"diff.noFileMatch":`No file matches`,"diff.selectFile":`Select a file to view diff`,"diff.fileLoadFailed":`This diff could not be loaded`,"diff.fileLoadFailedHint":`The file is unchanged on disk — only its diff failed to load.`,"diff.fileListLoadFailed":`The file list could not be loaded`,"diff.fileListLoadFailedHint":`This is a failed request, not a branch without changes.`,"diff.addToChat":`Add to chat`,"diff.compareTitle":`Compare commits`,"diff.compareFrom":`From`,"diff.compareTo":`To`,"diff.compareSubmit":`Compare`,"diff.compareSourceBase":`{branch} (branch base)`,"diff.commitsReadOnly":`read-only`,"diffViewer.save":`Save`,"diffViewer.savedAt":`Saved`,"diffViewer.saveFailed":`Save failed`,"diffViewer.saveFailedDetail":`Save failed: {error}`,"diffViewer.unsavedChanges.title":`Unsaved changes`,"diffViewer.unsavedChanges.message":`You have unsaved edits. What do you want to do?`,"diffViewer.unsavedChanges.save":`Save`,"diffViewer.unsavedChanges.cancel":`Cancel`,"diffViewer.conflict.title":`File changed on disk`,"diffViewer.conflict.message":`The file was modified outside Kōbō since you opened it.`,"diffViewer.conflict.reload":`Reload (discard local)`,"diffViewer.conflict.keep":`Keep mine`,"diffViewer.conflict.overwrite":`Overwrite anyway`,"diffViewer.conflict.overwriteHint":`Replaces the file on disk with your version. The other change is lost.`,"diffViewer.conflict.keepHint":`Keeps your edits in the editor and accepts the new on-disk signature, so the next save works.`,"diffViewer.saveBlocked":`The agent is running — stop it to save your edits.`,"diffViewer.unsavedBanner":`Unsaved edits. Stop the agent to save them.`,"diffViewer.closeConfirm.title":`Unsaved changes`,"diffViewer.closeConfirm.message":`This file has edits that were never saved. Closing the diff viewer discards them.`,"diffViewer.closeConfirm.discard":`Close without saving`,"diffViewer.criteriaRail":`Review checklist`,"diffViewer.criteriaRailShow":`Show the review checklist`,"diffViewer.criteriaRailHide":`Hide the review checklist`,"diffViewer.fileTreeShow":`Show the file tree`,"diffViewer.fileTreeHide":`Hide the file tree`,"diffViewer.closeConfirm.saveAndClose":`Save and close`,"diffViewer.agentRunning":`Agent runs — stop it to edit`,"diffViewer.fileDeleted":`File deleted`,"notification.agentFinished":`{name} — Agent finished`,"notification.agentQuestion":`{name} — Agent is asking a question`,"notification.agentPermissionRequest":`{name} — Agent is requesting a permission`,"notification.autoLoopCompleted":`{name} — Auto-loop completed`,"notification.autoLoopStalled":`{name} — Auto-loop stalled (no progress)`,"notification.autoLoopError":`{name} — Auto-loop stopped on error`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop paused, waiting for your clarification`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop promoted plan mode to bypass`,"notification.agentError":`{name} — Agent error`,"contextMenu.rename":`Rename`,"contextMenu.editDescription":`Edit description`,"contextMenu.copyPath":`Copy worktree path`,"contextMenu.openEditor":`Open in editor`,"contextMenu.openFileManager":`Open in file manager`,"contextMenu.unarchiveDisabledPurged":"The worktree was removed from disk. Recreate it manually (`gh pr checkout` or `git worktree add`) — Kōbō auto-detects the restoration within 30s and reactivates the workspace.","workspaceList.unarchiveBlockedPurged":"Can't unarchive: the worktree no longer exists on disk. Recreate it manually (`gh pr checkout` or `git worktree add`) — Kōbō detects it within 30s and reactivates the workspace.","contextMenu.purgeWorktree":`Free disk space (delete worktree)`,"contextMenu.purgeWorktreeTooltip":`Deletes the worktree from disk to reclaim space — chat / session history is preserved. Auto-archives the workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Free disk space?`,"contextMenu.purgeWorktreeDialogMessage":`The worktree folder for «{name}» will be deleted from disk. Chat and session history are kept. The workspace is auto-archived. This cannot be undone in the current version.`,"contextMenu.purgeWorktreeDialogConfirm":`Delete the worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree deleted — disk space reclaimed.`,"settings.autoPurgeOnPrMerged":`Auto-purge worktree on PR merged`,"settings.autoPurgeOnPrMergedHint":`When ON, the worktree is deleted from disk as soon as the PR is merged (in addition to the auto-archive). Chat history is kept.`,"settings.autoLoopMaxRetries":`Maximum automatic retries`,"settings.autoLoopMaxRetriesHint":`Stops the auto-loop after this many quota or temporary server failures.`,"settings.retentionTitle":`Conversation history retention (off by default)`,"settings.retentionWarning":`Turning this on permanently deletes agent conversation history from the database, starting with everything already older than the window. Deleted events cannot be recovered.`,"settings.retentionHint":`Runs once at server start-up. Workspaces, tasks, sessions, branches and worktrees are never touched — only the recorded agent output.`,"settings.retentionDaysLabel":`Delete events older than (days)`,"settings.retentionDaysHint":`0 — the default — keeps every event for ever. Set a value to enable retention.`,"settings.retentionKeepLabel":`Events always kept per workspace`,"settings.retentionKeepHint":`The most recent events of each workspace survive whatever their age, so an old but still-open workspace keeps a readable history. Suggested: 5000.`,"settings.retentionDisabledHint":`Retention is disabled: nothing will ever be deleted.`,"settings.retentionConfirmTitle":`Permanently delete conversation history?`,"settings.retentionConfirmMessage":`Keeping only {days} day(s) of history will permanently delete {count} of the {total} recorded agent events at the next server start-up, including everything already older than that. This cannot be undone. Continue?`,"settings.retentionConfirmMessageUnknown":`Keeping only {days} day(s) of history will permanently delete every older agent event at the next server start-up, including everything already accumulated. The exact volume could not be counted. This cannot be undone. Continue?`,"settings.purgeDocsTitle":`How purge works — restore & permissions`,"settings.purgeDocsRestoreTitle":`Restoring a purged worktree (auto-detected)`,"settings.purgeDocsRestoreIntro":`A purged workspace keeps its chat history and PR metadata but the worktree folder is gone. Rebuild it manually with one of these commands — Kōbō detects the folder reappearing within 30 seconds and automatically reactivates the workspace (unarchive + clear purge flag):`,"settings.purgeDocsRestoreCommands":`# GitHub (using gh CLI):
|
|
29
29
|
gh pr checkout [pr-number] --recurse-submodules
|
|
30
30
|
|
|
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`,"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":`Edita los cuatro prompts a continuación tú mismo. Parte de la base agnóstica.`,"settings.skillSuite.reloadDefaults":`Restaurar predeterminados`,"settings.skillSuite.reloadDefaultsConfirm":`¿Reemplazar los cuatro prompts personalizados con los valores agnósticos predeterminados?`,"settings.skillSuite.customPrompts":`Prompts personalizados`,"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`},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
|
|
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)
|
|
@@ -41,13 +41,13 @@ KOBO_WORKSPACE_ID — id Kōbō del workspace (estable tras renombrar)
|
|
|
41
41
|
KOBO_WORKSPACE_NAME — nombre visible del workspace
|
|
42
42
|
KOBO_FORGE — forge resuelta: github / gitlab / none
|
|
43
43
|
KOBO_PR_NUMBER — número de PR/MR en la forge resuelta (vacío si no hay ninguna abierta)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
|
|
44
|
-
# tu script — usa $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Restablecer al predeterminado de Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`¿Restablecer el script?`,"settings.changeSourceBranchScript.replaceConfirm":`Tus modificaciones se reemplazarán por el script predeterminado de Kōbō. ¿Continuar?`,"settings.cleanupScriptHint":`Script de shell ejecutado en el worktree después de cada sesión del agente. En modo auto-loop solo se ejecuta cuando todas las tareas están terminadas. Dejar vacío para desactivar.`,"settings.cleanupScriptPlaceholder":`p. ej. eliminar archivos temporales, detener contenedores…`,"settings.cleanupScriptMode":`Cuándo ejecutar`,"settings.cleanupScriptMode.idle":`Después de cada sesión — aunque queden tareas`,"settings.cleanupScriptMode.noTasks":`Solo cuando no queda ninguna tarea de Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Ejecutar solo si se modificaron, añadieron o eliminaron archivos`,"settings.cleanupScriptMode.inherit":`Heredar la configuración global`,"settings.taskPromptTemplate":`Prompt de tarea`,"settings.taskPromptTemplatePlaceholder":`Prompt insertado automáticamente en la descripción de la tarea…`,"settings.taskPromptTemplateHint":`Se inyecta automáticamente en la descripción de la tarea en la página de creación cuando este proyecto está seleccionado. Si no se modifica, se reemplaza al cambiar de proyecto; en cuanto lo editas, se conserva tu texto.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Se ejecuta con bash en el worktree después de su creación, antes de que el agente inicie. No necesita shebang. Si falla, el workspace se establece en error. Timeout: 5 minutos.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Ninguno`,"settings.e2e.frameworkOther":`Otro`,"settings.e2e.skill":`Skill (opcional)`,"settings.e2e.skillPlaceholder":`p. ej. cypress-tester`,"settings.e2e.prompt":`Guía personalizada (opcional)`,"settings.e2e.promptPlaceholder":`p. ej. usar el patrón page-object, apuntar a data-testid`,"settings.e2e.helpText":`Cuando está configurado, el agente de grooming auto-loop inserta subtareas E2E para funciones UI.`,"settings.finalization.title":`Finalización del auto-loop`,"settings.finalization.helpText":`Opcional: un prompt que el agente ejecuta como la última iteración del auto-loop. Típicamente usado para controles de calidad finales (lint, typecheck, tests). La fase de grooming creará una tarea con prefijo [FINAL] que usará este prompt.`,"settings.finalization.prompt":`Prompt de finalización`,"settings.finalization.promptPlaceholder":`p. ej. Ejecuta npm run lint y npm test, luego marca esta tarea como hecha.`,"settings.editorCommand":`Comando del editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando para abrir el worktree en su editor. La ruta del worktree se pasa como argumento.`,"settings.fileManagerCommand":`Comando del explorador de archivos`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Comando para abrir el worktree en su explorador de archivos. La ruta del worktree se pasa como argumento. Déjalo vacío para ocultar el botón.`,"settings.terminalCommand":`Comando de terminal`,"settings.terminalCommandHint":`Comando para abrir tu terminal en el worktree. Marcador {path} opcional para el directorio.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Selección MCP de Claude`,"settings.mcpAutoSelect":`Auto (primer MCP activo que coincide)`,"settings.notionMcp":`Clave MCP de Notion`,"settings.sentryMcp":`Clave MCP de Sentry`,"settings.mcpSelectionHint":`Las entradas activas se leen desde ~/.claude.json. Deja Auto para usar el comportamiento por defecto.`,"settings.configuredProjects":`Proyectos configurados`,"settings.noProjects":`No hay proyectos configurados`,"settings.addProject":`Añadir proyecto`,"settings.copyFrom":`Copiar ajustes desde`,"settings.copyFromPlaceholder":`(ninguno — partir de los valores por defecto)`,"settings.copyFromHint":`Copia todos los ajustes excepto path, nombre y rama fuente.`,"settings.copyFromConfirmTitle":`¿Sobrescribir los valores actuales?`,"settings.copyFromConfirm":`Se sobrescribirán los valores del formulario con los ajustes de «{project}». ¿Continuar?`,"settings.newProject":`Nuevo proyecto`,"settings.editProject":`Editar proyecto`,"settings.onboardingTitle":`Visita guiada`,"settings.onboardingHint":`Vuelve a ver la presentación de los elementos principales de la interfaz.`,"settings.onboardingReplay":`Volver a ver la visita guiada`,"onboarding.list.title":`Espacios de trabajo`,"onboarding.list.description":`Cada misión vive en su propio espacio — un git worktree, una rama y una sesión de agente dedicados. Todos aparecen aquí.`,"onboarding.create.title":`Crear un espacio de trabajo`,"onboarding.create.description":`Haz clic en + para iniciar una nueva misión — desde un ticket de Notion, una incidencia de Sentry o desde cero.`,"onboarding.search.title":`Búsqueda`,"onboarding.search.description":`Filtra tus espacios de trabajo por nombre, o busca en el historial de conversaciones de los agentes.`,"onboarding.health.title":`Estado`,"onboarding.health.description":`Comprueba el estado de Kōbō: base de datos, agentes activos, integraciones, copias de seguridad.`,"onboarding.changelog.title":`Novedades`,"onboarding.changelog.description":`Consulta las últimas versiones de Kōbō: nuevas funciones, correcciones, cambios de comportamiento. Aparece un indicador cuando hay una versión sin leer.`,"onboarding.settings.title":`Ajustes`,"onboarding.settings.description":`Modelos, scripts de ciclo de vida, integraciones, voz — toda la configuración de Kōbō está aquí. Haz clic en Siguiente para recorrer cada sección.`,"onboarding.settings-general.title":`General`,"onboarding.settings-general.description":`Idioma de la interfaz, proyecto por defecto y comportamiento global aplicado a cada nuevo workspace.`,"onboarding.settings-agents.title":`Agentes y modelos`,"onboarding.settings-agents.description":`Elige el motor por defecto — Claude Code o Codex —, el modelo y el modo de permisos de los agentes.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Elige la suite de skills que cargan los agentes: el preajuste recomendado o tu selección personalizada.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`Plantilla de descripción de PR y otros textos de prompt reutilizables por los agentes.`,"onboarding.settings-scripts.title":`Scripts`,"onboarding.settings-scripts.description":`Scripts de ciclo de vida ejecutados en cleanup, archivado y setup del workspace — globales o por proyecto.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Conecta tu token de integración de Notion para importar tickets como misiones de workspace.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Importar una issue de Sentry como fuente de verdad de un workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Elige GitHub, GitLab o ninguna, por proyecto. Kōbō usa tu propia CLI gh / glab — no incluye credenciales.`,"onboarding.settings-voice.title":`Voz`,"onboarding.settings-voice.description":`Dictado por voz: actívalo, elige el modelo Whisper y gestiona el runtime de reconocimiento de voz local.`,"onboarding.settings-notifications.title":`Notificaciones`,"onboarding.settings-notifications.description":`Notificaciones de sonido y de navegador para eventos y cambios de estado de los agentes.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Prefijos de rama Git y la carpeta donde se crean los worktrees de los workspaces.`,"onboarding.settings-worktrees-purge.title":`Liberar espacio en disco automáticamente`,"onboarding.settings-worktrees-purge.description":"Activa este toggle para que Kōbō elimine la carpeta worktree (a menudo cientos de MB de node_modules / vendor) en cuanto una PR se mergea. El historial de chat y los metadatos de la PR se conservan. Puedes recrear el worktree más tarde con `gh pr checkout <pr>` — Kōbō detecta automáticamente la restauración en menos de 30 segundos y reactiva el workspace.","onboarding.settings-projects.title":`Proyectos`,"onboarding.settings-projects.description":`Registra los repositorios en los que trabajas. Haz clic en «Añadir un proyecto» para apuntar Kōbō a un repositorio local — cada workspace se dirige a uno de estos proyectos.`,"onboarding.settings-templates.title":`Plantillas`,"onboarding.settings-templates.description":`Tu biblioteca de plantillas de prompt reutilizables — elige una para rellenar el brief al crear un workspace.`,"onboarding.settings-export.title":`Importar / Exportar`,"onboarding.settings-export.description":`Respalda o comparte tu configuración de Kōbō, y exporta los datos de los workspaces a un archivo.`,"onboarding.firstWorkspace.title":`Crea tu primer workspace`,"onboarding.firstWorkspace.description":`De eso se trata: una misión, un worktree, un agente. Abre la página de creación para empezar.`,"onboarding.next":`Siguiente`,"onboarding.prev":`Atrás`,"onboarding.done":`Hecho`,"onboarding.exitConfirm":`¿Salir del recorrido guiado? Puedes repetirlo en cualquier momento desde Ajustes.`,"settings.projectGroup.identity":`Identidad`,"settings.projectGroup.defaults":`Valores predeterminados`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Ruta del proyecto`,"settings.projectPathPlaceholder":`/ruta/al/proyecto`,"settings.displayName":`Nombre para mostrar`,"settings.displayNamePlaceholder":`Mi proyecto`,"settings.defaultSourceBranch":`Rama fuente por defecto`,"settings.defaultModel.project":`Modelo por defecto`,"settings.skipPermissions.project":`Omitir solicitudes de permisos`,"settings.prPromptTemplate.project":`Plantilla de prompt PR`,"settings.prPromptPlaceholder.project":`Instrucciones específicas del proyecto para la creación de PRs...`,"settings.reviewPromptTemplate.project":`Plantilla de prompt de revisión`,"settings.ciFixPromptTemplate.project":`Plantilla de prompt «Reparar CI»`,"settings.gitConventions.project":`Convenciones Git (por proyecto)`,"settings.gitConventionsEmpty":`Dejar vacío para usar las convenciones globales.`,"settings.notionStatus":`Estado ticket Notion`,"settings.notionStatusProperty":`Nombre de la propiedad`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valor a establecer`,"settings.notionInProgressStatusPlaceholder":`En progreso, In progress...`,"settings.notionStatusHint":`Cuando se crea un workspace con un ticket Notion, la propiedad especificada se establece a este valor. Ambos campos son obligatorios. Dejar vacío para desactivar.`,"settings.notionAssignee":`Asignación Notion`,"settings.notionAssigneeHint":`Cuando se crea un workspace con un ticket Notion, el usuario autenticado en el MCP de Notion se añade a esta propiedad People — solo si aún no tiene un asignado. Dejar vacío para desactivar.`,"settings.notionAssigneeProperty":`Nombre de la propiedad`,"settings.notionAssigneePropertyPlaceholder":`Desarrolladores, Assignees...`,"settings.notionUserId":`Tu UUID de Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Selecciona tu cuenta en la lista. Notion rechaza la asignación de bots en propiedades People — este campo es obligatorio para activar la auto-asignación.`,"settings.notionUsersRefresh":`Refrescar`,"settings.notionUsersLoading":`Cargando usuarios de Notion…`,"settings.notionUsersLoadFailed":`Error al cargar la lista: {error}`,"settings.notionUsersManualFallback":`Lista no disponible — pega tu UUID de Notion manualmente.`,"settings.devServer":`Servidor de desarrollo`,"settings.devServerStart":`Script de inicio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script de parada`,"settings.devServerStopPlaceholder":`Opcional — el proceso se cerrará automáticamente si está vacío`,"settings.selectProject":`Selecciona un proyecto o añade uno nuevo`,"settings.projectPathRequired":`La ruta del proyecto es obligatoria.`,"settings.useGlobal":`Usar global`,"settings.saved":`Ajustes globales guardados.`,"settings.unsavedChanges":`Cambios sin guardar`,"settings.nav.general":`General`,"settings.nav.agents":`Agentes`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Las credenciales se guardan localmente y solo las usa bkt.`,"settings.bitbucketUsername":`Correo de Atlassian`,"settings.bitbucketToken":`Token API de Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voz`,"settings.nav.notifications":`Notificaciones`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Exportar`,"settings.openNav":`Abrir la navegación`,"settings.saveError":`Error al guardar los ajustes.`,"settings.projectSaved":`Proyecto guardado.`,"settings.projectSaveError":`Error al guardar el proyecto.`,"settings.projectDeleted":`Proyecto eliminado.`,"settings.deleteProjectConfirmTitle":`¿Eliminar proyecto?`,"settings.deleteProjectConfirmMessage":`¿Quitar «{name}» de tus proyectos? Esto solo elimina sus ajustes de Kōbō — tu código y tus worktrees no se modifican.`,"settings.projectDeleteError":`Error al eliminar el proyecto.`,"templates.title":`Plantillas`,"templates.newTemplate":`Nueva plantilla`,"templates.editTemplate":`Editar plantilla`,"templates.deleteTemplate":`Eliminar plantilla`,"templates.deleteConfirm":`¿Eliminar la plantilla '/{slug}'?`,"templates.deleteConfirmMessage":`Esta acción no se puede deshacer.`,"templates.slug":`Slug`,"templates.slugHint":`Minúsculas, dígitos, guiones. Máx. 64 caracteres.`,"templates.slugInvalid":`El slug solo puede contener minúsculas, dígitos y guiones`,"templates.slugDuplicate":`Ya existe una plantilla con este slug`,"templates.description":`Descripción`,"templates.descriptionHint":`Etiqueta corta mostrada en el dropdown.`,"templates.descriptionRequired":`La descripción es obligatoria`,"templates.contentRequired":`El contenido es obligatorio`,"templates.content":`Contenido`,"templates.contentHint":`Contenido de la plantilla. Usa {variable_name} para las sustituciones.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Archivo: {path}`,"templates.empty":`Aún no hay plantillas.`,"templates.createFailed":`Error al crear la plantilla`,"templates.updateFailed":`Error al actualizar la plantilla`,"templates.deleteFailed":`Error al eliminar la plantilla`,"templates.save":`Guardar`,"templates.create":`Crear`,"templates.reloadDefaults":`Recargar plantillas predeterminadas`,"templates.reloadDefaultsHint":`Solo añade las plantillas predeterminadas que faltan. Las plantillas existentes (modificadas o no) nunca se sobrescriben.`,"templates.reloadDefaultsConfirmMessage":`Esta acción añadirá a la lista las plantillas predeterminadas que falten. Las plantillas existentes — incluidas las que hayas personalizado — no se tocarán. Si quieres restaurar una plantilla predeterminada que has modificado, elimínala primero y vuelve a ejecutar esta acción.`,"templates.reloadDefaultsSuccess":`{added} añadida(s), {kept} conservada(s)`,"templates.reloadDefaultsFailed":`Error al recargar las plantillas predeterminadas`,"templates.resetToDefault":`Restablecer al valor predeterminado`,"templates.resetConfirmTitle":`¿Restablecer la plantilla al valor predeterminado?`,"templates.resetConfirmMessage":`Esto sobrescribe tus cambios locales en /{slug} con el predeterminado. No se puede deshacer.`,"templates.resetSuccess":`Plantilla /{slug} restablecida al predeterminado`,"templates.resetFailed":`Error al restablecer la plantilla`,"chatInput.dropdownSkills":`Skills de Claude`,"chatInput.dropdownKobo":`Comandos Kōbō`,"chatInput.dropdownTemplates":`Plantillas`,"documents.title":`Documentos`,"documents.empty":`No se encontraron documentos`,"documents.refresh":`Actualizar`,"documents.back":`Volver`,"documents.loadFailed":`Error al cargar el documento`,"git.title":`Git`,"git.outputDialogTitle":`Git informó de un error`,"git.statsFailed":`No se pudo leer el estado de git`,"git.section.repository":`Repositorio`,"git.section.changes":`Cambios`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Acciones`,"git.actions.more":`Más`,"git.localOnly":`solo local`,"git.pushed":`pushed`,"git.unpushed":`{count} sin push`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Cargando commits…`,"git.commits.empty":`Sin commits en esta rama`,"git.commits.pushed":`Pusheado`,"git.commits.unpushed":`Sin pushear`,"git.commits.clickToAppend":`click para agregar SHA al chat`,"git.commits.diffThisCommit":`Diff de este commit (vs padre)`,"git.compareCommits":`Comparar commits…`,"git.files":`{count} archivo | {count} archivos`,"git.staged":`{count} staged`,"git.modified":`{count} modificados`,"git.untracked":`{count} sin seguimiento`,"git.workingTreeEmpty":`Sin cambios sin confirmar`,"git.fileStaged":`Preparado`,"git.fileModified":`Modificado`,"git.fileUntracked":`Sin seguimiento`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Más seguro que --force: el push se rechaza si el remoto tiene commits que no has visto. Úsalo tras un rebase o amend de commits ya pusheados.`,"git.branchForcePushed":`Rama force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No hay upstream para esta rama — hazle push primero para habilitar Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la rama primero`,"git.viewRequest":`Ver {request}`,"git.createRequest":`Crear {request}`,"git.changeRequestBase":`Cambiar la rama base de la {request}`,"git.forgeCliMissing":`{cli} no está instalado — instálalo para usar las funciones de {request}`,"git.forgeNotAuthenticated":`No autenticado — ejecuta {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Detección automática`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Ninguna`,"git.pullConfirmTitle":`¿Pull la rama?`,"git.pullConfirmMessage":`Pull {branch} desde el remoto (solo fast-forward).`,"git.branchPulled":`Rama actualizada`,"git.pullFailed":`Error al hacer pull`,"git.renameBranch":`Renombrar rama`,"git.renameBranchPrompt":"Renombrar `{branch}` a:","git.renameBranchSuccess":"Rama renombrada a `{branch}`","git.renameBranchFailed":`Error al renombrar la rama`,"git.renameBranchExists":"La rama `{branch}` ya existe localmente o en origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Abre el visor de diff en modo Review — comentarios en línea + envío por lotes al agente`,"pr.baseChanged":`Base de la PR cambiada: {oldBase} → {newBase}`,"pr.openPr":`Abrir PR`,"pr.openWorkspace":`Abrir el workspace`,"pr.dismiss":`Cerrar`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`¿Rebase de la rama?`,"git.rebaseConfirmMessage":`Rebase sobre {branch}. Pueden surgir conflictos.`,"git.rebaseSuccess":`Rebase completado`,"git.rebaseFailed":`Rebase fallido`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repositorio actualizado`,"git.fetchFailed":`Fallo al hacer fetch: {error}`,"git.mergeConfirmTitle":`¿Fusionar la rama?`,"git.mergeConfirmMessage":`Fusionar {branch} en esta rama. Puede haber conflictos.`,"git.mergeSuccess":`Merge completado`,"git.mergeFailed":`Merge fallido`,"git.commitFailed":`Commit fallido`,"git.commitChanges":`Confirmar cambios`,"git.commitDialogTitle":`Confirmar cambios sin confirmar`,"git.commitDialogDescription":`Escribe tu mensaje o pide al agente que revise y cree el commit.`,"git.commitMessage":`Mensaje de commit`,"git.commitManual":`Confirmar`,"git.commitWithAgent":`Pedir al agente`,"git.commitAgentSuccess":`Solicitud de commit enviada al agente`,"git.discardFailed":`Descarte fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.operationPausedTitle":`Operación Git para continuar`,"git.operationPausedSubtitle":`No hay archivos en conflicto. Git solo espera que continúes la operación.`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbortConfirmTitle":`¿Descartar la resolución del conflicto?`,"git.conflictAbortConfirmMessage":`Todo lo que has resuelto en este {op} se descarta y el worktree vuelve a su estado anterior. Es irreversible.`,"git.conflictAbort":`Abortar`,"git.conflictContinue":`Continuar`,"git.conflictContinued":`Operación Git continuada`,"git.conflictResolveWithAgent":`Pedir al agente que resuelva`,"git.conflictAborted":`Operación abortada`,"git.conflictHandoffSuccess":`El agente está resolviendo los conflictos`,"git.dirtyTitleRebase":`Cambios sin confirmar bloquean el rebase`,"git.dirtyTitleMerge":`Cambios sin confirmar bloquean el merge`,"git.dirtyTitlePull":`Cambios sin confirmar bloquean el pull`,"git.dirtySubtitle":`{modified} modificado(s), {staged} preparado(s), {untracked} sin seguimiento. Elige cómo continuar.`,"git.dirtyStash":`Stash y reintentar`,"git.dirtyCommit":`Commit primero`,"git.dirtyCommitPlaceholder":`Mensaje del commit`,"git.dirtyCommitConfirm":`Commit y reintentar`,"git.dirtyDiscard":`Descartar cambios`,"git.dirtyDiscardConfirmTitle":`¿Descartar todos los cambios sin confirmar?`,"git.dirtyDiscardConfirmMessage":`Los cambios con seguimiento se perderán (git reset --hard). Los archivos sin seguimiento se conservan. Acción irreversible.`,"git.pushConfirmTitle":`¿Pushar la rama?`,"git.pushConfirmMessage":`Pushar {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Pushar la rama`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBaseTitle":`Cambiar rama base`,"git.changePrBaseMessage":`Ingrese la nueva rama destino para el {request}.`,"git.changePrBaseSuccess":`Rama base de la {request} actualizada`,"git.changePrBaseFailed":`No se pudo cambiar la rama base de la {request}`,"git.mergeRequest":`Fusionar {request}`,"git.mergeRequestConfirmTitle":`¿Fusionar {request}?`,"git.mergeRequestConfirmMessage":`Esto fusionará la {request} abierta en su rama de destino.`,"git.mergeRequestSuccess":`{request} fusionada`,"git.mergeRequestFailed":`No se pudo fusionar {request}`,"git.deleteRemoteBranch":`Eliminar rama remota`,"git.deleteRemoteBranchTitle":`¿Eliminar rama remota?`,"git.deleteRemoteBranchMessage":`La solicitud se fusionó. ¿Eliminar la rama remota {branch}?`,"git.deleteRemoteBranchSuccess":`Rama remota {branch} eliminada`,"git.deleteRemoteBranchFailed":`No se pudo eliminar la rama remota`,"git.changeSourceBranch":`Cambiar la rama de origen`,"git.changeSourceBranchTitle":`Cambiar la rama de origen`,"git.changeSourceBranchMessage":`Elige la nueva rama de origen. La rama de trabajo se reconstruirá encima.`,"git.changeSourceBranchDone":`Rama de origen cambiada a {branch}`,"git.changeSourceBranchAligned":`Rama de origen cambiada a {branch} (la rama no tenía commits propios)`,"git.changeSourceBranchTooMany":`La rama tiene demasiados commits propios ({n}) — rebásala manualmente`,"git.changeSourceBranchDirty":`Haz commit o stash de tus cambios antes de cambiar la rama de origen`,"git.changeSourceBranchAgentRunning":`Detén el agente antes de cambiar la rama de origen`,"git.changeSourceBranchErrorTitle":`Error al cambiar la rama de origen`,"git.changeSourceBranchErrorOngoing":`Una operación {op} sigue en curso en el worktree. Cancélala para volver a un estado limpio.`,"git.changeSourceBranchErrorAbort":`Cancelar la operación`,"git.changeSourceBranchLoading":`Cambiando la rama de origen…`,"git.changeSourceForcePushTitle":`¿Forzar el push de la rama reescrita?`,"git.changeSourceForcePushMessage":`El historial de la rama se reescribió. ¿Hacer force-push al remoto con --force-with-lease?`,"git.changeSourceForcePushDone":`Rama enviada con force-push`,"git.openEditor":`Abrir en editor`,"git.openEditorFailed":`No se pudo abrir el editor`,"git.branchPushed":`Rama enviada`,"git.pushFirst":`La rama no está en el remoto. Haz Push primero.`,"git.unpushedCommits":`Los commits locales no están enviados. Haz Push primero.`,"git.from":`desde`,"git.aheadBehindTooltip":`{ahead} commits por delante, {behind} por detrás de {source}`,"git.divergence.title":`Divergencia de rama`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} por delante`,"git.divergence.behind":`↓ {count} por detrás`,"git.divergence.empty.ahead":`Sin commits por delante.`,"git.divergence.empty.behind":`Sin commits por detrás.`,"git.divergence.close":`Cerrar`,"git.divergence.loading":`Cargando commits…`,"git.divergence.failed":`No se pudo cargar la divergencia`,"git.divergence.retry":`Reintentar`,"git.prCreated":`{request} #{n} creada`,"git.pr.author":`Autor`,"git.pr.reviewers":`Revisores`,"git.pr.assignees":`Asignados`,"git.pr.labels":`Etiquetas`,"git.pr.changesRequestedBadge":`Cambios solicitados`,"git.pr.approvedBadge":`Aprobada`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI fallida`,"git.pr.ci.pending":`CI en curso`,"git.pr.ci.failedCount":`{n} fallido(s)`,"git.pr.ci.pendingCount":`{n} en curso`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} omitido(s)`,"git.pr.ci.showPassed":`Mostrar {n} jobs OK`,"git.pr.ci.hidePassed":`Ocultar los jobs OK`,"toast.prChangesRequested":`Se solicitaron cambios en la PR #{n}`,"toast.prApproved":`La PR #{n} ha sido aprobada`,"toast.prReadyToMerge":`La PR #{n} está lista para merge`,"toast.prCiFailed":`La CI de la PR #{n} ha fallado`,"toast.prCiRecovered":`La CI de la PR #{n} se ha recuperado`,"toast.prMergeConflict":`La PR #{n} tiene conflictos de merge`,"toast.prMerged":`La PR #{n} se ha fusionado`,"devServer.title":`Servidor de desarrollo`,"devServer.noWorkspace":`Ningún workspace seleccionado`,"devServer.notConfigured":`No configurado —`,"devServer.goToSettings":`Ajustes`,"devServer.logs":`Logs`,"devServer.running":`En ejecución`,"devServer.starting":`Iniciando`,"devServer.stopping":`Deteniendo`,"devServer.error":`Error`,"devServer.stopped":`Detenido`,"devServer.unknown":`Desconocido`,"devServer.containers":`{count} contenedor | {count} contenedores`,"devServer.logDialog.title":`Logs del servidor de desarrollo`,"devServer.logDialog.empty":`No hay logs disponibles`,"notion.title":`Notion`,"tasks.title":`Tareas`,"notion.addTask":`Añadir tarea`,"notion.noUrl":`Sin URL de Notion`,"notion.subtasks":`{done}/{total} subtareas`,"notion.noTasks":`Sin tareas`,"notion.newTask":`Nueva tarea... (Enter para añadir, Esc para cancelar)`,"acceptance.title":`Criterios de aceptación`,"acceptance.addCriterion":`Añadir criterio`,"acceptance.newCriterion":`Nuevo criterio... (Enter para añadir, Esc para cancelar)`,"acceptance.empty":`Sin criterios de aceptación`,"tasks.askProgress":`Pedir al agente que revise el progreso`,"agentTodos.title":`Tareas del agente`,"agentTodos.empty":`Sin tareas del agente`,"subagents.title":`Sub-agentes`,"subagents.empty":`Aún no hay actividad de sub-agentes`,"subagents.tools":`{count} herramientas`,"subagents.running":`En ejecución: `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket de uso {n}`,"quotaFooter.lastUpdated":`Última actualización: {time}`,"quotaFooter.empty":`Cargando…`,"quotaFooter.popover.title":`Uso de Claude Code`,"quotaFooter.popover.refreshNow":`Actualizar`,"quotaFooter.popover.resetsIn":`Se reinicia a las {value}`,"quotaFooter.popover.unauthenticated":`Auth requerida`,"quotaFooter.popover.unauthenticatedHint":`Ejecuta "claude" una vez para autenticarte.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5 horas`,"quotaFooter.bucket.sevenDay":`7 días`,"agent.error.spawn_failed":`No se pudo iniciar el agente`,"agent.error.parse_error":`No se pudo analizar un mensaje del agente`,"agent.error.rate_limit":`Límite de tasa alcanzado`,"agent.error.resume_failed":`Sesión no encontrada — iniciando sesión nueva`,"agent.error.other":`Error del agente`,"quotaBackoff.banner.title":`Reanudación automática a las {time}`,"quotaBackoff.banner.tooltip":`Cuota de Claude agotada. El auto-loop se reanudará automáticamente cuando la cuota se restablezca a las {resets_at}.`,"quotaBackoff.banner.cancel":`Cancelar reanudación`,"quotaBackoff.cancelled":`Reanudación automática cancelada — puedes reanudar manualmente cuando quieras`,"rateLimitType.fiveHour":`Sesión 5h`,"rateLimitType.sevenDay":`Semanal`,"tooltip.addTask":`Añadir tarea`,"tooltip.removeTask":`Eliminar tarea`,"tooltip.addCriterion":`Añadir criterio`,"tooltip.removeCriterion":`Eliminar criterio`,"tooltip.startDevServer":`Iniciar servidor de desarrollo`,"tooltip.stopDevServer":`Detener servidor de desarrollo`,"tooltip.closeDiffViewer":`Cerrar visor de diff`,"tooltip.refreshLogs":`Actualizar logs`,"tooltip.closeDialog":`Cerrar`,"tooltip.refreshGitStats":`Actualizar estadísticas Git`,"tooltip.removeImage":`Eliminar imagen`,"tooltip.sendMessage":`Enviar mensaje`,"tools.title":`Herramientas`,"tools.runSetupScript":`Volver a ejecutar script de setup`,"tools.runSetupScriptTooltip":`Ejecutar el script de setup del proyecto en el worktree`,"tools.runSetupScriptConfirm":`¿Volver a ejecutar el script de setup en este workspace? Los artefactos existentes pueden ser sobrescritos.`,"tools.runSetupScriptBusy":`No se puede volver a ejecutar el setup mientras el agente está trabajando.`,"tools.noSetupScript":`Ningún script de setup configurado —`,"tools.setupScriptSuccess":`Script de setup completado con éxito.`,"tools.setupScriptFailed":`Falló el script de setup.`,"tools.openNotion":`Abrir en Notion`,"tools.openSentry":`Abrir en Sentry`,"tools.review":`Revisar cambios`,"tools.reviewTooltip":`Pedir al agente que revise los cambios de esta rama`,"tools.reviewBusy":`Agente ocupado — espera a que esté libre`,"tools.fixCi":`Reparar CI`,"tools.fixCiTooltip":`Pedir al agente que diagnostique y arregle los jobs de CI que fallan`,"tools.fixCiLaunched":`Acción «Reparar CI» enviada al agente`,"tools.fixCiFailed":`No se pudo lanzar la acción «Reparar CI»`,"tools.openFileManager":`Abrir en el explorador de archivos`,"tools.openFileManagerTooltip":`Abrir la carpeta del worktree en tu explorador de archivos configurado`,"tools.openFileManagerFailed":`No se pudo abrir el explorador de archivos`,"tools.openTerminal":`Abrir en terminal`,"tools.openTerminalTooltip":`Abrir el worktree en tu terminal configurada`,"tools.openTerminalFailed":`No se pudo abrir la terminal`,"review.title":`Iniciar revisión`,"review.subtitle":`Pide al agente que revise tus cambios y dé feedback.`,"review.additionalInstructions":`Instrucciones adicionales (opcional)`,"review.additionalInstructionsPlaceholder":`Añade instrucciones específicas para la revisión…`,"review.newSession":`Nueva sesión`,"review.newSessionHint":`Inicia una sesión nueva en vez de continuar la actual.`,"review.start":`Iniciar revisión`,"review.cancel":`Cancelar`,"review.launched":`Revisión iniciada`,"review.failed":`No se pudo iniciar la revisión`,"diff.title":`Diff`,"diff.side":`Lado a lado`,"diff.inline":`En línea`,"diff.hideUnchanged":`Ocultar código sin cambios`,"diff.showUnchanged":`Mostrar código sin cambios`,"diff.showUntracked":`Mostrar archivos no rastreados`,"diff.hideUntracked":`Ocultar archivos no rastreados`,"diff.rollbackToRemote":`Restaurar a la versión remota`,"diff.rollbackConfirm":`¿Restaurar {path} a su versión remota (origin)? Los cambios locales en este archivo se perderán.`,"diff.rollbackConfirmOk":`Restaurar`,"diff.rollbackDone":`Archivo restaurado a la versión remota`,"diff.rollbackDoneRemote":`Archivo restaurado a la versión remota`,"diff.rollbackDoneHead":`Cambios locales descartados (archivo restaurado al último commit)`,"diff.rollbackDoneDeleted":`Archivo no rastreado eliminado`,"diff.deleteUntracked":`Eliminar archivo no rastreado`,"diff.deleteUntrackedConfirm":`¿Eliminar definitivamente {path}? Este archivo no está rastreado por git — su contenido se perderá.`,"diff.deleteUntrackedConfirmOk":`Eliminar`,"diff.rollbackFailed":`Falló el rollback`,"diff.rollbackFailedDetail":`Rollback fallido: {error}`,"diff.modeInspect":`Editar`,"diff.modeReview":`Review`,"diff.addComment":`Añadir comentario`,"diff.replyComment":`Responder`,"diff.editComment":`Editar`,"diff.deleteComment":`Eliminar`,"diff.deleteCommentConfirm":`¿Eliminar este comentario?`,"diff.commentPlaceholder":`Escribe un comentario de revisión… (Markdown soportado)`,"diff.reviewDraft":`Borrador de revisión`,"diff.reviewEmpty":`Aún no hay comentarios — pasa el cursor sobre una línea del diff y haz clic en + para añadir uno.`,"diff.reviewGlobalPlaceholder":`Mensaje general de revisión (opcional)`,"diff.submitReview":`Enviar revisión ({n})`,"diff.reviewSubmitted":`Revisión enviada al agente`,"diff.reviewSubmitFailed":`No se pudo enviar la revisión: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Sin pushear`,"diff.noChanges":`Sin cambios`,"diff.searchFiles":`Buscar archivos…`,"diff.noFileMatch":`Ningún archivo coincide`,"diff.selectFile":`Selecciona un archivo para ver el diff`,"diff.fileLoadFailed":`No se pudo cargar este diff`,"diff.fileLoadFailedHint":`El archivo en disco está intacto — solo falló la carga del diff.`,"diff.fileListLoadFailed":`No se pudo cargar la lista de archivos`,"diff.fileListLoadFailedHint":`Es un fallo de la petición, no una rama sin cambios.`,"diff.addToChat":`Añadir al chat`,"diff.compareTitle":`Comparar commits`,"diff.compareFrom":`Desde`,"diff.compareTo":`Hasta`,"diff.compareSubmit":`Comparar`,"diff.compareSourceBase":`{branch} (base de la rama)`,"diff.commitsReadOnly":`solo lectura`,"diffViewer.save":`Guardar`,"diffViewer.savedAt":`Guardado`,"diffViewer.saveFailed":`Error al guardar`,"diffViewer.saveFailedDetail":`Error al guardar: {error}`,"diffViewer.unsavedChanges.title":`Cambios sin guardar`,"diffViewer.unsavedChanges.message":`Tienes cambios sin guardar. ¿Qué quieres hacer?`,"diffViewer.unsavedChanges.save":`Guardar`,"diffViewer.unsavedChanges.cancel":`Cancelar`,"diffViewer.conflict.title":`Archivo modificado en disco`,"diffViewer.conflict.message":`El archivo fue modificado fuera de Kōbō desde que lo abriste.`,"diffViewer.conflict.reload":`Recargar (descartar cambios locales)`,"diffViewer.conflict.keep":`Mantener los míos`,"diffViewer.conflict.overwrite":`Sobrescribir de todos modos`,"diffViewer.conflict.overwriteHint":`Reemplaza el archivo del disco por tu versión. El otro cambio se pierde.`,"diffViewer.conflict.keepHint":`Mantiene tus cambios en el editor y adopta la nueva firma del disco, para que el próximo guardado funcione.`,"diffViewer.saveBlocked":`El agente está en marcha — detenlo para guardar tus cambios.`,"diffViewer.unsavedBanner":`Cambios sin guardar. Detén el agente para guardarlos.`,"diffViewer.closeConfirm.title":`Cambios sin guardar`,"diffViewer.closeConfirm.message":`Este archivo tiene cambios que nunca se guardaron. Cerrar el visor de diferencias los descarta.`,"diffViewer.closeConfirm.discard":`Cerrar sin guardar`,"diffViewer.criteriaRail":`Checklist de revisión`,"diffViewer.criteriaRailShow":`Mostrar la checklist de revisión`,"diffViewer.criteriaRailHide":`Ocultar la checklist de revisión`,"diffViewer.fileTreeShow":`Mostrar el árbol de archivos`,"diffViewer.fileTreeHide":`Ocultar el árbol de archivos`,"diffViewer.closeConfirm.saveAndClose":`Guardar y cerrar`,"diffViewer.agentRunning":`El agente está activo — detenlo para editar`,"diffViewer.fileDeleted":`Archivo eliminado`,"notification.agentFinished":`{name} — Agente terminado`,"notification.agentQuestion":`{name} — El agente hace una pregunta`,"notification.agentPermissionRequest":`{name} — El agente solicita un permiso`,"notification.autoLoopCompleted":`{name} — Auto-loop completado`,"notification.autoLoopStalled":`{name} — Auto-loop bloqueado (sin progreso)`,"notification.autoLoopError":`{name} — Auto-loop detenido por error`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pausa, esperando tu aclaración`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop forzó el modo plan a bypass`,"notification.agentError":`{name} — Error del agente`,"contextMenu.rename":`Renombrar`,"contextMenu.editDescription":`Editar la descripción`,"contextMenu.copyPath":`Copiar ruta del worktree`,"contextMenu.openEditor":`Abrir en editor`,"contextMenu.openFileManager":`Abrir en el explorador de archivos`,"contextMenu.unarchiveDisabledPurged":"El worktree se ha borrado del disco. Recréalo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō detecta la restauración en menos de 30 s y reactiva el workspace automáticamente.","workspaceList.unarchiveBlockedPurged":"No se puede desarchivar: el worktree ya no existe en el disco. Recréalo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō lo detecta en menos de 30 s y reactiva el workspace.","contextMenu.purgeWorktree":`Liberar espacio en disco (borrar worktree)`,"contextMenu.purgeWorktreeTooltip":`Borra el worktree del disco para recuperar espacio — el historial de mensajes y sesiones se conserva. Archiva automáticamente el workspace.`,"contextMenu.purgeWorktreeDialogTitle":`¿Liberar espacio en disco?`,"contextMenu.purgeWorktreeDialogMessage":`La carpeta del worktree de «{name}» será eliminada del disco. El historial de mensajes y sesiones se conserva. El workspace se archivará automáticamente. Esta acción no se puede deshacer en la versión actual.`,"contextMenu.purgeWorktreeDialogConfirm":`Borrar el worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree borrado — espacio en disco recuperado.`,"settings.autoPurgeOnPrMerged":`Borrar worktree al mergear la PR`,"settings.autoPurgeOnPrMergedHint":`Cuando está activado, el worktree se borra del disco en cuanto se mergea la PR (además del archivado automático). El historial de mensajes se conserva.`,"settings.autoLoopMaxRetries":`Máximo de reintentos automáticos`,"settings.autoLoopMaxRetriesHint":`Detiene el bucle automático tras este número de errores de cuota o de servidor temporales.`,"settings.retentionTitle":`Retención del historial de conversación (desactivada por defecto)`,"settings.retentionWarning":`Activar esta opción elimina definitivamente de la base de datos el historial de conversación de los agentes, empezando por todo lo que ya sea más antiguo que la ventana. Los eventos eliminados no se pueden recuperar.`,"settings.retentionHint":`Se ejecuta una vez al arrancar el servidor. Los workspaces, tareas, sesiones, branches y worktrees nunca se tocan — solo la salida registrada de los agentes.`,"settings.retentionDaysLabel":`Eliminar eventos más antiguos de (días)`,"settings.retentionDaysHint":`0 — el valor por defecto — conserva todos los eventos indefinidamente. Indica un valor para activar la retención.`,"settings.retentionKeepLabel":`Eventos siempre conservados por workspace`,"settings.retentionKeepHint":`Los eventos más recientes de cada workspace sobreviven sea cual sea su antigüedad, para que un workspace antiguo pero aún abierto conserve un historial legible. Sugerido: 5000.`,"settings.retentionDisabledHint":`Retención desactivada: nunca se eliminará nada.`,"settings.retentionConfirmTitle":`¿Eliminar definitivamente el historial de conversación?`,"settings.retentionConfirmMessage":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, {count} de los {total} eventos de agente registrados — incluido todo lo que ya sea más antiguo. Es irreversible. ¿Continuar?`,"settings.retentionConfirmMessageUnknown":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, todos los eventos de agente más antiguos — incluido todo lo ya acumulado. No se ha podido calcular el volumen exacto. Es irreversible. ¿Continuar?`,"settings.purgeDocsTitle":`Cómo funciona el borrado — restauración y permisos`,"settings.purgeDocsRestoreTitle":`Restaurar un worktree borrado (detección automática)`,"settings.purgeDocsRestoreIntro":`Un workspace borrado conserva su historial de chat y los metadatos de la PR, pero la carpeta worktree ya no existe. Recréala manualmente con uno de estos comandos — Kōbō detecta la reaparición de la carpeta en menos de 30 segundos y reactiva automáticamente el workspace (desarchivar + limpiar flag de borrado):`,"settings.purgeDocsRestoreCommands":`# GitHub (con CLI gh):
|
|
44
|
+
# tu script — usa $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Restablecer al predeterminado de Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`¿Restablecer el script?`,"settings.changeSourceBranchScript.replaceConfirm":`Tus modificaciones se reemplazarán por el script predeterminado de Kōbō. ¿Continuar?`,"settings.cleanupScriptHint":`Script de shell ejecutado en el worktree después de cada sesión del agente. En modo auto-loop solo se ejecuta cuando todas las tareas están terminadas. Dejar vacío para desactivar.`,"settings.cleanupScriptPlaceholder":`p. ej. eliminar archivos temporales, detener contenedores…`,"settings.cleanupScriptMode":`Cuándo ejecutar`,"settings.cleanupScriptMode.idle":`Después de cada sesión — aunque queden tareas`,"settings.cleanupScriptMode.noTasks":`Solo cuando no queda ninguna tarea de Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Ejecutar solo si se modificaron, añadieron o eliminaron archivos`,"settings.cleanupScriptMode.inherit":`Heredar la configuración global`,"settings.taskPromptTemplate":`Prompt de tarea`,"settings.taskPromptTemplatePlaceholder":`Prompt insertado automáticamente en la descripción de la tarea…`,"settings.taskPromptTemplateHint":`Se inyecta automáticamente en la descripción de la tarea en la página de creación cuando este proyecto está seleccionado. Si no se modifica, se reemplaza al cambiar de proyecto; en cuanto lo editas, se conserva tu texto.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Se ejecuta con bash en el worktree después de su creación, antes de que el agente inicie. No necesita shebang. Si falla, el workspace se establece en error. Timeout: 5 minutos.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Ninguno`,"settings.e2e.frameworkOther":`Otro`,"settings.e2e.skill":`Skill (opcional)`,"settings.e2e.skillPlaceholder":`p. ej. cypress-tester`,"settings.e2e.prompt":`Guía personalizada (opcional)`,"settings.e2e.promptPlaceholder":`p. ej. usar el patrón page-object, apuntar a data-testid`,"settings.e2e.helpText":`Cuando está configurado, el agente de grooming auto-loop inserta subtareas E2E para funciones UI.`,"settings.finalization.title":`Finalización del auto-loop`,"settings.finalization.helpText":`Opcional: un prompt que el agente ejecuta como la última iteración del auto-loop. Típicamente usado para controles de calidad finales (lint, typecheck, tests). La fase de grooming creará una tarea con prefijo [FINAL] que usará este prompt.`,"settings.finalization.prompt":`Prompt de finalización`,"settings.finalization.promptPlaceholder":`p. ej. Ejecuta npm run lint y npm test, luego marca esta tarea como hecha.`,"settings.editorCommand":`Comando del editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando para abrir el worktree en su editor. La ruta del worktree se pasa como argumento.`,"settings.fileManagerCommand":`Comando del explorador de archivos`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Comando para abrir el worktree en su explorador de archivos. La ruta del worktree se pasa como argumento. Déjalo vacío para ocultar el botón.`,"settings.terminalCommand":`Comando de terminal`,"settings.terminalCommandHint":`Comando para abrir tu terminal en el worktree. Marcador {path} opcional para el directorio.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Selección MCP de Claude`,"settings.mcpAutoSelect":`Auto (primer MCP activo que coincide)`,"settings.notionMcp":`Clave MCP de Notion`,"settings.sentryMcp":`Clave MCP de Sentry`,"settings.mcpSelectionHint":`Las entradas activas se leen desde ~/.claude.json. Deja Auto para usar el comportamiento por defecto.`,"settings.configuredProjects":`Proyectos configurados`,"settings.noProjects":`No hay proyectos configurados`,"settings.addProject":`Añadir proyecto`,"settings.copyFrom":`Copiar ajustes desde`,"settings.copyFromPlaceholder":`(ninguno — partir de los valores por defecto)`,"settings.copyFromHint":`Copia todos los ajustes excepto path, nombre y rama fuente.`,"settings.copyFromConfirmTitle":`¿Sobrescribir los valores actuales?`,"settings.copyFromConfirm":`Se sobrescribirán los valores del formulario con los ajustes de «{project}». ¿Continuar?`,"settings.newProject":`Nuevo proyecto`,"settings.editProject":`Editar proyecto`,"settings.onboardingTitle":`Visita guiada`,"settings.onboardingHint":`Vuelve a ver la presentación de los elementos principales de la interfaz.`,"settings.onboardingReplay":`Volver a ver la visita guiada`,"onboarding.list.title":`Espacios de trabajo`,"onboarding.list.description":`Cada misión vive en su propio espacio — un git worktree, una rama y una sesión de agente dedicados. Todos aparecen aquí.`,"onboarding.create.title":`Crear un espacio de trabajo`,"onboarding.create.description":`Haz clic en + para iniciar una nueva misión — desde un ticket de Notion, una incidencia de Sentry o desde cero.`,"onboarding.search.title":`Búsqueda`,"onboarding.search.description":`Filtra tus espacios de trabajo por nombre, o busca en el historial de conversaciones de los agentes.`,"onboarding.health.title":`Estado`,"onboarding.health.description":`Comprueba el estado de Kōbō: base de datos, agentes activos, integraciones, copias de seguridad.`,"onboarding.changelog.title":`Novedades`,"onboarding.changelog.description":`Consulta las últimas versiones de Kōbō: nuevas funciones, correcciones, cambios de comportamiento. Aparece un indicador cuando hay una versión sin leer.`,"onboarding.settings.title":`Ajustes`,"onboarding.settings.description":`Modelos, scripts de ciclo de vida, integraciones, voz — toda la configuración de Kōbō está aquí. Haz clic en Siguiente para recorrer cada sección.`,"onboarding.settings-general.title":`General`,"onboarding.settings-general.description":`Idioma de la interfaz, proyecto por defecto y comportamiento global aplicado a cada nuevo workspace.`,"onboarding.settings-agents.title":`Agentes y modelos`,"onboarding.settings-agents.description":`Elige el motor por defecto — Claude Code o Codex —, el modelo y el modo de permisos de los agentes.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Elige la suite de skills que cargan los agentes: el preajuste recomendado o tu selección personalizada.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`Plantilla de descripción de PR y otros textos de prompt reutilizables por los agentes.`,"onboarding.settings-scripts.title":`Scripts`,"onboarding.settings-scripts.description":`Scripts de ciclo de vida ejecutados en cleanup, archivado y setup del workspace — globales o por proyecto.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Conecta tu token de integración de Notion para importar tickets como misiones de workspace.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Importar una issue de Sentry como fuente de verdad de un workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Elige GitHub, GitLab o ninguna, por proyecto. Kōbō usa tu propia CLI gh / glab — no incluye credenciales.`,"onboarding.settings-voice.title":`Voz`,"onboarding.settings-voice.description":`Dictado por voz: actívalo, elige el modelo Whisper y gestiona el runtime de reconocimiento de voz local.`,"onboarding.settings-notifications.title":`Notificaciones`,"onboarding.settings-notifications.description":`Notificaciones de sonido y de navegador para eventos y cambios de estado de los agentes.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Prefijos de rama Git y la carpeta donde se crean los worktrees de los workspaces.`,"onboarding.settings-worktrees-purge.title":`Liberar espacio en disco automáticamente`,"onboarding.settings-worktrees-purge.description":"Activa este toggle para que Kōbō elimine la carpeta worktree (a menudo cientos de MB de node_modules / vendor) en cuanto una PR se mergea. El historial de chat y los metadatos de la PR se conservan. Puedes recrear el worktree más tarde con `gh pr checkout <pr>` — Kōbō detecta automáticamente la restauración en menos de 30 segundos y reactiva el workspace.","onboarding.settings-projects.title":`Proyectos`,"onboarding.settings-projects.description":`Registra los repositorios en los que trabajas. Haz clic en «Añadir un proyecto» para apuntar Kōbō a un repositorio local — cada workspace se dirige a uno de estos proyectos.`,"onboarding.settings-templates.title":`Plantillas`,"onboarding.settings-templates.description":`Tu biblioteca de plantillas de prompt reutilizables — elige una para rellenar el brief al crear un workspace.`,"onboarding.settings-export.title":`Importar / Exportar`,"onboarding.settings-export.description":`Respalda o comparte tu configuración de Kōbō, y exporta los datos de los workspaces a un archivo.`,"onboarding.firstWorkspace.title":`Crea tu primer workspace`,"onboarding.firstWorkspace.description":`De eso se trata: una misión, un worktree, un agente. Abre la página de creación para empezar.`,"onboarding.next":`Siguiente`,"onboarding.prev":`Atrás`,"onboarding.done":`Hecho`,"onboarding.exitConfirm":`¿Salir del recorrido guiado? Puedes repetirlo en cualquier momento desde Ajustes.`,"settings.projectGroup.identity":`Identidad`,"settings.projectGroup.defaults":`Valores predeterminados`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Ruta del proyecto`,"settings.projectPathPlaceholder":`/ruta/al/proyecto`,"settings.displayName":`Nombre para mostrar`,"settings.displayNamePlaceholder":`Mi proyecto`,"settings.defaultSourceBranch":`Rama fuente por defecto`,"settings.defaultModel.project":`Modelo por defecto`,"settings.skipPermissions.project":`Omitir solicitudes de permisos`,"settings.prPromptTemplate.project":`Plantilla de prompt PR`,"settings.prPromptPlaceholder.project":`Instrucciones específicas del proyecto para la creación de PRs...`,"settings.reviewPromptTemplate.project":`Plantilla de prompt de revisión`,"settings.ciFixPromptTemplate.project":`Plantilla de prompt «Reparar CI»`,"settings.gitConventions.project":`Convenciones Git (por proyecto)`,"settings.gitConventionsEmpty":`Dejar vacío para usar las convenciones globales.`,"settings.notionStatus":`Estado ticket Notion`,"settings.notionStatusProperty":`Nombre de la propiedad`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valor a establecer`,"settings.notionInProgressStatusPlaceholder":`En progreso, In progress...`,"settings.notionStatusHint":`Cuando se crea un workspace con un ticket Notion, la propiedad especificada se establece a este valor. Ambos campos son obligatorios. Dejar vacío para desactivar.`,"settings.notionAssignee":`Asignación Notion`,"settings.notionAssigneeHint":`Cuando se crea un workspace con un ticket Notion, el usuario autenticado en el MCP de Notion se añade a esta propiedad People — solo si aún no tiene un asignado. Dejar vacío para desactivar.`,"settings.notionAssigneeProperty":`Nombre de la propiedad`,"settings.notionAssigneePropertyPlaceholder":`Desarrolladores, Assignees...`,"settings.notionUserId":`Tu UUID de Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Selecciona tu cuenta en la lista. Notion rechaza la asignación de bots en propiedades People — este campo es obligatorio para activar la auto-asignación.`,"settings.notionUsersRefresh":`Refrescar`,"settings.notionUsersLoading":`Cargando usuarios de Notion…`,"settings.notionUsersLoadFailed":`Error al cargar la lista: {error}`,"settings.notionUsersManualFallback":`Lista no disponible — pega tu UUID de Notion manualmente.`,"settings.devServer":`Servidor de desarrollo`,"settings.devServerStart":`Script de inicio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script de parada`,"settings.devServerStopPlaceholder":`Opcional — el proceso se cerrará automáticamente si está vacío`,"settings.selectProject":`Selecciona un proyecto o añade uno nuevo`,"settings.projectPathRequired":`La ruta del proyecto es obligatoria.`,"settings.useGlobal":`Usar global`,"settings.saved":`Ajustes globales guardados.`,"settings.unsavedChanges":`Cambios sin guardar`,"settings.nav.general":`General`,"settings.nav.agents":`Agentes`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Las credenciales se guardan localmente y solo las usa bkt.`,"settings.bitbucketUsername":`Correo de Atlassian`,"settings.bitbucketToken":`Token API de Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voz`,"settings.nav.notifications":`Notificaciones`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Exportar`,"settings.openNav":`Abrir la navegación`,"settings.saveError":`Error al guardar los ajustes.`,"settings.projectSaved":`Proyecto guardado.`,"settings.projectSaveError":`Error al guardar el proyecto.`,"settings.projectDeleted":`Proyecto eliminado.`,"settings.deleteProjectConfirmTitle":`¿Eliminar proyecto?`,"settings.deleteProjectConfirmMessage":`¿Quitar «{name}» de tus proyectos? Esto solo elimina sus ajustes de Kōbō — tu código y tus worktrees no se modifican.`,"settings.projectDeleteError":`Error al eliminar el proyecto.`,"templates.title":`Plantillas`,"templates.newTemplate":`Nueva plantilla`,"templates.editTemplate":`Editar plantilla`,"templates.deleteTemplate":`Eliminar plantilla`,"templates.deleteConfirm":`¿Eliminar la plantilla '/{slug}'?`,"templates.deleteConfirmMessage":`Esta acción no se puede deshacer.`,"templates.slug":`Slug`,"templates.slugHint":`Minúsculas, dígitos, guiones. Máx. 64 caracteres.`,"templates.slugInvalid":`El slug solo puede contener minúsculas, dígitos y guiones`,"templates.slugDuplicate":`Ya existe una plantilla con este slug`,"templates.description":`Descripción`,"templates.descriptionHint":`Etiqueta corta mostrada en el dropdown.`,"templates.descriptionRequired":`La descripción es obligatoria`,"templates.contentRequired":`El contenido es obligatorio`,"templates.content":`Contenido`,"templates.contentHint":`Contenido de la plantilla. Usa {variable_name} para las sustituciones.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Archivo: {path}`,"templates.empty":`Aún no hay plantillas.`,"templates.createFailed":`Error al crear la plantilla`,"templates.updateFailed":`Error al actualizar la plantilla`,"templates.deleteFailed":`Error al eliminar la plantilla`,"templates.save":`Guardar`,"templates.create":`Crear`,"templates.reloadDefaults":`Recargar plantillas predeterminadas`,"templates.reloadDefaultsHint":`Solo añade las plantillas predeterminadas que faltan. Las plantillas existentes (modificadas o no) nunca se sobrescriben.`,"templates.reloadDefaultsConfirmMessage":`Esta acción añadirá a la lista las plantillas predeterminadas que falten. Las plantillas existentes — incluidas las que hayas personalizado — no se tocarán. Si quieres restaurar una plantilla predeterminada que has modificado, elimínala primero y vuelve a ejecutar esta acción.`,"templates.reloadDefaultsSuccess":`{added} añadida(s), {kept} conservada(s)`,"templates.reloadDefaultsFailed":`Error al recargar las plantillas predeterminadas`,"templates.resetToDefault":`Restablecer al valor predeterminado`,"templates.resetConfirmTitle":`¿Restablecer la plantilla al valor predeterminado?`,"templates.resetConfirmMessage":`Esto sobrescribe tus cambios locales en /{slug} con el predeterminado. No se puede deshacer.`,"templates.resetSuccess":`Plantilla /{slug} restablecida al predeterminado`,"templates.resetFailed":`Error al restablecer la plantilla`,"chatInput.dropdownSkills":`Skills de Claude`,"chatInput.dropdownKobo":`Comandos Kōbō`,"chatInput.dropdownTemplates":`Plantillas`,"documents.title":`Documentos`,"documents.empty":`No se encontraron documentos`,"documents.refresh":`Actualizar`,"documents.back":`Volver`,"documents.loadFailed":`Error al cargar el documento`,"git.title":`Git`,"git.outputDialogTitle":`Git informó de un error`,"git.statsFailed":`No se pudo leer el estado de git`,"git.section.repository":`Repositorio`,"git.section.changes":`Cambios`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Acciones`,"git.actions.more":`Más`,"git.localOnly":`solo local`,"git.pushed":`pushed`,"git.unpushed":`{count} sin push`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Cargando commits…`,"git.commits.empty":`Sin commits en esta rama`,"git.commits.pushed":`Pusheado`,"git.commits.unpushed":`Sin pushear`,"git.commits.clickToAppend":`click para agregar SHA al chat`,"git.commits.diffThisCommit":`Diff de este commit (vs padre)`,"git.compareCommits":`Comparar commits…`,"git.files":`{count} archivo | {count} archivos`,"git.staged":`{count} staged`,"git.modified":`{count} modificados`,"git.untracked":`{count} sin seguimiento`,"git.workingTreeEmpty":`Sin cambios sin confirmar`,"git.fileStaged":`Preparado`,"git.fileModified":`Modificado`,"git.fileUntracked":`Sin seguimiento`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Más seguro que --force: el push se rechaza si el remoto tiene commits que no has visto. Úsalo tras un rebase o amend de commits ya pusheados.`,"git.branchForcePushed":`Rama force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No hay upstream para esta rama — hazle push primero para habilitar Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la rama primero`,"git.viewRequest":`Ver {request}`,"git.createRequest":`Crear {request}`,"git.changeRequestBase":`Cambiar la rama base de la {request}`,"git.forgeCliMissing":`{cli} no está instalado — instálalo para usar las funciones de {request}`,"git.forgeNotAuthenticated":`No autenticado — ejecuta {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Detección automática`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Ninguna`,"git.pullConfirmTitle":`¿Pull la rama?`,"git.pullConfirmMessage":`Pull {branch} desde el remoto (solo fast-forward).`,"git.branchPulled":`Rama actualizada`,"git.pullFailed":`Error al hacer pull`,"git.renameBranch":`Renombrar rama`,"git.renameBranchPrompt":"Renombrar `{branch}` a:","git.renameBranchSuccess":"Rama renombrada a `{branch}`","git.renameBranchFailed":`Error al renombrar la rama`,"git.renameBranchExists":"La rama `{branch}` ya existe localmente o en origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Abre el visor de diff en modo Review — comentarios en línea + envío por lotes al agente`,"pr.baseChanged":`Base de la PR cambiada: {oldBase} → {newBase}`,"pr.openPr":`Abrir PR`,"pr.openWorkspace":`Abrir el workspace`,"pr.dismiss":`Cerrar`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`¿Rebase de la rama?`,"git.rebaseConfirmMessage":`Rebase sobre {branch}. Pueden surgir conflictos.`,"git.rebaseSuccess":`Rebase completado`,"git.rebaseFailed":`Rebase fallido`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repositorio actualizado`,"git.fetchFailed":`Fallo al hacer fetch: {error}`,"git.mergeConfirmTitle":`¿Fusionar la rama?`,"git.mergeConfirmMessage":`Fusionar {branch} en esta rama. Puede haber conflictos.`,"git.mergeSuccess":`Merge completado`,"git.mergeFailed":`Merge fallido`,"git.commitFailed":`Commit fallido`,"git.commitChanges":`Confirmar cambios`,"git.commitDialogTitle":`Confirmar cambios sin confirmar`,"git.commitDialogDescription":`Escribe tu mensaje o pide al agente que revise y cree el commit.`,"git.commitMessage":`Mensaje de commit`,"git.commitManual":`Confirmar`,"git.commitWithAgent":`Pedir al agente`,"git.commitAgentSuccess":`Solicitud de commit enviada al agente`,"git.discardFailed":`Descarte fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.operationPausedTitle":`Operación Git para continuar`,"git.operationPausedSubtitle":`No hay archivos en conflicto. Git solo espera que continúes la operación.`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbortConfirmTitle":`¿Descartar la resolución del conflicto?`,"git.conflictAbortConfirmMessage":`Todo lo que has resuelto en este {op} se descarta y el worktree vuelve a su estado anterior. Es irreversible.`,"git.conflictAbort":`Abortar`,"git.conflictContinue":`Continuar`,"git.conflictContinued":`Operación Git continuada`,"git.conflictResolveWithAgent":`Pedir al agente que resuelva`,"git.conflictAborted":`Operación abortada`,"git.conflictHandoffSuccess":`El agente está resolviendo los conflictos`,"git.dirtyTitleRebase":`Cambios sin confirmar bloquean el rebase`,"git.dirtyTitleMerge":`Cambios sin confirmar bloquean el merge`,"git.dirtyTitlePull":`Cambios sin confirmar bloquean el pull`,"git.dirtySubtitle":`{modified} modificado(s), {staged} preparado(s), {untracked} sin seguimiento. Elige cómo continuar.`,"git.dirtyStash":`Stash y reintentar`,"git.dirtyCommit":`Commit primero`,"git.dirtyCommitPlaceholder":`Mensaje del commit`,"git.dirtyCommitConfirm":`Commit y reintentar`,"git.dirtyDiscard":`Descartar cambios`,"git.dirtyDiscardConfirmTitle":`¿Descartar todos los cambios sin confirmar?`,"git.dirtyDiscardConfirmMessage":`Los cambios con seguimiento se perderán (git reset --hard). Los archivos sin seguimiento se conservan. Acción irreversible.`,"git.pushConfirmTitle":`¿Pushar la rama?`,"git.pushConfirmMessage":`Pushar {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Pushar la rama`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBaseTitle":`Cambiar rama base`,"git.changePrBaseMessage":`Ingrese la nueva rama destino para el {request}.`,"git.changePrBaseSuccess":`Rama base de la {request} actualizada`,"git.changePrBaseFailed":`No se pudo cambiar la rama base de la {request}`,"git.mergeRequest":`Fusionar {request}`,"git.mergeRequestConfirmTitle":`¿Fusionar {request}?`,"git.mergeRequestConfirmMessage":`Esto fusionará la {request} abierta en su rama de destino.`,"git.mergeRequestSuccess":`{request} fusionada`,"git.mergeRequestFailed":`No se pudo fusionar {request}`,"git.deleteRemoteBranch":`Eliminar rama remota`,"git.deleteRemoteBranchTitle":`¿Eliminar rama remota?`,"git.deleteRemoteBranchMessage":`La solicitud se fusionó. ¿Eliminar la rama remota {branch}?`,"git.deleteRemoteBranchSuccess":`Rama remota {branch} eliminada`,"git.deleteRemoteBranchFailed":`No se pudo eliminar la rama remota`,"git.changeSourceBranch":`Cambiar la rama de origen`,"git.changeSourceBranchTitle":`Cambiar la rama de origen`,"git.changeSourceBranchMessage":`Elige la nueva rama de origen. La rama de trabajo se reconstruirá encima.`,"git.changeSourceBranchDone":`Rama de origen cambiada a {branch}`,"git.changeSourceBranchAligned":`Rama de origen cambiada a {branch} (la rama no tenía commits propios)`,"git.changeSourceBranchTooMany":`La rama tiene demasiados commits propios ({n}) — rebásala manualmente`,"git.changeSourceBranchDirty":`Haz commit o stash de tus cambios antes de cambiar la rama de origen`,"git.changeSourceBranchAgentRunning":`Detén el agente antes de cambiar la rama de origen`,"git.changeSourceBranchErrorTitle":`Error al cambiar la rama de origen`,"git.changeSourceBranchErrorOngoing":`Una operación {op} sigue en curso en el worktree. Cancélala para volver a un estado limpio.`,"git.changeSourceBranchErrorAbort":`Cancelar la operación`,"git.changeSourceBranchLoading":`Cambiando la rama de origen…`,"git.changeSourceForcePushTitle":`¿Forzar el push de la rama reescrita?`,"git.changeSourceForcePushMessage":`El historial de la rama se reescribió. ¿Hacer force-push al remoto con --force-with-lease?`,"git.changeSourceForcePushDone":`Rama enviada con force-push`,"git.openEditor":`Abrir en editor`,"git.openEditorFailed":`No se pudo abrir el editor`,"git.branchPushed":`Rama enviada`,"git.pushFirst":`La rama no está en el remoto. Haz Push primero.`,"git.unpushedCommits":`Los commits locales no están enviados. Haz Push primero.`,"git.from":`desde`,"git.aheadBehindTooltip":`{ahead} commits por delante, {behind} por detrás de {source}`,"git.divergence.title":`Divergencia de rama`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} por delante`,"git.divergence.behind":`↓ {count} por detrás`,"git.divergence.empty.ahead":`Sin commits por delante.`,"git.divergence.empty.behind":`Sin commits por detrás.`,"git.divergence.close":`Cerrar`,"git.divergence.loading":`Cargando commits…`,"git.divergence.failed":`No se pudo cargar la divergencia`,"git.divergence.retry":`Reintentar`,"git.prCreated":`{request} #{n} creada`,"git.pr.author":`Autor`,"git.pr.reviewers":`Revisores`,"git.pr.assignees":`Asignados`,"git.pr.labels":`Etiquetas`,"git.pr.changesRequestedBadge":`Cambios solicitados`,"git.pr.approvedBadge":`Aprobada`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI fallida`,"git.pr.ci.pending":`CI en curso`,"git.pr.ci.failedCount":`{n} fallido(s)`,"git.pr.ci.pendingCount":`{n} en curso`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} omitido(s)`,"git.pr.ci.showPassed":`Mostrar {n} jobs OK`,"git.pr.ci.hidePassed":`Ocultar los jobs OK`,"toast.prChangesRequested":`Se solicitaron cambios en la PR #{n}`,"toast.prApproved":`La PR #{n} ha sido aprobada`,"toast.prReadyToMerge":`La PR #{n} está lista para merge`,"toast.prCiFailed":`La CI de la PR #{n} ha fallado`,"toast.prCiRecovered":`La CI de la PR #{n} se ha recuperado`,"toast.prMergeConflict":`La PR #{n} tiene conflictos de merge`,"toast.prMerged":`La PR #{n} se ha fusionado`,"devServer.title":`Servidor de desarrollo`,"devServer.noWorkspace":`Ningún workspace seleccionado`,"devServer.notConfigured":`No configurado —`,"devServer.goToSettings":`Ajustes`,"devServer.logs":`Logs`,"devServer.running":`En ejecución`,"devServer.starting":`Iniciando`,"devServer.stopping":`Deteniendo`,"devServer.error":`Error`,"devServer.stopped":`Detenido`,"devServer.unknown":`Desconocido`,"devServer.containers":`{count} contenedor | {count} contenedores`,"devServer.logDialog.title":`Logs del servidor de desarrollo`,"devServer.logDialog.empty":`No hay logs disponibles`,"notion.title":`Notion`,"tasks.title":`Tareas`,"notion.addTask":`Añadir tarea`,"notion.noUrl":`Sin URL de Notion`,"notion.subtasks":`{done}/{total} subtareas`,"notion.noTasks":`Sin tareas`,"notion.newTask":`Nueva tarea... (Enter para añadir, Esc para cancelar)`,"acceptance.title":`Criterios de aceptación`,"acceptance.addCriterion":`Añadir criterio`,"acceptance.newCriterion":`Nuevo criterio... (Enter para añadir, Esc para cancelar)`,"acceptance.empty":`Sin criterios de aceptación`,"tasks.askProgress":`Pedir al agente que revise el progreso`,"agentTodos.title":`Tareas del agente`,"agentTodos.empty":`Sin tareas del agente`,"subagents.title":`Sub-agentes`,"subagents.empty":`Aún no hay actividad de sub-agentes`,"subagents.tools":`{count} herramientas`,"subagents.running":`En ejecución: `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket de uso {n}`,"quotaFooter.lastUpdated":`Última actualización: {time}`,"quotaFooter.empty":`Cargando…`,"quotaFooter.popover.title":`Uso de Claude Code`,"quotaFooter.popover.refreshNow":`Actualizar`,"quotaFooter.popover.resetsIn":`Se reinicia a las {value}`,"quotaFooter.popover.unauthenticated":`Auth requerida`,"quotaFooter.popover.unauthenticatedHint":`Ejecuta "claude" una vez para autenticarte.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5 horas`,"quotaFooter.bucket.sevenDay":`7 días`,"agent.error.spawn_failed":`No se pudo iniciar el agente`,"agent.error.parse_error":`No se pudo analizar un mensaje del agente`,"agent.error.rate_limit":`Límite de tasa alcanzado`,"agent.error.resume_failed":`Sesión no encontrada — iniciando sesión nueva`,"agent.error.other":`Error del agente`,"quotaBackoff.banner.title":`Reanudación automática a las {time}`,"quotaBackoff.banner.transientTitle":`Reanudación automática tras interrupción a las {time}`,"quotaBackoff.resumeNow":`Reanudar ahora`,"quotaBackoff.banner.tooltip":`Cuota de Claude agotada. El auto-loop se reanudará automáticamente cuando la cuota se restablezca a las {resets_at}.`,"quotaBackoff.banner.cancel":`Cancelar reanudación`,"quotaBackoff.cancelled":`Reanudación automática cancelada — puedes reanudar manualmente cuando quieras`,"rateLimitType.fiveHour":`Sesión 5h`,"rateLimitType.sevenDay":`Semanal`,"tooltip.addTask":`Añadir tarea`,"tooltip.removeTask":`Eliminar tarea`,"tooltip.addCriterion":`Añadir criterio`,"tooltip.removeCriterion":`Eliminar criterio`,"tooltip.startDevServer":`Iniciar servidor de desarrollo`,"tooltip.stopDevServer":`Detener servidor de desarrollo`,"tooltip.closeDiffViewer":`Cerrar visor de diff`,"tooltip.refreshLogs":`Actualizar logs`,"tooltip.closeDialog":`Cerrar`,"tooltip.refreshGitStats":`Actualizar estadísticas Git`,"tooltip.removeImage":`Eliminar imagen`,"tooltip.sendMessage":`Enviar mensaje`,"tools.title":`Herramientas`,"tools.runSetupScript":`Volver a ejecutar script de setup`,"tools.runSetupScriptTooltip":`Ejecutar el script de setup del proyecto en el worktree`,"tools.runSetupScriptConfirm":`¿Volver a ejecutar el script de setup en este workspace? Los artefactos existentes pueden ser sobrescritos.`,"tools.runSetupScriptBusy":`No se puede volver a ejecutar el setup mientras el agente está trabajando.`,"tools.noSetupScript":`Ningún script de setup configurado —`,"tools.setupScriptSuccess":`Script de setup completado con éxito.`,"tools.setupScriptFailed":`Falló el script de setup.`,"tools.openNotion":`Abrir en Notion`,"tools.openSentry":`Abrir en Sentry`,"tools.review":`Revisar cambios`,"tools.reviewTooltip":`Pedir al agente que revise los cambios de esta rama`,"tools.reviewBusy":`Agente ocupado — espera a que esté libre`,"tools.fixCi":`Reparar CI`,"tools.fixCiTooltip":`Pedir al agente que diagnostique y arregle los jobs de CI que fallan`,"tools.fixCiLaunched":`Acción «Reparar CI» enviada al agente`,"tools.fixCiFailed":`No se pudo lanzar la acción «Reparar CI»`,"tools.openFileManager":`Abrir en el explorador de archivos`,"tools.openFileManagerTooltip":`Abrir la carpeta del worktree en tu explorador de archivos configurado`,"tools.openFileManagerFailed":`No se pudo abrir el explorador de archivos`,"tools.openTerminal":`Abrir en terminal`,"tools.openTerminalTooltip":`Abrir el worktree en tu terminal configurada`,"tools.openTerminalFailed":`No se pudo abrir la terminal`,"review.title":`Iniciar revisión`,"review.subtitle":`Pide al agente que revise tus cambios y dé feedback.`,"review.additionalInstructions":`Instrucciones adicionales (opcional)`,"review.additionalInstructionsPlaceholder":`Añade instrucciones específicas para la revisión…`,"review.newSession":`Nueva sesión`,"review.newSessionHint":`Inicia una sesión nueva en vez de continuar la actual.`,"review.start":`Iniciar revisión`,"review.cancel":`Cancelar`,"review.launched":`Revisión iniciada`,"review.failed":`No se pudo iniciar la revisión`,"diff.title":`Diff`,"diff.side":`Lado a lado`,"diff.inline":`En línea`,"diff.hideUnchanged":`Ocultar código sin cambios`,"diff.showUnchanged":`Mostrar código sin cambios`,"diff.showUntracked":`Mostrar archivos no rastreados`,"diff.hideUntracked":`Ocultar archivos no rastreados`,"diff.rollbackToRemote":`Restaurar a la versión remota`,"diff.rollbackConfirm":`¿Restaurar {path} a su versión remota (origin)? Los cambios locales en este archivo se perderán.`,"diff.rollbackConfirmOk":`Restaurar`,"diff.rollbackDone":`Archivo restaurado a la versión remota`,"diff.rollbackDoneRemote":`Archivo restaurado a la versión remota`,"diff.rollbackDoneHead":`Cambios locales descartados (archivo restaurado al último commit)`,"diff.rollbackDoneDeleted":`Archivo no rastreado eliminado`,"diff.deleteUntracked":`Eliminar archivo no rastreado`,"diff.deleteUntrackedConfirm":`¿Eliminar definitivamente {path}? Este archivo no está rastreado por git — su contenido se perderá.`,"diff.deleteUntrackedConfirmOk":`Eliminar`,"diff.rollbackFailed":`Falló el rollback`,"diff.rollbackFailedDetail":`Rollback fallido: {error}`,"diff.modeInspect":`Editar`,"diff.modeReview":`Review`,"diff.addComment":`Añadir comentario`,"diff.replyComment":`Responder`,"diff.editComment":`Editar`,"diff.deleteComment":`Eliminar`,"diff.deleteCommentConfirm":`¿Eliminar este comentario?`,"diff.commentPlaceholder":`Escribe un comentario de revisión… (Markdown soportado)`,"diff.reviewDraft":`Borrador de revisión`,"diff.reviewEmpty":`Aún no hay comentarios — pasa el cursor sobre una línea del diff y haz clic en + para añadir uno.`,"diff.reviewGlobalPlaceholder":`Mensaje general de revisión (opcional)`,"diff.submitReview":`Enviar revisión ({n})`,"diff.reviewSubmitted":`Revisión enviada al agente`,"diff.reviewSubmitFailed":`No se pudo enviar la revisión: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Sin pushear`,"diff.noChanges":`Sin cambios`,"diff.searchFiles":`Buscar archivos…`,"diff.noFileMatch":`Ningún archivo coincide`,"diff.selectFile":`Selecciona un archivo para ver el diff`,"diff.fileLoadFailed":`No se pudo cargar este diff`,"diff.fileLoadFailedHint":`El archivo en disco está intacto — solo falló la carga del diff.`,"diff.fileListLoadFailed":`No se pudo cargar la lista de archivos`,"diff.fileListLoadFailedHint":`Es un fallo de la petición, no una rama sin cambios.`,"diff.addToChat":`Añadir al chat`,"diff.compareTitle":`Comparar commits`,"diff.compareFrom":`Desde`,"diff.compareTo":`Hasta`,"diff.compareSubmit":`Comparar`,"diff.compareSourceBase":`{branch} (base de la rama)`,"diff.commitsReadOnly":`solo lectura`,"diffViewer.save":`Guardar`,"diffViewer.savedAt":`Guardado`,"diffViewer.saveFailed":`Error al guardar`,"diffViewer.saveFailedDetail":`Error al guardar: {error}`,"diffViewer.unsavedChanges.title":`Cambios sin guardar`,"diffViewer.unsavedChanges.message":`Tienes cambios sin guardar. ¿Qué quieres hacer?`,"diffViewer.unsavedChanges.save":`Guardar`,"diffViewer.unsavedChanges.cancel":`Cancelar`,"diffViewer.conflict.title":`Archivo modificado en disco`,"diffViewer.conflict.message":`El archivo fue modificado fuera de Kōbō desde que lo abriste.`,"diffViewer.conflict.reload":`Recargar (descartar cambios locales)`,"diffViewer.conflict.keep":`Mantener los míos`,"diffViewer.conflict.overwrite":`Sobrescribir de todos modos`,"diffViewer.conflict.overwriteHint":`Reemplaza el archivo del disco por tu versión. El otro cambio se pierde.`,"diffViewer.conflict.keepHint":`Mantiene tus cambios en el editor y adopta la nueva firma del disco, para que el próximo guardado funcione.`,"diffViewer.saveBlocked":`El agente está en marcha — detenlo para guardar tus cambios.`,"diffViewer.unsavedBanner":`Cambios sin guardar. Detén el agente para guardarlos.`,"diffViewer.closeConfirm.title":`Cambios sin guardar`,"diffViewer.closeConfirm.message":`Este archivo tiene cambios que nunca se guardaron. Cerrar el visor de diferencias los descarta.`,"diffViewer.closeConfirm.discard":`Cerrar sin guardar`,"diffViewer.criteriaRail":`Checklist de revisión`,"diffViewer.criteriaRailShow":`Mostrar la checklist de revisión`,"diffViewer.criteriaRailHide":`Ocultar la checklist de revisión`,"diffViewer.fileTreeShow":`Mostrar el árbol de archivos`,"diffViewer.fileTreeHide":`Ocultar el árbol de archivos`,"diffViewer.closeConfirm.saveAndClose":`Guardar y cerrar`,"diffViewer.agentRunning":`El agente está activo — detenlo para editar`,"diffViewer.fileDeleted":`Archivo eliminado`,"notification.agentFinished":`{name} — Agente terminado`,"notification.agentQuestion":`{name} — El agente hace una pregunta`,"notification.agentPermissionRequest":`{name} — El agente solicita un permiso`,"notification.autoLoopCompleted":`{name} — Auto-loop completado`,"notification.autoLoopStalled":`{name} — Auto-loop bloqueado (sin progreso)`,"notification.autoLoopError":`{name} — Auto-loop detenido por error`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pausa, esperando tu aclaración`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop forzó el modo plan a bypass`,"notification.agentError":`{name} — Error del agente`,"contextMenu.rename":`Renombrar`,"contextMenu.editDescription":`Editar la descripción`,"contextMenu.copyPath":`Copiar ruta del worktree`,"contextMenu.openEditor":`Abrir en editor`,"contextMenu.openFileManager":`Abrir en el explorador de archivos`,"contextMenu.unarchiveDisabledPurged":"El worktree se ha borrado del disco. Recréalo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō detecta la restauración en menos de 30 s y reactiva el workspace automáticamente.","workspaceList.unarchiveBlockedPurged":"No se puede desarchivar: el worktree ya no existe en el disco. Recréalo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō lo detecta en menos de 30 s y reactiva el workspace.","contextMenu.purgeWorktree":`Liberar espacio en disco (borrar worktree)`,"contextMenu.purgeWorktreeTooltip":`Borra el worktree del disco para recuperar espacio — el historial de mensajes y sesiones se conserva. Archiva automáticamente el workspace.`,"contextMenu.purgeWorktreeDialogTitle":`¿Liberar espacio en disco?`,"contextMenu.purgeWorktreeDialogMessage":`La carpeta del worktree de «{name}» será eliminada del disco. El historial de mensajes y sesiones se conserva. El workspace se archivará automáticamente. Esta acción no se puede deshacer en la versión actual.`,"contextMenu.purgeWorktreeDialogConfirm":`Borrar el worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree borrado — espacio en disco recuperado.`,"settings.autoPurgeOnPrMerged":`Borrar worktree al mergear la PR`,"settings.autoPurgeOnPrMergedHint":`Cuando está activado, el worktree se borra del disco en cuanto se mergea la PR (además del archivado automático). El historial de mensajes se conserva.`,"settings.autoLoopMaxRetries":`Máximo de reintentos automáticos`,"settings.autoLoopMaxRetriesHint":`Detiene el bucle automático tras este número de errores de cuota o de servidor temporales.`,"settings.retentionTitle":`Retención del historial de conversación (desactivada por defecto)`,"settings.retentionWarning":`Activar esta opción elimina definitivamente de la base de datos el historial de conversación de los agentes, empezando por todo lo que ya sea más antiguo que la ventana. Los eventos eliminados no se pueden recuperar.`,"settings.retentionHint":`Se ejecuta una vez al arrancar el servidor. Los workspaces, tareas, sesiones, branches y worktrees nunca se tocan — solo la salida registrada de los agentes.`,"settings.retentionDaysLabel":`Eliminar eventos más antiguos de (días)`,"settings.retentionDaysHint":`0 — el valor por defecto — conserva todos los eventos indefinidamente. Indica un valor para activar la retención.`,"settings.retentionKeepLabel":`Eventos siempre conservados por workspace`,"settings.retentionKeepHint":`Los eventos más recientes de cada workspace sobreviven sea cual sea su antigüedad, para que un workspace antiguo pero aún abierto conserve un historial legible. Sugerido: 5000.`,"settings.retentionDisabledHint":`Retención desactivada: nunca se eliminará nada.`,"settings.retentionConfirmTitle":`¿Eliminar definitivamente el historial de conversación?`,"settings.retentionConfirmMessage":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, {count} de los {total} eventos de agente registrados — incluido todo lo que ya sea más antiguo. Es irreversible. ¿Continuar?`,"settings.retentionConfirmMessageUnknown":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, todos los eventos de agente más antiguos — incluido todo lo ya acumulado. No se ha podido calcular el volumen exacto. Es irreversible. ¿Continuar?`,"settings.purgeDocsTitle":`Cómo funciona el borrado — restauración y permisos`,"settings.purgeDocsRestoreTitle":`Restaurar un worktree borrado (detección automática)`,"settings.purgeDocsRestoreIntro":`Un workspace borrado conserva su historial de chat y los metadatos de la PR, pero la carpeta worktree ya no existe. Recréala manualmente con uno de estos comandos — Kōbō detecta la reaparición de la carpeta en menos de 30 segundos y reactiva automáticamente el workspace (desarchivar + limpiar flag de borrado):`,"settings.purgeDocsRestoreCommands":`# GitHub (con CLI gh):
|
|
45
45
|
gh pr checkout [número-pr] --recurse-submodules
|
|
46
46
|
|
|
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`,"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":`Édite les quatre prompts ci-dessous toi-même. Démarre depuis la base agnostique.`,"settings.skillSuite.reloadDefaults":`Recharger les valeurs par défaut`,"settings.skillSuite.reloadDefaultsConfirm":`Remplacer les quatre prompts personnalisés par les valeurs agnostiques par défaut ?`,"settings.skillSuite.customPrompts":`Prompts personnalisés`,"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`},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
|
|
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)
|
|
@@ -57,13 +57,13 @@ KOBO_WORKSPACE_ID — id Kōbō du workspace (stable après renommage)
|
|
|
57
57
|
KOBO_WORKSPACE_NAME — nom affiché du workspace
|
|
58
58
|
KOBO_FORGE — forge résolue : github / gitlab / none
|
|
59
59
|
KOBO_PR_NUMBER — numéro de PR/MR sur la forge résolue (vide si aucune ouverte)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
|
|
60
|
-
# ton script — utilise $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Réinitialiser au défaut Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Réinitialiser le script ?`,"settings.changeSourceBranchScript.replaceConfirm":`Tes modifications seront remplacées par le script Kōbō par défaut. Continuer ?`,"settings.cleanupScriptHint":`Script shell exécuté dans le worktree après chaque fin de session de l'agent. En mode auto-loop, il ne s'exécute qu'une fois toutes les tâches terminées. Laisser vide pour désactiver.`,"settings.cleanupScriptPlaceholder":`ex. supprimer des fichiers temporaires, arrêter des conteneurs…`,"settings.cleanupScriptMode":`Quand l'exécuter`,"settings.cleanupScriptMode.idle":`À chaque fin de session — même s'il reste des tâches`,"settings.cleanupScriptMode.noTasks":`Uniquement quand plus aucune tâche Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Lancer uniquement si des fichiers ont été modifiés, ajoutés ou supprimés`,"settings.cleanupScriptMode.inherit":`Hériter du réglage global`,"settings.taskPromptTemplate":`Prompt de tâche`,"settings.taskPromptTemplatePlaceholder":`Prompt inséré automatiquement dans la description de tâche…`,"settings.taskPromptTemplateHint":`Injecté automatiquement dans la description de tâche sur la page de création quand ce projet est sélectionné. S'il n'est pas modifié, il est remplacé en changeant de projet ; dès que vous l'éditez, votre texte est conservé.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.fileManagerCommand":`Commande explorateur de fichiers`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Commande utilisée pour ouvrir le worktree dans votre explorateur de fichiers. Le chemin du worktree est passé en argument. Laissez vide pour masquer le bouton.`,"settings.terminalCommand":`Commande du terminal`,"settings.terminalCommandHint":`Commande pour lancer le terminal dans le worktree. Placeholder {path} optionnel pour le répertoire.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.copyFrom":`Copier les settings depuis`,"settings.copyFromPlaceholder":`(aucun — partir des valeurs par défaut)`,"settings.copyFromHint":`Copie tous les settings sauf le path, le nom affiché et la branche source.`,"settings.copyFromConfirmTitle":`Écraser les valeurs actuelles ?`,"settings.copyFromConfirm":`Cela écrasera les valeurs du formulaire avec les settings de « {project} ». Continuer ?`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"settings.onboardingTitle":`Visite guidée`,"settings.onboardingHint":`Revois la présentation des principaux éléments de l’interface.`,"settings.onboardingReplay":`Revoir la visite guidée`,"onboarding.list.title":`Espaces de travail`,"onboarding.list.description":`Chaque mission vit dans son propre espace — un git worktree, une branche et une session d’agent dédiés. Ils s’affichent tous ici.`,"onboarding.create.title":`Créer un espace de travail`,"onboarding.create.description":`Clique sur + pour lancer une nouvelle mission — depuis un ticket Notion, une issue Sentry, ou de zéro.`,"onboarding.search.title":`Recherche`,"onboarding.search.description":`Filtre tes espaces de travail par nom, ou cherche dans l’historique des conversations d’agents.`,"onboarding.health.title":`Santé`,"onboarding.health.description":`Vérifie l’état de Kōbō : base de données, agents actifs, intégrations, sauvegardes.`,"onboarding.changelog.title":`Nouveautés`,"onboarding.changelog.description":`Consulte les dernières évolutions de Kōbō : nouvelles fonctionnalités, correctifs, changements de comportement. Une pastille apparaît lorsqu'une release n'a pas encore été lue.`,"onboarding.settings.title":`Paramètres`,"onboarding.settings.description":`Modèles, scripts de cycle de vie, intégrations, voix — toute la configuration de Kōbō est ici. Cliquez sur Suivant pour parcourir chaque section.`,"onboarding.settings-general.title":`Général`,"onboarding.settings-general.description":`Langue de l’interface, projet par défaut et comportement global appliqué à chaque nouveau workspace.`,"onboarding.settings-agents.title":`Agents et modèles`,"onboarding.settings-agents.description":`Choisissez le moteur par défaut — Claude Code ou Codex —, le modèle et le mode de permission des agents.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Choisissez la suite de skills chargée par les agents : le préréglage recommandé ou votre sélection personnalisée.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`Modèle de description de PR et autres textes de prompt réutilisables par les agents.`,"onboarding.settings-scripts.title":`Scripts`,"onboarding.settings-scripts.description":`Scripts de cycle de vie exécutés au cleanup, à l’archivage et au setup d’un workspace — globaux ou par projet.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Connectez votre token d’intégration Notion pour importer des tickets comme missions de workspace.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Importer une issue Sentry comme source de vérité d’un workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Choisis GitHub, GitLab ou aucune, par projet. Kōbō pilote ta propre CLI gh / glab — il n’embarque aucun identifiant.`,"onboarding.settings-voice.title":`Voix`,"onboarding.settings-voice.description":`Dictée vocale : activez-la, choisissez le modèle Whisper et gérez le runtime de reconnaissance vocale local.`,"onboarding.settings-notifications.title":`Notifications`,"onboarding.settings-notifications.description":`Notifications sonores et navigateur pour les événements et changements d’état des agents.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Préfixes de branche Git et dossier où sont créés les worktrees des workspaces.`,"onboarding.settings-worktrees-purge.title":`Libérer l'espace disque automatiquement`,"onboarding.settings-worktrees-purge.description":"Active ce toggle pour que Kōbō supprime le dossier worktree (souvent plusieurs centaines de Mo de node_modules / vendor) dès qu'une PR est mergée. L'historique de chat et les métadonnées PR sont conservés. Tu peux recréer le worktree plus tard avec `gh pr checkout <pr>` — Kōbō détecte automatiquement la restauration dans les 30 secondes et réactive le workspace.","onboarding.settings-projects.title":`Projets`,"onboarding.settings-projects.description":`Enregistrez les dépôts sur lesquels vous travaillez. Cliquez sur « Ajouter un projet » pour pointer Kōbō vers un dépôt local — chaque workspace cible l’un de ces projets.`,"onboarding.settings-templates.title":`Modèles`,"onboarding.settings-templates.description":`Votre bibliothèque de modèles de prompt réutilisables — choisissez-en un pour pré-remplir le brief à la création d’un workspace.`,"onboarding.settings-export.title":`Import / Export`,"onboarding.settings-export.description":`Sauvegardez ou partagez la configuration de Kōbō, et exportez les données des workspaces dans un fichier.`,"onboarding.firstWorkspace.title":`Crée ton premier workspace`,"onboarding.firstWorkspace.description":`C’est tout l’objet de l’outil : une mission, un worktree, un agent. Ouvre la page de création pour démarrer.`,"onboarding.next":`Suivant`,"onboarding.prev":`Précédent`,"onboarding.done":`Terminé`,"onboarding.exitConfirm":`Quitter la visite guidée ? Vous pourrez la relancer à tout moment depuis les Paramètres.`,"settings.projectGroup.identity":`Identité`,"settings.projectGroup.defaults":`Valeurs par défaut`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.reviewPromptTemplate.project":`Modèle de prompt de review`,"settings.ciFixPromptTemplate.project":`Modèle de prompt « Fix CI »`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.notionAssignee":`Assignation Notion`,"settings.notionAssigneeHint":`Quand un workspace est créé avec un ticket Notion, l'utilisateur authentifié sur le MCP Notion est ajouté à cette propriété People — uniquement si elle n'a pas déjà d'assigné. Laisser vide pour désactiver.`,"settings.notionAssigneeProperty":`Nom de la propriété`,"settings.notionAssigneePropertyPlaceholder":`Développeurs, Assignees...`,"settings.notionUserId":`Ton UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Sélectionne ton compte dans la liste. Notion refuse l'assignation d'un bot — ce champ est obligatoire pour activer l'auto-assignation.`,"settings.notionUsersRefresh":`Rafraîchir`,"settings.notionUsersLoading":`Chargement des utilisateurs Notion…`,"settings.notionUsersLoadFailed":`Impossible de récupérer la liste : {error}`,"settings.notionUsersManualFallback":`Liste indisponible — colle ton UUID Notion manuellement.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.unsavedChanges":`Modifications non enregistrées`,"settings.nav.general":`Général`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Les identifiants restent locaux et sont utilisés uniquement par bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.openNav":`Ouvrir la navigation`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.deleteProjectConfirmTitle":`Supprimer le projet ?`,"settings.deleteProjectConfirmMessage":`Retirer « {name} » de vos projets ? Cela supprime uniquement ses réglages Kōbō — votre code et vos worktrees ne sont pas touchés.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"templates.reloadDefaults":`Recharger les modèles par défaut`,"templates.reloadDefaultsHint":`Ajoute uniquement les modèles par défaut manquants. Les modèles existants (même modifiés) ne sont jamais écrasés.`,"templates.reloadDefaultsConfirmMessage":`Cette action ajoute les modèles par défaut absents de la liste. Les modèles existants — y compris ceux que tu as modifiés — ne seront pas touchés. Si tu veux récupérer la version d'origine d'un modèle modifié, supprime-le d'abord puis relance cette action.`,"templates.reloadDefaultsSuccess":`{added} ajouté(s), {kept} conservé(s)`,"templates.reloadDefaultsFailed":`Échec du rechargement des modèles par défaut`,"templates.resetToDefault":`Réinitialiser au défaut`,"templates.resetConfirmTitle":`Réinitialiser le template au défaut ?`,"templates.resetConfirmMessage":`Cela écrase vos modifications locales de /{slug} par le défaut intégré. Action irréversible.`,"templates.resetSuccess":`Template /{slug} réinitialisé au défaut`,"templates.resetFailed":`Échec de la réinitialisation du template`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.outputDialogTitle":`Git a signalé une erreur`,"git.statsFailed":`L’état git n’a pas pu être lu`,"git.section.repository":`Dépôt`,"git.section.changes":`Modifications`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`Plus`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.commits.diffThisCommit":`Diff de ce commit (vs parent)`,"git.compareCommits":`Comparer des commits…`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.workingTreeEmpty":`Aucune modification non commitée`,"git.fileStaged":`Indexé`,"git.fileModified":`Modifié`,"git.fileUntracked":`Non suivi`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.viewRequest":`Voir la {request}`,"git.createRequest":`Créer une {request}`,"git.changeRequestBase":`Changer la branche cible de la {request}`,"git.forgeCliMissing":`{cli} n'est pas installé — installez-le pour les fonctions {request}`,"git.forgeNotAuthenticated":`Non authentifié — exécutez {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Détection automatique`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Aucune`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"pr.baseChanged":`Base de la PR modifiée : {oldBase} → {newBase}`,"pr.openPr":`Ouvrir la PR`,"pr.openWorkspace":`Ouvrir le workspace`,"pr.dismiss":`Fermer`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Dépôt récupéré`,"git.fetchFailed":`Échec du fetch : {error}`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.commitFailed":`Commit échoué`,"git.commitChanges":`Committer les modifications`,"git.commitDialogTitle":`Committer les modifications non commitées`,"git.commitDialogDescription":`Saisissez votre message ou demandez à l’agent d’inspecter et de créer le commit.`,"git.commitMessage":`Message de commit`,"git.commitManual":`Committer`,"git.commitWithAgent":`Demander à l’agent`,"git.commitAgentSuccess":`Demande de commit envoyée à l’agent`,"git.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.operationPausedTitle":`Opération Git à poursuivre`,"git.operationPausedSubtitle":`Aucun fichier en conflit. Git attend simplement que tu poursuives l’opération.`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbortConfirmTitle":`Abandonner la résolution du conflit ?`,"git.conflictAbortConfirmMessage":`Tout ce que tu as résolu dans ce {op} est jeté et le worktree revient à son état d’avant. C’est irréversible.`,"git.conflictAbort":`Abandonner`,"git.conflictContinue":`Continuer`,"git.conflictContinued":`Opération Git poursuivie`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.dirtyTitleRebase":`Des modifications non commitées bloquent le rebase`,"git.dirtyTitleMerge":`Des modifications non commitées bloquent le merge`,"git.dirtyTitlePull":`Des modifications non commitées bloquent le pull`,"git.dirtySubtitle":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s). Choisis comment continuer.`,"git.dirtyStash":`Stash & réessayer`,"git.dirtyCommit":`Commit d'abord`,"git.dirtyCommitPlaceholder":`Message de commit`,"git.dirtyCommitConfirm":`Commit & réessayer`,"git.dirtyDiscard":`Abandonner les modifs`,"git.dirtyDiscardConfirmTitle":`Abandonner toutes les modifications non commitées ?`,"git.dirtyDiscardConfirmMessage":`Les modifications suivies seront perdues (git reset --hard). Les fichiers non suivis sont conservés. Action irréversible.`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la {request}.`,"git.changePrBaseSuccess":`Branche cible de la {request} mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la {request}`,"git.mergeRequest":`Fusionner la {request}`,"git.mergeRequestConfirmTitle":`Fusionner la {request} ?`,"git.mergeRequestConfirmMessage":`Cette action fusionne la {request} ouverte dans sa branche cible.`,"git.mergeRequestSuccess":`{request} fusionnée`,"git.mergeRequestFailed":`Impossible de fusionner la {request}`,"git.deleteRemoteBranch":`Supprimer la branche distante`,"git.deleteRemoteBranchTitle":`Supprimer la branche distante ?`,"git.deleteRemoteBranchMessage":`La demande a été fusionnée. Supprimer la branche distante {branch} ?`,"git.deleteRemoteBranchSuccess":`Branche distante {branch} supprimée`,"git.deleteRemoteBranchFailed":`Impossible de supprimer la branche distante`,"git.changeSourceBranch":`Changer la branche source`,"git.changeSourceBranchTitle":`Changer la branche source`,"git.changeSourceBranchMessage":`Choisis la nouvelle branche source. La branche de travail sera reconstruite par-dessus.`,"git.changeSourceBranchDone":`Branche source changée vers {branch}`,"git.changeSourceBranchAligned":`Branche source changée vers {branch} (la branche n'avait aucun commit propre)`,"git.changeSourceBranchTooMany":`La branche a trop de commits propres ({n}) — rebase-la manuellement`,"git.changeSourceBranchDirty":`Commit ou stash tes changements avant de changer la branche source`,"git.changeSourceBranchAgentRunning":`Arrête l'agent avant de changer la branche source`,"git.changeSourceBranchErrorTitle":`Échec du changement de branche source`,"git.changeSourceBranchErrorOngoing":`Une opération {op} est encore en cours sur le worktree. Annule-la pour revenir à un état propre.`,"git.changeSourceBranchErrorAbort":`Annuler l'opération`,"git.changeSourceBranchLoading":`Changement de la branche source…`,"git.changeSourceForcePushTitle":`Force-push de la branche réécrite ?`,"git.changeSourceForcePushMessage":`L'historique de la branche a été réécrit. La force-pusher vers le remote avec --force-with-lease ?`,"git.changeSourceForcePushDone":`Branche force-pushée`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.aheadBehindTooltip":`{ahead} commits en avance, {behind} en retard sur {source}`,"git.divergence.title":`Divergence de branche`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} en avance`,"git.divergence.behind":`↓ {count} en retard`,"git.divergence.empty.ahead":`Aucun commit en avance.`,"git.divergence.empty.behind":`Aucun commit en retard.`,"git.divergence.close":`Fermer`,"git.divergence.loading":`Chargement des commits…`,"git.divergence.failed":`Échec du chargement de la divergence`,"git.divergence.retry":`Réessayer`,"git.prCreated":`{request} #{n} créée`,"git.pr.author":`Auteur`,"git.pr.reviewers":`Relecteurs`,"git.pr.assignees":`Assignés`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Modifications demandées`,"git.pr.approvedBadge":`Approuvée`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI en échec`,"git.pr.ci.pending":`CI en cours`,"git.pr.ci.failedCount":`{n} en échec`,"git.pr.ci.pendingCount":`{n} en cours`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} ignoré(s)`,"git.pr.ci.showPassed":`Afficher les {n} jobs réussis`,"git.pr.ci.hidePassed":`Masquer les jobs réussis`,"toast.prChangesRequested":`Des modifications ont été demandées sur la PR #{n}`,"toast.prApproved":`La PR #{n} a été approuvée`,"toast.prReadyToMerge":`La PR #{n} est prête à merger`,"toast.prCiFailed":`La CI de la PR #{n} est en échec`,"toast.prCiRecovered":`La CI de la PR #{n} est rétablie`,"toast.prMergeConflict":`La PR #{n} a un conflit de merge`,"toast.prMerged":`La PR #{n} a été mergée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sub-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"quotaBackoff.banner.title":`Reprise auto à {time}`,"quotaBackoff.banner.tooltip":`Quota Claude épuisé. L'auto-loop reprendra automatiquement quand le quota se libère à {resets_at}.`,"quotaBackoff.banner.cancel":`Annuler la reprise`,"quotaBackoff.cancelled":`Reprise auto annulée — tu peux relancer manuellement à tout moment`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"tools.review":`Reviewer les changes`,"tools.reviewTooltip":`Demander à l'agent de reviewer les changes de cette branche`,"tools.reviewBusy":`Agent occupé — attends qu'il soit idle`,"tools.fixCi":`Réparer la CI`,"tools.fixCiTooltip":`Demander à l'agent de diagnostiquer et corriger les jobs CI en échec`,"tools.fixCiLaunched":`Action « Fix CI » envoyée à l'agent`,"tools.fixCiFailed":`Échec du lancement de l'action « Fix CI »`,"tools.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"tools.openFileManagerTooltip":`Ouvrir le dossier du worktree dans votre explorateur de fichiers configuré`,"tools.openFileManagerFailed":`Échec de l'ouverture de l'explorateur de fichiers`,"tools.openTerminal":`Ouvrir dans un terminal`,"tools.openTerminalTooltip":`Ouvrir le worktree dans le terminal configuré`,"tools.openTerminalFailed":`Échec de l'ouverture du terminal`,"review.title":`Lancer une review`,"review.subtitle":`Demande à l'agent de reviewer tes changes et de te faire des retours.`,"review.additionalInstructions":`Instructions supplémentaires (optionnel)`,"review.additionalInstructionsPlaceholder":`Ajoute des instructions spécifiques pour la review…`,"review.newSession":`Nouvelle session`,"review.newSessionHint":`Démarre une nouvelle session d'agent au lieu de continuer la courante.`,"review.start":`Lancer la review`,"review.cancel":`Annuler`,"review.launched":`Review lancée`,"review.failed":`Échec du lancement de la review`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.rollbackFailedDetail":`Échec du rollback : {error}`,"diff.modeInspect":`Édition`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.searchFiles":`Rechercher des fichiers…`,"diff.noFileMatch":`Aucun fichier correspondant`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.fileLoadFailed":`Ce diff n’a pas pu être chargé`,"diff.fileLoadFailedHint":`Le fichier sur le disque est intact — seul le chargement du diff a échoué.`,"diff.fileListLoadFailed":`La liste des fichiers n’a pas pu être chargée`,"diff.fileListLoadFailedHint":`Il s’agit d’un échec de requête, pas d’une branche sans modification.`,"diff.addToChat":`Ajouter au chat`,"diff.compareTitle":`Comparer des commits`,"diff.compareFrom":`De`,"diff.compareTo":`À`,"diff.compareSubmit":`Comparer`,"diff.compareSourceBase":`{branch} (base de la branche)`,"diff.commitsReadOnly":`lecture seule`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"diffViewer.saveFailedDetail":`Échec de l’enregistrement : {error}`,"diffViewer.unsavedChanges.title":`Modifications non enregistrées`,"diffViewer.unsavedChanges.message":`Tu as des modifications non enregistrées. Que veux-tu faire ?`,"diffViewer.unsavedChanges.save":`Enregistrer`,"diffViewer.unsavedChanges.cancel":`Annuler`,"diffViewer.conflict.title":`Fichier modifié sur le disque`,"diffViewer.conflict.message":`Le fichier a été modifié hors de Kōbō depuis que tu l’as ouvert.`,"diffViewer.conflict.reload":`Recharger (perdre les modifs locales)`,"diffViewer.conflict.keep":`Garder les miennes`,"diffViewer.conflict.overwrite":`Écraser quand même`,"diffViewer.conflict.overwriteHint":`Remplace le fichier sur le disque par ta version. L’autre modification est perdue.`,"diffViewer.conflict.keepHint":`Garde tes modifications dans l’éditeur et adopte la nouvelle signature du disque, pour que la prochaine sauvegarde fonctionne.`,"diffViewer.saveBlocked":`L’agent tourne — arrête-le pour enregistrer tes modifications.`,"diffViewer.unsavedBanner":`Modifications non enregistrées. Arrête l’agent pour les sauvegarder.`,"diffViewer.closeConfirm.title":`Modifications non enregistrées`,"diffViewer.closeConfirm.message":`Ce fichier contient des modifications jamais enregistrées. Fermer le visualiseur de diff les perdra.`,"diffViewer.closeConfirm.discard":`Fermer sans enregistrer`,"diffViewer.criteriaRail":`Checklist de revue`,"diffViewer.criteriaRailShow":`Afficher la checklist de revue`,"diffViewer.criteriaRailHide":`Masquer la checklist de revue`,"diffViewer.fileTreeShow":`Afficher l’arbre des fichiers`,"diffViewer.fileTreeHide":`Masquer l’arbre des fichiers`,"diffViewer.closeConfirm.saveAndClose":`Enregistrer et fermer`,"diffViewer.agentRunning":`L’agent tourne — arrête-le pour éditer`,"diffViewer.fileDeleted":`Fichier supprimé`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentQuestion":`{name} — L'agent te pose une question`,"notification.agentPermissionRequest":`{name} — L'agent demande une permission`,"notification.autoLoopCompleted":`{name} — Auto-loop terminé`,"notification.autoLoopStalled":`{name} — Auto-loop bloqué (aucun progrès)`,"notification.autoLoopError":`{name} — Auto-loop arrêté sur erreur`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pause, en attente de votre précision`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop a forcé le mode plan en bypass`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.editDescription":`Modifier la description`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"contextMenu.unarchiveDisabledPurged":"Le worktree a été supprimé du disque. Recrée-le manuellement (`gh pr checkout` ou `git worktree add`) — Kōbō détecte la restauration dans les 30 s et réactive le workspace automatiquement.","workspaceList.unarchiveBlockedPurged":"Impossible de désarchiver : le worktree n'existe plus sur le disque. Recrée-le manuellement (`gh pr checkout` ou `git worktree add`) — Kōbō le détecte dans les 30 s et réactive le workspace.","contextMenu.purgeWorktree":`Libérer l'espace disque (supprimer le worktree)`,"contextMenu.purgeWorktreeTooltip":`Supprime le worktree du disque pour récupérer de l'espace — l'historique des messages et sessions est conservé. Archive automatiquement le workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Libérer l'espace disque ?`,"contextMenu.purgeWorktreeDialogMessage":`Le dossier worktree de « {name} » va être supprimé du disque. L'historique des messages et sessions est conservé. Le workspace sera archivé automatiquement. Cette action ne peut pas être annulée dans la version actuelle.`,"contextMenu.purgeWorktreeDialogConfirm":`Supprimer le worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree supprimé — espace disque récupéré.`,"settings.autoPurgeOnPrMerged":`Purger le worktree quand la PR est mergée`,"settings.autoPurgeOnPrMergedHint":`Quand activé, le worktree est supprimé du disque dès que la PR est mergée (en plus de l'archivage auto). L'historique des messages est conservé.`,"settings.autoLoopMaxRetries":`Nombre maximal de nouvelles tentatives`,"settings.autoLoopMaxRetriesHint":`Arrête l'auto-loop après ce nombre d'erreurs de quota ou d'erreurs serveur temporaires.`,"settings.retentionTitle":`Rétention de l'historique de conversation (désactivée par défaut)`,"settings.retentionWarning":`Activer cette option supprime définitivement de la base l'historique de conversation des agents, à commencer par tout ce qui est déjà plus vieux que la fenêtre. Les événements supprimés sont irrécupérables.`,"settings.retentionHint":`Exécutée une fois au démarrage du serveur. Les workspaces, tâches, sessions, branches et worktrees ne sont jamais touchés — seule la sortie enregistrée des agents l'est.`,"settings.retentionDaysLabel":`Supprimer les événements plus vieux que (jours)`,"settings.retentionDaysHint":`0 — la valeur par défaut — conserve tous les événements indéfiniment. Renseignez une valeur pour activer la rétention.`,"settings.retentionKeepLabel":`Événements toujours conservés par workspace`,"settings.retentionKeepHint":`Les événements les plus récents de chaque workspace survivent quel que soit leur âge, pour qu'un workspace ancien mais toujours ouvert garde un historique lisible. Suggéré : 5000.`,"settings.retentionDisabledHint":`Rétention désactivée : rien ne sera jamais supprimé.`,"settings.retentionConfirmTitle":`Supprimer définitivement de l'historique de conversation ?`,"settings.retentionConfirmMessage":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, {count} des {total} événements d'agent enregistrés — y compris tout ce qui est déjà plus ancien. C'est irréversible. Continuer ?`,"settings.retentionConfirmMessageUnknown":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, tous les événements d'agent plus anciens — y compris tout ce qui est déjà accumulé. Le volume exact n'a pas pu être calculé. C'est irréversible. Continuer ?`,"settings.purgeDocsTitle":`Comment ça marche — restauration & permissions`,"settings.purgeDocsRestoreTitle":`Restaurer un worktree purgé (détection automatique)`,"settings.purgeDocsRestoreIntro":`Un workspace purgé conserve son historique de chat et les métadonnées de la PR, mais le dossier worktree n'existe plus. Recrée-le manuellement avec l'une de ces commandes — Kōbō détecte la réapparition du dossier dans les 30 secondes et réactive automatiquement le workspace (désarchive + clear flag purge) :`,"settings.purgeDocsRestoreCommands":`# GitHub (via le CLI gh) :
|
|
60
|
+
# ton script — utilise $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Réinitialiser au défaut Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Réinitialiser le script ?`,"settings.changeSourceBranchScript.replaceConfirm":`Tes modifications seront remplacées par le script Kōbō par défaut. Continuer ?`,"settings.cleanupScriptHint":`Script shell exécuté dans le worktree après chaque fin de session de l'agent. En mode auto-loop, il ne s'exécute qu'une fois toutes les tâches terminées. Laisser vide pour désactiver.`,"settings.cleanupScriptPlaceholder":`ex. supprimer des fichiers temporaires, arrêter des conteneurs…`,"settings.cleanupScriptMode":`Quand l'exécuter`,"settings.cleanupScriptMode.idle":`À chaque fin de session — même s'il reste des tâches`,"settings.cleanupScriptMode.noTasks":`Uniquement quand plus aucune tâche Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Lancer uniquement si des fichiers ont été modifiés, ajoutés ou supprimés`,"settings.cleanupScriptMode.inherit":`Hériter du réglage global`,"settings.taskPromptTemplate":`Prompt de tâche`,"settings.taskPromptTemplatePlaceholder":`Prompt inséré automatiquement dans la description de tâche…`,"settings.taskPromptTemplateHint":`Injecté automatiquement dans la description de tâche sur la page de création quand ce projet est sélectionné. S'il n'est pas modifié, il est remplacé en changeant de projet ; dès que vous l'éditez, votre texte est conservé.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.fileManagerCommand":`Commande explorateur de fichiers`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Commande utilisée pour ouvrir le worktree dans votre explorateur de fichiers. Le chemin du worktree est passé en argument. Laissez vide pour masquer le bouton.`,"settings.terminalCommand":`Commande du terminal`,"settings.terminalCommandHint":`Commande pour lancer le terminal dans le worktree. Placeholder {path} optionnel pour le répertoire.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.copyFrom":`Copier les settings depuis`,"settings.copyFromPlaceholder":`(aucun — partir des valeurs par défaut)`,"settings.copyFromHint":`Copie tous les settings sauf le path, le nom affiché et la branche source.`,"settings.copyFromConfirmTitle":`Écraser les valeurs actuelles ?`,"settings.copyFromConfirm":`Cela écrasera les valeurs du formulaire avec les settings de « {project} ». Continuer ?`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"settings.onboardingTitle":`Visite guidée`,"settings.onboardingHint":`Revois la présentation des principaux éléments de l’interface.`,"settings.onboardingReplay":`Revoir la visite guidée`,"onboarding.list.title":`Espaces de travail`,"onboarding.list.description":`Chaque mission vit dans son propre espace — un git worktree, une branche et une session d’agent dédiés. Ils s’affichent tous ici.`,"onboarding.create.title":`Créer un espace de travail`,"onboarding.create.description":`Clique sur + pour lancer une nouvelle mission — depuis un ticket Notion, une issue Sentry, ou de zéro.`,"onboarding.search.title":`Recherche`,"onboarding.search.description":`Filtre tes espaces de travail par nom, ou cherche dans l’historique des conversations d’agents.`,"onboarding.health.title":`Santé`,"onboarding.health.description":`Vérifie l’état de Kōbō : base de données, agents actifs, intégrations, sauvegardes.`,"onboarding.changelog.title":`Nouveautés`,"onboarding.changelog.description":`Consulte les dernières évolutions de Kōbō : nouvelles fonctionnalités, correctifs, changements de comportement. Une pastille apparaît lorsqu'une release n'a pas encore été lue.`,"onboarding.settings.title":`Paramètres`,"onboarding.settings.description":`Modèles, scripts de cycle de vie, intégrations, voix — toute la configuration de Kōbō est ici. Cliquez sur Suivant pour parcourir chaque section.`,"onboarding.settings-general.title":`Général`,"onboarding.settings-general.description":`Langue de l’interface, projet par défaut et comportement global appliqué à chaque nouveau workspace.`,"onboarding.settings-agents.title":`Agents et modèles`,"onboarding.settings-agents.description":`Choisissez le moteur par défaut — Claude Code ou Codex —, le modèle et le mode de permission des agents.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Choisissez la suite de skills chargée par les agents : le préréglage recommandé ou votre sélection personnalisée.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`Modèle de description de PR et autres textes de prompt réutilisables par les agents.`,"onboarding.settings-scripts.title":`Scripts`,"onboarding.settings-scripts.description":`Scripts de cycle de vie exécutés au cleanup, à l’archivage et au setup d’un workspace — globaux ou par projet.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Connectez votre token d’intégration Notion pour importer des tickets comme missions de workspace.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Importer une issue Sentry comme source de vérité d’un workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Choisis GitHub, GitLab ou aucune, par projet. Kōbō pilote ta propre CLI gh / glab — il n’embarque aucun identifiant.`,"onboarding.settings-voice.title":`Voix`,"onboarding.settings-voice.description":`Dictée vocale : activez-la, choisissez le modèle Whisper et gérez le runtime de reconnaissance vocale local.`,"onboarding.settings-notifications.title":`Notifications`,"onboarding.settings-notifications.description":`Notifications sonores et navigateur pour les événements et changements d’état des agents.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Préfixes de branche Git et dossier où sont créés les worktrees des workspaces.`,"onboarding.settings-worktrees-purge.title":`Libérer l'espace disque automatiquement`,"onboarding.settings-worktrees-purge.description":"Active ce toggle pour que Kōbō supprime le dossier worktree (souvent plusieurs centaines de Mo de node_modules / vendor) dès qu'une PR est mergée. L'historique de chat et les métadonnées PR sont conservés. Tu peux recréer le worktree plus tard avec `gh pr checkout <pr>` — Kōbō détecte automatiquement la restauration dans les 30 secondes et réactive le workspace.","onboarding.settings-projects.title":`Projets`,"onboarding.settings-projects.description":`Enregistrez les dépôts sur lesquels vous travaillez. Cliquez sur « Ajouter un projet » pour pointer Kōbō vers un dépôt local — chaque workspace cible l’un de ces projets.`,"onboarding.settings-templates.title":`Modèles`,"onboarding.settings-templates.description":`Votre bibliothèque de modèles de prompt réutilisables — choisissez-en un pour pré-remplir le brief à la création d’un workspace.`,"onboarding.settings-export.title":`Import / Export`,"onboarding.settings-export.description":`Sauvegardez ou partagez la configuration de Kōbō, et exportez les données des workspaces dans un fichier.`,"onboarding.firstWorkspace.title":`Crée ton premier workspace`,"onboarding.firstWorkspace.description":`C’est tout l’objet de l’outil : une mission, un worktree, un agent. Ouvre la page de création pour démarrer.`,"onboarding.next":`Suivant`,"onboarding.prev":`Précédent`,"onboarding.done":`Terminé`,"onboarding.exitConfirm":`Quitter la visite guidée ? Vous pourrez la relancer à tout moment depuis les Paramètres.`,"settings.projectGroup.identity":`Identité`,"settings.projectGroup.defaults":`Valeurs par défaut`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.reviewPromptTemplate.project":`Modèle de prompt de review`,"settings.ciFixPromptTemplate.project":`Modèle de prompt « Fix CI »`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.notionAssignee":`Assignation Notion`,"settings.notionAssigneeHint":`Quand un workspace est créé avec un ticket Notion, l'utilisateur authentifié sur le MCP Notion est ajouté à cette propriété People — uniquement si elle n'a pas déjà d'assigné. Laisser vide pour désactiver.`,"settings.notionAssigneeProperty":`Nom de la propriété`,"settings.notionAssigneePropertyPlaceholder":`Développeurs, Assignees...`,"settings.notionUserId":`Ton UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Sélectionne ton compte dans la liste. Notion refuse l'assignation d'un bot — ce champ est obligatoire pour activer l'auto-assignation.`,"settings.notionUsersRefresh":`Rafraîchir`,"settings.notionUsersLoading":`Chargement des utilisateurs Notion…`,"settings.notionUsersLoadFailed":`Impossible de récupérer la liste : {error}`,"settings.notionUsersManualFallback":`Liste indisponible — colle ton UUID Notion manuellement.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.unsavedChanges":`Modifications non enregistrées`,"settings.nav.general":`Général`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Les identifiants restent locaux et sont utilisés uniquement par bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.openNav":`Ouvrir la navigation`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.deleteProjectConfirmTitle":`Supprimer le projet ?`,"settings.deleteProjectConfirmMessage":`Retirer « {name} » de vos projets ? Cela supprime uniquement ses réglages Kōbō — votre code et vos worktrees ne sont pas touchés.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"templates.reloadDefaults":`Recharger les modèles par défaut`,"templates.reloadDefaultsHint":`Ajoute uniquement les modèles par défaut manquants. Les modèles existants (même modifiés) ne sont jamais écrasés.`,"templates.reloadDefaultsConfirmMessage":`Cette action ajoute les modèles par défaut absents de la liste. Les modèles existants — y compris ceux que tu as modifiés — ne seront pas touchés. Si tu veux récupérer la version d'origine d'un modèle modifié, supprime-le d'abord puis relance cette action.`,"templates.reloadDefaultsSuccess":`{added} ajouté(s), {kept} conservé(s)`,"templates.reloadDefaultsFailed":`Échec du rechargement des modèles par défaut`,"templates.resetToDefault":`Réinitialiser au défaut`,"templates.resetConfirmTitle":`Réinitialiser le template au défaut ?`,"templates.resetConfirmMessage":`Cela écrase vos modifications locales de /{slug} par le défaut intégré. Action irréversible.`,"templates.resetSuccess":`Template /{slug} réinitialisé au défaut`,"templates.resetFailed":`Échec de la réinitialisation du template`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.outputDialogTitle":`Git a signalé une erreur`,"git.statsFailed":`L’état git n’a pas pu être lu`,"git.section.repository":`Dépôt`,"git.section.changes":`Modifications`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`Plus`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.commits.diffThisCommit":`Diff de ce commit (vs parent)`,"git.compareCommits":`Comparer des commits…`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.workingTreeEmpty":`Aucune modification non commitée`,"git.fileStaged":`Indexé`,"git.fileModified":`Modifié`,"git.fileUntracked":`Non suivi`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.viewRequest":`Voir la {request}`,"git.createRequest":`Créer une {request}`,"git.changeRequestBase":`Changer la branche cible de la {request}`,"git.forgeCliMissing":`{cli} n'est pas installé — installez-le pour les fonctions {request}`,"git.forgeNotAuthenticated":`Non authentifié — exécutez {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Détection automatique`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Aucune`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"pr.baseChanged":`Base de la PR modifiée : {oldBase} → {newBase}`,"pr.openPr":`Ouvrir la PR`,"pr.openWorkspace":`Ouvrir le workspace`,"pr.dismiss":`Fermer`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Dépôt récupéré`,"git.fetchFailed":`Échec du fetch : {error}`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.commitFailed":`Commit échoué`,"git.commitChanges":`Committer les modifications`,"git.commitDialogTitle":`Committer les modifications non commitées`,"git.commitDialogDescription":`Saisissez votre message ou demandez à l’agent d’inspecter et de créer le commit.`,"git.commitMessage":`Message de commit`,"git.commitManual":`Committer`,"git.commitWithAgent":`Demander à l’agent`,"git.commitAgentSuccess":`Demande de commit envoyée à l’agent`,"git.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.operationPausedTitle":`Opération Git à poursuivre`,"git.operationPausedSubtitle":`Aucun fichier en conflit. Git attend simplement que tu poursuives l’opération.`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbortConfirmTitle":`Abandonner la résolution du conflit ?`,"git.conflictAbortConfirmMessage":`Tout ce que tu as résolu dans ce {op} est jeté et le worktree revient à son état d’avant. C’est irréversible.`,"git.conflictAbort":`Abandonner`,"git.conflictContinue":`Continuer`,"git.conflictContinued":`Opération Git poursuivie`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.dirtyTitleRebase":`Des modifications non commitées bloquent le rebase`,"git.dirtyTitleMerge":`Des modifications non commitées bloquent le merge`,"git.dirtyTitlePull":`Des modifications non commitées bloquent le pull`,"git.dirtySubtitle":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s). Choisis comment continuer.`,"git.dirtyStash":`Stash & réessayer`,"git.dirtyCommit":`Commit d'abord`,"git.dirtyCommitPlaceholder":`Message de commit`,"git.dirtyCommitConfirm":`Commit & réessayer`,"git.dirtyDiscard":`Abandonner les modifs`,"git.dirtyDiscardConfirmTitle":`Abandonner toutes les modifications non commitées ?`,"git.dirtyDiscardConfirmMessage":`Les modifications suivies seront perdues (git reset --hard). Les fichiers non suivis sont conservés. Action irréversible.`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la {request}.`,"git.changePrBaseSuccess":`Branche cible de la {request} mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la {request}`,"git.mergeRequest":`Fusionner la {request}`,"git.mergeRequestConfirmTitle":`Fusionner la {request} ?`,"git.mergeRequestConfirmMessage":`Cette action fusionne la {request} ouverte dans sa branche cible.`,"git.mergeRequestSuccess":`{request} fusionnée`,"git.mergeRequestFailed":`Impossible de fusionner la {request}`,"git.deleteRemoteBranch":`Supprimer la branche distante`,"git.deleteRemoteBranchTitle":`Supprimer la branche distante ?`,"git.deleteRemoteBranchMessage":`La demande a été fusionnée. Supprimer la branche distante {branch} ?`,"git.deleteRemoteBranchSuccess":`Branche distante {branch} supprimée`,"git.deleteRemoteBranchFailed":`Impossible de supprimer la branche distante`,"git.changeSourceBranch":`Changer la branche source`,"git.changeSourceBranchTitle":`Changer la branche source`,"git.changeSourceBranchMessage":`Choisis la nouvelle branche source. La branche de travail sera reconstruite par-dessus.`,"git.changeSourceBranchDone":`Branche source changée vers {branch}`,"git.changeSourceBranchAligned":`Branche source changée vers {branch} (la branche n'avait aucun commit propre)`,"git.changeSourceBranchTooMany":`La branche a trop de commits propres ({n}) — rebase-la manuellement`,"git.changeSourceBranchDirty":`Commit ou stash tes changements avant de changer la branche source`,"git.changeSourceBranchAgentRunning":`Arrête l'agent avant de changer la branche source`,"git.changeSourceBranchErrorTitle":`Échec du changement de branche source`,"git.changeSourceBranchErrorOngoing":`Une opération {op} est encore en cours sur le worktree. Annule-la pour revenir à un état propre.`,"git.changeSourceBranchErrorAbort":`Annuler l'opération`,"git.changeSourceBranchLoading":`Changement de la branche source…`,"git.changeSourceForcePushTitle":`Force-push de la branche réécrite ?`,"git.changeSourceForcePushMessage":`L'historique de la branche a été réécrit. La force-pusher vers le remote avec --force-with-lease ?`,"git.changeSourceForcePushDone":`Branche force-pushée`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.aheadBehindTooltip":`{ahead} commits en avance, {behind} en retard sur {source}`,"git.divergence.title":`Divergence de branche`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} en avance`,"git.divergence.behind":`↓ {count} en retard`,"git.divergence.empty.ahead":`Aucun commit en avance.`,"git.divergence.empty.behind":`Aucun commit en retard.`,"git.divergence.close":`Fermer`,"git.divergence.loading":`Chargement des commits…`,"git.divergence.failed":`Échec du chargement de la divergence`,"git.divergence.retry":`Réessayer`,"git.prCreated":`{request} #{n} créée`,"git.pr.author":`Auteur`,"git.pr.reviewers":`Relecteurs`,"git.pr.assignees":`Assignés`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Modifications demandées`,"git.pr.approvedBadge":`Approuvée`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI en échec`,"git.pr.ci.pending":`CI en cours`,"git.pr.ci.failedCount":`{n} en échec`,"git.pr.ci.pendingCount":`{n} en cours`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} ignoré(s)`,"git.pr.ci.showPassed":`Afficher les {n} jobs réussis`,"git.pr.ci.hidePassed":`Masquer les jobs réussis`,"toast.prChangesRequested":`Des modifications ont été demandées sur la PR #{n}`,"toast.prApproved":`La PR #{n} a été approuvée`,"toast.prReadyToMerge":`La PR #{n} est prête à merger`,"toast.prCiFailed":`La CI de la PR #{n} est en échec`,"toast.prCiRecovered":`La CI de la PR #{n} est rétablie`,"toast.prMergeConflict":`La PR #{n} a un conflit de merge`,"toast.prMerged":`La PR #{n} a été mergée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sub-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"quotaBackoff.banner.title":`Reprise auto à {time}`,"quotaBackoff.banner.transientTitle":`Reprise auto après interruption à {time}`,"quotaBackoff.resumeNow":`Reprendre maintenant`,"quotaBackoff.banner.tooltip":`Quota Claude épuisé. L'auto-loop reprendra automatiquement quand le quota se libère à {resets_at}.`,"quotaBackoff.banner.cancel":`Annuler la reprise`,"quotaBackoff.cancelled":`Reprise auto annulée — tu peux relancer manuellement à tout moment`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"tools.review":`Reviewer les changes`,"tools.reviewTooltip":`Demander à l'agent de reviewer les changes de cette branche`,"tools.reviewBusy":`Agent occupé — attends qu'il soit idle`,"tools.fixCi":`Réparer la CI`,"tools.fixCiTooltip":`Demander à l'agent de diagnostiquer et corriger les jobs CI en échec`,"tools.fixCiLaunched":`Action « Fix CI » envoyée à l'agent`,"tools.fixCiFailed":`Échec du lancement de l'action « Fix CI »`,"tools.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"tools.openFileManagerTooltip":`Ouvrir le dossier du worktree dans votre explorateur de fichiers configuré`,"tools.openFileManagerFailed":`Échec de l'ouverture de l'explorateur de fichiers`,"tools.openTerminal":`Ouvrir dans un terminal`,"tools.openTerminalTooltip":`Ouvrir le worktree dans le terminal configuré`,"tools.openTerminalFailed":`Échec de l'ouverture du terminal`,"review.title":`Lancer une review`,"review.subtitle":`Demande à l'agent de reviewer tes changes et de te faire des retours.`,"review.additionalInstructions":`Instructions supplémentaires (optionnel)`,"review.additionalInstructionsPlaceholder":`Ajoute des instructions spécifiques pour la review…`,"review.newSession":`Nouvelle session`,"review.newSessionHint":`Démarre une nouvelle session d'agent au lieu de continuer la courante.`,"review.start":`Lancer la review`,"review.cancel":`Annuler`,"review.launched":`Review lancée`,"review.failed":`Échec du lancement de la review`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.rollbackFailedDetail":`Échec du rollback : {error}`,"diff.modeInspect":`Édition`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.searchFiles":`Rechercher des fichiers…`,"diff.noFileMatch":`Aucun fichier correspondant`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.fileLoadFailed":`Ce diff n’a pas pu être chargé`,"diff.fileLoadFailedHint":`Le fichier sur le disque est intact — seul le chargement du diff a échoué.`,"diff.fileListLoadFailed":`La liste des fichiers n’a pas pu être chargée`,"diff.fileListLoadFailedHint":`Il s’agit d’un échec de requête, pas d’une branche sans modification.`,"diff.addToChat":`Ajouter au chat`,"diff.compareTitle":`Comparer des commits`,"diff.compareFrom":`De`,"diff.compareTo":`À`,"diff.compareSubmit":`Comparer`,"diff.compareSourceBase":`{branch} (base de la branche)`,"diff.commitsReadOnly":`lecture seule`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"diffViewer.saveFailedDetail":`Échec de l’enregistrement : {error}`,"diffViewer.unsavedChanges.title":`Modifications non enregistrées`,"diffViewer.unsavedChanges.message":`Tu as des modifications non enregistrées. Que veux-tu faire ?`,"diffViewer.unsavedChanges.save":`Enregistrer`,"diffViewer.unsavedChanges.cancel":`Annuler`,"diffViewer.conflict.title":`Fichier modifié sur le disque`,"diffViewer.conflict.message":`Le fichier a été modifié hors de Kōbō depuis que tu l’as ouvert.`,"diffViewer.conflict.reload":`Recharger (perdre les modifs locales)`,"diffViewer.conflict.keep":`Garder les miennes`,"diffViewer.conflict.overwrite":`Écraser quand même`,"diffViewer.conflict.overwriteHint":`Remplace le fichier sur le disque par ta version. L’autre modification est perdue.`,"diffViewer.conflict.keepHint":`Garde tes modifications dans l’éditeur et adopte la nouvelle signature du disque, pour que la prochaine sauvegarde fonctionne.`,"diffViewer.saveBlocked":`L’agent tourne — arrête-le pour enregistrer tes modifications.`,"diffViewer.unsavedBanner":`Modifications non enregistrées. Arrête l’agent pour les sauvegarder.`,"diffViewer.closeConfirm.title":`Modifications non enregistrées`,"diffViewer.closeConfirm.message":`Ce fichier contient des modifications jamais enregistrées. Fermer le visualiseur de diff les perdra.`,"diffViewer.closeConfirm.discard":`Fermer sans enregistrer`,"diffViewer.criteriaRail":`Checklist de revue`,"diffViewer.criteriaRailShow":`Afficher la checklist de revue`,"diffViewer.criteriaRailHide":`Masquer la checklist de revue`,"diffViewer.fileTreeShow":`Afficher l’arbre des fichiers`,"diffViewer.fileTreeHide":`Masquer l’arbre des fichiers`,"diffViewer.closeConfirm.saveAndClose":`Enregistrer et fermer`,"diffViewer.agentRunning":`L’agent tourne — arrête-le pour éditer`,"diffViewer.fileDeleted":`Fichier supprimé`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentQuestion":`{name} — L'agent te pose une question`,"notification.agentPermissionRequest":`{name} — L'agent demande une permission`,"notification.autoLoopCompleted":`{name} — Auto-loop terminé`,"notification.autoLoopStalled":`{name} — Auto-loop bloqué (aucun progrès)`,"notification.autoLoopError":`{name} — Auto-loop arrêté sur erreur`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pause, en attente de votre précision`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop a forcé le mode plan en bypass`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.editDescription":`Modifier la description`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"contextMenu.unarchiveDisabledPurged":"Le worktree a été supprimé du disque. Recrée-le manuellement (`gh pr checkout` ou `git worktree add`) — Kōbō détecte la restauration dans les 30 s et réactive le workspace automatiquement.","workspaceList.unarchiveBlockedPurged":"Impossible de désarchiver : le worktree n'existe plus sur le disque. Recrée-le manuellement (`gh pr checkout` ou `git worktree add`) — Kōbō le détecte dans les 30 s et réactive le workspace.","contextMenu.purgeWorktree":`Libérer l'espace disque (supprimer le worktree)`,"contextMenu.purgeWorktreeTooltip":`Supprime le worktree du disque pour récupérer de l'espace — l'historique des messages et sessions est conservé. Archive automatiquement le workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Libérer l'espace disque ?`,"contextMenu.purgeWorktreeDialogMessage":`Le dossier worktree de « {name} » va être supprimé du disque. L'historique des messages et sessions est conservé. Le workspace sera archivé automatiquement. Cette action ne peut pas être annulée dans la version actuelle.`,"contextMenu.purgeWorktreeDialogConfirm":`Supprimer le worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree supprimé — espace disque récupéré.`,"settings.autoPurgeOnPrMerged":`Purger le worktree quand la PR est mergée`,"settings.autoPurgeOnPrMergedHint":`Quand activé, le worktree est supprimé du disque dès que la PR est mergée (en plus de l'archivage auto). L'historique des messages est conservé.`,"settings.autoLoopMaxRetries":`Nombre maximal de nouvelles tentatives`,"settings.autoLoopMaxRetriesHint":`Arrête l'auto-loop après ce nombre d'erreurs de quota ou d'erreurs serveur temporaires.`,"settings.retentionTitle":`Rétention de l'historique de conversation (désactivée par défaut)`,"settings.retentionWarning":`Activer cette option supprime définitivement de la base l'historique de conversation des agents, à commencer par tout ce qui est déjà plus vieux que la fenêtre. Les événements supprimés sont irrécupérables.`,"settings.retentionHint":`Exécutée une fois au démarrage du serveur. Les workspaces, tâches, sessions, branches et worktrees ne sont jamais touchés — seule la sortie enregistrée des agents l'est.`,"settings.retentionDaysLabel":`Supprimer les événements plus vieux que (jours)`,"settings.retentionDaysHint":`0 — la valeur par défaut — conserve tous les événements indéfiniment. Renseignez une valeur pour activer la rétention.`,"settings.retentionKeepLabel":`Événements toujours conservés par workspace`,"settings.retentionKeepHint":`Les événements les plus récents de chaque workspace survivent quel que soit leur âge, pour qu'un workspace ancien mais toujours ouvert garde un historique lisible. Suggéré : 5000.`,"settings.retentionDisabledHint":`Rétention désactivée : rien ne sera jamais supprimé.`,"settings.retentionConfirmTitle":`Supprimer définitivement de l'historique de conversation ?`,"settings.retentionConfirmMessage":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, {count} des {total} événements d'agent enregistrés — y compris tout ce qui est déjà plus ancien. C'est irréversible. Continuer ?`,"settings.retentionConfirmMessageUnknown":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, tous les événements d'agent plus anciens — y compris tout ce qui est déjà accumulé. Le volume exact n'a pas pu être calculé. C'est irréversible. Continuer ?`,"settings.purgeDocsTitle":`Comment ça marche — restauration & permissions`,"settings.purgeDocsRestoreTitle":`Restaurer un worktree purgé (détection automatique)`,"settings.purgeDocsRestoreIntro":`Un workspace purgé conserve son historique de chat et les métadonnées de la PR, mais le dossier worktree n'existe plus. Recrée-le manuellement avec l'une de ces commandes — Kōbō détecte la réapparition du dossier dans les 30 secondes et réactive automatiquement le workspace (désarchive + clear flag purge) :`,"settings.purgeDocsRestoreCommands":`# GitHub (via le CLI gh) :
|
|
61
61
|
gh pr checkout [numéro-pr] --recurse-submodules
|
|
62
62
|
|
|
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`,"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":`Modifica i quattro prompt qui sotto tu stesso. Parte dalla base agnostica.`,"settings.skillSuite.reloadDefaults":`Ripristina predefiniti`,"settings.skillSuite.reloadDefaultsConfirm":`Sostituire i quattro prompt personalizzati con i valori agnostici predefiniti?`,"settings.skillSuite.customPrompts":`Prompt personalizzati`,"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`},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
|
|
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)
|
|
@@ -73,10 +73,10 @@ KOBO_WORKSPACE_ID — id Kōbō del workspace (stabile dopo rinomina)
|
|
|
73
73
|
KOBO_WORKSPACE_NAME — nome visualizzato del workspace
|
|
74
74
|
KOBO_FORGE — forge risolta: github / gitlab / none
|
|
75
75
|
KOBO_PR_NUMBER — numero della PR/MR sulla forge risolta (vuoto se nessuna aperta)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
|
|
76
|
-
# il tuo script — usa $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Ripristina il predefinito Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Ripristinare lo script?`,"settings.changeSourceBranchScript.replaceConfirm":`Le tue modifiche verranno sostituite dallo script predefinito di Kōbō. Continuare?`,"settings.cleanupScriptHint":`Script di shell eseguito nel worktree dopo ogni sessione dell'agente. In modalità auto-loop viene eseguito solo quando tutte le attività sono completate. Lascia vuoto per disattivare.`,"settings.cleanupScriptPlaceholder":`es. eliminare file temporanei, fermare container…`,"settings.cleanupScriptMode":`Quando eseguire`,"settings.cleanupScriptMode.idle":`Dopo ogni sessione — anche se restano attività`,"settings.cleanupScriptMode.noTasks":`Solo quando non resta nessuna attività Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Eseguire solo se file sono stati modificati, aggiunti o eliminati`,"settings.cleanupScriptMode.inherit":`Eredita l'impostazione globale`,"settings.taskPromptTemplate":`Prompt di attività`,"settings.taskPromptTemplatePlaceholder":`Prompt inserito automaticamente nella descrizione dell'attività…`,"settings.taskPromptTemplateHint":`Iniettato automaticamente nella descrizione dell'attività nella pagina di creazione quando questo progetto è selezionato. Se non viene modificato, viene sostituito al cambio di progetto; appena lo modifichi, il tuo testo viene mantenuto.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Eseguito con bash nel worktree dopo la creazione, prima dell'avvio dell'agente. Nessun shebang necessario. In caso di errore, il workspace viene impostato su errore. Timeout: 5 minuti.`,"settings.e2e.title":`Test E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Nessuno`,"settings.e2e.frameworkOther":`Altro`,"settings.e2e.skill":`Skill (opzionale)`,"settings.e2e.skillPlaceholder":`es. cypress-tester`,"settings.e2e.prompt":`Linee guida personalizzate (opzionale)`,"settings.e2e.promptPlaceholder":`es. usare il pattern page-object, mirare a data-testid`,"settings.e2e.helpText":`Quando configurato, l'agente di grooming auto-loop inserisce sotto-task E2E per funzionalità UI.`,"settings.finalization.title":`Finalizzazione dell'auto-loop`,"settings.finalization.helpText":`Opzionale: un prompt che l'agente esegue come ultima iterazione dell'auto-loop. Tipicamente usato per controlli di qualità finali (lint, typecheck, test). La fase di grooming creerà un task con prefisso [FINAL] che userà questo prompt.`,"settings.finalization.prompt":`Prompt di finalizzazione`,"settings.finalization.promptPlaceholder":`es. Esegui npm run lint e npm test, poi marca questo task come fatto.`,"settings.editorCommand":`Comando editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando per aprire il worktree nel proprio editor. Il percorso del worktree viene passato come argomento.`,"settings.fileManagerCommand":`Comando file manager`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Comando per aprire il worktree nel proprio file manager. Il percorso del worktree viene passato come argomento. Lascia vuoto per nascondere il pulsante.`,"settings.terminalCommand":`Comando del terminale`,"settings.terminalCommandHint":`Comando per avviare il terminale nel worktree. Segnaposto {path} opzionale per la directory.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Selezione MCP Claude`,"settings.mcpAutoSelect":`Auto (primo MCP attivo corrispondente)`,"settings.notionMcp":`Chiave MCP Notion`,"settings.sentryMcp":`Chiave MCP Sentry`,"settings.mcpSelectionHint":`Le voci attive vengono lette da ~/.claude.json. Lascia Auto per usare il comportamento predefinito.`,"settings.configuredProjects":`Progetti configurati`,"settings.noProjects":`Nessun progetto configurato`,"settings.addProject":`Aggiungi progetto`,"settings.copyFrom":`Copia impostazioni da`,"settings.copyFromPlaceholder":`(nessuno — parti dai valori predefiniti)`,"settings.copyFromHint":`Copia tutte le impostazioni tranne path, nome e branch sorgente.`,"settings.copyFromConfirmTitle":`Sovrascrivere i valori attuali?`,"settings.copyFromConfirm":`Sovrascriverà i valori del modulo con le impostazioni di "{project}". Continuare?`,"settings.newProject":`Nuovo progetto`,"settings.editProject":`Modifica progetto`,"settings.onboardingTitle":`Tour guidato`,"settings.onboardingHint":`Rivedi la presentazione dei principali elementi dell’interfaccia.`,"settings.onboardingReplay":`Rivedi il tour guidato`,"onboarding.list.title":`Spazi di lavoro`,"onboarding.list.description":`Ogni missione vive nel proprio spazio — un git worktree, un branch e una sessione dell’agente dedicati. Appaiono tutti qui.`,"onboarding.create.title":`Creare uno spazio di lavoro`,"onboarding.create.description":`Clicca su + per avviare una nuova missione — da un ticket Notion, una issue Sentry o da zero.`,"onboarding.search.title":`Ricerca`,"onboarding.search.description":`Filtra i tuoi spazi di lavoro per nome, o cerca nella cronologia delle conversazioni degli agenti.`,"onboarding.health.title":`Stato`,"onboarding.health.description":`Controlla lo stato di Kōbō: database, agenti attivi, integrazioni, backup.`,"onboarding.changelog.title":`Novità`,"onboarding.changelog.description":`Sfoglia le ultime release di Kōbō: nuove funzionalità, correzioni, modifiche di comportamento. Compare un indicatore quando è disponibile una release non ancora letta.`,"onboarding.settings.title":`Impostazioni`,"onboarding.settings.description":`Modelli, script del ciclo di vita, integrazioni, voce — tutta la configurazione di Kōbō è qui. Clicca su Avanti per un tour di ogni sezione.`,"onboarding.settings-general.title":`Generale`,"onboarding.settings-general.description":`Lingua dell’interfaccia, progetto predefinito e comportamento globale applicato a ogni nuovo workspace.`,"onboarding.settings-agents.title":`Agenti e modelli`,"onboarding.settings-agents.description":`Scegli il motore predefinito — Claude Code o Codex —, il modello e la modalità di permessi degli agenti.`,"onboarding.settings-skills.title":`Skill`,"onboarding.settings-skills.description":`Scegli la suite di skill caricata dagli agenti: il preset consigliato o la tua selezione personalizzata.`,"onboarding.settings-prompts.title":`Prompt`,"onboarding.settings-prompts.description":`Modello di descrizione della PR e altri testi di prompt riutilizzabili dagli agenti.`,"onboarding.settings-scripts.title":`Script`,"onboarding.settings-scripts.description":`Script del ciclo di vita eseguiti su cleanup, archiviazione e setup del workspace — globali o per progetto.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Collega il tuo token di integrazione Notion per importare ticket come missioni di workspace.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Importa una issue di Sentry come fonte di verità di un workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Scegli GitHub, GitLab o nessuna, per progetto. Kōbō usa la tua CLI gh / glab — non include credenziali.`,"onboarding.settings-voice.title":`Voce`,"onboarding.settings-voice.description":`Dettatura vocale: attivala, scegli il modello Whisper e gestisci il runtime di riconoscimento vocale locale.`,"onboarding.settings-notifications.title":`Notifiche`,"onboarding.settings-notifications.description":`Notifiche sonore e del browser per eventi e cambi di stato degli agenti.`,"onboarding.settings-worktrees.title":`Worktree`,"onboarding.settings-worktrees.description":`Prefissi dei branch Git e la cartella in cui vengono creati i worktree dei workspace.`,"onboarding.settings-worktrees-purge.title":`Liberare spazio su disco automaticamente`,"onboarding.settings-worktrees-purge.description":"Attiva questo toggle perché Kōbō elimini la cartella worktree (spesso centinaia di MB di node_modules / vendor) non appena una PR viene mergeata. La cronologia chat e i metadati della PR sono conservati. Puoi ricreare il worktree più tardi con `gh pr checkout <pr>` — Kōbō rileva automaticamente il ripristino entro 30 secondi e riattiva il workspace.","onboarding.settings-projects.title":`Progetti`,"onboarding.settings-projects.description":`Registra i repository su cui lavori. Clicca su «Aggiungi un progetto» per puntare Kōbō a un repository locale — ogni workspace mira a uno di questi progetti.`,"onboarding.settings-templates.title":`Modelli`,"onboarding.settings-templates.description":`La tua libreria di modelli di prompt riutilizzabili — scegline uno per precompilare il brief durante la creazione di un workspace.`,"onboarding.settings-export.title":`Importa / Esporta`,"onboarding.settings-export.description":`Esegui il backup o condividi la configurazione di Kōbō ed esporta i dati dei workspace in un file.`,"onboarding.firstWorkspace.title":`Crea il tuo primo workspace`,"onboarding.firstWorkspace.description":`È tutto qui: una missione, un worktree, un agente. Apri la pagina di creazione per iniziare.`,"onboarding.next":`Avanti`,"onboarding.prev":`Indietro`,"onboarding.done":`Fatto`,"onboarding.exitConfirm":`Uscire dal tour guidato? Puoi rivederlo in qualsiasi momento dalle Impostazioni.`,"settings.projectGroup.identity":`Identità`,"settings.projectGroup.defaults":`Valori predefiniti`,"settings.projectGroup.prompts":`Prompt`,"settings.projectGroup.scripts":`Script`,"settings.projectPath":`Percorso del progetto`,"settings.projectPathPlaceholder":`/percorso/del/progetto`,"settings.displayName":`Nome visualizzato`,"settings.displayNamePlaceholder":`Il mio progetto`,"settings.defaultSourceBranch":`Branch sorgente predefinito`,"settings.defaultModel.project":`Modello predefinito`,"settings.skipPermissions.project":`Salta le richieste di permesso`,"settings.prPromptTemplate.project":`Template del prompt PR`,"settings.prPromptPlaceholder.project":`Istruzioni specifiche del progetto per la creazione di PR...`,"settings.reviewPromptTemplate.project":`Template del prompt di revisione`,"settings.ciFixPromptTemplate.project":`Template del prompt «Ripara CI»`,"settings.gitConventions.project":`Convenzioni Git (per progetto)`,"settings.gitConventionsEmpty":`Lascia vuoto per usare le convenzioni globali.`,"settings.notionStatus":`Stato ticket Notion`,"settings.notionStatusProperty":`Nome della proprietà`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valore da impostare`,"settings.notionInProgressStatusPlaceholder":`In corso, In progress...`,"settings.notionStatusHint":`Quando un workspace viene creato con un ticket Notion, la proprietà specificata viene impostata a questo valore. Entrambi i campi sono obbligatori. Lasciare vuoto per disattivare.`,"settings.notionAssignee":`Assegnazione Notion`,"settings.notionAssigneeHint":`Quando un workspace viene creato con un ticket Notion, l'utente autenticato sull'MCP Notion viene aggiunto a questa proprietà People — solo se non ha già un assegnatario. Lasciare vuoto per disattivare.`,"settings.notionAssigneeProperty":`Nome della proprietà`,"settings.notionAssigneePropertyPlaceholder":`Sviluppatori, Assignees...`,"settings.notionUserId":`Il tuo UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Seleziona il tuo account nella lista. Notion rifiuta l'assegnazione di bot nelle proprietà People — questo campo è obbligatorio per attivare l'auto-assegnazione.`,"settings.notionUsersRefresh":`Aggiorna`,"settings.notionUsersLoading":`Caricamento utenti Notion…`,"settings.notionUsersLoadFailed":`Impossibile caricare la lista: {error}`,"settings.notionUsersManualFallback":`Lista non disponibile — incolla il tuo UUID Notion manualmente.`,"settings.devServer":`Server di sviluppo`,"settings.devServerStart":`Script di avvio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script di arresto`,"settings.devServerStopPlaceholder":`Opzionale — il processo verrà terminato automaticamente se vuoto`,"settings.selectProject":`Seleziona un progetto o aggiungine uno nuovo`,"settings.projectPathRequired":`Il percorso del progetto è obbligatorio.`,"settings.useGlobal":`Usa globale`,"settings.saved":`Impostazioni globali salvate.`,"settings.unsavedChanges":`Modifiche non salvate`,"settings.nav.general":`Generale`,"settings.nav.agents":`Agenti`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompt`,"settings.nav.scripts":`Script`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Le credenziali restano locali e sono usate solo da bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voce`,"settings.nav.notifications":`Notifiche`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Esporta`,"settings.openNav":`Apri la navigazione`,"settings.saveError":`Errore durante il salvataggio delle impostazioni.`,"settings.projectSaved":`Progetto salvato.`,"settings.projectSaveError":`Errore durante il salvataggio del progetto.`,"settings.projectDeleted":`Progetto eliminato.`,"settings.deleteProjectConfirmTitle":`Eliminare il progetto?`,"settings.deleteProjectConfirmMessage":`Rimuovere «{name}» dai tuoi progetti? Questo elimina solo le impostazioni Kōbō — il codice e i worktree restano intatti.`,"settings.projectDeleteError":`Errore durante l'eliminazione del progetto.`,"templates.title":`Template`,"templates.newTemplate":`Nuovo template`,"templates.editTemplate":`Modifica template`,"templates.deleteTemplate":`Elimina template`,"templates.deleteConfirm":`Eliminare il template '/{slug}'?`,"templates.deleteConfirmMessage":`Questa azione non può essere annullata.`,"templates.slug":`Slug`,"templates.slugHint":`Minuscole, cifre, trattini. Max 64 caratteri.`,"templates.slugInvalid":`Lo slug può contenere solo minuscole, cifre e trattini`,"templates.slugDuplicate":`Un template con questo slug esiste già`,"templates.description":`Descrizione`,"templates.descriptionHint":`Etichetta breve mostrata nel dropdown.`,"templates.descriptionRequired":`La descrizione è obbligatoria`,"templates.contentRequired":`Il contenuto è obbligatorio`,"templates.content":`Contenuto`,"templates.contentHint":`Contenuto del template. Usa {variable_name} per le sostituzioni.`,"templates.availableVars":`Variabili disponibili`,"templates.filePath":`File: {path}`,"templates.empty":`Nessun template ancora.`,"templates.createFailed":`Creazione del template fallita`,"templates.updateFailed":`Aggiornamento del template fallito`,"templates.deleteFailed":`Eliminazione del template fallita`,"templates.save":`Salva`,"templates.create":`Crea`,"templates.reloadDefaults":`Ricarica i template predefiniti`,"templates.reloadDefaultsHint":`Aggiunge solo i template predefiniti mancanti. I template esistenti (modificati o meno) non vengono mai sovrascritti.`,"templates.reloadDefaultsConfirmMessage":`Questa azione aggiungerà alla lista i template predefiniti mancanti. I template esistenti — comprese le tue personalizzazioni — non saranno toccati. Se vuoi ripristinare un template predefinito che hai modificato, eliminalo prima e rilancia questa azione.`,"templates.reloadDefaultsSuccess":`{added} aggiunto/i, {kept} mantenuto/i`,"templates.reloadDefaultsFailed":`Ricarica dei template predefiniti fallita`,"templates.resetToDefault":`Ripristina predefinito`,"templates.resetConfirmTitle":`Ripristinare il template al predefinito?`,"templates.resetConfirmMessage":`Sovrascrive le tue modifiche locali a /{slug} con il predefinito. Non annullabile.`,"templates.resetSuccess":`Template /{slug} ripristinato al predefinito`,"templates.resetFailed":`Ripristino del template non riuscito`,"chatInput.dropdownSkills":`Skill Claude`,"chatInput.dropdownKobo":`Comandi Kōbō`,"chatInput.dropdownTemplates":`Template`,"documents.title":`Documenti`,"documents.empty":`Nessun documento trovato`,"documents.refresh":`Aggiorna`,"documents.back":`Indietro`,"documents.loadFailed":`Caricamento del documento fallito`,"git.title":`Git`,"git.outputDialogTitle":`Git ha segnalato un errore`,"git.statsFailed":`Impossibile leggere lo stato git`,"git.section.repository":`Repository`,"git.section.changes":`Modifiche`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Azioni`,"git.actions.more":`Altre`,"git.localOnly":`solo locale`,"git.pushed":`pushed`,"git.unpushed":`{count} non pushati`,"git.commits":`{count} commit | {count} commit`,"git.commits.loading":`Caricamento commit…`,"git.commits.empty":`Nessun commit su questo branch`,"git.commits.pushed":`Pushato`,"git.commits.unpushed":`Non pushato`,"git.commits.clickToAppend":`clicca per aggiungere SHA alla chat`,"git.commits.diffThisCommit":`Diff di questo commit (vs parent)`,"git.compareCommits":`Confronta commit…`,"git.files":`{count} file | {count} file`,"git.staged":`{count} staged`,"git.modified":`{count} modificati`,"git.untracked":`{count} non tracciati`,"git.workingTreeEmpty":`Nessuna modifica non committata`,"git.fileStaged":`In stage`,"git.fileModified":`Modificato`,"git.fileUntracked":`Non tracciato`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Più sicuro di --force: il push viene rifiutato se il remoto ha commit che non hai visto. Da usare dopo un rebase o amend di commit già pushati.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`Nessun upstream per questo branch — fai push prima per abilitare Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push del branch prima`,"git.viewRequest":`Visualizza {request}`,"git.createRequest":`Crea {request}`,"git.changeRequestBase":`Cambia il branch base della {request}`,"git.forgeCliMissing":`{cli} non è installato — installalo per usare le funzioni {request}`,"git.forgeNotAuthenticated":`Non autenticato — esegui {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Rilevamento automatico`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Nessuna`,"git.pullConfirmTitle":`Pull della branch?`,"git.pullConfirmMessage":`Pull {branch} dal remoto (solo fast-forward).`,"git.branchPulled":`Branch aggiornata`,"git.pullFailed":`Pull fallito`,"git.renameBranch":`Rinomina branch`,"git.renameBranchPrompt":"Rinomina `{branch}` in:","git.renameBranchSuccess":"Branch rinominato in `{branch}`","git.renameBranchFailed":`Rinomina branch fallita`,"git.renameBranchExists":"Il branch `{branch}` esiste già localmente o su origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Apre il visualizzatore diff in modalità Review — commenti inline + invio batch all'agente`,"pr.baseChanged":`Base della PR cambiata: {oldBase} → {newBase}`,"pr.openPr":`Apri PR`,"pr.openWorkspace":`Apri il workspace`,"pr.dismiss":`Chiudi`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase del branch?`,"git.rebaseConfirmMessage":`Rebase su {branch}. Potrebbero verificarsi conflitti.`,"git.rebaseSuccess":`Rebase completato`,"git.rebaseFailed":`Rebase fallito`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repository aggiornato`,"git.fetchFailed":`Fetch non riuscito: {error}`,"git.mergeConfirmTitle":`Fondere il branch?`,"git.mergeConfirmMessage":`Fonde {branch} in questo branch. Possibili conflitti.`,"git.mergeSuccess":`Merge completato`,"git.mergeFailed":`Merge fallito`,"git.commitFailed":`Commit fallito`,"git.commitChanges":`Esegui commit delle modifiche`,"git.commitDialogTitle":`Esegui commit delle modifiche non salvate`,"git.commitDialogDescription":`Inserisci il tuo messaggio o chiedi all’agente di esaminare e creare il commit.`,"git.commitMessage":`Messaggio di commit`,"git.commitManual":`Esegui commit`,"git.commitWithAgent":`Chiedi all’agente`,"git.commitAgentSuccess":`Richiesta di commit inviata all’agente`,"git.discardFailed":`Scarto fallito`,"git.conflictTitleMerge":`Conflitti di merge rilevati`,"git.conflictTitleRebase":`Conflitti di rebase rilevati`,"git.operationPausedTitle":`Operazione Git da continuare`,"git.operationPausedSubtitle":`Nessun file è in conflitto. Git attende solo che tu continui l’operazione.`,"git.conflictSubtitle":`{count} file con conflitti. Scegli come continuare.`,"git.conflictAbortConfirmTitle":`Annullare la risoluzione del conflitto?`,"git.conflictAbortConfirmMessage":`Tutto ciò che hai risolto in questo {op} viene scartato e il worktree torna allo stato precedente. È irreversibile.`,"git.conflictAbort":`Annulla`,"git.conflictContinue":`Continua`,"git.conflictContinued":`Operazione Git continuata`,"git.conflictResolveWithAgent":`Chiedi all'agente di risolvere`,"git.conflictAborted":`Operazione annullata`,"git.conflictHandoffSuccess":`L'agente sta risolvendo i conflitti`,"git.dirtyTitleRebase":`Modifiche non committate bloccano il rebase`,"git.dirtyTitleMerge":`Modifiche non committate bloccano il merge`,"git.dirtyTitlePull":`Modifiche non committate bloccano il pull`,"git.dirtySubtitle":`{modified} modificato/i, {staged} in stage, {untracked} non tracciato/i. Scegli come procedere.`,"git.dirtyStash":`Stash e riprova`,"git.dirtyCommit":`Commit prima`,"git.dirtyCommitPlaceholder":`Messaggio di commit`,"git.dirtyCommitConfirm":`Commit e riprova`,"git.dirtyDiscard":`Scarta le modifiche`,"git.dirtyDiscardConfirmTitle":`Scartare tutte le modifiche non committate?`,"git.dirtyDiscardConfirmMessage":`Le modifiche tracciate andranno perse (git reset --hard). I file non tracciati vengono mantenuti. Azione irreversibile.`,"git.pushConfirmTitle":`Push del branch?`,"git.pushConfirmMessage":`Push di {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Push del branch`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBaseTitle":`Cambiare branch base`,"git.changePrBaseMessage":`Inserire il nuovo branch destinazione per la {request}.`,"git.changePrBaseSuccess":`Branch base della {request} aggiornato`,"git.changePrBaseFailed":`Impossibile cambiare il branch base della {request}`,"git.mergeRequest":`Unisci {request}`,"git.mergeRequestConfirmTitle":`Unire {request}?`,"git.mergeRequestConfirmMessage":`Questa azione unisce la {request} aperta nel suo branch di destinazione.`,"git.mergeRequestSuccess":`{request} unita`,"git.mergeRequestFailed":`Impossibile unire {request}`,"git.deleteRemoteBranch":`Elimina branch remoto`,"git.deleteRemoteBranchTitle":`Eliminare il branch remoto?`,"git.deleteRemoteBranchMessage":`La richiesta è stata unita. Eliminare il branch remoto {branch}?`,"git.deleteRemoteBranchSuccess":`Branch remoto {branch} eliminato`,"git.deleteRemoteBranchFailed":`Impossibile eliminare il branch remoto`,"git.changeSourceBranch":`Cambia il branch di origine`,"git.changeSourceBranchTitle":`Cambia il branch di origine`,"git.changeSourceBranchMessage":`Scegli il nuovo branch di origine. Il branch di lavoro verrà ricostruito sopra di esso.`,"git.changeSourceBranchDone":`Branch di origine cambiato in {branch}`,"git.changeSourceBranchAligned":`Branch di origine cambiato in {branch} (il branch non aveva commit propri)`,"git.changeSourceBranchTooMany":`Il branch ha troppi commit propri ({n}) — esegui il rebase manualmente`,"git.changeSourceBranchDirty":`Esegui commit o stash delle modifiche prima di cambiare il branch di origine`,"git.changeSourceBranchAgentRunning":`Ferma l'agente prima di cambiare il branch di origine`,"git.changeSourceBranchErrorTitle":`Cambio branch di origine fallito`,"git.changeSourceBranchErrorOngoing":`Un'operazione {op} è ancora in corso sul worktree. Annullala per tornare a uno stato pulito.`,"git.changeSourceBranchErrorAbort":`Annulla l'operazione`,"git.changeSourceBranchLoading":`Cambio del branch di origine…`,"git.changeSourceForcePushTitle":`Eseguire il force-push del branch riscritto?`,"git.changeSourceForcePushMessage":`La cronologia del branch è stata riscritta. Eseguire il push al remoto con --force-with-lease?`,"git.changeSourceForcePushDone":`Force-push del branch eseguito`,"git.openEditor":`Apri nell'editor`,"git.openEditorFailed":`Impossibile aprire l'editor`,"git.branchPushed":`Branch pushato`,"git.pushFirst":`Il branch non è sul remoto. Fai Push prima.`,"git.unpushedCommits":`I commit locali non sono pushati. Fai Push prima.`,"git.from":`da`,"git.aheadBehindTooltip":`{ahead} commits avanti, {behind} indietro rispetto a {source}`,"git.divergence.title":`Divergenza del branch`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} avanti`,"git.divergence.behind":`↓ {count} indietro`,"git.divergence.empty.ahead":`Nessun commit avanti.`,"git.divergence.empty.behind":`Nessun commit indietro.`,"git.divergence.close":`Chiudi`,"git.divergence.loading":`Caricamento commit…`,"git.divergence.failed":`Impossibile caricare la divergenza`,"git.divergence.retry":`Riprova`,"git.prCreated":`{request} #{n} creata`,"git.pr.author":`Autore`,"git.pr.reviewers":`Revisori`,"git.pr.assignees":`Assegnati`,"git.pr.labels":`Etichette`,"git.pr.changesRequestedBadge":`Modifiche richieste`,"git.pr.approvedBadge":`Approvata`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI fallita`,"git.pr.ci.pending":`CI in corso`,"git.pr.ci.failedCount":`{n} falliti`,"git.pr.ci.pendingCount":`{n} in corso`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} saltati`,"git.pr.ci.showPassed":`Mostra {n} job riusciti`,"git.pr.ci.hidePassed":`Nascondi i job riusciti`,"toast.prChangesRequested":`Sono state richieste modifiche per la PR #{n}`,"toast.prApproved":`La PR #{n} è stata approvata`,"toast.prReadyToMerge":`La PR #{n} è pronta per il merge`,"toast.prCiFailed":`La CI della PR #{n} non è riuscita`,"toast.prCiRecovered":`La CI della PR #{n} è stata ripristinata`,"toast.prMergeConflict":`La PR #{n} ha conflitti di merge`,"toast.prMerged":`La PR #{n} è stata unita`,"devServer.title":`Server di sviluppo`,"devServer.noWorkspace":`Nessun workspace selezionato`,"devServer.notConfigured":`Non configurato —`,"devServer.goToSettings":`Impostazioni`,"devServer.logs":`Log`,"devServer.running":`In esecuzione`,"devServer.starting":`Avvio in corso`,"devServer.stopping":`Arresto in corso`,"devServer.error":`Errore`,"devServer.stopped":`Arrestato`,"devServer.unknown":`Sconosciuto`,"devServer.containers":`{count} container | {count} container`,"devServer.logDialog.title":`Log del server di sviluppo`,"devServer.logDialog.empty":`Nessun log disponibile`,"notion.title":`Notion`,"tasks.title":`Attività`,"notion.addTask":`Aggiungi task`,"notion.noUrl":`Nessun URL Notion`,"notion.subtasks":`{done}/{total} sottotask`,"notion.noTasks":`Nessun task`,"notion.newTask":`Nuovo task... (Invio per aggiungere, Esc per annullare)`,"acceptance.title":`Criteri di accettazione`,"acceptance.addCriterion":`Aggiungi criterio`,"acceptance.newCriterion":`Nuovo criterio... (Invio per aggiungere, Esc per annullare)`,"acceptance.empty":`Nessun criterio di accettazione`,"tasks.askProgress":`Chiedere all'agente di verificare il progresso`,"agentTodos.title":`Todo dell'agente`,"agentTodos.empty":`Nessun todo dell'agente`,"subagents.title":`Sub-agenti`,"subagents.empty":`Nessuna attività dei sub-agenti ancora`,"subagents.tools":`{count} strumenti`,"subagents.running":`In esecuzione: `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket utilizzo {n}`,"quotaFooter.lastUpdated":`Ultimo aggiornamento: {time}`,"quotaFooter.empty":`Caricamento…`,"quotaFooter.popover.title":`Utilizzo Claude Code`,"quotaFooter.popover.refreshNow":`Aggiorna`,"quotaFooter.popover.resetsIn":`Reset alle {value}`,"quotaFooter.popover.unauthenticated":`Auth richiesta`,"quotaFooter.popover.unauthenticatedHint":`Esegui "claude" una volta per autenticarti.`,"quotaFooter.popover.error":`Errore`,"quotaFooter.bucket.fiveHour":`5 ore`,"quotaFooter.bucket.sevenDay":`7 giorni`,"agent.error.spawn_failed":`Impossibile avviare l'agente`,"agent.error.parse_error":`Impossibile analizzare un messaggio dell'agente`,"agent.error.rate_limit":`Limite di frequenza raggiunto`,"agent.error.resume_failed":`Sessione non trovata — avvio di una nuova sessione`,"agent.error.other":`Errore dell'agente`,"quotaBackoff.banner.title":`Ripresa automatica alle {time}`,"quotaBackoff.banner.tooltip":`Quota Claude esaurita. L'auto-loop riprenderà automaticamente quando la quota si reimposta alle {resets_at}.`,"quotaBackoff.banner.cancel":`Annulla ripresa`,"quotaBackoff.cancelled":`Ripresa automatica annullata — puoi riprendere manualmente in qualsiasi momento`,"rateLimitType.fiveHour":`Sessione 5h`,"rateLimitType.sevenDay":`Settimanale`,"tooltip.addTask":`Aggiungi task`,"tooltip.removeTask":`Rimuovi task`,"tooltip.addCriterion":`Aggiungi criterio`,"tooltip.removeCriterion":`Rimuovi criterio`,"tooltip.startDevServer":`Avvia server di sviluppo`,"tooltip.stopDevServer":`Arresta server di sviluppo`,"tooltip.closeDiffViewer":`Chiudi diff`,"tooltip.refreshLogs":`Aggiorna log`,"tooltip.closeDialog":`Chiudi`,"tooltip.refreshGitStats":`Aggiorna statistiche Git`,"tooltip.removeImage":`Rimuovi immagine`,"tooltip.sendMessage":`Invia messaggio`,"tools.title":`Strumenti`,"tools.runSetupScript":`Rieseguire script di setup`,"tools.runSetupScriptTooltip":`Eseguire lo script di setup del progetto nel worktree`,"tools.runSetupScriptConfirm":`Rieseguire lo script di setup in questo workspace? Gli artefatti esistenti potrebbero essere sovrascritti.`,"tools.runSetupScriptBusy":`Impossibile rieseguire il setup mentre l'agent sta lavorando.`,"tools.noSetupScript":`Nessun script di setup configurato —`,"tools.setupScriptSuccess":`Script di setup completato con successo.`,"tools.setupScriptFailed":`Script di setup fallito.`,"tools.openNotion":`Apri in Notion`,"tools.openSentry":`Apri in Sentry`,"tools.review":`Revisiona modifiche`,"tools.reviewTooltip":`Chiedi all'agente di rivedere le modifiche di questo branch`,"tools.reviewBusy":`Agente occupato — attendi che sia libero`,"tools.fixCi":`Ripara CI`,"tools.fixCiTooltip":`Chiedi all'agente di diagnosticare e correggere i job di CI in errore`,"tools.fixCiLaunched":`Azione «Ripara CI» inviata all'agente`,"tools.fixCiFailed":`Impossibile avviare l'azione «Ripara CI»`,"tools.openFileManager":`Apri nel file manager`,"tools.openFileManagerTooltip":`Apri la cartella del worktree nel tuo file manager configurato`,"tools.openFileManagerFailed":`Impossibile aprire il file manager`,"tools.openTerminal":`Apri nel terminale`,"tools.openTerminalTooltip":`Apri il worktree nel terminale configurato`,"tools.openTerminalFailed":`Impossibile aprire il terminale`,"review.title":`Avvia revisione`,"review.subtitle":`Chiedi all'agente di rivedere le modifiche e dare un feedback.`,"review.additionalInstructions":`Istruzioni aggiuntive (opzionale)`,"review.additionalInstructionsPlaceholder":`Aggiungi istruzioni specifiche per la revisione…`,"review.newSession":`Nuova sessione`,"review.newSessionHint":`Avvia una nuova sessione invece di continuare quella attuale.`,"review.start":`Avvia revisione`,"review.cancel":`Annulla`,"review.launched":`Revisione avviata`,"review.failed":`Impossibile avviare la revisione`,"diff.title":`Diff`,"diff.side":`Affiancato`,"diff.inline":`In linea`,"diff.hideUnchanged":`Nascondi codice invariato`,"diff.showUnchanged":`Mostra codice invariato`,"diff.showUntracked":`Mostra file non tracciati`,"diff.hideUntracked":`Nascondi file non tracciati`,"diff.rollbackToRemote":`Ripristina alla versione remota`,"diff.rollbackConfirm":`Ripristinare {path} alla sua versione remota (origin)? Le modifiche locali a questo file andranno perse.`,"diff.rollbackConfirmOk":`Ripristina`,"diff.rollbackDone":`File ripristinato alla versione remota`,"diff.rollbackDoneRemote":`File ripristinato alla versione remota`,"diff.rollbackDoneHead":`Modifiche locali annullate (file ripristinato all'ultimo commit)`,"diff.rollbackDoneDeleted":`File non tracciato eliminato`,"diff.deleteUntracked":`Elimina file non tracciato`,"diff.deleteUntrackedConfirm":`Eliminare definitivamente {path}? Questo file non è tracciato da git — il suo contenuto andrà perso.`,"diff.deleteUntrackedConfirmOk":`Elimina`,"diff.rollbackFailed":`Rollback fallito`,"diff.rollbackFailedDetail":`Rollback non riuscito: {error}`,"diff.modeInspect":`Modifica`,"diff.modeReview":`Review`,"diff.addComment":`Aggiungi commento`,"diff.replyComment":`Rispondi`,"diff.editComment":`Modifica`,"diff.deleteComment":`Elimina`,"diff.deleteCommentConfirm":`Eliminare questo commento?`,"diff.commentPlaceholder":`Scrivi un commento di revisione… (Markdown supportato)`,"diff.reviewDraft":`Bozza di revisione`,"diff.reviewEmpty":`Nessun commento — passa sopra una riga del diff e clicca + per aggiungerne uno.`,"diff.reviewGlobalPlaceholder":`Messaggio generale di revisione (opzionale)`,"diff.submitReview":`Invia revisione ({n})`,"diff.reviewSubmitted":`Revisione inviata all'agente`,"diff.reviewSubmitFailed":`Invio della revisione fallito: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Non pushato`,"diff.noChanges":`Nessuna modifica`,"diff.searchFiles":`Cerca file…`,"diff.noFileMatch":`Nessun file corrispondente`,"diff.selectFile":`Seleziona un file per visualizzare il diff`,"diff.fileLoadFailed":`Impossibile caricare questo diff`,"diff.fileLoadFailedHint":`Il file su disco è intatto — è fallito solo il caricamento del diff.`,"diff.fileListLoadFailed":`Impossibile caricare l’elenco dei file`,"diff.fileListLoadFailedHint":`È una richiesta fallita, non un branch senza modifiche.`,"diff.addToChat":`Aggiungi alla chat`,"diff.compareTitle":`Confronta commit`,"diff.compareFrom":`Da`,"diff.compareTo":`A`,"diff.compareSubmit":`Confronta`,"diff.compareSourceBase":`{branch} (base del branch)`,"diff.commitsReadOnly":`sola lettura`,"diffViewer.save":`Salva`,"diffViewer.savedAt":`Salvato`,"diffViewer.saveFailed":`Salvataggio non riuscito`,"diffViewer.saveFailedDetail":`Salvataggio non riuscito: {error}`,"diffViewer.unsavedChanges.title":`Modifiche non salvate`,"diffViewer.unsavedChanges.message":`Hai modifiche non salvate. Cosa vuoi fare?`,"diffViewer.unsavedChanges.save":`Salva`,"diffViewer.unsavedChanges.cancel":`Annulla`,"diffViewer.conflict.title":`File modificato su disco`,"diffViewer.conflict.message":`Il file è stato modificato fuori da Kōbō da quando lo hai aperto.`,"diffViewer.conflict.reload":`Ricarica (scarta locali)`,"diffViewer.conflict.keep":`Mantieni le mie`,"diffViewer.conflict.overwrite":`Sovrascrivi comunque`,"diffViewer.conflict.overwriteHint":`Sostituisce il file sul disco con la tua versione. L’altra modifica va persa.`,"diffViewer.conflict.keepHint":`Mantiene le tue modifiche nell’editor e adotta la nuova firma del disco, così il prossimo salvataggio funziona.`,"diffViewer.saveBlocked":`L’agente è in esecuzione — fermalo per salvare le tue modifiche.`,"diffViewer.unsavedBanner":`Modifiche non salvate. Ferma l’agente per salvarle.`,"diffViewer.closeConfirm.title":`Modifiche non salvate`,"diffViewer.closeConfirm.message":`Questo file contiene modifiche mai salvate. Chiudere il visualizzatore di diff le scarta.`,"diffViewer.closeConfirm.discard":`Chiudi senza salvare`,"diffViewer.criteriaRail":`Checklist di revisione`,"diffViewer.criteriaRailShow":`Mostra la checklist di revisione`,"diffViewer.criteriaRailHide":`Nascondi la checklist di revisione`,"diffViewer.fileTreeShow":`Mostra l’albero dei file`,"diffViewer.fileTreeHide":`Nascondi l’albero dei file`,"diffViewer.closeConfirm.saveAndClose":`Salva e chiudi`,"diffViewer.agentRunning":`L’agente è in esecuzione — fermalo per modificare`,"diffViewer.fileDeleted":`File eliminato`,"notification.agentFinished":`{name} — Agente terminato`,"notification.agentQuestion":`{name} — L'agente sta facendo una domanda`,"notification.agentPermissionRequest":`{name} — L'agente richiede un permesso`,"notification.autoLoopCompleted":`{name} — Auto-loop completato`,"notification.autoLoopStalled":`{name} — Auto-loop bloccato (nessun progresso)`,"notification.autoLoopError":`{name} — Auto-loop fermato per errore`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop in pausa, in attesa del tuo chiarimento`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop ha forzato la modalità plan a bypass`,"notification.agentError":`{name} — Errore agente`,"contextMenu.rename":`Rinomina`,"contextMenu.editDescription":`Modifica descrizione`,"contextMenu.copyPath":`Copia percorso worktree`,"contextMenu.openEditor":`Apri nell'editor`,"contextMenu.openFileManager":`Apri nel file manager`,"contextMenu.unarchiveDisabledPurged":"Il worktree è stato eliminato dal disco. Ricrealo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō rileva il ripristino entro 30 s e riattiva automaticamente il workspace.","workspaceList.unarchiveBlockedPurged":"Impossibile ripristinare: il worktree non esiste più sul disco. Ricrealo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō lo rileva entro 30 s e riattiva il workspace.","contextMenu.purgeWorktree":`Libera spazio su disco (elimina worktree)`,"contextMenu.purgeWorktreeTooltip":`Elimina il worktree dal disco per recuperare spazio — la cronologia di chat e sessioni viene conservata. Archivia automaticamente il workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Liberare spazio su disco?`,"contextMenu.purgeWorktreeDialogMessage":`La cartella worktree di «{name}» verrà eliminata dal disco. La cronologia di chat e sessioni viene conservata. Il workspace verrà archiviato automaticamente. Nella versione attuale non è possibile annullare.`,"contextMenu.purgeWorktreeDialogConfirm":`Elimina il worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree eliminato — spazio su disco recuperato.`,"settings.autoPurgeOnPrMerged":`Elimina worktree al merge della PR`,"settings.autoPurgeOnPrMergedHint":`Se abilitato, il worktree viene eliminato dal disco non appena la PR viene mergiata (oltre all'archiviazione automatica). La cronologia delle chat viene conservata.`,"settings.autoLoopMaxRetries":`Numero massimo di tentativi automatici`,"settings.autoLoopMaxRetriesHint":`Interrompe l’auto-loop dopo questo numero di errori di quota o server temporanei.`,"settings.retentionTitle":`Conservazione della cronologia delle conversazioni (disattivata di default)`,"settings.retentionWarning":`Attivare questa opzione elimina definitivamente dal database la cronologia delle conversazioni degli agenti, a partire da tutto ciò che è già più vecchio della finestra. Gli eventi eliminati non sono recuperabili.`,"settings.retentionHint":`Viene eseguita una volta all'avvio del server. Workspace, attività, sessioni, branch e worktree non vengono mai toccati — solo l'output registrato degli agenti.`,"settings.retentionDaysLabel":`Elimina gli eventi più vecchi di (giorni)`,"settings.retentionDaysHint":`0 — il valore predefinito — conserva tutti gli eventi per sempre. Indica un valore per attivare la conservazione.`,"settings.retentionKeepLabel":`Eventi sempre conservati per workspace`,"settings.retentionKeepHint":`Gli eventi più recenti di ogni workspace sopravvivono a prescindere dalla loro età, così un workspace vecchio ma ancora aperto mantiene una cronologia leggibile. Consigliato: 5000.`,"settings.retentionDisabledHint":`Conservazione disattivata: non verrà mai eliminato nulla.`,"settings.retentionConfirmTitle":`Eliminare definitivamente la cronologia delle conversazioni?`,"settings.retentionConfirmMessage":`Conservare solo {days} giorno/i di cronologia eliminerà definitivamente, al prossimo avvio del server, {count} dei {total} eventi degli agenti registrati — compreso tutto ciò che è già più vecchio. L'operazione è irreversibile. Continuare?`,"settings.retentionConfirmMessageUnknown":`Conservare solo {days} giorno/i di cronologia eliminerà definitivamente, al prossimo avvio del server, tutti gli eventi degli agenti più vecchi — compreso tutto ciò che è già accumulato. Non è stato possibile calcolare il volume esatto. L'operazione è irreversibile. Continuare?`,"settings.purgeDocsTitle":`Come funziona la pulizia — ripristino e permessi`,"settings.purgeDocsRestoreTitle":`Ripristinare un worktree eliminato (rilevamento automatico)`,"settings.purgeDocsRestoreIntro":`Un workspace eliminato conserva la cronologia chat e i metadati della PR, ma la cartella worktree non c'è più. Ricreala manualmente con uno di questi comandi — Kōbō rileva la riapparizione della cartella entro 30 secondi e riattiva automaticamente il workspace (rimuove dall'archivio + cancella il flag di eliminazione):`,"settings.purgeDocsRestoreCommands":`# GitHub (con CLI gh):
|
|
76
|
+
# il tuo script — usa $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Ripristina il predefinito Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Ripristinare lo script?`,"settings.changeSourceBranchScript.replaceConfirm":`Le tue modifiche verranno sostituite dallo script predefinito di Kōbō. Continuare?`,"settings.cleanupScriptHint":`Script di shell eseguito nel worktree dopo ogni sessione dell'agente. In modalità auto-loop viene eseguito solo quando tutte le attività sono completate. Lascia vuoto per disattivare.`,"settings.cleanupScriptPlaceholder":`es. eliminare file temporanei, fermare container…`,"settings.cleanupScriptMode":`Quando eseguire`,"settings.cleanupScriptMode.idle":`Dopo ogni sessione — anche se restano attività`,"settings.cleanupScriptMode.noTasks":`Solo quando non resta nessuna attività Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Eseguire solo se file sono stati modificati, aggiunti o eliminati`,"settings.cleanupScriptMode.inherit":`Eredita l'impostazione globale`,"settings.taskPromptTemplate":`Prompt di attività`,"settings.taskPromptTemplatePlaceholder":`Prompt inserito automaticamente nella descrizione dell'attività…`,"settings.taskPromptTemplateHint":`Iniettato automaticamente nella descrizione dell'attività nella pagina di creazione quando questo progetto è selezionato. Se non viene modificato, viene sostituito al cambio di progetto; appena lo modifichi, il tuo testo viene mantenuto.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Eseguito con bash nel worktree dopo la creazione, prima dell'avvio dell'agente. Nessun shebang necessario. In caso di errore, il workspace viene impostato su errore. Timeout: 5 minuti.`,"settings.e2e.title":`Test E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Nessuno`,"settings.e2e.frameworkOther":`Altro`,"settings.e2e.skill":`Skill (opzionale)`,"settings.e2e.skillPlaceholder":`es. cypress-tester`,"settings.e2e.prompt":`Linee guida personalizzate (opzionale)`,"settings.e2e.promptPlaceholder":`es. usare il pattern page-object, mirare a data-testid`,"settings.e2e.helpText":`Quando configurato, l'agente di grooming auto-loop inserisce sotto-task E2E per funzionalità UI.`,"settings.finalization.title":`Finalizzazione dell'auto-loop`,"settings.finalization.helpText":`Opzionale: un prompt che l'agente esegue come ultima iterazione dell'auto-loop. Tipicamente usato per controlli di qualità finali (lint, typecheck, test). La fase di grooming creerà un task con prefisso [FINAL] che userà questo prompt.`,"settings.finalization.prompt":`Prompt di finalizzazione`,"settings.finalization.promptPlaceholder":`es. Esegui npm run lint e npm test, poi marca questo task come fatto.`,"settings.editorCommand":`Comando editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando per aprire il worktree nel proprio editor. Il percorso del worktree viene passato come argomento.`,"settings.fileManagerCommand":`Comando file manager`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Comando per aprire il worktree nel proprio file manager. Il percorso del worktree viene passato come argomento. Lascia vuoto per nascondere il pulsante.`,"settings.terminalCommand":`Comando del terminale`,"settings.terminalCommandHint":`Comando per avviare il terminale nel worktree. Segnaposto {path} opzionale per la directory.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Selezione MCP Claude`,"settings.mcpAutoSelect":`Auto (primo MCP attivo corrispondente)`,"settings.notionMcp":`Chiave MCP Notion`,"settings.sentryMcp":`Chiave MCP Sentry`,"settings.mcpSelectionHint":`Le voci attive vengono lette da ~/.claude.json. Lascia Auto per usare il comportamento predefinito.`,"settings.configuredProjects":`Progetti configurati`,"settings.noProjects":`Nessun progetto configurato`,"settings.addProject":`Aggiungi progetto`,"settings.copyFrom":`Copia impostazioni da`,"settings.copyFromPlaceholder":`(nessuno — parti dai valori predefiniti)`,"settings.copyFromHint":`Copia tutte le impostazioni tranne path, nome e branch sorgente.`,"settings.copyFromConfirmTitle":`Sovrascrivere i valori attuali?`,"settings.copyFromConfirm":`Sovrascriverà i valori del modulo con le impostazioni di "{project}". Continuare?`,"settings.newProject":`Nuovo progetto`,"settings.editProject":`Modifica progetto`,"settings.onboardingTitle":`Tour guidato`,"settings.onboardingHint":`Rivedi la presentazione dei principali elementi dell’interfaccia.`,"settings.onboardingReplay":`Rivedi il tour guidato`,"onboarding.list.title":`Spazi di lavoro`,"onboarding.list.description":`Ogni missione vive nel proprio spazio — un git worktree, un branch e una sessione dell’agente dedicati. Appaiono tutti qui.`,"onboarding.create.title":`Creare uno spazio di lavoro`,"onboarding.create.description":`Clicca su + per avviare una nuova missione — da un ticket Notion, una issue Sentry o da zero.`,"onboarding.search.title":`Ricerca`,"onboarding.search.description":`Filtra i tuoi spazi di lavoro per nome, o cerca nella cronologia delle conversazioni degli agenti.`,"onboarding.health.title":`Stato`,"onboarding.health.description":`Controlla lo stato di Kōbō: database, agenti attivi, integrazioni, backup.`,"onboarding.changelog.title":`Novità`,"onboarding.changelog.description":`Sfoglia le ultime release di Kōbō: nuove funzionalità, correzioni, modifiche di comportamento. Compare un indicatore quando è disponibile una release non ancora letta.`,"onboarding.settings.title":`Impostazioni`,"onboarding.settings.description":`Modelli, script del ciclo di vita, integrazioni, voce — tutta la configurazione di Kōbō è qui. Clicca su Avanti per un tour di ogni sezione.`,"onboarding.settings-general.title":`Generale`,"onboarding.settings-general.description":`Lingua dell’interfaccia, progetto predefinito e comportamento globale applicato a ogni nuovo workspace.`,"onboarding.settings-agents.title":`Agenti e modelli`,"onboarding.settings-agents.description":`Scegli il motore predefinito — Claude Code o Codex —, il modello e la modalità di permessi degli agenti.`,"onboarding.settings-skills.title":`Skill`,"onboarding.settings-skills.description":`Scegli la suite di skill caricata dagli agenti: il preset consigliato o la tua selezione personalizzata.`,"onboarding.settings-prompts.title":`Prompt`,"onboarding.settings-prompts.description":`Modello di descrizione della PR e altri testi di prompt riutilizzabili dagli agenti.`,"onboarding.settings-scripts.title":`Script`,"onboarding.settings-scripts.description":`Script del ciclo di vita eseguiti su cleanup, archiviazione e setup del workspace — globali o per progetto.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Collega il tuo token di integrazione Notion per importare ticket come missioni di workspace.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Importa una issue di Sentry come fonte di verità di un workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Scegli GitHub, GitLab o nessuna, per progetto. Kōbō usa la tua CLI gh / glab — non include credenziali.`,"onboarding.settings-voice.title":`Voce`,"onboarding.settings-voice.description":`Dettatura vocale: attivala, scegli il modello Whisper e gestisci il runtime di riconoscimento vocale locale.`,"onboarding.settings-notifications.title":`Notifiche`,"onboarding.settings-notifications.description":`Notifiche sonore e del browser per eventi e cambi di stato degli agenti.`,"onboarding.settings-worktrees.title":`Worktree`,"onboarding.settings-worktrees.description":`Prefissi dei branch Git e la cartella in cui vengono creati i worktree dei workspace.`,"onboarding.settings-worktrees-purge.title":`Liberare spazio su disco automaticamente`,"onboarding.settings-worktrees-purge.description":"Attiva questo toggle perché Kōbō elimini la cartella worktree (spesso centinaia di MB di node_modules / vendor) non appena una PR viene mergeata. La cronologia chat e i metadati della PR sono conservati. Puoi ricreare il worktree più tardi con `gh pr checkout <pr>` — Kōbō rileva automaticamente il ripristino entro 30 secondi e riattiva il workspace.","onboarding.settings-projects.title":`Progetti`,"onboarding.settings-projects.description":`Registra i repository su cui lavori. Clicca su «Aggiungi un progetto» per puntare Kōbō a un repository locale — ogni workspace mira a uno di questi progetti.`,"onboarding.settings-templates.title":`Modelli`,"onboarding.settings-templates.description":`La tua libreria di modelli di prompt riutilizzabili — scegline uno per precompilare il brief durante la creazione di un workspace.`,"onboarding.settings-export.title":`Importa / Esporta`,"onboarding.settings-export.description":`Esegui il backup o condividi la configurazione di Kōbō ed esporta i dati dei workspace in un file.`,"onboarding.firstWorkspace.title":`Crea il tuo primo workspace`,"onboarding.firstWorkspace.description":`È tutto qui: una missione, un worktree, un agente. Apri la pagina di creazione per iniziare.`,"onboarding.next":`Avanti`,"onboarding.prev":`Indietro`,"onboarding.done":`Fatto`,"onboarding.exitConfirm":`Uscire dal tour guidato? Puoi rivederlo in qualsiasi momento dalle Impostazioni.`,"settings.projectGroup.identity":`Identità`,"settings.projectGroup.defaults":`Valori predefiniti`,"settings.projectGroup.prompts":`Prompt`,"settings.projectGroup.scripts":`Script`,"settings.projectPath":`Percorso del progetto`,"settings.projectPathPlaceholder":`/percorso/del/progetto`,"settings.displayName":`Nome visualizzato`,"settings.displayNamePlaceholder":`Il mio progetto`,"settings.defaultSourceBranch":`Branch sorgente predefinito`,"settings.defaultModel.project":`Modello predefinito`,"settings.skipPermissions.project":`Salta le richieste di permesso`,"settings.prPromptTemplate.project":`Template del prompt PR`,"settings.prPromptPlaceholder.project":`Istruzioni specifiche del progetto per la creazione di PR...`,"settings.reviewPromptTemplate.project":`Template del prompt di revisione`,"settings.ciFixPromptTemplate.project":`Template del prompt «Ripara CI»`,"settings.gitConventions.project":`Convenzioni Git (per progetto)`,"settings.gitConventionsEmpty":`Lascia vuoto per usare le convenzioni globali.`,"settings.notionStatus":`Stato ticket Notion`,"settings.notionStatusProperty":`Nome della proprietà`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valore da impostare`,"settings.notionInProgressStatusPlaceholder":`In corso, In progress...`,"settings.notionStatusHint":`Quando un workspace viene creato con un ticket Notion, la proprietà specificata viene impostata a questo valore. Entrambi i campi sono obbligatori. Lasciare vuoto per disattivare.`,"settings.notionAssignee":`Assegnazione Notion`,"settings.notionAssigneeHint":`Quando un workspace viene creato con un ticket Notion, l'utente autenticato sull'MCP Notion viene aggiunto a questa proprietà People — solo se non ha già un assegnatario. Lasciare vuoto per disattivare.`,"settings.notionAssigneeProperty":`Nome della proprietà`,"settings.notionAssigneePropertyPlaceholder":`Sviluppatori, Assignees...`,"settings.notionUserId":`Il tuo UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Seleziona il tuo account nella lista. Notion rifiuta l'assegnazione di bot nelle proprietà People — questo campo è obbligatorio per attivare l'auto-assegnazione.`,"settings.notionUsersRefresh":`Aggiorna`,"settings.notionUsersLoading":`Caricamento utenti Notion…`,"settings.notionUsersLoadFailed":`Impossibile caricare la lista: {error}`,"settings.notionUsersManualFallback":`Lista non disponibile — incolla il tuo UUID Notion manualmente.`,"settings.devServer":`Server di sviluppo`,"settings.devServerStart":`Script di avvio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script di arresto`,"settings.devServerStopPlaceholder":`Opzionale — il processo verrà terminato automaticamente se vuoto`,"settings.selectProject":`Seleziona un progetto o aggiungine uno nuovo`,"settings.projectPathRequired":`Il percorso del progetto è obbligatorio.`,"settings.useGlobal":`Usa globale`,"settings.saved":`Impostazioni globali salvate.`,"settings.unsavedChanges":`Modifiche non salvate`,"settings.nav.general":`Generale`,"settings.nav.agents":`Agenti`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompt`,"settings.nav.scripts":`Script`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Le credenziali restano locali e sono usate solo da bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voce`,"settings.nav.notifications":`Notifiche`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Esporta`,"settings.openNav":`Apri la navigazione`,"settings.saveError":`Errore durante il salvataggio delle impostazioni.`,"settings.projectSaved":`Progetto salvato.`,"settings.projectSaveError":`Errore durante il salvataggio del progetto.`,"settings.projectDeleted":`Progetto eliminato.`,"settings.deleteProjectConfirmTitle":`Eliminare il progetto?`,"settings.deleteProjectConfirmMessage":`Rimuovere «{name}» dai tuoi progetti? Questo elimina solo le impostazioni Kōbō — il codice e i worktree restano intatti.`,"settings.projectDeleteError":`Errore durante l'eliminazione del progetto.`,"templates.title":`Template`,"templates.newTemplate":`Nuovo template`,"templates.editTemplate":`Modifica template`,"templates.deleteTemplate":`Elimina template`,"templates.deleteConfirm":`Eliminare il template '/{slug}'?`,"templates.deleteConfirmMessage":`Questa azione non può essere annullata.`,"templates.slug":`Slug`,"templates.slugHint":`Minuscole, cifre, trattini. Max 64 caratteri.`,"templates.slugInvalid":`Lo slug può contenere solo minuscole, cifre e trattini`,"templates.slugDuplicate":`Un template con questo slug esiste già`,"templates.description":`Descrizione`,"templates.descriptionHint":`Etichetta breve mostrata nel dropdown.`,"templates.descriptionRequired":`La descrizione è obbligatoria`,"templates.contentRequired":`Il contenuto è obbligatorio`,"templates.content":`Contenuto`,"templates.contentHint":`Contenuto del template. Usa {variable_name} per le sostituzioni.`,"templates.availableVars":`Variabili disponibili`,"templates.filePath":`File: {path}`,"templates.empty":`Nessun template ancora.`,"templates.createFailed":`Creazione del template fallita`,"templates.updateFailed":`Aggiornamento del template fallito`,"templates.deleteFailed":`Eliminazione del template fallita`,"templates.save":`Salva`,"templates.create":`Crea`,"templates.reloadDefaults":`Ricarica i template predefiniti`,"templates.reloadDefaultsHint":`Aggiunge solo i template predefiniti mancanti. I template esistenti (modificati o meno) non vengono mai sovrascritti.`,"templates.reloadDefaultsConfirmMessage":`Questa azione aggiungerà alla lista i template predefiniti mancanti. I template esistenti — comprese le tue personalizzazioni — non saranno toccati. Se vuoi ripristinare un template predefinito che hai modificato, eliminalo prima e rilancia questa azione.`,"templates.reloadDefaultsSuccess":`{added} aggiunto/i, {kept} mantenuto/i`,"templates.reloadDefaultsFailed":`Ricarica dei template predefiniti fallita`,"templates.resetToDefault":`Ripristina predefinito`,"templates.resetConfirmTitle":`Ripristinare il template al predefinito?`,"templates.resetConfirmMessage":`Sovrascrive le tue modifiche locali a /{slug} con il predefinito. Non annullabile.`,"templates.resetSuccess":`Template /{slug} ripristinato al predefinito`,"templates.resetFailed":`Ripristino del template non riuscito`,"chatInput.dropdownSkills":`Skill Claude`,"chatInput.dropdownKobo":`Comandi Kōbō`,"chatInput.dropdownTemplates":`Template`,"documents.title":`Documenti`,"documents.empty":`Nessun documento trovato`,"documents.refresh":`Aggiorna`,"documents.back":`Indietro`,"documents.loadFailed":`Caricamento del documento fallito`,"git.title":`Git`,"git.outputDialogTitle":`Git ha segnalato un errore`,"git.statsFailed":`Impossibile leggere lo stato git`,"git.section.repository":`Repository`,"git.section.changes":`Modifiche`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Azioni`,"git.actions.more":`Altre`,"git.localOnly":`solo locale`,"git.pushed":`pushed`,"git.unpushed":`{count} non pushati`,"git.commits":`{count} commit | {count} commit`,"git.commits.loading":`Caricamento commit…`,"git.commits.empty":`Nessun commit su questo branch`,"git.commits.pushed":`Pushato`,"git.commits.unpushed":`Non pushato`,"git.commits.clickToAppend":`clicca per aggiungere SHA alla chat`,"git.commits.diffThisCommit":`Diff di questo commit (vs parent)`,"git.compareCommits":`Confronta commit…`,"git.files":`{count} file | {count} file`,"git.staged":`{count} staged`,"git.modified":`{count} modificati`,"git.untracked":`{count} non tracciati`,"git.workingTreeEmpty":`Nessuna modifica non committata`,"git.fileStaged":`In stage`,"git.fileModified":`Modificato`,"git.fileUntracked":`Non tracciato`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Più sicuro di --force: il push viene rifiutato se il remoto ha commit che non hai visto. Da usare dopo un rebase o amend di commit già pushati.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`Nessun upstream per questo branch — fai push prima per abilitare Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push del branch prima`,"git.viewRequest":`Visualizza {request}`,"git.createRequest":`Crea {request}`,"git.changeRequestBase":`Cambia il branch base della {request}`,"git.forgeCliMissing":`{cli} non è installato — installalo per usare le funzioni {request}`,"git.forgeNotAuthenticated":`Non autenticato — esegui {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Rilevamento automatico`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Nessuna`,"git.pullConfirmTitle":`Pull della branch?`,"git.pullConfirmMessage":`Pull {branch} dal remoto (solo fast-forward).`,"git.branchPulled":`Branch aggiornata`,"git.pullFailed":`Pull fallito`,"git.renameBranch":`Rinomina branch`,"git.renameBranchPrompt":"Rinomina `{branch}` in:","git.renameBranchSuccess":"Branch rinominato in `{branch}`","git.renameBranchFailed":`Rinomina branch fallita`,"git.renameBranchExists":"Il branch `{branch}` esiste già localmente o su origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Apre il visualizzatore diff in modalità Review — commenti inline + invio batch all'agente`,"pr.baseChanged":`Base della PR cambiata: {oldBase} → {newBase}`,"pr.openPr":`Apri PR`,"pr.openWorkspace":`Apri il workspace`,"pr.dismiss":`Chiudi`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase del branch?`,"git.rebaseConfirmMessage":`Rebase su {branch}. Potrebbero verificarsi conflitti.`,"git.rebaseSuccess":`Rebase completato`,"git.rebaseFailed":`Rebase fallito`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repository aggiornato`,"git.fetchFailed":`Fetch non riuscito: {error}`,"git.mergeConfirmTitle":`Fondere il branch?`,"git.mergeConfirmMessage":`Fonde {branch} in questo branch. Possibili conflitti.`,"git.mergeSuccess":`Merge completato`,"git.mergeFailed":`Merge fallito`,"git.commitFailed":`Commit fallito`,"git.commitChanges":`Esegui commit delle modifiche`,"git.commitDialogTitle":`Esegui commit delle modifiche non salvate`,"git.commitDialogDescription":`Inserisci il tuo messaggio o chiedi all’agente di esaminare e creare il commit.`,"git.commitMessage":`Messaggio di commit`,"git.commitManual":`Esegui commit`,"git.commitWithAgent":`Chiedi all’agente`,"git.commitAgentSuccess":`Richiesta di commit inviata all’agente`,"git.discardFailed":`Scarto fallito`,"git.conflictTitleMerge":`Conflitti di merge rilevati`,"git.conflictTitleRebase":`Conflitti di rebase rilevati`,"git.operationPausedTitle":`Operazione Git da continuare`,"git.operationPausedSubtitle":`Nessun file è in conflitto. Git attende solo che tu continui l’operazione.`,"git.conflictSubtitle":`{count} file con conflitti. Scegli come continuare.`,"git.conflictAbortConfirmTitle":`Annullare la risoluzione del conflitto?`,"git.conflictAbortConfirmMessage":`Tutto ciò che hai risolto in questo {op} viene scartato e il worktree torna allo stato precedente. È irreversibile.`,"git.conflictAbort":`Annulla`,"git.conflictContinue":`Continua`,"git.conflictContinued":`Operazione Git continuata`,"git.conflictResolveWithAgent":`Chiedi all'agente di risolvere`,"git.conflictAborted":`Operazione annullata`,"git.conflictHandoffSuccess":`L'agente sta risolvendo i conflitti`,"git.dirtyTitleRebase":`Modifiche non committate bloccano il rebase`,"git.dirtyTitleMerge":`Modifiche non committate bloccano il merge`,"git.dirtyTitlePull":`Modifiche non committate bloccano il pull`,"git.dirtySubtitle":`{modified} modificato/i, {staged} in stage, {untracked} non tracciato/i. Scegli come procedere.`,"git.dirtyStash":`Stash e riprova`,"git.dirtyCommit":`Commit prima`,"git.dirtyCommitPlaceholder":`Messaggio di commit`,"git.dirtyCommitConfirm":`Commit e riprova`,"git.dirtyDiscard":`Scarta le modifiche`,"git.dirtyDiscardConfirmTitle":`Scartare tutte le modifiche non committate?`,"git.dirtyDiscardConfirmMessage":`Le modifiche tracciate andranno perse (git reset --hard). I file non tracciati vengono mantenuti. Azione irreversibile.`,"git.pushConfirmTitle":`Push del branch?`,"git.pushConfirmMessage":`Push di {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Push del branch`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBaseTitle":`Cambiare branch base`,"git.changePrBaseMessage":`Inserire il nuovo branch destinazione per la {request}.`,"git.changePrBaseSuccess":`Branch base della {request} aggiornato`,"git.changePrBaseFailed":`Impossibile cambiare il branch base della {request}`,"git.mergeRequest":`Unisci {request}`,"git.mergeRequestConfirmTitle":`Unire {request}?`,"git.mergeRequestConfirmMessage":`Questa azione unisce la {request} aperta nel suo branch di destinazione.`,"git.mergeRequestSuccess":`{request} unita`,"git.mergeRequestFailed":`Impossibile unire {request}`,"git.deleteRemoteBranch":`Elimina branch remoto`,"git.deleteRemoteBranchTitle":`Eliminare il branch remoto?`,"git.deleteRemoteBranchMessage":`La richiesta è stata unita. Eliminare il branch remoto {branch}?`,"git.deleteRemoteBranchSuccess":`Branch remoto {branch} eliminato`,"git.deleteRemoteBranchFailed":`Impossibile eliminare il branch remoto`,"git.changeSourceBranch":`Cambia il branch di origine`,"git.changeSourceBranchTitle":`Cambia il branch di origine`,"git.changeSourceBranchMessage":`Scegli il nuovo branch di origine. Il branch di lavoro verrà ricostruito sopra di esso.`,"git.changeSourceBranchDone":`Branch di origine cambiato in {branch}`,"git.changeSourceBranchAligned":`Branch di origine cambiato in {branch} (il branch non aveva commit propri)`,"git.changeSourceBranchTooMany":`Il branch ha troppi commit propri ({n}) — esegui il rebase manualmente`,"git.changeSourceBranchDirty":`Esegui commit o stash delle modifiche prima di cambiare il branch di origine`,"git.changeSourceBranchAgentRunning":`Ferma l'agente prima di cambiare il branch di origine`,"git.changeSourceBranchErrorTitle":`Cambio branch di origine fallito`,"git.changeSourceBranchErrorOngoing":`Un'operazione {op} è ancora in corso sul worktree. Annullala per tornare a uno stato pulito.`,"git.changeSourceBranchErrorAbort":`Annulla l'operazione`,"git.changeSourceBranchLoading":`Cambio del branch di origine…`,"git.changeSourceForcePushTitle":`Eseguire il force-push del branch riscritto?`,"git.changeSourceForcePushMessage":`La cronologia del branch è stata riscritta. Eseguire il push al remoto con --force-with-lease?`,"git.changeSourceForcePushDone":`Force-push del branch eseguito`,"git.openEditor":`Apri nell'editor`,"git.openEditorFailed":`Impossibile aprire l'editor`,"git.branchPushed":`Branch pushato`,"git.pushFirst":`Il branch non è sul remoto. Fai Push prima.`,"git.unpushedCommits":`I commit locali non sono pushati. Fai Push prima.`,"git.from":`da`,"git.aheadBehindTooltip":`{ahead} commits avanti, {behind} indietro rispetto a {source}`,"git.divergence.title":`Divergenza del branch`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} avanti`,"git.divergence.behind":`↓ {count} indietro`,"git.divergence.empty.ahead":`Nessun commit avanti.`,"git.divergence.empty.behind":`Nessun commit indietro.`,"git.divergence.close":`Chiudi`,"git.divergence.loading":`Caricamento commit…`,"git.divergence.failed":`Impossibile caricare la divergenza`,"git.divergence.retry":`Riprova`,"git.prCreated":`{request} #{n} creata`,"git.pr.author":`Autore`,"git.pr.reviewers":`Revisori`,"git.pr.assignees":`Assegnati`,"git.pr.labels":`Etichette`,"git.pr.changesRequestedBadge":`Modifiche richieste`,"git.pr.approvedBadge":`Approvata`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI fallita`,"git.pr.ci.pending":`CI in corso`,"git.pr.ci.failedCount":`{n} falliti`,"git.pr.ci.pendingCount":`{n} in corso`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} saltati`,"git.pr.ci.showPassed":`Mostra {n} job riusciti`,"git.pr.ci.hidePassed":`Nascondi i job riusciti`,"toast.prChangesRequested":`Sono state richieste modifiche per la PR #{n}`,"toast.prApproved":`La PR #{n} è stata approvata`,"toast.prReadyToMerge":`La PR #{n} è pronta per il merge`,"toast.prCiFailed":`La CI della PR #{n} non è riuscita`,"toast.prCiRecovered":`La CI della PR #{n} è stata ripristinata`,"toast.prMergeConflict":`La PR #{n} ha conflitti di merge`,"toast.prMerged":`La PR #{n} è stata unita`,"devServer.title":`Server di sviluppo`,"devServer.noWorkspace":`Nessun workspace selezionato`,"devServer.notConfigured":`Non configurato —`,"devServer.goToSettings":`Impostazioni`,"devServer.logs":`Log`,"devServer.running":`In esecuzione`,"devServer.starting":`Avvio in corso`,"devServer.stopping":`Arresto in corso`,"devServer.error":`Errore`,"devServer.stopped":`Arrestato`,"devServer.unknown":`Sconosciuto`,"devServer.containers":`{count} container | {count} container`,"devServer.logDialog.title":`Log del server di sviluppo`,"devServer.logDialog.empty":`Nessun log disponibile`,"notion.title":`Notion`,"tasks.title":`Attività`,"notion.addTask":`Aggiungi task`,"notion.noUrl":`Nessun URL Notion`,"notion.subtasks":`{done}/{total} sottotask`,"notion.noTasks":`Nessun task`,"notion.newTask":`Nuovo task... (Invio per aggiungere, Esc per annullare)`,"acceptance.title":`Criteri di accettazione`,"acceptance.addCriterion":`Aggiungi criterio`,"acceptance.newCriterion":`Nuovo criterio... (Invio per aggiungere, Esc per annullare)`,"acceptance.empty":`Nessun criterio di accettazione`,"tasks.askProgress":`Chiedere all'agente di verificare il progresso`,"agentTodos.title":`Todo dell'agente`,"agentTodos.empty":`Nessun todo dell'agente`,"subagents.title":`Sub-agenti`,"subagents.empty":`Nessuna attività dei sub-agenti ancora`,"subagents.tools":`{count} strumenti`,"subagents.running":`In esecuzione: `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket utilizzo {n}`,"quotaFooter.lastUpdated":`Ultimo aggiornamento: {time}`,"quotaFooter.empty":`Caricamento…`,"quotaFooter.popover.title":`Utilizzo Claude Code`,"quotaFooter.popover.refreshNow":`Aggiorna`,"quotaFooter.popover.resetsIn":`Reset alle {value}`,"quotaFooter.popover.unauthenticated":`Auth richiesta`,"quotaFooter.popover.unauthenticatedHint":`Esegui "claude" una volta per autenticarti.`,"quotaFooter.popover.error":`Errore`,"quotaFooter.bucket.fiveHour":`5 ore`,"quotaFooter.bucket.sevenDay":`7 giorni`,"agent.error.spawn_failed":`Impossibile avviare l'agente`,"agent.error.parse_error":`Impossibile analizzare un messaggio dell'agente`,"agent.error.rate_limit":`Limite di frequenza raggiunto`,"agent.error.resume_failed":`Sessione non trovata — avvio di una nuova sessione`,"agent.error.other":`Errore dell'agente`,"quotaBackoff.banner.title":`Ripresa automatica alle {time}`,"quotaBackoff.banner.transientTitle":`Ripresa automatica dopo l’interruzione alle {time}`,"quotaBackoff.resumeNow":`Riprendi ora`,"quotaBackoff.banner.tooltip":`Quota Claude esaurita. L'auto-loop riprenderà automaticamente quando la quota si reimposta alle {resets_at}.`,"quotaBackoff.banner.cancel":`Annulla ripresa`,"quotaBackoff.cancelled":`Ripresa automatica annullata — puoi riprendere manualmente in qualsiasi momento`,"rateLimitType.fiveHour":`Sessione 5h`,"rateLimitType.sevenDay":`Settimanale`,"tooltip.addTask":`Aggiungi task`,"tooltip.removeTask":`Rimuovi task`,"tooltip.addCriterion":`Aggiungi criterio`,"tooltip.removeCriterion":`Rimuovi criterio`,"tooltip.startDevServer":`Avvia server di sviluppo`,"tooltip.stopDevServer":`Arresta server di sviluppo`,"tooltip.closeDiffViewer":`Chiudi diff`,"tooltip.refreshLogs":`Aggiorna log`,"tooltip.closeDialog":`Chiudi`,"tooltip.refreshGitStats":`Aggiorna statistiche Git`,"tooltip.removeImage":`Rimuovi immagine`,"tooltip.sendMessage":`Invia messaggio`,"tools.title":`Strumenti`,"tools.runSetupScript":`Rieseguire script di setup`,"tools.runSetupScriptTooltip":`Eseguire lo script di setup del progetto nel worktree`,"tools.runSetupScriptConfirm":`Rieseguire lo script di setup in questo workspace? Gli artefatti esistenti potrebbero essere sovrascritti.`,"tools.runSetupScriptBusy":`Impossibile rieseguire il setup mentre l'agent sta lavorando.`,"tools.noSetupScript":`Nessun script di setup configurato —`,"tools.setupScriptSuccess":`Script di setup completato con successo.`,"tools.setupScriptFailed":`Script di setup fallito.`,"tools.openNotion":`Apri in Notion`,"tools.openSentry":`Apri in Sentry`,"tools.review":`Revisiona modifiche`,"tools.reviewTooltip":`Chiedi all'agente di rivedere le modifiche di questo branch`,"tools.reviewBusy":`Agente occupato — attendi che sia libero`,"tools.fixCi":`Ripara CI`,"tools.fixCiTooltip":`Chiedi all'agente di diagnosticare e correggere i job di CI in errore`,"tools.fixCiLaunched":`Azione «Ripara CI» inviata all'agente`,"tools.fixCiFailed":`Impossibile avviare l'azione «Ripara CI»`,"tools.openFileManager":`Apri nel file manager`,"tools.openFileManagerTooltip":`Apri la cartella del worktree nel tuo file manager configurato`,"tools.openFileManagerFailed":`Impossibile aprire il file manager`,"tools.openTerminal":`Apri nel terminale`,"tools.openTerminalTooltip":`Apri il worktree nel terminale configurato`,"tools.openTerminalFailed":`Impossibile aprire il terminale`,"review.title":`Avvia revisione`,"review.subtitle":`Chiedi all'agente di rivedere le modifiche e dare un feedback.`,"review.additionalInstructions":`Istruzioni aggiuntive (opzionale)`,"review.additionalInstructionsPlaceholder":`Aggiungi istruzioni specifiche per la revisione…`,"review.newSession":`Nuova sessione`,"review.newSessionHint":`Avvia una nuova sessione invece di continuare quella attuale.`,"review.start":`Avvia revisione`,"review.cancel":`Annulla`,"review.launched":`Revisione avviata`,"review.failed":`Impossibile avviare la revisione`,"diff.title":`Diff`,"diff.side":`Affiancato`,"diff.inline":`In linea`,"diff.hideUnchanged":`Nascondi codice invariato`,"diff.showUnchanged":`Mostra codice invariato`,"diff.showUntracked":`Mostra file non tracciati`,"diff.hideUntracked":`Nascondi file non tracciati`,"diff.rollbackToRemote":`Ripristina alla versione remota`,"diff.rollbackConfirm":`Ripristinare {path} alla sua versione remota (origin)? Le modifiche locali a questo file andranno perse.`,"diff.rollbackConfirmOk":`Ripristina`,"diff.rollbackDone":`File ripristinato alla versione remota`,"diff.rollbackDoneRemote":`File ripristinato alla versione remota`,"diff.rollbackDoneHead":`Modifiche locali annullate (file ripristinato all'ultimo commit)`,"diff.rollbackDoneDeleted":`File non tracciato eliminato`,"diff.deleteUntracked":`Elimina file non tracciato`,"diff.deleteUntrackedConfirm":`Eliminare definitivamente {path}? Questo file non è tracciato da git — il suo contenuto andrà perso.`,"diff.deleteUntrackedConfirmOk":`Elimina`,"diff.rollbackFailed":`Rollback fallito`,"diff.rollbackFailedDetail":`Rollback non riuscito: {error}`,"diff.modeInspect":`Modifica`,"diff.modeReview":`Review`,"diff.addComment":`Aggiungi commento`,"diff.replyComment":`Rispondi`,"diff.editComment":`Modifica`,"diff.deleteComment":`Elimina`,"diff.deleteCommentConfirm":`Eliminare questo commento?`,"diff.commentPlaceholder":`Scrivi un commento di revisione… (Markdown supportato)`,"diff.reviewDraft":`Bozza di revisione`,"diff.reviewEmpty":`Nessun commento — passa sopra una riga del diff e clicca + per aggiungerne uno.`,"diff.reviewGlobalPlaceholder":`Messaggio generale di revisione (opzionale)`,"diff.submitReview":`Invia revisione ({n})`,"diff.reviewSubmitted":`Revisione inviata all'agente`,"diff.reviewSubmitFailed":`Invio della revisione fallito: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Non pushato`,"diff.noChanges":`Nessuna modifica`,"diff.searchFiles":`Cerca file…`,"diff.noFileMatch":`Nessun file corrispondente`,"diff.selectFile":`Seleziona un file per visualizzare il diff`,"diff.fileLoadFailed":`Impossibile caricare questo diff`,"diff.fileLoadFailedHint":`Il file su disco è intatto — è fallito solo il caricamento del diff.`,"diff.fileListLoadFailed":`Impossibile caricare l’elenco dei file`,"diff.fileListLoadFailedHint":`È una richiesta fallita, non un branch senza modifiche.`,"diff.addToChat":`Aggiungi alla chat`,"diff.compareTitle":`Confronta commit`,"diff.compareFrom":`Da`,"diff.compareTo":`A`,"diff.compareSubmit":`Confronta`,"diff.compareSourceBase":`{branch} (base del branch)`,"diff.commitsReadOnly":`sola lettura`,"diffViewer.save":`Salva`,"diffViewer.savedAt":`Salvato`,"diffViewer.saveFailed":`Salvataggio non riuscito`,"diffViewer.saveFailedDetail":`Salvataggio non riuscito: {error}`,"diffViewer.unsavedChanges.title":`Modifiche non salvate`,"diffViewer.unsavedChanges.message":`Hai modifiche non salvate. Cosa vuoi fare?`,"diffViewer.unsavedChanges.save":`Salva`,"diffViewer.unsavedChanges.cancel":`Annulla`,"diffViewer.conflict.title":`File modificato su disco`,"diffViewer.conflict.message":`Il file è stato modificato fuori da Kōbō da quando lo hai aperto.`,"diffViewer.conflict.reload":`Ricarica (scarta locali)`,"diffViewer.conflict.keep":`Mantieni le mie`,"diffViewer.conflict.overwrite":`Sovrascrivi comunque`,"diffViewer.conflict.overwriteHint":`Sostituisce il file sul disco con la tua versione. L’altra modifica va persa.`,"diffViewer.conflict.keepHint":`Mantiene le tue modifiche nell’editor e adotta la nuova firma del disco, così il prossimo salvataggio funziona.`,"diffViewer.saveBlocked":`L’agente è in esecuzione — fermalo per salvare le tue modifiche.`,"diffViewer.unsavedBanner":`Modifiche non salvate. Ferma l’agente per salvarle.`,"diffViewer.closeConfirm.title":`Modifiche non salvate`,"diffViewer.closeConfirm.message":`Questo file contiene modifiche mai salvate. Chiudere il visualizzatore di diff le scarta.`,"diffViewer.closeConfirm.discard":`Chiudi senza salvare`,"diffViewer.criteriaRail":`Checklist di revisione`,"diffViewer.criteriaRailShow":`Mostra la checklist di revisione`,"diffViewer.criteriaRailHide":`Nascondi la checklist di revisione`,"diffViewer.fileTreeShow":`Mostra l’albero dei file`,"diffViewer.fileTreeHide":`Nascondi l’albero dei file`,"diffViewer.closeConfirm.saveAndClose":`Salva e chiudi`,"diffViewer.agentRunning":`L’agente è in esecuzione — fermalo per modificare`,"diffViewer.fileDeleted":`File eliminato`,"notification.agentFinished":`{name} — Agente terminato`,"notification.agentQuestion":`{name} — L'agente sta facendo una domanda`,"notification.agentPermissionRequest":`{name} — L'agente richiede un permesso`,"notification.autoLoopCompleted":`{name} — Auto-loop completato`,"notification.autoLoopStalled":`{name} — Auto-loop bloccato (nessun progresso)`,"notification.autoLoopError":`{name} — Auto-loop fermato per errore`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop in pausa, in attesa del tuo chiarimento`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop ha forzato la modalità plan a bypass`,"notification.agentError":`{name} — Errore agente`,"contextMenu.rename":`Rinomina`,"contextMenu.editDescription":`Modifica descrizione`,"contextMenu.copyPath":`Copia percorso worktree`,"contextMenu.openEditor":`Apri nell'editor`,"contextMenu.openFileManager":`Apri nel file manager`,"contextMenu.unarchiveDisabledPurged":"Il worktree è stato eliminato dal disco. Ricrealo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō rileva il ripristino entro 30 s e riattiva automaticamente il workspace.","workspaceList.unarchiveBlockedPurged":"Impossibile ripristinare: il worktree non esiste più sul disco. Ricrealo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō lo rileva entro 30 s e riattiva il workspace.","contextMenu.purgeWorktree":`Libera spazio su disco (elimina worktree)`,"contextMenu.purgeWorktreeTooltip":`Elimina il worktree dal disco per recuperare spazio — la cronologia di chat e sessioni viene conservata. Archivia automaticamente il workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Liberare spazio su disco?`,"contextMenu.purgeWorktreeDialogMessage":`La cartella worktree di «{name}» verrà eliminata dal disco. La cronologia di chat e sessioni viene conservata. Il workspace verrà archiviato automaticamente. Nella versione attuale non è possibile annullare.`,"contextMenu.purgeWorktreeDialogConfirm":`Elimina il worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree eliminato — spazio su disco recuperato.`,"settings.autoPurgeOnPrMerged":`Elimina worktree al merge della PR`,"settings.autoPurgeOnPrMergedHint":`Se abilitato, il worktree viene eliminato dal disco non appena la PR viene mergiata (oltre all'archiviazione automatica). La cronologia delle chat viene conservata.`,"settings.autoLoopMaxRetries":`Numero massimo di tentativi automatici`,"settings.autoLoopMaxRetriesHint":`Interrompe l’auto-loop dopo questo numero di errori di quota o server temporanei.`,"settings.retentionTitle":`Conservazione della cronologia delle conversazioni (disattivata di default)`,"settings.retentionWarning":`Attivare questa opzione elimina definitivamente dal database la cronologia delle conversazioni degli agenti, a partire da tutto ciò che è già più vecchio della finestra. Gli eventi eliminati non sono recuperabili.`,"settings.retentionHint":`Viene eseguita una volta all'avvio del server. Workspace, attività, sessioni, branch e worktree non vengono mai toccati — solo l'output registrato degli agenti.`,"settings.retentionDaysLabel":`Elimina gli eventi più vecchi di (giorni)`,"settings.retentionDaysHint":`0 — il valore predefinito — conserva tutti gli eventi per sempre. Indica un valore per attivare la conservazione.`,"settings.retentionKeepLabel":`Eventi sempre conservati per workspace`,"settings.retentionKeepHint":`Gli eventi più recenti di ogni workspace sopravvivono a prescindere dalla loro età, così un workspace vecchio ma ancora aperto mantiene una cronologia leggibile. Consigliato: 5000.`,"settings.retentionDisabledHint":`Conservazione disattivata: non verrà mai eliminato nulla.`,"settings.retentionConfirmTitle":`Eliminare definitivamente la cronologia delle conversazioni?`,"settings.retentionConfirmMessage":`Conservare solo {days} giorno/i di cronologia eliminerà definitivamente, al prossimo avvio del server, {count} dei {total} eventi degli agenti registrati — compreso tutto ciò che è già più vecchio. L'operazione è irreversibile. Continuare?`,"settings.retentionConfirmMessageUnknown":`Conservare solo {days} giorno/i di cronologia eliminerà definitivamente, al prossimo avvio del server, tutti gli eventi degli agenti più vecchi — compreso tutto ciò che è già accumulato. Non è stato possibile calcolare il volume esatto. L'operazione è irreversibile. Continuare?`,"settings.purgeDocsTitle":`Come funziona la pulizia — ripristino e permessi`,"settings.purgeDocsRestoreTitle":`Ripristinare un worktree eliminato (rilevamento automatico)`,"settings.purgeDocsRestoreIntro":`Un workspace eliminato conserva la cronologia chat e i metadati della PR, ma la cartella worktree non c'è più. Ricreala manualmente con uno di questi comandi — Kōbō rileva la riapparizione della cartella entro 30 secondi e riattiva automaticamente il workspace (rimuove dall'archivio + cancella il flag di eliminazione):`,"settings.purgeDocsRestoreCommands":`# GitHub (con CLI gh):
|
|
77
77
|
gh pr checkout [numero-pr] --recurse-submodules
|
|
78
78
|
|
|
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`,"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)}},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-_WMLKlQ5.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-CsiPeq2V.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-BkaOk8cP.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-D7dz4XsR.js`),__vite__mapDeps([39,1,2,3,4,5,9,6,7,8,10,11,12,14,21,17,20,22,24,29,37,32,40]))},{path:`search`,name:`search`,component:()=>$(()=>import(`./SearchPage-zLztBgSJ.js`),__vite__mapDeps([41,1,2,3,4,5,11,16,17,23,29,37,42]))},{path:`health`,name:`health`,component:()=>$(()=>import(`./HealthPage-CumhcFln.js`),__vite__mapDeps([43,2,3,4,6,5,10,11,16,17,29,37,44]))},{path:`changelog`,name:`changelog`,component:()=>$(()=>import(`./ChangelogPage-C2x8Y9Db.js`),__vite__mapDeps([45,2,3,4,11,5,15,17,12,29,37,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:`#665fdd`,secondary:`#34d399`,accent:`#665fdd`,dark:`#1a1a2e`,"dark-page":`#1a1a2e`,positive:`#34d399`,negative:`#f87171`,info:`#665fdd`,warning:`#fbbf24`}},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-CRyFzJ0j.js`),[]),$(()=>import(`./network-auth-CimyJZRs.js`),[]),$(()=>import(`./notify-theme-Vqins57F.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`},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};
|