@loicngr/kobo 1.7.17 → 1.7.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +1 -1
  3. package/src/client/dist/spa/assets/{ActivityFeed-CDhLuhI3.js → ActivityFeed-DHf6rSgl.js} +1 -1
  4. package/src/client/dist/spa/assets/{CreatePage-xIjxPliD.js → CreatePage-DL8LTcyD.js} +1 -1
  5. package/src/client/dist/spa/assets/{DiffViewer-CcgF65Mo.js → DiffViewer-CgzuQueb.js} +3 -3
  6. package/src/client/dist/spa/assets/{HealthPage-Bw-9__wY.js → HealthPage-Zsnyyv66.js} +1 -1
  7. package/src/client/dist/spa/assets/{MainLayout-C2ULeep-.js → MainLayout-OJcuFEwx.js} +2 -2
  8. package/src/client/dist/spa/assets/{QScrollArea-_Ji1cgqL.js → QScrollArea-DFNGAP1T.js} +1 -1
  9. package/src/client/dist/spa/assets/{SearchPage-D2x2X7K7.js → SearchPage-CpmeT5hL.js} +1 -1
  10. package/src/client/dist/spa/assets/{SettingsPage-BLb9B9iY.js → SettingsPage-CKz2kdw8.js} +1 -1
  11. package/src/client/dist/spa/assets/WorkspacePage-CcWa3--k.js +4 -0
  12. package/src/client/dist/spa/assets/WorkspacePage-DPj03Um2.css +1 -0
  13. package/src/client/dist/spa/assets/{cssMode-BsT_HBz-.js → cssMode-DKW40Eay.js} +1 -1
  14. package/src/client/dist/spa/assets/{editor.api-CIxiApSC.js → editor.api-cIZo-p3R.js} +1 -1
  15. package/src/client/dist/spa/assets/{editor.main-D-1-e3_n.js → editor.main-DxYwm0in.js} +3 -3
  16. package/src/client/dist/spa/assets/{engineFeatures-baMvMT98.js → engineFeatures-vEC-j3xd.js} +1 -1
  17. package/src/client/dist/spa/assets/{expand-template-CF0lBr4L.js → expand-template-Bmbq9pxX.js} +1 -1
  18. package/src/client/dist/spa/assets/{freemarker2-q2PyKiM2.js → freemarker2-DYe7YniO.js} +1 -1
  19. package/src/client/dist/spa/assets/{handlebars-DoaZIK6r.js → handlebars-CFHnjuEe.js} +1 -1
  20. package/src/client/dist/spa/assets/{html-DHcse-fd.js → html-D_DPVIcT.js} +1 -1
  21. package/src/client/dist/spa/assets/{htmlMode-DPZCU7DB.js → htmlMode-CULL5FkI.js} +1 -1
  22. package/src/client/dist/spa/assets/i18n-awaKh__J.js +1 -0
  23. package/src/client/dist/spa/assets/{index-DMUFfCIq.js → index-B2qdU9v-.js} +6 -6
  24. package/src/client/dist/spa/assets/{javascript-Ddw7c3eO.js → javascript-Cj-bhbPb.js} +1 -1
  25. package/src/client/dist/spa/assets/{jsonMode-vmAmvg_N.js → jsonMode-CJrCPpxd.js} +1 -1
  26. package/src/client/dist/spa/assets/{liquid-Bwz3vr4k.js → liquid-B4ttnSVX.js} +1 -1
  27. package/src/client/dist/spa/assets/{mdx-B2uBtVef.js → mdx-DT9HeWQS.js} +1 -1
  28. package/src/client/dist/spa/assets/{monaco.contribution-B3cRHiXp.js → monaco.contribution-Dc3R0xb9.js} +2 -2
  29. package/src/client/dist/spa/assets/{permissionModes-DuwIe4ty.js → permissionModes-BA0XHeew.js} +1 -1
  30. package/src/client/dist/spa/assets/{python-D5ykDuc8.js → python-DSdYwb75.js} +1 -1
  31. package/src/client/dist/spa/assets/{razor-CStvtec5.js → razor-C-5bSEPf.js} +1 -1
  32. package/src/client/dist/spa/assets/{render-chat-markdown-BywKNkXe.js → render-chat-markdown-cMOd2guW.js} +1 -1
  33. package/src/client/dist/spa/assets/{tsMode-WEgYYKFt.js → tsMode-Bck0IzqV.js} +1 -1
  34. package/src/client/dist/spa/assets/{typescript-BzFHuirT.js → typescript-Daj2xIGr.js} +1 -1
  35. package/src/client/dist/spa/assets/{use-onboarding-C98jCHZu.js → use-onboarding-Xp0y257M.js} +1 -1
  36. package/src/client/dist/spa/assets/{xml-NuCdCQMI.js → xml-DLN-RVL8.js} +1 -1
  37. package/src/client/dist/spa/assets/{yaml-CkTTgcUh.js → yaml-DnDRs7J6.js} +1 -1
  38. package/src/client/dist/spa/index.html +1 -1
  39. package/src/client/dist/spa/assets/WorkspacePage-BlAVs03z.js +0 -4
  40. package/src/client/dist/spa/assets/WorkspacePage-DTV0oWHS.css +0 -1
  41. package/src/client/dist/spa/assets/i18n-DwzfgKc3.js +0 -1
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MainLayout-C2ULeep-.js","assets/_plugin-vue_export-helper-Cj6tcsj6.js","assets/vue-i18n-Cq-KgjJC.js","assets/runtime-core.esm-bundler-D_RRiKBh.js","assets/QIcon-BmEX2rXO.js","assets/render-chat-markdown-BywKNkXe.js","assets/use-id-BCnfiBjU.js","assets/notifications-Hq-6rEYv.js","assets/QBtn-CoU-UC_j.js","assets/use-onboarding-C98jCHZu.js","assets/use-onboarding-B3l7mx48.css","assets/QBadge-NEwszYs7.js","assets/build-path-tree-CyqReJkk.js","assets/QCheckbox-Cq2STfHp.js","assets/use-checkbox-DnSuDqo2.js","assets/QInput-D0t39uK_.js","assets/QTooltip-BC7PnZJ1.js","assets/QRadio-M9mC5jZy.js","assets/QChip-DnJyQVs2.js","assets/QItemSection-DRg-QuAD.js","assets/QList-B3TuWSqL.js","assets/QMenu-NVDU7D3u.js","assets/QSpace-DONPiIes.js","assets/QToggle-DBzTAIbK.js","assets/engineFeatures-baMvMT98.js","assets/touch-2Qa-HSDZ.js","assets/use-quasar-k24tGxE-.js","assets/ClosePopup-A-tSm4aa.js","assets/TouchPan-D0fJnlOC.js","assets/documents-B3nitIYF.js","assets/formatters-9dcj2tyJ.js","assets/kobo-commands-B2AhWe1S.js","assets/MainLayout-KEr19FOv.css","assets/WorkspacePage-BlAVs03z.js","assets/QBanner-Jsq4uJZs.js","assets/permissionModes-DuwIe4ty.js","assets/QItemLabel-Btqw0P7M.js","assets/QPage-DO_bQyV_.js","assets/QSpinnerDots-DspFKwCZ.js","assets/expand-template-CF0lBr4L.js","assets/expand-template-D2yUa54D.css","assets/WorkspacePage-DTV0oWHS.css","assets/CreatePage-xIjxPliD.js","assets/QExpansionItem-CgJQdznK.js","assets/CreatePage-DgHjL4cZ.css","assets/SettingsPage-BLb9B9iY.js","assets/SettingsPage-BTGPZaqC.css","assets/SearchPage-D2x2X7K7.js","assets/SearchPage-cVwt0DaQ.css","assets/HealthPage-Bw-9__wY.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MainLayout-OJcuFEwx.js","assets/_plugin-vue_export-helper-Cj6tcsj6.js","assets/vue-i18n-Cq-KgjJC.js","assets/runtime-core.esm-bundler-D_RRiKBh.js","assets/QIcon-BmEX2rXO.js","assets/render-chat-markdown-cMOd2guW.js","assets/use-id-BCnfiBjU.js","assets/notifications-Hq-6rEYv.js","assets/QBtn-CoU-UC_j.js","assets/use-onboarding-Xp0y257M.js","assets/use-onboarding-B3l7mx48.css","assets/QBadge-NEwszYs7.js","assets/build-path-tree-CyqReJkk.js","assets/QCheckbox-Cq2STfHp.js","assets/use-checkbox-DnSuDqo2.js","assets/QInput-D0t39uK_.js","assets/QTooltip-BC7PnZJ1.js","assets/QRadio-M9mC5jZy.js","assets/QChip-DnJyQVs2.js","assets/QItemSection-DRg-QuAD.js","assets/QList-B3TuWSqL.js","assets/QMenu-NVDU7D3u.js","assets/QSpace-DONPiIes.js","assets/QToggle-DBzTAIbK.js","assets/engineFeatures-vEC-j3xd.js","assets/touch-2Qa-HSDZ.js","assets/use-quasar-k24tGxE-.js","assets/ClosePopup-A-tSm4aa.js","assets/TouchPan-D0fJnlOC.js","assets/documents-B3nitIYF.js","assets/formatters-9dcj2tyJ.js","assets/kobo-commands-B2AhWe1S.js","assets/MainLayout-KEr19FOv.css","assets/WorkspacePage-CcWa3--k.js","assets/QBanner-Jsq4uJZs.js","assets/permissionModes-BA0XHeew.js","assets/QItemLabel-Btqw0P7M.js","assets/QPage-DO_bQyV_.js","assets/QSpinnerDots-DspFKwCZ.js","assets/expand-template-Bmbq9pxX.js","assets/expand-template-D2yUa54D.css","assets/WorkspacePage-DPj03Um2.css","assets/CreatePage-DL8LTcyD.js","assets/QExpansionItem-CgJQdznK.js","assets/CreatePage-DgHjL4cZ.css","assets/SettingsPage-CKz2kdw8.js","assets/SettingsPage-BTGPZaqC.css","assets/SearchPage-CpmeT5hL.js","assets/SearchPage-cVwt0DaQ.css","assets/HealthPage-Zsnyyv66.js"])))=>i.map(i=>d[i]);
2
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-Hq-6rEYv.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`&&lt.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`,"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.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.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.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/ 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.validationNotionUrl":`Bitte eine gültige Notion-URL einfügen (https://www.notion.so/...).`,"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.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
@@ -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.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.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-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.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.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.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.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`,"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.runSetup":`Setup-Skript ausführen`,"contextMenu.exportEvents":`Events exportieren (CSV)`,"contextMenu.exportingEvents":`Export wird vorbereitet…`,"contextMenu.exportEventsError":`Event-Export fehlgeschlagen`,"contextMenu.openNotion":`In Notion öffnen`,"contextMenu.openSentry":`In Sentry öffnen`,"contextMenu.openPr":`PR öffnen`,"workspace.favorite":`Als Favorit markieren`,"workspace.unfavorite":`Aus Favoriten entfernen`,"workspace.showFavoritesOnly":`Nur Favoriten anzeigen`,"workspace.searchArchivedToggle":`Auch in archivierten Workspaces suchen`,"workspace.descriptionPlaceholder":`Kurze Beschreibung hinzufügen`,"workspace.descriptionDialogHint":`Klartext, max. 200 Zeichen. Leer lassen, um zu löschen.`,"workspace.descriptionTooLong":`Die Beschreibung darf höchstens 200 Zeichen lang sein.`,"workspace.descriptionSaveFailed":`Beschreibung konnte nicht gespeichert werden.`,"workspace.agentDescriptionTooltip":`Live-Status, gepflegt vom Agent`,"mcp.tool.setWorkspaceDescription":`Setzt die Kurzbeschreibung des Workspace (≤ 200 Zeichen).`,"tags.manage":`Tags verwalten`,"tags.manageTitle":`Workspace-Tags verwalten`,"tags.noTagsDefined":`Keine Tags definiert. Füge welche in Einstellungen > Global > Tags hinzu.`,"tags.orphanedHint":`{count} Tag(s) sind nicht mehr im globalen Katalog. Abwählen zum Entfernen.`,"settings.tagsTitle":`Workspace-Tags`,"settings.tagsHint":`Definiere die Tags, die Workspaces zugewiesen werden können. Tippe zum Hinzufügen, klicke auf das Kreuz zum Entfernen.`,"settings.tagsLabel":`Verfügbare Tags`,"settings.branchPrefixesTitle":`Branch-Präfixe`,"settings.branchPrefixesHint":`Verwalten Sie die Git-Branch-Präfixe, die auf der Workspace-Erstellungsseite verfügbar sind. Das erste ist standardmäßig vorausgewählt.`,"settings.branchPrefixesEmpty":`Kein Branch-Präfix definiert. Fügen Sie unten mindestens eines hinzu.`,"settings.branchPrefixesAddLabel":`Neues Präfix`,"settings.branchPrefixesEditHint":`Zum Umbenennen klicken`,"settings.branchPrefixesMoveUp":`Nach oben`,"settings.branchPrefixesMoveDown":`Nach unten`,"settings.worktreesTitle":`Git-Worktrees`,"settings.worktreesHint":`Wähle aus, wo neue Workspace-Worktrees erstellt werden. Relative Pfade sind projektrelativ; absolute Linux/macOS- und Windows-Pfade, $HOME, ~ und %USERPROFILE% werden unterstützt.`,"settings.worktreesPathLabel":`Worktrees-Pfad`,"settings.worktreesPathRequired":`Worktrees-Pfad ist erforderlich.`,"settings.worktreesPrefixByProject":`Worktrees nach Projektname präfixen`,"settings.worktreesPrefixByProjectHint":`Legt jeden Worktree in einem nach dem Projekt benannten Unterordner ab, um Kollisionen zu vermeiden, wenn mehrere Projekte die gleiche Worktree-Wurzel teilen.`,"settings.shareTitle":`Konfiguration teilen`,"settings.shareHint":`Exportiere Einstellungen, Templates und Tags als JSON-Bundle. MCP-Keys werden aus Sicherheitsgründen nicht exportiert.`,"settings.exportConfig":`Exportieren`,"settings.importConfig":`Importieren`,"settings.exportSuccess":`Konfiguration exportiert`,"settings.importSuccess":`Konfiguration importiert`,"settings.importConfirmTitle":`Konfiguration importieren`,"settings.importConfirmMessage":`Dies ersetzt deine aktuellen Einstellungen, Templates und Tags. MCP-Keys bleiben erhalten. Fortfahren?`,"health.title":`Status`,"health.tooltip":`Systemstatus`,"health.envTitle":`Umgebung`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Datenbank`,"health.dbPath":`Pfad`,"health.dbSize":`Größe`,"health.schemaVersion":`Schema-Version`,"health.settingsSchemaVersion":`Einstellungs-Schema`,"health.runtimesTitle":`Agent-Laufzeiten`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude nicht im PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`codex-Binärdatei nicht auflösbar`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} gesamt, {archived} archiviert`,"health.worktreesMissing":`{count} Worktree(s) auf der Festplatte fehlen`,"health.sessionsTitle":`Agent-Sitzungen`,"health.sessionsOrphaned":`{n} verwaiste laufende Sitzung(en)`,"health.integrationsTitle":`Integrationen`,"health.integrationConfigured":`konfiguriert`,"health.integrationMissing":`nicht konfiguriert`,"health.activeTitle":`Aktiver Zustand`,"health.activeQuotaBackoffs":`Ausstehende Quota-Backoffs`,"health.activeWakeups":`Geplante Aufweckungen`,"health.activeAutoLoop":`Auto-Loop läuft`,"health.activeAgentSessions":`Aktive Agent-Sessions`,"health.activeDevServers":`Laufende Dev-Server`,"health.noneActive":`Keine.`,"health.quotaResumeAt":`fortgesetzt um {time}`,"health.wakeupAt":`aufgeweckt um {time}`,"health.startedAgo":`gestartet vor {time}`,"health.autoLoopReady":`bereit, iteriert`,"health.autoLoopGrooming":`Grooming läuft`,"session.started":`Sitzung gestartet`,"session.ended":`Sitzung beendet`,"session.compacted":`Kontext komprimiert`,"tool.running":`Läuft...`,"activity.raw_lines":`Rohausgabezeilen ({n})`,"activity.loading_older":`Ältere Nachrichten werden geladen…`,"activity.prev_user_message":`Vorherige Nachricht des Benutzers`,"activity.scroll_to_bottom":`Nach unten scrollen`,"chat.systemPrompt":`System-Prompt`,"chat.agent":`Agent`,"chat.cleanupScript":`Cleanup-Skript`,"chat.archiveScript":`Archiv-Skript`,"chat.setupScript":`Setup-Skript`,"chat.scriptDone":`Fertig`,"chat.you":`Du`,"chat.session":`Sitzung`,"chat.nActions":`{n} Aktion | {n} Aktionen`,"chat.lastUpdatedAt":`Zuletzt aktualisiert um {time}`,"chat.scrollToTurnTop":`Zum Nachrichtenanfang scrollen`,"migration.backing_up":`Datenbank wird gesichert…`,"migration.running":`Agent-Daten werden migriert — {processed}/{total}`,"migration.error":`Migration fehlgeschlagen`,"migration.backup_location":`Ein Backup wurde unter {path} gespeichert. Starte Kōbō neu, um erneut zu versuchen.`,"migration.retry":`Starte Kōbō neu, um erneut zu versuchen.`,"engine.select":`Engine`,"engine.model":`Modell`,"engine.effort":`Reasoning-Aufwand`,"wakeup.scheduledIn":`Nächste Weckung in {n}s`,"wakeup.scheduledAt":`Nächste Weckung um {time}`,"wakeup.firing":`Wecke auf...`,"wakeup.reason":`Grund: {reason}`,"wakeup.cancel":`Diese Weckung abbrechen`,"wakeup.pendingIndicator":`Weckung geplant`,"cron.pendingIndicator":`{n} Cron(s) geplant`,"schedule.tabLabel":`Zeitplan`,"schedule.wakeupTitle":`Wakeup ausstehend`,"schedule.cronsTitle":`Wiederkehrende Zeitpläne`,"schedule.noWakeup":`Kein Wakeup geplant`,"schedule.noCrons":`Kein Cron geplant`,"schedule.nextFireAt":`nächstes um {time}`,"schedule.lastFiredAt":`zuletzt vor {time}`,"askUserQuestion.title":`Der Agent stellt eine Frage`,"askUserQuestion.submit":`Antwort senden`,"askUserQuestion.multiSelectHint":`Eine oder mehrere Optionen auswählen`,"askUserQuestion.otherOption":`Sonstiges`,"askUserQuestion.otherOptionHint":`bitte in der nächsten Chat-Nachricht angeben`,"askUserQuestion.noPending":`Keine offene Frage`,"askUserQuestion.next":`Weiter`,"askUserQuestion.previous":`Zurück`,"askUserQuestion.cancel":`Abbrechen`,"askUserQuestion.cancelTooltip":`Diese Frage überspringen — der Agent macht ohne Antwort weiter`,"permissionRequest.title":`Der Agent möchte ein Tool verwenden`,"permissionRequest.allow":`Erlauben`,"permissionRequest.deny":`Ablehnen`,"permissionRequest.tool":`Tool`,"permissionRequest.input":`Eingabe`,"permissionRequest.denied":`vom Nutzer abgelehnt`,"workspaceStatus.awaitingUser":`wartet auf deine Antwort`,"workspaceList.prOpen":`#{n} — Pull Request offen`,"workspaceList.prChangesRequested":`#{n} — Änderungen angefordert`,"workspaceList.attentionCiFailed":`CI fehlgeschlagen`,"workspaceList.attentionChangesRequested":`Änderungen angefordert`,"autoLoop.toggle":`Auto-Schleife`,"autoLoop.start":`Auto-Schleife starten`,"autoLoop.prepare":`Auto-Schleife vorbereiten`,"autoLoop.reprepare":`Auto-Schleife erneut vorbereiten`,"autoLoop.reprepareTooltip":`Grooming-Schritt erneut ausführen, um Aufgaben hinzuzufügen oder zu aktualisieren, bevor die Schleife neu gestartet wird`,"autoLoop.prepareBusy":`Warte, bis der Agent fertig ist, bevor du vorbereitest`,"autoLoop.forceReady":`Ich weiß, was ich tue — Grooming überspringen`,"autoLoop.forceReadyConfirm":`Grooming überspringen und Auto-Schleife als bereit markieren? Kann hängen bleiben, wenn Aufgaben nicht atomar sind.`,"autoLoop.stop":`Auto-Schleife stoppen`,"autoLoop.notReady":`Zuerst „Auto-Schleife vorbereiten" ausführen`,"autoLoop.noTasks":`Zuerst Aufgaben hinzufügen`,"autoLoop.progress":`Auto-Schleife · {done}/{total} Aufgaben`,"autoLoop.preparing":`Auto-Schleife · Vorbereitung`,"autoLoop.preparingTooltip":`Grooming läuft — der Agent erstellt / überprüft Aufgaben. Die Schleife startet, sobald mark_auto_loop_ready aufgerufen wird.`,"autoLoop.running":`Auto-Schleife läuft`,"autoLoop.startInMode":`Im Auto-Schleifen-Modus starten`,"koboCommand.prepAutoloopDesc":`Aufgaben für Auto-Schleifen-Modus vorbereiten (auf Atomarität prüfen)`,"staleSessionBanner.title":`Auto-Schleife läuft`,"staleSessionBanner.message":`Du siehst eine ältere Sitzung — der Agent arbeitet gerade in der neuesten.`,"staleSessionBanner.switchToCurrent":`Zur aktuellen wechseln`},ln={"common.save":`Save`,"common.cancel":`Cancel`,"common.delete":`Delete`,"common.close":`Close`,"whatsNew.title":`What's new`,"common.loading":`Loading...`,"common.search":`Search...`,"common.refresh":`Refresh`,"common.copy":`Copy`,"common.copied":`Copied to clipboard`,"common.copyFailed":`Copy failed`,"common.add":`Add`,"folderPicker.title":`Choose a folder`,"folderPicker.parent":`Parent folder`,"folderPicker.empty":`No subfolders`,"folderPicker.select":`Select this folder`,"common.start":`Start`,"common.stop":`Stop`,"common.archive":`Archive`,"common.unarchive":`Unarchive`,"common.selectWorkspace":`Select a workspace`,"common.noResults":`No results for "{query}"`,"common.send":`send`,"common.newLine":`new line`,"common.history":`history`,"common.justNow":`just now`,"common.minutesAgo":`{count}m ago`,"common.hoursAgo":`{count}h ago`,"common.daysAgo":`{count}d ago`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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 picks the optimal model`,"model.opus47ClassicDescription":`Latest Opus, most capable`,"model.opus471mDescription":`Latest Opus, 1M context`,"model.opusClassicDescription":`Most powerful`,"model.opus1mDescription":`Most powerful, 1M context`,"model.sonnetClassicDescription":`Balanced`,"model.sonnet1mDescription":`Balanced, 1M context`,"model.haikuDescription":`Fastest`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recommended for complex coding (requires ChatGPT auth)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Default fallback — strong reasoning, works with API key auth`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Fast and efficient — best for responsive tasks and subagents`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Coding-specialized model for complex software engineering`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Let the engine pick the default`,"reasoning.minimalDescription":`Fastest, shallowest reasoning`,"reasoning.lowDescription":`Faster, less depth`,"reasoning.mediumDescription":`Balanced`,"reasoning.highDescription":`More depth`,"reasoning.xhighDescription":`Extended depth, long-horizon tasks`,"reasoning.maxDescription":`Maximum depth`,"agentPermissionMode.label":`Permission mode`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Accept edits`,"agentPermissionMode.interactive":`Interactive`,"agentPermissionMode.tooltip":`How the agent handles tool permissions. Plan: read-only, no writes. Bypass: skip every prompt. Strict: auto-accept file edits, respect allow/deny lists for the rest. Interactive: ask the user before each tool via the permission panel.`,"agentPermissionMode.autoLoopOverride":`Auto-loop forces a non-plan mode — Plan blocks the MCP tools and edits the loop relies on. Pick Bypass, Strict, or Interactive instead.`,"agentPermissionMode.autoLoopLocked":`Locked to Bypass while auto-loop is on — any other mode would stall the loop on permission prompts. AskUserQuestion still works.`,"workspaceList.title":`Workspaces`,"workspaceList.needsAttention":`Needs Attention`,"workspaceList.running":`Running`,"workspaceList.idle":`Idle`,"workspaceList.archived":`Archived`,"workspaceList.noWorkspaces":`No workspaces yet`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} running`,"workspaceList.deleteDialog.title":`Delete workspace?`,"workspaceList.deleteDialog.deleteLocal":`Delete local branch`,"workspaceList.deleteDialog.deleteRemote":`Delete remote branch`,"workspaceList.deleteDialog.warning":`Warning: this action is irreversible on the remote.`,"workspaceList.deleteArchivedDialog.tooltip":`Delete all archived workspaces`,"workspaceList.deleteArchivedDialog.title":`Delete all archived workspaces?`,"workspaceList.deleteArchivedDialog.message":`This will permanently delete the {count} archived workspaces. This action cannot be undone.`,"workspacePage.selectWorkspace":`Select a workspace to begin`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ New session`,"workspacePage.renameSession":`Rename`,"workspacePage.renameSessionTitle":`Rename session`,"workspacePage.sessionNameLabel":`Session name`,"workspacePage.sessionEndedNotice":`This session has ended. Create a new session to continue.`,"workspacePage.renameFailed":`Rename failed`,"workspacePage.createSessionFailed":`Failed to create session`,"workspacePage.startFailed":`Start failed`,"workspacePage.stopFailed":`Stop failed`,"workspacePage.interrupt":`Interrupt`,"workspacePage.interrupted":`Agent interrupted — waiting for your next message`,"workspacePage.interruptFailed":`Interrupt failed`,"workspacePage.interruptTooltip":`Soft interrupt (like Escape) — stops the current tool but keeps the session alive`,"workspacePage.pendingNextRun":`Applied on next start`,"search.title":`Search`,"search.tooltip":`Search across agent history`,"search.placeholder":`Search across all agent messages…`,"search.includeArchived":`Include archived workspaces`,"search.loading":`Searching…`,"search.noResults":`No matches`,"search.error":`Search failed: {message}`,"search.resultCount":`{n} result(s)`,"search.eventType.userMessage":`You`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`No activity yet`,"activityFeed.emptyHint":`Start a workspace to see agent output here`,"activityFeed.initialPrompt":`Initial Prompt`,"activityFeed.you":`You`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Go to previous message`,"activityFeed.scrollToBottom":`Scroll to bottom`,"activityFeed.sendAnswers":`Send answers`,"agentBusy.banner":`Agent is busy`,"agentBusy.subagentsRunning":`1 sub-agent running | {n} sub-agents running`,"agentBusy.viewSubagents":`View sub-agents`,"agentBusy.pendingMessage":`Waiting — agent is busy`,"terminal.title":`Terminal`,"terminal.open":`Open terminal`,"terminal.close":`Close terminal`,"terminal.noWorkspace":`Select a workspace`,"terminal.noWorktree":`Worktree not created yet`,"terminal.error":`Terminal error`,"terminal.exited":`Terminal exited`,"chatInput.placeholder":`Message... (/ for skills)`,"chatInput.fileSearchHint":`search a file`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Attach image`,"chatInput.queueBanner":`Message queued — will be sent when the agent finishes`,"chatInput.cancelQueue":`Cancel Queue`,"chatInput.autoLoopBanner":`Auto-loop is running — stop it to send a message`,"chatInput.awaitingUserBanner":`The agent is waiting for your answer above — reply via the question panel`,"chatInput.autoLoopStop":`Stop`,"koboCommand.checkProgressDesc":`Verify progress on tasks and acceptance criteria`,"chatInput.uploading":`Uploading...`,"voice.title":`Voice transcription`,"voice.enabled":`Enable local voice transcription`,"voice.pttKey":`Push-to-talk key`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Space`,"voice.language":`Language (auto or code)`,"voice.model":`Active model`,"voice.commandPath":`Whisper binary path (optional)`,"voice.ffmpegPath":`ffmpeg binary path (optional)`,"voice.temperature":`Temperature`,"voice.temperatureHint":`Lower is more deterministic; higher can be more flexible but less stable.`,"voice.initialPrompt":`Initial prompt (optional)`,"voice.initialPromptHint":`Optional context to help Whisper with names, jargon, or domain vocabulary.`,"voice.translateToEnglish":`Translate to English`,"voice.translateToEnglishHint":`When enabled, non-English speech is translated to English instead of transcribed as-is.`,"voice.suppressNst":`Suppress non-speech tokens`,"voice.suppressNstHint":`Attempts to reduce non-speech artifacts in the transcript.`,"voice.installLink":`Install whisper.cpp`,"voice.installGuideTitle":`Installation guide`,"voice.installGuideIntro":`Install whisper.cpp and ffmpeg, then set the binary paths below if needed.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`After CMake build, the Whisper binary is usually at: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Then set "Whisper binary path" and "ffmpeg binary path" in this section (or leave empty if they are in PATH).`,"voice.noneModel":`No active model`,"voice.notInstalled":`not installed`,"voice.download":`Download`,"voice.delete":`Delete`,"voice.holdToTalk":`Hold to talk`,"voice.recording":`Recording...`,"voice.transcribing":`Transcribing...`,"voice.notSupported":`Voice recording is not supported in this browser`,"voice.errorMicPermission":`Microphone permission denied`,"voice.errorTranscription":`Voice transcription failed`,"voice.downloadFailed":`Model download failed`,"voice.deleteFailed":`Model deletion failed`,"voice.errorDisabled":`Voice transcription is disabled in settings`,"voice.errorModelMissing":`No active voice model is configured`,"voice.errorModelNotInstalled":`The active voice model is not installed`,"voice.errorAudioInvalid":`Audio capture is invalid or empty`,"voice.errorLanguageInvalid":`Voice language configuration is invalid`,"voice.errorRuntimeMissing":`Whisper runtime is not installed or not in PATH`,"voice.maxDurationReached":`Maximum recording duration reached`,"voice.runtimeReady":`Runtime ready: {command}`,"voice.runtimeMissing":`Runtime missing: {command}`,"voice.ffmpegReady":`ffmpeg ready`,"voice.ffmpegMissing":`ffmpeg missing`,"voice.sectionRuntime":`Runtime status`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Whisper models`,"voice.sectionAdvanced":`Advanced options`,"voice.sectionBehavior":`Transcription behavior`,"voice.sectionBinaries":`Binary paths`,"voice.downloadModels":`Download a model`,"voice.cancelFailed":`Failed to cancel the download`,"createPage.title":`What would you like to work on?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion enabled`,"createPage.importNotion":`Import from Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`URL must start with https://www.notion.so/`,"createPage.notionAutoExtract":`Subtasks and acceptance criteria will be extracted automatically.`,"createPage.notionPanelChoiceLabel":`This URL points to a sub-page (?p=). Which one do you want to work on?`,"createPage.notionPanelOption":`Sub-page (panel)`,"createPage.notionPanelOptionDesc":`The page you were viewing — recommended`,"createPage.notionParentOption":`Parent page`,"createPage.notionParentOptionDesc":`The epic / database it belongs to`,"createPage.importSentry":`Import Sentry`,"createPage.sentryEnabled":`Sentry enabled`,"createPage.sentryPlaceholder":`https://your-org.sentry.io/issues/123456`,"createPage.sentryValidation":`URL must point to a Sentry issue (/issues/<id>)`,"createPage.sentryAutoExtract":`Sentry issue will be imported automatically`,"createPage.sentryExtractHint":`Kobo will extract the issue and write it to .ai/thoughts/`,"createPage.workspaceName":`Workspace name (defaults to Notion page title)`,"createPage.workspaceNamePlaceholder":`Workspace name...`,"createPage.instructions":`Additional instructions (optional)...`,"createPage.instructionsPlaceholder":`Describe the task...`,"createPage.manualHint":`No Notion ticket? Add your tasks and acceptance criteria manually — they'll be sent to the Claude agent as context.`,"createPage.tasks":`Tasks ({count})`,"createPage.addTask":`Add a task...`,"createPage.acceptanceCriteria":`Acceptance Criteria ({count})`,"createPage.addCriterion":`Add a criterion...`,"createPage.projectPath":`Enter the project path`,"createPage.branchType":`Branch type`,"createPage.branch":`Branch`,"createPage.noBranches":`No branches found`,"createPage.enterPath":`Enter a project path`,"createPage.create":`Create`,"createPage.skipSetupScript":`Skip setup script`,"createPage.attachWorktreeToggle":`Attach existing worktree`,"createPage.attachWorktreeEnabled":`Reusing existing worktree`,"createPage.worktreePickerLabel":`Existing worktree`,"createPage.noOrphanWorktrees":`No orphan worktrees in this project`,"createPage.pickWorktreeRequired":`Please pick a worktree to attach`,"createPage.notionExtractHint":`Subtasks and acceptance criteria will be extracted from the Notion page.`,"createPage.notionImportHint":`Click "Import from Notion" to automatically extract subtasks from a ticket.`,"createPage.errorCreating":`Error creating workspace.`,"createPage.validationNotionUrl":`Please paste a valid Notion URL (https://www.notion.so/...).`,"createPage.validationDescription":`Please describe the task.`,"createPage.validationName":`Please provide a workspace name.`,"createPage.validationPath":`Please enter the project path.`,"createPage.validationBranch":`Please select a branch.`,"settings.title":`Settings`,"settings.language":`Language`,"settings.projectColor":`Color`,"settings.projectColorClear":`Clear`,"settings.projectColorDefault":`Default (grey)`,"settings.workspaceListSection":`Workspace list`,"settings.flattenWorkspaceList":`Flatten workspace list`,"settings.flattenWorkspaceListHint":`Show all workspaces in a single flat list with a project badge, instead of grouping by project.`,"settings.skillSuite.section":`Skill suite`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Custom`,"settings.skillSuite.superpowersHint":`Opinionated TDD / brainstorm / plan workflow (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Garry Tan's stack — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Both suites stack — superpowers for process discipline (brainstorm / TDD / plans / principles-level review), gstack for concrete workflows (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.customHint":`Edit the four prompts below yourself. Starts from the agnostic baseline.`,"settings.skillSuite.reloadDefaults":`Reload defaults`,"settings.skillSuite.reloadDefaultsConfirm":`Replace the four custom prompts with the agnostic defaults?`,"settings.skillSuite.customPrompts":`Custom prompts`,"settings.skillSuite.reviewTemplate":`Review template`,"settings.skillSuite.autoLoopReviewGate":`Auto-loop review gate`,"settings.skillSuite.autoLoopGroomingIntro":`Auto-loop grooming intro`,"settings.skillSuite.qaTemplate":`QA template`,"settings.skillSuite.brainstormingInstruction":`Brainstorming-phase instruction`,"settings.global":`Global`,"settings.projects":`Projects`,"settings.globalSettings":`Global Settings`,"settings.defaultModel":`Default model`,"settings.defaultModelClaude":`Default model (Claude Code)`,"settings.defaultModelCodex":`Default model (OpenAI Codex)`,"settings.agentPermissions":`Agent permissions`,"settings.skipPermissions":`Skip permission prompts (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Warning: disabling this will cause all tool permissions (Write, Edit, Bash...) to be auto-denied in headless mode. The agent will only be able to read.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Browser notifications when agent finishes`,"settings.audioNotifications":`Sound notification when agent finishes`,"settings.notificationSound":`Notification sound`,"settings.notificationSoundPreview":`Preview`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Work done`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`It's gonna blow`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.defaultPermissionMode":`Default permission mode`,"settings.defaultPermissionModeClaude":`Default permission mode (Claude Code)`,"settings.defaultPermissionModeCodex":`Default permission mode (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode applied when creating a new workspace. Plan = read-only first, Bypass = skip prompts, Strict = auto-accept edits with allow-list, Interactive = ask before each tool.`,"settings.activityFeed":`Activity feed`,"settings.verboseMessages":`Show verbose system messages (task_progress, task_started)`,"settings.availableVariables":`Available template variables`,"settings.prPromptTemplate":`PR prompt template`,"settings.prPromptPlaceholder":`Instructions for the agent when creating GitHub PRs...`,"settings.prPromptHint":`Use the template variables listed above (double curly brace syntax).`,"settings.reviewPromptTemplate":`Review prompt template`,"settings.reviewPromptPlaceholder":`Instructions for the agent when reviewing branch changes...`,"settings.notionInitialPrompt":`Notion initial prompt`,"settings.notionInitialPrompt.help":`Appended to the workspace creation prompt when the workspace has a Notion ticket. Variables: {variables}.`,"settings.notionInitialPrompt.project":`Notion initial prompt (override)`,"settings.sentryInitialPrompt":`Sentry initial prompt`,"settings.sentryInitialPrompt.help":`Appended to the workspace creation prompt when the workspace has a Sentry issue. Variables: {variables}.`,"settings.sentryInitialPrompt.project":`Sentry initial prompt (override)`,"settings.initialPrompt.inheritHint":`Leave blank to inherit. Type any whitespace character to disable injection at this level.`,"settings.resetToDefault":`Reset to default`,"settings.resetFailed":`Failed to load default value`,"settings.sentryIntegration":`Sentry integration`,"settings.var.prNumber":`PR number (e.g., 42)`,"settings.var.prUrl":`Full URL of the created PR`,"settings.var.branchName":`Working branch name`,"settings.var.sourceBranch":`Source branch the PR targets`,"settings.var.workspaceName":`Workspace name`,"settings.var.projectName":`Last segment of the project path`,"settings.var.notionUrl":`Notion URL if set, empty otherwise`,"settings.var.commits":`Bulleted commit list between source and head`,"settings.var.diffStats":`Git shortstat summary (files, insertions, deletions)`,"settings.var.tasks":`Regular tasks as a checkbox list`,"settings.var.acceptanceCriteria":`Acceptance criteria as a checkbox list`,"settings.gitConventions":`Git conventions (global)`,"settings.gitConventionsPlaceholder":`# Git conventions...`,"settings.gitConventionsHint":`These conventions are written to .ai/.git-conventions.md in each new workspace and must be followed by the agent before any git operation. Overridden by per-project conventions if defined.`,"settings.setupScript":`Setup script`,"settings.cleanupScript":`Cleanup script`,"settings.archiveScript":`Archive script`,"settings.archiveScriptHint":`Shell script run server-side in the worktree when a workspace is archived. Leave empty to disable.`,"settings.archiveScriptPlaceholder":`e.g. clean up containers, free disk space…`,"settings.changeSourceBranchScript":`Change-source-branch script`,"settings.changeSourceBranchScript.help":`Replaces the built-in cherry-pick when non-empty. The script owns git, PR base, force-push and conflicts; Kōbō still refuses while the agent is running and updates the source-branch metadata on exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — new source branch chosen in the dialog
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.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.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-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.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.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.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.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`,"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.runSetup":`Setup-Skript ausführen`,"contextMenu.exportEvents":`Events exportieren (CSV)`,"contextMenu.exportingEvents":`Export wird vorbereitet…`,"contextMenu.exportEventsError":`Event-Export fehlgeschlagen`,"contextMenu.openNotion":`In Notion öffnen`,"contextMenu.openSentry":`In Sentry öffnen`,"contextMenu.openPr":`PR öffnen`,"workspace.favorite":`Als Favorit markieren`,"workspace.unfavorite":`Aus Favoriten entfernen`,"workspace.showFavoritesOnly":`Nur Favoriten anzeigen`,"workspace.searchArchivedToggle":`Auch in archivierten Workspaces suchen`,"workspace.descriptionPlaceholder":`Kurze Beschreibung hinzufügen`,"workspace.descriptionDialogHint":`Klartext, max. 200 Zeichen. Leer lassen, um zu löschen.`,"workspace.descriptionTooLong":`Die Beschreibung darf höchstens 200 Zeichen lang sein.`,"workspace.descriptionSaveFailed":`Beschreibung konnte nicht gespeichert werden.`,"workspace.agentDescriptionTooltip":`Live-Status, gepflegt vom Agent`,"mcp.tool.setWorkspaceDescription":`Setzt die Kurzbeschreibung des Workspace (≤ 200 Zeichen).`,"tags.manage":`Tags verwalten`,"tags.manageTitle":`Workspace-Tags verwalten`,"tags.noTagsDefined":`Keine Tags definiert. Füge welche in Einstellungen > Global > Tags hinzu.`,"tags.orphanedHint":`{count} Tag(s) sind nicht mehr im globalen Katalog. Abwählen zum Entfernen.`,"settings.tagsTitle":`Workspace-Tags`,"settings.tagsHint":`Definiere die Tags, die Workspaces zugewiesen werden können. Tippe zum Hinzufügen, klicke auf das Kreuz zum Entfernen.`,"settings.tagsLabel":`Verfügbare Tags`,"settings.branchPrefixesTitle":`Branch-Präfixe`,"settings.branchPrefixesHint":`Verwalten Sie die Git-Branch-Präfixe, die auf der Workspace-Erstellungsseite verfügbar sind. Das erste ist standardmäßig vorausgewählt.`,"settings.branchPrefixesEmpty":`Kein Branch-Präfix definiert. Fügen Sie unten mindestens eines hinzu.`,"settings.branchPrefixesAddLabel":`Neues Präfix`,"settings.branchPrefixesEditHint":`Zum Umbenennen klicken`,"settings.branchPrefixesMoveUp":`Nach oben`,"settings.branchPrefixesMoveDown":`Nach unten`,"settings.worktreesTitle":`Git-Worktrees`,"settings.worktreesHint":`Wähle aus, wo neue Workspace-Worktrees erstellt werden. Relative Pfade sind projektrelativ; absolute Linux/macOS- und Windows-Pfade, $HOME, ~ und %USERPROFILE% werden unterstützt.`,"settings.worktreesPathLabel":`Worktrees-Pfad`,"settings.worktreesPathRequired":`Worktrees-Pfad ist erforderlich.`,"settings.worktreesPrefixByProject":`Worktrees nach Projektname präfixen`,"settings.worktreesPrefixByProjectHint":`Legt jeden Worktree in einem nach dem Projekt benannten Unterordner ab, um Kollisionen zu vermeiden, wenn mehrere Projekte die gleiche Worktree-Wurzel teilen.`,"settings.shareTitle":`Konfiguration teilen`,"settings.shareHint":`Exportiere Einstellungen, Templates und Tags als JSON-Bundle. MCP-Keys werden aus Sicherheitsgründen nicht exportiert.`,"settings.exportConfig":`Exportieren`,"settings.importConfig":`Importieren`,"settings.exportSuccess":`Konfiguration exportiert`,"settings.importSuccess":`Konfiguration importiert`,"settings.importConfirmTitle":`Konfiguration importieren`,"settings.importConfirmMessage":`Dies ersetzt deine aktuellen Einstellungen, Templates und Tags. MCP-Keys bleiben erhalten. Fortfahren?`,"health.title":`Status`,"health.tooltip":`Systemstatus`,"health.envTitle":`Umgebung`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Datenbank`,"health.dbPath":`Pfad`,"health.dbSize":`Größe`,"health.schemaVersion":`Schema-Version`,"health.settingsSchemaVersion":`Einstellungs-Schema`,"health.runtimesTitle":`Agent-Laufzeiten`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude nicht im PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`codex-Binärdatei nicht auflösbar`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} gesamt, {archived} archiviert`,"health.worktreesMissing":`{count} Worktree(s) auf der Festplatte fehlen`,"health.sessionsTitle":`Agent-Sitzungen`,"health.sessionsOrphaned":`{n} verwaiste laufende Sitzung(en)`,"health.integrationsTitle":`Integrationen`,"health.integrationConfigured":`konfiguriert`,"health.integrationMissing":`nicht konfiguriert`,"health.activeTitle":`Aktiver Zustand`,"health.activeQuotaBackoffs":`Ausstehende Quota-Backoffs`,"health.activeWakeups":`Geplante Aufweckungen`,"health.activeAutoLoop":`Auto-Loop läuft`,"health.activeAgentSessions":`Aktive Agent-Sessions`,"health.activeDevServers":`Laufende Dev-Server`,"health.noneActive":`Keine.`,"health.quotaResumeAt":`fortgesetzt um {time}`,"health.wakeupAt":`aufgeweckt um {time}`,"health.startedAgo":`gestartet vor {time}`,"health.autoLoopReady":`bereit, iteriert`,"health.autoLoopGrooming":`Grooming läuft`,"session.started":`Sitzung gestartet`,"session.ended":`Sitzung beendet`,"session.compacted":`Kontext komprimiert`,"tool.running":`Läuft...`,"activity.raw_lines":`Rohausgabezeilen ({n})`,"activity.loading_older":`Ältere Nachrichten werden geladen…`,"activity.prev_user_message":`Vorherige Nachricht des Benutzers`,"activity.scroll_to_bottom":`Nach unten scrollen`,"chat.systemPrompt":`System-Prompt`,"chat.agent":`Agent`,"chat.cleanupScript":`Cleanup-Skript`,"chat.archiveScript":`Archiv-Skript`,"chat.setupScript":`Setup-Skript`,"chat.scriptDone":`Fertig`,"chat.you":`Du`,"chat.session":`Sitzung`,"chat.nActions":`{n} Aktion | {n} Aktionen`,"chat.lastUpdatedAt":`Zuletzt aktualisiert um {time}`,"chat.scrollToTurnTop":`Zum Nachrichtenanfang scrollen`,"migration.backing_up":`Datenbank wird gesichert…`,"migration.running":`Agent-Daten werden migriert — {processed}/{total}`,"migration.error":`Migration fehlgeschlagen`,"migration.backup_location":`Ein Backup wurde unter {path} gespeichert. Starte Kōbō neu, um erneut zu versuchen.`,"migration.retry":`Starte Kōbō neu, um erneut zu versuchen.`,"engine.select":`Engine`,"engine.model":`Modell`,"engine.effort":`Reasoning-Aufwand`,"wakeup.scheduledIn":`Nächste Weckung in {n}s`,"wakeup.scheduledAt":`Nächste Weckung um {time}`,"wakeup.firing":`Wecke auf...`,"wakeup.reason":`Grund: {reason}`,"wakeup.cancel":`Diese Weckung abbrechen`,"wakeup.pendingIndicator":`Weckung geplant`,"cron.pendingIndicator":`{n} Cron(s) geplant`,"schedule.tabLabel":`Zeitplan`,"schedule.wakeupTitle":`Wakeup ausstehend`,"schedule.cronsTitle":`Wiederkehrende Zeitpläne`,"schedule.noWakeup":`Kein Wakeup geplant`,"schedule.noCrons":`Kein Cron geplant`,"schedule.nextFireAt":`nächstes um {time}`,"schedule.lastFiredAt":`zuletzt vor {time}`,"askUserQuestion.title":`Der Agent stellt eine Frage`,"askUserQuestion.submit":`Antwort senden`,"askUserQuestion.multiSelectHint":`Eine oder mehrere Optionen auswählen`,"askUserQuestion.otherOption":`Sonstiges`,"askUserQuestion.otherOptionHint":`bitte in der nächsten Chat-Nachricht angeben`,"askUserQuestion.noPending":`Keine offene Frage`,"askUserQuestion.next":`Weiter`,"askUserQuestion.previous":`Zurück`,"askUserQuestion.cancel":`Abbrechen`,"askUserQuestion.cancelTooltip":`Diese Frage überspringen — der Agent macht ohne Antwort weiter`,"askUserQuestion.collapse":`Fragebereich einklappen`,"askUserQuestion.expand":`Fragebereich ausklappen`,"permissionRequest.title":`Der Agent möchte ein Tool verwenden`,"permissionRequest.allow":`Erlauben`,"permissionRequest.deny":`Ablehnen`,"permissionRequest.tool":`Tool`,"permissionRequest.input":`Eingabe`,"permissionRequest.denied":`vom Nutzer abgelehnt`,"workspaceStatus.awaitingUser":`wartet auf deine Antwort`,"workspaceList.prOpen":`#{n} — Pull Request offen`,"workspaceList.prChangesRequested":`#{n} — Änderungen angefordert`,"workspaceList.attentionCiFailed":`CI fehlgeschlagen`,"workspaceList.attentionChangesRequested":`Änderungen angefordert`,"autoLoop.toggle":`Auto-Schleife`,"autoLoop.start":`Auto-Schleife starten`,"autoLoop.prepare":`Auto-Schleife vorbereiten`,"autoLoop.reprepare":`Auto-Schleife erneut vorbereiten`,"autoLoop.reprepareTooltip":`Grooming-Schritt erneut ausführen, um Aufgaben hinzuzufügen oder zu aktualisieren, bevor die Schleife neu gestartet wird`,"autoLoop.prepareBusy":`Warte, bis der Agent fertig ist, bevor du vorbereitest`,"autoLoop.forceReady":`Ich weiß, was ich tue — Grooming überspringen`,"autoLoop.forceReadyConfirm":`Grooming überspringen und Auto-Schleife als bereit markieren? Kann hängen bleiben, wenn Aufgaben nicht atomar sind.`,"autoLoop.stop":`Auto-Schleife stoppen`,"autoLoop.notReady":`Zuerst „Auto-Schleife vorbereiten" ausführen`,"autoLoop.noTasks":`Zuerst Aufgaben hinzufügen`,"autoLoop.progress":`Auto-Schleife · {done}/{total} Aufgaben`,"autoLoop.preparing":`Auto-Schleife · Vorbereitung`,"autoLoop.preparingTooltip":`Grooming läuft — der Agent erstellt / überprüft Aufgaben. Die Schleife startet, sobald mark_auto_loop_ready aufgerufen wird.`,"autoLoop.running":`Auto-Schleife läuft`,"autoLoop.startInMode":`Im Auto-Schleifen-Modus starten`,"koboCommand.prepAutoloopDesc":`Aufgaben für Auto-Schleifen-Modus vorbereiten (auf Atomarität prüfen)`,"staleSessionBanner.title":`Auto-Schleife läuft`,"staleSessionBanner.message":`Du siehst eine ältere Sitzung — der Agent arbeitet gerade in der neuesten.`,"staleSessionBanner.switchToCurrent":`Zur aktuellen wechseln`},ln={"common.save":`Save`,"common.cancel":`Cancel`,"common.delete":`Delete`,"common.close":`Close`,"whatsNew.title":`What's new`,"common.loading":`Loading...`,"common.search":`Search...`,"common.refresh":`Refresh`,"common.copy":`Copy`,"common.copied":`Copied to clipboard`,"common.copyFailed":`Copy failed`,"common.add":`Add`,"folderPicker.title":`Choose a folder`,"folderPicker.parent":`Parent folder`,"folderPicker.empty":`No subfolders`,"folderPicker.select":`Select this folder`,"common.start":`Start`,"common.stop":`Stop`,"common.archive":`Archive`,"common.unarchive":`Unarchive`,"common.selectWorkspace":`Select a workspace`,"common.noResults":`No results for "{query}"`,"common.send":`send`,"common.newLine":`new line`,"common.history":`history`,"common.justNow":`just now`,"common.minutesAgo":`{count}m ago`,"common.hoursAgo":`{count}h ago`,"common.daysAgo":`{count}d ago`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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 picks the optimal model`,"model.opus47ClassicDescription":`Latest Opus, most capable`,"model.opus471mDescription":`Latest Opus, 1M context`,"model.opusClassicDescription":`Most powerful`,"model.opus1mDescription":`Most powerful, 1M context`,"model.sonnetClassicDescription":`Balanced`,"model.sonnet1mDescription":`Balanced, 1M context`,"model.haikuDescription":`Fastest`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recommended for complex coding (requires ChatGPT auth)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Default fallback — strong reasoning, works with API key auth`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Fast and efficient — best for responsive tasks and subagents`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Coding-specialized model for complex software engineering`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Let the engine pick the default`,"reasoning.minimalDescription":`Fastest, shallowest reasoning`,"reasoning.lowDescription":`Faster, less depth`,"reasoning.mediumDescription":`Balanced`,"reasoning.highDescription":`More depth`,"reasoning.xhighDescription":`Extended depth, long-horizon tasks`,"reasoning.maxDescription":`Maximum depth`,"agentPermissionMode.label":`Permission mode`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Accept edits`,"agentPermissionMode.interactive":`Interactive`,"agentPermissionMode.tooltip":`How the agent handles tool permissions. Plan: read-only, no writes. Bypass: skip every prompt. Strict: auto-accept file edits, respect allow/deny lists for the rest. Interactive: ask the user before each tool via the permission panel.`,"agentPermissionMode.autoLoopOverride":`Auto-loop forces a non-plan mode — Plan blocks the MCP tools and edits the loop relies on. Pick Bypass, Strict, or Interactive instead.`,"agentPermissionMode.autoLoopLocked":`Locked to Bypass while auto-loop is on — any other mode would stall the loop on permission prompts. AskUserQuestion still works.`,"workspaceList.title":`Workspaces`,"workspaceList.needsAttention":`Needs Attention`,"workspaceList.running":`Running`,"workspaceList.idle":`Idle`,"workspaceList.archived":`Archived`,"workspaceList.noWorkspaces":`No workspaces yet`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} running`,"workspaceList.deleteDialog.title":`Delete workspace?`,"workspaceList.deleteDialog.deleteLocal":`Delete local branch`,"workspaceList.deleteDialog.deleteRemote":`Delete remote branch`,"workspaceList.deleteDialog.warning":`Warning: this action is irreversible on the remote.`,"workspaceList.deleteArchivedDialog.tooltip":`Delete all archived workspaces`,"workspaceList.deleteArchivedDialog.title":`Delete all archived workspaces?`,"workspaceList.deleteArchivedDialog.message":`This will permanently delete the {count} archived workspaces. This action cannot be undone.`,"workspacePage.selectWorkspace":`Select a workspace to begin`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ New session`,"workspacePage.renameSession":`Rename`,"workspacePage.renameSessionTitle":`Rename session`,"workspacePage.sessionNameLabel":`Session name`,"workspacePage.sessionEndedNotice":`This session has ended. Create a new session to continue.`,"workspacePage.renameFailed":`Rename failed`,"workspacePage.createSessionFailed":`Failed to create session`,"workspacePage.startFailed":`Start failed`,"workspacePage.stopFailed":`Stop failed`,"workspacePage.interrupt":`Interrupt`,"workspacePage.interrupted":`Agent interrupted — waiting for your next message`,"workspacePage.interruptFailed":`Interrupt failed`,"workspacePage.interruptTooltip":`Soft interrupt (like Escape) — stops the current tool but keeps the session alive`,"workspacePage.pendingNextRun":`Applied on next start`,"search.title":`Search`,"search.tooltip":`Search across agent history`,"search.placeholder":`Search across all agent messages…`,"search.includeArchived":`Include archived workspaces`,"search.loading":`Searching…`,"search.noResults":`No matches`,"search.error":`Search failed: {message}`,"search.resultCount":`{n} result(s)`,"search.eventType.userMessage":`You`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`No activity yet`,"activityFeed.emptyHint":`Start a workspace to see agent output here`,"activityFeed.initialPrompt":`Initial Prompt`,"activityFeed.you":`You`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Go to previous message`,"activityFeed.scrollToBottom":`Scroll to bottom`,"activityFeed.sendAnswers":`Send answers`,"agentBusy.banner":`Agent is busy`,"agentBusy.subagentsRunning":`1 sub-agent running | {n} sub-agents running`,"agentBusy.viewSubagents":`View sub-agents`,"agentBusy.pendingMessage":`Waiting — agent is busy`,"terminal.title":`Terminal`,"terminal.open":`Open terminal`,"terminal.close":`Close terminal`,"terminal.noWorkspace":`Select a workspace`,"terminal.noWorktree":`Worktree not created yet`,"terminal.error":`Terminal error`,"terminal.exited":`Terminal exited`,"chatInput.placeholder":`Message... (/ for skills)`,"chatInput.fileSearchHint":`search a file`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Attach image`,"chatInput.queueBanner":`Message queued — will be sent when the agent finishes`,"chatInput.cancelQueue":`Cancel Queue`,"chatInput.autoLoopBanner":`Auto-loop is running — stop it to send a message`,"chatInput.awaitingUserBanner":`The agent is waiting for your answer above — reply via the question panel`,"chatInput.autoLoopStop":`Stop`,"koboCommand.checkProgressDesc":`Verify progress on tasks and acceptance criteria`,"chatInput.uploading":`Uploading...`,"voice.title":`Voice transcription`,"voice.enabled":`Enable local voice transcription`,"voice.pttKey":`Push-to-talk key`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Space`,"voice.language":`Language (auto or code)`,"voice.model":`Active model`,"voice.commandPath":`Whisper binary path (optional)`,"voice.ffmpegPath":`ffmpeg binary path (optional)`,"voice.temperature":`Temperature`,"voice.temperatureHint":`Lower is more deterministic; higher can be more flexible but less stable.`,"voice.initialPrompt":`Initial prompt (optional)`,"voice.initialPromptHint":`Optional context to help Whisper with names, jargon, or domain vocabulary.`,"voice.translateToEnglish":`Translate to English`,"voice.translateToEnglishHint":`When enabled, non-English speech is translated to English instead of transcribed as-is.`,"voice.suppressNst":`Suppress non-speech tokens`,"voice.suppressNstHint":`Attempts to reduce non-speech artifacts in the transcript.`,"voice.installLink":`Install whisper.cpp`,"voice.installGuideTitle":`Installation guide`,"voice.installGuideIntro":`Install whisper.cpp and ffmpeg, then set the binary paths below if needed.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`After CMake build, the Whisper binary is usually at: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Then set "Whisper binary path" and "ffmpeg binary path" in this section (or leave empty if they are in PATH).`,"voice.noneModel":`No active model`,"voice.notInstalled":`not installed`,"voice.download":`Download`,"voice.delete":`Delete`,"voice.holdToTalk":`Hold to talk`,"voice.recording":`Recording...`,"voice.transcribing":`Transcribing...`,"voice.notSupported":`Voice recording is not supported in this browser`,"voice.errorMicPermission":`Microphone permission denied`,"voice.errorTranscription":`Voice transcription failed`,"voice.downloadFailed":`Model download failed`,"voice.deleteFailed":`Model deletion failed`,"voice.errorDisabled":`Voice transcription is disabled in settings`,"voice.errorModelMissing":`No active voice model is configured`,"voice.errorModelNotInstalled":`The active voice model is not installed`,"voice.errorAudioInvalid":`Audio capture is invalid or empty`,"voice.errorLanguageInvalid":`Voice language configuration is invalid`,"voice.errorRuntimeMissing":`Whisper runtime is not installed or not in PATH`,"voice.maxDurationReached":`Maximum recording duration reached`,"voice.runtimeReady":`Runtime ready: {command}`,"voice.runtimeMissing":`Runtime missing: {command}`,"voice.ffmpegReady":`ffmpeg ready`,"voice.ffmpegMissing":`ffmpeg missing`,"voice.sectionRuntime":`Runtime status`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Whisper models`,"voice.sectionAdvanced":`Advanced options`,"voice.sectionBehavior":`Transcription behavior`,"voice.sectionBinaries":`Binary paths`,"voice.downloadModels":`Download a model`,"voice.cancelFailed":`Failed to cancel the download`,"createPage.title":`What would you like to work on?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion enabled`,"createPage.importNotion":`Import from Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`URL must start with https://www.notion.so/`,"createPage.notionAutoExtract":`Subtasks and acceptance criteria will be extracted automatically.`,"createPage.notionPanelChoiceLabel":`This URL points to a sub-page (?p=). Which one do you want to work on?`,"createPage.notionPanelOption":`Sub-page (panel)`,"createPage.notionPanelOptionDesc":`The page you were viewing — recommended`,"createPage.notionParentOption":`Parent page`,"createPage.notionParentOptionDesc":`The epic / database it belongs to`,"createPage.importSentry":`Import Sentry`,"createPage.sentryEnabled":`Sentry enabled`,"createPage.sentryPlaceholder":`https://your-org.sentry.io/issues/123456`,"createPage.sentryValidation":`URL must point to a Sentry issue (/issues/<id>)`,"createPage.sentryAutoExtract":`Sentry issue will be imported automatically`,"createPage.sentryExtractHint":`Kobo will extract the issue and write it to .ai/thoughts/`,"createPage.workspaceName":`Workspace name (defaults to Notion page title)`,"createPage.workspaceNamePlaceholder":`Workspace name...`,"createPage.instructions":`Additional instructions (optional)...`,"createPage.instructionsPlaceholder":`Describe the task...`,"createPage.manualHint":`No Notion ticket? Add your tasks and acceptance criteria manually — they'll be sent to the Claude agent as context.`,"createPage.tasks":`Tasks ({count})`,"createPage.addTask":`Add a task...`,"createPage.acceptanceCriteria":`Acceptance Criteria ({count})`,"createPage.addCriterion":`Add a criterion...`,"createPage.projectPath":`Enter the project path`,"createPage.branchType":`Branch type`,"createPage.branch":`Branch`,"createPage.noBranches":`No branches found`,"createPage.enterPath":`Enter a project path`,"createPage.create":`Create`,"createPage.skipSetupScript":`Skip setup script`,"createPage.attachWorktreeToggle":`Attach existing worktree`,"createPage.attachWorktreeEnabled":`Reusing existing worktree`,"createPage.worktreePickerLabel":`Existing worktree`,"createPage.noOrphanWorktrees":`No orphan worktrees in this project`,"createPage.pickWorktreeRequired":`Please pick a worktree to attach`,"createPage.notionExtractHint":`Subtasks and acceptance criteria will be extracted from the Notion page.`,"createPage.notionImportHint":`Click "Import from Notion" to automatically extract subtasks from a ticket.`,"createPage.errorCreating":`Error creating workspace.`,"createPage.validationNotionUrl":`Please paste a valid Notion URL (https://www.notion.so/...).`,"createPage.validationDescription":`Please describe the task.`,"createPage.validationName":`Please provide a workspace name.`,"createPage.validationPath":`Please enter the project path.`,"createPage.validationBranch":`Please select a branch.`,"settings.title":`Settings`,"settings.language":`Language`,"settings.projectColor":`Color`,"settings.projectColorClear":`Clear`,"settings.projectColorDefault":`Default (grey)`,"settings.workspaceListSection":`Workspace list`,"settings.flattenWorkspaceList":`Flatten workspace list`,"settings.flattenWorkspaceListHint":`Show all workspaces in a single flat list with a project badge, instead of grouping by project.`,"settings.skillSuite.section":`Skill suite`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Custom`,"settings.skillSuite.superpowersHint":`Opinionated TDD / brainstorm / plan workflow (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Garry Tan's stack — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Both suites stack — superpowers for process discipline (brainstorm / TDD / plans / principles-level review), gstack for concrete workflows (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.customHint":`Edit the four prompts below yourself. Starts from the agnostic baseline.`,"settings.skillSuite.reloadDefaults":`Reload defaults`,"settings.skillSuite.reloadDefaultsConfirm":`Replace the four custom prompts with the agnostic defaults?`,"settings.skillSuite.customPrompts":`Custom prompts`,"settings.skillSuite.reviewTemplate":`Review template`,"settings.skillSuite.autoLoopReviewGate":`Auto-loop review gate`,"settings.skillSuite.autoLoopGroomingIntro":`Auto-loop grooming intro`,"settings.skillSuite.qaTemplate":`QA template`,"settings.skillSuite.brainstormingInstruction":`Brainstorming-phase instruction`,"settings.global":`Global`,"settings.projects":`Projects`,"settings.globalSettings":`Global Settings`,"settings.defaultModel":`Default model`,"settings.defaultModelClaude":`Default model (Claude Code)`,"settings.defaultModelCodex":`Default model (OpenAI Codex)`,"settings.agentPermissions":`Agent permissions`,"settings.skipPermissions":`Skip permission prompts (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Warning: disabling this will cause all tool permissions (Write, Edit, Bash...) to be auto-denied in headless mode. The agent will only be able to read.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Browser notifications when agent finishes`,"settings.audioNotifications":`Sound notification when agent finishes`,"settings.notificationSound":`Notification sound`,"settings.notificationSoundPreview":`Preview`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Work done`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`It's gonna blow`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.defaultPermissionMode":`Default permission mode`,"settings.defaultPermissionModeClaude":`Default permission mode (Claude Code)`,"settings.defaultPermissionModeCodex":`Default permission mode (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode applied when creating a new workspace. Plan = read-only first, Bypass = skip prompts, Strict = auto-accept edits with allow-list, Interactive = ask before each tool.`,"settings.activityFeed":`Activity feed`,"settings.verboseMessages":`Show verbose system messages (task_progress, task_started)`,"settings.availableVariables":`Available template variables`,"settings.prPromptTemplate":`PR prompt template`,"settings.prPromptPlaceholder":`Instructions for the agent when creating GitHub PRs...`,"settings.prPromptHint":`Use the template variables listed above (double curly brace syntax).`,"settings.reviewPromptTemplate":`Review prompt template`,"settings.reviewPromptPlaceholder":`Instructions for the agent when reviewing branch changes...`,"settings.notionInitialPrompt":`Notion initial prompt`,"settings.notionInitialPrompt.help":`Appended to the workspace creation prompt when the workspace has a Notion ticket. Variables: {variables}.`,"settings.notionInitialPrompt.project":`Notion initial prompt (override)`,"settings.sentryInitialPrompt":`Sentry initial prompt`,"settings.sentryInitialPrompt.help":`Appended to the workspace creation prompt when the workspace has a Sentry issue. Variables: {variables}.`,"settings.sentryInitialPrompt.project":`Sentry initial prompt (override)`,"settings.initialPrompt.inheritHint":`Leave blank to inherit. Type any whitespace character to disable injection at this level.`,"settings.resetToDefault":`Reset to default`,"settings.resetFailed":`Failed to load default value`,"settings.sentryIntegration":`Sentry integration`,"settings.var.prNumber":`PR number (e.g., 42)`,"settings.var.prUrl":`Full URL of the created PR`,"settings.var.branchName":`Working branch name`,"settings.var.sourceBranch":`Source branch the PR targets`,"settings.var.workspaceName":`Workspace name`,"settings.var.projectName":`Last segment of the project path`,"settings.var.notionUrl":`Notion URL if set, empty otherwise`,"settings.var.commits":`Bulleted commit list between source and head`,"settings.var.diffStats":`Git shortstat summary (files, insertions, deletions)`,"settings.var.tasks":`Regular tasks as a checkbox list`,"settings.var.acceptanceCriteria":`Acceptance criteria as a checkbox list`,"settings.gitConventions":`Git conventions (global)`,"settings.gitConventionsPlaceholder":`# Git conventions...`,"settings.gitConventionsHint":`These conventions are written to .ai/.git-conventions.md in each new workspace and must be followed by the agent before any git operation. Overridden by per-project conventions if defined.`,"settings.setupScript":`Setup script`,"settings.cleanupScript":`Cleanup script`,"settings.archiveScript":`Archive script`,"settings.archiveScriptHint":`Shell script run server-side in the worktree when a workspace is archived. Leave empty to disable.`,"settings.archiveScriptPlaceholder":`e.g. clean up containers, free disk space…`,"settings.changeSourceBranchScript":`Change-source-branch script`,"settings.changeSourceBranchScript.help":`Replaces the built-in cherry-pick when non-empty. The script owns git, PR base, force-push and conflicts; Kōbō still refuses while the agent is running and updates the source-branch metadata on exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — new source branch chosen in the dialog
13
13
  KOBO_OLD_BASE — workspace’s previous source branch
