@loicngr/kobo 1.7.27 → 1.7.29
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 +8 -0
- package/dist/mcp-server/kobo-tasks-server.js +27 -0
- package/dist/server/routes/templates.js +19 -1
- package/dist/server/routes/workspaces.js +70 -3
- package/dist/server/services/templates-service.js +35 -0
- package/dist/server/services/usage/providers/claude-code.js +33 -2
- package/dist/server/utils/git-ops.js +101 -3
- package/package.json +1 -1
- package/src/client/dist/spa/assets/{ActivityFeed-CY7iSUwF.js → ActivityFeed-rio_ru8s.js} +1 -1
- package/src/client/dist/spa/assets/{ChangelogPage-DWAmbFWX.js → ChangelogPage-Dk8nKtM0.js} +1 -1
- package/src/client/dist/spa/assets/{CreatePage-YT54FfA1.js → CreatePage-BmGIFI8W.js} +2 -2
- package/src/client/dist/spa/assets/{DiffViewer-C4L5y8Ho.css → DiffViewer-BuYD1EDP.css} +1 -1
- package/src/client/dist/spa/assets/DiffViewer-deM4uqPU.js +8 -0
- package/src/client/dist/spa/assets/{HealthPage-DGh8w9iT.js → HealthPage-DAA51STa.js} +1 -1
- package/src/client/dist/spa/assets/{MainLayout-DKUsEDQ4.css → MainLayout-4vhZRrU2.css} +1 -1
- package/src/client/dist/spa/assets/{MainLayout-C0mTMDDv.js → MainLayout-DrY2_qyP.js} +17 -17
- package/src/client/dist/spa/assets/QSelect-Dm7qaLfk.js +36 -0
- package/src/client/dist/spa/assets/{SearchPage-pIX1EzKl.js → SearchPage-CMH0AoRw.js} +1 -1
- package/src/client/dist/spa/assets/SettingsPage-B7dDhXCS.css +1 -0
- package/src/client/dist/spa/assets/SettingsPage-DH-KTis9.js +9 -0
- package/src/client/dist/spa/assets/WorkspacePage-CH3k_9_s.js +4 -0
- package/src/client/dist/spa/assets/{cssMode-2ylLbTu-.js → cssMode-DmArionU.js} +1 -1
- package/src/client/dist/spa/assets/{editor.api-CadEvLPy.js → editor.api-CseR9xvC.js} +1 -1
- package/src/client/dist/spa/assets/{editor.main-C71mfCQt.js → editor.main-Yih57bDS.js} +3 -3
- package/src/client/dist/spa/assets/{engineFeatures-DM5FzkGJ.js → engineFeatures-d1kZ8NXB.js} +1 -1
- package/src/client/dist/spa/assets/{expand-template-B5Xg2o0V.js → expand-template-D_3H5Och.js} +1 -1
- package/src/client/dist/spa/assets/{freemarker2-BhNdcQrl.js → freemarker2-Cd59aTHU.js} +1 -1
- package/src/client/dist/spa/assets/{handlebars-e8nGt_F5.js → handlebars-CeswicPh.js} +1 -1
- package/src/client/dist/spa/assets/{html-3AMWBd0B.js → html-C3-kLMMe.js} +1 -1
- package/src/client/dist/spa/assets/{htmlMode-C_TeBjBg.js → htmlMode-DQxZ0n2e.js} +1 -1
- package/src/client/dist/spa/assets/i18n-IlYZHxVd.js +1 -0
- package/src/client/dist/spa/assets/{index-BHT72IUw.js → index-C0H1sHuD.js} +8 -8
- package/src/client/dist/spa/assets/{javascript-DNXV1m0n.js → javascript-0NpnFHx9.js} +1 -1
- package/src/client/dist/spa/assets/{jsonMode-CoKVM_Q0.js → jsonMode-Byj6sx5w.js} +1 -1
- package/src/client/dist/spa/assets/kobo-commands-B_DBKQxq.js +9 -0
- package/src/client/dist/spa/assets/{liquid-Bor4GGNF.js → liquid-CzcaXBnO.js} +1 -1
- package/src/client/dist/spa/assets/{mdx-ybAriXVK.js → mdx-Dl6UUR_U.js} +1 -1
- package/src/client/dist/spa/assets/{monaco.contribution-BDBos_h5.js → monaco.contribution-mzaMwnEg.js} +2 -2
- package/src/client/dist/spa/assets/permissionModes-BUhr5Wdx.js +1 -0
- package/src/client/dist/spa/assets/{python-B8yv8Fk-.js → python-BFAu7VF2.js} +1 -1
- package/src/client/dist/spa/assets/{razor-BCfu0JXU.js → razor-BET2CB_3.js} +1 -1
- package/src/client/dist/spa/assets/{render-chat-markdown-sjnPe3Vu.js → render-chat-markdown-DsbgZODM.js} +1 -1
- package/src/client/dist/spa/assets/{tsMode-Cha-D9yo.js → tsMode-ORpv-QPD.js} +1 -1
- package/src/client/dist/spa/assets/{typescript-DPQ0P6qa.js → typescript-DGcONjjW.js} +1 -1
- package/src/client/dist/spa/assets/{use-onboarding-B6FZK2Yn.js → use-onboarding-B9TeTfkj.js} +1 -1
- package/src/client/dist/spa/assets/{xml-pWJPZqZ8.js → xml-Cs4DTg3L.js} +1 -1
- package/src/client/dist/spa/assets/{yaml-YsHRVX_S.js → yaml-HxNN05si.js} +1 -1
- package/src/client/dist/spa/index.html +1 -1
- package/src/mcp-server/kobo-tasks-server.ts +29 -0
- package/src/client/dist/spa/assets/DiffViewer-DTthEOys.js +0 -8
- package/src/client/dist/spa/assets/SettingsPage-C64_E1oJ.css +0 -1
- package/src/client/dist/spa/assets/SettingsPage-COBWjs_d.js +0 -9
- package/src/client/dist/spa/assets/WorkspacePage-CTaTo1Wh.js +0 -4
- package/src/client/dist/spa/assets/i18n-BPs_6dhe.js +0 -1
- package/src/client/dist/spa/assets/kobo-commands-DRDkhOO8.js +0 -9
- package/src/client/dist/spa/assets/permissionModes-Cebx7fq6.js +0 -1
- package/src/client/dist/spa/assets/skill-suite-prompts-8f_JW79j.js +0 -36
- /package/src/client/dist/spa/assets/{ClosePopup-0MWohgml.js → ClosePopup-BWYh08p9.js} +0 -0
- /package/src/client/dist/spa/assets/{QChip-D2TVel5I.js → QChip-5bnjPnRz.js} +0 -0
- /package/src/client/dist/spa/assets/{QList-CRYZxnPD.js → QList-Ch5K5W7r.js} +0 -0
- /package/src/client/dist/spa/assets/{QMenu-Yx1QEIHC.js → QMenu-CoPEAblj.js} +0 -0
- /package/src/client/dist/spa/assets/{build-path-tree-BKx2q92A.js → build-path-tree-B9aeh1tv.js} +0 -0
- /package/src/client/dist/spa/assets/{use-quasar-q6dh7QVJ.js → use-quasar-sypIWZgU.js} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MainLayout-
|
|
2
|
-
import{$ as e,A as t,C as n,D as r,G as i,I as a,L as o,N as s,P as c,St as l,T as u,W as d,Z as f,_ as p,at as m,b as h,d as g,et as _,f as v,l as y,nt as ee,p as b,r as te,rt as ne,tt as re,u as x,y as S,z as C}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{B as w,D as T,I as E,L as ie,N as ae,O as D,P as O,R as oe,T as se,b as ce,l as k,n as le,r as A,s as ue,t as j,x as M,z as N}from"./QIcon-BmEX2rXO.js";import{a as P,d as F,f as I,i as de,o as fe,p as pe,r as me,u as he}from"./use-id-BCnfiBjU.js";import{A as ge,B as _e,D as ve,F as ye,H as be,M as xe,N as Se,O as Ce,P as we,R as L,S as Te,V as Ee,_ as De,d as Oe,f as ke,j as Ae,k as je,l as Me,m as Ne,p as Pe,r as Fe,t as Ie,u as Le,v as Re,z as ze}from"./notifications-l1Pxijve.js";import{n as Be,r as Ve,t as He}from"./QRadio-M9mC5jZy.js";import{l as Ue,t as We}from"./QBtn-CoU-UC_j.js";import{n as Ge,t as Ke}from"./vue-i18n-Cq-KgjJC.js";import{t as qe}from"./QInput-D0t39uK_.js";import{t as Je}from"./QCheckbox-Cq2STfHp.js";import{t as Ye}from"./QToggle-DBzTAIbK.js";var Xe=[`sm`,`md`,`lg`,`xl`],{passive:Ze}=T,Qe=E({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:D,setDebounce:D,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed===!0){e.config.screen!==void 0&&(e.config.screen.bodyClasses===!1?document.body.classList.remove(`screen--${this.name}`):this.__update(!0));return}let{visualViewport:n}=window,r=n||window,i=document.scrollingElement||document.documentElement,a=n===void 0||I.is.mobile===!0?()=>[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===!0&&this.lt.md===!0,this.md=this.gt.sm===!0&&this.lt.lg===!0,this.lg=this.gt.md===!0&&this.lt.xl===!0,this.xl=this.gt.lg,r=this.xs===!0&&`xs`||this.sm===!0&&`sm`||this.md===!0&&`md`||this.lg===!0&&`lg`||`xl`,r!==this.name&&(o===!0&&(document.body.classList.remove(`screen--${this.name}`),document.body.classList.add(`screen--${r}`)),this.name=r)};let s,c={},l=16;this.setSizes=e=>{Xe.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`)&&Xe.forEach(t=>{this.sizes[t]=parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{Xe.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{s!==void 0&&r.removeEventListener(`resize`,s,Ze),s=e>0?he(this.__update,e):this.__update,r.addEventListener(`resize`,s,Ze)},this.setDebounce(l),Object.keys(c).length===0?this.__update():(this.setSizes(c),c=void 0),o===!0&&this.name===`xs`&&document.body.classList.add(`screen--xs`)};pe.value===!0?t.push(u):u()}}),R=E({isActive:!1,mode:!1},{__media:void 0,set(e){R.mode=e,e===`auto`?(R.__media===void 0&&(R.__media=window.matchMedia(`(prefers-color-scheme: dark)`),R.__updateMedia=()=>{R.set(`auto`)},R.__media.addListener(R.__updateMedia)),e=R.__media.matches):R.__media!==void 0&&(R.__media.removeListener(R.__updateMedia),R.__media=void 0),R.isActive=e===!0,document.body.classList.remove(`body--${e===!0?`light`:`dark`}`),document.body.classList.add(`body--${e===!0?`dark`:`light`}`)},toggle(){R.set(R.isActive===!1)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,this.__installed!==!0&&this.set(n===void 0?!1:n)}});function $e(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 et(e){if(e.ios===!0)return`ios`;if(e.android===!0)return`android`}function tt({is:e,has:t,within:n},r){let i=[e.desktop===!0?`desktop`:`mobile`,`${t.touch===!1?`no-`:``}touch`];if(e.mobile===!0){let t=et(e);t!==void 0&&i.push(`platform-`+t)}if(e.nativeMobile===!0){let t=e.nativeMobileWrapper;i.push(t),i.push(`native-mobile`),e.ios===!0&&(r[t]===void 0||r[t].iosStatusBarPadding!==!1)&&i.push(`q-ios-padding`)}else e.electron===!0?i.push(`electron`):e.bex===!0&&i.push(`bex`);return n.iframe===!0&&i.push(`within-iframe`),i}function nt(){let{is:e}=I,t=document.body.className,n=new Set(t.replace(/ {2}/g,` `).split(` `));if(e.nativeMobile!==!0&&e.electron!==!0&&e.bex!==!0){if(e.desktop===!0)n.delete(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`),n.add(`desktop`);else if(e.mobile===!0){n.delete(`desktop`),n.add(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`);let t=et(e);t!==void 0&&n.add(`platform-${t}`)}}I.has.touch===!0&&(n.delete(`no-touch`),n.add(`touch`)),I.within.iframe===!0&&n.add(`within-iframe`);let r=Array.from(n).join(` `);t!==r&&(document.body.className=r)}function rt(e){for(let t in e)$e(t,e[t])}var it={install(e){if(this.__installed!==!0){if(pe.value===!0)nt();else{let{$q:t}=e;t.config.brand!==void 0&&rt(t.config.brand);let n=tt(I,t.config);document.body.classList.add.apply(document.body.classList,n)}I.is.ios===!0&&document.body.addEventListener(`touchstart`,D),window.addEventListener(`keydown`,M,!0)}}},at={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 ot(){let e=Array.isArray(navigator.languages)===!0&&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 z=E({__qLang:{}},{getLocale:ot,set(e=at,t){let n={...e,rtl:e.rtl===!0,getLocale:ot};if(n.set=z.set,z.__langConfig===void 0||z.__langConfig.noHtmlAttrs!==!0){let e=document.documentElement;e.setAttribute(`dir`,n.rtl===!0?`rtl`:`ltr`),e.setAttribute(`lang`,n.isoName)}Object.assign(z.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=z.__qLang,z.__langConfig=e.config.lang,this.__installed===!0?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qLang,{get(){return Reflect.get(...arguments)},ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`&&e!==`getLocale`)}}),this.set(t||at))}}),st={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`}},ct=E({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=ct.set,Object.assign(ct.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){e.config.iconMapFn!==void 0&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,ie(e,`iconMapFn`,()=>this.iconMapFn,e=>{this.iconMapFn=e}),this.__installed===!0?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get(){return Reflect.get(...arguments)},ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`)}}),this.set(t||st))}}),lt=[F,it,R,Qe,be,z,ct];function ut(e,t){let n=w(e);n.config.globalProperties=t.config.globalProperties;let{reload:r,...i}=t._context;return Object.assign(n._context,i),n}function dt(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}function ft(e,t,n){e.config.globalProperties.$q=n.$q,e.provide(`_q_`,n.$q),dt(n,lt),t.components!==void 0&&Object.values(t.components).forEach(t=>{L(t)===!0&&t.name!==void 0&&e.component(t.name,t)}),t.directives!==void 0&&Object.values(t.directives).forEach(t=>{L(t)===!0&&t.name!==void 0&&e.directive(t.name,t)}),t.plugins!==void 0&&dt(n,Object.values(t.plugins).filter(e=>typeof e.install==`function`&<.includes(e)===!1)),pe.value===!0&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}var pt={name:`Quasar`,version:`2.19.3`,install:function(e,t={}){let n={version:`2.19.3`};Ee===!1?(t.config!==void 0&&Object.assign(_e,t.config),n.config={..._e},ze()):n.config=t.config||{},ft(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})},lang:z,iconSet:ct},B=O({name:`QCardSection`,props:{tag:{type:String,default:`div`},horizontal:Boolean},setup(e,{slots:t}){let r=y(()=>`q-card__section q-card__section--${e.horizontal===!0?`horiz row no-wrap`:`vert`}`);return()=>n(e.tag,{class:r.value},ue(t.default))}}),mt=O({name:`QCard`,props:{...A,tag:{type:String,default:`div`},square:Boolean,flat:Boolean,bordered:Boolean},setup(e,{slots:t}){let{proxy:{$q:r}}=h(),i=le(e,r),a=y(()=>`q-card`+(i.value===!0?` q-card--dark q-dark`:``)+(e.bordered===!0?` q-card--bordered`:``)+(e.square===!0?` q-card--square no-border-radius`:``)+(e.flat===!0?` q-card--flat no-shadow`:``));return()=>n(e.tag,{class:a.value},ue(t.default))}});function ht(e,n,r){let i;function a(){i!==void 0&&(be.remove(i),i=void 0)}return t(()=>{e.value===!0&&a()}),{removeFromHistory:a,addToHistory(){i={condition:()=>r.value===!0,handler:n},be.add(i)}}}var gt=0,_t,vt,yt,bt=!1,xt,St,Ct,wt=null;function Tt(e){Et(e)&&ae(e)}function Et(e){if(e.target===document.body||e.target.classList.contains(`q-layout__backdrop`))return!0;let t=se(e),n=e.shiftKey&&!e.deltaX,r=!n&&Math.abs(e.deltaX)<=Math.abs(e.deltaY),i=n||r?e.deltaY:e.deltaX;for(let e=0;e<t.length;e++){let n=t[e];if(Re(n,r))return r?i<0&&n.scrollTop===0?!0:i>0&&n.scrollTop+n.clientHeight===n.scrollHeight:i<0&&n.scrollLeft===0?!0:i>0&&n.scrollLeft+n.clientWidth===n.scrollWidth}return!0}function Dt(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function Ot(e){bt!==!0&&(bt=!0,requestAnimationFrame(()=>{bt=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:r}=document.scrollingElement;(yt===void 0||t!==window.innerHeight)&&(yt=n-t,document.scrollingElement.scrollTop=r),r>yt&&(document.scrollingElement.scrollTop-=Math.ceil((r-yt)/8))}))}function kt(e){let t=document.body,n=window.visualViewport!==void 0;if(e===`add`){let{overflowY:e,overflowX:r}=window.getComputedStyle(t);_t=Ne(window),vt=De(window),xt=t.style.left,St=t.style.top,Ct=window.location.href,t.style.left=`-${_t}px`,t.style.top=`-${vt}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`),t.classList.add(`q-body--prevent-scroll`),document.qScrollPrevented=!0,I.is.ios===!0&&(n===!0?(window.scrollTo(0,0),window.visualViewport.addEventListener(`resize`,Ot,T.passiveCapture),window.visualViewport.addEventListener(`scroll`,Ot,T.passiveCapture),window.scrollTo(0,0)):window.addEventListener(`scroll`,Dt,T.passiveCapture))}I.is.desktop===!0&&I.is.mac===!0&&window[`${e}EventListener`](`wheel`,Tt,T.notPassive),e===`remove`&&(I.is.ios===!0&&(n===!0?(window.visualViewport.removeEventListener(`resize`,Ot,T.passiveCapture),window.visualViewport.removeEventListener(`scroll`,Ot,T.passiveCapture)):window.removeEventListener(`scroll`,Dt,T.passiveCapture)),t.classList.remove(`q-body--prevent-scroll`),t.classList.remove(`q-body--force-scrollbar-x`),t.classList.remove(`q-body--force-scrollbar-y`),document.qScrollPrevented=!1,t.style.left=xt,t.style.top=St,window.location.href===Ct&&window.scrollTo(_t,vt),yt=void 0)}function At(e){let t=`add`;if(e===!0){if(gt++,wt!==null){clearTimeout(wt),wt=null;return}if(gt>1)return}else{if(gt===0||(gt--,gt>0))return;if(t=`remove`,I.is.ios===!0&&I.is.nativeMobile===!0){wt!==null&&clearTimeout(wt),wt=setTimeout(()=>{kt(t),wt=null},100);return}}kt(t)}function jt(){let e;return{preventBodyScroll(t){t!==e&&(e!==void 0||t===!0)&&(e=t,At(t))}}}var Mt=0,Nt={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`},Pt={standard:[`scale`,`scale`],top:[`slide-down`,`slide-up`],bottom:[`slide-up`,`slide-down`],right:[`slide-left`,`slide-right`],left:[`slide-right`,`slide-left`]},Ft=O({name:`QDialog`,inheritAttrs:!1,props:{...Se,...ge,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:[...xe,`shake`,`click`,`escapeKey`],setup(e,{slots:r,emit:i,attrs:a}){let o=h(),s=_(null),c=_(!1),l=_(!1),u=null,f=null,p,m,g=y(()=>e.persistent!==!0&&e.noRouteDismiss!==!0&&e.seamless!==!0),{preventBodyScroll:v}=jt(),{registerTimeout:ee}=ye(),{registerTick:b,removeTick:te}=we(),{transitionProps:ne,transitionStyle:re}=je(e,()=>Pt[e.position][0],()=>Pt[e.position][1]),x=y(()=>re.value+(e.backdropFilter===void 0?``:`;backdrop-filter:${e.backdropFilter};-webkit-backdrop-filter:${e.backdropFilter}`)),{showPortal:S,hidePortal:C,portalIsAccessible:w,renderPortal:T}=Te(o,s,pe,`dialog`),{hide:E}=Ae({showing:c,hideOnRouteChange:g,handleShow:k,handleHide:le,processOnMount:!0}),{addToHistory:ie,removeFromHistory:ae}=ht(c,E,g),D=y(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${e.maximized===!0?`maximized`:`minimized`} q-dialog__inner--${e.position} ${Nt[e.position]}`+(l.value===!0?` q-dialog__inner--animating`:``)+(e.fullWidth===!0?` q-dialog__inner--fullwidth`:``)+(e.fullHeight===!0?` q-dialog__inner--fullheight`:``)+(e.square===!0?` q-dialog__inner--square`:``)),O=y(()=>c.value===!0&&e.seamless!==!0),se=y(()=>e.autoClose===!0?{onClick:F}:{}),ce=y(()=>[`q-dialog fullscreen no-pointer-events q-dialog--${O.value===!0?`modal`:`seamless`}`,a.class]);d(()=>e.maximized,e=>{c.value===!0&&P(e)}),d(O,e=>{v(e),e===!0?(Le(de),ke(M)):(Oe(de),Pe(M))});function k(t){ie(),f=e.noRefocus===!1&&document.activeElement!==null?document.activeElement:null,P(e.maximized),S(),l.value=!0,e.noFocus===!0?te():(document.activeElement?.blur(),b(A)),ee(()=>{if(o.proxy.$q.platform.is.ios===!0){if(e.seamless!==!0&&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()}m=!0,s.value.click(),m=!1}S(!0),l.value=!1,i(`show`,t)},e.transitionDuration)}function le(t){te(),ae(),N(!0),l.value=!0,C(),f!==null&&(((t?.type.indexOf(`key`)===0?f.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||f).focus(),f=null),ee(()=>{C(!0),l.value=!1,i(`hide`,t)},e.transitionDuration)}function A(e){fe(()=>{let t=s.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)!==!0&&(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 j(e){e&&typeof e.focus==`function`?e.focus({preventScroll:!0}):A(),i(`shake`);let t=s.value;t!==null&&(t.classList.remove(`q-animate--scale`),t.classList.add(`q-animate--scale`),u!==null&&clearTimeout(u),u=setTimeout(()=>{u=null,s.value!==null&&(t.classList.remove(`q-animate--scale`),A())},170))}function M(){e.seamless!==!0&&(e.persistent===!0||e.noEscDismiss===!0?e.maximized!==!0&&e.noShake!==!0&&j():(i(`escapeKey`),E()))}function N(t){u!==null&&(clearTimeout(u),u=null),(t===!0||c.value===!0)&&(P(!1),e.seamless!==!0&&(v(!1),Oe(de),Pe(M))),t!==!0&&(f=null)}function P(e){e===!0?p!==!0&&(Mt<1&&document.body.classList.add(`q-body--dialog`),Mt++,p=!0):p===!0&&(Mt<2&&document.body.classList.remove(`q-body--dialog`),Mt--,p=!1)}function F(e){m!==!0&&(E(e),i(`click`,e))}function I(t){e.persistent!==!0&&e.noBackdropDismiss!==!0?E(t):e.noShake!==!0&&j()}function de(t){e.allowFocusOutside!==!0&&w.value===!0&&Ue(s.value,t.target)!==!0&&A(`[tabindex]:not([tabindex="-1"])`)}Object.assign(o.proxy,{focus:A,shake:j,__updateRefocusTarget(e){f=e||null}}),t(N);function pe(){return n(`div`,{role:`dialog`,"aria-modal":O.value===!0?`true`:`false`,...a,class:ce.value},[n(oe,{name:`q-transition--fade`,appear:!0},()=>O.value===!0?n(`div`,{class:`q-dialog__backdrop fixed-full`,style:x.value,"aria-hidden":`true`,tabindex:-1,onClick:I}):null),n(oe,ne.value,()=>c.value===!0?n(`div`,{ref:s,class:D.value,style:re.value,tabindex:-1,...se.value},ue(r.default)):null)])}return T}}),It=P(`migration`,()=>{let e=_({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}}),Lt={class:`text-h6`},Rt={class:`text-h6`},zt={class:`text-h6 text-negative`},Bt={class:`q-mt-sm`},Vt={key:0,class:`q-mt-md text-caption`},Ht={class:`q-mt-md text-caption`},Ut=S({__name:`MigrationOverlay`,setup(e){let{t}=Ge(),n=It(),r=y(()=>[`backing-up`,`running`,`error`].includes(n.status.state));return s(()=>{n.fetchInitial()}),(e,o)=>(a(),g(Ft,{modelValue:r.value,"onUpdate:modelValue":o[0]||=e=>r.value=e,persistent:``,"no-backdrop-dismiss":``},{default:i(()=>[p(mt,{style:{"min-width":`400px`}},{default:i(()=>[m(n).status.state===`backing-up`?(a(),g(B,{key:0},{default:i(()=>[x(`div`,Lt,l(m(t)(`migration.backing_up`)),1),p(k,{class:`q-mt-md`})]),_:1})):m(n).status.state===`running`?(a(),g(B,{key:1},{default:i(()=>[x(`div`,Rt,l(m(t)(`migration.running`,{processed:m(n).status.processed,total:m(n).status.total})),1),p(Ve,{value:m(n).status.total>0?m(n).status.processed/m(n).status.total:0,class:`q-mt-md`},null,8,[`value`])]),_:1})):m(n).status.state===`error`?(a(),g(B,{key:2},{default:i(()=>[x(`div`,zt,l(m(t)(`migration.error`)),1),x(`div`,Bt,l(m(n).status.errorMessage),1),m(n).status.backupPath?(a(),b(`div`,Vt,l(m(t)(`migration.backup_location`,{path:m(n).status.backupPath})),1)):v(``,!0),x(`div`,Ht,l(m(t)(`migration.retry`)),1)]),_:1})):v(``,!0)]),_:1})]),_:1},8,[`modelValue`]))}}),Wt=P(`templates`,{state:()=>({templates:[],loading:!1,loaded:!1}),actions:{async fetchTemplates(){if(!this.loading){this.loading=!0;try{let e=await fetch(`/api/templates`);if(!e.ok)throw Error(`HTTP ${e.status}`);this.templates=(await e.json()).templates,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)}}}),Gt=0,Kt={},qt={},V={},Jt={},Yt=/^\s*$/,Xt=[],Zt=[void 0,null,!0,!1,``],Qt=[`top-left`,`top-right`,`bottom-left`,`bottom-right`,`top`,`bottom`,`left`,`right`,`center`],$t=[`top-left`,`top-right`,`bottom-left`,`bottom-right`],en={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 tn(e,t,n){if(!e)return an(`parameter required`);let r,i={textColor:`white`};if(e.ignoreDefaults!==!0&&Object.assign(i,Kt),L(e)===!1&&(i.type&&Object.assign(i,en[i.type]),e={message:e}),Object.assign(i,en[e.type||i.type],e),typeof i.icon==`function`&&(i.icon=i.icon(t)),i.spinner?(i.spinner===!0&&(i.spinner=k),i.spinner=f(i.spinner)):i.spinner=!1,i.meta={hasMedia:!!(i.spinner!==!1||i.icon||i.avatar),hasText:rn(i.message)||rn(i.caption)},i.position){if(Qt.includes(i.position)===!1)return an(`wrong position`,e)}else i.position=`bottom`;if(Zt.includes(i.timeout)===!0)i.timeout=5e3;else{let t=Number(i.timeout);if(isNaN(t)||t<0)return an(`wrong timeout`,e);i.timeout=Number.isFinite(t)?t:0}i.timeout===0?i.progress=!1:i.progress===!0&&(i.meta.progressClass=`q-notification__progress`+(i.progressClass?` ${i.progressClass}`:``),i.meta.progressStyle={animationDuration:`${i.timeout+1e3}ms`});let a=(Array.isArray(e.actions)===!0?e.actions:[]).concat(e.ignoreDefaults!==!0&&Array.isArray(Kt.actions)===!0?Kt.actions:[]).concat(Array.isArray(en[e.type]?.actions)===!0?en[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!==!0&&s()}:()=>{s()}})),i.multiLine===void 0&&(i.multiLine=i.actions.length>1),Object.assign(i.meta,{class:`q-notification row items-stretch q-notification--${i.multiLine===!0?`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===!0?`column no-wrap justify-center`:`row items-center`),contentClass:`q-notification__content row items-center`+(i.multiLine===!0?``:` col`),leftClass:i.meta.hasText===!0?`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].concat(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===!0?`justify-end`:`col-auto`)+(i.meta.hasMedia===!0?` 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=V[i.position].value.indexOf(n.notif);V[i.position].value[e]=i}else{let t=qt[i.meta.group];if(t===void 0){if(i.meta.uid=Gt++,i.meta.badge=1,[`left`,`right`,`center`].indexOf(i.position)!==-1)V[i.position].value.splice(Math.floor(V[i.position].value.length/2),0,i);else{let e=i.position.indexOf(`top`)===-1?`push`:`unshift`;V[i.position].value[e](i)}i.group!==void 0&&(qt[i.meta.group]=i)}else{if(t.meta.timer&&(clearTimeout(t.meta.timer),t.meta.timer=void 0),i.badgePosition!==void 0){if($t.includes(i.badgePosition)===!1)return an(`wrong badgePosition`,e)}else i.badgePosition=`top-${i.position.indexOf(`left`)===-1?`left`:`right`}`;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=V[i.position].value.indexOf(t);V[i.position].value[n]=qt[i.meta.group]=i}}let s=()=>{nn(i),r=void 0};if(i.timeout>0&&(i.meta.timer=setTimeout(()=>{i.meta.timer=void 0,s()},i.timeout+1e3)),i.group!==void 0)return t=>{t===void 0?s():an(`trying to update a grouped one which is forbidden`,e)};if(r={dismiss:s,config:e,notif:i},n!==void 0){Object.assign(n,r);return}return e=>{r!==void 0&&(e===void 0?r.dismiss():tn(Object.assign({},r.config,e,{group:!1,position:i.position}),t,r))}}function nn(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=V[e.position].value.indexOf(e);if(t!==-1){e.group!==void 0&&delete qt[e.meta.group];let n=Xt[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}V[e.position].value.splice(t,1),typeof e.onDismiss==`function`&&e.onDismiss()}}function rn(e){return e!=null&&Yt.test(e)!==!0}function an(e,t){return console.error(`Notify: ${e}`,t),!1}function on(){return O({name:`QNotifications`,devtools:{hide:!0},setup(){return()=>n(`div`,{class:`q-notifications`},Qt.map(e=>n(N,{key:e,class:Jt[e],tag:`div`,name:`q-notification--${e}`},()=>V[e].value.map(e=>{let t=e.meta,r=[];if(t.hasMedia===!0&&(e.spinner===!1?e.icon?r.push(n(j,{class:`q-notification__icon q-notification__icon--`+t.leftClass,name:e.icon,color:e.iconColor,size:e.iconSize,role:`img`})):e.avatar&&r.push(n(Me,{class:`q-notification__avatar q-notification__avatar--`+t.leftClass},()=>n(`img`,{src:e.avatar,"aria-hidden":`true`}))):r.push(n(e.spinner,{class:`q-notification__spinner q-notification__spinner--`+t.leftClass,color:e.spinnerColor,size:e.spinnerSize}))),t.hasText===!0){let t,i={class:`q-notification__message col`};if(e.html===!0)i.innerHTML=e.caption?`<div>${e.message}</div><div class="q-notification__caption">${e.caption}</div>`:e.message;else{let r=[e.message];t=e.caption?[n(`div`,r),n(`div`,{class:`q-notification__caption`},[e.caption])]:r}r.push(n(`div`,i,t))}let i=[n(`div`,{class:t.contentClass},r)];return e.progress===!0&&i.push(n(`div`,{key:`${t.uid}|p|${t.badge}`,class:t.progressClass,style:t.progressStyle})),e.actions!==void 0&&i.push(n(`div`,{class:t.actionsClass},e.actions.map(e=>n(We,e)))),t.badge>1&&i.push(n(`div`,{key:`${t.uid}|${t.badge}`,class:e.meta.badgeClass,style:e.badgeStyle},[t.badge])),n(`div`,{ref:e=>{Xt[String(t.uid)]=e},key:t.uid,class:t.class,...t.attrs},[n(`div`,{class:t.wrapperClass},i)])}))))}})}var sn={setDefaults(e){L(e)===!0&&Object.assign(Kt,e)},registerType(e,t){L(t)===!0&&(en[e]=t)},install({$q:e,parentApp:t}){if(e.notify=this.create=t=>tn(t,e),e.notify.setDefaults=this.setDefaults,e.notify.registerType=this.registerType,e.config.notify!==void 0&&this.setDefaults(e.config.notify),this.__installed!==!0){Qt.forEach(e=>{V[e]=_([]);let t=[`left`,`center`,`right`].includes(e)===!0?`center`:e.indexOf(`top`)===-1?`bottom`:`top`,n=e.indexOf(`left`)===-1?e.indexOf(`right`)===-1?`center`:`end`:`start`;Jt[e]=`q-notifications__list q-notifications__list--${t} fixed column no-wrap ${[`left`,`right`].includes(e)?`items-${e===`left`?`start`:`end`} justify-center`:e===`center`?`flex-center`:`items-${n}`}`});let e=ve(`q-notify`);ut(on(),t).mount(e)}}},cn={"common.save":`Speichern`,"common.cancel":`Abbrechen`,"common.delete":`Löschen`,"common.close":`Schließen`,"common.details":`Details`,"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.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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.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.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.sonnetClassicDescription":`Ausgewogen`,"model.sonnet1mDescription":`Ausgewogen, 1M Kontext`,"model.haikuDescription":`Am schnellsten`,"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.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Auf Coding spezialisiertes Modell für komplexe Softwareentwicklung`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"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.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.needsAttention":`Aufmerksamkeit erforderlich`,"workspaceList.running":`Aktiv`,"workspaceList.idle":`Inaktiv`,"workspaceList.archived":`Archiviert`,"workspaceList.noWorkspaces":`Noch keine Arbeitsbereiche`,"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.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.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.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.interruptTooltip":`Sanfte Unterbrechung (wie Escape) — stoppt das aktuelle Tool, hält die Sitzung aktiv`,"workspacePage.pendingNextRun":`Beim nächsten Start angewendet`,"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`,"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.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":`Woran möchten Sie arbeiten?`,"createPage.claudeCode":`Claude Code`,"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.manualHint":`Kein Notion-Ticket? Fügen Sie Ihre Aufgaben und Akzeptanzkriterien manuell hinzu — sie werden dem Claude-Agent als Kontext mitgegeben.`,"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.create":`Erstellen`,"createPage.skipSetupScript":`Setup-Skript überspringen`,"createPage.attachWorktreeToggle":`Bestehenden Worktree anhängen`,"createPage.attachWorktreeEnabled":`Bestehenden Worktree wiederverwenden`,"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.notionImportHint":`Klicken Sie auf „Aus Notion importieren", um Unteraufgaben automatisch aus einem Ticket zu extrahieren.`,"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.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.`,"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.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.notificationSound":`Benachrichtigungston`,"settings.notificationSoundPreview":`Anhören`,"settings.notificationVolume":`Lautstärke`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Arbeit erledigt`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Das wird knallen`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"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.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.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-DrY2_qyP.js","assets/_plugin-vue_export-helper-r4mAJOHR.js","assets/vue-i18n-Cq-KgjJC.js","assets/runtime-core.esm-bundler-D_RRiKBh.js","assets/QIcon-BmEX2rXO.js","assets/render-chat-markdown-DsbgZODM.js","assets/use-onboarding-B9TeTfkj.js","assets/notifications-l1Pxijve.js","assets/use-id-BCnfiBjU.js","assets/QBtn-CoU-UC_j.js","assets/use-onboarding-B3l7mx48.css","assets/QBadge-DNQSqPg-.js","assets/build-path-tree-B9aeh1tv.js","assets/QCheckbox-Cq2STfHp.js","assets/use-checkbox-DnSuDqo2.js","assets/QInput-D0t39uK_.js","assets/QTooltip-CwBZU_bs.js","assets/QRadio-M9mC5jZy.js","assets/QChip-5bnjPnRz.js","assets/QSelect-Dm7qaLfk.js","assets/QItemSection-DRg-QuAD.js","assets/QItemLabel-Btqw0P7M.js","assets/QMenu-CoPEAblj.js","assets/QList-Ch5K5W7r.js","assets/QScrollObserver-CAlbLisQ.js","assets/QSpace-Crcx82On.js","assets/QToggle-DBzTAIbK.js","assets/engineFeatures-d1kZ8NXB.js","assets/touch-2Qa-HSDZ.js","assets/use-quasar-sypIWZgU.js","assets/ClosePopup-BWYh08p9.js","assets/TouchPan-DXGxNMLq.js","assets/documents-CX2-4fhr.js","assets/formatters-BKR66G3t.js","assets/kobo-commands-B_DBKQxq.js","assets/MainLayout-4vhZRrU2.css","assets/WorkspacePage-CH3k_9_s.js","assets/QBanner-C_TvxtXi.js","assets/QPage-3-ah4oor.js","assets/QSpinnerDots-DspFKwCZ.js","assets/expand-template-D_3H5Och.js","assets/expand-template-D2yUa54D.css","assets/permissionModes-BUhr5Wdx.js","assets/WorkspacePage-36QGRRCt.css","assets/CreatePage-BmGIFI8W.js","assets/QExpansionItem-CiBP4NiY.js","assets/CreatePage-DDuStqsB.css","assets/SettingsPage-DH-KTis9.js","assets/SettingsPage-B7dDhXCS.css","assets/SearchPage-CMH0AoRw.js","assets/SearchPage-cVwt0DaQ.css","assets/HealthPage-DAA51STa.js","assets/ChangelogPage-Dk8nKtM0.js","assets/ChangelogPage-CQ33An2f.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{$ as e,A as t,C as n,D as r,G as i,I as a,L as o,N as s,P as c,St as l,T as u,W as d,Z as f,_ as p,at as m,b as h,d as g,et as _,f as v,l as y,nt as ee,p as b,r as te,rt as ne,tt as re,u as x,y as S,z as C}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{B as w,D as T,I as E,L as ie,N as ae,O as D,P as O,R as oe,T as se,b as ce,l as k,n as le,r as A,s as ue,t as j,x as M,z as N}from"./QIcon-BmEX2rXO.js";import{a as P,d as F,f as I,i as de,o as fe,p as pe,r as me,u as he}from"./use-id-BCnfiBjU.js";import{A as ge,B as _e,D as ve,F as ye,H as be,M as xe,N as Se,O as Ce,P as we,R as L,S as Te,V as Ee,_ as De,d as Oe,f as ke,j as Ae,k as je,l as Me,m as Ne,p as Pe,r as Fe,t as Ie,u as Le,v as Re,z as ze}from"./notifications-l1Pxijve.js";import{n as Be,r as Ve,t as He}from"./QRadio-M9mC5jZy.js";import{l as Ue,t as We}from"./QBtn-CoU-UC_j.js";import{n as Ge,t as Ke}from"./vue-i18n-Cq-KgjJC.js";import{t as qe}from"./QInput-D0t39uK_.js";import{t as Je}from"./QCheckbox-Cq2STfHp.js";import{t as Ye}from"./QToggle-DBzTAIbK.js";var Xe=[`sm`,`md`,`lg`,`xl`],{passive:Ze}=T,Qe=E({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:D,setDebounce:D,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed===!0){e.config.screen!==void 0&&(e.config.screen.bodyClasses===!1?document.body.classList.remove(`screen--${this.name}`):this.__update(!0));return}let{visualViewport:n}=window,r=n||window,i=document.scrollingElement||document.documentElement,a=n===void 0||I.is.mobile===!0?()=>[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===!0&&this.lt.md===!0,this.md=this.gt.sm===!0&&this.lt.lg===!0,this.lg=this.gt.md===!0&&this.lt.xl===!0,this.xl=this.gt.lg,r=this.xs===!0&&`xs`||this.sm===!0&&`sm`||this.md===!0&&`md`||this.lg===!0&&`lg`||`xl`,r!==this.name&&(o===!0&&(document.body.classList.remove(`screen--${this.name}`),document.body.classList.add(`screen--${r}`)),this.name=r)};let s,c={},l=16;this.setSizes=e=>{Xe.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`)&&Xe.forEach(t=>{this.sizes[t]=parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{Xe.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{s!==void 0&&r.removeEventListener(`resize`,s,Ze),s=e>0?he(this.__update,e):this.__update,r.addEventListener(`resize`,s,Ze)},this.setDebounce(l),Object.keys(c).length===0?this.__update():(this.setSizes(c),c=void 0),o===!0&&this.name===`xs`&&document.body.classList.add(`screen--xs`)};pe.value===!0?t.push(u):u()}}),R=E({isActive:!1,mode:!1},{__media:void 0,set(e){R.mode=e,e===`auto`?(R.__media===void 0&&(R.__media=window.matchMedia(`(prefers-color-scheme: dark)`),R.__updateMedia=()=>{R.set(`auto`)},R.__media.addListener(R.__updateMedia)),e=R.__media.matches):R.__media!==void 0&&(R.__media.removeListener(R.__updateMedia),R.__media=void 0),R.isActive=e===!0,document.body.classList.remove(`body--${e===!0?`light`:`dark`}`),document.body.classList.add(`body--${e===!0?`dark`:`light`}`)},toggle(){R.set(R.isActive===!1)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,this.__installed!==!0&&this.set(n===void 0?!1:n)}});function $e(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 et(e){if(e.ios===!0)return`ios`;if(e.android===!0)return`android`}function tt({is:e,has:t,within:n},r){let i=[e.desktop===!0?`desktop`:`mobile`,`${t.touch===!1?`no-`:``}touch`];if(e.mobile===!0){let t=et(e);t!==void 0&&i.push(`platform-`+t)}if(e.nativeMobile===!0){let t=e.nativeMobileWrapper;i.push(t),i.push(`native-mobile`),e.ios===!0&&(r[t]===void 0||r[t].iosStatusBarPadding!==!1)&&i.push(`q-ios-padding`)}else e.electron===!0?i.push(`electron`):e.bex===!0&&i.push(`bex`);return n.iframe===!0&&i.push(`within-iframe`),i}function nt(){let{is:e}=I,t=document.body.className,n=new Set(t.replace(/ {2}/g,` `).split(` `));if(e.nativeMobile!==!0&&e.electron!==!0&&e.bex!==!0){if(e.desktop===!0)n.delete(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`),n.add(`desktop`);else if(e.mobile===!0){n.delete(`desktop`),n.add(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`);let t=et(e);t!==void 0&&n.add(`platform-${t}`)}}I.has.touch===!0&&(n.delete(`no-touch`),n.add(`touch`)),I.within.iframe===!0&&n.add(`within-iframe`);let r=Array.from(n).join(` `);t!==r&&(document.body.className=r)}function rt(e){for(let t in e)$e(t,e[t])}var it={install(e){if(this.__installed!==!0){if(pe.value===!0)nt();else{let{$q:t}=e;t.config.brand!==void 0&&rt(t.config.brand);let n=tt(I,t.config);document.body.classList.add.apply(document.body.classList,n)}I.is.ios===!0&&document.body.addEventListener(`touchstart`,D),window.addEventListener(`keydown`,M,!0)}}},at={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 ot(){let e=Array.isArray(navigator.languages)===!0&&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 z=E({__qLang:{}},{getLocale:ot,set(e=at,t){let n={...e,rtl:e.rtl===!0,getLocale:ot};if(n.set=z.set,z.__langConfig===void 0||z.__langConfig.noHtmlAttrs!==!0){let e=document.documentElement;e.setAttribute(`dir`,n.rtl===!0?`rtl`:`ltr`),e.setAttribute(`lang`,n.isoName)}Object.assign(z.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=z.__qLang,z.__langConfig=e.config.lang,this.__installed===!0?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qLang,{get(){return Reflect.get(...arguments)},ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`&&e!==`getLocale`)}}),this.set(t||at))}}),st={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`}},ct=E({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=ct.set,Object.assign(ct.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){e.config.iconMapFn!==void 0&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,ie(e,`iconMapFn`,()=>this.iconMapFn,e=>{this.iconMapFn=e}),this.__installed===!0?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get(){return Reflect.get(...arguments)},ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`)}}),this.set(t||st))}}),lt=[F,it,R,Qe,be,z,ct];function ut(e,t){let n=w(e);n.config.globalProperties=t.config.globalProperties;let{reload:r,...i}=t._context;return Object.assign(n._context,i),n}function dt(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}function ft(e,t,n){e.config.globalProperties.$q=n.$q,e.provide(`_q_`,n.$q),dt(n,lt),t.components!==void 0&&Object.values(t.components).forEach(t=>{L(t)===!0&&t.name!==void 0&&e.component(t.name,t)}),t.directives!==void 0&&Object.values(t.directives).forEach(t=>{L(t)===!0&&t.name!==void 0&&e.directive(t.name,t)}),t.plugins!==void 0&&dt(n,Object.values(t.plugins).filter(e=>typeof e.install==`function`&<.includes(e)===!1)),pe.value===!0&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}var pt={name:`Quasar`,version:`2.19.3`,install:function(e,t={}){let n={version:`2.19.3`};Ee===!1?(t.config!==void 0&&Object.assign(_e,t.config),n.config={..._e},ze()):n.config=t.config||{},ft(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})},lang:z,iconSet:ct},B=O({name:`QCardSection`,props:{tag:{type:String,default:`div`},horizontal:Boolean},setup(e,{slots:t}){let r=y(()=>`q-card__section q-card__section--${e.horizontal===!0?`horiz row no-wrap`:`vert`}`);return()=>n(e.tag,{class:r.value},ue(t.default))}}),mt=O({name:`QCard`,props:{...A,tag:{type:String,default:`div`},square:Boolean,flat:Boolean,bordered:Boolean},setup(e,{slots:t}){let{proxy:{$q:r}}=h(),i=le(e,r),a=y(()=>`q-card`+(i.value===!0?` q-card--dark q-dark`:``)+(e.bordered===!0?` q-card--bordered`:``)+(e.square===!0?` q-card--square no-border-radius`:``)+(e.flat===!0?` q-card--flat no-shadow`:``));return()=>n(e.tag,{class:a.value},ue(t.default))}});function ht(e,n,r){let i;function a(){i!==void 0&&(be.remove(i),i=void 0)}return t(()=>{e.value===!0&&a()}),{removeFromHistory:a,addToHistory(){i={condition:()=>r.value===!0,handler:n},be.add(i)}}}var gt=0,_t,vt,yt,bt=!1,xt,St,Ct,wt=null;function Tt(e){Et(e)&&ae(e)}function Et(e){if(e.target===document.body||e.target.classList.contains(`q-layout__backdrop`))return!0;let t=se(e),n=e.shiftKey&&!e.deltaX,r=!n&&Math.abs(e.deltaX)<=Math.abs(e.deltaY),i=n||r?e.deltaY:e.deltaX;for(let e=0;e<t.length;e++){let n=t[e];if(Re(n,r))return r?i<0&&n.scrollTop===0?!0:i>0&&n.scrollTop+n.clientHeight===n.scrollHeight:i<0&&n.scrollLeft===0?!0:i>0&&n.scrollLeft+n.clientWidth===n.scrollWidth}return!0}function Dt(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function Ot(e){bt!==!0&&(bt=!0,requestAnimationFrame(()=>{bt=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:r}=document.scrollingElement;(yt===void 0||t!==window.innerHeight)&&(yt=n-t,document.scrollingElement.scrollTop=r),r>yt&&(document.scrollingElement.scrollTop-=Math.ceil((r-yt)/8))}))}function kt(e){let t=document.body,n=window.visualViewport!==void 0;if(e===`add`){let{overflowY:e,overflowX:r}=window.getComputedStyle(t);_t=Ne(window),vt=De(window),xt=t.style.left,St=t.style.top,Ct=window.location.href,t.style.left=`-${_t}px`,t.style.top=`-${vt}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`),t.classList.add(`q-body--prevent-scroll`),document.qScrollPrevented=!0,I.is.ios===!0&&(n===!0?(window.scrollTo(0,0),window.visualViewport.addEventListener(`resize`,Ot,T.passiveCapture),window.visualViewport.addEventListener(`scroll`,Ot,T.passiveCapture),window.scrollTo(0,0)):window.addEventListener(`scroll`,Dt,T.passiveCapture))}I.is.desktop===!0&&I.is.mac===!0&&window[`${e}EventListener`](`wheel`,Tt,T.notPassive),e===`remove`&&(I.is.ios===!0&&(n===!0?(window.visualViewport.removeEventListener(`resize`,Ot,T.passiveCapture),window.visualViewport.removeEventListener(`scroll`,Ot,T.passiveCapture)):window.removeEventListener(`scroll`,Dt,T.passiveCapture)),t.classList.remove(`q-body--prevent-scroll`),t.classList.remove(`q-body--force-scrollbar-x`),t.classList.remove(`q-body--force-scrollbar-y`),document.qScrollPrevented=!1,t.style.left=xt,t.style.top=St,window.location.href===Ct&&window.scrollTo(_t,vt),yt=void 0)}function At(e){let t=`add`;if(e===!0){if(gt++,wt!==null){clearTimeout(wt),wt=null;return}if(gt>1)return}else{if(gt===0||(gt--,gt>0))return;if(t=`remove`,I.is.ios===!0&&I.is.nativeMobile===!0){wt!==null&&clearTimeout(wt),wt=setTimeout(()=>{kt(t),wt=null},100);return}}kt(t)}function jt(){let e;return{preventBodyScroll(t){t!==e&&(e!==void 0||t===!0)&&(e=t,At(t))}}}var Mt=0,Nt={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`},Pt={standard:[`scale`,`scale`],top:[`slide-down`,`slide-up`],bottom:[`slide-up`,`slide-down`],right:[`slide-left`,`slide-right`],left:[`slide-right`,`slide-left`]},Ft=O({name:`QDialog`,inheritAttrs:!1,props:{...Se,...ge,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:[...xe,`shake`,`click`,`escapeKey`],setup(e,{slots:r,emit:i,attrs:a}){let o=h(),s=_(null),c=_(!1),l=_(!1),u=null,f=null,p,m,g=y(()=>e.persistent!==!0&&e.noRouteDismiss!==!0&&e.seamless!==!0),{preventBodyScroll:v}=jt(),{registerTimeout:ee}=ye(),{registerTick:b,removeTick:te}=we(),{transitionProps:ne,transitionStyle:re}=je(e,()=>Pt[e.position][0],()=>Pt[e.position][1]),x=y(()=>re.value+(e.backdropFilter===void 0?``:`;backdrop-filter:${e.backdropFilter};-webkit-backdrop-filter:${e.backdropFilter}`)),{showPortal:S,hidePortal:C,portalIsAccessible:w,renderPortal:T}=Te(o,s,pe,`dialog`),{hide:E}=Ae({showing:c,hideOnRouteChange:g,handleShow:k,handleHide:le,processOnMount:!0}),{addToHistory:ie,removeFromHistory:ae}=ht(c,E,g),D=y(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${e.maximized===!0?`maximized`:`minimized`} q-dialog__inner--${e.position} ${Nt[e.position]}`+(l.value===!0?` q-dialog__inner--animating`:``)+(e.fullWidth===!0?` q-dialog__inner--fullwidth`:``)+(e.fullHeight===!0?` q-dialog__inner--fullheight`:``)+(e.square===!0?` q-dialog__inner--square`:``)),O=y(()=>c.value===!0&&e.seamless!==!0),se=y(()=>e.autoClose===!0?{onClick:F}:{}),ce=y(()=>[`q-dialog fullscreen no-pointer-events q-dialog--${O.value===!0?`modal`:`seamless`}`,a.class]);d(()=>e.maximized,e=>{c.value===!0&&P(e)}),d(O,e=>{v(e),e===!0?(Le(de),ke(M)):(Oe(de),Pe(M))});function k(t){ie(),f=e.noRefocus===!1&&document.activeElement!==null?document.activeElement:null,P(e.maximized),S(),l.value=!0,e.noFocus===!0?te():(document.activeElement?.blur(),b(A)),ee(()=>{if(o.proxy.$q.platform.is.ios===!0){if(e.seamless!==!0&&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()}m=!0,s.value.click(),m=!1}S(!0),l.value=!1,i(`show`,t)},e.transitionDuration)}function le(t){te(),ae(),N(!0),l.value=!0,C(),f!==null&&(((t?.type.indexOf(`key`)===0?f.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||f).focus(),f=null),ee(()=>{C(!0),l.value=!1,i(`hide`,t)},e.transitionDuration)}function A(e){fe(()=>{let t=s.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)!==!0&&(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 j(e){e&&typeof e.focus==`function`?e.focus({preventScroll:!0}):A(),i(`shake`);let t=s.value;t!==null&&(t.classList.remove(`q-animate--scale`),t.classList.add(`q-animate--scale`),u!==null&&clearTimeout(u),u=setTimeout(()=>{u=null,s.value!==null&&(t.classList.remove(`q-animate--scale`),A())},170))}function M(){e.seamless!==!0&&(e.persistent===!0||e.noEscDismiss===!0?e.maximized!==!0&&e.noShake!==!0&&j():(i(`escapeKey`),E()))}function N(t){u!==null&&(clearTimeout(u),u=null),(t===!0||c.value===!0)&&(P(!1),e.seamless!==!0&&(v(!1),Oe(de),Pe(M))),t!==!0&&(f=null)}function P(e){e===!0?p!==!0&&(Mt<1&&document.body.classList.add(`q-body--dialog`),Mt++,p=!0):p===!0&&(Mt<2&&document.body.classList.remove(`q-body--dialog`),Mt--,p=!1)}function F(e){m!==!0&&(E(e),i(`click`,e))}function I(t){e.persistent!==!0&&e.noBackdropDismiss!==!0?E(t):e.noShake!==!0&&j()}function de(t){e.allowFocusOutside!==!0&&w.value===!0&&Ue(s.value,t.target)!==!0&&A(`[tabindex]:not([tabindex="-1"])`)}Object.assign(o.proxy,{focus:A,shake:j,__updateRefocusTarget(e){f=e||null}}),t(N);function pe(){return n(`div`,{role:`dialog`,"aria-modal":O.value===!0?`true`:`false`,...a,class:ce.value},[n(oe,{name:`q-transition--fade`,appear:!0},()=>O.value===!0?n(`div`,{class:`q-dialog__backdrop fixed-full`,style:x.value,"aria-hidden":`true`,tabindex:-1,onClick:I}):null),n(oe,ne.value,()=>c.value===!0?n(`div`,{ref:s,class:D.value,style:re.value,tabindex:-1,...se.value},ue(r.default)):null)])}return T}}),It=P(`migration`,()=>{let e=_({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}}),Lt={class:`text-h6`},Rt={class:`text-h6`},zt={class:`text-h6 text-negative`},Bt={class:`q-mt-sm`},Vt={key:0,class:`q-mt-md text-caption`},Ht={class:`q-mt-md text-caption`},Ut=S({__name:`MigrationOverlay`,setup(e){let{t}=Ge(),n=It(),r=y(()=>[`backing-up`,`running`,`error`].includes(n.status.state));return s(()=>{n.fetchInitial()}),(e,o)=>(a(),g(Ft,{modelValue:r.value,"onUpdate:modelValue":o[0]||=e=>r.value=e,persistent:``,"no-backdrop-dismiss":``},{default:i(()=>[p(mt,{style:{"min-width":`400px`}},{default:i(()=>[m(n).status.state===`backing-up`?(a(),g(B,{key:0},{default:i(()=>[x(`div`,Lt,l(m(t)(`migration.backing_up`)),1),p(k,{class:`q-mt-md`})]),_:1})):m(n).status.state===`running`?(a(),g(B,{key:1},{default:i(()=>[x(`div`,Rt,l(m(t)(`migration.running`,{processed:m(n).status.processed,total:m(n).status.total})),1),p(Ve,{value:m(n).status.total>0?m(n).status.processed/m(n).status.total:0,class:`q-mt-md`},null,8,[`value`])]),_:1})):m(n).status.state===`error`?(a(),g(B,{key:2},{default:i(()=>[x(`div`,zt,l(m(t)(`migration.error`)),1),x(`div`,Bt,l(m(n).status.errorMessage),1),m(n).status.backupPath?(a(),b(`div`,Vt,l(m(t)(`migration.backup_location`,{path:m(n).status.backupPath})),1)):v(``,!0),x(`div`,Ht,l(m(t)(`migration.retry`)),1)]),_:1})):v(``,!0)]),_:1})]),_:1},8,[`modelValue`]))}}),Wt=P(`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}}}),Gt=0,Kt={},qt={},V={},Jt={},Yt=/^\s*$/,Xt=[],Zt=[void 0,null,!0,!1,``],Qt=[`top-left`,`top-right`,`bottom-left`,`bottom-right`,`top`,`bottom`,`left`,`right`,`center`],$t=[`top-left`,`top-right`,`bottom-left`,`bottom-right`],en={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 tn(e,t,n){if(!e)return an(`parameter required`);let r,i={textColor:`white`};if(e.ignoreDefaults!==!0&&Object.assign(i,Kt),L(e)===!1&&(i.type&&Object.assign(i,en[i.type]),e={message:e}),Object.assign(i,en[e.type||i.type],e),typeof i.icon==`function`&&(i.icon=i.icon(t)),i.spinner?(i.spinner===!0&&(i.spinner=k),i.spinner=f(i.spinner)):i.spinner=!1,i.meta={hasMedia:!!(i.spinner!==!1||i.icon||i.avatar),hasText:rn(i.message)||rn(i.caption)},i.position){if(Qt.includes(i.position)===!1)return an(`wrong position`,e)}else i.position=`bottom`;if(Zt.includes(i.timeout)===!0)i.timeout=5e3;else{let t=Number(i.timeout);if(isNaN(t)||t<0)return an(`wrong timeout`,e);i.timeout=Number.isFinite(t)?t:0}i.timeout===0?i.progress=!1:i.progress===!0&&(i.meta.progressClass=`q-notification__progress`+(i.progressClass?` ${i.progressClass}`:``),i.meta.progressStyle={animationDuration:`${i.timeout+1e3}ms`});let a=(Array.isArray(e.actions)===!0?e.actions:[]).concat(e.ignoreDefaults!==!0&&Array.isArray(Kt.actions)===!0?Kt.actions:[]).concat(Array.isArray(en[e.type]?.actions)===!0?en[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!==!0&&s()}:()=>{s()}})),i.multiLine===void 0&&(i.multiLine=i.actions.length>1),Object.assign(i.meta,{class:`q-notification row items-stretch q-notification--${i.multiLine===!0?`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===!0?`column no-wrap justify-center`:`row items-center`),contentClass:`q-notification__content row items-center`+(i.multiLine===!0?``:` col`),leftClass:i.meta.hasText===!0?`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].concat(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===!0?`justify-end`:`col-auto`)+(i.meta.hasMedia===!0?` 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=V[i.position].value.indexOf(n.notif);V[i.position].value[e]=i}else{let t=qt[i.meta.group];if(t===void 0){if(i.meta.uid=Gt++,i.meta.badge=1,[`left`,`right`,`center`].indexOf(i.position)!==-1)V[i.position].value.splice(Math.floor(V[i.position].value.length/2),0,i);else{let e=i.position.indexOf(`top`)===-1?`push`:`unshift`;V[i.position].value[e](i)}i.group!==void 0&&(qt[i.meta.group]=i)}else{if(t.meta.timer&&(clearTimeout(t.meta.timer),t.meta.timer=void 0),i.badgePosition!==void 0){if($t.includes(i.badgePosition)===!1)return an(`wrong badgePosition`,e)}else i.badgePosition=`top-${i.position.indexOf(`left`)===-1?`left`:`right`}`;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=V[i.position].value.indexOf(t);V[i.position].value[n]=qt[i.meta.group]=i}}let s=()=>{nn(i),r=void 0};if(i.timeout>0&&(i.meta.timer=setTimeout(()=>{i.meta.timer=void 0,s()},i.timeout+1e3)),i.group!==void 0)return t=>{t===void 0?s():an(`trying to update a grouped one which is forbidden`,e)};if(r={dismiss:s,config:e,notif:i},n!==void 0){Object.assign(n,r);return}return e=>{r!==void 0&&(e===void 0?r.dismiss():tn(Object.assign({},r.config,e,{group:!1,position:i.position}),t,r))}}function nn(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=V[e.position].value.indexOf(e);if(t!==-1){e.group!==void 0&&delete qt[e.meta.group];let n=Xt[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}V[e.position].value.splice(t,1),typeof e.onDismiss==`function`&&e.onDismiss()}}function rn(e){return e!=null&&Yt.test(e)!==!0}function an(e,t){return console.error(`Notify: ${e}`,t),!1}function on(){return O({name:`QNotifications`,devtools:{hide:!0},setup(){return()=>n(`div`,{class:`q-notifications`},Qt.map(e=>n(N,{key:e,class:Jt[e],tag:`div`,name:`q-notification--${e}`},()=>V[e].value.map(e=>{let t=e.meta,r=[];if(t.hasMedia===!0&&(e.spinner===!1?e.icon?r.push(n(j,{class:`q-notification__icon q-notification__icon--`+t.leftClass,name:e.icon,color:e.iconColor,size:e.iconSize,role:`img`})):e.avatar&&r.push(n(Me,{class:`q-notification__avatar q-notification__avatar--`+t.leftClass},()=>n(`img`,{src:e.avatar,"aria-hidden":`true`}))):r.push(n(e.spinner,{class:`q-notification__spinner q-notification__spinner--`+t.leftClass,color:e.spinnerColor,size:e.spinnerSize}))),t.hasText===!0){let t,i={class:`q-notification__message col`};if(e.html===!0)i.innerHTML=e.caption?`<div>${e.message}</div><div class="q-notification__caption">${e.caption}</div>`:e.message;else{let r=[e.message];t=e.caption?[n(`div`,r),n(`div`,{class:`q-notification__caption`},[e.caption])]:r}r.push(n(`div`,i,t))}let i=[n(`div`,{class:t.contentClass},r)];return e.progress===!0&&i.push(n(`div`,{key:`${t.uid}|p|${t.badge}`,class:t.progressClass,style:t.progressStyle})),e.actions!==void 0&&i.push(n(`div`,{class:t.actionsClass},e.actions.map(e=>n(We,e)))),t.badge>1&&i.push(n(`div`,{key:`${t.uid}|${t.badge}`,class:e.meta.badgeClass,style:e.badgeStyle},[t.badge])),n(`div`,{ref:e=>{Xt[String(t.uid)]=e},key:t.uid,class:t.class,...t.attrs},[n(`div`,{class:t.wrapperClass},i)])}))))}})}var sn={setDefaults(e){L(e)===!0&&Object.assign(Kt,e)},registerType(e,t){L(t)===!0&&(en[e]=t)},install({$q:e,parentApp:t}){if(e.notify=this.create=t=>tn(t,e),e.notify.setDefaults=this.setDefaults,e.notify.registerType=this.registerType,e.config.notify!==void 0&&this.setDefaults(e.config.notify),this.__installed!==!0){Qt.forEach(e=>{V[e]=_([]);let t=[`left`,`center`,`right`].includes(e)===!0?`center`:e.indexOf(`top`)===-1?`bottom`:`top`,n=e.indexOf(`left`)===-1?e.indexOf(`right`)===-1?`center`:`end`:`start`;Jt[e]=`q-notifications__list q-notifications__list--${t} fixed column no-wrap ${[`left`,`right`].includes(e)?`items-${e===`left`?`start`:`end`} justify-center`:e===`center`?`flex-center`:`items-${n}`}`});let e=ve(`q-notify`);ut(on(),t).mount(e)}}},cn={"common.save":`Speichern`,"common.cancel":`Abbrechen`,"common.delete":`Löschen`,"common.close":`Schließen`,"common.details":`Details`,"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.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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.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.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.sonnetClassicDescription":`Ausgewogen`,"model.sonnet1mDescription":`Ausgewogen, 1M Kontext`,"model.haikuDescription":`Am schnellsten`,"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.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Auf Coding spezialisiertes Modell für komplexe Softwareentwicklung`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"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.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.needsAttention":`Aufmerksamkeit erforderlich`,"workspaceList.running":`Aktiv`,"workspaceList.idle":`Inaktiv`,"workspaceList.archived":`Archiviert`,"workspaceList.noWorkspaces":`Noch keine Arbeitsbereiche`,"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.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.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.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.interruptTooltip":`Sanfte Unterbrechung (wie Escape) — stoppt das aktuelle Tool, hält die Sitzung aktiv`,"workspacePage.pendingNextRun":`Beim nächsten Start angewendet`,"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`,"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.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":`Woran möchten Sie arbeiten?`,"createPage.claudeCode":`Claude Code`,"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.manualHint":`Kein Notion-Ticket? Fügen Sie Ihre Aufgaben und Akzeptanzkriterien manuell hinzu — sie werden dem Claude-Agent als Kontext mitgegeben.`,"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.create":`Erstellen`,"createPage.skipSetupScript":`Setup-Skript überspringen`,"createPage.attachWorktreeToggle":`Bestehenden Worktree anhängen`,"createPage.attachWorktreeEnabled":`Bestehenden Worktree wiederverwenden`,"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.notionImportHint":`Klicken Sie auf „Aus Notion importieren", um Unteraufgaben automatisch aus einem Ticket zu extrahieren.`,"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.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.`,"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.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.notificationSound":`Benachrichtigungston`,"settings.notificationSoundPreview":`Anhören`,"settings.notificationVolume":`Lautstärke`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Arbeit erledigt`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Das wird knallen`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"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.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.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,7 +9,7 @@ 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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Sprache`,"settings.nav.notifications":`Benachrichtigungen`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"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`,"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.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.files":`{count} Datei | {count} Dateien`,"git.staged":`{count} vorgemerkt`,"git.modified":`{count} geändert`,"git.untracked":`{count} 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.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 Review`,"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.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.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.discardFailed":`Verwerfen fehlgeschlagen`,"git.conflictTitleMerge":`Merge-Konflikte erkannt`,"git.conflictTitleRebase":`Rebase-Konflikte erkannt`,"git.conflictSubtitle":`{count} Datei(en) mit Konflikten. Wie soll fortgefahren werden?`,"git.conflictAbort":`Abbrechen`,"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.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.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`,"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`,"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.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.addToChat":`Zum Chat hinzufügen`,"diffViewer.save":`Speichern`,"diffViewer.savedAt":`Gespeichert`,"diffViewer.saveFailed":`Speichern fehlgeschlagen`,"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.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.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.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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Sprache`,"settings.nav.notifications":`Benachrichtigungen`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"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.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.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.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.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.discardFailed":`Verwerfen fehlgeschlagen`,"git.conflictTitleMerge":`Merge-Konflikte erkannt`,"git.conflictTitleRebase":`Rebase-Konflikte erkannt`,"git.conflictSubtitle":`{count} Datei(en) mit Konflikten. Wie soll fortgefahren werden?`,"git.conflictAbort":`Abbrechen`,"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.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`,"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`,"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.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.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.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.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.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.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):
|
|
@@ -25,7 +25,7 @@ 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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Voice`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"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`,"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.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.files":`{count} file | {count} files`,"git.staged":`{count} staged`,"git.modified":`{count} modified`,"git.untracked":`{count} 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.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 Review`,"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.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.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.discardFailed":`Discard failed`,"git.conflictTitleMerge":`Merge conflicts detected`,"git.conflictTitleRebase":`Rebase conflicts detected`,"git.conflictSubtitle":`{count} file(s) have conflicts. Choose how to continue.`,"git.conflictAbort":`Abort`,"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.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.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`,"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`,"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.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.addToChat":`Add to chat`,"diffViewer.save":`Save`,"diffViewer.savedAt":`Saved`,"diffViewer.saveFailed":`Save failed`,"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.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.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.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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Voice`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"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.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.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.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.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.discardFailed":`Discard failed`,"git.conflictTitleMerge":`Merge conflicts detected`,"git.conflictTitleRebase":`Rebase conflicts detected`,"git.conflictSubtitle":`{count} file(s) have conflicts. Choose how to continue.`,"git.conflictAbort":`Abort`,"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.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`,"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`,"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.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.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.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.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.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.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):
|
|
@@ -41,7 +41,7 @@ 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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Voz`,"settings.nav.notifications":`Notificaciones`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Exportar`,"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`,"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.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.files":`{count} archivo | {count} archivos`,"git.staged":`{count} staged`,"git.modified":`{count} modificados`,"git.untracked":`{count} 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.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 Review`,"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.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.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.discardFailed":`Descarte fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbort":`Abortar`,"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.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.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`,"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`,"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.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.addToChat":`Añadir al chat`,"diffViewer.save":`Guardar`,"diffViewer.savedAt":`Guardado`,"diffViewer.saveFailed":`Error al guardar`,"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.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.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.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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Voz`,"settings.nav.notifications":`Notificaciones`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Exportar`,"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.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.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.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.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.discardFailed":`Descarte fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbort":`Abortar`,"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.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`,"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`,"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.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.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.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.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.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.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):
|
|
@@ -57,7 +57,7 @@ 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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"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`,"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.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.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} 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.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 Review`,"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.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.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.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbort":`Abandonner`,"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.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.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`,"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`,"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.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.addToChat":`Ajouter au chat`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"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.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.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.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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"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.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.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.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.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.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbort":`Abandonner`,"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.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`,"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`,"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.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.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.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.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.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.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) :
|
|
@@ -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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Voce`,"settings.nav.notifications":`Notifiche`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Esporta`,"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`,"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.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.files":`{count} file | {count} file`,"git.staged":`{count} staged`,"git.modified":`{count} modificati`,"git.untracked":`{count} non tracciati`,"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.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 Review`,"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.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.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.discardFailed":`Scarto fallito`,"git.conflictTitleMerge":`Conflitti di merge rilevati`,"git.conflictTitleRebase":`Conflitti di rebase rilevati`,"git.conflictSubtitle":`{count} file con conflitti. Scegli come continuare.`,"git.conflictAbort":`Annulla`,"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.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.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`,"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`,"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.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.addToChat":`Aggiungi alla chat`,"diffViewer.save":`Salva`,"diffViewer.savedAt":`Salvato`,"diffViewer.saveFailed":`Salvataggio non riuscito`,"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.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.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.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.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-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.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.sentry":`Sentry`,"settings.nav.voice":`Voce`,"settings.nav.notifications":`Notifiche`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Esporta`,"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.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.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.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.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.discardFailed":`Scarto fallito`,"git.conflictTitleMerge":`Conflitti di merge rilevati`,"git.conflictTitleRebase":`Conflitti di rebase rilevati`,"git.conflictSubtitle":`{count} file con conflitti. Scegli come continuare.`,"git.conflictAbort":`Annulla`,"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.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`,"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`,"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.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.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.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.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.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.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.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`,"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?`,"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.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.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`,"tool.running":`In corso...`,"activity.raw_lines":`Righe di output grezze ({n})`,"activity.loading_older":`Caricamento messaggi precedenti…`,"activity.prev_user_message":`Messaggio utente precedente`,"activity.scroll_to_bottom":`Scorri in fondo`,"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.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.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`,"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.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.deny":`Nega`,"permissionRequest.tool":`Strumento`,"permissionRequest.input":`Input`,"permissionRequest.denied":`negato dall'utente`,"workspaceStatus.awaitingUser":`in attesa della tua risposta`,"workspaceList.prOpen":`#{n} — Pull request aperta`,"workspaceList.prChangesRequested":`#{n} — Modifiche richieste`,"workspaceList.attentionCiFailed":`CI fallita`,"workspaceList.attentionChangesRequested":`Modifiche richieste`,"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`,"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.switchToCurrent":`Passa a quella corrente`},pn=`kobo:locale`,mn=[`en`,`fr`,`de`,`es`,`it`];function hn(e){return mn.includes(e)}function gn(){let e=localStorage.getItem(pn);if(e&&hn(e))return e;let t=navigator.language.split(`-`)[0];return t&&hn(t)?(localStorage.setItem(pn,t),t):(localStorage.setItem(pn,`en`),`en`)}var _n=Ke({legacy:!1,locale:gn(),fallbackLocale:`en`,messages:{en:ln,fr:dn,de:cn,es:un,it:fn}}),vn=P(`agent-stream`,()=>{let e=_(new Map),t=_(new Map),n=_(new Map),r=_(new Map),i=_(new Map),a=_(new Map),o=_(0);function s(t){return o.value,e.value.get(t)??[]}function c(e){return o.value,t.value.get(e)??[]}function l(e){return o.value,n.value.get(e)??[]}function u(e){return o.value,r.value.get(e)??[]}function d(e){return o.value,i.value.get(e)}function f(e){return o.value,a.value.get(e)??!0}function p(a,s,c,l,u){let d=e.value.get(a)??[],f=t.value.get(a)??[],p=n.value.get(a)??[],m=r.value.get(a)??[],h=d.length===0;d.push(s),f.push(c??new Date().toISOString()),p.push(u??null),m.push(l??null),e.value.set(a,d),t.value.set(a,f),n.value.set(a,p),r.value.set(a,m),h&&l&&i.value.set(a,l),o.value++}function m(s,c,l,u){e.value.set(s,[...c]),t.value.set(s,l?[...l]:c.map(()=>new Date().toISOString())),n.value.set(s,u?.sessionIds?[...u.sessionIds]:c.map(()=>null)),r.value.set(s,u?.eventIds?[...u.eventIds]:c.map(()=>null)),u?.oldestId?i.value.set(s,u.oldestId):i.value.delete(s),u&&typeof u.hasMoreOlder==`boolean`?a.value.set(s,u.hasMoreOlder):a.value.delete(s),o.value++}function h(s,c,l,u){if(c.length===0){a.value.set(s,u.hasMoreOlder),o.value++;return}let d=e.value.get(s)??[],f=t.value.get(s)??[],p=n.value.get(s)??[],m=r.value.get(s)??[],h=u.sessionIds??c.map(()=>null),g=u.eventIds??c.map(()=>null);e.value.set(s,[...c,...d]),t.value.set(s,[...l,...f]),n.value.set(s,[...h,...p]),r.value.set(s,[...g,...m]),u.oldestId&&i.value.set(s,u.oldestId),a.value.set(s,u.hasMoreOlder),o.value++}function g(i,a){let s=e.value.get(i),c=r.value.get(i);if(!s||!c)return;let l=c.indexOf(a);if(l===-1)return;let u=t.value.get(i),d=n.value.get(i);s.splice(l,1),c.splice(l,1),u&&u.splice(l,1),d&&d.splice(l,1),o.value++}function v(s){e.value.delete(s),t.value.delete(s),n.value.delete(s),r.value.delete(s),i.value.delete(s),a.value.delete(s),o.value++}return{events:e,timestamps:t,sessionIds:n,eventIds:r,version:o,eventsFor:s,timestampsFor:c,sessionIdsFor:l,eventIdsFor:u,oldestIdFor:d,hasMoreOlderFor:f,append:p,reset:m,prepend:h,removeByEventId:g,clear:v}}),yn=P(`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 bn(e){return e.state===`OPEN`&&e.reviewDecision===`CHANGES_REQUESTED`&&e.reviewers.some(e=>e.state===`CHANGES_REQUESTED`)}function xn(e){return e.state===`OPEN`&&e.ci.rollup===`FAILURE`}function Sn(e){return e?xn(e)||bn(e):!1}var Cn=[`executing`,`extracting`,`brainstorming`];function wn(e){return!!e&&Cn.includes(e)}function Tn(e){"@babel/helpers - typeof";return Tn=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},Tn(e)}function En(e,t){if(Tn(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(Tn(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Dn(e){var t=En(e,`string`);return Tn(t)==`symbol`?t:t+``}function On(e,t,n){return(t=Dn(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var kn=class extends Error{constructor(e,t){super(e),On(this,`code`,void 0),this.name=`WorkspaceActionError`,this.code=t}},An=5e3,jn=500,Mn=null;function Nn(e){return e===`claude-code`?`claude-code`:null}var H=P(`workspace`,{state:()=>({workspaces:[],selectedWorkspaceId:null,tasks:[],activityFeeds:{},activityFeedIds:{},activityCounts:{},subagents:{},agentTodos:{},sessions:[],selectedSessionId:null,archivedWorkspaces:[],archivedLoaded:!1,loading:!1,loadingOlderEvents:!1,hasMoreEvents:{},providerUsage:{},chatDraft:``,queuedMessages:{},gitRefreshTrigger:0,gitStatsCache:{},pendingWakeups:{},pendingQuotaBackoffs:{},pendingDeferred:{},pendingQueue:{},prSnapshots:{},autoLoopStates:{},crons:{}}),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)||Sn(e.prSnapshots[t.id]))},running(e){return e.workspaces.filter(t=>wn(t.status)&&!Sn(e.prSnapshots[t.id]))},idle(e){return e.workspaces.filter(t=>[`completed`,`idle`,`created`].includes(t.status)&&!Sn(e.prSnapshots[t.id]))},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=Nn(t.engine);return n?e.providerUsage[n]??null:null}},actions:{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 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){let t=`/api/git/orphan-worktrees?projectPath=${encodeURIComponent(e)}`,n=await fetch(t,{cache:`no-store`});if(!n.ok)throw Error(`HTTP ${n.status}`);return n.json()},async fetchWorkspaces(){this.loading=!0;try{let e=await fetch(`/api/workspaces`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();this.workspaces=t.workspaces??t;for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id)}catch(e){console.error(`[workspace store] fetchWorkspaces failed:`,e)}finally{this.loading=!1}},async fetchArchivedWorkspaces(){try{let e=await fetch(`/api/workspaces/archived`);if(!e.ok)throw Error(`HTTP ${e.status}`);this.archivedWorkspaces=await e.json(),this.archivedLoaded=!0}catch(e){console.error(`[workspace store] fetchArchivedWorkspaces failed:`,e)}},async fetchWorkspaceDetails(e){try{let t=await fetch(`/api/workspaces/${e}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();if(this.selectedWorkspaceId!==e)return;let r=n.workspace??n,i=this.workspaces.findIndex(t=>t.id===e);if(i>=0)this.workspaces[i]={...this.workspaces[i],...r};else{let t=this.archivedWorkspaces.findIndex(t=>t.id===e);t>=0?this.archivedWorkspaces[t]={...this.archivedWorkspaces[t],...r}:r?.archivedAt&&this.archivedWorkspaces.unshift(r)}n.tasks&&(this.tasks=n.tasks)}catch(e){console.error(`[workspace store] fetchWorkspaceDetails failed:`,e)}},async createWorkspace(e){try{let t=await fetch(`/api/workspaces`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=t.headers.get(`X-Kobo-Branch-Adjusted`)===`1`,r=await t.json(),i=r.workspace??r,a=this.workspaces.findIndex(e=>e.id===i.id);return a>=0?this.workspaces[a]=i:this.workspaces.push(i),e.autoLoop&&this.fetchAutoLoopStates(),i._branchAdjusted=n,i}catch(e){throw console.error(`[workspace store] createWorkspace failed:`,e),e}},async startWorkspace(e,t,n,r){try{let i=await fetch(`/api/workspaces/${e}/start`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:t,agentSessionId:n,resume:r})});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error??`HTTP ${i.status}`)}await this.fetchWorkspaces()}catch(e){throw console.error(`[workspace store] startWorkspace failed:`,e),e}},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){try{let t=await fetch(`/api/workspaces/${e}/interrupt`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}}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),delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e],delete this.subagents[e],delete this.agentTodos[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)delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e],delete this.subagents[e],delete this.agentTodos[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 r=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({description:t})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`HTTP ${r.status}`)}let i=await r.json();this.workspaces[n]={...this.workspaces[n],...i}}catch(t){let n=this.workspaces.findIndex(t=>t.id===e);throw n>=0&&(this.workspaces[n]={...this.workspaces[n],description:r}),t}},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 kn(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 kn(e.error??`Push failed`,e.code)}},async pullBranch(e){let t=await fetch(`/api/workspaces/${e}/pull`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({error:`Pull failed`}));throw new kn(e.error??`Pull failed`,e.code)}},async fetchGitStats(e,t={}){let n=`/api/workspaces/${e}/git-stats${t.freshFetch?`?freshFetch=1`:``}`,r=await fetch(n,{signal:t.signal});if(!r.ok)throw Error(`HTTP ${r.status}`);let i=await r.json();return this.gitStatsCache[e]=i,i},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 kn(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.tasks=[],this.markRead(e),this.fetchWorkspaceDetails(e),this.fetchSessions(e),this.fetchPendingQuotaBackoff(e),this.fetchGitStats(e).catch(()=>{}),this.activityFeeds[e]?.length||Bn().subscribe(e)},async fetchSessions(e,t){try{let n=await fetch(`/api/workspaces/${e}/sessions`);if(!n.ok)throw Error(`HTTP ${n.status}`);if(this.selectedWorkspaceId!==e)return;if(this.sessions=await n.json(),t&&this.sessions.some(e=>e.id===t)){this.selectSession(t);return}let r=this.selectedSessionId&&this.sessions.some(e=>e.id===this.selectedSessionId);if(this.sessions.length>0&&!r){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=Bn();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)},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>An){let t=n.splice(0,n.length-An),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(){Mn!==null&&clearTimeout(Mn),Mn=setTimeout(()=>{Mn=null,this.fetchPrSnapshots()},jn)},async fetchPrSnapshots(){try{let e=await fetch(`/api/workspaces/pr-states`,{cache:`no-store`});if(!e.ok)return;this.prSnapshots=await e.json()}catch(e){console.error(`[workspace-store] fetchPrSnapshots failed:`,e)}},async fetchWorkspacesInfo(){try{let e=await fetch(`/api/workspaces/info`,{cache:`no-store`});if(!e.ok)return;let t=await e.json();this.workspaces=t.workspaces;for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id);this.prSnapshots=t.prSnapshots,this.gitStatsCache={...this.gitStatsCache,...t.gitStats}}catch(e){console.error(`[workspace-store] fetchWorkspacesInfo failed:`,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,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},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;this.autoLoopStates=await e.json()}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 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||t.kind!==`question`))return{toolCallId:t.toolCallId,toolName:t.toolName,input:t.input,agentSessionId:t.agentSessionId}},async submitDeferredAnswer(e,t,n){let r=await fetch(`/api/workspaces/${e}/deferred-tool-use/answer`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({answers: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] submitDeferredAnswer: backend has no pending — 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){let i=await fetch(`/api/workspaces/${e}/deferred-permission/decision`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({toolCallId:t,decision:n,reason:r})});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error??`HTTP ${i.status}`)}this.dequeuePending(e),this.fetchWorkspaces()},updateAgentTodos(e,t){this.agentTodos[e]=t},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)}},queueMessage(e,t,n){this.queuedMessages[e]={content:t,sessionId:n}},cancelQueuedMessage(e){delete this.queuedMessages[e]},updateWorkspaceFromEvent(e,t){let n=this.workspaces.findIndex(t=>t.id===e);if(n>=0&&(this.workspaces[n]={...this.workspaces[n],...t}),t.status&&[`completed`,`idle`,`error`,`quota`].includes(t.status)){let n=this.activityFeeds[e];if(n)for(let e of n)e.meta?.pending&&(e.meta.pending=!1);let r=this.subagents[e];if(r)for(let[e,t]of Object.entries(r))t.status===`running`&&(r[e]={...t,status:`done`});let i=this.queuedMessages[e];(t.status===`completed`||t.status===`idle`)&&i&&(delete this.queuedMessages[e],Bn().sendChatMessage(e,i.content,i.sessionId),this.addActivityItem(e,{id:`user-${Date.now()}`,type:`text`,content:i.content,timestamp:new Date().toISOString(),sessionId:i.sessionId,meta:{sender:`user`,pending:!0}}))}}}}),U=_n.global.t,W=null,Pn=null,Fn=0,In=!1;function Ln(e){In=e}function Rn(e,t,n){if(t.kind!==`session:started`)return;let r=H();if(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`}),!In&&n&&r.selectedWorkspaceId===e&&r.selectedSessionId!==n&&r.fetchSessions(e,n).catch(e=>{console.error(`[websocket] fetchSessions on session:started failed:`,e)})}function zn(e,t,n,r,i){vn().append(e,t,n,r,i),Rn(e,t,i??void 0);let a=H();if(t.kind===`session:user-input-requested`){if(t.requestKind===`question`?a.enqueuePending(e,{kind:`question`,agentSessionId:i??null,toolCallId:t.toolCallId,toolName:t.toolName,input:t.payload}):a.enqueuePending(e,{kind:`permission`,agentSessionId:i??null,toolCallId:t.toolCallId,toolName:t.toolName,toolInput:t.payload}),a.updateWorkspaceFromEvent(e,{status:`awaiting-user`}),!In){let n=a.workspaces.find(t=>t.id===e)?.name??``;Ie(t.requestKind===`question`?U(`notification.agentQuestion`,{name:n}):U(`notification.agentPermissionRequest`,{name:n}),void 0,e)}return}if(t.kind===`subagent:progress`){a.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(t.kind===`tool:call`&&t.name===`TodoWrite`){let n=t.input?.todos;Array.isArray(n)&&a.updateAgentTodos(e,n.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})));return}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)&&a.triggerGitRefresh(),/\bgit\s+branch\s+-m\b/i.test(r)&&setTimeout(()=>{a.resyncWorkspaceBranch(e).catch(e=>{console.error(`[websocket] Branch resync failed:`,e)})},2500),/\bgh\s+pr\s+create\b/i.test(r)&&setTimeout(()=>a.triggerGitRefresh(),3e3)}if(t.kind===`tool:call`&&t.name===`ExitPlanMode`&&a.workspaces.find(t=>t.id===e)?.agentPermissionMode===`plan`&&(a.updateWorkspaceFromEvent(e,{agentPermissionMode:`bypass`}),a.updateAgentPermissionMode(e,`bypass`).catch(e=>{console.error(`[websocket] failed to persist ExitPlanMode flip:`,e)})),t.kind!==`session:started`){if(t.kind===`session:ended`){i&&a.clearPendingForSession(e,i);let n=a.workspaces.find(t=>t.id===e)?.status===`quota`?`quota`:t.reason===`completed`?`completed`:t.reason===`error`?`error`:`idle`;if(a.updateWorkspaceFromEvent(e,{status:n}),a.finalizeRunningSubagents(e),a.fetchWorkspaces(),!In&&t.reason!==`killed`&&a.autoLoopStates[e]?.auto_loop!==!0){let n=a.workspaces.find(t=>t.id===e)?.name??``;Ie(t.reason===`error`?U(`notification.agentError`,{name:n}):U(`notification.agentFinished`,{name:n}),void 0,e)}return}t.kind===`error`&&t.category===`quota`&&(a.updateWorkspaceFromEvent(e,{status:`quota`}),a.fetchWorkspaces())}}var Bn=P(`websocket`,{state:()=>({connected:!1,lastEventId:null,_replaying:!1}),actions:{connect(){if(W)return;let e=`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/ws`,t=new WebSocket(e);W=t,t.addEventListener(`open`,()=>{this.connected=!0,Fn=0;let e=H().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,W=null,this._scheduleReconnect()}),t.addEventListener(`error`,()=>{})},disconnect(){Pn&&=(clearTimeout(Pn),null),W&&=(W.close(),null),this.connected=!1},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}})},sendChatMessage(e,t,n,r){this._send({type:`chat:message`,payload:{workspaceId:e,content:t,sessionId:n,agentPermissionModeOverride:r}});let i=H(),a=i.workspaces.find(t=>t.id===e);a&&(a.status===`completed`||a.status===`idle`||a.status===`error`||a.status===`quota`)&&i.updateWorkspaceFromEvent(e,{status:`executing`})},_send(e){W&&W.readyState===WebSocket.OPEN&&W.send(JSON.stringify(e))},isConnected(){return W!==null&&W.readyState===WebSocket.OPEN},_scheduleReconnect(){if(Pn)return;let e=Math.min(1e3*2**Fn,3e4);Fn++,Pn=setTimeout(()=>{Pn=null,this.connect()},e)},_routeMessage(e){let t=H();e.id?this.lastEventId=e.id:e.eventId&&(this.lastEventId=e.eventId);let n=e.payload??{},r=e.workspaceId??n.workspaceId??``;switch(e.type){case`agent:event`:{if(!r)break;let t=e.createdAt;zn(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=e.createdAt??new Date().toISOString(),l=t.activityFeeds[r]??[];if(a===`user`&&l.some(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending)){let e=l.findIndex(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending);e>=0&&(l[e]={...l[e],id:s,sessionId:o})}else t.addActivityItem(r,{id:s,type:`text`,content:i,timestamp:c,sessionId:o,meta:{sender:a}})}break;case`sync:response`:this._replaying=!0,Ln(!0);try{let e=n.events??[],t=new Map;for(let n of e)if(n.type!==`sync:response`){if(n.type===`agent:event`&&n.workspaceId){let e=t.get(n.workspaceId)??{events:[],timestamps:[],sessionIds:[],eventIds:[],oldestId:void 0};e.events.push(n.payload),e.timestamps.push(n.createdAt),e.sessionIds.push(n.sessionId??null),e.eventIds.push(n.id??null),e.oldestId||=n.id,t.set(n.workspaceId,e);continue}this._routeMessage(n)}if(t.size>0){let e=vn();for(let[n,{events:r,timestamps:i,sessionIds:a,eventIds:o,oldestId:s}]of t){e.reset(n,r,i,{oldestId:s,hasMoreOlder:!0,sessionIds:a,eventIds:o});for(let e=0;e<r.length;e++){let t=r[e];if(!t)continue;let i=a[e]??null;if(t.kind===`session:user-input-requested`){t.requestKind===`question`?H().enqueuePending(n,{kind:`question`,agentSessionId:i,toolCallId:t.toolCallId,toolName:t.toolName,input:t.payload}):H().enqueuePending(n,{kind:`permission`,agentSessionId:i,toolCallId:t.toolCallId,toolName:t.toolName,toolInput:t.payload});continue}if(t.kind===`session:started`){if(i){let e=H(),t=e.peekPending(n);t&&t.agentSessionId===i&&e.dequeuePending(n)}continue}if(t.kind===`session:ended`){i&&H().clearPendingForSession(n,i);continue}t.kind===`subagent:progress`&&H().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})}}}}finally{this._replaying=!1,Ln(!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=yn();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?U(`chat.scriptDone`):`[setup] Complete`,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:`[setup] Error: ${e.payload?.message??`unknown`}`,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?U(`chat.scriptDone`):`[cleanup] Complete`,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:`[cleanup] Error: ${e.payload?.message??`unknown`}`,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?U(`chat.scriptDone`):`[archive] Complete`,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:`[archive] Error: ${e.payload?.message??`unknown`}`,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`: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});let o=[];e.prUrl&&o.push({label:U(`pr.openPr`),color:`white`,noDismiss:!0,handler:()=>window.open(e.prUrl,`_blank`)}),o.push({label:U(`pr.dismiss`),color:`white`}),sn.create({type:`info`,position:`top`,timeout:0,message:U(`pr.baseChanged`,{oldBase:i,newBase:a}),actions:o}),Ie(U(`pr.baseChanged`,{oldBase:i,newBase:a}),void 0,r);break}case`pr:changes-requested`:{if(!r)break;let e=n,i=U(`toast.prChangesRequested`,{n:e.prNumber??0}),a=[];e.prUrl&&a.push({label:U(`pr.openPr`),color:`white`,noDismiss:!0,handler:()=>window.open(e.prUrl,`_blank`)}),a.push({label:U(`pr.dismiss`),color:`white`}),sn.create({type:`warning`,position:`top`,timeout:0,message:i,actions:a}),Ie(i,void 0,r),t.refreshPrSnapshot(r);break}case`pr:approved`:{if(!r)break;let e=U(`toast.prApproved`,{n:n.prNumber??0});sn.create({type:`positive`,position:`top`,timeout:5e3,message:e}),Ie(e,void 0,r),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&&Ie(U(`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`:null;a&&Ie(U(a,{name:i}),void 0,r)}break;case`migration:progress`:case`migration:error`:It().update(n);break}}}}),Vn=S({__name:`App`,setup(e){let t=Bn(),n=Wt();return s(()=>{t.connect(),n.fetchTemplates(),Fe()}),c(()=>{t.disconnect()}),(e,t)=>{let n=C(`router-view`);return a(),b(te,null,[p(n),p(Ut)],64)}}});function Hn(e){return e}function Un(e){return e}function Wn(e){return e}var Gn=Wn(()=>de()),Kn=typeof document<`u`;function qn(e){return typeof e==`object`||`displayName`in e||`props`in e||`__vccOpts`in e}function Jn(e){return e.__esModule||e[Symbol.toStringTag]===`Module`||e.default&&qn(e.default)}var G=Object.assign;function Yn(e,t){let n={};for(let r in t){let i=t[r];n[r]=K(i)?i.map(e):e(i)}return n}var Xn=()=>{},K=Array.isArray;function Zn(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var Qn=/#/g,$n=/&/g,er=/\//g,tr=/=/g,nr=/\?/g,rr=/\+/g,ir=/%5B/g,ar=/%5D/g,or=/%5E/g,sr=/%60/g,cr=/%7B/g,lr=/%7C/g,ur=/%7D/g,dr=/%20/g;function fr(e){return e==null?``:encodeURI(``+e).replace(lr,`|`).replace(ir,`[`).replace(ar,`]`)}function pr(e){return fr(e).replace(cr,`{`).replace(ur,`}`).replace(or,`^`)}function mr(e){return fr(e).replace(rr,`%2B`).replace(dr,`+`).replace(Qn,`%23`).replace($n,`%26`).replace(sr,"`").replace(cr,`{`).replace(ur,`}`).replace(or,`^`)}function hr(e){return mr(e).replace(tr,`%3D`)}function gr(e){return fr(e).replace(Qn,`%23`).replace(nr,`%3F`)}function _r(e){return gr(e).replace(er,`%2F`)}function vr(e){if(e==null)return null;try{return decodeURIComponent(``+e)}catch{}return``+e}var yr=/\/$/,br=e=>e.replace(yr,``);function xr(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=kr(r??t,n),{fullPath:r+a+o,path:r,query:i,hash:vr(o)}}function Sr(e,t){let n=t.query?e(t.query):``;return t.path+(n&&`?`)+n+(t.hash||``)}function Cr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||`/`}function wr(e,t,n){let r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&Tr(t.matched[r],n.matched[i])&&Er(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Tr(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Er(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Dr(e[n],t[n]))return!1;return!0}function Dr(e,t){return K(e)?Or(e,t):K(t)?Or(t,e):e?.valueOf()===t?.valueOf()}function Or(e,t){return K(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function kr(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 q={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0},Ar=function(e){return e.pop=`pop`,e.push=`push`,e}({}),jr=function(e){return e.back=`back`,e.forward=`forward`,e.unknown=``,e}({});function Mr(e){if(!e)if(Kn){let t=document.querySelector(`base`);e=t&&t.getAttribute(`href`)||`/`,e=e.replace(/^\w+:\/\/[^\/]+/,``)}else e=`/`;return e[0]!==`/`&&e[0]!==`#`&&(e=`/`+e),br(e)}var Nr=/^[^#]+#/;function Pr(e,t){return e.replace(Nr,`#`)+t}function Fr(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 Ir=()=>({left:window.scrollX,top:window.scrollY});function Lr(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=Fr(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 Rr(e,t){return(history.state?history.state.position-t:-1)+e}var zr=new Map;function Br(e,t){zr.set(e,t)}function Vr(e){let t=zr.get(e);return zr.delete(e),t}function Hr(e){return typeof e==`string`||e&&typeof e==`object`}function Ur(e){return typeof e==`string`||typeof e==`symbol`}var J=function(e){return e[e.MATCHER_NOT_FOUND=1]=`MATCHER_NOT_FOUND`,e[e.NAVIGATION_GUARD_REDIRECT=2]=`NAVIGATION_GUARD_REDIRECT`,e[e.NAVIGATION_ABORTED=4]=`NAVIGATION_ABORTED`,e[e.NAVIGATION_CANCELLED=8]=`NAVIGATION_CANCELLED`,e[e.NAVIGATION_DUPLICATED=16]=`NAVIGATION_DUPLICATED`,e}({}),Wr=Symbol(``);J.MATCHER_NOT_FOUND,J.NAVIGATION_GUARD_REDIRECT,J.NAVIGATION_ABORTED,J.NAVIGATION_CANCELLED,J.NAVIGATION_DUPLICATED;function Gr(e,t){return G(Error(),{type:e,[Wr]:!0},t)}function Y(e,t){return e instanceof Error&&Wr in e&&(t==null||!!(e.type&t))}function Kr(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(rr,` `),i=r.indexOf(`=`),a=vr(i<0?r:r.slice(0,i)),o=i<0?null:vr(r.slice(i+1));if(a in t){let e=t[a];K(e)||(e=t[a]=[e]),e.push(o)}else t[a]=o}return t}function qr(e){let t=``;for(let n in e){let r=e[n];if(n=hr(n),r==null){r!==void 0&&(t+=(t.length?`&`:``)+n);continue}(K(r)?r.map(e=>e&&mr(e)):[r&&mr(r)]).forEach(e=>{e!==void 0&&(t+=(t.length?`&`:``)+n,e!=null&&(t+=`=`+e))})}return t}function Jr(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=K(r)?r.map(e=>e==null?null:``+e):r==null?r:``+r)}return t}var Yr=Symbol(``),Xr=Symbol(``),Zr=Symbol(``),Qr=Symbol(``),$r=Symbol(``);function ei(){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 X(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(Gr(J.NAVIGATION_ABORTED,{from:n,to:t})):e instanceof Error?c(e):Hr(e)?c(Gr(J.NAVIGATION_GUARD_REDIRECT,{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 ti(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(qn(s)){let c=(s.__vccOpts||s)[t];c&&a.push(X(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=Jn(a)?a.default:a;o.mods[e]=a,o.components[e]=s;let c=(s.__vccOpts||s)[t];return c&&X(c,n,r,o,e,i)()}))}}return a}function ni(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=>Tr(e,a))?r.push(a):n.push(a));let s=e.matched[o];s&&(t.matched.find(e=>Tr(e,s))||i.push(s))}return[n,r,i]}var ri=()=>location.protocol+`//`+location.host;function ii(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),Cr(n,``)}return Cr(n,e)+r+i}function ai(e,t,n,r){let i=[],a=[],o=null,s=({state:a})=>{let s=ii(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:Ar.pop,direction:u?u>0?jr.forward:jr.back:jr.unknown})})};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(G({},e.state,{scroll:Ir()}),``)}}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 oi(e,t,n,r=!1,i=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:i?Ir():null}}function si(e){let{history:t,location:n}=window,r={value:ii(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:ri()+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,G({},t.state,oi(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),r.value=e}function s(e,n){let o=G({},i.value,t.state,{forward:e,scroll:Ir()});a(o.current,o,!0),a(e,G({},oi(r.value,e,null),{position:o.position+1},n),!1),r.value=e}return{location:r,state:i,push:s,replace:o}}function ci(e){e=Mr(e);let t=si(e),n=ai(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}let i=G({location:``,base:e,go:r,createHref:Pr.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 li(e){return e=location.host?e||location.pathname+location.search:``,e.includes(`#`)||(e+=`#`),ci(e)}var ui=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.Group=2]=`Group`,e}({}),Z=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.ParamRegExp=2]=`ParamRegExp`,e[e.ParamRegExpEnd=3]=`ParamRegExpEnd`,e[e.EscapeNext=4]=`EscapeNext`,e}(Z||{}),di={type:ui.Static,value:``},fi=/[a-zA-Z0-9_]/;function pi(e){if(!e)return[[]];if(e===`/`)return[[di]];if(!e.startsWith(`/`))throw Error(`Invalid path "${e}"`);function t(e){throw Error(`ERR (${n})/"${l}": ${e}`)}let n=Z.Static,r=n,i=[],a;function o(){a&&i.push(a),a=[]}let s=0,c,l=``,u=``;function d(){l&&=(n===Z.Static?a.push({type:ui.Static,value:l}):n===Z.Param||n===Z.ParamRegExp||n===Z.ParamRegExpEnd?(a.length>1&&(c===`*`||c===`+`)&&t(`A repeatable param (${l}) must be alone in its segment. eg: '/:ids+.`),a.push({type:ui.Param,value:l,regexp:u,repeatable:c===`*`||c===`+`,optional:c===`*`||c===`?`})):t(`Invalid state to consume buffer`),``)}function f(){l+=c}for(;s<e.length;){if(c=e[s++],c===`\\`&&n!==Z.ParamRegExp){r=n,n=Z.EscapeNext;continue}switch(n){case Z.Static:c===`/`?(l&&d(),o()):c===`:`?(d(),n=Z.Param):f();break;case Z.EscapeNext:f(),n=r;break;case Z.Param:c===`(`?n=Z.ParamRegExp:fi.test(c)?f():(d(),n=Z.Static,c!==`*`&&c!==`?`&&c!==`+`&&s--);break;case Z.ParamRegExp:c===`)`?u[u.length-1]==`\\`?u=u.slice(0,-1)+c:n=Z.ParamRegExpEnd:u+=c;break;case Z.ParamRegExpEnd:d(),n=Z.Static,c!==`*`&&c!==`?`&&c!==`+`&&s--,u=``;break;default:t(`Unknown state`);break}}return n===Z.ParamRegExp&&t(`Unfinished custom RegExp for param "${l}"`),d(),o(),i}var mi=`[^/]+?`,hi={sensitive:!1,strict:!1,start:!0,end:!0},Q=function(e){return e[e._multiplier=10]=`_multiplier`,e[e.Root=90]=`Root`,e[e.Segment=40]=`Segment`,e[e.SubSegment=30]=`SubSegment`,e[e.Static=40]=`Static`,e[e.Dynamic=20]=`Dynamic`,e[e.BonusCustomRegExp=10]=`BonusCustomRegExp`,e[e.BonusWildcard=-50]=`BonusWildcard`,e[e.BonusRepeatable=-20]=`BonusRepeatable`,e[e.BonusOptional=-8]=`BonusOptional`,e[e.BonusStrict=.7000000000000001]=`BonusStrict`,e[e.BonusCaseSensitive=.25]=`BonusCaseSensitive`,e}(Q||{}),gi=/[.+*?^${}()[\]/\\]/g;function _i(e,t){let n=G({},hi,t),r=[],i=n.start?`^`:``,a=[];for(let t of e){let e=t.length?[]:[Q.Root];n.strict&&!t.length&&(i+=`/`);for(let r=0;r<t.length;r++){let o=t[r],s=Q.Segment+(n.sensitive?Q.BonusCaseSensitive:0);if(o.type===ui.Static)r||(i+=`/`),i+=o.value.replace(gi,`\\$&`),s+=Q.Static;else if(o.type===ui.Param){let{value:e,repeatable:n,optional:c,regexp:l}=o;a.push({name:e,repeatable:n,optional:c});let u=l||mi;if(u!==mi){s+=Q.BonusCustomRegExp;try{`${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+=Q.Dynamic,c&&(s+=Q.BonusOptional),n&&(s+=Q.BonusRepeatable),u===`.*`&&(s+=Q.BonusWildcard)}e.push(s)}r.push(e)}if(n.strict&&n.end){let e=r.length-1;r[e][r[e].length-1]+=Q.BonusStrict}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===ui.Static)n+=e.value;else if(e.type===ui.Param){let{value:a,repeatable:o,optional:s}=e,c=a in t?t[a]:``;if(K(c)&&!o)throw Error(`Provided param "${a}" is an array but it is not repeatable (* or + modifiers)`);let l=K(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 vi(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]===Q.Static+Q.Segment?-1:1:e.length>t.length?t.length===1&&t[0]===Q.Static+Q.Segment?1:-1:0}function yi(e,t){let n=0,r=e.score,i=t.score;for(;n<r.length&&n<i.length;){let e=vi(r[n],i[n]);if(e)return e;n++}if(Math.abs(i.length-r.length)===1){if(bi(r))return 1;if(bi(i))return-1}return i.length-r.length}function bi(e){let t=e[e.length-1];return e.length>0&&t[t.length-1]<0}var xi={strict:!1,end:!0,sensitive:!1};function Si(e,t,n){let r=G(_i(pi(e.path),n),{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function Ci(e,t){let n=[],r=new Map;t=Zn(xi,t);function i(e){return r.get(e)}function a(e,n,r){let i=!r,s=Ti(e);s.aliasOf=r&&r.record;let l=Zn(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(Ti(G({},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=Si(t,n,l),r?r.alias.push(d):(f||=d,f!==d&&f.alias.push(d),i&&e.name&&!Di(d)&&o(e.name)),ji(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)}:Xn}function o(e){if(Ur(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=ki(e,n);n.splice(t,0,e),e.record.name&&!Di(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 Gr(J.MATCHER_NOT_FOUND,{location:e});s=i.record.name,a=G(wi(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&wi(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);else{if(i=t.name?r.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw Gr(J.MATCHER_NOT_FOUND,{location:e,currentLocation:t});s=i.record.name,a=G({},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:Oi(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 wi(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Ti(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Ei(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 Ei(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 Di(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Oi(e){return e.reduce((e,t)=>G(e,t.meta),{})}function ki(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;yi(e,t[i])<0?r=i:n=i+1}let i=Ai(e);return i&&(r=t.lastIndexOf(i,r-1)),r}function Ai(e){let t=e;for(;t=t.parent;)if(ji(t)&&yi(e,t)===0)return t}function ji({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Mi(e){let t=u(Zr),n=u(Qr),r=y(()=>{let n=m(e.to);return t.resolve(n)}),i=y(()=>{let{matched:e}=r.value,{length:t}=e,i=e[t-1],a=n.matched;if(!i||!a.length)return-1;let o=a.findIndex(Tr.bind(null,i));if(o>-1)return o;let s=Li(e[t-2]);return t>1&&Li(i)===s&&a[a.length-1].path!==s?a.findIndex(Tr.bind(null,e[t-2])):o}),a=y(()=>i.value>-1&&Ii(n.params,r.value.params)),o=y(()=>i.value>-1&&i.value===n.matched.length-1&&Er(n.params,r.value.params));function s(n={}){if(Fi(n)){let n=t[m(e.replace)?`replace`:`push`](m(e.to)).catch(Xn);return e.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}return{route:r,href:y(()=>r.value.href),isActive:a,isExactActive:o,navigate:s}}function Ni(e){return e.length===1?e[0]:e}var Pi=S({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:Mi,setup(t,{slots:r}){let i=e(Mi(t)),{options:a}=u(Zr),o=y(()=>({[Ri(t.activeClass,a.linkActiveClass,`router-link-active`)]:i.isActive,[Ri(t.exactActiveClass,a.linkExactActiveClass,`router-link-exact-active`)]:i.isExactActive}));return()=>{let e=r.default&&Ni(r.default(i));return t.custom?e:n(`a`,{"aria-current":i.isExactActive?t.ariaCurrentValue:null,href:i.href,onClick:i.navigate,class:o.value},e)}}});function Fi(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 Ii(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(!K(i)||i.length!==r.length||r.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}function Li(e){return e?e.aliasOf?e.aliasOf.path:e.path:``}var Ri=(e,t,n)=>e??t??n,zi=S({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:r}){let i=u($r),a=y(()=>e.route||i.value),s=u(Xr,0),c=y(()=>{let e=m(s),{matched:t}=a.value,n;for(;(n=t[e])&&!n.components;)e++;return e}),l=y(()=>a.value.matched[c.value]);o(Xr,y(()=>c.value+1)),o(Yr,l),o($r,a);let f=_();return d(()=>[f.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||!Tr(t,i)||!r)&&(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:`post`}),()=>{let i=a.value,o=e.name,s=l.value,c=s&&s.components[o];if(!c)return Bi(r.default,{Component:c,route:i});let u=s.props[o],d=n(c,G({},u?u===!0?i.params:typeof u==`function`?u(i):u:null,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(s.instances[o]=null)},ref:f}));return Bi(r.default,{Component:d,route:i})||d}}});function Bi(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var Vi=zi;function Hi(e){let t=Ci(e.routes,e),n=e.parseQuery||Kr,i=e.stringifyQuery||qr,a=e.history,o=ei(),s=ei(),c=ei(),l=ee(q),u=q;Kn&&e.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let d=Yn.bind(null,e=>``+e),f=Yn.bind(null,_r),p=Yn.bind(null,vr);function h(e,n){let r,i;return Ur(e)?(r=t.getRecordMatcher(e),i=n):i=e,t.addRoute(i,r)}function g(e){let n=t.getRecordMatcher(e);n&&t.removeRoute(n)}function _(){return t.getRoutes().map(e=>e.record)}function v(e){return!!t.getRecordMatcher(e)}function y(e,r){if(r=G({},r||l.value),typeof e==`string`){let i=xr(n,e,r.path),o=t.resolve({path:i.path},r),s=a.createHref(i.fullPath);return G(i,o,{params:p(o.params),hash:vr(i.hash),redirectedFrom:void 0,href:s})}let o;if(e.path!=null)o=G({},e,{path:xr(n,e.path,r.path).path});else{let t=G({},e.params);for(let e in t)t[e]??delete t[e];o=G({},e,{params:f(t)}),r.params=f(r.params)}let s=t.resolve(o,r),c=e.hash||``;s.params=d(p(s.params));let u=Sr(i,G({},e,{hash:pr(c),path:s.path})),m=a.createHref(u);return G({fullPath:u,hash:c,query:i===qr?Jr(e.query):e.query||{}},s,{redirectedFrom:void 0,href:m})}function b(e){return typeof e==`string`?xr(n,e,l.value.path):G({},e)}function te(e,t){if(u!==e)return Gr(J.NAVIGATION_CANCELLED,{from:t,to:e})}function ne(e){return C(e)}function x(e){return ne(G(b(e),{replace:!0}))}function S(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=b(i):{path:i},i.params={}),G({query:e.query,hash:e.hash,params:i.path==null?e.params:{}},i)}}function C(e,t){let n=u=y(e),r=l.value,a=e.state,o=e.force,s=e.replace===!0,c=S(n,r);if(c)return C(G(b(c),{state:typeof c==`object`?G({},a,c.state):a,force:o,replace:s}),t||n);let d=n;d.redirectedFrom=t;let f;return!o&&wr(i,r,n)&&(f=Gr(J.NAVIGATION_DUPLICATED,{to:d,from:r}),ue(r,r,!0,!1)),(f?Promise.resolve(f):E(d,r)).catch(e=>Y(e)?Y(e,J.NAVIGATION_GUARD_REDIRECT)?e:A(e):k(e,d,r)).then(e=>{if(e){if(Y(e,J.NAVIGATION_GUARD_REDIRECT))return C(G({replace:s},b(e.to),{state:typeof e.to==`object`?G({},a,e.to.state):a,force:o}),t||d)}else e=ae(d,r,!0,s,a);return ie(d,r,e),e})}function w(e,t){let n=te(e,t);return n?Promise.reject(n):Promise.resolve()}function T(e){let t=N.values().next().value;return t&&typeof t.runWithContext==`function`?t.runWithContext(e):e()}function E(e,t){let n,[r,i,a]=ni(e,t);n=ti(r.reverse(),`beforeRouteLeave`,e,t);for(let i of r)i.leaveGuards.forEach(r=>{n.push(X(r,e,t))});let c=w.bind(null,e,t);return n.push(c),F(n).then(()=>{n=[];for(let r of o.list())n.push(X(r,e,t));return n.push(c),F(n)}).then(()=>{n=ti(i,`beforeRouteUpdate`,e,t);for(let r of i)r.updateGuards.forEach(r=>{n.push(X(r,e,t))});return n.push(c),F(n)}).then(()=>{n=[];for(let r of a)if(r.beforeEnter)if(K(r.beforeEnter))for(let i of r.beforeEnter)n.push(X(i,e,t));else n.push(X(r.beforeEnter,e,t));return n.push(c),F(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=ti(a,`beforeRouteEnter`,e,t,T),n.push(c),F(n))).then(()=>{n=[];for(let r of s.list())n.push(X(r,e,t));return n.push(c),F(n)}).catch(e=>Y(e,J.NAVIGATION_CANCELLED)?e:Promise.reject(e))}function ie(e,t,n){c.list().forEach(r=>T(()=>r(e,t,n)))}function ae(e,t,n,r,i){let o=te(e,t);if(o)return o;let s=t===q,c=Kn?history.state:{};n&&(r||s?a.replace(e.fullPath,G({scroll:s&&c&&c.scroll},i)):a.push(e.fullPath,i)),l.value=e,ue(e,t,n,s),A()}let D;function O(){D||=a.listen((e,t,n)=>{if(!P.listening)return;let r=y(e),i=S(r,P.currentRoute.value);if(i){C(G(i,{replace:!0,force:!0}),r).catch(Xn);return}u=r;let o=l.value;Kn&&Br(Rr(o.fullPath,n.delta),Ir()),E(r,o).catch(e=>Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_CANCELLED)?e:Y(e,J.NAVIGATION_GUARD_REDIRECT)?(C(G(b(e.to),{force:!0}),r).then(e=>{Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_DUPLICATED)&&!n.delta&&n.type===Ar.pop&&a.go(-1,!1)}).catch(Xn),Promise.reject()):(n.delta&&a.go(-n.delta,!1),k(e,r,o))).then(e=>{e||=ae(r,o,!1),e&&(n.delta&&!Y(e,J.NAVIGATION_CANCELLED)?a.go(-n.delta,!1):n.type===Ar.pop&&Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_DUPLICATED)&&a.go(-1,!1)),ie(r,o,e)}).catch(Xn)})}let oe=ei(),se=ei(),ce;function k(e,t,n){A(e);let r=se.list();return r.length?r.forEach(r=>r(e,t,n)):console.error(e),Promise.reject(e)}function le(){return ce&&l.value!==q?Promise.resolve():new Promise((e,t)=>{oe.add([e,t])})}function A(e){return ce||(ce=!e,O(),oe.list().forEach(([t,n])=>e?n(e):t()),oe.reset()),e}function ue(t,n,i,a){let{scrollBehavior:o}=e;if(!Kn||!o)return Promise.resolve();let s=!i&&Vr(Rr(t.fullPath,0))||(a||!i)&&history.state&&history.state.scroll||null;return r().then(()=>o(t,n,s)).then(e=>e&&Lr(e)).catch(e=>k(e,t,n))}let j=e=>a.go(e),M,N=new Set,P={currentRoute:l,listening:!0,addRoute:h,removeRoute:g,clearRoutes:t.clearRoutes,hasRoute:v,getRoutes:_,resolve:y,options:e,push:ne,replace:x,go:j,back:()=>j(-1),forward:()=>j(1),beforeEach:o.add,beforeResolve:s.add,afterEach:c.add,onError:se.add,isReady:le,install(e){e.component(`RouterLink`,Pi),e.component(`RouterView`,Vi),e.config.globalProperties.$router=P,Object.defineProperty(e.config.globalProperties,`$route`,{enumerable:!0,get:()=>m(l)}),Kn&&!M&&l.value===q&&(M=!0,ne(a.location).catch(e=>{}));let t={};for(let e in q)Object.defineProperty(t,e,{get:()=>l.value[e],enumerable:!0});e.provide(Zr,P),e.provide(Qr,re(t)),e.provide($r,l);let n=e.unmount;N.add(e),e.unmount=function(){N.delete(e),N.size<1&&(u=q,D&&D(),D=null,l.value=q,M=!1,ce=!1),n()}}};function F(e){return e.reduce((e,t)=>e.then(()=>T(t)),Promise.resolve())}return P}function Ui(){return u(Zr)}function Wi(e){return u(Qr)}var Gi=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Ki=function(e){return`/`+e},qi={},$=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}))))}r=o(t.map(t=>{if(t=Ki(t,n),t in qi)return;qi[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Gi,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.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)})},Ji=[{path:`/`,component:()=>$(()=>import(`./MainLayout-C0mTMDDv.js`),__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,26,27,28,29,30,31,32,33,34])),children:[{path:``,redirect:{name:`workspace`}},{path:`workspace/:id?`,name:`workspace`,component:()=>$(()=>import(`./WorkspacePage-CTaTo1Wh.js`),__vite__mapDeps([35,1,2,3,4,8,7,9,11,36,17,14,15,13,37,18,19,38,21,16,30,20,39,23,40,25,26,27,28,41,33,42,32,43]))},{path:`create`,name:`create`,component:()=>$(()=>import(`./CreatePage-YT54FfA1.js`),__vite__mapDeps([44,1,2,3,4,8,7,9,45,19,38,16,37,18,15,21,30,39,23,40,27,41,33,42,46]))},{path:`settings`,name:`settings`,component:()=>$(()=>import(`./SettingsPage-COBWjs_d.js`),__vite__mapDeps([47,1,2,3,4,6,7,8,9,10,36,17,14,15,13,18,45,19,38,16,37,21,30,20,39,23,24,27,28,29,26,48]))},{path:`search`,name:`search`,component:()=>$(()=>import(`./SearchPage-pIX1EzKl.js`),__vite__mapDeps([49,1,2,3,4,8,11,15,39,23,24,14,32,50]))},{path:`health`,name:`health`,component:()=>$(()=>import(`./HealthPage-DGh8w9iT.js`),__vite__mapDeps([51,3,4,11,9,19,20,39,23,27]))},{path:`changelog`,name:`changelog`,component:()=>$(()=>import(`./ChangelogPage-DWAmbFWX.js`),__vite__mapDeps([52,1,3,5,9,4,18,39,23,53]))}]},{path:`/:catchAll(.*)*`,redirect:`/`}],Yi=Un(()=>Hi({scrollBehavior:()=>({left:0,top:0}),routes:Ji,history:li()}));async function Xi(e,t){let n=e(Vn);n.use(pt,t);let r=typeof Gn==`function`?await Gn({}):Gn;n.use(r);let i=f(typeof Yi==`function`?await Yi({store:r}):Yi);return r.use(({store:e})=>{e.router=i}),{app:n,store:r,router:i}}var Zi={radio:He,checkbox:Je,toggle:Ye},Qi=Object.keys(Zi);function $i(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>e[n]}var ea=O({name:`QOptionGroup`,props:{...A,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(L),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:`radio`,validator:e=>Qi.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(e,{emit:t,slots:r}){let{proxy:{$q:i}}=h(),a=Array.isArray(e.modelValue);e.type===`radio`?a===!0&&console.error(`q-option-group: model should not be array`):a===!1&&console.error(`q-option-group: model should be array in your case`);let o=le(e,i),s=y(()=>Zi[e.type]),c=y(()=>$i(e.optionValue,`value`)),l=y(()=>$i(e.optionLabel,`label`)),u=y(()=>$i(e.optionDisable,`disable`)),d=y(()=>e.options.map(t=>({val:c.value(t),name:t.name===void 0?e.name:t.name,disable:e.disable||u.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?o.value:t.dark,size:t.size===void 0?e.size:t.size,dense:e.dense,keepColor:t.keepColor===void 0?e.keepColor:t.keepColor}))),f=y(()=>`q-option-group q-gutter-x-sm`+(e.inline===!0?` q-option-group--inline`:``)),p=y(()=>{let t={role:`group`};return e.type===`radio`&&(t.role=`radiogroup`,e.disable===!0&&(t[`aria-disabled`]=`true`)),t});function m(e){t(`update:modelValue`,e)}return()=>n(`div`,{class:f.value,...p.value},e.options.map((t,i)=>{let a=r[`label-`+i]===void 0?r.label===void 0?void 0:()=>r.label(t):()=>r[`label-`+i](t);return n(`div`,[n(s.value,{label:a===void 0?l.value(t):null,modelValue:e.modelValue,"onUpdate:modelValue":m,...d.value[i]},a)])}))}}),ta=O({name:`DialogPluginComponent`,props:{...A,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}=h(),{$q:i}=r,a=le(e,i),o=_(null),s=_(e.prompt===void 0?e.options===void 0?void 0:e.options.model:e.prompt.model),c=y(()=>`q-dialog-plugin`+(a.value===!0?` q-dialog-plugin--dark q-dark`:``)+(e.progress===!1?``:` q-dialog-plugin--progress`)),l=y(()=>e.color||(a.value===!0?`amber`:`primary`)),u=y(()=>e.progress===!1?null:L(e.progress)===!0?{component:e.progress.spinner||k,props:{color:e.progress.color||l.value}}:{component:k,props:{color:l.value}}),f=y(()=>e.prompt!==void 0||e.options!==void 0),p=y(()=>{if(f.value!==!0)return{};let{model:t,isValid:n,items:r,...i}=e.prompt===void 0?e.options:e.prompt;return i}),m=y(()=>L(e.ok)===!0||e.ok===!0?i.lang.label.ok:e.ok),g=y(()=>L(e.cancel)===!0||e.cancel===!0?i.lang.label.cancel:e.cancel),v=y(()=>e.prompt===void 0?e.options===void 0?!1:e.options.isValid!==void 0&&e.options.isValid(s.value)!==!0:e.prompt.isValid!==void 0&&e.prompt.isValid(s.value)!==!0),ee=y(()=>({color:l.value,label:m.value,ripple:!1,disable:v.value,...L(e.ok)===!0?e.ok:{flat:!0},"data-autofocus":e.focus===`ok`&&f.value!==!0||void 0,onClick:x})),b=y(()=>({color:l.value,label:g.value,ripple:!1,...L(e.cancel)===!0?e.cancel:{flat:!0},"data-autofocus":e.focus===`cancel`&&f.value!==!0||void 0,onClick:S}));d(()=>e.prompt&&e.prompt.model,w),d(()=>e.options&&e.options.model,w);function te(){o.value.show()}function re(){o.value.hide()}function x(){t(`ok`,ne(s.value)),re()}function S(){re()}function C(){t(`hide`)}function w(e){s.value=e}function T(t){v.value!==!0&&e.prompt.type!==`textarea`&&ce(t,13)===!0&&x()}function E(t,r){return e.html===!0?n(B,{class:t,innerHTML:r}):n(B,{class:t},()=>r)}function ie(){return[n(qe,{color:l.value,dense:!0,autofocus:!0,dark:a.value,...p.value,modelValue:s.value,"onUpdate:modelValue":w,onKeyup:T})]}function ae(){return[n(ea,{color:l.value,options:e.options.items,dark:a.value,...p.value,modelValue:s.value,"onUpdate:modelValue":w})]}function D(){let t=[];return e.cancel&&t.push(n(We,b.value)),e.ok&&t.push(n(We,ee.value)),n(Be,{class:e.stackButtons===!0?`items-end`:``,vertical:e.stackButtons,align:`right`},()=>t)}function O(){let t=[];return e.title&&t.push(E(`q-dialog__title`,e.title)),e.progress!==!1&&t.push(n(B,{class:`q-dialog__progress`},()=>n(u.value.component,u.value.props))),e.message&&t.push(E(`q-dialog__message`,e.message)),e.prompt===void 0?e.options!==void 0&&t.push(n(me,{dark:a.value}),n(B,{class:`scroll q-dialog-plugin__form`},ae),n(me,{dark:a.value})):t.push(n(B,{class:`scroll q-dialog-plugin__form`},ie)),(e.ok||e.cancel)&&t.push(D()),t}function oe(){return[n(mt,{class:[c.value,e.cardClass],style:e.cardStyle,dark:a.value},O)]}return Object.assign(r,{show:te,hide:re}),()=>n(Ft,{ref:o,onHide:C},oe)}});function na(e,t){for(let n in t)n!==`spinner`&&Object(t[n])===t[n]?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},na(e[n],t[n])):e[n]=t[n]}function ra(e,t,i){return a=>{let o,s,c=t===!0&&a.component!==void 0;if(c===!0){let{component:e,componentProps:t}=a;o=typeof e==`string`?i.component(e):e,s=t||{}}else{let{class:t,style:n,...r}=a;o=e,s=r,t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n)}let l,u=!1,d=_(null),f=ve(!1,`dialog`),p=e=>{if(d.value?.[e]!==void 0){d.value[e]();return}let t=l.$.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`)},m=[],h=[],g={onOk(e){return m.push(e),g},onCancel(e){return h.push(e),g},onDismiss(e){return m.push(e),h.push(e),g},hide(){return p(`hide`),g},update(e){if(l!==null){if(c===!0)Object.assign(s,e);else{let{class:t,style:n,...r}=e;t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n),na(s,r)}l.$forceUpdate()}return g}},v=e=>{u=!0,m.forEach(t=>{t(e)})},y=()=>{ee.unmount(f),Ce(f),ee=null,l=null,u!==!0&&h.forEach(e=>{e()})},ee=ut({name:`QGlobalDialog`,setup:()=>()=>n(o,{...s,ref:d,onOk:v,onHide:y,onVnodeMounted(...e){typeof s.onVnodeMounted==`function`&&s.onVnodeMounted(...e),r(()=>p(`show`))}})},i);return l=ee.mount(f),g}}var ia={install({$q:e,parentApp:t}){e.dialog=this.create=ra(ta,!0,t)}},aa={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:sn,Dialog:ia}},oa=`/`;async function sa({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:oa})}catch(e){if(e&&e.url){o(e.url);return}console.error(`[Quasar] boot error:`,e);return}i!==!0&&(e.use(t),e.mount(`#q-app`))}Xi(w,aa).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-BPs_6dhe.js`),[])]).then(t=>{sa(e,n(t).filter(e=>typeof e==`function`))})});export{Ft as _,Hn as a,mt as b,H as c,bn as d,xn as f,Wt as g,_n as h,Ui as i,On as l,vn as m,$ as n,Bn as o,yn as p,Wi as r,kn as s,ea as t,wn as u,jt as v,B as x,ht as y};
|
|
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.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`,"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?`,"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.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.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`,"tool.running":`In corso...`,"activity.raw_lines":`Righe di output grezze ({n})`,"activity.loading_older":`Caricamento messaggi precedenti…`,"activity.prev_user_message":`Messaggio utente precedente`,"activity.scroll_to_bottom":`Scorri in fondo`,"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.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.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`,"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.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.deny":`Nega`,"permissionRequest.tool":`Strumento`,"permissionRequest.input":`Input`,"permissionRequest.denied":`negato dall'utente`,"workspaceStatus.awaitingUser":`in attesa della tua risposta`,"workspaceList.prOpen":`#{n} — Pull request aperta`,"workspaceList.prChangesRequested":`#{n} — Modifiche richieste`,"workspaceList.attentionCiFailed":`CI fallita`,"workspaceList.attentionChangesRequested":`Modifiche richieste`,"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`,"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.switchToCurrent":`Passa a quella corrente`},pn=`kobo:locale`,mn=[`en`,`fr`,`de`,`es`,`it`];function hn(e){return mn.includes(e)}function gn(){let e=localStorage.getItem(pn);if(e&&hn(e))return e;let t=navigator.language.split(`-`)[0];return t&&hn(t)?(localStorage.setItem(pn,t),t):(localStorage.setItem(pn,`en`),`en`)}var _n=Ke({legacy:!1,locale:gn(),fallbackLocale:`en`,messages:{en:ln,fr:dn,de:cn,es:un,it:fn}}),vn=P(`agent-stream`,()=>{let e=_(new Map),t=_(new Map),n=_(new Map),r=_(new Map),i=_(new Map),a=_(new Map),o=_(0);function s(t){return o.value,e.value.get(t)??[]}function c(e){return o.value,t.value.get(e)??[]}function l(e){return o.value,n.value.get(e)??[]}function u(e){return o.value,r.value.get(e)??[]}function d(e){return o.value,i.value.get(e)}function f(e){return o.value,a.value.get(e)??!0}function p(a,s,c,l,u){let d=e.value.get(a)??[],f=t.value.get(a)??[],p=n.value.get(a)??[],m=r.value.get(a)??[],h=d.length===0;d.push(s),f.push(c??new Date().toISOString()),p.push(u??null),m.push(l??null),e.value.set(a,d),t.value.set(a,f),n.value.set(a,p),r.value.set(a,m),h&&l&&i.value.set(a,l),o.value++}function m(s,c,l,u){e.value.set(s,[...c]),t.value.set(s,l?[...l]:c.map(()=>new Date().toISOString())),n.value.set(s,u?.sessionIds?[...u.sessionIds]:c.map(()=>null)),r.value.set(s,u?.eventIds?[...u.eventIds]:c.map(()=>null)),u?.oldestId?i.value.set(s,u.oldestId):i.value.delete(s),u&&typeof u.hasMoreOlder==`boolean`?a.value.set(s,u.hasMoreOlder):a.value.delete(s),o.value++}function h(s,c,l,u){if(c.length===0){a.value.set(s,u.hasMoreOlder),o.value++;return}let d=e.value.get(s)??[],f=t.value.get(s)??[],p=n.value.get(s)??[],m=r.value.get(s)??[],h=u.sessionIds??c.map(()=>null),g=u.eventIds??c.map(()=>null);e.value.set(s,[...c,...d]),t.value.set(s,[...l,...f]),n.value.set(s,[...h,...p]),r.value.set(s,[...g,...m]),u.oldestId&&i.value.set(s,u.oldestId),a.value.set(s,u.hasMoreOlder),o.value++}function g(i,a){let s=e.value.get(i),c=r.value.get(i);if(!s||!c)return;let l=c.indexOf(a);if(l===-1)return;let u=t.value.get(i),d=n.value.get(i);s.splice(l,1),c.splice(l,1),u&&u.splice(l,1),d&&d.splice(l,1),o.value++}function v(s){e.value.delete(s),t.value.delete(s),n.value.delete(s),r.value.delete(s),i.value.delete(s),a.value.delete(s),o.value++}return{events:e,timestamps:t,sessionIds:n,eventIds:r,version:o,eventsFor:s,timestampsFor:c,sessionIdsFor:l,eventIdsFor:u,oldestIdFor:d,hasMoreOlderFor:f,append:p,reset:m,prepend:h,removeByEventId:g,clear:v}}),yn=P(`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 bn(e){return e.state===`OPEN`&&e.reviewDecision===`CHANGES_REQUESTED`&&e.reviewers.some(e=>e.state===`CHANGES_REQUESTED`)}function xn(e){return e.state===`OPEN`&&e.ci.rollup===`FAILURE`}function Sn(e){return e?xn(e)||bn(e):!1}var Cn=[`executing`,`extracting`,`brainstorming`];function wn(e){return!!e&&Cn.includes(e)}function Tn(e){"@babel/helpers - typeof";return Tn=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},Tn(e)}function En(e,t){if(Tn(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(Tn(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Dn(e){var t=En(e,`string`);return Tn(t)==`symbol`?t:t+``}function On(e,t,n){return(t=Dn(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var kn=class extends Error{constructor(e,t){super(e),On(this,`code`,void 0),this.name=`WorkspaceActionError`,this.code=t}},An=5e3,jn=500,Mn=null;function Nn(e){return e===`claude-code`?`claude-code`:null}var H=P(`workspace`,{state:()=>({workspaces:[],selectedWorkspaceId:null,tasks:[],activityFeeds:{},activityFeedIds:{},activityCounts:{},subagents:{},agentTodos:{},sessions:[],selectedSessionId:null,archivedWorkspaces:[],archivedLoaded:!1,loading:!1,loadingOlderEvents:!1,hasMoreEvents:{},providerUsage:{},chatDraft:``,queuedMessages:{},gitRefreshTrigger:0,gitStatsCache:{},pendingWakeups:{},pendingQuotaBackoffs:{},pendingDeferred:{},pendingQueue:{},prSnapshots:{},autoLoopStates:{},crons:{}}),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)||Sn(e.prSnapshots[t.id]))},running(e){return e.workspaces.filter(t=>wn(t.status)&&!Sn(e.prSnapshots[t.id]))},idle(e){return e.workspaces.filter(t=>[`completed`,`idle`,`created`].includes(t.status)&&!Sn(e.prSnapshots[t.id]))},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=Nn(t.engine);return n?e.providerUsage[n]??null:null}},actions:{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 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){let t=`/api/git/orphan-worktrees?projectPath=${encodeURIComponent(e)}`,n=await fetch(t,{cache:`no-store`});if(!n.ok)throw Error(`HTTP ${n.status}`);return n.json()},async fetchWorkspaces(){this.loading=!0;try{let e=await fetch(`/api/workspaces`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();this.workspaces=t.workspaces??t;for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id)}catch(e){console.error(`[workspace store] fetchWorkspaces failed:`,e)}finally{this.loading=!1}},async fetchArchivedWorkspaces(){try{let e=await fetch(`/api/workspaces/archived`);if(!e.ok)throw Error(`HTTP ${e.status}`);this.archivedWorkspaces=await e.json(),this.archivedLoaded=!0}catch(e){console.error(`[workspace store] fetchArchivedWorkspaces failed:`,e)}},async fetchWorkspaceDetails(e){try{let t=await fetch(`/api/workspaces/${e}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();if(this.selectedWorkspaceId!==e)return;let r=n.workspace??n,i=this.workspaces.findIndex(t=>t.id===e);if(i>=0)this.workspaces[i]={...this.workspaces[i],...r};else{let t=this.archivedWorkspaces.findIndex(t=>t.id===e);t>=0?this.archivedWorkspaces[t]={...this.archivedWorkspaces[t],...r}:r?.archivedAt&&this.archivedWorkspaces.unshift(r)}n.tasks&&(this.tasks=n.tasks)}catch(e){console.error(`[workspace store] fetchWorkspaceDetails failed:`,e)}},async createWorkspace(e){try{let t=await fetch(`/api/workspaces`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=t.headers.get(`X-Kobo-Branch-Adjusted`)===`1`,r=await t.json(),i=r.workspace??r,a=this.workspaces.findIndex(e=>e.id===i.id);return a>=0?this.workspaces[a]=i:this.workspaces.push(i),e.autoLoop&&this.fetchAutoLoopStates(),i._branchAdjusted=n,i}catch(e){throw console.error(`[workspace store] createWorkspace failed:`,e),e}},async startWorkspace(e,t,n,r){try{let i=await fetch(`/api/workspaces/${e}/start`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:t,agentSessionId:n,resume:r})});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error??`HTTP ${i.status}`)}await this.fetchWorkspaces()}catch(e){throw console.error(`[workspace store] startWorkspace failed:`,e),e}},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){try{let t=await fetch(`/api/workspaces/${e}/interrupt`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}}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),delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e],delete this.subagents[e],delete this.agentTodos[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)delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e],delete this.subagents[e],delete this.agentTodos[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 r=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({description:t})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`HTTP ${r.status}`)}let i=await r.json();this.workspaces[n]={...this.workspaces[n],...i}}catch(t){let n=this.workspaces.findIndex(t=>t.id===e);throw n>=0&&(this.workspaces[n]={...this.workspaces[n],description:r}),t}},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 kn(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 kn(e.error??`Push failed`,e.code)}},async fetchGitStats(e,t={}){let n=`/api/workspaces/${e}/git-stats${t.freshFetch?`?freshFetch=1`:``}`,r=await fetch(n,{signal:t.signal});if(!r.ok)throw Error(`HTTP ${r.status}`);let i=await r.json();return this.gitStatsCache[e]=i,i},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 kn(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.tasks=[],this.markRead(e),this.fetchWorkspaceDetails(e),this.fetchSessions(e),this.fetchPendingQuotaBackoff(e),this.fetchGitStats(e).catch(()=>{}),this.activityFeeds[e]?.length||Bn().subscribe(e)},async fetchSessions(e,t){try{let n=await fetch(`/api/workspaces/${e}/sessions`);if(!n.ok)throw Error(`HTTP ${n.status}`);if(this.selectedWorkspaceId!==e)return;if(this.sessions=await n.json(),t&&this.sessions.some(e=>e.id===t)){this.selectSession(t);return}let r=this.selectedSessionId&&this.sessions.some(e=>e.id===this.selectedSessionId);if(this.sessions.length>0&&!r){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=Bn();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)},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>An){let t=n.splice(0,n.length-An),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(){Mn!==null&&clearTimeout(Mn),Mn=setTimeout(()=>{Mn=null,this.fetchPrSnapshots()},jn)},async fetchPrSnapshots(){try{let e=await fetch(`/api/workspaces/pr-states`,{cache:`no-store`});if(!e.ok)return;this.prSnapshots=await e.json()}catch(e){console.error(`[workspace-store] fetchPrSnapshots failed:`,e)}},async fetchWorkspacesInfo(){try{let e=await fetch(`/api/workspaces/info`,{cache:`no-store`});if(!e.ok)return;let t=await e.json();this.workspaces=t.workspaces;for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id);this.prSnapshots=t.prSnapshots,this.gitStatsCache={...this.gitStatsCache,...t.gitStats}}catch(e){console.error(`[workspace-store] fetchWorkspacesInfo failed:`,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,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},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;this.autoLoopStates=await e.json()}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 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||t.kind!==`question`))return{toolCallId:t.toolCallId,toolName:t.toolName,input:t.input,agentSessionId:t.agentSessionId}},async submitDeferredAnswer(e,t,n){let r=await fetch(`/api/workspaces/${e}/deferred-tool-use/answer`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({answers: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] submitDeferredAnswer: backend has no pending — 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){let i=await fetch(`/api/workspaces/${e}/deferred-permission/decision`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({toolCallId:t,decision:n,reason:r})});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error??`HTTP ${i.status}`)}this.dequeuePending(e),this.fetchWorkspaces()},updateAgentTodos(e,t){this.agentTodos[e]=t},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)}},queueMessage(e,t,n){this.queuedMessages[e]={content:t,sessionId:n}},cancelQueuedMessage(e){delete this.queuedMessages[e]},updateWorkspaceFromEvent(e,t){let n=this.workspaces.findIndex(t=>t.id===e);if(n>=0&&(this.workspaces[n]={...this.workspaces[n],...t}),t.status&&[`completed`,`idle`,`error`,`quota`].includes(t.status)){let n=this.activityFeeds[e];if(n)for(let e of n)e.meta?.pending&&(e.meta.pending=!1);let r=this.subagents[e];if(r)for(let[e,t]of Object.entries(r))t.status===`running`&&(r[e]={...t,status:`done`});let i=this.queuedMessages[e];(t.status===`completed`||t.status===`idle`)&&i&&(delete this.queuedMessages[e],Bn().sendChatMessage(e,i.content,i.sessionId),this.addActivityItem(e,{id:`user-${Date.now()}`,type:`text`,content:i.content,timestamp:new Date().toISOString(),sessionId:i.sessionId,meta:{sender:`user`,pending:!0}}))}}}}),U=_n.global.t,W=null,Pn=null,Fn=0,In=!1;function Ln(e){In=e}function Rn(e,t,n){if(t.kind!==`session:started`)return;let r=H();if(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`}),!In&&n&&r.selectedWorkspaceId===e&&r.selectedSessionId!==n&&r.fetchSessions(e,n).catch(e=>{console.error(`[websocket] fetchSessions on session:started failed:`,e)})}function zn(e,t,n,r,i){vn().append(e,t,n,r,i),Rn(e,t,i??void 0);let a=H();if(t.kind===`session:user-input-requested`){if(t.requestKind===`question`?a.enqueuePending(e,{kind:`question`,agentSessionId:i??null,toolCallId:t.toolCallId,toolName:t.toolName,input:t.payload}):a.enqueuePending(e,{kind:`permission`,agentSessionId:i??null,toolCallId:t.toolCallId,toolName:t.toolName,toolInput:t.payload}),a.updateWorkspaceFromEvent(e,{status:`awaiting-user`}),!In){let n=a.workspaces.find(t=>t.id===e)?.name??``;Ie(t.requestKind===`question`?U(`notification.agentQuestion`,{name:n}):U(`notification.agentPermissionRequest`,{name:n}),void 0,e)}return}if(t.kind===`subagent:progress`){a.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(t.kind===`tool:call`&&t.name===`TodoWrite`){let n=t.input?.todos;Array.isArray(n)&&a.updateAgentTodos(e,n.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})));return}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)&&a.triggerGitRefresh(),/\bgit\s+branch\s+-m\b/i.test(r)&&setTimeout(()=>{a.resyncWorkspaceBranch(e).catch(e=>{console.error(`[websocket] Branch resync failed:`,e)})},2500),/\bgh\s+pr\s+create\b/i.test(r)&&setTimeout(()=>a.triggerGitRefresh(),3e3)}if(t.kind===`tool:call`&&t.name===`ExitPlanMode`&&a.workspaces.find(t=>t.id===e)?.agentPermissionMode===`plan`&&(a.updateWorkspaceFromEvent(e,{agentPermissionMode:`bypass`}),a.updateAgentPermissionMode(e,`bypass`).catch(e=>{console.error(`[websocket] failed to persist ExitPlanMode flip:`,e)})),t.kind!==`session:started`){if(t.kind===`session:ended`){i&&a.clearPendingForSession(e,i);let n=a.workspaces.find(t=>t.id===e)?.status===`quota`?`quota`:t.reason===`completed`?`completed`:t.reason===`error`?`error`:`idle`;if(a.updateWorkspaceFromEvent(e,{status:n}),a.finalizeRunningSubagents(e),a.fetchWorkspaces(),!In&&t.reason!==`killed`&&a.autoLoopStates[e]?.auto_loop!==!0){let n=a.workspaces.find(t=>t.id===e)?.name??``;Ie(t.reason===`error`?U(`notification.agentError`,{name:n}):U(`notification.agentFinished`,{name:n}),void 0,e)}return}t.kind===`error`&&t.category===`quota`&&(a.updateWorkspaceFromEvent(e,{status:`quota`}),a.fetchWorkspaces())}}var Bn=P(`websocket`,{state:()=>({connected:!1,lastEventId:null,_replaying:!1}),actions:{connect(){if(W)return;let e=`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/ws`,t=new WebSocket(e);W=t,t.addEventListener(`open`,()=>{this.connected=!0,Fn=0;let e=H().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,W=null,this._scheduleReconnect()}),t.addEventListener(`error`,()=>{})},disconnect(){Pn&&=(clearTimeout(Pn),null),W&&=(W.close(),null),this.connected=!1},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}})},sendChatMessage(e,t,n,r){this._send({type:`chat:message`,payload:{workspaceId:e,content:t,sessionId:n,agentPermissionModeOverride:r}});let i=H(),a=i.workspaces.find(t=>t.id===e);a&&(a.status===`completed`||a.status===`idle`||a.status===`error`||a.status===`quota`)&&i.updateWorkspaceFromEvent(e,{status:`executing`})},_send(e){W&&W.readyState===WebSocket.OPEN&&W.send(JSON.stringify(e))},isConnected(){return W!==null&&W.readyState===WebSocket.OPEN},_scheduleReconnect(){if(Pn)return;let e=Math.min(1e3*2**Fn,3e4);Fn++,Pn=setTimeout(()=>{Pn=null,this.connect()},e)},_routeMessage(e){let t=H();e.id?this.lastEventId=e.id:e.eventId&&(this.lastEventId=e.eventId);let n=e.payload??{},r=e.workspaceId??n.workspaceId??``;switch(e.type){case`agent:event`:{if(!r)break;let t=e.createdAt;zn(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=e.createdAt??new Date().toISOString(),l=t.activityFeeds[r]??[];if(a===`user`&&l.some(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending)){let e=l.findIndex(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending);e>=0&&(l[e]={...l[e],id:s,sessionId:o})}else t.addActivityItem(r,{id:s,type:`text`,content:i,timestamp:c,sessionId:o,meta:{sender:a}})}break;case`sync:response`:this._replaying=!0,Ln(!0);try{let e=n.events??[],t=new Map;for(let n of e)if(n.type!==`sync:response`){if(n.type===`agent:event`&&n.workspaceId){let e=t.get(n.workspaceId)??{events:[],timestamps:[],sessionIds:[],eventIds:[],oldestId:void 0};e.events.push(n.payload),e.timestamps.push(n.createdAt),e.sessionIds.push(n.sessionId??null),e.eventIds.push(n.id??null),e.oldestId||=n.id,t.set(n.workspaceId,e);continue}this._routeMessage(n)}if(t.size>0){let e=vn();for(let[n,{events:r,timestamps:i,sessionIds:a,eventIds:o,oldestId:s}]of t){e.reset(n,r,i,{oldestId:s,hasMoreOlder:!0,sessionIds:a,eventIds:o});for(let e=0;e<r.length;e++){let t=r[e];if(!t)continue;let i=a[e]??null;if(t.kind===`session:user-input-requested`){t.requestKind===`question`?H().enqueuePending(n,{kind:`question`,agentSessionId:i,toolCallId:t.toolCallId,toolName:t.toolName,input:t.payload}):H().enqueuePending(n,{kind:`permission`,agentSessionId:i,toolCallId:t.toolCallId,toolName:t.toolName,toolInput:t.payload});continue}if(t.kind===`session:started`){if(i){let e=H(),t=e.peekPending(n);t&&t.agentSessionId===i&&e.dequeuePending(n)}continue}if(t.kind===`session:ended`){i&&H().clearPendingForSession(n,i);continue}t.kind===`subagent:progress`&&H().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})}}}}finally{this._replaying=!1,Ln(!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=yn();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?U(`chat.scriptDone`):`[setup] Complete`,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:`[setup] Error: ${e.payload?.message??`unknown`}`,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?U(`chat.scriptDone`):`[cleanup] Complete`,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:`[cleanup] Error: ${e.payload?.message??`unknown`}`,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?U(`chat.scriptDone`):`[archive] Complete`,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:`[archive] Error: ${e.payload?.message??`unknown`}`,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`: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});let o=[];e.prUrl&&o.push({label:U(`pr.openPr`),color:`white`,noDismiss:!0,handler:()=>window.open(e.prUrl,`_blank`)}),o.push({label:U(`pr.dismiss`),color:`white`}),sn.create({type:`info`,position:`top`,timeout:0,message:U(`pr.baseChanged`,{oldBase:i,newBase:a}),actions:o}),Ie(U(`pr.baseChanged`,{oldBase:i,newBase:a}),void 0,r);break}case`pr:changes-requested`:{if(!r)break;let e=n,i=U(`toast.prChangesRequested`,{n:e.prNumber??0}),a=[];e.prUrl&&a.push({label:U(`pr.openPr`),color:`white`,noDismiss:!0,handler:()=>window.open(e.prUrl,`_blank`)}),a.push({label:U(`pr.dismiss`),color:`white`}),sn.create({type:`warning`,position:`top`,timeout:0,message:i,actions:a}),Ie(i,void 0,r),t.refreshPrSnapshot(r);break}case`pr:approved`:{if(!r)break;let e=U(`toast.prApproved`,{n:n.prNumber??0});sn.create({type:`positive`,position:`top`,timeout:5e3,message:e}),Ie(e,void 0,r),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&&Ie(U(`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`:null;a&&Ie(U(a,{name:i}),void 0,r)}break;case`migration:progress`:case`migration:error`:It().update(n);break}}}}),Vn=S({__name:`App`,setup(e){let t=Bn(),n=Wt();return s(()=>{t.connect(),n.fetchTemplates(),Fe()}),c(()=>{t.disconnect()}),(e,t)=>{let n=C(`router-view`);return a(),b(te,null,[p(n),p(Ut)],64)}}});function Hn(e){return e}function Un(e){return e}function Wn(e){return e}var Gn=Wn(()=>de()),Kn=typeof document<`u`;function qn(e){return typeof e==`object`||`displayName`in e||`props`in e||`__vccOpts`in e}function Jn(e){return e.__esModule||e[Symbol.toStringTag]===`Module`||e.default&&qn(e.default)}var G=Object.assign;function Yn(e,t){let n={};for(let r in t){let i=t[r];n[r]=K(i)?i.map(e):e(i)}return n}var Xn=()=>{},K=Array.isArray;function Zn(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var Qn=/#/g,$n=/&/g,er=/\//g,tr=/=/g,nr=/\?/g,rr=/\+/g,ir=/%5B/g,ar=/%5D/g,or=/%5E/g,sr=/%60/g,cr=/%7B/g,lr=/%7C/g,ur=/%7D/g,dr=/%20/g;function fr(e){return e==null?``:encodeURI(``+e).replace(lr,`|`).replace(ir,`[`).replace(ar,`]`)}function pr(e){return fr(e).replace(cr,`{`).replace(ur,`}`).replace(or,`^`)}function mr(e){return fr(e).replace(rr,`%2B`).replace(dr,`+`).replace(Qn,`%23`).replace($n,`%26`).replace(sr,"`").replace(cr,`{`).replace(ur,`}`).replace(or,`^`)}function hr(e){return mr(e).replace(tr,`%3D`)}function gr(e){return fr(e).replace(Qn,`%23`).replace(nr,`%3F`)}function _r(e){return gr(e).replace(er,`%2F`)}function vr(e){if(e==null)return null;try{return decodeURIComponent(``+e)}catch{}return``+e}var yr=/\/$/,br=e=>e.replace(yr,``);function xr(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=kr(r??t,n),{fullPath:r+a+o,path:r,query:i,hash:vr(o)}}function Sr(e,t){let n=t.query?e(t.query):``;return t.path+(n&&`?`)+n+(t.hash||``)}function Cr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||`/`}function wr(e,t,n){let r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&Tr(t.matched[r],n.matched[i])&&Er(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Tr(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Er(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Dr(e[n],t[n]))return!1;return!0}function Dr(e,t){return K(e)?Or(e,t):K(t)?Or(t,e):e?.valueOf()===t?.valueOf()}function Or(e,t){return K(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function kr(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 q={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0},Ar=function(e){return e.pop=`pop`,e.push=`push`,e}({}),jr=function(e){return e.back=`back`,e.forward=`forward`,e.unknown=``,e}({});function Mr(e){if(!e)if(Kn){let t=document.querySelector(`base`);e=t&&t.getAttribute(`href`)||`/`,e=e.replace(/^\w+:\/\/[^\/]+/,``)}else e=`/`;return e[0]!==`/`&&e[0]!==`#`&&(e=`/`+e),br(e)}var Nr=/^[^#]+#/;function Pr(e,t){return e.replace(Nr,`#`)+t}function Fr(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 Ir=()=>({left:window.scrollX,top:window.scrollY});function Lr(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=Fr(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 Rr(e,t){return(history.state?history.state.position-t:-1)+e}var zr=new Map;function Br(e,t){zr.set(e,t)}function Vr(e){let t=zr.get(e);return zr.delete(e),t}function Hr(e){return typeof e==`string`||e&&typeof e==`object`}function Ur(e){return typeof e==`string`||typeof e==`symbol`}var J=function(e){return e[e.MATCHER_NOT_FOUND=1]=`MATCHER_NOT_FOUND`,e[e.NAVIGATION_GUARD_REDIRECT=2]=`NAVIGATION_GUARD_REDIRECT`,e[e.NAVIGATION_ABORTED=4]=`NAVIGATION_ABORTED`,e[e.NAVIGATION_CANCELLED=8]=`NAVIGATION_CANCELLED`,e[e.NAVIGATION_DUPLICATED=16]=`NAVIGATION_DUPLICATED`,e}({}),Wr=Symbol(``);J.MATCHER_NOT_FOUND,J.NAVIGATION_GUARD_REDIRECT,J.NAVIGATION_ABORTED,J.NAVIGATION_CANCELLED,J.NAVIGATION_DUPLICATED;function Gr(e,t){return G(Error(),{type:e,[Wr]:!0},t)}function Y(e,t){return e instanceof Error&&Wr in e&&(t==null||!!(e.type&t))}function Kr(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(rr,` `),i=r.indexOf(`=`),a=vr(i<0?r:r.slice(0,i)),o=i<0?null:vr(r.slice(i+1));if(a in t){let e=t[a];K(e)||(e=t[a]=[e]),e.push(o)}else t[a]=o}return t}function qr(e){let t=``;for(let n in e){let r=e[n];if(n=hr(n),r==null){r!==void 0&&(t+=(t.length?`&`:``)+n);continue}(K(r)?r.map(e=>e&&mr(e)):[r&&mr(r)]).forEach(e=>{e!==void 0&&(t+=(t.length?`&`:``)+n,e!=null&&(t+=`=`+e))})}return t}function Jr(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=K(r)?r.map(e=>e==null?null:``+e):r==null?r:``+r)}return t}var Yr=Symbol(``),Xr=Symbol(``),Zr=Symbol(``),Qr=Symbol(``),$r=Symbol(``);function ei(){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 X(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(Gr(J.NAVIGATION_ABORTED,{from:n,to:t})):e instanceof Error?c(e):Hr(e)?c(Gr(J.NAVIGATION_GUARD_REDIRECT,{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 ti(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(qn(s)){let c=(s.__vccOpts||s)[t];c&&a.push(X(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=Jn(a)?a.default:a;o.mods[e]=a,o.components[e]=s;let c=(s.__vccOpts||s)[t];return c&&X(c,n,r,o,e,i)()}))}}return a}function ni(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=>Tr(e,a))?r.push(a):n.push(a));let s=e.matched[o];s&&(t.matched.find(e=>Tr(e,s))||i.push(s))}return[n,r,i]}var ri=()=>location.protocol+`//`+location.host;function ii(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),Cr(n,``)}return Cr(n,e)+r+i}function ai(e,t,n,r){let i=[],a=[],o=null,s=({state:a})=>{let s=ii(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:Ar.pop,direction:u?u>0?jr.forward:jr.back:jr.unknown})})};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(G({},e.state,{scroll:Ir()}),``)}}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 oi(e,t,n,r=!1,i=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:i?Ir():null}}function si(e){let{history:t,location:n}=window,r={value:ii(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:ri()+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,G({},t.state,oi(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),r.value=e}function s(e,n){let o=G({},i.value,t.state,{forward:e,scroll:Ir()});a(o.current,o,!0),a(e,G({},oi(r.value,e,null),{position:o.position+1},n),!1),r.value=e}return{location:r,state:i,push:s,replace:o}}function ci(e){e=Mr(e);let t=si(e),n=ai(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}let i=G({location:``,base:e,go:r,createHref:Pr.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 li(e){return e=location.host?e||location.pathname+location.search:``,e.includes(`#`)||(e+=`#`),ci(e)}var ui=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.Group=2]=`Group`,e}({}),Z=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.ParamRegExp=2]=`ParamRegExp`,e[e.ParamRegExpEnd=3]=`ParamRegExpEnd`,e[e.EscapeNext=4]=`EscapeNext`,e}(Z||{}),di={type:ui.Static,value:``},fi=/[a-zA-Z0-9_]/;function pi(e){if(!e)return[[]];if(e===`/`)return[[di]];if(!e.startsWith(`/`))throw Error(`Invalid path "${e}"`);function t(e){throw Error(`ERR (${n})/"${l}": ${e}`)}let n=Z.Static,r=n,i=[],a;function o(){a&&i.push(a),a=[]}let s=0,c,l=``,u=``;function d(){l&&=(n===Z.Static?a.push({type:ui.Static,value:l}):n===Z.Param||n===Z.ParamRegExp||n===Z.ParamRegExpEnd?(a.length>1&&(c===`*`||c===`+`)&&t(`A repeatable param (${l}) must be alone in its segment. eg: '/:ids+.`),a.push({type:ui.Param,value:l,regexp:u,repeatable:c===`*`||c===`+`,optional:c===`*`||c===`?`})):t(`Invalid state to consume buffer`),``)}function f(){l+=c}for(;s<e.length;){if(c=e[s++],c===`\\`&&n!==Z.ParamRegExp){r=n,n=Z.EscapeNext;continue}switch(n){case Z.Static:c===`/`?(l&&d(),o()):c===`:`?(d(),n=Z.Param):f();break;case Z.EscapeNext:f(),n=r;break;case Z.Param:c===`(`?n=Z.ParamRegExp:fi.test(c)?f():(d(),n=Z.Static,c!==`*`&&c!==`?`&&c!==`+`&&s--);break;case Z.ParamRegExp:c===`)`?u[u.length-1]==`\\`?u=u.slice(0,-1)+c:n=Z.ParamRegExpEnd:u+=c;break;case Z.ParamRegExpEnd:d(),n=Z.Static,c!==`*`&&c!==`?`&&c!==`+`&&s--,u=``;break;default:t(`Unknown state`);break}}return n===Z.ParamRegExp&&t(`Unfinished custom RegExp for param "${l}"`),d(),o(),i}var mi=`[^/]+?`,hi={sensitive:!1,strict:!1,start:!0,end:!0},Q=function(e){return e[e._multiplier=10]=`_multiplier`,e[e.Root=90]=`Root`,e[e.Segment=40]=`Segment`,e[e.SubSegment=30]=`SubSegment`,e[e.Static=40]=`Static`,e[e.Dynamic=20]=`Dynamic`,e[e.BonusCustomRegExp=10]=`BonusCustomRegExp`,e[e.BonusWildcard=-50]=`BonusWildcard`,e[e.BonusRepeatable=-20]=`BonusRepeatable`,e[e.BonusOptional=-8]=`BonusOptional`,e[e.BonusStrict=.7000000000000001]=`BonusStrict`,e[e.BonusCaseSensitive=.25]=`BonusCaseSensitive`,e}(Q||{}),gi=/[.+*?^${}()[\]/\\]/g;function _i(e,t){let n=G({},hi,t),r=[],i=n.start?`^`:``,a=[];for(let t of e){let e=t.length?[]:[Q.Root];n.strict&&!t.length&&(i+=`/`);for(let r=0;r<t.length;r++){let o=t[r],s=Q.Segment+(n.sensitive?Q.BonusCaseSensitive:0);if(o.type===ui.Static)r||(i+=`/`),i+=o.value.replace(gi,`\\$&`),s+=Q.Static;else if(o.type===ui.Param){let{value:e,repeatable:n,optional:c,regexp:l}=o;a.push({name:e,repeatable:n,optional:c});let u=l||mi;if(u!==mi){s+=Q.BonusCustomRegExp;try{`${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+=Q.Dynamic,c&&(s+=Q.BonusOptional),n&&(s+=Q.BonusRepeatable),u===`.*`&&(s+=Q.BonusWildcard)}e.push(s)}r.push(e)}if(n.strict&&n.end){let e=r.length-1;r[e][r[e].length-1]+=Q.BonusStrict}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===ui.Static)n+=e.value;else if(e.type===ui.Param){let{value:a,repeatable:o,optional:s}=e,c=a in t?t[a]:``;if(K(c)&&!o)throw Error(`Provided param "${a}" is an array but it is not repeatable (* or + modifiers)`);let l=K(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 vi(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]===Q.Static+Q.Segment?-1:1:e.length>t.length?t.length===1&&t[0]===Q.Static+Q.Segment?1:-1:0}function yi(e,t){let n=0,r=e.score,i=t.score;for(;n<r.length&&n<i.length;){let e=vi(r[n],i[n]);if(e)return e;n++}if(Math.abs(i.length-r.length)===1){if(bi(r))return 1;if(bi(i))return-1}return i.length-r.length}function bi(e){let t=e[e.length-1];return e.length>0&&t[t.length-1]<0}var xi={strict:!1,end:!0,sensitive:!1};function Si(e,t,n){let r=G(_i(pi(e.path),n),{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function Ci(e,t){let n=[],r=new Map;t=Zn(xi,t);function i(e){return r.get(e)}function a(e,n,r){let i=!r,s=Ti(e);s.aliasOf=r&&r.record;let l=Zn(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(Ti(G({},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=Si(t,n,l),r?r.alias.push(d):(f||=d,f!==d&&f.alias.push(d),i&&e.name&&!Di(d)&&o(e.name)),ji(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)}:Xn}function o(e){if(Ur(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=ki(e,n);n.splice(t,0,e),e.record.name&&!Di(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 Gr(J.MATCHER_NOT_FOUND,{location:e});s=i.record.name,a=G(wi(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&wi(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);else{if(i=t.name?r.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw Gr(J.MATCHER_NOT_FOUND,{location:e,currentLocation:t});s=i.record.name,a=G({},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:Oi(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 wi(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Ti(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Ei(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 Ei(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 Di(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Oi(e){return e.reduce((e,t)=>G(e,t.meta),{})}function ki(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;yi(e,t[i])<0?r=i:n=i+1}let i=Ai(e);return i&&(r=t.lastIndexOf(i,r-1)),r}function Ai(e){let t=e;for(;t=t.parent;)if(ji(t)&&yi(e,t)===0)return t}function ji({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Mi(e){let t=u(Zr),n=u(Qr),r=y(()=>{let n=m(e.to);return t.resolve(n)}),i=y(()=>{let{matched:e}=r.value,{length:t}=e,i=e[t-1],a=n.matched;if(!i||!a.length)return-1;let o=a.findIndex(Tr.bind(null,i));if(o>-1)return o;let s=Li(e[t-2]);return t>1&&Li(i)===s&&a[a.length-1].path!==s?a.findIndex(Tr.bind(null,e[t-2])):o}),a=y(()=>i.value>-1&&Ii(n.params,r.value.params)),o=y(()=>i.value>-1&&i.value===n.matched.length-1&&Er(n.params,r.value.params));function s(n={}){if(Fi(n)){let n=t[m(e.replace)?`replace`:`push`](m(e.to)).catch(Xn);return e.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}return{route:r,href:y(()=>r.value.href),isActive:a,isExactActive:o,navigate:s}}function Ni(e){return e.length===1?e[0]:e}var Pi=S({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:Mi,setup(t,{slots:r}){let i=e(Mi(t)),{options:a}=u(Zr),o=y(()=>({[Ri(t.activeClass,a.linkActiveClass,`router-link-active`)]:i.isActive,[Ri(t.exactActiveClass,a.linkExactActiveClass,`router-link-exact-active`)]:i.isExactActive}));return()=>{let e=r.default&&Ni(r.default(i));return t.custom?e:n(`a`,{"aria-current":i.isExactActive?t.ariaCurrentValue:null,href:i.href,onClick:i.navigate,class:o.value},e)}}});function Fi(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 Ii(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(!K(i)||i.length!==r.length||r.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}function Li(e){return e?e.aliasOf?e.aliasOf.path:e.path:``}var Ri=(e,t,n)=>e??t??n,zi=S({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:r}){let i=u($r),a=y(()=>e.route||i.value),s=u(Xr,0),c=y(()=>{let e=m(s),{matched:t}=a.value,n;for(;(n=t[e])&&!n.components;)e++;return e}),l=y(()=>a.value.matched[c.value]);o(Xr,y(()=>c.value+1)),o(Yr,l),o($r,a);let f=_();return d(()=>[f.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||!Tr(t,i)||!r)&&(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:`post`}),()=>{let i=a.value,o=e.name,s=l.value,c=s&&s.components[o];if(!c)return Bi(r.default,{Component:c,route:i});let u=s.props[o],d=n(c,G({},u?u===!0?i.params:typeof u==`function`?u(i):u:null,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(s.instances[o]=null)},ref:f}));return Bi(r.default,{Component:d,route:i})||d}}});function Bi(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var Vi=zi;function Hi(e){let t=Ci(e.routes,e),n=e.parseQuery||Kr,i=e.stringifyQuery||qr,a=e.history,o=ei(),s=ei(),c=ei(),l=ee(q),u=q;Kn&&e.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let d=Yn.bind(null,e=>``+e),f=Yn.bind(null,_r),p=Yn.bind(null,vr);function h(e,n){let r,i;return Ur(e)?(r=t.getRecordMatcher(e),i=n):i=e,t.addRoute(i,r)}function g(e){let n=t.getRecordMatcher(e);n&&t.removeRoute(n)}function _(){return t.getRoutes().map(e=>e.record)}function v(e){return!!t.getRecordMatcher(e)}function y(e,r){if(r=G({},r||l.value),typeof e==`string`){let i=xr(n,e,r.path),o=t.resolve({path:i.path},r),s=a.createHref(i.fullPath);return G(i,o,{params:p(o.params),hash:vr(i.hash),redirectedFrom:void 0,href:s})}let o;if(e.path!=null)o=G({},e,{path:xr(n,e.path,r.path).path});else{let t=G({},e.params);for(let e in t)t[e]??delete t[e];o=G({},e,{params:f(t)}),r.params=f(r.params)}let s=t.resolve(o,r),c=e.hash||``;s.params=d(p(s.params));let u=Sr(i,G({},e,{hash:pr(c),path:s.path})),m=a.createHref(u);return G({fullPath:u,hash:c,query:i===qr?Jr(e.query):e.query||{}},s,{redirectedFrom:void 0,href:m})}function b(e){return typeof e==`string`?xr(n,e,l.value.path):G({},e)}function te(e,t){if(u!==e)return Gr(J.NAVIGATION_CANCELLED,{from:t,to:e})}function ne(e){return C(e)}function x(e){return ne(G(b(e),{replace:!0}))}function S(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=b(i):{path:i},i.params={}),G({query:e.query,hash:e.hash,params:i.path==null?e.params:{}},i)}}function C(e,t){let n=u=y(e),r=l.value,a=e.state,o=e.force,s=e.replace===!0,c=S(n,r);if(c)return C(G(b(c),{state:typeof c==`object`?G({},a,c.state):a,force:o,replace:s}),t||n);let d=n;d.redirectedFrom=t;let f;return!o&&wr(i,r,n)&&(f=Gr(J.NAVIGATION_DUPLICATED,{to:d,from:r}),ue(r,r,!0,!1)),(f?Promise.resolve(f):E(d,r)).catch(e=>Y(e)?Y(e,J.NAVIGATION_GUARD_REDIRECT)?e:A(e):k(e,d,r)).then(e=>{if(e){if(Y(e,J.NAVIGATION_GUARD_REDIRECT))return C(G({replace:s},b(e.to),{state:typeof e.to==`object`?G({},a,e.to.state):a,force:o}),t||d)}else e=ae(d,r,!0,s,a);return ie(d,r,e),e})}function w(e,t){let n=te(e,t);return n?Promise.reject(n):Promise.resolve()}function T(e){let t=N.values().next().value;return t&&typeof t.runWithContext==`function`?t.runWithContext(e):e()}function E(e,t){let n,[r,i,a]=ni(e,t);n=ti(r.reverse(),`beforeRouteLeave`,e,t);for(let i of r)i.leaveGuards.forEach(r=>{n.push(X(r,e,t))});let c=w.bind(null,e,t);return n.push(c),F(n).then(()=>{n=[];for(let r of o.list())n.push(X(r,e,t));return n.push(c),F(n)}).then(()=>{n=ti(i,`beforeRouteUpdate`,e,t);for(let r of i)r.updateGuards.forEach(r=>{n.push(X(r,e,t))});return n.push(c),F(n)}).then(()=>{n=[];for(let r of a)if(r.beforeEnter)if(K(r.beforeEnter))for(let i of r.beforeEnter)n.push(X(i,e,t));else n.push(X(r.beforeEnter,e,t));return n.push(c),F(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=ti(a,`beforeRouteEnter`,e,t,T),n.push(c),F(n))).then(()=>{n=[];for(let r of s.list())n.push(X(r,e,t));return n.push(c),F(n)}).catch(e=>Y(e,J.NAVIGATION_CANCELLED)?e:Promise.reject(e))}function ie(e,t,n){c.list().forEach(r=>T(()=>r(e,t,n)))}function ae(e,t,n,r,i){let o=te(e,t);if(o)return o;let s=t===q,c=Kn?history.state:{};n&&(r||s?a.replace(e.fullPath,G({scroll:s&&c&&c.scroll},i)):a.push(e.fullPath,i)),l.value=e,ue(e,t,n,s),A()}let D;function O(){D||=a.listen((e,t,n)=>{if(!P.listening)return;let r=y(e),i=S(r,P.currentRoute.value);if(i){C(G(i,{replace:!0,force:!0}),r).catch(Xn);return}u=r;let o=l.value;Kn&&Br(Rr(o.fullPath,n.delta),Ir()),E(r,o).catch(e=>Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_CANCELLED)?e:Y(e,J.NAVIGATION_GUARD_REDIRECT)?(C(G(b(e.to),{force:!0}),r).then(e=>{Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_DUPLICATED)&&!n.delta&&n.type===Ar.pop&&a.go(-1,!1)}).catch(Xn),Promise.reject()):(n.delta&&a.go(-n.delta,!1),k(e,r,o))).then(e=>{e||=ae(r,o,!1),e&&(n.delta&&!Y(e,J.NAVIGATION_CANCELLED)?a.go(-n.delta,!1):n.type===Ar.pop&&Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_DUPLICATED)&&a.go(-1,!1)),ie(r,o,e)}).catch(Xn)})}let oe=ei(),se=ei(),ce;function k(e,t,n){A(e);let r=se.list();return r.length?r.forEach(r=>r(e,t,n)):console.error(e),Promise.reject(e)}function le(){return ce&&l.value!==q?Promise.resolve():new Promise((e,t)=>{oe.add([e,t])})}function A(e){return ce||(ce=!e,O(),oe.list().forEach(([t,n])=>e?n(e):t()),oe.reset()),e}function ue(t,n,i,a){let{scrollBehavior:o}=e;if(!Kn||!o)return Promise.resolve();let s=!i&&Vr(Rr(t.fullPath,0))||(a||!i)&&history.state&&history.state.scroll||null;return r().then(()=>o(t,n,s)).then(e=>e&&Lr(e)).catch(e=>k(e,t,n))}let j=e=>a.go(e),M,N=new Set,P={currentRoute:l,listening:!0,addRoute:h,removeRoute:g,clearRoutes:t.clearRoutes,hasRoute:v,getRoutes:_,resolve:y,options:e,push:ne,replace:x,go:j,back:()=>j(-1),forward:()=>j(1),beforeEach:o.add,beforeResolve:s.add,afterEach:c.add,onError:se.add,isReady:le,install(e){e.component(`RouterLink`,Pi),e.component(`RouterView`,Vi),e.config.globalProperties.$router=P,Object.defineProperty(e.config.globalProperties,`$route`,{enumerable:!0,get:()=>m(l)}),Kn&&!M&&l.value===q&&(M=!0,ne(a.location).catch(e=>{}));let t={};for(let e in q)Object.defineProperty(t,e,{get:()=>l.value[e],enumerable:!0});e.provide(Zr,P),e.provide(Qr,re(t)),e.provide($r,l);let n=e.unmount;N.add(e),e.unmount=function(){N.delete(e),N.size<1&&(u=q,D&&D(),D=null,l.value=q,M=!1,ce=!1),n()}}};function F(e){return e.reduce((e,t)=>e.then(()=>T(t)),Promise.resolve())}return P}function Ui(){return u(Zr)}function Wi(e){return u(Qr)}var Gi=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Ki=function(e){return`/`+e},qi={},$=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}))))}r=o(t.map(t=>{if(t=Ki(t,n),t in qi)return;qi[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Gi,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.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)})},Ji=[{path:`/`,component:()=>$(()=>import(`./MainLayout-DrY2_qyP.js`),__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,26,27,28,29,30,31,32,33,34,35])),children:[{path:``,redirect:{name:`workspace`}},{path:`workspace/:id?`,name:`workspace`,component:()=>$(()=>import(`./WorkspacePage-CH3k_9_s.js`),__vite__mapDeps([36,1,2,3,4,8,7,9,11,37,17,14,15,13,19,18,20,21,22,16,23,38,25,39,27,28,29,30,40,34,41,42,33,43]))},{path:`create`,name:`create`,component:()=>$(()=>import(`./CreatePage-BmGIFI8W.js`),__vite__mapDeps([44,1,2,3,4,8,7,9,45,20,21,16,19,18,15,22,38,25,39,29,40,34,41,42,46]))},{path:`settings`,name:`settings`,component:()=>$(()=>import(`./SettingsPage-DH-KTis9.js`),__vite__mapDeps([47,1,2,3,4,6,7,8,9,10,37,17,14,15,13,18,45,20,21,16,19,22,23,38,25,26,29,30,31,28,42,48]))},{path:`search`,name:`search`,component:()=>$(()=>import(`./SearchPage-CMH0AoRw.js`),__vite__mapDeps([49,1,2,3,4,8,11,15,38,25,26,14,33,50]))},{path:`health`,name:`health`,component:()=>$(()=>import(`./HealthPage-DAA51STa.js`),__vite__mapDeps([51,3,4,11,9,20,23,38,25,29]))},{path:`changelog`,name:`changelog`,component:()=>$(()=>import(`./ChangelogPage-Dk8nKtM0.js`),__vite__mapDeps([52,1,3,5,9,4,18,38,25,53]))}]},{path:`/:catchAll(.*)*`,redirect:`/`}],Yi=Un(()=>Hi({scrollBehavior:()=>({left:0,top:0}),routes:Ji,history:li()}));async function Xi(e,t){let n=e(Vn);n.use(pt,t);let r=typeof Gn==`function`?await Gn({}):Gn;n.use(r);let i=f(typeof Yi==`function`?await Yi({store:r}):Yi);return r.use(({store:e})=>{e.router=i}),{app:n,store:r,router:i}}var Zi={radio:He,checkbox:Je,toggle:Ye},Qi=Object.keys(Zi);function $i(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>e[n]}var ea=O({name:`QOptionGroup`,props:{...A,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(L),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:`radio`,validator:e=>Qi.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(e,{emit:t,slots:r}){let{proxy:{$q:i}}=h(),a=Array.isArray(e.modelValue);e.type===`radio`?a===!0&&console.error(`q-option-group: model should not be array`):a===!1&&console.error(`q-option-group: model should be array in your case`);let o=le(e,i),s=y(()=>Zi[e.type]),c=y(()=>$i(e.optionValue,`value`)),l=y(()=>$i(e.optionLabel,`label`)),u=y(()=>$i(e.optionDisable,`disable`)),d=y(()=>e.options.map(t=>({val:c.value(t),name:t.name===void 0?e.name:t.name,disable:e.disable||u.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?o.value:t.dark,size:t.size===void 0?e.size:t.size,dense:e.dense,keepColor:t.keepColor===void 0?e.keepColor:t.keepColor}))),f=y(()=>`q-option-group q-gutter-x-sm`+(e.inline===!0?` q-option-group--inline`:``)),p=y(()=>{let t={role:`group`};return e.type===`radio`&&(t.role=`radiogroup`,e.disable===!0&&(t[`aria-disabled`]=`true`)),t});function m(e){t(`update:modelValue`,e)}return()=>n(`div`,{class:f.value,...p.value},e.options.map((t,i)=>{let a=r[`label-`+i]===void 0?r.label===void 0?void 0:()=>r.label(t):()=>r[`label-`+i](t);return n(`div`,[n(s.value,{label:a===void 0?l.value(t):null,modelValue:e.modelValue,"onUpdate:modelValue":m,...d.value[i]},a)])}))}}),ta=O({name:`DialogPluginComponent`,props:{...A,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}=h(),{$q:i}=r,a=le(e,i),o=_(null),s=_(e.prompt===void 0?e.options===void 0?void 0:e.options.model:e.prompt.model),c=y(()=>`q-dialog-plugin`+(a.value===!0?` q-dialog-plugin--dark q-dark`:``)+(e.progress===!1?``:` q-dialog-plugin--progress`)),l=y(()=>e.color||(a.value===!0?`amber`:`primary`)),u=y(()=>e.progress===!1?null:L(e.progress)===!0?{component:e.progress.spinner||k,props:{color:e.progress.color||l.value}}:{component:k,props:{color:l.value}}),f=y(()=>e.prompt!==void 0||e.options!==void 0),p=y(()=>{if(f.value!==!0)return{};let{model:t,isValid:n,items:r,...i}=e.prompt===void 0?e.options:e.prompt;return i}),m=y(()=>L(e.ok)===!0||e.ok===!0?i.lang.label.ok:e.ok),g=y(()=>L(e.cancel)===!0||e.cancel===!0?i.lang.label.cancel:e.cancel),v=y(()=>e.prompt===void 0?e.options===void 0?!1:e.options.isValid!==void 0&&e.options.isValid(s.value)!==!0:e.prompt.isValid!==void 0&&e.prompt.isValid(s.value)!==!0),ee=y(()=>({color:l.value,label:m.value,ripple:!1,disable:v.value,...L(e.ok)===!0?e.ok:{flat:!0},"data-autofocus":e.focus===`ok`&&f.value!==!0||void 0,onClick:x})),b=y(()=>({color:l.value,label:g.value,ripple:!1,...L(e.cancel)===!0?e.cancel:{flat:!0},"data-autofocus":e.focus===`cancel`&&f.value!==!0||void 0,onClick:S}));d(()=>e.prompt&&e.prompt.model,w),d(()=>e.options&&e.options.model,w);function te(){o.value.show()}function re(){o.value.hide()}function x(){t(`ok`,ne(s.value)),re()}function S(){re()}function C(){t(`hide`)}function w(e){s.value=e}function T(t){v.value!==!0&&e.prompt.type!==`textarea`&&ce(t,13)===!0&&x()}function E(t,r){return e.html===!0?n(B,{class:t,innerHTML:r}):n(B,{class:t},()=>r)}function ie(){return[n(qe,{color:l.value,dense:!0,autofocus:!0,dark:a.value,...p.value,modelValue:s.value,"onUpdate:modelValue":w,onKeyup:T})]}function ae(){return[n(ea,{color:l.value,options:e.options.items,dark:a.value,...p.value,modelValue:s.value,"onUpdate:modelValue":w})]}function D(){let t=[];return e.cancel&&t.push(n(We,b.value)),e.ok&&t.push(n(We,ee.value)),n(Be,{class:e.stackButtons===!0?`items-end`:``,vertical:e.stackButtons,align:`right`},()=>t)}function O(){let t=[];return e.title&&t.push(E(`q-dialog__title`,e.title)),e.progress!==!1&&t.push(n(B,{class:`q-dialog__progress`},()=>n(u.value.component,u.value.props))),e.message&&t.push(E(`q-dialog__message`,e.message)),e.prompt===void 0?e.options!==void 0&&t.push(n(me,{dark:a.value}),n(B,{class:`scroll q-dialog-plugin__form`},ae),n(me,{dark:a.value})):t.push(n(B,{class:`scroll q-dialog-plugin__form`},ie)),(e.ok||e.cancel)&&t.push(D()),t}function oe(){return[n(mt,{class:[c.value,e.cardClass],style:e.cardStyle,dark:a.value},O)]}return Object.assign(r,{show:te,hide:re}),()=>n(Ft,{ref:o,onHide:C},oe)}});function na(e,t){for(let n in t)n!==`spinner`&&Object(t[n])===t[n]?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},na(e[n],t[n])):e[n]=t[n]}function ra(e,t,i){return a=>{let o,s,c=t===!0&&a.component!==void 0;if(c===!0){let{component:e,componentProps:t}=a;o=typeof e==`string`?i.component(e):e,s=t||{}}else{let{class:t,style:n,...r}=a;o=e,s=r,t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n)}let l,u=!1,d=_(null),f=ve(!1,`dialog`),p=e=>{if(d.value?.[e]!==void 0){d.value[e]();return}let t=l.$.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`)},m=[],h=[],g={onOk(e){return m.push(e),g},onCancel(e){return h.push(e),g},onDismiss(e){return m.push(e),h.push(e),g},hide(){return p(`hide`),g},update(e){if(l!==null){if(c===!0)Object.assign(s,e);else{let{class:t,style:n,...r}=e;t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n),na(s,r)}l.$forceUpdate()}return g}},v=e=>{u=!0,m.forEach(t=>{t(e)})},y=()=>{ee.unmount(f),Ce(f),ee=null,l=null,u!==!0&&h.forEach(e=>{e()})},ee=ut({name:`QGlobalDialog`,setup:()=>()=>n(o,{...s,ref:d,onOk:v,onHide:y,onVnodeMounted(...e){typeof s.onVnodeMounted==`function`&&s.onVnodeMounted(...e),r(()=>p(`show`))}})},i);return l=ee.mount(f),g}}var ia={install({$q:e,parentApp:t}){e.dialog=this.create=ra(ta,!0,t)}},aa={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:sn,Dialog:ia}},oa=`/`;async function sa({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:oa})}catch(e){if(e&&e.url){o(e.url);return}console.error(`[Quasar] boot error:`,e);return}i!==!0&&(e.use(t),e.mount(`#q-app`))}Xi(w,aa).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-IlYZHxVd.js`),[])]).then(t=>{sa(e,n(t).filter(e=>typeof e==`function`))})});export{Ft as _,Hn as a,mt as b,H as c,bn as d,xn as f,Wt as g,_n as h,Ui as i,On as l,vn as m,$ as n,Bn as o,yn as p,Wi as r,kn as s,ea as t,wn as u,jt as v,B as x,ht as y};
|