14
14
  KOBO_WORKING_BRANCH — workspace’s working branch
15
15
  KOBO_WORKTREE_PATH — absolute path of the worktree (also cwd)
@@ -19,7 +19,7 @@ KOBO_WORKSPACE_ID — Kōbō workspace id (stable across renames)
19
19
  KOBO_WORKSPACE_NAME — workspace display name
20
20
  KOBO_FORGE — resolved forge: github / gitlab / none
21
21
  KOBO_PR_NUMBER — PR/MR number on the resolved forge (empty if none open)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
22
- # 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.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.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-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.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.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.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.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`,"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.runSetup":`Run setup script`,"contextMenu.exportEvents":`Export events (CSV)`,"contextMenu.exportingEvents":`Preparing export…`,"contextMenu.exportEventsError":`Event export failed`,"contextMenu.openNotion":`Open in Notion`,"contextMenu.openSentry":`Open in Sentry`,"contextMenu.openPr":`Open PR`,"workspace.favorite":`Mark as favorite`,"workspace.unfavorite":`Remove from favorites`,"workspace.showFavoritesOnly":`Show favorites only`,"workspace.searchArchivedToggle":`Also search archived workspaces`,"workspace.descriptionPlaceholder":`Add a short description`,"workspace.descriptionDialogHint":`Plain text, 200 characters max. Leave empty to clear.`,"workspace.descriptionTooLong":`Description must be 200 characters or fewer.`,"workspace.descriptionSaveFailed":`Failed to save description.`,"workspace.agentDescriptionTooltip":`Live status maintained by the agent`,"mcp.tool.setWorkspaceDescription":`Set the workspace short description (≤ 200 chars).`,"tags.manage":`Manage tags`,"tags.manageTitle":`Manage workspace tags`,"tags.noTagsDefined":`No tags defined. Add some in Settings > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) are no longer in the global catalog. Uncheck to remove them.`,"settings.tagsTitle":`Workspace tags`,"settings.tagsHint":`Define the tags you can assign to workspaces. Type to add, click the cross to remove.`,"settings.tagsLabel":`Available tags`,"settings.branchPrefixesTitle":`Branch prefixes`,"settings.branchPrefixesHint":`Manage the git branch prefixes available on the workspace creation page. The first one is pre-selected by default.`,"settings.branchPrefixesEmpty":`No branch prefix defined. Add at least one below.`,"settings.branchPrefixesAddLabel":`New prefix`,"settings.branchPrefixesEditHint":`Click to rename`,"settings.branchPrefixesMoveUp":`Move up`,"settings.branchPrefixesMoveDown":`Move down`,"settings.worktreesTitle":`Git worktrees`,"settings.worktreesHint":`Choose where new workspace worktrees are created. Relative paths are project-relative; Linux/macOS and Windows absolute paths, $HOME, ~, and %USERPROFILE% are supported.`,"settings.worktreesPathLabel":`Worktrees path`,"settings.worktreesPathRequired":`Worktrees path is required.`,"settings.worktreesPrefixByProject":`Prefix worktrees by project name`,"settings.worktreesPrefixByProjectHint":`Place each worktree under a sub-directory named after the project, to avoid collisions when multiple projects share the same worktrees root.`,"settings.shareTitle":`Share configuration`,"settings.shareHint":`Export your settings, templates and tags as a JSON bundle. MCP API keys are stripped from exports for security.`,"settings.exportConfig":`Export`,"settings.importConfig":`Import`,"settings.exportSuccess":`Configuration exported`,"settings.importSuccess":`Configuration imported`,"settings.importConfirmTitle":`Import configuration`,"settings.importConfirmMessage":`This will replace your current settings, templates and tags. Your MCP keys are preserved. Continue?`,"health.title":`Health`,"health.tooltip":`System health`,"health.envTitle":`Environment`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Database`,"health.dbPath":`Path`,"health.dbSize":`Size`,"health.schemaVersion":`Schema version`,"health.settingsSchemaVersion":`Settings schema`,"health.runtimesTitle":`Agent runtimes`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude not on PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`codex binary not resolvable`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} total, {archived} archived`,"health.worktreesMissing":`{count} worktree(s) missing on disk`,"health.sessionsTitle":`Agent sessions`,"health.sessionsOrphaned":`{n} orphaned running session(s)`,"health.integrationsTitle":`Integrations`,"health.integrationConfigured":`configured`,"health.integrationMissing":`not configured`,"health.activeTitle":`Active state`,"health.activeQuotaBackoffs":`Pending quota backoffs`,"health.activeWakeups":`Scheduled wakeups`,"health.activeAutoLoop":`Auto-loop running`,"health.activeAgentSessions":`Live agent sessions`,"health.activeDevServers":`Running dev servers`,"health.noneActive":`None.`,"health.quotaResumeAt":`resumes at {time}`,"health.wakeupAt":`wakes at {time}`,"health.startedAgo":`started {time} ago`,"health.autoLoopReady":`ready, iterating`,"health.autoLoopGrooming":`grooming in progress`,"session.started":`Session started`,"session.ended":`Session ended`,"session.compacted":`Context compacted`,"tool.running":`Running...`,"activity.raw_lines":`Raw output lines ({n})`,"activity.loading_older":`Loading older messages…`,"activity.prev_user_message":`Previous user message`,"activity.scroll_to_bottom":`Scroll to bottom`,"chat.systemPrompt":`System prompt`,"chat.agent":`Agent`,"chat.cleanupScript":`Cleanup script`,"chat.archiveScript":`Archive script`,"chat.setupScript":`Setup script`,"chat.scriptDone":`Done`,"chat.you":`You`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Last updated at {time}`,"chat.scrollToTurnTop":`Scroll to top of this message`,"migration.backing_up":`Backing up the database…`,"migration.running":`Migrating agent data — {processed}/{total}`,"migration.error":`Migration failed`,"migration.backup_location":`A backup was saved at {path}. Restart Kōbō to retry.`,"migration.retry":`Restart Kōbō to retry.`,"engine.select":`Engine`,"engine.model":`Model`,"engine.effort":`Reasoning effort`,"wakeup.scheduledIn":`Next wakeup in {n}s`,"wakeup.scheduledAt":`Next wakeup at {time}`,"wakeup.firing":`Waking up...`,"wakeup.reason":`Reason: {reason}`,"wakeup.cancel":`Cancel this wakeup`,"wakeup.pendingIndicator":`Wakeup scheduled`,"cron.pendingIndicator":`{n} cron(s) scheduled`,"schedule.tabLabel":`Schedule`,"schedule.wakeupTitle":`Wakeup pending`,"schedule.cronsTitle":`Recurring schedules`,"schedule.noWakeup":`No wakeup scheduled`,"schedule.noCrons":`No cron scheduled`,"schedule.nextFireAt":`next at {time}`,"schedule.lastFiredAt":`last fired {time} ago`,"askUserQuestion.title":`The agent is asking a question`,"askUserQuestion.submit":`Submit answer`,"askUserQuestion.multiSelectHint":`Select one or more options`,"askUserQuestion.otherOption":`Other`,"askUserQuestion.otherOptionHint":`specify in your next chat message`,"askUserQuestion.noPending":`No pending question`,"askUserQuestion.next":`Next`,"askUserQuestion.previous":`Previous`,"askUserQuestion.cancel":`Cancel`,"askUserQuestion.cancelTooltip":`Skip this question — the agent will proceed without an answer`,"permissionRequest.title":`The agent wants to use a tool`,"permissionRequest.allow":`Allow`,"permissionRequest.deny":`Deny`,"permissionRequest.tool":`Tool`,"permissionRequest.input":`Input`,"permissionRequest.denied":`denied by user`,"workspaceStatus.awaitingUser":`awaiting your answer`,"workspaceList.prOpen":`#{n} — Pull request open`,"workspaceList.prChangesRequested":`#{n} — Changes requested`,"workspaceList.attentionCiFailed":`CI failed`,"workspaceList.attentionChangesRequested":`Changes requested`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Start auto-loop`,"autoLoop.prepare":`Prepare for auto-loop`,"autoLoop.reprepare":`Re-prepare for auto-loop`,"autoLoop.reprepareTooltip":`Re-run the grooming pass to add or refresh tasks before resuming the loop`,"autoLoop.prepareBusy":`Wait for the agent to finish before preparing`,"autoLoop.forceReady":`I know what I'm doing — skip grooming`,"autoLoop.forceReadyConfirm":`Skip grooming and mark auto-loop ready? This may cause the loop to stall if tasks aren't atomic.`,"autoLoop.stop":`Stop auto-loop`,"autoLoop.notReady":`Run 'Prepare for auto-loop' first`,"autoLoop.noTasks":`Add tasks first`,"autoLoop.progress":`Auto-loop · {done}/{total} tasks`,"autoLoop.preparing":`Auto-loop · preparing`,"autoLoop.preparingTooltip":`Grooming in progress — the agent is creating / reviewing tasks. The loop will start running once it calls mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop running`,"autoLoop.startInMode":`Start in auto-loop mode`,"koboCommand.prepAutoloopDesc":`Prepare tasks for auto-loop mode (groom for atomicity)`,"staleSessionBanner.title":`Auto-loop running`,"staleSessionBanner.message":`You're viewing an older session — the agent is currently working in the latest one.`,"staleSessionBanner.switchToCurrent":`Switch to current`},un={"common.save":`Guardar`,"common.cancel":`Cancelar`,"common.delete":`Eliminar`,"common.close":`Cerrar`,"whatsNew.title":`Novedades`,"common.loading":`Cargando...`,"common.search":`Buscar...`,"common.refresh":`Actualizar`,"common.copy":`Copiar`,"common.copied":`Copiado al portapapeles`,"common.copyFailed":`Error al copiar`,"common.add":`Añadir`,"folderPicker.title":`Elegir una carpeta`,"folderPicker.parent":`Carpeta superior`,"folderPicker.empty":`Sin subcarpetas`,"folderPicker.select":`Elegir esta carpeta`,"common.start":`Iniciar`,"common.stop":`Detener`,"common.archive":`Archivar`,"common.unarchive":`Desarchivar`,"common.selectWorkspace":`Selecciona un workspace`,"common.noResults":`Sin resultados para "{query}"`,"common.send":`enviar`,"common.newLine":`nueva línea`,"common.history":`historial`,"common.justNow":`ahora mismo`,"common.minutesAgo":`hace {count}m`,"common.hoursAgo":`hace {count}h`,"common.daysAgo":`hace {count}d`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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 elige el modelo óptimo`,"model.opus47ClassicDescription":`Último Opus, el más capaz`,"model.opus471mDescription":`Último Opus, contexto 1M`,"model.opusClassicDescription":`El más potente`,"model.opus1mDescription":`El más potente, contexto 1M`,"model.sonnetClassicDescription":`Equilibrado`,"model.sonnet1mDescription":`Equilibrado, contexto 1M`,"model.haikuDescription":`El más rápido`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recomendado para código complejo (requiere autenticación ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Alternativa por defecto — razonamiento sólido, compatible con clave API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rápido y eficiente — ideal para tareas reactivas y subagentes`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modelo especializado en código para ingeniería de software compleja`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Deja que el motor decida`,"reasoning.minimalDescription":`Razonamiento más rápido y superficial`,"reasoning.lowDescription":`Más rápido, menos profundidad`,"reasoning.mediumDescription":`Equilibrado`,"reasoning.highDescription":`Más profundidad`,"reasoning.xhighDescription":`Profundidad extendida, tareas largas`,"reasoning.maxDescription":`Profundidad máxima`,"agentPermissionMode.label":`Modo de permisos`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Aceptar ediciones`,"agentPermissionMode.interactive":`Interactivo`,"agentPermissionMode.tooltip":`Cómo gestiona el agente los permisos de las herramientas. Plan: solo lectura, sin escrituras. Bypass: omitir todas las preguntas. Estricto: auto-aceptar ediciones de archivos, respetar allow/deny para el resto. Interactivo: preguntar al usuario antes de cada herramienta mediante el panel de permisos.`,"agentPermissionMode.autoLoopOverride":`El auto-loop fuerza un modo distinto a Plan — Plan bloquea las herramientas MCP y las ediciones que el bucle necesita. Elige Bypass, Estricto o Interactivo.`,"agentPermissionMode.autoLoopLocked":`Bloqueado en Bypass mientras el auto-loop está activo — cualquier otro modo detendría el bucle en las preguntas de permiso. AskUserQuestion sigue funcionando.`,"workspaceList.title":`Workspaces`,"workspaceList.needsAttention":`Requiere atención`,"workspaceList.running":`En ejecución`,"workspaceList.idle":`Inactivo`,"workspaceList.archived":`Archivados`,"workspaceList.noWorkspaces":`Aún no hay workspaces`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} en ejecución`,"workspaceList.deleteDialog.title":`¿Eliminar workspace?`,"workspaceList.deleteDialog.deleteLocal":`Eliminar rama local`,"workspaceList.deleteDialog.deleteRemote":`Eliminar rama remota`,"workspaceList.deleteDialog.warning":`Advertencia: esta acción es irreversible en el remoto.`,"workspaceList.deleteArchivedDialog.tooltip":`Eliminar todos los workspaces archivados`,"workspaceList.deleteArchivedDialog.title":`¿Eliminar todos los workspaces archivados?`,"workspaceList.deleteArchivedDialog.message":`Esto eliminará permanentemente los {count} workspaces archivados. Esta acción no se puede deshacer.`,"workspacePage.selectWorkspace":`Selecciona un workspace para comenzar`,"workspacePage.session":`Sesión #{n}`,"workspacePage.newSession":`+ Nueva sesión`,"workspacePage.renameSession":`Renombrar`,"workspacePage.renameSessionTitle":`Renombrar sesión`,"workspacePage.sessionNameLabel":`Nombre de sesión`,"workspacePage.sessionEndedNotice":`Esta sesión ha terminado. Crea una nueva sesión para continuar.`,"workspacePage.renameFailed":`Error al renombrar`,"workspacePage.createSessionFailed":`Error al crear la sesión`,"workspacePage.startFailed":`Error al iniciar`,"workspacePage.stopFailed":`Error al detener`,"workspacePage.interrupt":`Interrumpir`,"workspacePage.interrupted":`Agente interrumpido — esperando tu próximo mensaje`,"workspacePage.interruptFailed":`Error al interrumpir`,"workspacePage.interruptTooltip":`Interrupción suave (como Escape) — detiene la herramienta actual pero mantiene la sesión activa`,"workspacePage.pendingNextRun":`Se aplicará en el próximo inicio`,"search.title":`Búsqueda`,"search.tooltip":`Buscar en el historial de agentes`,"search.placeholder":`Buscar en todos los mensajes de agentes…`,"search.includeArchived":`Incluir workspaces archivados`,"search.loading":`Buscando…`,"search.noResults":`Sin resultados`,"search.error":`Búsqueda fallida: {message}`,"search.resultCount":`{n} resultado(s)`,"search.eventType.userMessage":`Tú`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Aún no hay actividad`,"activityFeed.emptyHint":`Inicia un workspace para ver la salida del agente aquí`,"activityFeed.initialPrompt":`Prompt inicial`,"activityFeed.you":`Tú`,"activityFeed.agent":`Agente`,"activityFeed.question":`Pregunta`,"activityFeed.goToPrevious":`Ir al mensaje anterior`,"activityFeed.scrollToBottom":`Ir al final`,"activityFeed.sendAnswers":`Enviar respuestas`,"agentBusy.banner":`El agente está ocupado`,"agentBusy.subagentsRunning":`1 sub-agente en ejecución | {n} sub-agentes en ejecución`,"agentBusy.viewSubagents":`Ver sub-agentes`,"agentBusy.pendingMessage":`Esperando — el agente está ocupado`,"terminal.title":`Terminal`,"terminal.open":`Abrir terminal`,"terminal.close":`Cerrar terminal`,"terminal.noWorkspace":`Seleccione un espacio de trabajo`,"terminal.noWorktree":`Worktree aún no creado`,"terminal.error":`Error del terminal`,"terminal.exited":`Terminal cerrado`,"chatInput.placeholder":`Mensaje... (/ para skills)`,"chatInput.fileSearchHint":`buscar un archivo`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Adjuntar imagen`,"chatInput.queueBanner":`Mensaje en cola — se enviará cuando el agente termine`,"chatInput.cancelQueue":`Cancelar cola`,"chatInput.autoLoopBanner":`Auto-loop activo — deténlo para enviar un mensaje`,"chatInput.awaitingUserBanner":`El agente espera tu respuesta arriba — responde mediante el panel de la pregunta`,"chatInput.autoLoopStop":`Detener`,"koboCommand.checkProgressDesc":`Verificar el progreso de las tareas y criterios de aceptación`,"chatInput.uploading":`Subiendo...`,"voice.title":`Transcripción de voz`,"voice.enabled":`Activar transcripción de voz local`,"voice.pttKey":`Tecla push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espacio`,"voice.language":`Idioma (auto o código)`,"voice.model":`Modelo activo`,"voice.commandPath":`Ruta del binario Whisper (opcional)`,"voice.ffmpegPath":`Ruta del binario ffmpeg (opcional)`,"voice.temperature":`Temperatura`,"voice.temperatureHint":`Más bajo = más determinista; más alto = más flexible pero potencialmente menos estable.`,"voice.initialPrompt":`Prompt inicial (opcional)`,"voice.initialPromptHint":`Contexto opcional para ayudar a Whisper con nombres, siglas o vocabulario técnico.`,"voice.translateToEnglish":`Traducir al inglés`,"voice.translateToEnglishHint":`Si se activa, el audio no inglés se traduce al inglés en lugar de transcribirse tal cual.`,"voice.suppressNst":`Suprimir tokens no vocales`,"voice.suppressNstHint":`Intenta reducir artefactos no vocales en la transcripción.`,"voice.installLink":`Instalar whisper.cpp`,"voice.installGuideTitle":`Guía de instalación`,"voice.installGuideIntro":`Instala whisper.cpp y ffmpeg, luego configura las rutas de binarios abajo si hace falta.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Después del build con CMake, el binario de Whisper suele estar en: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Después, configura “Ruta del binario Whisper” y “Ruta del binario ffmpeg” en esta sección (o déjalo vacío si están en PATH).`,"voice.noneModel":`Sin modelo activo`,"voice.notInstalled":`no instalado`,"voice.download":`Descargar`,"voice.delete":`Eliminar`,"voice.holdToTalk":`Mantén pulsado para hablar`,"voice.recording":`Grabando...`,"voice.transcribing":`Transcribiendo...`,"voice.notSupported":`La grabación de voz no es compatible con este navegador`,"voice.errorMicPermission":`Permiso de micrófono denegado`,"voice.errorTranscription":`Falló la transcripción de voz`,"voice.downloadFailed":`Falló la descarga del modelo`,"voice.deleteFailed":`Falló la eliminación del modelo`,"voice.errorDisabled":`La transcripción de voz está desactivada en ajustes`,"voice.errorModelMissing":`No hay un modelo de voz activo configurado`,"voice.errorModelNotInstalled":`El modelo de voz activo no está instalado`,"voice.errorAudioInvalid":`La captura de audio es inválida o vacía`,"voice.errorLanguageInvalid":`La configuración del idioma de voz es inválida`,"voice.errorRuntimeMissing":`El runtime de Whisper no está instalado o no está en el PATH`,"voice.maxDurationReached":`Se alcanzó la duración máxima de grabación`,"voice.runtimeReady":`Runtime listo: {command}`,"voice.runtimeMissing":`Falta runtime: {command}`,"voice.ffmpegReady":`ffmpeg listo`,"voice.ffmpegMissing":`falta ffmpeg`,"voice.sectionRuntime":`Estado del runtime`,"voice.sectionActivation":`Activación`,"voice.sectionModels":`Modelos Whisper`,"voice.sectionAdvanced":`Opciones avanzadas`,"voice.sectionBehavior":`Comportamiento de la transcripción`,"voice.sectionBinaries":`Rutas de los binarios`,"voice.downloadModels":`Descargar un modelo`,"voice.cancelFailed":`No se pudo cancelar la descarga`,"createPage.title":`¿En qué te gustaría trabajar?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion activado`,"createPage.importNotion":`Importar desde Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`La URL debe empezar por https://www.notion.so/`,"createPage.notionAutoExtract":`Las subtareas y criterios de aceptación se extraerán automáticamente.`,"createPage.notionPanelChoiceLabel":`Esta URL apunta a una subpágina (?p=). ¿Sobre cuál quieres trabajar?`,"createPage.notionPanelOption":`Subpágina (panel)`,"createPage.notionPanelOptionDesc":`La página que estabas viendo — recomendado`,"createPage.notionParentOption":`Página principal`,"createPage.notionParentOptionDesc":`La épica / base de datos a la que pertenece`,"createPage.importSentry":`Importar Sentry`,"createPage.sentryEnabled":`Sentry activado`,"createPage.sentryPlaceholder":`https://tu-org.sentry.io/issues/123456`,"createPage.sentryValidation":`La URL debe apuntar a una issue de Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`La issue de Sentry se importará automáticamente`,"createPage.sentryExtractHint":`Kobo extraerá la issue y la escribirá en .ai/thoughts/`,"createPage.workspaceName":`Nombre del workspace (por defecto el título de la página Notion)`,"createPage.workspaceNamePlaceholder":`Nombre del workspace...`,"createPage.instructions":`Instrucciones adicionales (opcional)...`,"createPage.instructionsPlaceholder":`Describe la tarea...`,"createPage.manualHint":`¿Sin ticket Notion? Añade tus tareas y criterios de aceptación manualmente — se enviarán al agente Claude como contexto.`,"createPage.tasks":`Tareas ({count})`,"createPage.addTask":`Añadir una tarea...`,"createPage.acceptanceCriteria":`Criterios de aceptación ({count})`,"createPage.addCriterion":`Añadir un criterio...`,"createPage.projectPath":`Introduce la ruta del proyecto`,"createPage.branchType":`Tipo de rama`,"createPage.branch":`Rama`,"createPage.noBranches":`No se encontraron ramas`,"createPage.enterPath":`Introduce la ruta del proyecto`,"createPage.create":`Crear`,"createPage.skipSetupScript":`Omitir script de setup`,"createPage.attachWorktreeToggle":`Adjuntar worktree existente`,"createPage.attachWorktreeEnabled":`Reutilizando worktree existente`,"createPage.worktreePickerLabel":`Worktree existente`,"createPage.noOrphanWorktrees":`No hay worktrees huérfanos en este proyecto`,"createPage.pickWorktreeRequired":`Selecciona un worktree para adjuntar`,"createPage.notionExtractHint":`Las subtareas y criterios de aceptación se extraerán de la página Notion.`,"createPage.notionImportHint":`Haz clic en "Importar desde Notion" para extraer automáticamente las subtareas de un ticket.`,"createPage.errorCreating":`Error al crear el workspace.`,"createPage.validationNotionUrl":`Introduce una URL de Notion válida (https://www.notion.so/...).`,"createPage.validationDescription":`Describe la tarea.`,"createPage.validationName":`Indica un nombre para el workspace.`,"createPage.validationPath":`Introduce la ruta del proyecto.`,"createPage.validationBranch":`Selecciona una rama.`,"settings.title":`Ajustes`,"settings.language":`Idioma`,"settings.projectColor":`Color`,"settings.projectColorClear":`Borrar`,"settings.projectColorDefault":`Por defecto (gris)`,"settings.workspaceListSection":`Lista de workspaces`,"settings.flattenWorkspaceList":`Lista plana de workspaces`,"settings.flattenWorkspaceListHint":`Muestra todos los workspaces en una lista plana con una etiqueta de proyecto, en lugar de agruparlos por proyecto.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personalizado`,"settings.skillSuite.superpowersHint":`Workflow opinado TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Ambas suites se combinan — superpowers para la metodología (brainstorm / TDD / planes / revisión a nivel de principios), gstack para flujos concretos (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.customHint":`Edita los cuatro prompts a continuación tú mismo. Parte de la base agnóstica.`,"settings.skillSuite.reloadDefaults":`Restaurar predeterminados`,"settings.skillSuite.reloadDefaultsConfirm":`¿Reemplazar los cuatro prompts personalizados con los valores agnósticos predeterminados?`,"settings.skillSuite.customPrompts":`Prompts personalizados`,"settings.skillSuite.reviewTemplate":`Template de revisión`,"settings.skillSuite.autoLoopReviewGate":`Compuerta de revisión auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instrucción de la fase de brainstorming`,"settings.global":`Global`,"settings.projects":`Proyectos`,"settings.globalSettings":`Ajustes globales`,"settings.defaultModel":`Modelo por defecto`,"settings.defaultModelClaude":`Modelo por defecto (Claude Code)`,"settings.defaultModelCodex":`Modelo por defecto (OpenAI Codex)`,"settings.agentPermissions":`Permisos del agente`,"settings.skipPermissions":`Omitir solicitudes de permisos (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Advertencia: desactivar esto hará que todos los permisos de herramientas (Write, Edit, Bash...) se denieguen automáticamente en modo headless. El agente solo podrá leer.`,"settings.notifications":`Notificaciones`,"settings.browserNotifications":`Notificación del navegador cuando el agente termina`,"settings.audioNotifications":`Notificación sonora cuando el agente termina`,"settings.notificationSound":`Sonido de notificación`,"settings.notificationSoundPreview":`Escuchar`,"settings.notificationVolume":`Volumen`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Trabajo terminado`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Va a explotar`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.defaultPermissionMode":`Modo de permisos por defecto`,"settings.defaultPermissionModeClaude":`Modo de permisos por defecto (Claude Code)`,"settings.defaultPermissionModeCodex":`Modo de permisos por defecto (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modo aplicado al crear un workspace. Plan = solo lectura, Bypass = sin avisos, Estricto = auto-aceptar ediciones con allow-list, Interactivo = preguntar antes de cada herramienta.`,"settings.activityFeed":`Feed de actividad`,"settings.verboseMessages":`Mostrar mensajes detallados del sistema (task_progress, task_started)`,"settings.availableVariables":`Variables disponibles en las plantillas de prompt`,"settings.prPromptTemplate":`Plantilla de prompt PR`,"settings.prPromptPlaceholder":`Instrucciones para el agente al crear PRs en GitHub...`,"settings.prPromptHint":`Usa las variables listadas arriba (sintaxis de dobles llaves).`,"settings.reviewPromptTemplate":`Plantilla de prompt de revisión`,"settings.reviewPromptPlaceholder":`Instrucciones para el agente al revisar los cambios de la rama...`,"settings.notionInitialPrompt":`Prompt inicial de Notion`,"settings.notionInitialPrompt.help":`Se añade al prompt de creación del workspace cuando el workspace tiene un ticket de Notion. Variables: {variables}.`,"settings.notionInitialPrompt.project":`Prompt inicial de Notion (anulación)`,"settings.sentryInitialPrompt":`Prompt inicial de Sentry`,"settings.sentryInitialPrompt.help":`Se añade al prompt de creación del workspace cuando el workspace tiene una issue de Sentry. Variables: {variables}.`,"settings.sentryInitialPrompt.project":`Prompt inicial de Sentry (anulación)`,"settings.initialPrompt.inheritHint":`Dejar en blanco para heredar. Escribe un carácter en blanco para desactivar la inyección a este nivel.`,"settings.resetToDefault":`Restablecer`,"settings.resetFailed":`No se pudo cargar el valor por defecto`,"settings.sentryIntegration":`Integración Sentry`,"settings.var.prNumber":`Número de PR (ej: 42)`,"settings.var.prUrl":`URL completa de la PR creada`,"settings.var.branchName":`Nombre de la rama de trabajo`,"settings.var.sourceBranch":`Rama fuente a la que apunta la PR`,"settings.var.workspaceName":`Nombre del workspace`,"settings.var.projectName":`Último segmento de la ruta del proyecto`,"settings.var.notionUrl":`URL de Notion si está definida, vacía en caso contrario`,"settings.var.commits":`Lista de commits entre source y head`,"settings.var.diffStats":`Resumen shortstat de Git (archivos, inserciones, eliminaciones)`,"settings.var.tasks":`Tareas regulares como lista de verificación`,"settings.var.acceptanceCriteria":`Criterios de aceptación como lista de verificación`,"settings.gitConventions":`Convenciones Git (global)`,"settings.gitConventionsPlaceholder":`# Convenciones Git...`,"settings.gitConventionsHint":`Estas convenciones se escriben en .ai/.git-conventions.md en cada nuevo workspace y deben ser seguidas por el agente antes de cualquier operación Git. Se anulan con convenciones por proyecto si están definidas.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de limpieza`,"settings.archiveScript":`Script de archivado`,"settings.archiveScriptHint":`Script de shell ejecutado en el servidor en el worktree cuando se archiva un workspace. Dejar vacío para desactivar.`,"settings.archiveScriptPlaceholder":`p. ej. limpiar contenedores, liberar espacio en disco…`,"settings.changeSourceBranchScript":`Script para cambiar la rama de origen`,"settings.changeSourceBranchScript.help":`Reemplaza el cherry-pick integrado cuando no está vacío. El script gestiona git, base de la PR, force-push y conflictos; Kōbō solo rechaza si el agente está corriendo y actualiza los metadatos de la rama de origen en exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nueva rama de origen elegida en el diálogo
22
+ # 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.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.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-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.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.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.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.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`,"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.runSetup":`Run setup script`,"contextMenu.exportEvents":`Export events (CSV)`,"contextMenu.exportingEvents":`Preparing export…`,"contextMenu.exportEventsError":`Event export failed`,"contextMenu.openNotion":`Open in Notion`,"contextMenu.openSentry":`Open in Sentry`,"contextMenu.openPr":`Open PR`,"workspace.favorite":`Mark as favorite`,"workspace.unfavorite":`Remove from favorites`,"workspace.showFavoritesOnly":`Show favorites only`,"workspace.searchArchivedToggle":`Also search archived workspaces`,"workspace.descriptionPlaceholder":`Add a short description`,"workspace.descriptionDialogHint":`Plain text, 200 characters max. Leave empty to clear.`,"workspace.descriptionTooLong":`Description must be 200 characters or fewer.`,"workspace.descriptionSaveFailed":`Failed to save description.`,"workspace.agentDescriptionTooltip":`Live status maintained by the agent`,"mcp.tool.setWorkspaceDescription":`Set the workspace short description (≤ 200 chars).`,"tags.manage":`Manage tags`,"tags.manageTitle":`Manage workspace tags`,"tags.noTagsDefined":`No tags defined. Add some in Settings > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) are no longer in the global catalog. Uncheck to remove them.`,"settings.tagsTitle":`Workspace tags`,"settings.tagsHint":`Define the tags you can assign to workspaces. Type to add, click the cross to remove.`,"settings.tagsLabel":`Available tags`,"settings.branchPrefixesTitle":`Branch prefixes`,"settings.branchPrefixesHint":`Manage the git branch prefixes available on the workspace creation page. The first one is pre-selected by default.`,"settings.branchPrefixesEmpty":`No branch prefix defined. Add at least one below.`,"settings.branchPrefixesAddLabel":`New prefix`,"settings.branchPrefixesEditHint":`Click to rename`,"settings.branchPrefixesMoveUp":`Move up`,"settings.branchPrefixesMoveDown":`Move down`,"settings.worktreesTitle":`Git worktrees`,"settings.worktreesHint":`Choose where new workspace worktrees are created. Relative paths are project-relative; Linux/macOS and Windows absolute paths, $HOME, ~, and %USERPROFILE% are supported.`,"settings.worktreesPathLabel":`Worktrees path`,"settings.worktreesPathRequired":`Worktrees path is required.`,"settings.worktreesPrefixByProject":`Prefix worktrees by project name`,"settings.worktreesPrefixByProjectHint":`Place each worktree under a sub-directory named after the project, to avoid collisions when multiple projects share the same worktrees root.`,"settings.shareTitle":`Share configuration`,"settings.shareHint":`Export your settings, templates and tags as a JSON bundle. MCP API keys are stripped from exports for security.`,"settings.exportConfig":`Export`,"settings.importConfig":`Import`,"settings.exportSuccess":`Configuration exported`,"settings.importSuccess":`Configuration imported`,"settings.importConfirmTitle":`Import configuration`,"settings.importConfirmMessage":`This will replace your current settings, templates and tags. Your MCP keys are preserved. Continue?`,"health.title":`Health`,"health.tooltip":`System health`,"health.envTitle":`Environment`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Database`,"health.dbPath":`Path`,"health.dbSize":`Size`,"health.schemaVersion":`Schema version`,"health.settingsSchemaVersion":`Settings schema`,"health.runtimesTitle":`Agent runtimes`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude not on PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`codex binary not resolvable`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} total, {archived} archived`,"health.worktreesMissing":`{count} worktree(s) missing on disk`,"health.sessionsTitle":`Agent sessions`,"health.sessionsOrphaned":`{n} orphaned running session(s)`,"health.integrationsTitle":`Integrations`,"health.integrationConfigured":`configured`,"health.integrationMissing":`not configured`,"health.activeTitle":`Active state`,"health.activeQuotaBackoffs":`Pending quota backoffs`,"health.activeWakeups":`Scheduled wakeups`,"health.activeAutoLoop":`Auto-loop running`,"health.activeAgentSessions":`Live agent sessions`,"health.activeDevServers":`Running dev servers`,"health.noneActive":`None.`,"health.quotaResumeAt":`resumes at {time}`,"health.wakeupAt":`wakes at {time}`,"health.startedAgo":`started {time} ago`,"health.autoLoopReady":`ready, iterating`,"health.autoLoopGrooming":`grooming in progress`,"session.started":`Session started`,"session.ended":`Session ended`,"session.compacted":`Context compacted`,"tool.running":`Running...`,"activity.raw_lines":`Raw output lines ({n})`,"activity.loading_older":`Loading older messages…`,"activity.prev_user_message":`Previous user message`,"activity.scroll_to_bottom":`Scroll to bottom`,"chat.systemPrompt":`System prompt`,"chat.agent":`Agent`,"chat.cleanupScript":`Cleanup script`,"chat.archiveScript":`Archive script`,"chat.setupScript":`Setup script`,"chat.scriptDone":`Done`,"chat.you":`You`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Last updated at {time}`,"chat.scrollToTurnTop":`Scroll to top of this message`,"migration.backing_up":`Backing up the database…`,"migration.running":`Migrating agent data — {processed}/{total}`,"migration.error":`Migration failed`,"migration.backup_location":`A backup was saved at {path}. Restart Kōbō to retry.`,"migration.retry":`Restart Kōbō to retry.`,"engine.select":`Engine`,"engine.model":`Model`,"engine.effort":`Reasoning effort`,"wakeup.scheduledIn":`Next wakeup in {n}s`,"wakeup.scheduledAt":`Next wakeup at {time}`,"wakeup.firing":`Waking up...`,"wakeup.reason":`Reason: {reason}`,"wakeup.cancel":`Cancel this wakeup`,"wakeup.pendingIndicator":`Wakeup scheduled`,"cron.pendingIndicator":`{n} cron(s) scheduled`,"schedule.tabLabel":`Schedule`,"schedule.wakeupTitle":`Wakeup pending`,"schedule.cronsTitle":`Recurring schedules`,"schedule.noWakeup":`No wakeup scheduled`,"schedule.noCrons":`No cron scheduled`,"schedule.nextFireAt":`next at {time}`,"schedule.lastFiredAt":`last fired {time} ago`,"askUserQuestion.title":`The agent is asking a question`,"askUserQuestion.submit":`Submit answer`,"askUserQuestion.multiSelectHint":`Select one or more options`,"askUserQuestion.otherOption":`Other`,"askUserQuestion.otherOptionHint":`specify in your next chat message`,"askUserQuestion.noPending":`No pending question`,"askUserQuestion.next":`Next`,"askUserQuestion.previous":`Previous`,"askUserQuestion.cancel":`Cancel`,"askUserQuestion.cancelTooltip":`Skip this question — the agent will proceed without an answer`,"askUserQuestion.collapse":`Collapse the question panel`,"askUserQuestion.expand":`Expand the question panel`,"permissionRequest.title":`The agent wants to use a tool`,"permissionRequest.allow":`Allow`,"permissionRequest.deny":`Deny`,"permissionRequest.tool":`Tool`,"permissionRequest.input":`Input`,"permissionRequest.denied":`denied by user`,"workspaceStatus.awaitingUser":`awaiting your answer`,"workspaceList.prOpen":`#{n} — Pull request open`,"workspaceList.prChangesRequested":`#{n} — Changes requested`,"workspaceList.attentionCiFailed":`CI failed`,"workspaceList.attentionChangesRequested":`Changes requested`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Start auto-loop`,"autoLoop.prepare":`Prepare for auto-loop`,"autoLoop.reprepare":`Re-prepare for auto-loop`,"autoLoop.reprepareTooltip":`Re-run the grooming pass to add or refresh tasks before resuming the loop`,"autoLoop.prepareBusy":`Wait for the agent to finish before preparing`,"autoLoop.forceReady":`I know what I'm doing — skip grooming`,"autoLoop.forceReadyConfirm":`Skip grooming and mark auto-loop ready? This may cause the loop to stall if tasks aren't atomic.`,"autoLoop.stop":`Stop auto-loop`,"autoLoop.notReady":`Run 'Prepare for auto-loop' first`,"autoLoop.noTasks":`Add tasks first`,"autoLoop.progress":`Auto-loop · {done}/{total} tasks`,"autoLoop.preparing":`Auto-loop · preparing`,"autoLoop.preparingTooltip":`Grooming in progress — the agent is creating / reviewing tasks. The loop will start running once it calls mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop running`,"autoLoop.startInMode":`Start in auto-loop mode`,"koboCommand.prepAutoloopDesc":`Prepare tasks for auto-loop mode (groom for atomicity)`,"staleSessionBanner.title":`Auto-loop running`,"staleSessionBanner.message":`You're viewing an older session — the agent is currently working in the latest one.`,"staleSessionBanner.switchToCurrent":`Switch to current`},un={"common.save":`Guardar`,"common.cancel":`Cancelar`,"common.delete":`Eliminar`,"common.close":`Cerrar`,"whatsNew.title":`Novedades`,"common.loading":`Cargando...`,"common.search":`Buscar...`,"common.refresh":`Actualizar`,"common.copy":`Copiar`,"common.copied":`Copiado al portapapeles`,"common.copyFailed":`Error al copiar`,"common.add":`Añadir`,"folderPicker.title":`Elegir una carpeta`,"folderPicker.parent":`Carpeta superior`,"folderPicker.empty":`Sin subcarpetas`,"folderPicker.select":`Elegir esta carpeta`,"common.start":`Iniciar`,"common.stop":`Detener`,"common.archive":`Archivar`,"common.unarchive":`Desarchivar`,"common.selectWorkspace":`Selecciona un workspace`,"common.noResults":`Sin resultados para "{query}"`,"common.send":`enviar`,"common.newLine":`nueva línea`,"common.history":`historial`,"common.justNow":`ahora mismo`,"common.minutesAgo":`hace {count}m`,"common.hoursAgo":`hace {count}h`,"common.daysAgo":`hace {count}d`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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 elige el modelo óptimo`,"model.opus47ClassicDescription":`Último Opus, el más capaz`,"model.opus471mDescription":`Último Opus, contexto 1M`,"model.opusClassicDescription":`El más potente`,"model.opus1mDescription":`El más potente, contexto 1M`,"model.sonnetClassicDescription":`Equilibrado`,"model.sonnet1mDescription":`Equilibrado, contexto 1M`,"model.haikuDescription":`El más rápido`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recomendado para código complejo (requiere autenticación ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Alternativa por defecto — razonamiento sólido, compatible con clave API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rápido y eficiente — ideal para tareas reactivas y subagentes`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modelo especializado en código para ingeniería de software compleja`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Deja que el motor decida`,"reasoning.minimalDescription":`Razonamiento más rápido y superficial`,"reasoning.lowDescription":`Más rápido, menos profundidad`,"reasoning.mediumDescription":`Equilibrado`,"reasoning.highDescription":`Más profundidad`,"reasoning.xhighDescription":`Profundidad extendida, tareas largas`,"reasoning.maxDescription":`Profundidad máxima`,"agentPermissionMode.label":`Modo de permisos`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Aceptar ediciones`,"agentPermissionMode.interactive":`Interactivo`,"agentPermissionMode.tooltip":`Cómo gestiona el agente los permisos de las herramientas. Plan: solo lectura, sin escrituras. Bypass: omitir todas las preguntas. Estricto: auto-aceptar ediciones de archivos, respetar allow/deny para el resto. Interactivo: preguntar al usuario antes de cada herramienta mediante el panel de permisos.`,"agentPermissionMode.autoLoopOverride":`El auto-loop fuerza un modo distinto a Plan — Plan bloquea las herramientas MCP y las ediciones que el bucle necesita. Elige Bypass, Estricto o Interactivo.`,"agentPermissionMode.autoLoopLocked":`Bloqueado en Bypass mientras el auto-loop está activo — cualquier otro modo detendría el bucle en las preguntas de permiso. AskUserQuestion sigue funcionando.`,"workspaceList.title":`Workspaces`,"workspaceList.needsAttention":`Requiere atención`,"workspaceList.running":`En ejecución`,"workspaceList.idle":`Inactivo`,"workspaceList.archived":`Archivados`,"workspaceList.noWorkspaces":`Aún no hay workspaces`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} en ejecución`,"workspaceList.deleteDialog.title":`¿Eliminar workspace?`,"workspaceList.deleteDialog.deleteLocal":`Eliminar rama local`,"workspaceList.deleteDialog.deleteRemote":`Eliminar rama remota`,"workspaceList.deleteDialog.warning":`Advertencia: esta acción es irreversible en el remoto.`,"workspaceList.deleteArchivedDialog.tooltip":`Eliminar todos los workspaces archivados`,"workspaceList.deleteArchivedDialog.title":`¿Eliminar todos los workspaces archivados?`,"workspaceList.deleteArchivedDialog.message":`Esto eliminará permanentemente los {count} workspaces archivados. Esta acción no se puede deshacer.`,"workspacePage.selectWorkspace":`Selecciona un workspace para comenzar`,"workspacePage.session":`Sesión #{n}`,"workspacePage.newSession":`+ Nueva sesión`,"workspacePage.renameSession":`Renombrar`,"workspacePage.renameSessionTitle":`Renombrar sesión`,"workspacePage.sessionNameLabel":`Nombre de sesión`,"workspacePage.sessionEndedNotice":`Esta sesión ha terminado. Crea una nueva sesión para continuar.`,"workspacePage.renameFailed":`Error al renombrar`,"workspacePage.createSessionFailed":`Error al crear la sesión`,"workspacePage.startFailed":`Error al iniciar`,"workspacePage.stopFailed":`Error al detener`,"workspacePage.interrupt":`Interrumpir`,"workspacePage.interrupted":`Agente interrumpido — esperando tu próximo mensaje`,"workspacePage.interruptFailed":`Error al interrumpir`,"workspacePage.interruptTooltip":`Interrupción suave (como Escape) — detiene la herramienta actual pero mantiene la sesión activa`,"workspacePage.pendingNextRun":`Se aplicará en el próximo inicio`,"search.title":`Búsqueda`,"search.tooltip":`Buscar en el historial de agentes`,"search.placeholder":`Buscar en todos los mensajes de agentes…`,"search.includeArchived":`Incluir workspaces archivados`,"search.loading":`Buscando…`,"search.noResults":`Sin resultados`,"search.error":`Búsqueda fallida: {message}`,"search.resultCount":`{n} resultado(s)`,"search.eventType.userMessage":`Tú`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Aún no hay actividad`,"activityFeed.emptyHint":`Inicia un workspace para ver la salida del agente aquí`,"activityFeed.initialPrompt":`Prompt inicial`,"activityFeed.you":`Tú`,"activityFeed.agent":`Agente`,"activityFeed.question":`Pregunta`,"activityFeed.goToPrevious":`Ir al mensaje anterior`,"activityFeed.scrollToBottom":`Ir al final`,"activityFeed.sendAnswers":`Enviar respuestas`,"agentBusy.banner":`El agente está ocupado`,"agentBusy.subagentsRunning":`1 sub-agente en ejecución | {n} sub-agentes en ejecución`,"agentBusy.viewSubagents":`Ver sub-agentes`,"agentBusy.pendingMessage":`Esperando — el agente está ocupado`,"terminal.title":`Terminal`,"terminal.open":`Abrir terminal`,"terminal.close":`Cerrar terminal`,"terminal.noWorkspace":`Seleccione un espacio de trabajo`,"terminal.noWorktree":`Worktree aún no creado`,"terminal.error":`Error del terminal`,"terminal.exited":`Terminal cerrado`,"chatInput.placeholder":`Mensaje... (/ para skills)`,"chatInput.fileSearchHint":`buscar un archivo`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Adjuntar imagen`,"chatInput.queueBanner":`Mensaje en cola — se enviará cuando el agente termine`,"chatInput.cancelQueue":`Cancelar cola`,"chatInput.autoLoopBanner":`Auto-loop activo — deténlo para enviar un mensaje`,"chatInput.awaitingUserBanner":`El agente espera tu respuesta arriba — responde mediante el panel de la pregunta`,"chatInput.autoLoopStop":`Detener`,"koboCommand.checkProgressDesc":`Verificar el progreso de las tareas y criterios de aceptación`,"chatInput.uploading":`Subiendo...`,"voice.title":`Transcripción de voz`,"voice.enabled":`Activar transcripción de voz local`,"voice.pttKey":`Tecla push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espacio`,"voice.language":`Idioma (auto o código)`,"voice.model":`Modelo activo`,"voice.commandPath":`Ruta del binario Whisper (opcional)`,"voice.ffmpegPath":`Ruta del binario ffmpeg (opcional)`,"voice.temperature":`Temperatura`,"voice.temperatureHint":`Más bajo = más determinista; más alto = más flexible pero potencialmente menos estable.`,"voice.initialPrompt":`Prompt inicial (opcional)`,"voice.initialPromptHint":`Contexto opcional para ayudar a Whisper con nombres, siglas o vocabulario técnico.`,"voice.translateToEnglish":`Traducir al inglés`,"voice.translateToEnglishHint":`Si se activa, el audio no inglés se traduce al inglés en lugar de transcribirse tal cual.`,"voice.suppressNst":`Suprimir tokens no vocales`,"voice.suppressNstHint":`Intenta reducir artefactos no vocales en la transcripción.`,"voice.installLink":`Instalar whisper.cpp`,"voice.installGuideTitle":`Guía de instalación`,"voice.installGuideIntro":`Instala whisper.cpp y ffmpeg, luego configura las rutas de binarios abajo si hace falta.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Después del build con CMake, el binario de Whisper suele estar en: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Después, configura “Ruta del binario Whisper” y “Ruta del binario ffmpeg” en esta sección (o déjalo vacío si están en PATH).`,"voice.noneModel":`Sin modelo activo`,"voice.notInstalled":`no instalado`,"voice.download":`Descargar`,"voice.delete":`Eliminar`,"voice.holdToTalk":`Mantén pulsado para hablar`,"voice.recording":`Grabando...`,"voice.transcribing":`Transcribiendo...`,"voice.notSupported":`La grabación de voz no es compatible con este navegador`,"voice.errorMicPermission":`Permiso de micrófono denegado`,"voice.errorTranscription":`Falló la transcripción de voz`,"voice.downloadFailed":`Falló la descarga del modelo`,"voice.deleteFailed":`Falló la eliminación del modelo`,"voice.errorDisabled":`La transcripción de voz está desactivada en ajustes`,"voice.errorModelMissing":`No hay un modelo de voz activo configurado`,"voice.errorModelNotInstalled":`El modelo de voz activo no está instalado`,"voice.errorAudioInvalid":`La captura de audio es inválida o vacía`,"voice.errorLanguageInvalid":`La configuración del idioma de voz es inválida`,"voice.errorRuntimeMissing":`El runtime de Whisper no está instalado o no está en el PATH`,"voice.maxDurationReached":`Se alcanzó la duración máxima de grabación`,"voice.runtimeReady":`Runtime listo: {command}`,"voice.runtimeMissing":`Falta runtime: {command}`,"voice.ffmpegReady":`ffmpeg listo`,"voice.ffmpegMissing":`falta ffmpeg`,"voice.sectionRuntime":`Estado del runtime`,"voice.sectionActivation":`Activación`,"voice.sectionModels":`Modelos Whisper`,"voice.sectionAdvanced":`Opciones avanzadas`,"voice.sectionBehavior":`Comportamiento de la transcripción`,"voice.sectionBinaries":`Rutas de los binarios`,"voice.downloadModels":`Descargar un modelo`,"voice.cancelFailed":`No se pudo cancelar la descarga`,"createPage.title":`¿En qué te gustaría trabajar?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion activado`,"createPage.importNotion":`Importar desde Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`La URL debe empezar por https://www.notion.so/`,"createPage.notionAutoExtract":`Las subtareas y criterios de aceptación se extraerán automáticamente.`,"createPage.notionPanelChoiceLabel":`Esta URL apunta a una subpágina (?p=). ¿Sobre cuál quieres trabajar?`,"createPage.notionPanelOption":`Subpágina (panel)`,"createPage.notionPanelOptionDesc":`La página que estabas viendo — recomendado`,"createPage.notionParentOption":`Página principal`,"createPage.notionParentOptionDesc":`La épica / base de datos a la que pertenece`,"createPage.importSentry":`Importar Sentry`,"createPage.sentryEnabled":`Sentry activado`,"createPage.sentryPlaceholder":`https://tu-org.sentry.io/issues/123456`,"createPage.sentryValidation":`La URL debe apuntar a una issue de Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`La issue de Sentry se importará automáticamente`,"createPage.sentryExtractHint":`Kobo extraerá la issue y la escribirá en .ai/thoughts/`,"createPage.workspaceName":`Nombre del workspace (por defecto el título de la página Notion)`,"createPage.workspaceNamePlaceholder":`Nombre del workspace...`,"createPage.instructions":`Instrucciones adicionales (opcional)...`,"createPage.instructionsPlaceholder":`Describe la tarea...`,"createPage.manualHint":`¿Sin ticket Notion? Añade tus tareas y criterios de aceptación manualmente — se enviarán al agente Claude como contexto.`,"createPage.tasks":`Tareas ({count})`,"createPage.addTask":`Añadir una tarea...`,"createPage.acceptanceCriteria":`Criterios de aceptación ({count})`,"createPage.addCriterion":`Añadir un criterio...`,"createPage.projectPath":`Introduce la ruta del proyecto`,"createPage.branchType":`Tipo de rama`,"createPage.branch":`Rama`,"createPage.noBranches":`No se encontraron ramas`,"createPage.enterPath":`Introduce la ruta del proyecto`,"createPage.create":`Crear`,"createPage.skipSetupScript":`Omitir script de setup`,"createPage.attachWorktreeToggle":`Adjuntar worktree existente`,"createPage.attachWorktreeEnabled":`Reutilizando worktree existente`,"createPage.worktreePickerLabel":`Worktree existente`,"createPage.noOrphanWorktrees":`No hay worktrees huérfanos en este proyecto`,"createPage.pickWorktreeRequired":`Selecciona un worktree para adjuntar`,"createPage.notionExtractHint":`Las subtareas y criterios de aceptación se extraerán de la página Notion.`,"createPage.notionImportHint":`Haz clic en "Importar desde Notion" para extraer automáticamente las subtareas de un ticket.`,"createPage.errorCreating":`Error al crear el workspace.`,"createPage.validationNotionUrl":`Introduce una URL de Notion válida (https://www.notion.so/...).`,"createPage.validationDescription":`Describe la tarea.`,"createPage.validationName":`Indica un nombre para el workspace.`,"createPage.validationPath":`Introduce la ruta del proyecto.`,"createPage.validationBranch":`Selecciona una rama.`,"settings.title":`Ajustes`,"settings.language":`Idioma`,"settings.projectColor":`Color`,"settings.projectColorClear":`Borrar`,"settings.projectColorDefault":`Por defecto (gris)`,"settings.workspaceListSection":`Lista de workspaces`,"settings.flattenWorkspaceList":`Lista plana de workspaces`,"settings.flattenWorkspaceListHint":`Muestra todos los workspaces en una lista plana con una etiqueta de proyecto, en lugar de agruparlos por proyecto.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personalizado`,"settings.skillSuite.superpowersHint":`Workflow opinado TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Ambas suites se combinan — superpowers para la metodología (brainstorm / TDD / planes / revisión a nivel de principios), gstack para flujos concretos (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.customHint":`Edita los cuatro prompts a continuación tú mismo. Parte de la base agnóstica.`,"settings.skillSuite.reloadDefaults":`Restaurar predeterminados`,"settings.skillSuite.reloadDefaultsConfirm":`¿Reemplazar los cuatro prompts personalizados con los valores agnósticos predeterminados?`,"settings.skillSuite.customPrompts":`Prompts personalizados`,"settings.skillSuite.reviewTemplate":`Template de revisión`,"settings.skillSuite.autoLoopReviewGate":`Compuerta de revisión auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instrucción de la fase de brainstorming`,"settings.global":`Global`,"settings.projects":`Proyectos`,"settings.globalSettings":`Ajustes globales`,"settings.defaultModel":`Modelo por defecto`,"settings.defaultModelClaude":`Modelo por defecto (Claude Code)`,"settings.defaultModelCodex":`Modelo por defecto (OpenAI Codex)`,"settings.agentPermissions":`Permisos del agente`,"settings.skipPermissions":`Omitir solicitudes de permisos (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Advertencia: desactivar esto hará que todos los permisos de herramientas (Write, Edit, Bash...) se denieguen automáticamente en modo headless. El agente solo podrá leer.`,"settings.notifications":`Notificaciones`,"settings.browserNotifications":`Notificación del navegador cuando el agente termina`,"settings.audioNotifications":`Notificación sonora cuando el agente termina`,"settings.notificationSound":`Sonido de notificación`,"settings.notificationSoundPreview":`Escuchar`,"settings.notificationVolume":`Volumen`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Trabajo terminado`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Va a explotar`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.defaultPermissionMode":`Modo de permisos por defecto`,"settings.defaultPermissionModeClaude":`Modo de permisos por defecto (Claude Code)`,"settings.defaultPermissionModeCodex":`Modo de permisos por defecto (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modo aplicado al crear un workspace. Plan = solo lectura, Bypass = sin avisos, Estricto = auto-aceptar ediciones con allow-list, Interactivo = preguntar antes de cada herramienta.`,"settings.activityFeed":`Feed de actividad`,"settings.verboseMessages":`Mostrar mensajes detallados del sistema (task_progress, task_started)`,"settings.availableVariables":`Variables disponibles en las plantillas de prompt`,"settings.prPromptTemplate":`Plantilla de prompt PR`,"settings.prPromptPlaceholder":`Instrucciones para el agente al crear PRs en GitHub...`,"settings.prPromptHint":`Usa las variables listadas arriba (sintaxis de dobles llaves).`,"settings.reviewPromptTemplate":`Plantilla de prompt de revisión`,"settings.reviewPromptPlaceholder":`Instrucciones para el agente al revisar los cambios de la rama...`,"settings.notionInitialPrompt":`Prompt inicial de Notion`,"settings.notionInitialPrompt.help":`Se añade al prompt de creación del workspace cuando el workspace tiene un ticket de Notion. Variables: {variables}.`,"settings.notionInitialPrompt.project":`Prompt inicial de Notion (anulación)`,"settings.sentryInitialPrompt":`Prompt inicial de Sentry`,"settings.sentryInitialPrompt.help":`Se añade al prompt de creación del workspace cuando el workspace tiene una issue de Sentry. Variables: {variables}.`,"settings.sentryInitialPrompt.project":`Prompt inicial de Sentry (anulación)`,"settings.initialPrompt.inheritHint":`Dejar en blanco para heredar. Escribe un carácter en blanco para desactivar la inyección a este nivel.`,"settings.resetToDefault":`Restablecer`,"settings.resetFailed":`No se pudo cargar el valor por defecto`,"settings.sentryIntegration":`Integración Sentry`,"settings.var.prNumber":`Número de PR (ej: 42)`,"settings.var.prUrl":`URL completa de la PR creada`,"settings.var.branchName":`Nombre de la rama de trabajo`,"settings.var.sourceBranch":`Rama fuente a la que apunta la PR`,"settings.var.workspaceName":`Nombre del workspace`,"settings.var.projectName":`Último segmento de la ruta del proyecto`,"settings.var.notionUrl":`URL de Notion si está definida, vacía en caso contrario`,"settings.var.commits":`Lista de commits entre source y head`,"settings.var.diffStats":`Resumen shortstat de Git (archivos, inserciones, eliminaciones)`,"settings.var.tasks":`Tareas regulares como lista de verificación`,"settings.var.acceptanceCriteria":`Criterios de aceptación como lista de verificación`,"settings.gitConventions":`Convenciones Git (global)`,"settings.gitConventionsPlaceholder":`# Convenciones Git...`,"settings.gitConventionsHint":`Estas convenciones se escriben en .ai/.git-conventions.md en cada nuevo workspace y deben ser seguidas por el agente antes de cualquier operación Git. Se anulan con convenciones por proyecto si están definidas.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de limpieza`,"settings.archiveScript":`Script de archivado`,"settings.archiveScriptHint":`Script de shell ejecutado en el servidor en el worktree cuando se archiva un workspace. Dejar vacío para desactivar.`,"settings.archiveScriptPlaceholder":`p. ej. limpiar contenedores, liberar espacio en disco…`,"settings.changeSourceBranchScript":`Script para cambiar la rama de origen`,"settings.changeSourceBranchScript.help":`Reemplaza el cherry-pick integrado cuando no está vacío. El script gestiona git, base de la PR, force-push y conflictos; Kōbō solo rechaza si el agente está corriendo y actualiza los metadatos de la rama de origen en exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nueva rama de origen elegida en el diálogo
23
23
  KOBO_OLD_BASE — rama de origen anterior del workspace
24
24
  KOBO_WORKING_BRANCH — rama de trabajo del workspace
25
25
  KOBO_WORKTREE_PATH — ruta absoluta del worktree (también cwd)
@@ -29,7 +29,7 @@ KOBO_WORKSPACE_ID — id Kōbō del workspace (estable tras renombrar)
29
29
  KOBO_WORKSPACE_NAME — nombre visible del workspace
30
30
  KOBO_FORGE — forge resuelta: github / gitlab / none
31
31
  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
32
- # 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.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.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-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.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.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.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.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`,"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.runSetup":`Ejecutar script de setup`,"contextMenu.exportEvents":`Exportar eventos (CSV)`,"contextMenu.exportingEvents":`Preparando la exportación…`,"contextMenu.exportEventsError":`Error al exportar los eventos`,"contextMenu.openNotion":`Abrir en Notion`,"contextMenu.openSentry":`Abrir en Sentry`,"contextMenu.openPr":`Abrir PR`,"workspace.favorite":`Marcar como favorito`,"workspace.unfavorite":`Quitar de favoritos`,"workspace.showFavoritesOnly":`Mostrar solo favoritos`,"workspace.searchArchivedToggle":`Buscar también en workspaces archivados`,"workspace.descriptionPlaceholder":`Añadir una breve descripción`,"workspace.descriptionDialogHint":`Texto sin formato, máximo 200 caracteres. Dejar vacío para borrar.`,"workspace.descriptionTooLong":`La descripción debe tener 200 caracteres o menos.`,"workspace.descriptionSaveFailed":`No se pudo guardar la descripción.`,"workspace.agentDescriptionTooltip":`Estado en vivo mantenido por el agente`,"mcp.tool.setWorkspaceDescription":`Establece la breve descripción del workspace (≤ 200 caracteres).`,"tags.manage":`Gestionar etiquetas`,"tags.manageTitle":`Gestionar etiquetas del workspace`,"tags.noTagsDefined":`Sin etiquetas. Añádelas en Ajustes > Global > Etiquetas.`,"tags.orphanedHint":`{count} etiqueta(s) ya no están en el catálogo global. Desmárcalas para quitarlas.`,"settings.tagsTitle":`Etiquetas de workspace`,"settings.tagsHint":`Define las etiquetas asignables a los workspaces. Escribe para añadir, clic en la cruz para quitar.`,"settings.tagsLabel":`Etiquetas disponibles`,"settings.branchPrefixesTitle":`Prefijos de rama`,"settings.branchPrefixesHint":`Gestiona los prefijos de rama de Git disponibles en la página de creación de workspaces. El primero se preselecciona por defecto.`,"settings.branchPrefixesEmpty":`No hay ningún prefijo de rama definido. Añade al menos uno abajo.`,"settings.branchPrefixesAddLabel":`Nuevo prefijo`,"settings.branchPrefixesEditHint":`Haz clic para renombrar`,"settings.branchPrefixesMoveUp":`Subir`,"settings.branchPrefixesMoveDown":`Bajar`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Elige dónde se crean los worktrees de nuevos workspaces. Las rutas relativas se resuelven desde el proyecto; se admiten rutas absolutas Linux/macOS y Windows, $HOME, ~ y %USERPROFILE%.`,"settings.worktreesPathLabel":`Ruta de worktrees`,"settings.worktreesPathRequired":`La ruta de worktrees es obligatoria.`,"settings.worktreesPrefixByProject":`Prefijar los worktrees con el nombre del proyecto`,"settings.worktreesPrefixByProjectHint":`Coloca cada worktree en un subdirectorio con el nombre del proyecto para evitar colisiones cuando varios proyectos comparten la misma raíz.`,"settings.shareTitle":`Compartir configuración`,"settings.shareHint":`Exporta tus ajustes, plantillas y etiquetas en un bundle JSON. Las claves MCP no se incluyen por seguridad.`,"settings.exportConfig":`Exportar`,"settings.importConfig":`Importar`,"settings.exportSuccess":`Configuración exportada`,"settings.importSuccess":`Configuración importada`,"settings.importConfirmTitle":`Importar configuración`,"settings.importConfirmMessage":`Esto reemplazará tus ajustes, plantillas y etiquetas actuales. Las claves MCP se conservan. ¿Continuar?`,"health.title":`Salud`,"health.tooltip":`Estado del sistema`,"health.envTitle":`Entorno`,"health.version":`Versión`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de datos`,"health.dbPath":`Ruta`,"health.dbSize":`Tamaño`,"health.schemaVersion":`Versión del esquema`,"health.settingsSchemaVersion":`Esquema de ajustes`,"health.runtimesTitle":`Motores de agente`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude no encontrado en PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binario codex no resoluble`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} en total, {archived} archivados`,"health.worktreesMissing":`{count} worktree(s) faltan en el disco`,"health.sessionsTitle":`Sesiones de agente`,"health.sessionsOrphaned":`{n} sesión/sesiones huérfana(s) en ejecución`,"health.integrationsTitle":`Integraciones`,"health.integrationConfigured":`configurada`,"health.integrationMissing":`sin configurar`,"health.activeTitle":`Estado activo`,"health.activeQuotaBackoffs":`Quota backoffs pendientes`,"health.activeWakeups":`Despertares programados`,"health.activeAutoLoop":`Auto-loop en ejecución`,"health.activeAgentSessions":`Sesiones de agente activas`,"health.activeDevServers":`Servidores de desarrollo activos`,"health.noneActive":`Ninguno.`,"health.quotaResumeAt":`reanuda a las {time}`,"health.wakeupAt":`despierta a las {time}`,"health.startedAgo":`iniciada hace {time}`,"health.autoLoopReady":`listo, iterando`,"health.autoLoopGrooming":`grooming en curso`,"session.started":`Sesión iniciada`,"session.ended":`Sesión finalizada`,"session.compacted":`Contexto compactado`,"tool.running":`Ejecutando...`,"activity.raw_lines":`Líneas de salida brutas ({n})`,"activity.loading_older":`Cargando mensajes anteriores…`,"activity.prev_user_message":`Mensaje anterior del usuario`,"activity.scroll_to_bottom":`Desplazar al final`,"chat.systemPrompt":`Prompt del sistema`,"chat.agent":`Agente`,"chat.cleanupScript":`Script de limpieza`,"chat.archiveScript":`Script de archivado`,"chat.setupScript":`Script de setup`,"chat.scriptDone":`Hecho`,"chat.you":`Tú`,"chat.session":`Sesión`,"chat.nActions":`{n} acción | {n} acciones`,"chat.lastUpdatedAt":`Última actualización a las {time}`,"chat.scrollToTurnTop":`Desplazar al inicio del mensaje`,"migration.backing_up":`Haciendo copia de seguridad de la base de datos…`,"migration.running":`Migrando datos del agente — {processed}/{total}`,"migration.error":`La migración falló`,"migration.backup_location":`Se guardó una copia de seguridad en {path}. Reinicia Kōbō para reintentar.`,"migration.retry":`Reinicia Kōbō para reintentar.`,"engine.select":`Motor`,"engine.model":`Modelo`,"engine.effort":`Esfuerzo de razonamiento`,"wakeup.scheduledIn":`Próximo despertar en {n}s`,"wakeup.scheduledAt":`Próximo despertar a las {time}`,"wakeup.firing":`Despertando...`,"wakeup.reason":`Razón: {reason}`,"wakeup.cancel":`Cancelar este despertar`,"wakeup.pendingIndicator":`Despertar programado`,"cron.pendingIndicator":`{n} cron(s) programado(s)`,"schedule.tabLabel":`Programación`,"schedule.wakeupTitle":`Wakeup pendiente`,"schedule.cronsTitle":`Programaciones recurrentes`,"schedule.noWakeup":`Sin wakeup programado`,"schedule.noCrons":`Sin cron programado`,"schedule.nextFireAt":`próximo a las {time}`,"schedule.lastFiredAt":`último hace {time}`,"askUserQuestion.title":`El agente hace una pregunta`,"askUserQuestion.submit":`Enviar respuesta`,"askUserQuestion.multiSelectHint":`Selecciona una o más opciones`,"askUserQuestion.otherOption":`Otro`,"askUserQuestion.otherOptionHint":`especifíquelo en su próximo mensaje`,"askUserQuestion.noPending":`Ninguna pregunta pendiente`,"askUserQuestion.next":`Siguiente`,"askUserQuestion.previous":`Anterior`,"askUserQuestion.cancel":`Cancelar`,"askUserQuestion.cancelTooltip":`Saltar esta pregunta — el agente continuará sin respuesta`,"permissionRequest.title":`El agente quiere usar una herramienta`,"permissionRequest.allow":`Permitir`,"permissionRequest.deny":`Denegar`,"permissionRequest.tool":`Herramienta`,"permissionRequest.input":`Entrada`,"permissionRequest.denied":`denegado por el usuario`,"workspaceStatus.awaitingUser":`esperando tu respuesta`,"workspaceList.prOpen":`#{n} — Pull request abierta`,"workspaceList.prChangesRequested":`#{n} — Cambios solicitados`,"workspaceList.attentionCiFailed":`CI fallida`,"workspaceList.attentionChangesRequested":`Cambios solicitados`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Iniciar auto-loop`,"autoLoop.prepare":`Preparar para auto-loop`,"autoLoop.reprepare":`Volver a preparar para auto-loop`,"autoLoop.reprepareTooltip":`Volver a ejecutar la fase de grooming para añadir o refrescar tareas antes de reanudar el bucle`,"autoLoop.prepareBusy":`Espera a que el agente termine antes de preparar`,"autoLoop.forceReady":`Sé lo que hago — omitir preparación`,"autoLoop.forceReadyConfirm":`¿Omitir la preparación y marcar auto-loop listo? El loop puede quedarse bloqueado si las tareas no son atómicas.`,"autoLoop.stop":`Detener auto-loop`,"autoLoop.notReady":`Ejecute primero 'Preparar para auto-loop'`,"autoLoop.noTasks":`Añada tareas primero`,"autoLoop.progress":`Auto-loop · {done}/{total} tareas`,"autoLoop.preparing":`Auto-loop · preparando`,"autoLoop.preparingTooltip":`Preparación en curso — el agente está creando / revisando tareas. El bucle arrancará cuando llame a mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en ejecución`,"autoLoop.startInMode":`Iniciar en modo auto-loop`,"koboCommand.prepAutoloopDesc":`Preparar tareas para modo auto-loop (atomicidad)`,"staleSessionBanner.title":`Auto-loop en curso`,"staleSessionBanner.message":`Estás viendo una sesión anterior — el agente está trabajando en la más reciente.`,"staleSessionBanner.switchToCurrent":`Cambiar a la actual`},dn={"common.save":`Enregistrer`,"common.cancel":`Annuler`,"common.delete":`Supprimer`,"common.close":`Fermer`,"whatsNew.title":`Quoi de neuf`,"common.loading":`Chargement...`,"common.search":`Rechercher...`,"common.refresh":`Actualiser`,"common.copy":`Copier`,"common.copied":`Copié dans le presse-papiers`,"common.copyFailed":`Échec de la copie`,"common.add":`Ajouter`,"folderPicker.title":`Choisir un dossier`,"folderPicker.parent":`Dossier parent`,"folderPicker.empty":`Aucun sous-dossier`,"folderPicker.select":`Choisir ce dossier`,"common.start":`Démarrer`,"common.stop":`Arrêter`,"common.archive":`Archiver`,"common.unarchive":`Désarchiver`,"common.selectWorkspace":`Sélectionnez un espace de travail`,"common.noResults":`Aucun résultat pour « {query} »`,"common.send":`envoyer`,"common.newLine":`nouvelle ligne`,"common.history":`historique`,"common.justNow":`a l'instant`,"common.minutesAgo":`il y a {count}m`,"common.hoursAgo":`il y a {count}h`,"common.daysAgo":`il y a {count}j`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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 choisit le modèle optimal`,"model.opus47ClassicDescription":`Dernier Opus, le plus capable`,"model.opus471mDescription":`Dernier Opus, contexte 1M`,"model.opusClassicDescription":`Le plus puissant`,"model.opus1mDescription":`Le plus puissant, contexte 1M`,"model.sonnetClassicDescription":`Équilibré`,"model.sonnet1mDescription":`Équilibré, contexte 1M`,"model.haikuDescription":`Le plus rapide`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recommandé pour le code complexe (nécessite une authentification ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Repli par défaut — raisonnement solide, compatible avec une clé API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rapide et efficient — idéal pour les tâches réactives et les sous-agents`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modèle spécialisé code pour l'ingénierie logicielle complexe`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Laisse le moteur choisir`,"reasoning.minimalDescription":`Raisonnement le plus rapide et superficiel`,"reasoning.lowDescription":`Plus rapide, moins profond`,"reasoning.mediumDescription":`Équilibré`,"reasoning.highDescription":`Plus de profondeur`,"reasoning.xhighDescription":`Profondeur étendue, tâches longues`,"reasoning.maxDescription":`Profondeur maximale`,"agentPermissionMode.label":`Mode de permission`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Strict (édits)`,"agentPermissionMode.interactive":`Interactif`,"agentPermissionMode.tooltip":`Comment l'agent gère les permissions d'outils. Plan : lecture seule, aucune écriture. Bypass : aucune demande. Strict : auto-accept des éditions de fichiers, respect des allow/deny pour le reste. Interactif : demande à l'utilisateur avant chaque outil via le panneau de permission.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop force un mode autre que Plan — Plan bloque les outils MCP et les éditions dont la boucle a besoin. Choisis Bypass, Strict ou Interactif.`,"agentPermissionMode.autoLoopLocked":`Verrouillé sur Bypass tant que l'auto-loop est activé — un autre mode bloquerait la boucle sur les demandes de permission. AskUserQuestion fonctionne toujours.`,"workspaceList.title":`Espaces de travail`,"workspaceList.needsAttention":`Attention requise`,"workspaceList.running":`En cours`,"workspaceList.idle":`Inactif`,"workspaceList.archived":`Archivés`,"workspaceList.noWorkspaces":`Aucun espace de travail`,"workspaceList.footer":`{count} espace de travail | {count} espaces de travail`,"workspaceList.footerRunning":`{count} en cours`,"workspaceList.deleteDialog.title":`Supprimer l'espace de travail ?`,"workspaceList.deleteDialog.deleteLocal":`Supprimer la branche locale`,"workspaceList.deleteDialog.deleteRemote":`Supprimer la branche distante`,"workspaceList.deleteDialog.warning":`Attention : cette action est irréversible sur le dépôt distant.`,"workspaceList.deleteArchivedDialog.tooltip":`Supprimer tous les espaces de travail archivés`,"workspaceList.deleteArchivedDialog.title":`Supprimer tous les espaces archivés ?`,"workspaceList.deleteArchivedDialog.message":`Cela supprimera définitivement les {count} espaces de travail archivés. Cette action est irréversible.`,"workspacePage.selectWorkspace":`Sélectionnez un espace de travail pour commencer`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ Nouvelle session`,"workspacePage.renameSession":`Renommer`,"workspacePage.renameSessionTitle":`Renommer la session`,"workspacePage.sessionNameLabel":`Nom de la session`,"workspacePage.sessionEndedNotice":`Cette session est terminée. Crée une nouvelle session pour continuer.`,"workspacePage.renameFailed":`Échec du renommage`,"workspacePage.createSessionFailed":`Échec de la création de la session`,"workspacePage.startFailed":`Échec du démarrage`,"workspacePage.stopFailed":`Échec de l'arrêt`,"workspacePage.interrupt":`Interrompre`,"workspacePage.interrupted":`Agent interrompu — en attente de votre prochain message`,"workspacePage.interruptFailed":`Échec de l'interruption`,"workspacePage.interruptTooltip":`Interruption douce (comme Escape) — arrête le tool en cours mais garde la session active`,"workspacePage.pendingNextRun":`Appliqué au prochain démarrage`,"search.title":`Recherche`,"search.tooltip":`Rechercher dans l'historique des agents`,"search.placeholder":`Rechercher dans tous les messages agents…`,"search.includeArchived":`Inclure les workspaces archivés`,"search.loading":`Recherche en cours…`,"search.noResults":`Aucun résultat`,"search.error":`Échec de la recherche : {message}`,"search.resultCount":`{n} résultat(s)`,"search.eventType.userMessage":`Vous`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Aucune activité`,"activityFeed.emptyHint":`Démarrez un espace de travail pour voir la sortie de l'agent ici`,"activityFeed.initialPrompt":`Prompt initial`,"activityFeed.you":`Vous`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Aller au message précédent`,"activityFeed.scrollToBottom":`Défiler vers le bas`,"activityFeed.sendAnswers":`Envoyer les réponses`,"agentBusy.banner":`L'agent est occupé`,"agentBusy.subagentsRunning":`1 sub-agent en cours | {n} sub-agents en cours`,"agentBusy.viewSubagents":`Voir les sub-agents`,"agentBusy.pendingMessage":`En attente — l'agent est occupé`,"terminal.title":`Terminal`,"terminal.open":`Ouvrir le terminal`,"terminal.close":`Fermer le terminal`,"terminal.noWorkspace":`Sélectionnez un espace de travail`,"terminal.noWorktree":`Worktree pas encore créé`,"terminal.error":`Erreur du terminal`,"terminal.exited":`Terminal fermé`,"chatInput.placeholder":`Message... (/ pour les skills)`,"chatInput.fileSearchHint":`chercher un fichier`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Joindre une image`,"chatInput.queueBanner":`Message en file d'attente — sera envoyé quand l'agent aura terminé`,"chatInput.cancelQueue":`Annuler la file d'attente`,"chatInput.autoLoopBanner":`L'auto-loop tourne — arrête-le pour envoyer un message`,"chatInput.awaitingUserBanner":`L'agent attend ta réponse ci-dessus — réponds via le panneau de question`,"chatInput.autoLoopStop":`Arrêter`,"koboCommand.checkProgressDesc":`Vérifier la progression des tâches et critères d'acceptation`,"chatInput.uploading":`Envoi en cours...`,"voice.title":`Transcription vocale`,"voice.enabled":`Activer la transcription vocale locale`,"voice.pttKey":`Touche push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espace`,"voice.language":`Langue (auto ou code)`,"voice.model":`Modèle actif`,"voice.commandPath":`Chemin du binaire Whisper (optionnel)`,"voice.ffmpegPath":`Chemin du binaire ffmpeg (optionnel)`,"voice.temperature":`Température`,"voice.temperatureHint":`Plus bas = plus déterministe ; plus haut = plus flexible mais moins stable.`,"voice.initialPrompt":`Prompt initial (optionnel)`,"voice.initialPromptHint":`Contexte optionnel pour aider Whisper sur les noms, acronymes ou jargon métier.`,"voice.translateToEnglish":`Traduire vers anglais`,"voice.translateToEnglishHint":`Si activé, la parole non anglaise est traduite en anglais au lieu d’être transcrite telle quelle.`,"voice.suppressNst":`Supprimer les tokens non vocaux`,"voice.suppressNstHint":`Essaie de réduire les artefacts non vocaux dans la transcription.`,"voice.installLink":`Installer whisper.cpp`,"voice.installGuideTitle":`Guide d'installation`,"voice.installGuideIntro":`Installe whisper.cpp et ffmpeg, puis renseigne les chemins binaires ci-dessous si nécessaire.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Après le build CMake, le binaire Whisper est généralement ici : whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Ensuite, renseigne "Chemin du binaire Whisper" et "Chemin du binaire ffmpeg" dans cette section (ou laisse vide si c’est dans le PATH).`,"voice.noneModel":`Aucun modèle actif`,"voice.notInstalled":`non installé`,"voice.download":`Télécharger`,"voice.delete":`Supprimer`,"voice.holdToTalk":`Maintiens pour parler`,"voice.recording":`Enregistrement...`,"voice.transcribing":`Transcription...`,"voice.notSupported":`L'enregistrement vocal n'est pas supporté par ce navigateur`,"voice.errorMicPermission":`Permission micro refusée`,"voice.errorTranscription":`La transcription vocale a échoué`,"voice.downloadFailed":`Échec du téléchargement du modèle`,"voice.deleteFailed":`Échec de la suppression du modèle`,"voice.errorDisabled":`La transcription vocale est désactivée dans les réglages`,"voice.errorModelMissing":`Aucun modèle vocal actif n'est configuré`,"voice.errorModelNotInstalled":`Le modèle vocal actif n'est pas installé`,"voice.errorAudioInvalid":`La capture audio est invalide ou vide`,"voice.errorLanguageInvalid":`La configuration de langue vocale est invalide`,"voice.errorRuntimeMissing":`Le runtime Whisper n'est pas installé ou pas dans le PATH`,"voice.maxDurationReached":`Durée maximale d'enregistrement atteinte`,"voice.runtimeReady":`Runtime prêt : {command}`,"voice.runtimeMissing":`Runtime manquant : {command}`,"voice.ffmpegReady":`ffmpeg prêt`,"voice.ffmpegMissing":`ffmpeg manquant`,"voice.sectionRuntime":`État du runtime`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Modèles Whisper`,"voice.sectionAdvanced":`Options avancées`,"voice.sectionBehavior":`Comportement de la transcription`,"voice.sectionBinaries":`Chemins des binaires`,"voice.downloadModels":`Télécharger un modèle`,"voice.cancelFailed":`Échec de l'annulation du téléchargement`,"createPage.title":`Sur quoi souhaitez-vous travailler ?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion activé`,"createPage.importNotion":`Importer depuis Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL doit commencer par https://www.notion.so/`,"createPage.notionAutoExtract":`Les sous-tâches et critères d'acceptation seront extraits automatiquement.`,"createPage.notionPanelChoiceLabel":`Cette URL pointe vers une sous-page (?p=). Sur laquelle veux-tu travailler ?`,"createPage.notionPanelOption":`Sous-page (panel)`,"createPage.notionPanelOptionDesc":`La page que tu consultais — recommandé`,"createPage.notionParentOption":`Page parente`,"createPage.notionParentOptionDesc":`L'epic / database qui la contient`,"createPage.importSentry":`Importer Sentry`,"createPage.sentryEnabled":`Sentry activé`,"createPage.sentryPlaceholder":`https://votre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL doit pointer vers une issue Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue Sentry sera importée automatiquement`,"createPage.sentryExtractHint":`Kobo va extraire l'issue et l'écrire dans .ai/thoughts/`,"createPage.workspaceName":`Nom de l'espace de travail (par défaut le titre de la page Notion)`,"createPage.workspaceNamePlaceholder":`Nom de l'espace de travail...`,"createPage.instructions":`Instructions supplémentaires (optionnel)...`,"createPage.instructionsPlaceholder":`Décrivez la tâche...`,"createPage.manualHint":`Pas de ticket Notion ? Ajoutez vos tâches et critères d'acceptation manuellement — ils seront envoyés à l'agent Claude comme contexte.`,"createPage.tasks":`Tâches ({count})`,"createPage.addTask":`Ajouter une tâche...`,"createPage.acceptanceCriteria":`Critères d'acceptation ({count})`,"createPage.addCriterion":`Ajouter un critère...`,"createPage.projectPath":`Chemin du projet`,"createPage.branchType":`Type de branche`,"createPage.branch":`Branche`,"createPage.noBranches":`Aucune branche trouvée`,"createPage.enterPath":`Entrez le chemin du projet`,"createPage.create":`Créer`,"createPage.skipSetupScript":`Ignorer le script de setup`,"createPage.attachWorktreeToggle":`Réutiliser un worktree existant`,"createPage.attachWorktreeEnabled":`Worktree existant sélectionné`,"createPage.worktreePickerLabel":`Worktree existant`,"createPage.noOrphanWorktrees":`Aucun worktree orphelin pour ce projet`,"createPage.pickWorktreeRequired":`Sélectionne un worktree à réutiliser`,"createPage.notionExtractHint":`Les sous-tâches et critères d'acceptation seront extraits de la page Notion.`,"createPage.notionImportHint":`Cliquez sur « Importer depuis Notion » pour extraire automatiquement les sous-tâches d'un ticket.`,"createPage.errorCreating":`Erreur lors de la création de l'espace de travail.`,"createPage.validationNotionUrl":`Veuillez coller une URL Notion valide (https://www.notion.so/...).`,"createPage.validationDescription":`Veuillez décrire la tâche.`,"createPage.validationName":`Veuillez fournir un nom d'espace de travail.`,"createPage.validationPath":`Veuillez entrer le chemin du projet.`,"createPage.validationBranch":`Veuillez sélectionner une branche.`,"settings.title":`Paramètres`,"settings.language":`Langue`,"settings.projectColor":`Couleur`,"settings.projectColorClear":`Effacer`,"settings.projectColorDefault":`Par défaut (gris)`,"settings.workspaceListSection":`Liste des workspaces`,"settings.flattenWorkspaceList":`Afficher en liste plate`,"settings.flattenWorkspaceListHint":`Affiche tous les espaces de travail en liste plate avec un badge projet, plutôt que regroupés par projet.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personnalisé`,"settings.skillSuite.superpowersHint":`Workflow opiné TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Les deux suites s'empilent — superpowers pour la méthodo (brainstorm / TDD / plans / review au niveau principes), gstack pour les workflows concrets (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.customHint":`Édite les quatre prompts ci-dessous toi-même. Démarre depuis la base agnostique.`,"settings.skillSuite.reloadDefaults":`Recharger les valeurs par défaut`,"settings.skillSuite.reloadDefaultsConfirm":`Remplacer les quatre prompts personnalisés par les valeurs agnostiques par défaut ?`,"settings.skillSuite.customPrompts":`Prompts personnalisés`,"settings.skillSuite.reviewTemplate":`Template de relecture`,"settings.skillSuite.autoLoopReviewGate":`Gate de relecture auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instruction phase brainstorming`,"settings.global":`Général`,"settings.projects":`Projets`,"settings.globalSettings":`Paramètres généraux`,"settings.defaultModel":`Modèle par défaut`,"settings.defaultModelClaude":`Modèle par défaut (Claude Code)`,"settings.defaultModelCodex":`Modèle par défaut (OpenAI Codex)`,"settings.agentPermissions":`Permissions de l'agent`,"settings.skipPermissions":`Ignorer les invites de permission (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attention : désactiver cette option entraînera le refus automatique de toutes les permissions d'outils (Write, Edit, Bash...) en mode headless. L'agent ne pourra que lire.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Notification navigateur quand l'agent termine`,"settings.audioNotifications":`Notification sonore quand l'agent termine`,"settings.notificationSound":`Son de notification`,"settings.notificationSoundPreview":`Écouter`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Travail terminé`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Ça va péter`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.defaultPermissionMode":`Mode de permission par défaut`,"settings.defaultPermissionModeClaude":`Mode de permission par défaut (Claude Code)`,"settings.defaultPermissionModeCodex":`Mode de permission par défaut (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode appliqué à la création d'un workspace. Plan = lecture seule, Bypass = sans prompt, Strict = auto-accept des éditions avec allow-list, Interactif = demande avant chaque outil.`,"settings.activityFeed":`Flux d'activité`,"settings.verboseMessages":`Afficher les messages système détaillés (task_progress, task_started)`,"settings.availableVariables":`Variables disponibles dans les modèles de prompt`,"settings.prPromptTemplate":`Modèle de prompt PR`,"settings.prPromptPlaceholder":`Instructions pour l'agent lors de la création de PR GitHub...`,"settings.prPromptHint":`Utilisez les variables listées ci-dessus (syntaxe doubles accolades).`,"settings.reviewPromptTemplate":`Modèle de prompt de review`,"settings.reviewPromptPlaceholder":`Instructions pour l'agent lors de la review des changes de la branche...`,"settings.notionInitialPrompt":`Prompt initial Notion`,"settings.notionInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a un ticket Notion. Variables : {variables}.`,"settings.notionInitialPrompt.project":`Prompt initial Notion (override)`,"settings.sentryInitialPrompt":`Prompt initial Sentry`,"settings.sentryInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a une issue Sentry. Variables : {variables}.`,"settings.sentryInitialPrompt.project":`Prompt initial Sentry (override)`,"settings.initialPrompt.inheritHint":`Laisser vide pour hériter. Saisir un caractère d'espacement pour désactiver l'injection à ce niveau.`,"settings.resetToDefault":`Réinitialiser`,"settings.resetFailed":`Échec du chargement de la valeur par défaut`,"settings.sentryIntegration":`Intégration Sentry`,"settings.var.prNumber":`Numéro de PR (ex : 42)`,"settings.var.prUrl":`URL complète de la PR créée`,"settings.var.branchName":`Nom de la branche de travail`,"settings.var.sourceBranch":`Branche source ciblée par la PR`,"settings.var.workspaceName":`Nom du workspace`,"settings.var.projectName":`Dernier segment du chemin du projet`,"settings.var.notionUrl":`URL Notion si définie, vide sinon`,"settings.var.commits":`Liste à puces des commits entre source et head`,"settings.var.diffStats":`Résumé shortstat Git (fichiers, insertions, suppressions)`,"settings.var.tasks":`Tâches classiques en liste à cocher`,"settings.var.acceptanceCriteria":`Critères d'acceptation en liste à cocher`,"settings.gitConventions":`Conventions Git (global)`,"settings.gitConventionsPlaceholder":`# Conventions Git...`,"settings.gitConventionsHint":`Ces conventions sont écrites dans .ai/.git-conventions.md pour chaque nouvel espace de travail et doivent être respectées par l'agent avant toute opération Git. Remplacées par les conventions par projet si définies.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de cleanup`,"settings.archiveScript":`Script d'archivage`,"settings.archiveScriptHint":`Script shell exécuté côté serveur dans le worktree quand un workspace est archivé. Laisser vide pour désactiver.`,"settings.archiveScriptPlaceholder":`ex. nettoyer des conteneurs, libérer de l'espace disque…`,"settings.changeSourceBranchScript":`Script de changement de branche source`,"settings.changeSourceBranchScript.help":`Remplace le cherry-pick intégré quand non vide. Le script possède git, base de PR, force-push et conflits ; Kōbō refuse seulement si l'agent tourne et met à jour la métadonnée source à exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nouvelle branche source choisie dans le dialogue
32
+ # 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.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.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-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.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.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.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.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`,"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.runSetup":`Ejecutar script de setup`,"contextMenu.exportEvents":`Exportar eventos (CSV)`,"contextMenu.exportingEvents":`Preparando la exportación…`,"contextMenu.exportEventsError":`Error al exportar los eventos`,"contextMenu.openNotion":`Abrir en Notion`,"contextMenu.openSentry":`Abrir en Sentry`,"contextMenu.openPr":`Abrir PR`,"workspace.favorite":`Marcar como favorito`,"workspace.unfavorite":`Quitar de favoritos`,"workspace.showFavoritesOnly":`Mostrar solo favoritos`,"workspace.searchArchivedToggle":`Buscar también en workspaces archivados`,"workspace.descriptionPlaceholder":`Añadir una breve descripción`,"workspace.descriptionDialogHint":`Texto sin formato, máximo 200 caracteres. Dejar vacío para borrar.`,"workspace.descriptionTooLong":`La descripción debe tener 200 caracteres o menos.`,"workspace.descriptionSaveFailed":`No se pudo guardar la descripción.`,"workspace.agentDescriptionTooltip":`Estado en vivo mantenido por el agente`,"mcp.tool.setWorkspaceDescription":`Establece la breve descripción del workspace (≤ 200 caracteres).`,"tags.manage":`Gestionar etiquetas`,"tags.manageTitle":`Gestionar etiquetas del workspace`,"tags.noTagsDefined":`Sin etiquetas. Añádelas en Ajustes > Global > Etiquetas.`,"tags.orphanedHint":`{count} etiqueta(s) ya no están en el catálogo global. Desmárcalas para quitarlas.`,"settings.tagsTitle":`Etiquetas de workspace`,"settings.tagsHint":`Define las etiquetas asignables a los workspaces. Escribe para añadir, clic en la cruz para quitar.`,"settings.tagsLabel":`Etiquetas disponibles`,"settings.branchPrefixesTitle":`Prefijos de rama`,"settings.branchPrefixesHint":`Gestiona los prefijos de rama de Git disponibles en la página de creación de workspaces. El primero se preselecciona por defecto.`,"settings.branchPrefixesEmpty":`No hay ningún prefijo de rama definido. Añade al menos uno abajo.`,"settings.branchPrefixesAddLabel":`Nuevo prefijo`,"settings.branchPrefixesEditHint":`Haz clic para renombrar`,"settings.branchPrefixesMoveUp":`Subir`,"settings.branchPrefixesMoveDown":`Bajar`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Elige dónde se crean los worktrees de nuevos workspaces. Las rutas relativas se resuelven desde el proyecto; se admiten rutas absolutas Linux/macOS y Windows, $HOME, ~ y %USERPROFILE%.`,"settings.worktreesPathLabel":`Ruta de worktrees`,"settings.worktreesPathRequired":`La ruta de worktrees es obligatoria.`,"settings.worktreesPrefixByProject":`Prefijar los worktrees con el nombre del proyecto`,"settings.worktreesPrefixByProjectHint":`Coloca cada worktree en un subdirectorio con el nombre del proyecto para evitar colisiones cuando varios proyectos comparten la misma raíz.`,"settings.shareTitle":`Compartir configuración`,"settings.shareHint":`Exporta tus ajustes, plantillas y etiquetas en un bundle JSON. Las claves MCP no se incluyen por seguridad.`,"settings.exportConfig":`Exportar`,"settings.importConfig":`Importar`,"settings.exportSuccess":`Configuración exportada`,"settings.importSuccess":`Configuración importada`,"settings.importConfirmTitle":`Importar configuración`,"settings.importConfirmMessage":`Esto reemplazará tus ajustes, plantillas y etiquetas actuales. Las claves MCP se conservan. ¿Continuar?`,"health.title":`Salud`,"health.tooltip":`Estado del sistema`,"health.envTitle":`Entorno`,"health.version":`Versión`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de datos`,"health.dbPath":`Ruta`,"health.dbSize":`Tamaño`,"health.schemaVersion":`Versión del esquema`,"health.settingsSchemaVersion":`Esquema de ajustes`,"health.runtimesTitle":`Motores de agente`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude no encontrado en PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binario codex no resoluble`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} en total, {archived} archivados`,"health.worktreesMissing":`{count} worktree(s) faltan en el disco`,"health.sessionsTitle":`Sesiones de agente`,"health.sessionsOrphaned":`{n} sesión/sesiones huérfana(s) en ejecución`,"health.integrationsTitle":`Integraciones`,"health.integrationConfigured":`configurada`,"health.integrationMissing":`sin configurar`,"health.activeTitle":`Estado activo`,"health.activeQuotaBackoffs":`Quota backoffs pendientes`,"health.activeWakeups":`Despertares programados`,"health.activeAutoLoop":`Auto-loop en ejecución`,"health.activeAgentSessions":`Sesiones de agente activas`,"health.activeDevServers":`Servidores de desarrollo activos`,"health.noneActive":`Ninguno.`,"health.quotaResumeAt":`reanuda a las {time}`,"health.wakeupAt":`despierta a las {time}`,"health.startedAgo":`iniciada hace {time}`,"health.autoLoopReady":`listo, iterando`,"health.autoLoopGrooming":`grooming en curso`,"session.started":`Sesión iniciada`,"session.ended":`Sesión finalizada`,"session.compacted":`Contexto compactado`,"tool.running":`Ejecutando...`,"activity.raw_lines":`Líneas de salida brutas ({n})`,"activity.loading_older":`Cargando mensajes anteriores…`,"activity.prev_user_message":`Mensaje anterior del usuario`,"activity.scroll_to_bottom":`Desplazar al final`,"chat.systemPrompt":`Prompt del sistema`,"chat.agent":`Agente`,"chat.cleanupScript":`Script de limpieza`,"chat.archiveScript":`Script de archivado`,"chat.setupScript":`Script de setup`,"chat.scriptDone":`Hecho`,"chat.you":`Tú`,"chat.session":`Sesión`,"chat.nActions":`{n} acción | {n} acciones`,"chat.lastUpdatedAt":`Última actualización a las {time}`,"chat.scrollToTurnTop":`Desplazar al inicio del mensaje`,"migration.backing_up":`Haciendo copia de seguridad de la base de datos…`,"migration.running":`Migrando datos del agente — {processed}/{total}`,"migration.error":`La migración falló`,"migration.backup_location":`Se guardó una copia de seguridad en {path}. Reinicia Kōbō para reintentar.`,"migration.retry":`Reinicia Kōbō para reintentar.`,"engine.select":`Motor`,"engine.model":`Modelo`,"engine.effort":`Esfuerzo de razonamiento`,"wakeup.scheduledIn":`Próximo despertar en {n}s`,"wakeup.scheduledAt":`Próximo despertar a las {time}`,"wakeup.firing":`Despertando...`,"wakeup.reason":`Razón: {reason}`,"wakeup.cancel":`Cancelar este despertar`,"wakeup.pendingIndicator":`Despertar programado`,"cron.pendingIndicator":`{n} cron(s) programado(s)`,"schedule.tabLabel":`Programación`,"schedule.wakeupTitle":`Wakeup pendiente`,"schedule.cronsTitle":`Programaciones recurrentes`,"schedule.noWakeup":`Sin wakeup programado`,"schedule.noCrons":`Sin cron programado`,"schedule.nextFireAt":`próximo a las {time}`,"schedule.lastFiredAt":`último hace {time}`,"askUserQuestion.title":`El agente hace una pregunta`,"askUserQuestion.submit":`Enviar respuesta`,"askUserQuestion.multiSelectHint":`Selecciona una o más opciones`,"askUserQuestion.otherOption":`Otro`,"askUserQuestion.otherOptionHint":`especifíquelo en su próximo mensaje`,"askUserQuestion.noPending":`Ninguna pregunta pendiente`,"askUserQuestion.next":`Siguiente`,"askUserQuestion.previous":`Anterior`,"askUserQuestion.cancel":`Cancelar`,"askUserQuestion.cancelTooltip":`Saltar esta pregunta — el agente continuará sin respuesta`,"askUserQuestion.collapse":`Contraer el panel de pregunta`,"askUserQuestion.expand":`Expandir el panel de pregunta`,"permissionRequest.title":`El agente quiere usar una herramienta`,"permissionRequest.allow":`Permitir`,"permissionRequest.deny":`Denegar`,"permissionRequest.tool":`Herramienta`,"permissionRequest.input":`Entrada`,"permissionRequest.denied":`denegado por el usuario`,"workspaceStatus.awaitingUser":`esperando tu respuesta`,"workspaceList.prOpen":`#{n} — Pull request abierta`,"workspaceList.prChangesRequested":`#{n} — Cambios solicitados`,"workspaceList.attentionCiFailed":`CI fallida`,"workspaceList.attentionChangesRequested":`Cambios solicitados`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Iniciar auto-loop`,"autoLoop.prepare":`Preparar para auto-loop`,"autoLoop.reprepare":`Volver a preparar para auto-loop`,"autoLoop.reprepareTooltip":`Volver a ejecutar la fase de grooming para añadir o refrescar tareas antes de reanudar el bucle`,"autoLoop.prepareBusy":`Espera a que el agente termine antes de preparar`,"autoLoop.forceReady":`Sé lo que hago — omitir preparación`,"autoLoop.forceReadyConfirm":`¿Omitir la preparación y marcar auto-loop listo? El loop puede quedarse bloqueado si las tareas no son atómicas.`,"autoLoop.stop":`Detener auto-loop`,"autoLoop.notReady":`Ejecute primero 'Preparar para auto-loop'`,"autoLoop.noTasks":`Añada tareas primero`,"autoLoop.progress":`Auto-loop · {done}/{total} tareas`,"autoLoop.preparing":`Auto-loop · preparando`,"autoLoop.preparingTooltip":`Preparación en curso — el agente está creando / revisando tareas. El bucle arrancará cuando llame a mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en ejecución`,"autoLoop.startInMode":`Iniciar en modo auto-loop`,"koboCommand.prepAutoloopDesc":`Preparar tareas para modo auto-loop (atomicidad)`,"staleSessionBanner.title":`Auto-loop en curso`,"staleSessionBanner.message":`Estás viendo una sesión anterior — el agente está trabajando en la más reciente.`,"staleSessionBanner.switchToCurrent":`Cambiar a la actual`},dn={"common.save":`Enregistrer`,"common.cancel":`Annuler`,"common.delete":`Supprimer`,"common.close":`Fermer`,"whatsNew.title":`Quoi de neuf`,"common.loading":`Chargement...`,"common.search":`Rechercher...`,"common.refresh":`Actualiser`,"common.copy":`Copier`,"common.copied":`Copié dans le presse-papiers`,"common.copyFailed":`Échec de la copie`,"common.add":`Ajouter`,"folderPicker.title":`Choisir un dossier`,"folderPicker.parent":`Dossier parent`,"folderPicker.empty":`Aucun sous-dossier`,"folderPicker.select":`Choisir ce dossier`,"common.start":`Démarrer`,"common.stop":`Arrêter`,"common.archive":`Archiver`,"common.unarchive":`Désarchiver`,"common.selectWorkspace":`Sélectionnez un espace de travail`,"common.noResults":`Aucun résultat pour « {query} »`,"common.send":`envoyer`,"common.newLine":`nouvelle ligne`,"common.history":`historique`,"common.justNow":`a l'instant`,"common.minutesAgo":`il y a {count}m`,"common.hoursAgo":`il y a {count}h`,"common.daysAgo":`il y a {count}j`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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 choisit le modèle optimal`,"model.opus47ClassicDescription":`Dernier Opus, le plus capable`,"model.opus471mDescription":`Dernier Opus, contexte 1M`,"model.opusClassicDescription":`Le plus puissant`,"model.opus1mDescription":`Le plus puissant, contexte 1M`,"model.sonnetClassicDescription":`Équilibré`,"model.sonnet1mDescription":`Équilibré, contexte 1M`,"model.haikuDescription":`Le plus rapide`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Recommandé pour le code complexe (nécessite une authentification ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Repli par défaut — raisonnement solide, compatible avec une clé API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rapide et efficient — idéal pour les tâches réactives et les sous-agents`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modèle spécialisé code pour l'ingénierie logicielle complexe`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Laisse le moteur choisir`,"reasoning.minimalDescription":`Raisonnement le plus rapide et superficiel`,"reasoning.lowDescription":`Plus rapide, moins profond`,"reasoning.mediumDescription":`Équilibré`,"reasoning.highDescription":`Plus de profondeur`,"reasoning.xhighDescription":`Profondeur étendue, tâches longues`,"reasoning.maxDescription":`Profondeur maximale`,"agentPermissionMode.label":`Mode de permission`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Strict (édits)`,"agentPermissionMode.interactive":`Interactif`,"agentPermissionMode.tooltip":`Comment l'agent gère les permissions d'outils. Plan : lecture seule, aucune écriture. Bypass : aucune demande. Strict : auto-accept des éditions de fichiers, respect des allow/deny pour le reste. Interactif : demande à l'utilisateur avant chaque outil via le panneau de permission.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop force un mode autre que Plan — Plan bloque les outils MCP et les éditions dont la boucle a besoin. Choisis Bypass, Strict ou Interactif.`,"agentPermissionMode.autoLoopLocked":`Verrouillé sur Bypass tant que l'auto-loop est activé — un autre mode bloquerait la boucle sur les demandes de permission. AskUserQuestion fonctionne toujours.`,"workspaceList.title":`Espaces de travail`,"workspaceList.needsAttention":`Attention requise`,"workspaceList.running":`En cours`,"workspaceList.idle":`Inactif`,"workspaceList.archived":`Archivés`,"workspaceList.noWorkspaces":`Aucun espace de travail`,"workspaceList.footer":`{count} espace de travail | {count} espaces de travail`,"workspaceList.footerRunning":`{count} en cours`,"workspaceList.deleteDialog.title":`Supprimer l'espace de travail ?`,"workspaceList.deleteDialog.deleteLocal":`Supprimer la branche locale`,"workspaceList.deleteDialog.deleteRemote":`Supprimer la branche distante`,"workspaceList.deleteDialog.warning":`Attention : cette action est irréversible sur le dépôt distant.`,"workspaceList.deleteArchivedDialog.tooltip":`Supprimer tous les espaces de travail archivés`,"workspaceList.deleteArchivedDialog.title":`Supprimer tous les espaces archivés ?`,"workspaceList.deleteArchivedDialog.message":`Cela supprimera définitivement les {count} espaces de travail archivés. Cette action est irréversible.`,"workspacePage.selectWorkspace":`Sélectionnez un espace de travail pour commencer`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ Nouvelle session`,"workspacePage.renameSession":`Renommer`,"workspacePage.renameSessionTitle":`Renommer la session`,"workspacePage.sessionNameLabel":`Nom de la session`,"workspacePage.sessionEndedNotice":`Cette session est terminée. Crée une nouvelle session pour continuer.`,"workspacePage.renameFailed":`Échec du renommage`,"workspacePage.createSessionFailed":`Échec de la création de la session`,"workspacePage.startFailed":`Échec du démarrage`,"workspacePage.stopFailed":`Échec de l'arrêt`,"workspacePage.interrupt":`Interrompre`,"workspacePage.interrupted":`Agent interrompu — en attente de votre prochain message`,"workspacePage.interruptFailed":`Échec de l'interruption`,"workspacePage.interruptTooltip":`Interruption douce (comme Escape) — arrête le tool en cours mais garde la session active`,"workspacePage.pendingNextRun":`Appliqué au prochain démarrage`,"search.title":`Recherche`,"search.tooltip":`Rechercher dans l'historique des agents`,"search.placeholder":`Rechercher dans tous les messages agents…`,"search.includeArchived":`Inclure les workspaces archivés`,"search.loading":`Recherche en cours…`,"search.noResults":`Aucun résultat`,"search.error":`Échec de la recherche : {message}`,"search.resultCount":`{n} résultat(s)`,"search.eventType.userMessage":`Vous`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Aucune activité`,"activityFeed.emptyHint":`Démarrez un espace de travail pour voir la sortie de l'agent ici`,"activityFeed.initialPrompt":`Prompt initial`,"activityFeed.you":`Vous`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Aller au message précédent`,"activityFeed.scrollToBottom":`Défiler vers le bas`,"activityFeed.sendAnswers":`Envoyer les réponses`,"agentBusy.banner":`L'agent est occupé`,"agentBusy.subagentsRunning":`1 sub-agent en cours | {n} sub-agents en cours`,"agentBusy.viewSubagents":`Voir les sub-agents`,"agentBusy.pendingMessage":`En attente — l'agent est occupé`,"terminal.title":`Terminal`,"terminal.open":`Ouvrir le terminal`,"terminal.close":`Fermer le terminal`,"terminal.noWorkspace":`Sélectionnez un espace de travail`,"terminal.noWorktree":`Worktree pas encore créé`,"terminal.error":`Erreur du terminal`,"terminal.exited":`Terminal fermé`,"chatInput.placeholder":`Message... (/ pour les skills)`,"chatInput.fileSearchHint":`chercher un fichier`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Joindre une image`,"chatInput.queueBanner":`Message en file d'attente — sera envoyé quand l'agent aura terminé`,"chatInput.cancelQueue":`Annuler la file d'attente`,"chatInput.autoLoopBanner":`L'auto-loop tourne — arrête-le pour envoyer un message`,"chatInput.awaitingUserBanner":`L'agent attend ta réponse ci-dessus — réponds via le panneau de question`,"chatInput.autoLoopStop":`Arrêter`,"koboCommand.checkProgressDesc":`Vérifier la progression des tâches et critères d'acceptation`,"chatInput.uploading":`Envoi en cours...`,"voice.title":`Transcription vocale`,"voice.enabled":`Activer la transcription vocale locale`,"voice.pttKey":`Touche push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espace`,"voice.language":`Langue (auto ou code)`,"voice.model":`Modèle actif`,"voice.commandPath":`Chemin du binaire Whisper (optionnel)`,"voice.ffmpegPath":`Chemin du binaire ffmpeg (optionnel)`,"voice.temperature":`Température`,"voice.temperatureHint":`Plus bas = plus déterministe ; plus haut = plus flexible mais moins stable.`,"voice.initialPrompt":`Prompt initial (optionnel)`,"voice.initialPromptHint":`Contexte optionnel pour aider Whisper sur les noms, acronymes ou jargon métier.`,"voice.translateToEnglish":`Traduire vers anglais`,"voice.translateToEnglishHint":`Si activé, la parole non anglaise est traduite en anglais au lieu d’être transcrite telle quelle.`,"voice.suppressNst":`Supprimer les tokens non vocaux`,"voice.suppressNstHint":`Essaie de réduire les artefacts non vocaux dans la transcription.`,"voice.installLink":`Installer whisper.cpp`,"voice.installGuideTitle":`Guide d'installation`,"voice.installGuideIntro":`Installe whisper.cpp et ffmpeg, puis renseigne les chemins binaires ci-dessous si nécessaire.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Après le build CMake, le binaire Whisper est généralement ici : whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Ensuite, renseigne "Chemin du binaire Whisper" et "Chemin du binaire ffmpeg" dans cette section (ou laisse vide si c’est dans le PATH).`,"voice.noneModel":`Aucun modèle actif`,"voice.notInstalled":`non installé`,"voice.download":`Télécharger`,"voice.delete":`Supprimer`,"voice.holdToTalk":`Maintiens pour parler`,"voice.recording":`Enregistrement...`,"voice.transcribing":`Transcription...`,"voice.notSupported":`L'enregistrement vocal n'est pas supporté par ce navigateur`,"voice.errorMicPermission":`Permission micro refusée`,"voice.errorTranscription":`La transcription vocale a échoué`,"voice.downloadFailed":`Échec du téléchargement du modèle`,"voice.deleteFailed":`Échec de la suppression du modèle`,"voice.errorDisabled":`La transcription vocale est désactivée dans les réglages`,"voice.errorModelMissing":`Aucun modèle vocal actif n'est configuré`,"voice.errorModelNotInstalled":`Le modèle vocal actif n'est pas installé`,"voice.errorAudioInvalid":`La capture audio est invalide ou vide`,"voice.errorLanguageInvalid":`La configuration de langue vocale est invalide`,"voice.errorRuntimeMissing":`Le runtime Whisper n'est pas installé ou pas dans le PATH`,"voice.maxDurationReached":`Durée maximale d'enregistrement atteinte`,"voice.runtimeReady":`Runtime prêt : {command}`,"voice.runtimeMissing":`Runtime manquant : {command}`,"voice.ffmpegReady":`ffmpeg prêt`,"voice.ffmpegMissing":`ffmpeg manquant`,"voice.sectionRuntime":`État du runtime`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Modèles Whisper`,"voice.sectionAdvanced":`Options avancées`,"voice.sectionBehavior":`Comportement de la transcription`,"voice.sectionBinaries":`Chemins des binaires`,"voice.downloadModels":`Télécharger un modèle`,"voice.cancelFailed":`Échec de l'annulation du téléchargement`,"createPage.title":`Sur quoi souhaitez-vous travailler ?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion activé`,"createPage.importNotion":`Importer depuis Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL doit commencer par https://www.notion.so/`,"createPage.notionAutoExtract":`Les sous-tâches et critères d'acceptation seront extraits automatiquement.`,"createPage.notionPanelChoiceLabel":`Cette URL pointe vers une sous-page (?p=). Sur laquelle veux-tu travailler ?`,"createPage.notionPanelOption":`Sous-page (panel)`,"createPage.notionPanelOptionDesc":`La page que tu consultais — recommandé`,"createPage.notionParentOption":`Page parente`,"createPage.notionParentOptionDesc":`L'epic / database qui la contient`,"createPage.importSentry":`Importer Sentry`,"createPage.sentryEnabled":`Sentry activé`,"createPage.sentryPlaceholder":`https://votre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL doit pointer vers une issue Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue Sentry sera importée automatiquement`,"createPage.sentryExtractHint":`Kobo va extraire l'issue et l'écrire dans .ai/thoughts/`,"createPage.workspaceName":`Nom de l'espace de travail (par défaut le titre de la page Notion)`,"createPage.workspaceNamePlaceholder":`Nom de l'espace de travail...`,"createPage.instructions":`Instructions supplémentaires (optionnel)...`,"createPage.instructionsPlaceholder":`Décrivez la tâche...`,"createPage.manualHint":`Pas de ticket Notion ? Ajoutez vos tâches et critères d'acceptation manuellement — ils seront envoyés à l'agent Claude comme contexte.`,"createPage.tasks":`Tâches ({count})`,"createPage.addTask":`Ajouter une tâche...`,"createPage.acceptanceCriteria":`Critères d'acceptation ({count})`,"createPage.addCriterion":`Ajouter un critère...`,"createPage.projectPath":`Chemin du projet`,"createPage.branchType":`Type de branche`,"createPage.branch":`Branche`,"createPage.noBranches":`Aucune branche trouvée`,"createPage.enterPath":`Entrez le chemin du projet`,"createPage.create":`Créer`,"createPage.skipSetupScript":`Ignorer le script de setup`,"createPage.attachWorktreeToggle":`Réutiliser un worktree existant`,"createPage.attachWorktreeEnabled":`Worktree existant sélectionné`,"createPage.worktreePickerLabel":`Worktree existant`,"createPage.noOrphanWorktrees":`Aucun worktree orphelin pour ce projet`,"createPage.pickWorktreeRequired":`Sélectionne un worktree à réutiliser`,"createPage.notionExtractHint":`Les sous-tâches et critères d'acceptation seront extraits de la page Notion.`,"createPage.notionImportHint":`Cliquez sur « Importer depuis Notion » pour extraire automatiquement les sous-tâches d'un ticket.`,"createPage.errorCreating":`Erreur lors de la création de l'espace de travail.`,"createPage.validationNotionUrl":`Veuillez coller une URL Notion valide (https://www.notion.so/...).`,"createPage.validationDescription":`Veuillez décrire la tâche.`,"createPage.validationName":`Veuillez fournir un nom d'espace de travail.`,"createPage.validationPath":`Veuillez entrer le chemin du projet.`,"createPage.validationBranch":`Veuillez sélectionner une branche.`,"settings.title":`Paramètres`,"settings.language":`Langue`,"settings.projectColor":`Couleur`,"settings.projectColorClear":`Effacer`,"settings.projectColorDefault":`Par défaut (gris)`,"settings.workspaceListSection":`Liste des workspaces`,"settings.flattenWorkspaceList":`Afficher en liste plate`,"settings.flattenWorkspaceListHint":`Affiche tous les espaces de travail en liste plate avec un badge projet, plutôt que regroupés par projet.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personnalisé`,"settings.skillSuite.superpowersHint":`Workflow opiné TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Les deux suites s'empilent — superpowers pour la méthodo (brainstorm / TDD / plans / review au niveau principes), gstack pour les workflows concrets (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.customHint":`Édite les quatre prompts ci-dessous toi-même. Démarre depuis la base agnostique.`,"settings.skillSuite.reloadDefaults":`Recharger les valeurs par défaut`,"settings.skillSuite.reloadDefaultsConfirm":`Remplacer les quatre prompts personnalisés par les valeurs agnostiques par défaut ?`,"settings.skillSuite.customPrompts":`Prompts personnalisés`,"settings.skillSuite.reviewTemplate":`Template de relecture`,"settings.skillSuite.autoLoopReviewGate":`Gate de relecture auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instruction phase brainstorming`,"settings.global":`Général`,"settings.projects":`Projets`,"settings.globalSettings":`Paramètres généraux`,"settings.defaultModel":`Modèle par défaut`,"settings.defaultModelClaude":`Modèle par défaut (Claude Code)`,"settings.defaultModelCodex":`Modèle par défaut (OpenAI Codex)`,"settings.agentPermissions":`Permissions de l'agent`,"settings.skipPermissions":`Ignorer les invites de permission (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attention : désactiver cette option entraînera le refus automatique de toutes les permissions d'outils (Write, Edit, Bash...) en mode headless. L'agent ne pourra que lire.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Notification navigateur quand l'agent termine`,"settings.audioNotifications":`Notification sonore quand l'agent termine`,"settings.notificationSound":`Son de notification`,"settings.notificationSoundPreview":`Écouter`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Travail terminé`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Ça va péter`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.defaultPermissionMode":`Mode de permission par défaut`,"settings.defaultPermissionModeClaude":`Mode de permission par défaut (Claude Code)`,"settings.defaultPermissionModeCodex":`Mode de permission par défaut (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode appliqué à la création d'un workspace. Plan = lecture seule, Bypass = sans prompt, Strict = auto-accept des éditions avec allow-list, Interactif = demande avant chaque outil.`,"settings.activityFeed":`Flux d'activité`,"settings.verboseMessages":`Afficher les messages système détaillés (task_progress, task_started)`,"settings.availableVariables":`Variables disponibles dans les modèles de prompt`,"settings.prPromptTemplate":`Modèle de prompt PR`,"settings.prPromptPlaceholder":`Instructions pour l'agent lors de la création de PR GitHub...`,"settings.prPromptHint":`Utilisez les variables listées ci-dessus (syntaxe doubles accolades).`,"settings.reviewPromptTemplate":`Modèle de prompt de review`,"settings.reviewPromptPlaceholder":`Instructions pour l'agent lors de la review des changes de la branche...`,"settings.notionInitialPrompt":`Prompt initial Notion`,"settings.notionInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a un ticket Notion. Variables : {variables}.`,"settings.notionInitialPrompt.project":`Prompt initial Notion (override)`,"settings.sentryInitialPrompt":`Prompt initial Sentry`,"settings.sentryInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a une issue Sentry. Variables : {variables}.`,"settings.sentryInitialPrompt.project":`Prompt initial Sentry (override)`,"settings.initialPrompt.inheritHint":`Laisser vide pour hériter. Saisir un caractère d'espacement pour désactiver l'injection à ce niveau.`,"settings.resetToDefault":`Réinitialiser`,"settings.resetFailed":`Échec du chargement de la valeur par défaut`,"settings.sentryIntegration":`Intégration Sentry`,"settings.var.prNumber":`Numéro de PR (ex : 42)`,"settings.var.prUrl":`URL complète de la PR créée`,"settings.var.branchName":`Nom de la branche de travail`,"settings.var.sourceBranch":`Branche source ciblée par la PR`,"settings.var.workspaceName":`Nom du workspace`,"settings.var.projectName":`Dernier segment du chemin du projet`,"settings.var.notionUrl":`URL Notion si définie, vide sinon`,"settings.var.commits":`Liste à puces des commits entre source et head`,"settings.var.diffStats":`Résumé shortstat Git (fichiers, insertions, suppressions)`,"settings.var.tasks":`Tâches classiques en liste à cocher`,"settings.var.acceptanceCriteria":`Critères d'acceptation en liste à cocher`,"settings.gitConventions":`Conventions Git (global)`,"settings.gitConventionsPlaceholder":`# Conventions Git...`,"settings.gitConventionsHint":`Ces conventions sont écrites dans .ai/.git-conventions.md pour chaque nouvel espace de travail et doivent être respectées par l'agent avant toute opération Git. Remplacées par les conventions par projet si définies.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de cleanup`,"settings.archiveScript":`Script d'archivage`,"settings.archiveScriptHint":`Script shell exécuté côté serveur dans le worktree quand un workspace est archivé. Laisser vide pour désactiver.`,"settings.archiveScriptPlaceholder":`ex. nettoyer des conteneurs, libérer de l'espace disque…`,"settings.changeSourceBranchScript":`Script de changement de branche source`,"settings.changeSourceBranchScript.help":`Remplace le cherry-pick intégré quand non vide. Le script possède git, base de PR, force-push et conflits ; Kōbō refuse seulement si l'agent tourne et met à jour la métadonnée source à exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nouvelle branche source choisie dans le dialogue
33
33
  KOBO_OLD_BASE — précédente branche source du workspace
34
34
  KOBO_WORKING_BRANCH — branche de travail du workspace
35
35
  KOBO_WORKTREE_PATH — chemin absolu du worktree (et cwd)
@@ -39,7 +39,7 @@ KOBO_WORKSPACE_ID — id Kōbō du workspace (stable après renommage)
39
39
  KOBO_WORKSPACE_NAME — nom affiché du workspace
40
40
  KOBO_FORGE — forge résolue : github / gitlab / none
41
41
  KOBO_PR_NUMBER — numéro de PR/MR sur la forge résolue (vide si aucune ouverte)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
42
- # 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.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.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-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.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.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.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.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`,"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.runSetup":`Lancer le script de setup`,"contextMenu.exportEvents":`Exporter les events (CSV)`,"contextMenu.exportingEvents":`Préparation de l'export…`,"contextMenu.exportEventsError":`Échec de l'export des events`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"contextMenu.openPr":`Ouvrir la PR`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"workspace.searchArchivedToggle":`Inclure les workspaces archivés dans la recherche`,"workspace.descriptionPlaceholder":`Ajouter une courte description`,"workspace.descriptionDialogHint":`Texte brut, 200 caractères maximum. Laisser vide pour effacer.`,"workspace.descriptionTooLong":`La description doit faire 200 caractères ou moins.`,"workspace.descriptionSaveFailed":`Échec de l'enregistrement de la description.`,"workspace.agentDescriptionTooltip":`État en direct maintenu par l'agent`,"mcp.tool.setWorkspaceDescription":`Définit la courte description du workspace (≤ 200 caractères).`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.branchPrefixesTitle":`Préfixes de branche`,"settings.branchPrefixesHint":`Gérez les préfixes de branche Git disponibles sur la page de création. Le premier est présélectionné par défaut.`,"settings.branchPrefixesEmpty":`Aucun préfixe de branche défini. Ajoutez-en au moins un ci-dessous.`,"settings.branchPrefixesAddLabel":`Nouveau préfixe`,"settings.branchPrefixesEditHint":`Cliquer pour renommer`,"settings.branchPrefixesMoveUp":`Monter`,"settings.branchPrefixesMoveDown":`Descendre`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Choisis où créer les worktrees des nouveaux workspaces. Les chemins relatifs sont résolus depuis le projet ; les chemins absolus Linux/macOS et Windows, $HOME, ~ et %USERPROFILE% sont supportés.`,"settings.worktreesPathLabel":`Chemin des worktrees`,"settings.worktreesPathRequired":`Le chemin des worktrees est requis.`,"settings.worktreesPrefixByProject":`Préfixer les worktrees par le nom du projet`,"settings.worktreesPrefixByProjectHint":`Place chaque worktree dans un sous-dossier nommé d'après le projet, pour éviter les collisions quand plusieurs projets partagent la même racine.`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"health.envTitle":`Environnement`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.settingsSchemaVersion":`Schéma settings`,"health.runtimesTitle":`Moteurs d'agent`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude introuvable dans le PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binaire codex introuvable`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"health.activeTitle":`État actif`,"health.activeQuotaBackoffs":`Quota backoffs en attente`,"health.activeWakeups":`Wakeups programmés`,"health.activeAutoLoop":`Auto-loop en cours`,"health.activeAgentSessions":`Sessions agent en cours`,"health.activeDevServers":`Serveurs de dev lancés`,"health.noneActive":`Aucun.`,"health.quotaResumeAt":`reprise à {time}`,"health.wakeupAt":`réveil à {time}`,"health.startedAgo":`démarré il y a {time}`,"health.autoLoopReady":`prêt, itération en cours`,"health.autoLoopGrooming":`grooming en cours`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"chat.systemPrompt":`Prompt système`,"chat.agent":`Agent`,"chat.cleanupScript":`Script de cleanup`,"chat.archiveScript":`Script d'archivage`,"chat.setupScript":`Script de setup`,"chat.scriptDone":`Fait`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"cron.pendingIndicator":`{n} cron(s) programmé(s)`,"schedule.tabLabel":`Programmation`,"schedule.wakeupTitle":`Wakeup en attente`,"schedule.cronsTitle":`Tâches récurrentes`,"schedule.noWakeup":`Aucun wakeup programmé`,"schedule.noCrons":`Aucun cron programmé`,"schedule.nextFireAt":`prochain à {time}`,"schedule.lastFiredAt":`dernier fire il y a {time}`,"askUserQuestion.title":`L'agent te pose une question`,"askUserQuestion.submit":`Envoyer la réponse`,"askUserQuestion.multiSelectHint":`Sélectionne une ou plusieurs options`,"askUserQuestion.otherOption":`Autre`,"askUserQuestion.otherOptionHint":`précisez dans votre prochain message`,"askUserQuestion.noPending":`Aucune question en attente`,"askUserQuestion.next":`Suivant`,"askUserQuestion.previous":`Précédent`,"askUserQuestion.cancel":`Annuler`,"askUserQuestion.cancelTooltip":`Sauter cette question — l'agent continuera sans réponse`,"permissionRequest.title":`L'agent veut utiliser un outil`,"permissionRequest.allow":`Autoriser`,"permissionRequest.deny":`Refuser`,"permissionRequest.tool":`Outil`,"permissionRequest.input":`Entrée`,"permissionRequest.denied":`refusé par l'utilisateur`,"workspaceStatus.awaitingUser":`en attente de ta réponse`,"workspaceList.prOpen":`#{n} — Pull request ouverte`,"workspaceList.prChangesRequested":`#{n} — Modifications demandées`,"workspaceList.attentionCiFailed":`CI en échec`,"workspaceList.attentionChangesRequested":`Modifications demandées`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.reprepare":`Re-préparer pour auto-loop`,"autoLoop.reprepareTooltip":`Relancer la phase de grooming pour ajouter ou rafraîchir les tâches avant de relancer la boucle`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`},fn={"common.save":`Salva`,"common.cancel":`Annulla`,"common.delete":`Elimina`,"common.close":`Chiudi`,"whatsNew.title":`Novità`,"common.loading":`Caricamento...`,"common.search":`Cerca...`,"common.refresh":`Aggiorna`,"common.copy":`Copia`,"common.copied":`Copiato negli appunti`,"common.copyFailed":`Copia non riuscita`,"common.add":`Aggiungi`,"folderPicker.title":`Scegli una cartella`,"folderPicker.parent":`Cartella superiore`,"folderPicker.empty":`Nessuna sottocartella`,"folderPicker.select":`Scegli questa cartella`,"common.start":`Avvia`,"common.stop":`Arresta`,"common.archive":`Archivia`,"common.unarchive":`Ripristina`,"common.selectWorkspace":`Seleziona un workspace`,"common.noResults":`Nessun risultato per "{query}"`,"common.send":`invia`,"common.newLine":`nuova riga`,"common.history":`cronologia`,"common.justNow":`adesso`,"common.minutesAgo":`{count}m fa`,"common.hoursAgo":`{count}h fa`,"common.daysAgo":`{count}g fa`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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 sceglie il modello ottimale`,"model.opus47ClassicDescription":`Ultimo Opus, il più capace`,"model.opus471mDescription":`Ultimo Opus, contesto 1M`,"model.opusClassicDescription":`Più potente`,"model.opus1mDescription":`Più potente, contesto 1M`,"model.sonnetClassicDescription":`Bilanciato`,"model.sonnet1mDescription":`Bilanciato, contesto 1M`,"model.haikuDescription":`Più veloce`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Consigliato per codice complesso (richiede autenticazione ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Ripiego predefinito — ragionamento solido, compatibile con chiave API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Veloce ed efficiente — ideale per attività reattive e subagenti`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modello specializzato in codice per ingegneria software complessa`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Lascia decidere al motore`,"reasoning.minimalDescription":`Ragionamento più veloce e superficiale`,"reasoning.lowDescription":`Più veloce, meno profondità`,"reasoning.mediumDescription":`Bilanciato`,"reasoning.highDescription":`Più profondità`,"reasoning.xhighDescription":`Profondità estesa, attività lunghe`,"reasoning.maxDescription":`Profondità massima`,"agentPermissionMode.label":`Modalità permessi`,"agentPermissionMode.plan":`Piano`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Accetta edit`,"agentPermissionMode.interactive":`Interattivo`,"agentPermissionMode.tooltip":`Come l'agente gestisce i permessi degli strumenti. Piano: sola lettura, nessuna scrittura. Bypass: salta tutte le richieste. Stretto: auto-accetta le edit dei file, rispetta le allow/deny per il resto. Interattivo: chiedi all'utente prima di ogni strumento tramite il pannello dei permessi.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop forza una modalità diversa da Piano — Piano blocca gli strumenti MCP e le edit di cui il loop ha bisogno. Scegli Bypass, Stretto o Interattivo.`,"agentPermissionMode.autoLoopLocked":`Bloccato su Bypass finché l'auto-loop è attivo — qualsiasi altra modalità fermerebbe il loop sulle richieste di permesso. AskUserQuestion funziona comunque.`,"workspaceList.title":`Workspace`,"workspaceList.needsAttention":`Richiede attenzione`,"workspaceList.running":`In esecuzione`,"workspaceList.idle":`Inattivo`,"workspaceList.archived":`Archiviati`,"workspaceList.noWorkspaces":`Nessun workspace ancora`,"workspaceList.footer":`{count} workspace | {count} workspace`,"workspaceList.footerRunning":`{count} in esecuzione`,"workspaceList.deleteDialog.title":`Eliminare il workspace?`,"workspaceList.deleteDialog.deleteLocal":`Elimina branch locale`,"workspaceList.deleteDialog.deleteRemote":`Elimina branch remoto`,"workspaceList.deleteDialog.warning":`Attenzione: questa azione è irreversibile sul remoto.`,"workspaceList.deleteArchivedDialog.tooltip":`Elimina tutti i workspace archiviati`,"workspaceList.deleteArchivedDialog.title":`Eliminare tutti i workspace archiviati?`,"workspaceList.deleteArchivedDialog.message":`Questa operazione eliminerà definitivamente i {count} workspace archiviati. L'azione è irreversibile.`,"workspacePage.selectWorkspace":`Seleziona un workspace per iniziare`,"workspacePage.session":`Sessione #{n}`,"workspacePage.newSession":`+ Nuova sessione`,"workspacePage.renameSession":`Rinomina`,"workspacePage.renameSessionTitle":`Rinomina sessione`,"workspacePage.sessionNameLabel":`Nome sessione`,"workspacePage.sessionEndedNotice":`Questa sessione è terminata. Crea una nuova sessione per continuare.`,"workspacePage.renameFailed":`Rinomina fallita`,"workspacePage.createSessionFailed":`Creazione sessione fallita`,"workspacePage.startFailed":`Avvio fallito`,"workspacePage.stopFailed":`Arresto fallito`,"workspacePage.interrupt":`Interrompi`,"workspacePage.interrupted":`Agente interrotto — in attesa del tuo prossimo messaggio`,"workspacePage.interruptFailed":`Interruzione fallita`,"workspacePage.interruptTooltip":`Interruzione leggera (come Escape) — ferma lo strumento corrente ma mantiene la sessione attiva`,"workspacePage.pendingNextRun":`Applicato al prossimo avvio`,"search.title":`Ricerca`,"search.tooltip":`Cerca nella cronologia degli agenti`,"search.placeholder":`Cerca in tutti i messaggi degli agenti…`,"search.includeArchived":`Includi workspace archiviati`,"search.loading":`Ricerca in corso…`,"search.noResults":`Nessun risultato`,"search.error":`Ricerca fallita: {message}`,"search.resultCount":`{n} risultato/i`,"search.eventType.userMessage":`Tu`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Nessuna attività ancora`,"activityFeed.emptyHint":`Avvia un workspace per vedere l'output dell'agente qui`,"activityFeed.initialPrompt":`Prompt iniziale`,"activityFeed.you":`Tu`,"activityFeed.agent":`Agente`,"activityFeed.question":`Domanda`,"activityFeed.goToPrevious":`Vai al messaggio precedente`,"activityFeed.scrollToBottom":`Vai in fondo`,"activityFeed.sendAnswers":`Invia risposte`,"agentBusy.banner":`L'agente è occupato`,"agentBusy.subagentsRunning":`1 sub-agente in esecuzione | {n} sub-agenti in esecuzione`,"agentBusy.viewSubagents":`Vedi sub-agenti`,"agentBusy.pendingMessage":`In attesa — l'agente è occupato`,"terminal.title":`Terminale`,"terminal.open":`Apri terminale`,"terminal.close":`Chiudi terminale`,"terminal.noWorkspace":`Seleziona un workspace`,"terminal.noWorktree":`Worktree non ancora creato`,"terminal.error":`Errore del terminale`,"terminal.exited":`Terminale chiuso`,"chatInput.placeholder":`Messaggio... (/ per le skill)`,"chatInput.fileSearchHint":`cercare un file`,"chatInput.skills":`Skill`,"chatInput.attachImage":`Allega immagine`,"chatInput.queueBanner":`Messaggio in coda — verrà inviato quando l'agente avrà terminato`,"chatInput.cancelQueue":`Annulla coda`,"chatInput.autoLoopBanner":`Auto-loop attivo — fermalo per inviare un messaggio`,"chatInput.awaitingUserBanner":`L'agente attende la tua risposta sopra — rispondi tramite il pannello della domanda`,"chatInput.autoLoopStop":`Ferma`,"koboCommand.checkProgressDesc":`Verificare il progresso delle attività e dei criteri di accettazione`,"chatInput.uploading":`Caricamento...`,"voice.title":`Trascrizione vocale`,"voice.enabled":`Abilita trascrizione vocale locale`,"voice.pttKey":`Tasto push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Spazio`,"voice.language":`Lingua (auto o codice)`,"voice.model":`Modello attivo`,"voice.commandPath":`Percorso binario Whisper (opzionale)`,"voice.ffmpegPath":`Percorso binario ffmpeg (opzionale)`,"voice.temperature":`Temperatura`,"voice.temperatureHint":`Più basso = più deterministico; più alto = più flessibile ma potenzialmente meno stabile.`,"voice.initialPrompt":`Prompt iniziale (opzionale)`,"voice.initialPromptHint":`Contesto opzionale per aiutare Whisper con nomi propri, sigle o vocabolario tecnico.`,"voice.translateToEnglish":`Traduci in inglese`,"voice.translateToEnglishHint":`Se attivo, il parlato non inglese viene tradotto in inglese invece di essere trascritto così com’è.`,"voice.suppressNst":`Sopprimi token non vocali`,"voice.suppressNstHint":`Prova a ridurre artefatti non vocali nella trascrizione.`,"voice.installLink":`Installa whisper.cpp`,"voice.installGuideTitle":`Guida installazione`,"voice.installGuideIntro":`Installa whisper.cpp e ffmpeg, poi imposta i percorsi dei binari qui sotto se necessario.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Dopo il build con CMake, il binario Whisper di solito è in: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Poi imposta “Percorso binario Whisper” e “Percorso binario ffmpeg” in questa sezione (o lascia vuoto se sono nel PATH).`,"voice.noneModel":`Nessun modello attivo`,"voice.notInstalled":`non installato`,"voice.download":`Scarica`,"voice.delete":`Elimina`,"voice.holdToTalk":`Tieni premuto per parlare`,"voice.recording":`Registrazione...`,"voice.transcribing":`Trascrizione...`,"voice.notSupported":`La registrazione vocale non è supportata da questo browser`,"voice.errorMicPermission":`Permesso microfono negato`,"voice.errorTranscription":`Trascrizione vocale non riuscita`,"voice.downloadFailed":`Download del modello non riuscito`,"voice.deleteFailed":`Eliminazione del modello non riuscita`,"voice.errorDisabled":`La trascrizione vocale è disattivata nelle impostazioni`,"voice.errorModelMissing":`Nessun modello vocale attivo configurato`,"voice.errorModelNotInstalled":`Il modello vocale attivo non è installato`,"voice.errorAudioInvalid":`La cattura audio è non valida o vuota`,"voice.errorLanguageInvalid":`La configurazione lingua vocale non è valida`,"voice.errorRuntimeMissing":`Il runtime Whisper non è installato o non è nel PATH`,"voice.maxDurationReached":`Durata massima di registrazione raggiunta`,"voice.runtimeReady":`Runtime pronto: {command}`,"voice.runtimeMissing":`Runtime mancante: {command}`,"voice.ffmpegReady":`ffmpeg pronto`,"voice.ffmpegMissing":`ffmpeg mancante`,"voice.sectionRuntime":`Stato del runtime`,"voice.sectionActivation":`Attivazione`,"voice.sectionModels":`Modelli Whisper`,"voice.sectionAdvanced":`Opzioni avanzate`,"voice.sectionBehavior":`Comportamento della trascrizione`,"voice.sectionBinaries":`Percorsi dei binari`,"voice.downloadModels":`Scarica un modello`,"voice.cancelFailed":`Annullamento del download non riuscito`,"createPage.title":`Su cosa vorresti lavorare?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion attivato`,"createPage.importNotion":`Importa da Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL deve iniziare con https://www.notion.so/`,"createPage.notionAutoExtract":`Le sottotask e i criteri di accettazione verranno estratti automaticamente.`,"createPage.notionPanelChoiceLabel":`Questo URL punta a una sotto-pagina (?p=). Su quale vuoi lavorare?`,"createPage.notionPanelOption":`Sotto-pagina (panel)`,"createPage.notionPanelOptionDesc":`La pagina che stavi visualizzando — consigliato`,"createPage.notionParentOption":`Pagina principale`,"createPage.notionParentOptionDesc":`L'epic / database a cui appartiene`,"createPage.importSentry":`Importa Sentry`,"createPage.sentryEnabled":`Sentry attivato`,"createPage.sentryPlaceholder":`https://tua-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL deve puntare a una issue di Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue di Sentry verrà importata automaticamente`,"createPage.sentryExtractHint":`Kobo estrarrà l'issue e la scriverà in .ai/thoughts/`,"createPage.workspaceName":`Nome del workspace (predefinito: titolo della pagina Notion)`,"createPage.workspaceNamePlaceholder":`Nome del workspace...`,"createPage.instructions":`Istruzioni aggiuntive (opzionale)...`,"createPage.instructionsPlaceholder":`Descrivi il task...`,"createPage.manualHint":`Nessun ticket Notion? Aggiungi i tuoi task e criteri di accettazione manualmente — verranno inviati all'agente Claude come contesto.`,"createPage.tasks":`Task ({count})`,"createPage.addTask":`Aggiungi un task...`,"createPage.acceptanceCriteria":`Criteri di accettazione ({count})`,"createPage.addCriterion":`Aggiungi un criterio...`,"createPage.projectPath":`Inserisci il percorso del progetto`,"createPage.branchType":`Tipo di branch`,"createPage.branch":`Branch`,"createPage.noBranches":`Nessun branch trovato`,"createPage.enterPath":`Inserisci il percorso del progetto`,"createPage.create":`Crea`,"createPage.skipSetupScript":`Salta script di setup`,"createPage.attachWorktreeToggle":`Aggancia worktree esistente`,"createPage.attachWorktreeEnabled":`Riutilizzo worktree esistente`,"createPage.worktreePickerLabel":`Worktree esistente`,"createPage.noOrphanWorktrees":`Nessun worktree orfano in questo progetto`,"createPage.pickWorktreeRequired":`Seleziona un worktree da agganciare`,"createPage.notionExtractHint":`Le sottotask e i criteri di accettazione verranno estratti dalla pagina Notion.`,"createPage.notionImportHint":`Clicca su "Importa da Notion" per estrarre automaticamente le sottotask da un ticket.`,"createPage.errorCreating":`Errore durante la creazione del workspace.`,"createPage.validationNotionUrl":`Inserisci un URL Notion valido (https://www.notion.so/...).`,"createPage.validationDescription":`Descrivi il task.`,"createPage.validationName":`Indica un nome per il workspace.`,"createPage.validationPath":`Inserisci il percorso del progetto.`,"createPage.validationBranch":`Seleziona un branch.`,"settings.title":`Impostazioni`,"settings.language":`Lingua`,"settings.projectColor":`Colore`,"settings.projectColorClear":`Cancella`,"settings.projectColorDefault":`Predefinito (grigio)`,"settings.workspaceListSection":`Lista dei workspace`,"settings.flattenWorkspaceList":`Lista piatta dei workspace`,"settings.flattenWorkspaceListHint":`Mostra tutti i workspace in una lista piatta con un badge progetto, invece di raggrupparli per progetto.`,"settings.skillSuite.section":`Suite di skill`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personalizzato`,"settings.skillSuite.superpowersHint":`Workflow opinionato TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite di Garry Tan — /review, /ship, /qa, /office-hours, ecc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Le due suite si combinano — superpowers per la metodologia (brainstorm / TDD / piani / review a livello di principi), gstack per i flussi concreti (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.customHint":`Modifica i quattro prompt qui sotto tu stesso. Parte dalla base agnostica.`,"settings.skillSuite.reloadDefaults":`Ripristina predefiniti`,"settings.skillSuite.reloadDefaultsConfirm":`Sostituire i quattro prompt personalizzati con i valori agnostici predefiniti?`,"settings.skillSuite.customPrompts":`Prompt personalizzati`,"settings.skillSuite.reviewTemplate":`Template di review`,"settings.skillSuite.autoLoopReviewGate":`Gate di review auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro di grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Istruzione fase di brainstorming`,"settings.global":`Globale`,"settings.projects":`Progetti`,"settings.globalSettings":`Impostazioni globali`,"settings.defaultModel":`Modello predefinito`,"settings.defaultModelClaude":`Modello predefinito (Claude Code)`,"settings.defaultModelCodex":`Modello predefinito (OpenAI Codex)`,"settings.agentPermissions":`Permessi dell'agente`,"settings.skipPermissions":`Salta le richieste di permesso (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attenzione: disattivando questa opzione, tutti i permessi degli strumenti (Write, Edit, Bash...) verranno negati automaticamente in modalità headless. L'agente potrà solo leggere.`,"settings.notifications":`Notifiche`,"settings.browserNotifications":`Notifica browser quando l'agente termina`,"settings.audioNotifications":`Notifica sonora quando l'agente termina`,"settings.notificationSound":`Suono di notifica`,"settings.notificationSoundPreview":`Ascolta`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Lavoro finito`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Sta per esplodere`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.defaultPermissionMode":`Modalità permessi predefinita`,"settings.defaultPermissionModeClaude":`Modalità permessi predefinita (Claude Code)`,"settings.defaultPermissionModeCodex":`Modalità permessi predefinita (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modalità applicata alla creazione di un workspace. Piano = sola lettura, Bypass = senza richieste, Stretto = auto-accetta le edit con allow-list, Interattivo = chiedi prima di ogni strumento.`,"settings.activityFeed":`Feed attività`,"settings.verboseMessages":`Mostra messaggi di sistema dettagliati (task_progress, task_started)`,"settings.availableVariables":`Variabili disponibili nei template del prompt`,"settings.prPromptTemplate":`Template del prompt PR`,"settings.prPromptPlaceholder":`Istruzioni per l'agente durante la creazione di PR su GitHub...`,"settings.prPromptHint":`Usa le variabili elencate sopra (sintassi doppia parentesi graffa).`,"settings.reviewPromptTemplate":`Template del prompt di revisione`,"settings.reviewPromptPlaceholder":`Istruzioni per l'agente durante la revisione delle modifiche del branch...`,"settings.notionInitialPrompt":`Prompt iniziale Notion`,"settings.notionInitialPrompt.help":`Aggiunto al prompt di creazione del workspace quando il workspace ha un ticket Notion. Variabili: {variables}.`,"settings.notionInitialPrompt.project":`Prompt iniziale Notion (override)`,"settings.sentryInitialPrompt":`Prompt iniziale Sentry`,"settings.sentryInitialPrompt.help":`Aggiunto al prompt di creazione del workspace quando il workspace ha una issue Sentry. Variabili: {variables}.`,"settings.sentryInitialPrompt.project":`Prompt iniziale Sentry (override)`,"settings.initialPrompt.inheritHint":`Lasciare vuoto per ereditare. Digita un carattere di spazio bianco per disattivare l'iniezione a questo livello.`,"settings.resetToDefault":`Ripristina`,"settings.resetFailed":`Impossibile caricare il valore predefinito`,"settings.sentryIntegration":`Integrazione Sentry`,"settings.var.prNumber":`Numero della PR (es: 42)`,"settings.var.prUrl":`URL completo della PR creata`,"settings.var.branchName":`Nome del branch di lavoro`,"settings.var.sourceBranch":`Branch sorgente a cui punta la PR`,"settings.var.workspaceName":`Nome del workspace`,"settings.var.projectName":`Ultimo segmento del percorso del progetto`,"settings.var.notionUrl":`URL Notion se impostato, vuoto altrimenti`,"settings.var.commits":`Elenco puntato dei commit tra source e head`,"settings.var.diffStats":`Riepilogo shortstat Git (file, inserimenti, eliminazioni)`,"settings.var.tasks":`Attività regolari come lista di controllo`,"settings.var.acceptanceCriteria":`Criteri di accettazione come lista di controllo`,"settings.gitConventions":`Convenzioni Git (globale)`,"settings.gitConventionsPlaceholder":`# Convenzioni Git...`,"settings.gitConventionsHint":`Queste convenzioni vengono scritte in .ai/.git-conventions.md in ogni nuovo workspace e devono essere seguite dall'agente prima di qualsiasi operazione Git. Sovrascritte dalle convenzioni per progetto se definite.`,"settings.setupScript":`Script di setup`,"settings.cleanupScript":`Script di pulizia`,"settings.archiveScript":`Script di archiviazione`,"settings.archiveScriptHint":`Script di shell eseguito lato server nel worktree quando un workspace viene archiviato. Lascia vuoto per disattivare.`,"settings.archiveScriptPlaceholder":`es. pulire container, liberare spazio su disco…`,"settings.changeSourceBranchScript":`Script di cambio del branch di origine`,"settings.changeSourceBranchScript.help":`Sostituisce il cherry-pick integrato quando non vuoto. Lo script gestisce git, base della PR, force-push e conflitti; Kōbō rifiuta solo se l'agente è in esecuzione e aggiorna i metadati del branch di origine all'uscita 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nuovo branch di origine scelto nella finestra di dialogo
42
+ # 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.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.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-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.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.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.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.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`,"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.runSetup":`Lancer le script de setup`,"contextMenu.exportEvents":`Exporter les events (CSV)`,"contextMenu.exportingEvents":`Préparation de l'export…`,"contextMenu.exportEventsError":`Échec de l'export des events`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"contextMenu.openPr":`Ouvrir la PR`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"workspace.searchArchivedToggle":`Inclure les workspaces archivés dans la recherche`,"workspace.descriptionPlaceholder":`Ajouter une courte description`,"workspace.descriptionDialogHint":`Texte brut, 200 caractères maximum. Laisser vide pour effacer.`,"workspace.descriptionTooLong":`La description doit faire 200 caractères ou moins.`,"workspace.descriptionSaveFailed":`Échec de l'enregistrement de la description.`,"workspace.agentDescriptionTooltip":`État en direct maintenu par l'agent`,"mcp.tool.setWorkspaceDescription":`Définit la courte description du workspace (≤ 200 caractères).`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.branchPrefixesTitle":`Préfixes de branche`,"settings.branchPrefixesHint":`Gérez les préfixes de branche Git disponibles sur la page de création. Le premier est présélectionné par défaut.`,"settings.branchPrefixesEmpty":`Aucun préfixe de branche défini. Ajoutez-en au moins un ci-dessous.`,"settings.branchPrefixesAddLabel":`Nouveau préfixe`,"settings.branchPrefixesEditHint":`Cliquer pour renommer`,"settings.branchPrefixesMoveUp":`Monter`,"settings.branchPrefixesMoveDown":`Descendre`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Choisis où créer les worktrees des nouveaux workspaces. Les chemins relatifs sont résolus depuis le projet ; les chemins absolus Linux/macOS et Windows, $HOME, ~ et %USERPROFILE% sont supportés.`,"settings.worktreesPathLabel":`Chemin des worktrees`,"settings.worktreesPathRequired":`Le chemin des worktrees est requis.`,"settings.worktreesPrefixByProject":`Préfixer les worktrees par le nom du projet`,"settings.worktreesPrefixByProjectHint":`Place chaque worktree dans un sous-dossier nommé d'après le projet, pour éviter les collisions quand plusieurs projets partagent la même racine.`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"health.envTitle":`Environnement`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.settingsSchemaVersion":`Schéma settings`,"health.runtimesTitle":`Moteurs d'agent`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude introuvable dans le PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binaire codex introuvable`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"health.activeTitle":`État actif`,"health.activeQuotaBackoffs":`Quota backoffs en attente`,"health.activeWakeups":`Wakeups programmés`,"health.activeAutoLoop":`Auto-loop en cours`,"health.activeAgentSessions":`Sessions agent en cours`,"health.activeDevServers":`Serveurs de dev lancés`,"health.noneActive":`Aucun.`,"health.quotaResumeAt":`reprise à {time}`,"health.wakeupAt":`réveil à {time}`,"health.startedAgo":`démarré il y a {time}`,"health.autoLoopReady":`prêt, itération en cours`,"health.autoLoopGrooming":`grooming en cours`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"chat.systemPrompt":`Prompt système`,"chat.agent":`Agent`,"chat.cleanupScript":`Script de cleanup`,"chat.archiveScript":`Script d'archivage`,"chat.setupScript":`Script de setup`,"chat.scriptDone":`Fait`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"cron.pendingIndicator":`{n} cron(s) programmé(s)`,"schedule.tabLabel":`Programmation`,"schedule.wakeupTitle":`Wakeup en attente`,"schedule.cronsTitle":`Tâches récurrentes`,"schedule.noWakeup":`Aucun wakeup programmé`,"schedule.noCrons":`Aucun cron programmé`,"schedule.nextFireAt":`prochain à {time}`,"schedule.lastFiredAt":`dernier fire il y a {time}`,"askUserQuestion.title":`L'agent te pose une question`,"askUserQuestion.submit":`Envoyer la réponse`,"askUserQuestion.multiSelectHint":`Sélectionne une ou plusieurs options`,"askUserQuestion.otherOption":`Autre`,"askUserQuestion.otherOptionHint":`précisez dans votre prochain message`,"askUserQuestion.noPending":`Aucune question en attente`,"askUserQuestion.next":`Suivant`,"askUserQuestion.previous":`Précédent`,"askUserQuestion.cancel":`Annuler`,"askUserQuestion.cancelTooltip":`Sauter cette question — l'agent continuera sans réponse`,"askUserQuestion.collapse":`Réduire le panneau de question`,"askUserQuestion.expand":`Agrandir le panneau de question`,"permissionRequest.title":`L'agent veut utiliser un outil`,"permissionRequest.allow":`Autoriser`,"permissionRequest.deny":`Refuser`,"permissionRequest.tool":`Outil`,"permissionRequest.input":`Entrée`,"permissionRequest.denied":`refusé par l'utilisateur`,"workspaceStatus.awaitingUser":`en attente de ta réponse`,"workspaceList.prOpen":`#{n} — Pull request ouverte`,"workspaceList.prChangesRequested":`#{n} — Modifications demandées`,"workspaceList.attentionCiFailed":`CI en échec`,"workspaceList.attentionChangesRequested":`Modifications demandées`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.reprepare":`Re-préparer pour auto-loop`,"autoLoop.reprepareTooltip":`Relancer la phase de grooming pour ajouter ou rafraîchir les tâches avant de relancer la boucle`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`},fn={"common.save":`Salva`,"common.cancel":`Annulla`,"common.delete":`Elimina`,"common.close":`Chiudi`,"whatsNew.title":`Novità`,"common.loading":`Caricamento...`,"common.search":`Cerca...`,"common.refresh":`Aggiorna`,"common.copy":`Copia`,"common.copied":`Copiato negli appunti`,"common.copyFailed":`Copia non riuscita`,"common.add":`Aggiungi`,"folderPicker.title":`Scegli una cartella`,"folderPicker.parent":`Cartella superiore`,"folderPicker.empty":`Nessuna sottocartella`,"folderPicker.select":`Scegli questa cartella`,"common.start":`Avvia`,"common.stop":`Arresta`,"common.archive":`Archivia`,"common.unarchive":`Ripristina`,"common.selectWorkspace":`Seleziona un workspace`,"common.noResults":`Nessun risultato per "{query}"`,"common.send":`invia`,"common.newLine":`nuova riga`,"common.history":`cronologia`,"common.justNow":`adesso`,"common.minutesAgo":`{count}m fa`,"common.hoursAgo":`{count}h fa`,"common.daysAgo":`{count}g fa`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"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 sceglie il modello ottimale`,"model.opus47ClassicDescription":`Ultimo Opus, il più capace`,"model.opus471mDescription":`Ultimo Opus, contesto 1M`,"model.opusClassicDescription":`Più potente`,"model.opus1mDescription":`Più potente, contesto 1M`,"model.sonnetClassicDescription":`Bilanciato`,"model.sonnet1mDescription":`Bilanciato, contesto 1M`,"model.haikuDescription":`Più veloce`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Consigliato per codice complesso (richiede autenticazione ChatGPT)`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Ripiego predefinito — ragionamento solido, compatibile con chiave API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Veloce ed efficiente — ideale per attività reattive e subagenti`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modello specializzato in codice per ingegneria software complessa`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Lascia decidere al motore`,"reasoning.minimalDescription":`Ragionamento più veloce e superficiale`,"reasoning.lowDescription":`Più veloce, meno profondità`,"reasoning.mediumDescription":`Bilanciato`,"reasoning.highDescription":`Più profondità`,"reasoning.xhighDescription":`Profondità estesa, attività lunghe`,"reasoning.maxDescription":`Profondità massima`,"agentPermissionMode.label":`Modalità permessi`,"agentPermissionMode.plan":`Piano`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Accetta edit`,"agentPermissionMode.interactive":`Interattivo`,"agentPermissionMode.tooltip":`Come l'agente gestisce i permessi degli strumenti. Piano: sola lettura, nessuna scrittura. Bypass: salta tutte le richieste. Stretto: auto-accetta le edit dei file, rispetta le allow/deny per il resto. Interattivo: chiedi all'utente prima di ogni strumento tramite il pannello dei permessi.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop forza una modalità diversa da Piano — Piano blocca gli strumenti MCP e le edit di cui il loop ha bisogno. Scegli Bypass, Stretto o Interattivo.`,"agentPermissionMode.autoLoopLocked":`Bloccato su Bypass finché l'auto-loop è attivo — qualsiasi altra modalità fermerebbe il loop sulle richieste di permesso. AskUserQuestion funziona comunque.`,"workspaceList.title":`Workspace`,"workspaceList.needsAttention":`Richiede attenzione`,"workspaceList.running":`In esecuzione`,"workspaceList.idle":`Inattivo`,"workspaceList.archived":`Archiviati`,"workspaceList.noWorkspaces":`Nessun workspace ancora`,"workspaceList.footer":`{count} workspace | {count} workspace`,"workspaceList.footerRunning":`{count} in esecuzione`,"workspaceList.deleteDialog.title":`Eliminare il workspace?`,"workspaceList.deleteDialog.deleteLocal":`Elimina branch locale`,"workspaceList.deleteDialog.deleteRemote":`Elimina branch remoto`,"workspaceList.deleteDialog.warning":`Attenzione: questa azione è irreversibile sul remoto.`,"workspaceList.deleteArchivedDialog.tooltip":`Elimina tutti i workspace archiviati`,"workspaceList.deleteArchivedDialog.title":`Eliminare tutti i workspace archiviati?`,"workspaceList.deleteArchivedDialog.message":`Questa operazione eliminerà definitivamente i {count} workspace archiviati. L'azione è irreversibile.`,"workspacePage.selectWorkspace":`Seleziona un workspace per iniziare`,"workspacePage.session":`Sessione #{n}`,"workspacePage.newSession":`+ Nuova sessione`,"workspacePage.renameSession":`Rinomina`,"workspacePage.renameSessionTitle":`Rinomina sessione`,"workspacePage.sessionNameLabel":`Nome sessione`,"workspacePage.sessionEndedNotice":`Questa sessione è terminata. Crea una nuova sessione per continuare.`,"workspacePage.renameFailed":`Rinomina fallita`,"workspacePage.createSessionFailed":`Creazione sessione fallita`,"workspacePage.startFailed":`Avvio fallito`,"workspacePage.stopFailed":`Arresto fallito`,"workspacePage.interrupt":`Interrompi`,"workspacePage.interrupted":`Agente interrotto — in attesa del tuo prossimo messaggio`,"workspacePage.interruptFailed":`Interruzione fallita`,"workspacePage.interruptTooltip":`Interruzione leggera (come Escape) — ferma lo strumento corrente ma mantiene la sessione attiva`,"workspacePage.pendingNextRun":`Applicato al prossimo avvio`,"search.title":`Ricerca`,"search.tooltip":`Cerca nella cronologia degli agenti`,"search.placeholder":`Cerca in tutti i messaggi degli agenti…`,"search.includeArchived":`Includi workspace archiviati`,"search.loading":`Ricerca in corso…`,"search.noResults":`Nessun risultato`,"search.error":`Ricerca fallita: {message}`,"search.resultCount":`{n} risultato/i`,"search.eventType.userMessage":`Tu`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Nessuna attività ancora`,"activityFeed.emptyHint":`Avvia un workspace per vedere l'output dell'agente qui`,"activityFeed.initialPrompt":`Prompt iniziale`,"activityFeed.you":`Tu`,"activityFeed.agent":`Agente`,"activityFeed.question":`Domanda`,"activityFeed.goToPrevious":`Vai al messaggio precedente`,"activityFeed.scrollToBottom":`Vai in fondo`,"activityFeed.sendAnswers":`Invia risposte`,"agentBusy.banner":`L'agente è occupato`,"agentBusy.subagentsRunning":`1 sub-agente in esecuzione | {n} sub-agenti in esecuzione`,"agentBusy.viewSubagents":`Vedi sub-agenti`,"agentBusy.pendingMessage":`In attesa — l'agente è occupato`,"terminal.title":`Terminale`,"terminal.open":`Apri terminale`,"terminal.close":`Chiudi terminale`,"terminal.noWorkspace":`Seleziona un workspace`,"terminal.noWorktree":`Worktree non ancora creato`,"terminal.error":`Errore del terminale`,"terminal.exited":`Terminale chiuso`,"chatInput.placeholder":`Messaggio... (/ per le skill)`,"chatInput.fileSearchHint":`cercare un file`,"chatInput.skills":`Skill`,"chatInput.attachImage":`Allega immagine`,"chatInput.queueBanner":`Messaggio in coda — verrà inviato quando l'agente avrà terminato`,"chatInput.cancelQueue":`Annulla coda`,"chatInput.autoLoopBanner":`Auto-loop attivo — fermalo per inviare un messaggio`,"chatInput.awaitingUserBanner":`L'agente attende la tua risposta sopra — rispondi tramite il pannello della domanda`,"chatInput.autoLoopStop":`Ferma`,"koboCommand.checkProgressDesc":`Verificare il progresso delle attività e dei criteri di accettazione`,"chatInput.uploading":`Caricamento...`,"voice.title":`Trascrizione vocale`,"voice.enabled":`Abilita trascrizione vocale locale`,"voice.pttKey":`Tasto push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Spazio`,"voice.language":`Lingua (auto o codice)`,"voice.model":`Modello attivo`,"voice.commandPath":`Percorso binario Whisper (opzionale)`,"voice.ffmpegPath":`Percorso binario ffmpeg (opzionale)`,"voice.temperature":`Temperatura`,"voice.temperatureHint":`Più basso = più deterministico; più alto = più flessibile ma potenzialmente meno stabile.`,"voice.initialPrompt":`Prompt iniziale (opzionale)`,"voice.initialPromptHint":`Contesto opzionale per aiutare Whisper con nomi propri, sigle o vocabolario tecnico.`,"voice.translateToEnglish":`Traduci in inglese`,"voice.translateToEnglishHint":`Se attivo, il parlato non inglese viene tradotto in inglese invece di essere trascritto così com’è.`,"voice.suppressNst":`Sopprimi token non vocali`,"voice.suppressNstHint":`Prova a ridurre artefatti non vocali nella trascrizione.`,"voice.installLink":`Installa whisper.cpp`,"voice.installGuideTitle":`Guida installazione`,"voice.installGuideIntro":`Installa whisper.cpp e ffmpeg, poi imposta i percorsi dei binari qui sotto se necessario.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Dopo il build con CMake, il binario Whisper di solito è in: whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Poi imposta “Percorso binario Whisper” e “Percorso binario ffmpeg” in questa sezione (o lascia vuoto se sono nel PATH).`,"voice.noneModel":`Nessun modello attivo`,"voice.notInstalled":`non installato`,"voice.download":`Scarica`,"voice.delete":`Elimina`,"voice.holdToTalk":`Tieni premuto per parlare`,"voice.recording":`Registrazione...`,"voice.transcribing":`Trascrizione...`,"voice.notSupported":`La registrazione vocale non è supportata da questo browser`,"voice.errorMicPermission":`Permesso microfono negato`,"voice.errorTranscription":`Trascrizione vocale non riuscita`,"voice.downloadFailed":`Download del modello non riuscito`,"voice.deleteFailed":`Eliminazione del modello non riuscita`,"voice.errorDisabled":`La trascrizione vocale è disattivata nelle impostazioni`,"voice.errorModelMissing":`Nessun modello vocale attivo configurato`,"voice.errorModelNotInstalled":`Il modello vocale attivo non è installato`,"voice.errorAudioInvalid":`La cattura audio è non valida o vuota`,"voice.errorLanguageInvalid":`La configurazione lingua vocale non è valida`,"voice.errorRuntimeMissing":`Il runtime Whisper non è installato o non è nel PATH`,"voice.maxDurationReached":`Durata massima di registrazione raggiunta`,"voice.runtimeReady":`Runtime pronto: {command}`,"voice.runtimeMissing":`Runtime mancante: {command}`,"voice.ffmpegReady":`ffmpeg pronto`,"voice.ffmpegMissing":`ffmpeg mancante`,"voice.sectionRuntime":`Stato del runtime`,"voice.sectionActivation":`Attivazione`,"voice.sectionModels":`Modelli Whisper`,"voice.sectionAdvanced":`Opzioni avanzate`,"voice.sectionBehavior":`Comportamento della trascrizione`,"voice.sectionBinaries":`Percorsi dei binari`,"voice.downloadModels":`Scarica un modello`,"voice.cancelFailed":`Annullamento del download non riuscito`,"createPage.title":`Su cosa vorresti lavorare?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion attivato`,"createPage.importNotion":`Importa da Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL deve iniziare con https://www.notion.so/`,"createPage.notionAutoExtract":`Le sottotask e i criteri di accettazione verranno estratti automaticamente.`,"createPage.notionPanelChoiceLabel":`Questo URL punta a una sotto-pagina (?p=). Su quale vuoi lavorare?`,"createPage.notionPanelOption":`Sotto-pagina (panel)`,"createPage.notionPanelOptionDesc":`La pagina che stavi visualizzando — consigliato`,"createPage.notionParentOption":`Pagina principale`,"createPage.notionParentOptionDesc":`L'epic / database a cui appartiene`,"createPage.importSentry":`Importa Sentry`,"createPage.sentryEnabled":`Sentry attivato`,"createPage.sentryPlaceholder":`https://tua-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL deve puntare a una issue di Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue di Sentry verrà importata automaticamente`,"createPage.sentryExtractHint":`Kobo estrarrà l'issue e la scriverà in .ai/thoughts/`,"createPage.workspaceName":`Nome del workspace (predefinito: titolo della pagina Notion)`,"createPage.workspaceNamePlaceholder":`Nome del workspace...`,"createPage.instructions":`Istruzioni aggiuntive (opzionale)...`,"createPage.instructionsPlaceholder":`Descrivi il task...`,"createPage.manualHint":`Nessun ticket Notion? Aggiungi i tuoi task e criteri di accettazione manualmente — verranno inviati all'agente Claude come contesto.`,"createPage.tasks":`Task ({count})`,"createPage.addTask":`Aggiungi un task...`,"createPage.acceptanceCriteria":`Criteri di accettazione ({count})`,"createPage.addCriterion":`Aggiungi un criterio...`,"createPage.projectPath":`Inserisci il percorso del progetto`,"createPage.branchType":`Tipo di branch`,"createPage.branch":`Branch`,"createPage.noBranches":`Nessun branch trovato`,"createPage.enterPath":`Inserisci il percorso del progetto`,"createPage.create":`Crea`,"createPage.skipSetupScript":`Salta script di setup`,"createPage.attachWorktreeToggle":`Aggancia worktree esistente`,"createPage.attachWorktreeEnabled":`Riutilizzo worktree esistente`,"createPage.worktreePickerLabel":`Worktree esistente`,"createPage.noOrphanWorktrees":`Nessun worktree orfano in questo progetto`,"createPage.pickWorktreeRequired":`Seleziona un worktree da agganciare`,"createPage.notionExtractHint":`Le sottotask e i criteri di accettazione verranno estratti dalla pagina Notion.`,"createPage.notionImportHint":`Clicca su "Importa da Notion" per estrarre automaticamente le sottotask da un ticket.`,"createPage.errorCreating":`Errore durante la creazione del workspace.`,"createPage.validationNotionUrl":`Inserisci un URL Notion valido (https://www.notion.so/...).`,"createPage.validationDescription":`Descrivi il task.`,"createPage.validationName":`Indica un nome per il workspace.`,"createPage.validationPath":`Inserisci il percorso del progetto.`,"createPage.validationBranch":`Seleziona un branch.`,"settings.title":`Impostazioni`,"settings.language":`Lingua`,"settings.projectColor":`Colore`,"settings.projectColorClear":`Cancella`,"settings.projectColorDefault":`Predefinito (grigio)`,"settings.workspaceListSection":`Lista dei workspace`,"settings.flattenWorkspaceList":`Lista piatta dei workspace`,"settings.flattenWorkspaceListHint":`Mostra tutti i workspace in una lista piatta con un badge progetto, invece di raggrupparli per progetto.`,"settings.skillSuite.section":`Suite di skill`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personalizzato`,"settings.skillSuite.superpowersHint":`Workflow opinionato TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite di Garry Tan — /review, /ship, /qa, /office-hours, ecc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Le due suite si combinano — superpowers per la metodologia (brainstorm / TDD / piani / review a livello di principi), gstack per i flussi concreti (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.customHint":`Modifica i quattro prompt qui sotto tu stesso. Parte dalla base agnostica.`,"settings.skillSuite.reloadDefaults":`Ripristina predefiniti`,"settings.skillSuite.reloadDefaultsConfirm":`Sostituire i quattro prompt personalizzati con i valori agnostici predefiniti?`,"settings.skillSuite.customPrompts":`Prompt personalizzati`,"settings.skillSuite.reviewTemplate":`Template di review`,"settings.skillSuite.autoLoopReviewGate":`Gate di review auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro di grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Istruzione fase di brainstorming`,"settings.global":`Globale`,"settings.projects":`Progetti`,"settings.globalSettings":`Impostazioni globali`,"settings.defaultModel":`Modello predefinito`,"settings.defaultModelClaude":`Modello predefinito (Claude Code)`,"settings.defaultModelCodex":`Modello predefinito (OpenAI Codex)`,"settings.agentPermissions":`Permessi dell'agente`,"settings.skipPermissions":`Salta le richieste di permesso (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attenzione: disattivando questa opzione, tutti i permessi degli strumenti (Write, Edit, Bash...) verranno negati automaticamente in modalità headless. L'agente potrà solo leggere.`,"settings.notifications":`Notifiche`,"settings.browserNotifications":`Notifica browser quando l'agente termina`,"settings.audioNotifications":`Notifica sonora quando l'agente termina`,"settings.notificationSound":`Suono di notifica`,"settings.notificationSoundPreview":`Ascolta`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.notificationSoundTravailTermine":`Lavoro finito`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Sta per esplodere`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.defaultPermissionMode":`Modalità permessi predefinita`,"settings.defaultPermissionModeClaude":`Modalità permessi predefinita (Claude Code)`,"settings.defaultPermissionModeCodex":`Modalità permessi predefinita (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Modalità applicata alla creazione di un workspace. Piano = sola lettura, Bypass = senza richieste, Stretto = auto-accetta le edit con allow-list, Interattivo = chiedi prima di ogni strumento.`,"settings.activityFeed":`Feed attività`,"settings.verboseMessages":`Mostra messaggi di sistema dettagliati (task_progress, task_started)`,"settings.availableVariables":`Variabili disponibili nei template del prompt`,"settings.prPromptTemplate":`Template del prompt PR`,"settings.prPromptPlaceholder":`Istruzioni per l'agente durante la creazione di PR su GitHub...`,"settings.prPromptHint":`Usa le variabili elencate sopra (sintassi doppia parentesi graffa).`,"settings.reviewPromptTemplate":`Template del prompt di revisione`,"settings.reviewPromptPlaceholder":`Istruzioni per l'agente durante la revisione delle modifiche del branch...`,"settings.notionInitialPrompt":`Prompt iniziale Notion`,"settings.notionInitialPrompt.help":`Aggiunto al prompt di creazione del workspace quando il workspace ha un ticket Notion. Variabili: {variables}.`,"settings.notionInitialPrompt.project":`Prompt iniziale Notion (override)`,"settings.sentryInitialPrompt":`Prompt iniziale Sentry`,"settings.sentryInitialPrompt.help":`Aggiunto al prompt di creazione del workspace quando il workspace ha una issue Sentry. Variabili: {variables}.`,"settings.sentryInitialPrompt.project":`Prompt iniziale Sentry (override)`,"settings.initialPrompt.inheritHint":`Lasciare vuoto per ereditare. Digita un carattere di spazio bianco per disattivare l'iniezione a questo livello.`,"settings.resetToDefault":`Ripristina`,"settings.resetFailed":`Impossibile caricare il valore predefinito`,"settings.sentryIntegration":`Integrazione Sentry`,"settings.var.prNumber":`Numero della PR (es: 42)`,"settings.var.prUrl":`URL completo della PR creata`,"settings.var.branchName":`Nome del branch di lavoro`,"settings.var.sourceBranch":`Branch sorgente a cui punta la PR`,"settings.var.workspaceName":`Nome del workspace`,"settings.var.projectName":`Ultimo segmento del percorso del progetto`,"settings.var.notionUrl":`URL Notion se impostato, vuoto altrimenti`,"settings.var.commits":`Elenco puntato dei commit tra source e head`,"settings.var.diffStats":`Riepilogo shortstat Git (file, inserimenti, eliminazioni)`,"settings.var.tasks":`Attività regolari come lista di controllo`,"settings.var.acceptanceCriteria":`Criteri di accettazione come lista di controllo`,"settings.gitConventions":`Convenzioni Git (globale)`,"settings.gitConventionsPlaceholder":`# Convenzioni Git...`,"settings.gitConventionsHint":`Queste convenzioni vengono scritte in .ai/.git-conventions.md in ogni nuovo workspace e devono essere seguite dall'agente prima di qualsiasi operazione Git. Sovrascritte dalle convenzioni per progetto se definite.`,"settings.setupScript":`Script di setup`,"settings.cleanupScript":`Script di pulizia`,"settings.archiveScript":`Script di archiviazione`,"settings.archiveScriptHint":`Script di shell eseguito lato server nel worktree quando un workspace viene archiviato. Lascia vuoto per disattivare.`,"settings.archiveScriptPlaceholder":`es. pulire container, liberare spazio su disco…`,"settings.changeSourceBranchScript":`Script di cambio del branch di origine`,"settings.changeSourceBranchScript.help":`Sostituisce il cherry-pick integrato quando non vuoto. Lo script gestisce git, base della PR, force-push e conflitti; Kōbō rifiuta solo se l'agente è in esecuzione e aggiorna i metadati del branch di origine all'uscita 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nuovo branch di origine scelto nella finestra di dialogo
43
43
  KOBO_OLD_BASE — branch di origine precedente del workspace
44
44
  KOBO_WORKING_BRANCH — branch di lavoro del workspace
45
45
  KOBO_WORKTREE_PATH — percorso assoluto del worktree (anche cwd)
@@ -49,4 +49,4 @@ KOBO_WORKSPACE_ID — id Kōbō del workspace (stabile dopo rinomina)
49
49
  KOBO_WORKSPACE_NAME — nome visualizzato del workspace
50
50
  KOBO_FORGE — forge risolta: github / gitlab / none
51
51
  KOBO_PR_NUMBER — numero della PR/MR sulla forge risolta (vuoto se nessuna aperta)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
52
- # 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.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.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-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.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.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.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.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`,"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.runSetup":`Esegui script di setup`,"contextMenu.exportEvents":`Esporta eventi (CSV)`,"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`,"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`,"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)??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=this.workspaces.findIndex(t=>t.id===e);r>=0&&(this.workspaces[r]={...this.workspaces[r],...n.workspace??n}),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=await t.json(),r=n.workspace??n,i=this.workspaces.findIndex(e=>e.id===r.id);return i>=0?this.workspaces[i]=r:this.workspaces.push(r),e.autoLoop&&this.fetchAutoLoopStates(),r}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)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)}},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: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`: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-C2ULeep-.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])),children:[{path:``,redirect:{name:`workspace`}},{path:`workspace/:id?`,name:`workspace`,component:()=>$(()=>import(`./WorkspacePage-BlAVs03z.js`),__vite__mapDeps([33,1,2,3,4,6,7,8,11,34,17,14,15,13,35,18,19,36,21,16,20,37,22,38,24,25,26,27,39,31,40,30,41]))},{path:`create`,name:`create`,component:()=>$(()=>import(`./CreatePage-xIjxPliD.js`),__vite__mapDeps([42,1,2,3,4,6,7,8,43,19,36,16,35,18,15,21,37,22,38,26,39,31,40,44]))},{path:`settings`,name:`settings`,component:()=>$(()=>import(`./SettingsPage-BLb9B9iY.js`),__vite__mapDeps([45,1,2,3,4,9,7,6,8,10,34,17,14,15,13,18,43,19,36,16,35,21,20,37,22,23,26,27,28,25,46]))},{path:`search`,name:`search`,component:()=>$(()=>import(`./SearchPage-D2x2X7K7.js`),__vite__mapDeps([47,1,2,3,4,6,11,15,37,22,23,14,30,48]))},{path:`health`,name:`health`,component:()=>$(()=>import(`./HealthPage-Bw-9__wY.js`),__vite__mapDeps([49,3,4,11,8,19,20,37,22,26]))}]},{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-DwzfgKc3.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};
52
+ # 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.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.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-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.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.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.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.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`,"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.runSetup":`Esegui script di setup`,"contextMenu.exportEvents":`Esporta eventi (CSV)`,"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`,"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)??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=this.workspaces.findIndex(t=>t.id===e);r>=0&&(this.workspaces[r]={...this.workspaces[r],...n.workspace??n}),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=await t.json(),r=n.workspace??n,i=this.workspaces.findIndex(e=>e.id===r.id);return i>=0?this.workspaces[i]=r:this.workspaces.push(r),e.autoLoop&&this.fetchAutoLoopStates(),r}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)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)}},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: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`: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-OJcuFEwx.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])),children:[{path:``,redirect:{name:`workspace`}},{path:`workspace/:id?`,name:`workspace`,component:()=>$(()=>import(`./WorkspacePage-CcWa3--k.js`),__vite__mapDeps([33,1,2,3,4,6,7,8,11,34,17,14,15,13,35,18,19,36,21,16,20,37,22,38,24,25,26,27,39,31,40,30,41]))},{path:`create`,name:`create`,component:()=>$(()=>import(`./CreatePage-DL8LTcyD.js`),__vite__mapDeps([42,1,2,3,4,6,7,8,43,19,36,16,35,18,15,21,37,22,38,26,39,31,40,44]))},{path:`settings`,name:`settings`,component:()=>$(()=>import(`./SettingsPage-CKz2kdw8.js`),__vite__mapDeps([45,1,2,3,4,9,7,6,8,10,34,17,14,15,13,18,43,19,36,16,35,21,20,37,22,23,26,27,28,25,46]))},{path:`search`,name:`search`,component:()=>$(()=>import(`./SearchPage-CpmeT5hL.js`),__vite__mapDeps([47,1,2,3,4,6,11,15,37,22,23,14,30,48]))},{path:`health`,name:`health`,component:()=>$(()=>import(`./HealthPage-Zsnyyv66.js`),__vite__mapDeps([49,3,4,11,8,19,20,37,22,26]))}]},{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-awaKh__J.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};