@loicngr/kobo 2.1.21 → 2.1.22

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 (81) hide show
  1. package/AGENTS.md +22 -4
  2. package/CHANGELOG.md +5 -0
  3. package/CONFIGURATION.md +23 -2
  4. package/dist/server/services/agent/engines/claude-code/engine.js +5 -2
  5. package/dist/server/services/agent/engines/codex/engine.js +3 -0
  6. package/dist/server/services/agent/orchestrator.js +1 -0
  7. package/dist/server/services/agent/turn-liveness.js +1 -1
  8. package/dist/server/services/settings-service.js +30 -0
  9. package/docs/deployment-vps.md +25 -10
  10. package/docs/getting-started.md +11 -0
  11. package/package.json +1 -1
  12. package/scripts/kobo-update +19 -11
  13. package/src/client/dist/pwa/assets/{ActivityFeed-DiUxnmGJ.js → ActivityFeed-2wu6qXx1.js} +1 -1
  14. package/src/client/dist/pwa/assets/{AutoLoopFinalReviewSettings-f4VDR5dd.js → AutoLoopFinalReviewSettings-CwnNUWCh.js} +1 -1
  15. package/src/client/dist/pwa/assets/{ChangelogPage-dEWpjTlp.js → ChangelogPage-D9ke0TYz.js} +1 -1
  16. package/src/client/dist/pwa/assets/{ComparisonPanel-Bwbqgvr4.js → ComparisonPanel-ytDu1L7a.js} +1 -1
  17. package/src/client/dist/pwa/assets/{CreatePage-CCCCAhrx.js → CreatePage-YQ_jGilf.js} +1 -1
  18. package/src/client/dist/pwa/assets/{DashboardPage-3byhBITf.js → DashboardPage-C-PyArla.js} +1 -1
  19. package/src/client/dist/pwa/assets/{DiffViewer-Bj_NTfCF.js → DiffViewer-CPobwSwm.js} +3 -3
  20. package/src/client/dist/pwa/assets/{DocumentsPanel-xyLDV3T1.js → DocumentsPanel-BjZGNI-p.js} +1 -1
  21. package/src/client/dist/pwa/assets/{DrawerToggleButton-pwBSstQP.js → DrawerToggleButton-Dtd6fhYu.js} +1 -1
  22. package/src/client/dist/pwa/assets/{GitPanel-DvIdrkVw.js → GitPanel-BHJ3lpJZ.js} +3 -3
  23. package/src/client/dist/pwa/assets/{HealthPage-BSwhZQRo.js → HealthPage-Lv_IdF1l.js} +1 -1
  24. package/src/client/dist/pwa/assets/{MainLayout-DZJ9BvZw.js → MainLayout-DYumlWcP.js} +2 -2
  25. package/src/client/dist/pwa/assets/{MemoryPanel-ChR032zP.js → MemoryPanel-DS2F3x-S.js} +1 -1
  26. package/src/client/dist/pwa/assets/{MemoryProposalList-BRKSoS4K.js → MemoryProposalList-D_KDS3uX.js} +1 -1
  27. package/src/client/dist/pwa/assets/{QBtnDropdown-o3QH0Bb8.js → QBtnDropdown-XkBxmJO9.js} +1 -1
  28. package/src/client/dist/pwa/assets/{QExpansionItem-BhFHiyq9.js → QExpansionItem-B5vbHxJ2.js} +1 -1
  29. package/src/client/dist/pwa/assets/{QScrollArea-BsNY6slB.js → QScrollArea-BE_fAg20.js} +1 -1
  30. package/src/client/dist/pwa/assets/{QSelect-bEq3g_io.js → QSelect-BjZk4-r8.js} +1 -1
  31. package/src/client/dist/pwa/assets/{QTooltip-xYZ6KNu2.js → QTooltip-Dhn6VXWR.js} +1 -1
  32. package/src/client/dist/pwa/assets/{SchedulePanel-DIFv_FTY.js → SchedulePanel-BDhIt9pX.js} +1 -1
  33. package/src/client/dist/pwa/assets/{SearchPage-BqTBIt5E.js → SearchPage-CJrtIenZ.js} +1 -1
  34. package/src/client/dist/pwa/assets/SettingsPage-BSwN45zt.js +9 -0
  35. package/src/client/dist/pwa/assets/{SettingsPage-BRvUAZ5r.css → SettingsPage-CNIpxG-U.css} +1 -1
  36. package/src/client/dist/pwa/assets/{SplitWorkspacePage-D6r2pl5g.js → SplitWorkspacePage-BV62otQw.js} +1 -1
  37. package/src/client/dist/pwa/assets/{TerminalPanel-CladK9Vv.js → TerminalPanel-TQUHtZ-q.js} +1 -1
  38. package/src/client/dist/pwa/assets/{ToolCallItem-CdzEME4w.js → ToolCallItem-DxdYefuz.js} +1 -1
  39. package/src/client/dist/pwa/assets/{TouchPan-B4gQPwGN.js → TouchPan-CtwfZgkX.js} +1 -1
  40. package/src/client/dist/pwa/assets/{TourReplayButton-B0j6AZwU.js → TourReplayButton-DEC_Yt6E.js} +1 -1
  41. package/src/client/dist/pwa/assets/{WorkspaceAttentionLabels-CeVhoidC.js → WorkspaceAttentionLabels-BehGsWhI.js} +1 -1
  42. package/src/client/dist/pwa/assets/{WorkspacePage-w2bF8wTd.css → WorkspacePage-Bk-WWOYM.css} +1 -1
  43. package/src/client/dist/pwa/assets/{WorkspacePage-CK5XCuG_.js → WorkspacePage-CQz6QL5L.js} +3 -3
  44. package/src/client/dist/pwa/assets/{browser-B8tNScg1.js → browser-B3bGJv7H.js} +1 -1
  45. package/src/client/dist/pwa/assets/{build-path-tree-kmVAcvs_.js → build-path-tree-Bwwe_8vU.js} +1 -1
  46. package/src/client/dist/pwa/assets/{custom-sounds-CJwd-8TL.js → custom-sounds-1Rb1a5LA.js} +1 -1
  47. package/src/client/dist/pwa/assets/{de-BaO6kbdO.js → de-bfOiFUu1.js} +1 -1
  48. package/src/client/dist/pwa/assets/{editor.api-CgbPVW9s.js → editor.api-D2PTZoSF.js} +1 -1
  49. package/src/client/dist/pwa/assets/{efforts-y7Wf_Rgd.js → efforts-JkWc_mU5.js} +1 -1
  50. package/src/client/dist/pwa/assets/{es-DTvSsbD0.js → es-C5Sk8pec.js} +1 -1
  51. package/src/client/dist/pwa/assets/{expand-template-BFbbjj7X.js → expand-template-C-aGZz7k.js} +1 -1
  52. package/src/client/dist/pwa/assets/{format-BETfc4z9.js → format-BbXB3nKS.js} +1 -1
  53. package/src/client/dist/pwa/assets/{formatters-C22K9vlC.js → formatters-Bu3lC0Jk.js} +1 -1
  54. package/src/client/dist/pwa/assets/{fr-BH7V66Yz.js → fr-BNVJp67K.js} +1 -1
  55. package/src/client/dist/pwa/assets/{freemarker2-DiRVvp9O.js → freemarker2-qq6O820q.js} +1 -1
  56. package/src/client/dist/pwa/assets/{handlebars-BLYRroSQ.js → handlebars-nXATCa7t.js} +1 -1
  57. package/src/client/dist/pwa/assets/{html-DAW2vteY.js → html-ZSNyTQeY.js} +1 -1
  58. package/src/client/dist/pwa/assets/i18n-B_b02gtS.js +1 -0
  59. package/src/client/dist/pwa/assets/{index-CbyHfF8I.js → index-BZKHE14f.js} +3 -3
  60. package/src/client/dist/pwa/assets/{it-DZGbkkoy.js → it-B9g24VRZ.js} +1 -1
  61. package/src/client/dist/pwa/assets/{javascript-Bb5J8n0k.js → javascript-B3Elzrc0.js} +1 -1
  62. package/src/client/dist/pwa/assets/{liquid-Dqx3adnJ.js → liquid-CrMGh9mA.js} +1 -1
  63. package/src/client/dist/pwa/assets/{mdx-D_7igLV3.js → mdx-C6nxSGQ5.js} +1 -1
  64. package/src/client/dist/pwa/assets/{monaco-contributions-C-0CbrAy.js → monaco-contributions-WtuTHJJ8.js} +1 -1
  65. package/src/client/dist/pwa/assets/{monaco.contribution-c6JPBEZI.js → monaco.contribution--KeSH1BU.js} +2 -2
  66. package/src/client/dist/pwa/assets/{network-auth-BE4qbvWm.js → network-auth-DknPaiQS.js} +1 -1
  67. package/src/client/dist/pwa/assets/{notify-theme-BVFBBGrJ.js → notify-theme-DTaB0RsK.js} +1 -1
  68. package/src/client/dist/pwa/assets/{project-color-CHOR2jB5.js → project-color-bm_jpHka.js} +1 -1
  69. package/src/client/dist/pwa/assets/{python-Dqubw1F5.js → python-CQI_FwfK.js} +1 -1
  70. package/src/client/dist/pwa/assets/{razor-BQphc9Kt.js → razor-BT2wh4_7.js} +1 -1
  71. package/src/client/dist/pwa/assets/{typescript-Dep00l0X.js → typescript-D3ibItMf.js} +1 -1
  72. package/src/client/dist/pwa/assets/{use-search-index-status-CQHHvHwM.js → use-search-index-status-BnFR-_2l.js} +1 -1
  73. package/src/client/dist/pwa/assets/{use-tours-IVbXTmz2.js → use-tours-CsPhvrxf.js} +2 -2
  74. package/src/client/dist/pwa/assets/{use-worktree-restore-B3s5xDGR.js → use-worktree-restore-B5s0BuHk.js} +1 -1
  75. package/src/client/dist/pwa/assets/{workspace-templates-CyuTpztP.js → workspace-templates-GLO1mBlj.js} +1 -1
  76. package/src/client/dist/pwa/assets/{xml-BMS2dvaF.js → xml-EIEQlO3Y.js} +1 -1
  77. package/src/client/dist/pwa/assets/{yaml-CYw92aic.js → yaml-CJdHLr6G.js} +1 -1
  78. package/src/client/dist/pwa/index.html +1 -1
  79. package/src/client/dist/pwa/sw.js +1 -1
  80. package/src/client/dist/pwa/assets/SettingsPage-BLD0xWFB.js +0 -9
  81. package/src/client/dist/pwa/assets/i18n-DnuTmw3O.js +0 -1
@@ -1 +1 @@
1
- import{S as e,v as t}from"./reactivity.esm-bundler-DY1JkAEA.js";import{C as n,J as r,N as i,O as a,P as o,R as s,T as c,b as l,j as u,k as d,l as f}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{G as p,M as ee,O as te,R as m,d as ne,z as h}from"./dom-BtYTvLeN.js";import{l as re,u as ie}from"./QBtn-BUSdPaf4.js";import{n as g,t as ae}from"./use-dark-BHObfh0O.js";import{cn as oe,dn as _,u as se}from"./index-CbyHfF8I.js";import{c as ce,l as v}from"./QSelect-bEq3g_io.js";import{t as le}from"./use-slide-transition-B_Nu6u-t.js";var y=[`none`,`strict`,`leaf`,`leaf-filtered`],b=Symbol(`QTree`),ue={display:`none`},de=h({name:`QTreeNode`,props:{node:{type:Object,required:!0}},setup(e){let t=c(b),n=t.useCollapsible(e);return()=>t.renderNode(e.node,n)}});function x(e){let n=new Map,i=new Set(e());return r(e,e=>{let t=new Set(e);i.forEach(e=>{if(!t.has(e)){let t=n.get(e);t!==void 0&&(t.value=!1)}}),t.forEach(e=>{if(!i.has(e)){let t=n.get(e);t!==void 0&&(t.value=!0)}}),i=t},{flush:`sync`}),{has(e){let r=n.get(e);return r===void 0&&(r=t(i.has(e)),n.set(e,r)),r.value},prune(e){n.forEach((t,r)=>{e.has(r)||n.delete(r)})}}}function fe(e,t){if(e.depth===0)return[];let r=e.lines.map(e=>n(`div`,{class:`q-tree__vguide`+(e?` q-tree__vguide--line`:``)}));return r.push(n(`div`,{class:`q-tree__vguide`+(t?` q-tree__vguide--connector`:``)+(e.cont?` q-tree__vguide--line`:``)})),r}function pe(e){if(e.icon!==void 0)return n(re,{class:`q-tree__icon q-mr-sm`,name:e.icon,color:e.iconColor});let t=e.img||e.avatar;if(t)return n(`img`,{class:`q-tree__${e.img?`img`:`avatar`} q-mr-sm`,src:t})}var S=h({name:`QTree`,props:{...g,nodes:{type:Array,required:!0},nodeKey:{type:String,required:!0},labelKey:{type:String,default:`label`},childrenKey:{type:String,default:`children`},dense:Boolean,color:String,controlColor:String,textColor:String,selectedColor:String,icon:String,tickStrategy:{type:String,default:`none`,validator:e=>y.includes(e)},ticked:Array,expanded:Array,selected:{},noSelectionUnset:Boolean,defaultExpandAll:Boolean,accordion:Boolean,filter:String,filterMethod:Function,duration:{type:Number,default:300},noConnectors:Boolean,noTransition:Boolean,virtualScroll:Boolean,virtualScrollTarget:_,virtualScrollItemSize:v.virtualScrollItemSize.type,virtualScrollSliceSize:v.virtualScrollSliceSize,virtualScrollSliceRatioBefore:v.virtualScrollSliceRatioBefore,virtualScrollSliceRatioAfter:v.virtualScrollSliceRatioAfter,virtualScrollStickySizeStart:v.virtualScrollStickySizeStart,virtualScrollStickySizeEnd:v.virtualScrollStickySizeEnd,onVirtualScroll:Function,noNodesLabel:String,noResultsLabel:String},emits:[`update:expanded`,`update:ticked`,`update:selected`,`lazyLoad`,`afterShow`,`afterHide`],setup(c,{slots:h,emit:g}){let{proxy:_}=l(),v=ne(),y=ae(c,v),S=t({}),C=t(c.ticked||[]),w=t(c.expanded||[]),T=f(()=>new Set(w.value)),E=null,D=null,O=new Set,k={},A={},me=f(()=>`q-tree q-tree--${c.dense?`dense`:`standard`}`+(c.noConnectors?` q-tree--no-connectors`:``)+(y()?` q-tree--dark`:``)+(c.color===void 0?``:` text-${c.color}`)),j=t(c.selected!==void 0);r(()=>c.selected!==void 0,e=>{j.value=e},{flush:`sync`});let he=f(()=>c.icon||v.iconSet.tree.icon),ge=f(()=>c.controlColor||c.color),M=f(()=>c.textColor===void 0?``:` text-${c.textColor}`),_e=f(()=>{let e=c.selectedColor||c.color;return e?` text-${e}`:``}),ve=f(()=>c.filterMethod===void 0?(e,t)=>{let n=t.toLowerCase();return e[c.labelKey]&&e[c.labelKey].toLowerCase().includes(n)}:c.filterMethod),N=f(()=>{let e=new Map,t=[],n=(t,r,i)=>{let a=t.tickStrategy||(i===null?c.tickStrategy:i.tickStrategy),o=t[c.nodeKey],s=t[c.childrenKey],l=Array.isArray(s)&&s.length!==0,u=a===`strict`,d=t.lazy;d===!0&&S.value[o]!==void 0&&Array.isArray(s)&&(d=S.value[o]);let f={key:o,node:t,parentKey:r,childKeys:[],isParent:l,lazy:d,disabled:t.disabled,expandable:!t.disabled&&t.expandable!==!1,selectableBase:t.selectable!==!1,tickableBase:!t.disabled&&t.tickable!==!1,noTickBase:t.noTick===!0||!u&&d&&d!==`loaded`,tickStrategy:a,hasTicking:a!==`none`,strictTicking:u,leafFilteredTicking:a===`leaf-filtered`,leafTicking:a===`leaf`||a===`leaf-filtered`};return e.set(o,f),l&&s.forEach(e=>{f.childKeys.push(n(e,o,f).key)}),f};return c.nodes.forEach(e=>{t.push(n(e,null,null).key)}),{map:e,rootKeys:t}}),P=f(()=>{if(!c.filter)return null;let e=new Set,t=new Set,n=r=>{let i=r[c.nodeKey],a=!!ve.value(r,c.filter);return a&&e.add(i),Array.isArray(r[c.childrenKey])&&r[c.childrenKey].forEach(e=>{n(e)&&(a=!0)}),a&&t.add(i),a};return c.nodes.forEach(n),{own:e,visible:t}});function ye(e){let t=P.value;return t===null||t.visible.has(e)}let F=new Map,I=new Map,L=new Map,R=new Map,be=x(()=>C.value),xe=x(()=>w.value),Se=x(()=>c.selected!==void 0&&c.selected!==null?[c.selected]:[]);function Ce(e){let t=F.get(e);return t===void 0&&(t=f(()=>{let t=N.value.map.get(e);return t===void 0||!t.tickableBase?!1:!t.leafTicking||t.parentKey===null||Ce(t.parentKey).value}),F.set(e,t)),t}function z(e){let t=I.get(e);if(t===void 0){let n;t=f(()=>{let t=N.value.map.get(e);if(t===void 0){n=void 0;return}let r=t.noTickBase,i=Ce(e).value,a=t.strictTicking||!t.isParent?be.has(e):!1,o,s;if(t.isParent){let n=t.childKeys.map(e=>z(e).value),c=P.value,l=c===null||c.visible.has(e);if(c!==null&&c.own.has(e)&&r!==!0&&t.disabled!==!0&&i&&t.leafFilteredTicking&&t.childKeys.every((e,t)=>!c.visible.has(e)||n[t].noTick===!0||!n[t].tickable)&&(i=!1),l&&(r!==!0&&!t.strictTicking&&n.every(e=>e.noTick)&&(r=!0),t.leafTicking)){if(a=!1,o=n.some(e=>e.indeterminate===!0),i&&=n.some(e=>e.tickable),!o){let e=n.reduce((e,t)=>t.ticked?e+1:e,0);e===n.length?a=!0:e>0&&(o=!0)}o&&(s=n.every(e=>!e.tickable||!e.ticked))}}return n!==void 0&&n.noTick===r&&n.tickable===i&&n.ticked===a&&n.indeterminate===o&&n.indeterminateNextState===s||(n={noTick:r,tickable:i,ticked:a,indeterminate:o,indeterminateNextState:s}),n}),I.set(e,t)}return t}function B(e){let t=L.get(e);if(t===void 0){let n,r,i;t=f(()=>{let t=N.value.map.get(e);if(t===void 0){n=r=i=void 0;return}let a=z(e).value,o=P.value,s=!t.disabled&&j.value&&t.selectableBase,c=!t.disabled&&(s||t.expandable&&(t.isParent||t.lazy===!0)),l=o===null||o.visible.has(e),u=Se.has(e)&&s,d=t.isParent?xe.has(e):!1,f=t.isParent&&(o===null||t.childKeys.some(e=>o.visible.has(e)));return n!==void 0&&r===t&&i===a&&n.link===c&&n.matchesFilter===l&&n.selected===u&&n.selectable===s&&n.expanded===d&&n.hasVisibleChildren===f?n:(r=t,i=a,n={key:e,isParent:t.isParent,lazy:t.lazy,disabled:t.disabled,link:c,matchesFilter:l,selected:u,selectable:s,expanded:d,expandable:t.expandable,noTick:a.noTick,tickable:a.tickable,tickStrategy:t.tickStrategy,hasTicking:t.hasTicking,strictTicking:t.strictTicking,leafFilteredTicking:t.leafFilteredTicking,leafTicking:t.leafTicking,ticked:a.ticked,indeterminate:a.indeterminate,indeterminateNextState:a.indeterminateNextState,hasVisibleChildren:f},n)}),L.set(e,t)}return t}function V(e){return B(e).value}function we(e){let t=R.get(e);return t===void 0&&(t=f(()=>ye(e)),R.set(e,t)),t}r(N,({map:e})=>{let t=t=>{t.forEach((n,r)=>{e.has(r)||t.delete(r)})};t(F),t(I),t(L),t(R),be.prune(e),xe.prune(e),Se.prune(e),O.forEach(t=>{e.has(t)||O.delete(t)})},{flush:`post`});let H=f(()=>{let e=[],{map:t,rootKeys:n}=N.value,r=P.value,i=T.value,a=(n,o,s,c)=>{let l=r===null?n:n.filter(e=>r.visible.has(e)),u=l.length-1;l.forEach((n,r)=>{let l=t.get(n),d=r<u;e.push({key:n,node:l.node,depth:o,lines:s,cont:d,posinset:r+1,setsize:u+1,parentDisabled:c}),l.isParent&&i.has(n)&&a(l.childKeys,o+1,o===0?s:[...s,d],c||l.disabled===!0)})};return a(n,0,[],!1),e}),Te=f(()=>c.virtualScroll?H.value.length:0),Ee=f(()=>c.virtualScrollItemSize===void 0?c.dense?23:35:c.virtualScrollItemSize),U=e(null),W;function De(){return U.value}function Oe(){return W}let{virtualScrollSliceRange:ke,localResetVirtualScroll:G,padVirtualScroll:Ae,onVirtualScrollEvt:je,scrollTo:Me}=ce({virtualScrollLength:Te,getVirtualScrollTarget:Oe,getVirtualScrollEl:De,virtualScrollItemSizeComputed:Ee});function K(){c.virtualScroll&&U.value!==null&&(W=oe(U.value,c.virtualScrollTarget),W.addEventListener(`scroll`,je,ee.passive))}function q(){W!==void 0&&(W.removeEventListener(`scroll`,je,ee.passive),W=void 0)}r(Te,()=>{c.virtualScroll&&G()}),r(()=>c.virtualScroll,e=>{q(),e&&(G(),a(K))}),r(()=>c.virtualScrollTarget,()=>{q(),K()}),o(K),d(K),i(q),u(q);let Ne=f(()=>{let e=[],{map:t,rootKeys:n}=N.value,r=P.value,i=n=>{if(r!==null&&!r.visible.has(n))return;e.push(n);let a=t.get(n);a.isParent&&T.value.has(n)&&a.childKeys.forEach(i)};return n.forEach(i),e});function Pe(){let e=Ne.value;return E!==null&&e.includes(E)?E:c.selected!==void 0&&c.selected!==null&&e.includes(c.selected)&&V(c.selected)?.selected===!0?c.selected:e[0]}function J(e){e!==D&&(D!=null&&A[D]?.setAttribute(`tabindex`,-1),A[e]?.setAttribute(`tabindex`,0),D=e)}r(()=>c.ticked,e=>{C.value=e}),r(()=>c.expanded,e=>{w.value=e});function Fe(e){let t=(n,r)=>{if(n||!r)return n;if(Array.isArray(r))return r.reduce(t,n);if(r[c.nodeKey]===e)return r;if(r[c.childrenKey])return t(null,r[c.childrenKey])};return t(null,c.nodes)}function Ie(e){let{map:t}=N.value,n=t.get(e);return n!==void 0&&n.parentKey!==null?t.get(n.parentKey).node:void 0}function Le(e){let{map:t}=N.value;return e.map(e=>t.get(e)?.node)}function Re(){return Le(C.value)}function ze(){let e=[];return N.value.map.forEach((t,n)=>{t.isParent&&t.leafTicking&&z(n).value.indeterminate===!0&&e.push(t.node)}),e}function Be(){return Le(w.value)}function Ve(e){return e?V(e)?.expanded===!0:!1}function He(){c.expanded===void 0?w.value=[]:g(`update:expanded`,[])}function Ue(){let e=[],t=n=>{n[c.childrenKey]&&n[c.childrenKey].length!==0&&n.expandable!==!1&&n.disabled!==!0&&(e.push(n[c.nodeKey]),n[c.childrenKey].forEach(t))};c.nodes.forEach(t),c.expanded===void 0?w.value=e:g(`update:expanded`,e)}function Y(e,t,n=Fe(e),r=V(e)){if(r.disabled!==!0){if(r.lazy&&r.lazy!==`loaded`){if(r.lazy===`loading`)return;S.value[e]=`loading`,Array.isArray(n[c.childrenKey])||(n[c.childrenKey]=[]),g(`lazyLoad`,{node:n,key:e,done:t=>{S.value[e]=`loaded`,n[c.childrenKey]=Array.isArray(t)?t:[],a(()=>{V(e)?.isParent===!0&&We(e,!0)})},fail:()=>{delete S.value[e],n[c.childrenKey].length===0&&delete n[c.childrenKey]}})}else r.isParent&&r.expandable&&We(e,t)}}function We(e,t){let n=w.value,r=c.expanded!==void 0;if(r&&(n=[...n]),t){let t=c.accordion?N.value.map.get(e):void 0;if(t!==void 0){let{map:r}=N.value,i=[];t.parentKey===null?N.value.rootKeys.forEach(t=>{t!==e&&i.push(t)}):r.get(t.parentKey).childKeys.forEach(t=>{t!==e&&r.get(t).expandable&&i.push(t)}),i.length!==0&&(n=n.filter(e=>!i.includes(e)))}n=[...n,e].filter((e,t,n)=>n.indexOf(e)===t)}else n=n.filter(t=>t!==e);r?g(`update:expanded`,n):w.value=n}function Ge(e){return e?V(e)?.ticked===!0:!1}function Ke(e){return e?V(e)?.indeterminate===!0:!1}function qe(e){let t=e?V(e):void 0;return t===void 0?!1:t.indeterminate===!0?null:t.ticked}function X(e,t){let n=C.value,r=c.ticked!==void 0;r&&(n=[...n]),n=t?[...n,...e].filter((e,t,n)=>n.indexOf(e)===t):n.filter(t=>!e.includes(t)),r?g(`update:ticked`,n):C.value=n}function Je(e,t,n){let r={tree:_,node:e,key:n,color:c.color,dark:y()};return p(r,`expanded`,()=>t.expanded,e=>{e!==t.expanded&&Y(n,e)}),p(r,`ticked`,()=>t.ticked,e=>{e!==t.ticked&&X([n],e)}),p(r,`indeterminate`,()=>t.indeterminate===!0),r}function Ye(e){return(c.filter?e.filter(e=>we(e[c.nodeKey]).value):e).map(e=>n(de,{key:e[c.nodeKey],node:e}))}function Xe(e){g(e===`show`?`afterShow`:`afterHide`)}function Ze(n){let i=e(null),o=f(()=>B(n.node[c.nodeKey]).value?.expanded===!0),s=t(!o.value),{onEnter:l,onLeave:u}=le(()=>c.duration,Xe);function d(){s.value=!0}function p(){i.value!==null&&l(i.value)}return r(o,e=>{c.noTransition?s.value=!e:e?s.value?(s.value=!1,a(p)):p():i.value===null?d():u(i.value,d)}),{elRef:i,hidden:s}}function Qe(e,t,r,i,a,o,s){return n(`div`,{class:`q-tree__node-header relative-position row no-wrap items-center q-focusable`+(t.link?` q-tree__node--link q-hoverable`:``)+(t.selected?` q-tree__node--selected`:``)+(t.disabled===!0?` q-tree__node--disabled`:``),ref:e=>{e===null?delete A[r]:A[r]=e},tabindex:r===D?0:-1,"aria-expanded":i?t.expanded?`true`:`false`:null,"aria-selected":t.selectable?t.selected?`true`:`false`:null,"aria-checked":t.hasTicking&&t.noTick!==!0?t.indeterminate===!0?`mixed`:t.ticked?`true`:`false`:null,"aria-disabled":t.disabled===!0?`true`:null,role:`treeitem`,...s,onFocus(){E=r,J(r)},onClick:t=>{at(e,r,t)},onKeydown(n){n.target===n.currentTarget&&te(n)!==!0&&(n.keyCode===13?at(e,r,n,!0):n.keyCode===32?t.hasTicking&&t.noTick!==!0&&t.tickable?(m(n),ot(r,!t.ticked)):$(e,r,n,!0):it(r,n.keyCode)&&m(n))}},[n(`div`,{class:`q-focus-helper`,tabindex:-1,ref:e=>{e===null?delete k[r]:k[r]=e}}),t.lazy===`loading`?n(ie,{class:`q-tree__spinner`,color:ge.value}):i?n(re,{class:`q-tree__arrow`+(t.expanded?` q-tree__arrow--rotate`:``),name:he.value,onClick(t){$(e,r,t)}}):null,t.hasTicking&&t.noTick!==!0?n(se,{class:`q-tree__tickbox`,modelValue:t.indeterminate===!0?null:t.ticked,color:ge.value,dark:y(),dense:!0,keepColor:!0,disable:!t.tickable,tabindex:-1,"aria-hidden":`true`,onMousedown(e){e.preventDefault(),E=r,J(r),Z(r)},"onUpdate:modelValue":e=>{ot(r,e)}}):null,n(`div`,{class:`q-tree__node-header-content col row no-wrap items-center`+(t.selected?_e.value:M.value)},[o?o(a):[pe(e),n(`div`,e[c.labelKey])]])])}function $e(e,t){let r=e[c.nodeKey],i=B(r).value,a=e.header&&h[`header-${e.header}`]||h[`default-header`];if(i===void 0)return null;i.expanded&&O.add(r);let o=i.expanded||c.noTransition!==!0&&O.has(r),s=i.isParent&&o?Ye(e[c.childrenKey]):[],l=i.hasVisibleChildren||i.lazy&&i.lazy!==`loaded`,u=e.body&&h[`body-${e.body}`]||h[`default-body`],d=a!==void 0||u!==void 0?Je(e,i,r):null;return u!==void 0&&(u=n(`div`,{class:`q-tree__node-body relative-position`},[n(`div`,{class:M.value},[u(d)])])),n(`div`,{key:r,class:`q-tree__node relative-position q-tree__node--${l?`parent`:`child`}`},[Qe(e,i,r,l,d,a),l?c.noTransition?i.expanded?n(`div`,{class:`q-tree__node-collapsible`+M.value,key:`${r}__q`},[u,n(`div`,{class:`q-tree__children`+(i.disabled===!0?` q-tree__node--disabled`:``),role:`group`},s)]):null:o?n(`div`,{ref:t.elRef,class:`q-tree__node-collapsible`+M.value,style:t.hidden.value?ue:null,key:`${r}__q`},[u,n(`div`,{class:`q-tree__children`+(i.disabled===!0?` q-tree__node--disabled`:``),role:`group`},s)]):null:u])}function et(e){let{key:t,node:r,depth:i}=e,a=B(t).value;if(a===void 0)return null;let o=a.hasVisibleChildren||a.lazy&&a.lazy!==`loaded`,s=r.header&&h[`header-${r.header}`]||h[`default-header`],c=r.body&&h[`body-${r.body}`]||h[`default-body`],l=s!==void 0||c!==void 0?Je(r,a,t):null;return c=c!==void 0&&(!a.isParent||a.expanded)?n(`div`,{class:`q-tree__vnode-body row no-wrap items-stretch`},[...fe(e,!1),n(`div`,{class:`q-tree__node-body relative-position`},[n(`div`,{class:M.value},[c(l)])])]):null,n(`div`,{key:t,class:`q-tree__vnode q-tree__vnode--${o?`parent`:`child`}`+(i===0?` q-tree__vnode--root`:``)+(a.disabled===!0||e.parentDisabled?` q-tree__node--disabled`:``)},[n(`div`,{class:`q-tree__vnode-header row no-wrap items-stretch`},[...fe(e,!0),Qe(r,a,t,o,l,s,{"aria-level":i+1,"aria-setsize":e.setsize,"aria-posinset":e.posinset})]),c])}function tt(){let e=H.value,t;if(e.length===0)t=c.filter?c.noResultsLabel||v.lang.tree.noResults:c.noNodesLabel||v.lang.tree.noNodes;else{let{from:n,to:r}=ke.value,i=e.slice(n,r),a=Pe();i.length!==0&&(a===void 0||!i.some(e=>e.key===a))&&(a=i[0].key),J(a),t=Ae(`div`,i.map(et),{role:`tree`})}return n(`div`,{class:me.value+` q-tree--virtual q-virtual-scroll q-virtual-scroll--vertical`+(c.virtualScrollTarget===void 0?` scroll`:``),ref:U},t)}function nt(e,t){if(c.virtualScroll){let n=H.value.findIndex(t=>t.key===e);n!==-1&&Me(n,t)}}function Z(e){k[e]?.focus({preventScroll:!0})}function Q(e){if(e!==void 0){E=e,J(e);let t=A[e];if(t!==void 0)t.focus();else if(c.virtualScroll){let t=H.value.findIndex(t=>t.key===e);t!==-1&&(Me(t),a(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{A[e]?.focus()})})}))}}}function rt(e){return e.find(ye)}function it(e,t){let n=V(e);if(n===void 0)return!1;let r=Ne.value,i=r.indexOf(e);if(t===36)return Q(r[0]),!0;if(t===35)return Q(r.at(-1)),!0;if(t===38)return Q(r[i-1]),!0;if(t===40)return Q(r[i+1]),!0;if(t===39)return!n.isParent&&!n.lazy||(n.expanded?Q(rt(N.value.map.get(e).childKeys)):Y(e,!0)),!0;if(t===37){if(n.expanded)Y(e,!1);else{let t=N.value.map.get(e).parentKey;Q(t===null?void 0:t)}return!0}return!1}function at(e,t,n,r){let i=V(t);i!==void 0&&i.disabled!==!0&&(E=t,J(t),r!==!0&&i.selectable&&Z(t),j.value&&i.selectable?c.noSelectionUnset?t!==c.selected&&g(`update:selected`,t===void 0?null:t):g(`update:selected`,t===c.selected?null:t):$(e,t,n,r),typeof e.handler==`function`&&e.handler(e))}function $(e,t,n,r){n!==void 0&&m(n);let i=V(t);i!==void 0&&i.disabled!==!0&&(E=t,J(t),r!==!0&&i.selectable&&Z(t),Y(t,!i.expanded,e,i))}function ot(e,t){let n=V(e);if(n!==void 0){if(n.indeterminate===!0&&(t=n.indeterminateNextState),n.strictTicking)X([e],t);else if(n.leafTicking){let n=[],{map:r}=N.value,i=e=>{let a=V(e);a.isParent?(t!==!0&&a.noTick!==!0&&a.tickable&&n.push(e),a.leafTicking&&r.get(e).childKeys.forEach(i)):a.noTick!==!0&&a.tickable&&(!a.leafFilteredTicking||a.matchesFilter)&&n.push(e)};i(e),X(n,t)}}}return c.defaultExpandAll&&Ue(),c.virtualScroll&&G(),s(b,{renderNode:$e,useCollapsible:Ze}),Object.assign(_,{getNodeByKey:Fe,getParentNode:Ie,getTickedNodes:Re,getIndeterminateNodes:ze,getExpandedNodes:Be,isExpanded:Ve,collapseAll:He,expandAll:Ue,setExpanded:Y,isTicked:Ge,isIndeterminate:Ke,getTickState:qe,setTicked:X,scrollTo:nt}),()=>{if(c.virtualScroll)return tt();J(Pe());let e=Ye(c.nodes);return n(`div`,{class:me.value,role:`tree`},e.length===0?c.filter?c.noResultsLabel||v.lang.tree.noResults:c.noNodesLabel||v.lang.tree.noNodes:e)}}});function C(e){let t=[];for(let n of e){let e=n.path.split(`/`).filter(e=>e.length>0);if(e.length===0)continue;let r=t,i=``;for(let t=0;t<e.length-1;t++){let n=e[t];i=i?`${i}/${n}`:n;let a=r.find(e=>e.isFolder&&e.label===n);a||(a={label:n,nodeKey:`dir:${i}`,isFolder:!0,children:[]},r.push(a)),r=a.children}r.push({label:e[e.length-1],nodeKey:`file:${n.path}`,file:n})}function n(e){e.sort((e,t)=>{let n=e.isFolder===!0;return n===(t.isFolder===!0)?e.label.localeCompare(t.label):n?-1:1});for(let t of e)t.children&&n(t.children)}return n(t),t}function w(e){let t=0;for(let n of e)n.file&&t++,n.children&&(t+=w(n.children));return t}function T(e,t=1/0){let n=[],r=(e,i)=>{if(!(i>t))for(let t of e)t.isFolder&&(n.push(t.nodeKey),t.children&&r(t.children,i+1))};return r(e,1),n}export{S as i,T as n,w as r,C as t};
1
+ import{S as e,v as t}from"./reactivity.esm-bundler-DY1JkAEA.js";import{C as n,J as r,N as i,O as a,P as o,R as s,T as c,b as l,j as u,k as d,l as f}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{G as p,M as ee,O as te,R as m,d as ne,z as h}from"./dom-BtYTvLeN.js";import{l as re,u as ie}from"./QBtn-BUSdPaf4.js";import{n as g,t as ae}from"./use-dark-BHObfh0O.js";import{cn as oe,dn as _,u as se}from"./index-BZKHE14f.js";import{c as ce,l as v}from"./QSelect-BjZk4-r8.js";import{t as le}from"./use-slide-transition-B_Nu6u-t.js";var y=[`none`,`strict`,`leaf`,`leaf-filtered`],b=Symbol(`QTree`),ue={display:`none`},de=h({name:`QTreeNode`,props:{node:{type:Object,required:!0}},setup(e){let t=c(b),n=t.useCollapsible(e);return()=>t.renderNode(e.node,n)}});function x(e){let n=new Map,i=new Set(e());return r(e,e=>{let t=new Set(e);i.forEach(e=>{if(!t.has(e)){let t=n.get(e);t!==void 0&&(t.value=!1)}}),t.forEach(e=>{if(!i.has(e)){let t=n.get(e);t!==void 0&&(t.value=!0)}}),i=t},{flush:`sync`}),{has(e){let r=n.get(e);return r===void 0&&(r=t(i.has(e)),n.set(e,r)),r.value},prune(e){n.forEach((t,r)=>{e.has(r)||n.delete(r)})}}}function fe(e,t){if(e.depth===0)return[];let r=e.lines.map(e=>n(`div`,{class:`q-tree__vguide`+(e?` q-tree__vguide--line`:``)}));return r.push(n(`div`,{class:`q-tree__vguide`+(t?` q-tree__vguide--connector`:``)+(e.cont?` q-tree__vguide--line`:``)})),r}function pe(e){if(e.icon!==void 0)return n(re,{class:`q-tree__icon q-mr-sm`,name:e.icon,color:e.iconColor});let t=e.img||e.avatar;if(t)return n(`img`,{class:`q-tree__${e.img?`img`:`avatar`} q-mr-sm`,src:t})}var S=h({name:`QTree`,props:{...g,nodes:{type:Array,required:!0},nodeKey:{type:String,required:!0},labelKey:{type:String,default:`label`},childrenKey:{type:String,default:`children`},dense:Boolean,color:String,controlColor:String,textColor:String,selectedColor:String,icon:String,tickStrategy:{type:String,default:`none`,validator:e=>y.includes(e)},ticked:Array,expanded:Array,selected:{},noSelectionUnset:Boolean,defaultExpandAll:Boolean,accordion:Boolean,filter:String,filterMethod:Function,duration:{type:Number,default:300},noConnectors:Boolean,noTransition:Boolean,virtualScroll:Boolean,virtualScrollTarget:_,virtualScrollItemSize:v.virtualScrollItemSize.type,virtualScrollSliceSize:v.virtualScrollSliceSize,virtualScrollSliceRatioBefore:v.virtualScrollSliceRatioBefore,virtualScrollSliceRatioAfter:v.virtualScrollSliceRatioAfter,virtualScrollStickySizeStart:v.virtualScrollStickySizeStart,virtualScrollStickySizeEnd:v.virtualScrollStickySizeEnd,onVirtualScroll:Function,noNodesLabel:String,noResultsLabel:String},emits:[`update:expanded`,`update:ticked`,`update:selected`,`lazyLoad`,`afterShow`,`afterHide`],setup(c,{slots:h,emit:g}){let{proxy:_}=l(),v=ne(),y=ae(c,v),S=t({}),C=t(c.ticked||[]),w=t(c.expanded||[]),T=f(()=>new Set(w.value)),E=null,D=null,O=new Set,k={},A={},me=f(()=>`q-tree q-tree--${c.dense?`dense`:`standard`}`+(c.noConnectors?` q-tree--no-connectors`:``)+(y()?` q-tree--dark`:``)+(c.color===void 0?``:` text-${c.color}`)),j=t(c.selected!==void 0);r(()=>c.selected!==void 0,e=>{j.value=e},{flush:`sync`});let he=f(()=>c.icon||v.iconSet.tree.icon),ge=f(()=>c.controlColor||c.color),M=f(()=>c.textColor===void 0?``:` text-${c.textColor}`),_e=f(()=>{let e=c.selectedColor||c.color;return e?` text-${e}`:``}),ve=f(()=>c.filterMethod===void 0?(e,t)=>{let n=t.toLowerCase();return e[c.labelKey]&&e[c.labelKey].toLowerCase().includes(n)}:c.filterMethod),N=f(()=>{let e=new Map,t=[],n=(t,r,i)=>{let a=t.tickStrategy||(i===null?c.tickStrategy:i.tickStrategy),o=t[c.nodeKey],s=t[c.childrenKey],l=Array.isArray(s)&&s.length!==0,u=a===`strict`,d=t.lazy;d===!0&&S.value[o]!==void 0&&Array.isArray(s)&&(d=S.value[o]);let f={key:o,node:t,parentKey:r,childKeys:[],isParent:l,lazy:d,disabled:t.disabled,expandable:!t.disabled&&t.expandable!==!1,selectableBase:t.selectable!==!1,tickableBase:!t.disabled&&t.tickable!==!1,noTickBase:t.noTick===!0||!u&&d&&d!==`loaded`,tickStrategy:a,hasTicking:a!==`none`,strictTicking:u,leafFilteredTicking:a===`leaf-filtered`,leafTicking:a===`leaf`||a===`leaf-filtered`};return e.set(o,f),l&&s.forEach(e=>{f.childKeys.push(n(e,o,f).key)}),f};return c.nodes.forEach(e=>{t.push(n(e,null,null).key)}),{map:e,rootKeys:t}}),P=f(()=>{if(!c.filter)return null;let e=new Set,t=new Set,n=r=>{let i=r[c.nodeKey],a=!!ve.value(r,c.filter);return a&&e.add(i),Array.isArray(r[c.childrenKey])&&r[c.childrenKey].forEach(e=>{n(e)&&(a=!0)}),a&&t.add(i),a};return c.nodes.forEach(n),{own:e,visible:t}});function ye(e){let t=P.value;return t===null||t.visible.has(e)}let F=new Map,I=new Map,L=new Map,R=new Map,be=x(()=>C.value),xe=x(()=>w.value),Se=x(()=>c.selected!==void 0&&c.selected!==null?[c.selected]:[]);function Ce(e){let t=F.get(e);return t===void 0&&(t=f(()=>{let t=N.value.map.get(e);return t===void 0||!t.tickableBase?!1:!t.leafTicking||t.parentKey===null||Ce(t.parentKey).value}),F.set(e,t)),t}function z(e){let t=I.get(e);if(t===void 0){let n;t=f(()=>{let t=N.value.map.get(e);if(t===void 0){n=void 0;return}let r=t.noTickBase,i=Ce(e).value,a=t.strictTicking||!t.isParent?be.has(e):!1,o,s;if(t.isParent){let n=t.childKeys.map(e=>z(e).value),c=P.value,l=c===null||c.visible.has(e);if(c!==null&&c.own.has(e)&&r!==!0&&t.disabled!==!0&&i&&t.leafFilteredTicking&&t.childKeys.every((e,t)=>!c.visible.has(e)||n[t].noTick===!0||!n[t].tickable)&&(i=!1),l&&(r!==!0&&!t.strictTicking&&n.every(e=>e.noTick)&&(r=!0),t.leafTicking)){if(a=!1,o=n.some(e=>e.indeterminate===!0),i&&=n.some(e=>e.tickable),!o){let e=n.reduce((e,t)=>t.ticked?e+1:e,0);e===n.length?a=!0:e>0&&(o=!0)}o&&(s=n.every(e=>!e.tickable||!e.ticked))}}return n!==void 0&&n.noTick===r&&n.tickable===i&&n.ticked===a&&n.indeterminate===o&&n.indeterminateNextState===s||(n={noTick:r,tickable:i,ticked:a,indeterminate:o,indeterminateNextState:s}),n}),I.set(e,t)}return t}function B(e){let t=L.get(e);if(t===void 0){let n,r,i;t=f(()=>{let t=N.value.map.get(e);if(t===void 0){n=r=i=void 0;return}let a=z(e).value,o=P.value,s=!t.disabled&&j.value&&t.selectableBase,c=!t.disabled&&(s||t.expandable&&(t.isParent||t.lazy===!0)),l=o===null||o.visible.has(e),u=Se.has(e)&&s,d=t.isParent?xe.has(e):!1,f=t.isParent&&(o===null||t.childKeys.some(e=>o.visible.has(e)));return n!==void 0&&r===t&&i===a&&n.link===c&&n.matchesFilter===l&&n.selected===u&&n.selectable===s&&n.expanded===d&&n.hasVisibleChildren===f?n:(r=t,i=a,n={key:e,isParent:t.isParent,lazy:t.lazy,disabled:t.disabled,link:c,matchesFilter:l,selected:u,selectable:s,expanded:d,expandable:t.expandable,noTick:a.noTick,tickable:a.tickable,tickStrategy:t.tickStrategy,hasTicking:t.hasTicking,strictTicking:t.strictTicking,leafFilteredTicking:t.leafFilteredTicking,leafTicking:t.leafTicking,ticked:a.ticked,indeterminate:a.indeterminate,indeterminateNextState:a.indeterminateNextState,hasVisibleChildren:f},n)}),L.set(e,t)}return t}function V(e){return B(e).value}function we(e){let t=R.get(e);return t===void 0&&(t=f(()=>ye(e)),R.set(e,t)),t}r(N,({map:e})=>{let t=t=>{t.forEach((n,r)=>{e.has(r)||t.delete(r)})};t(F),t(I),t(L),t(R),be.prune(e),xe.prune(e),Se.prune(e),O.forEach(t=>{e.has(t)||O.delete(t)})},{flush:`post`});let H=f(()=>{let e=[],{map:t,rootKeys:n}=N.value,r=P.value,i=T.value,a=(n,o,s,c)=>{let l=r===null?n:n.filter(e=>r.visible.has(e)),u=l.length-1;l.forEach((n,r)=>{let l=t.get(n),d=r<u;e.push({key:n,node:l.node,depth:o,lines:s,cont:d,posinset:r+1,setsize:u+1,parentDisabled:c}),l.isParent&&i.has(n)&&a(l.childKeys,o+1,o===0?s:[...s,d],c||l.disabled===!0)})};return a(n,0,[],!1),e}),Te=f(()=>c.virtualScroll?H.value.length:0),Ee=f(()=>c.virtualScrollItemSize===void 0?c.dense?23:35:c.virtualScrollItemSize),U=e(null),W;function De(){return U.value}function Oe(){return W}let{virtualScrollSliceRange:ke,localResetVirtualScroll:G,padVirtualScroll:Ae,onVirtualScrollEvt:je,scrollTo:Me}=ce({virtualScrollLength:Te,getVirtualScrollTarget:Oe,getVirtualScrollEl:De,virtualScrollItemSizeComputed:Ee});function K(){c.virtualScroll&&U.value!==null&&(W=oe(U.value,c.virtualScrollTarget),W.addEventListener(`scroll`,je,ee.passive))}function q(){W!==void 0&&(W.removeEventListener(`scroll`,je,ee.passive),W=void 0)}r(Te,()=>{c.virtualScroll&&G()}),r(()=>c.virtualScroll,e=>{q(),e&&(G(),a(K))}),r(()=>c.virtualScrollTarget,()=>{q(),K()}),o(K),d(K),i(q),u(q);let Ne=f(()=>{let e=[],{map:t,rootKeys:n}=N.value,r=P.value,i=n=>{if(r!==null&&!r.visible.has(n))return;e.push(n);let a=t.get(n);a.isParent&&T.value.has(n)&&a.childKeys.forEach(i)};return n.forEach(i),e});function Pe(){let e=Ne.value;return E!==null&&e.includes(E)?E:c.selected!==void 0&&c.selected!==null&&e.includes(c.selected)&&V(c.selected)?.selected===!0?c.selected:e[0]}function J(e){e!==D&&(D!=null&&A[D]?.setAttribute(`tabindex`,-1),A[e]?.setAttribute(`tabindex`,0),D=e)}r(()=>c.ticked,e=>{C.value=e}),r(()=>c.expanded,e=>{w.value=e});function Fe(e){let t=(n,r)=>{if(n||!r)return n;if(Array.isArray(r))return r.reduce(t,n);if(r[c.nodeKey]===e)return r;if(r[c.childrenKey])return t(null,r[c.childrenKey])};return t(null,c.nodes)}function Ie(e){let{map:t}=N.value,n=t.get(e);return n!==void 0&&n.parentKey!==null?t.get(n.parentKey).node:void 0}function Le(e){let{map:t}=N.value;return e.map(e=>t.get(e)?.node)}function Re(){return Le(C.value)}function ze(){let e=[];return N.value.map.forEach((t,n)=>{t.isParent&&t.leafTicking&&z(n).value.indeterminate===!0&&e.push(t.node)}),e}function Be(){return Le(w.value)}function Ve(e){return e?V(e)?.expanded===!0:!1}function He(){c.expanded===void 0?w.value=[]:g(`update:expanded`,[])}function Ue(){let e=[],t=n=>{n[c.childrenKey]&&n[c.childrenKey].length!==0&&n.expandable!==!1&&n.disabled!==!0&&(e.push(n[c.nodeKey]),n[c.childrenKey].forEach(t))};c.nodes.forEach(t),c.expanded===void 0?w.value=e:g(`update:expanded`,e)}function Y(e,t,n=Fe(e),r=V(e)){if(r.disabled!==!0){if(r.lazy&&r.lazy!==`loaded`){if(r.lazy===`loading`)return;S.value[e]=`loading`,Array.isArray(n[c.childrenKey])||(n[c.childrenKey]=[]),g(`lazyLoad`,{node:n,key:e,done:t=>{S.value[e]=`loaded`,n[c.childrenKey]=Array.isArray(t)?t:[],a(()=>{V(e)?.isParent===!0&&We(e,!0)})},fail:()=>{delete S.value[e],n[c.childrenKey].length===0&&delete n[c.childrenKey]}})}else r.isParent&&r.expandable&&We(e,t)}}function We(e,t){let n=w.value,r=c.expanded!==void 0;if(r&&(n=[...n]),t){let t=c.accordion?N.value.map.get(e):void 0;if(t!==void 0){let{map:r}=N.value,i=[];t.parentKey===null?N.value.rootKeys.forEach(t=>{t!==e&&i.push(t)}):r.get(t.parentKey).childKeys.forEach(t=>{t!==e&&r.get(t).expandable&&i.push(t)}),i.length!==0&&(n=n.filter(e=>!i.includes(e)))}n=[...n,e].filter((e,t,n)=>n.indexOf(e)===t)}else n=n.filter(t=>t!==e);r?g(`update:expanded`,n):w.value=n}function Ge(e){return e?V(e)?.ticked===!0:!1}function Ke(e){return e?V(e)?.indeterminate===!0:!1}function qe(e){let t=e?V(e):void 0;return t===void 0?!1:t.indeterminate===!0?null:t.ticked}function X(e,t){let n=C.value,r=c.ticked!==void 0;r&&(n=[...n]),n=t?[...n,...e].filter((e,t,n)=>n.indexOf(e)===t):n.filter(t=>!e.includes(t)),r?g(`update:ticked`,n):C.value=n}function Je(e,t,n){let r={tree:_,node:e,key:n,color:c.color,dark:y()};return p(r,`expanded`,()=>t.expanded,e=>{e!==t.expanded&&Y(n,e)}),p(r,`ticked`,()=>t.ticked,e=>{e!==t.ticked&&X([n],e)}),p(r,`indeterminate`,()=>t.indeterminate===!0),r}function Ye(e){return(c.filter?e.filter(e=>we(e[c.nodeKey]).value):e).map(e=>n(de,{key:e[c.nodeKey],node:e}))}function Xe(e){g(e===`show`?`afterShow`:`afterHide`)}function Ze(n){let i=e(null),o=f(()=>B(n.node[c.nodeKey]).value?.expanded===!0),s=t(!o.value),{onEnter:l,onLeave:u}=le(()=>c.duration,Xe);function d(){s.value=!0}function p(){i.value!==null&&l(i.value)}return r(o,e=>{c.noTransition?s.value=!e:e?s.value?(s.value=!1,a(p)):p():i.value===null?d():u(i.value,d)}),{elRef:i,hidden:s}}function Qe(e,t,r,i,a,o,s){return n(`div`,{class:`q-tree__node-header relative-position row no-wrap items-center q-focusable`+(t.link?` q-tree__node--link q-hoverable`:``)+(t.selected?` q-tree__node--selected`:``)+(t.disabled===!0?` q-tree__node--disabled`:``),ref:e=>{e===null?delete A[r]:A[r]=e},tabindex:r===D?0:-1,"aria-expanded":i?t.expanded?`true`:`false`:null,"aria-selected":t.selectable?t.selected?`true`:`false`:null,"aria-checked":t.hasTicking&&t.noTick!==!0?t.indeterminate===!0?`mixed`:t.ticked?`true`:`false`:null,"aria-disabled":t.disabled===!0?`true`:null,role:`treeitem`,...s,onFocus(){E=r,J(r)},onClick:t=>{at(e,r,t)},onKeydown(n){n.target===n.currentTarget&&te(n)!==!0&&(n.keyCode===13?at(e,r,n,!0):n.keyCode===32?t.hasTicking&&t.noTick!==!0&&t.tickable?(m(n),ot(r,!t.ticked)):$(e,r,n,!0):it(r,n.keyCode)&&m(n))}},[n(`div`,{class:`q-focus-helper`,tabindex:-1,ref:e=>{e===null?delete k[r]:k[r]=e}}),t.lazy===`loading`?n(ie,{class:`q-tree__spinner`,color:ge.value}):i?n(re,{class:`q-tree__arrow`+(t.expanded?` q-tree__arrow--rotate`:``),name:he.value,onClick(t){$(e,r,t)}}):null,t.hasTicking&&t.noTick!==!0?n(se,{class:`q-tree__tickbox`,modelValue:t.indeterminate===!0?null:t.ticked,color:ge.value,dark:y(),dense:!0,keepColor:!0,disable:!t.tickable,tabindex:-1,"aria-hidden":`true`,onMousedown(e){e.preventDefault(),E=r,J(r),Z(r)},"onUpdate:modelValue":e=>{ot(r,e)}}):null,n(`div`,{class:`q-tree__node-header-content col row no-wrap items-center`+(t.selected?_e.value:M.value)},[o?o(a):[pe(e),n(`div`,e[c.labelKey])]])])}function $e(e,t){let r=e[c.nodeKey],i=B(r).value,a=e.header&&h[`header-${e.header}`]||h[`default-header`];if(i===void 0)return null;i.expanded&&O.add(r);let o=i.expanded||c.noTransition!==!0&&O.has(r),s=i.isParent&&o?Ye(e[c.childrenKey]):[],l=i.hasVisibleChildren||i.lazy&&i.lazy!==`loaded`,u=e.body&&h[`body-${e.body}`]||h[`default-body`],d=a!==void 0||u!==void 0?Je(e,i,r):null;return u!==void 0&&(u=n(`div`,{class:`q-tree__node-body relative-position`},[n(`div`,{class:M.value},[u(d)])])),n(`div`,{key:r,class:`q-tree__node relative-position q-tree__node--${l?`parent`:`child`}`},[Qe(e,i,r,l,d,a),l?c.noTransition?i.expanded?n(`div`,{class:`q-tree__node-collapsible`+M.value,key:`${r}__q`},[u,n(`div`,{class:`q-tree__children`+(i.disabled===!0?` q-tree__node--disabled`:``),role:`group`},s)]):null:o?n(`div`,{ref:t.elRef,class:`q-tree__node-collapsible`+M.value,style:t.hidden.value?ue:null,key:`${r}__q`},[u,n(`div`,{class:`q-tree__children`+(i.disabled===!0?` q-tree__node--disabled`:``),role:`group`},s)]):null:u])}function et(e){let{key:t,node:r,depth:i}=e,a=B(t).value;if(a===void 0)return null;let o=a.hasVisibleChildren||a.lazy&&a.lazy!==`loaded`,s=r.header&&h[`header-${r.header}`]||h[`default-header`],c=r.body&&h[`body-${r.body}`]||h[`default-body`],l=s!==void 0||c!==void 0?Je(r,a,t):null;return c=c!==void 0&&(!a.isParent||a.expanded)?n(`div`,{class:`q-tree__vnode-body row no-wrap items-stretch`},[...fe(e,!1),n(`div`,{class:`q-tree__node-body relative-position`},[n(`div`,{class:M.value},[c(l)])])]):null,n(`div`,{key:t,class:`q-tree__vnode q-tree__vnode--${o?`parent`:`child`}`+(i===0?` q-tree__vnode--root`:``)+(a.disabled===!0||e.parentDisabled?` q-tree__node--disabled`:``)},[n(`div`,{class:`q-tree__vnode-header row no-wrap items-stretch`},[...fe(e,!0),Qe(r,a,t,o,l,s,{"aria-level":i+1,"aria-setsize":e.setsize,"aria-posinset":e.posinset})]),c])}function tt(){let e=H.value,t;if(e.length===0)t=c.filter?c.noResultsLabel||v.lang.tree.noResults:c.noNodesLabel||v.lang.tree.noNodes;else{let{from:n,to:r}=ke.value,i=e.slice(n,r),a=Pe();i.length!==0&&(a===void 0||!i.some(e=>e.key===a))&&(a=i[0].key),J(a),t=Ae(`div`,i.map(et),{role:`tree`})}return n(`div`,{class:me.value+` q-tree--virtual q-virtual-scroll q-virtual-scroll--vertical`+(c.virtualScrollTarget===void 0?` scroll`:``),ref:U},t)}function nt(e,t){if(c.virtualScroll){let n=H.value.findIndex(t=>t.key===e);n!==-1&&Me(n,t)}}function Z(e){k[e]?.focus({preventScroll:!0})}function Q(e){if(e!==void 0){E=e,J(e);let t=A[e];if(t!==void 0)t.focus();else if(c.virtualScroll){let t=H.value.findIndex(t=>t.key===e);t!==-1&&(Me(t),a(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{A[e]?.focus()})})}))}}}function rt(e){return e.find(ye)}function it(e,t){let n=V(e);if(n===void 0)return!1;let r=Ne.value,i=r.indexOf(e);if(t===36)return Q(r[0]),!0;if(t===35)return Q(r.at(-1)),!0;if(t===38)return Q(r[i-1]),!0;if(t===40)return Q(r[i+1]),!0;if(t===39)return!n.isParent&&!n.lazy||(n.expanded?Q(rt(N.value.map.get(e).childKeys)):Y(e,!0)),!0;if(t===37){if(n.expanded)Y(e,!1);else{let t=N.value.map.get(e).parentKey;Q(t===null?void 0:t)}return!0}return!1}function at(e,t,n,r){let i=V(t);i!==void 0&&i.disabled!==!0&&(E=t,J(t),r!==!0&&i.selectable&&Z(t),j.value&&i.selectable?c.noSelectionUnset?t!==c.selected&&g(`update:selected`,t===void 0?null:t):g(`update:selected`,t===c.selected?null:t):$(e,t,n,r),typeof e.handler==`function`&&e.handler(e))}function $(e,t,n,r){n!==void 0&&m(n);let i=V(t);i!==void 0&&i.disabled!==!0&&(E=t,J(t),r!==!0&&i.selectable&&Z(t),Y(t,!i.expanded,e,i))}function ot(e,t){let n=V(e);if(n!==void 0){if(n.indeterminate===!0&&(t=n.indeterminateNextState),n.strictTicking)X([e],t);else if(n.leafTicking){let n=[],{map:r}=N.value,i=e=>{let a=V(e);a.isParent?(t!==!0&&a.noTick!==!0&&a.tickable&&n.push(e),a.leafTicking&&r.get(e).childKeys.forEach(i)):a.noTick!==!0&&a.tickable&&(!a.leafFilteredTicking||a.matchesFilter)&&n.push(e)};i(e),X(n,t)}}}return c.defaultExpandAll&&Ue(),c.virtualScroll&&G(),s(b,{renderNode:$e,useCollapsible:Ze}),Object.assign(_,{getNodeByKey:Fe,getParentNode:Ie,getTickedNodes:Re,getIndeterminateNodes:ze,getExpandedNodes:Be,isExpanded:Ve,collapseAll:He,expandAll:Ue,setExpanded:Y,isTicked:Ge,isIndeterminate:Ke,getTickState:qe,setTicked:X,scrollTo:nt}),()=>{if(c.virtualScroll)return tt();J(Pe());let e=Ye(c.nodes);return n(`div`,{class:me.value,role:`tree`},e.length===0?c.filter?c.noResultsLabel||v.lang.tree.noResults:c.noNodesLabel||v.lang.tree.noNodes:e)}}});function C(e){let t=[];for(let n of e){let e=n.path.split(`/`).filter(e=>e.length>0);if(e.length===0)continue;let r=t,i=``;for(let t=0;t<e.length-1;t++){let n=e[t];i=i?`${i}/${n}`:n;let a=r.find(e=>e.isFolder&&e.label===n);a||(a={label:n,nodeKey:`dir:${i}`,isFolder:!0,children:[]},r.push(a)),r=a.children}r.push({label:e[e.length-1],nodeKey:`file:${n.path}`,file:n})}function n(e){e.sort((e,t)=>{let n=e.isFolder===!0;return n===(t.isFolder===!0)?e.label.localeCompare(t.label):n?-1:1});for(let t of e)t.children&&n(t.children)}return n(t),t}function w(e){let t=0;for(let n of e)n.file&&t++,n.children&&(t+=w(n.children));return t}function T(e,t=1/0){let n=[],r=(e,i)=>{if(!(i>t))for(let t of e)t.isFolder&&(n.push(t.nodeKey),t.children&&r(t.children,i+1))};return r(e,1),n}export{S as i,T as n,w as r,C as t};
@@ -1 +1 @@
1
- import{pt as e,v as t}from"./reactivity.esm-bundler-DY1JkAEA.js";import{C as n,J as r,L as i,O as a,P as o,T as s,X as c,Y as l,_ as u,b as d,d as f,f as p,g as m,j as h,l as g,p as _,r as v,u as y,y as b,z as x}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{d as S,m as C,x as ee,y as te,z as w}from"./dom-BtYTvLeN.js";import{c as T,l as E,t as D,u as O}from"./QBtn-BUSdPaf4.js";import{n as k,t as ne}from"./use-dark-BHObfh0O.js";import{C as re,a as ie,b as A,o as ae,v as oe,y as j}from"./detached-fullscreen-Du3TcYdX.js";import{$t as se,Bt as M,K as N,Kt as P,Q as F,Ut as I,Vt as L,Z as ce,gn as le,hn as ue,in as de,jt as R,q as fe,tn as z,vn as B}from"./index-CbyHfF8I.js";import{t as V}from"./QList-Cx1UfaUm.js";import{i as H}from"./QSelect-bEq3g_io.js";import{n as U,t as W}from"./QItemSection-MdJ1_ZK7.js";import{i as G}from"./use-tours-IVbXTmz2.js";import{t as pe}from"./TouchPan-B4gQPwGN.js";import{t as K}from"./ClosePopup-CRV2hxHS.js";import{t as q}from"./QBanner-BT2ZemYu.js";var me=150;function he(e,t){e.value!==t&&(e.value=t)}var J=w({name:`QDrawer`,inheritAttrs:!1,props:{...A,...k,side:{type:String,default:`left`,validator:e=>[`left`,`right`].includes(e)},width:{type:Number,default:300},mini:Boolean,miniToOverlay:Boolean,miniWidth:{type:Number,default:57},noMiniAnimation:Boolean,breakpoint:{type:Number,default:1023},showIfAbove:Boolean,behavior:{type:String,validator:e=>[`default`,`desktop`,`mobile`].includes(e),default:`default`},bordered:Boolean,elevated:Boolean,overlay:Boolean,persistent:Boolean,noSwipeOpen:Boolean,noSwipeClose:Boolean,noSwipeBackdrop:Boolean},emits:[...j,`onLayout`,`miniState`,`escapeKey`,`pan`],setup(e,{slots:i,emit:l,attrs:u}){let f=d(),p=S(),m=ne(e,p),{preventBodyScroll:_}=de(),{registerTimeout:v,removeTimeout:y}=re(),b=s(ee,te);if(b===te)return console.error(`QDrawer needs to be child of QLayout`),te;let x,w=null,T,E=t(e.behavior===`mobile`||e.behavior!==`desktop`&&b.totalWidth.value<=e.breakpoint),D=g(()=>e.mini&&!E.value),O=g(()=>D.value?e.miniWidth:e.width),k=g(()=>e.overlay||e.miniToOverlay||b.view.value.includes(B.value?`R`:`L`)||p.platform.is.ios&&b.isContainer.value),A=t(e.showIfAbove&&!E.value||e.modelValue===!0),j=g(()=>!e.overlay&&A.value&&!E.value),se=g(()=>e.overlay&&A.value&&!E.value),M=g(()=>!e.persistent&&(E.value||se.value));function N(e,t){if(L(),e!==!1&&b.animate(),X(0),E.value){let e=b.instances[q.value];e?.belowBreakpoint.value&&e.hide(!1),Z(1),b.isContainer.value||_(!0)}else Z(0),e!==!1&&De(!1);v(()=>{e!==!1&&De(!0),t||l(`show`,e)},me)}function P(e,t){ce(),e!==!1&&b.animate(),Z(0),X(V.value*O.value),je(),t?y():v(()=>{l(`hide`,e)},me)}let{show:F,hide:I}=oe({showing:A,hideOnRouteChange:M,handleShow:N,handleHide:P}),{addToHistory:L,removeFromHistory:ce}=ue(A,I,M),le=g(()=>A.value&&M.value);function R(e){l(`escapeKey`),I(e)}function fe(e){e?ie(R):ae(R)}let z={belowBreakpoint:E,hide:I},B=g(()=>e.side===`right`),V=g(()=>(p.lang.rtl?-1:1)*(B.value?1:-1)),U=t(0),W=t(!1),G=t(!1),K=t(O.value*V.value),q=g(()=>B.value?`left`:`right`),J=g(()=>A.value&&!E.value&&!e.overlay?e.miniToOverlay?e.miniWidth:O.value:0),ge=g(()=>`fullscreen q-drawer__backdrop`+(!A.value&&!W.value?` hidden`:``)),_e=g(()=>({backgroundColor:`rgba(0,0,0,${U.value*.4})`})),ve=g(()=>B.value?b.rows.value.top[2]===`r`:b.rows.value.top[0]===`l`),ye=g(()=>B.value?b.rows.value.bottom[2]===`r`:b.rows.value.bottom[0]===`l`),Y=g(()=>{let e={};return b.header.space&&!ve.value&&(k.value?e.top=`${b.header.offset}px`:b.header.space&&(e.top=`${b.header.size}px`)),b.footer.space&&!ye.value&&(k.value?e.bottom=`${b.footer.offset}px`:b.footer.space&&(e.bottom=`${b.footer.size}px`)),e}),be=g(()=>{let e={"--q-drawer-width":`${O.value}px`,transform:`translateX(${K.value}px)`};return E.value?e:Object.assign(e,Y.value)}),xe=g(()=>`q-drawer__content fit `+(b.isContainer.value?`overflow-auto`:`scroll`)),Se=g(()=>`q-drawer q-drawer--${e.side}`+(G.value?` q-drawer--mini-animate`:``)+(e.bordered?` q-drawer--bordered`:``)+(m()?` q-drawer--dark q-dark`:``)+(W.value?` no-transition`:A.value?``:` q-layout--prevent-focus`)+(E.value?` fixed q-drawer--on-top q-drawer--mobile q-drawer--top-padding`:` q-drawer--${D.value?`mini`:`standard`}`+(k.value||!j.value?` fixed`:``)+(e.overlay||e.miniToOverlay?` q-drawer--on-top`:``)+(ve.value?` q-drawer--top-padding`:``))),Ce=g(()=>{let t=p.lang.rtl?e.side:q.value;return[[pe,ke,void 0,{[t]:!0,mouse:!0,prevent:!0}]]}),we=g(()=>{let t=p.lang.rtl?q.value:e.side;return[[pe,E.value&&!e.noSwipeClose?Ae:void 0,void 0,{[t]:!0,mouse:!0}]]}),Te=g(()=>{let t=p.lang.rtl?q.value:e.side;return[[pe,A.value&&!e.noSwipeBackdrop?Ae:void 0,void 0,{[t]:!0,mouse:!0,mouseAllDir:!0,prevent:!0}]]});function Ee(){he(E,e.behavior===`mobile`||e.behavior!==`desktop`&&b.totalWidth.value<=e.breakpoint)}r(E,t=>{t?(x=A.value,A.value&&I(!1)):A.value?(X(0),Z(0),je()):!e.overlay&&e.behavior!==`mobile`&&x!==!1&&F(!1)}),r(()=>e.side,(e,t)=>{b.instances[t]===z&&(b.instances[t]=void 0,b[t].space=!1,b[t].offset=0),b.instances[e]=z,b[e].size=O.value,b[e].space=j.value,b[e].offset=J.value}),r(b.totalWidth,()=>{(b.isContainer.value||!document.qScrollPrevented)&&Ee()}),r(()=>e.behavior+e.breakpoint,Ee),r(b.isContainer,e=>{A.value&&_(!e),e&&Ee()}),r(b.scrollbarWidth,()=>{X(A.value?0:void 0)}),r(J,e=>{Q(`offset`,e)}),r(j,e=>{l(`onLayout`,e),Q(`space`,e)}),r(B,()=>{X()}),r(O,t=>{X(),$(e.miniToOverlay,t)}),r(()=>e.miniToOverlay,e=>{$(e,O.value)}),r(()=>p.lang.rtl,()=>{X()}),r(()=>e.mini,()=>{e.noMiniAnimation||e.modelValue&&(Oe(),b.animate())}),r(D,e=>{l(`miniState`,e)});function X(e){e===void 0?a(()=>{e=A.value?0:O.value,X(V.value*e)}):(b.isContainer.value&&B.value&&(E.value||Math.abs(e)===O.value)&&(e+=V.value*b.scrollbarWidth.value),K.value=e)}function Z(e){U.value=e}function De(e){let t=e?`remove`:b.isContainer.value?``:`add`;t!==``&&document.body.classList[t](`q-body--drawer-toggle`)}function Oe(){w!==null&&clearTimeout(w),f.proxy&&f.proxy.$el&&f.proxy.$el.classList.add(`q-drawer--mini-animate`),G.value=!0,w=setTimeout(()=>{w=null,G.value=!1,f?.proxy?.$el?.classList.remove(`q-drawer--mini-animate`)},150)}function ke(e){if(A.value)return;let t=O.value,n=H(e.distance.x,0,t);if(e.isFinal){n>=Math.min(75,t)?(F(),l(`pan`,{type:`open`,stage:`end`})):(b.animate(),Z(0),X(V.value*t),l(`pan`,{type:`open`,stage:`cancel`})),W.value=!1;return}X((p.lang.rtl?!B.value:B.value)?Math.max(t-n,0):Math.min(0,n-t)),Z(H(n/t,0,1)),e.isFirst&&(W.value=!0,l(`pan`,{type:`open`,stage:`start`}))}function Ae(t){if(!A.value)return;let n=O.value,r=t.direction===e.side,i=(p.lang.rtl?!r:r)?H(t.distance.x,0,n):0;if(t.isFinal){Math.abs(i)<Math.min(75,n)?(b.animate(),Z(1),X(0),l(`pan`,{type:`close`,stage:`cancel`})):(I(),l(`pan`,{type:`close`,stage:`end`})),W.value=!1;return}X(V.value*i),Z(H(1-i/n,0,1)),t.isFirst&&(W.value=!0,l(`pan`,{type:`close`,stage:`start`}))}function je(){_(!1),De(!0)}function Q(t,n){b.update(e.side,t,n)}function $(t,n){Q(`size`,t?e.miniWidth:n)}return b.instances[e.side]=z,$(e.miniToOverlay,O.value),Q(`space`,j.value),Q(`offset`,J.value),e.showIfAbove&&!e.modelValue&&A.value&&e[`onUpdate:modelValue`]!==void 0&&l(`update:modelValue`,!0),o(()=>{l(`onLayout`,j.value),l(`miniState`,D.value),r(le,fe,{immediate:!0}),x=e.showIfAbove;let t=()=>{(A.value?N:P)(!1,!0)};if(b.totalWidth.value!==0){a(t);return}T=r(b.totalWidth,()=>{T(),T=void 0,!A.value&&e.showIfAbove&&!E.value?F(!1):t()})}),h(()=>{T?.(),ae(R),w!==null&&(clearTimeout(w),w=null),A.value&&je(),b.instances[e.side]===z&&(b.instances[e.side]=void 0,Q(`size`,0),Q(`offset`,0),Q(`space`,!1))}),()=>{let t=[];E.value&&(e.noSwipeOpen||t.push(c(n(`div`,{key:`open`,class:`q-drawer__opener fixed-${e.side}`,"aria-hidden":`true`}),Ce.value)),t.push(c(n(`div`,{ref:`backdrop`,class:ge.value,style:_e.value,"aria-hidden":`true`,onClick:I}),Te.value)));let r={},a={};for(let e in u)e===`role`||e.startsWith(`aria-`)?r[e]=u[e]:a[e]=u[e];let o=D.value&&i.mini!==void 0,s=[n(`div`,{...a,key:String(o),class:[xe.value,u.class]},o?i.mini():C(i.default))];return e.elevated&&A.value&&s.push(n(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),t.push(c(n(`aside`,{ref:`content`,class:Se.value,style:be.value,...r},s),we.value)),n(`div`,{class:`q-drawer-container`},t)}}}),ge={class:`text-h6`},_e=[`title`],ve={key:1,class:`row justify-center q-mt-sm`},ye=b({__name:`FolderPickerDialog`,props:{modelValue:{type:Boolean},initialPath:{}},emits:[`update:modelValue`,`select`],setup(n,{emit:a}){let o=n,s=a,d=t(``),h=t(null),g=t([]),b=t(!1),S=t(``);async function C(e){b.value=!0,S.value=``;try{let t=e?`?path=${encodeURIComponent(e)}`:``,n=await I(`/api/fs/list-dirs${t}`),r=await n.json();if(!n.ok){S.value=r?.error??`HTTP ${n.status}`;return}d.value=r.path??``,h.value=r.parent??null,g.value=Array.isArray(r.entries)?r.entries:[]}catch(e){S.value=e instanceof Error?e.message:String(e)}finally{b.value=!1}}function ee(){d.value&&(s(`select`,d.value),s(`update:modelValue`,!1))}return r(()=>o.modelValue,e=>{e&&C(o.initialPath||void 0)}),(t,r)=>(i(),f(z,{"model-value":n.modelValue,"onUpdate:modelValue":r[1]||=e=>t.$emit(`update:modelValue`,e)},{default:l(()=>[u(le,{class:`text-kobo-1`,style:{"min-width":`480px`,"max-width":`90vw`,background:`var(--kobo-surface)`}},{default:l(()=>[u(B,{class:`row items-center q-pb-none`},{default:l(()=>[y(`div`,ge,e(t.$t(`folderPicker.title`)),1),u(G),c(u(D,{flat:``,dense:``,round:``,icon:`close`,color:`kobo-2`},null,512),[[K]])]),_:1}),u(B,null,{default:l(()=>[y(`div`,{class:`text-caption text-kobo-3 ellipsis q-mb-sm`,style:{"font-family":`monospace`},title:d.value},e(d.value||`…`),9,_e),S.value?(i(),f(q,{key:0,dense:``,class:`bg-red-9 text-white q-mb-sm rounded-borders`},{default:l(()=>[m(e(S.value),1)]),_:1})):p(``,!0),u(V,{bordered:``,separator:``,class:`rounded-borders`,style:{"max-height":`320px`,"overflow-y":`auto`}},{default:l(()=>[h.value?c((i(),f(U,{key:0,clickable:``,onClick:r[0]||=e=>C(h.value)},{default:l(()=>[u(W,{avatar:``},{default:l(()=>[u(E,{name:`arrow_upward`,color:`kobo-2`})]),_:1}),u(W,null,{default:l(()=>[m(e(t.$t(`folderPicker.parent`)),1)]),_:1})]),_:1})),[[T]]):p(``,!0),(i(!0),_(v,null,x(g.value,t=>c((i(),f(U,{key:t.path,clickable:``,onClick:e=>C(t.path)},{default:l(()=>[u(W,{avatar:``},{default:l(()=>[u(E,{name:`folder`,color:`amber-6`})]),_:1}),u(W,null,{default:l(()=>[m(e(t.name),1)]),_:2},1024)]),_:2},1032,[`onClick`])),[[T]])),128)),!b.value&&g.value.length===0?(i(),f(U,{key:1},{default:l(()=>[u(W,{class:`text-kobo-3`},{default:l(()=>[m(e(t.$t(`folderPicker.empty`)),1)]),_:1})]),_:1})):p(``,!0)]),_:1}),b.value?(i(),_(`div`,ve,[u(O,{size:`20px`,color:`kobo-2`})])):p(``,!0)]),_:1}),u(R,{align:`right`},{default:l(()=>[c(u(D,{flat:``,label:t.$t(`common.cancel`),color:`kobo-2`},null,8,[`label`]),[[K]]),u(D,{flat:``,label:t.$t(`folderPicker.select`),color:`primary`,disable:!d.value||b.value,onClick:ee},null,8,[`label`,`disable`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),Y=new Map;function be(e){let t=Y.get(e);t&&URL.revokeObjectURL(t),Y.delete(e)}async function xe(e){if(!Y.has(e))try{let t=await I(N(e));if(!t.ok)throw await P(t);let n=URL.createObjectURL(await t.blob());if(Y.has(e)||!fe(e)){URL.revokeObjectURL(n);return}Y.set(e,n),ce(e,n)}catch(e){console.error(`[custom-sounds store] preload failed:`,e)}}var Se=se(`customSounds`,{state:()=>({sounds:[],loaded:!1,busy:!1}),getters:{options:e=>e.sounds.map(e=>({label:e.name,value:e.reference}))},actions:{apply(e){this.sounds=e,F(e.map(e=>e.reference));for(let t of Y.keys())e.some(e=>e.reference===t)||be(t);for(let t of e)xe(t.reference)},async fetchSounds(){if(!this.busy){this.busy=!0;try{this.apply((await L(`/api/sounds`)).sounds),this.loaded=!0}catch(e){console.error(`[custom-sounds store] fetchSounds failed:`,e)}finally{this.busy=!1}}},async uploadSound(e){let t=new FormData;t.append(`sound`,e),this.busy=!0;try{let e=await L(`/api/sounds`,{method:`POST`,body:t});return this.apply([...this.sounds,e]),e}finally{this.busy=!1}},async removeSound(e){this.busy=!0;try{await L(`/api/sounds/${encodeURIComponent(e)}`,{method:`DELETE`})}catch(e){if(!(e instanceof M)||e.status!==404)throw e}finally{this.busy=!1}this.apply(this.sounds.filter(t=>t.id!==e))}}});export{ye as n,J as r,Se as t};
1
+ import{pt as e,v as t}from"./reactivity.esm-bundler-DY1JkAEA.js";import{C as n,J as r,L as i,O as a,P as o,T as s,X as c,Y as l,_ as u,b as d,d as f,f as p,g as m,j as h,l as g,p as _,r as v,u as y,y as b,z as x}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{d as S,m as C,x as ee,y as te,z as w}from"./dom-BtYTvLeN.js";import{c as T,l as E,t as D,u as O}from"./QBtn-BUSdPaf4.js";import{n as k,t as ne}from"./use-dark-BHObfh0O.js";import{C as re,a as ie,b as A,o as ae,v as oe,y as j}from"./detached-fullscreen-Du3TcYdX.js";import{$t as se,Bt as M,K as N,Kt as P,Q as F,Ut as I,Vt as L,Z as ce,gn as le,hn as ue,in as de,jt as R,q as fe,tn as z,vn as B}from"./index-BZKHE14f.js";import{t as V}from"./QList-Cx1UfaUm.js";import{i as H}from"./QSelect-BjZk4-r8.js";import{n as U,t as W}from"./QItemSection-MdJ1_ZK7.js";import{i as G}from"./use-tours-CsPhvrxf.js";import{t as pe}from"./TouchPan-CtwfZgkX.js";import{t as K}from"./ClosePopup-CRV2hxHS.js";import{t as q}from"./QBanner-BT2ZemYu.js";var me=150;function he(e,t){e.value!==t&&(e.value=t)}var J=w({name:`QDrawer`,inheritAttrs:!1,props:{...A,...k,side:{type:String,default:`left`,validator:e=>[`left`,`right`].includes(e)},width:{type:Number,default:300},mini:Boolean,miniToOverlay:Boolean,miniWidth:{type:Number,default:57},noMiniAnimation:Boolean,breakpoint:{type:Number,default:1023},showIfAbove:Boolean,behavior:{type:String,validator:e=>[`default`,`desktop`,`mobile`].includes(e),default:`default`},bordered:Boolean,elevated:Boolean,overlay:Boolean,persistent:Boolean,noSwipeOpen:Boolean,noSwipeClose:Boolean,noSwipeBackdrop:Boolean},emits:[...j,`onLayout`,`miniState`,`escapeKey`,`pan`],setup(e,{slots:i,emit:l,attrs:u}){let f=d(),p=S(),m=ne(e,p),{preventBodyScroll:_}=de(),{registerTimeout:v,removeTimeout:y}=re(),b=s(ee,te);if(b===te)return console.error(`QDrawer needs to be child of QLayout`),te;let x,w=null,T,E=t(e.behavior===`mobile`||e.behavior!==`desktop`&&b.totalWidth.value<=e.breakpoint),D=g(()=>e.mini&&!E.value),O=g(()=>D.value?e.miniWidth:e.width),k=g(()=>e.overlay||e.miniToOverlay||b.view.value.includes(B.value?`R`:`L`)||p.platform.is.ios&&b.isContainer.value),A=t(e.showIfAbove&&!E.value||e.modelValue===!0),j=g(()=>!e.overlay&&A.value&&!E.value),se=g(()=>e.overlay&&A.value&&!E.value),M=g(()=>!e.persistent&&(E.value||se.value));function N(e,t){if(L(),e!==!1&&b.animate(),X(0),E.value){let e=b.instances[q.value];e?.belowBreakpoint.value&&e.hide(!1),Z(1),b.isContainer.value||_(!0)}else Z(0),e!==!1&&De(!1);v(()=>{e!==!1&&De(!0),t||l(`show`,e)},me)}function P(e,t){ce(),e!==!1&&b.animate(),Z(0),X(V.value*O.value),je(),t?y():v(()=>{l(`hide`,e)},me)}let{show:F,hide:I}=oe({showing:A,hideOnRouteChange:M,handleShow:N,handleHide:P}),{addToHistory:L,removeFromHistory:ce}=ue(A,I,M),le=g(()=>A.value&&M.value);function R(e){l(`escapeKey`),I(e)}function fe(e){e?ie(R):ae(R)}let z={belowBreakpoint:E,hide:I},B=g(()=>e.side===`right`),V=g(()=>(p.lang.rtl?-1:1)*(B.value?1:-1)),U=t(0),W=t(!1),G=t(!1),K=t(O.value*V.value),q=g(()=>B.value?`left`:`right`),J=g(()=>A.value&&!E.value&&!e.overlay?e.miniToOverlay?e.miniWidth:O.value:0),ge=g(()=>`fullscreen q-drawer__backdrop`+(!A.value&&!W.value?` hidden`:``)),_e=g(()=>({backgroundColor:`rgba(0,0,0,${U.value*.4})`})),ve=g(()=>B.value?b.rows.value.top[2]===`r`:b.rows.value.top[0]===`l`),ye=g(()=>B.value?b.rows.value.bottom[2]===`r`:b.rows.value.bottom[0]===`l`),Y=g(()=>{let e={};return b.header.space&&!ve.value&&(k.value?e.top=`${b.header.offset}px`:b.header.space&&(e.top=`${b.header.size}px`)),b.footer.space&&!ye.value&&(k.value?e.bottom=`${b.footer.offset}px`:b.footer.space&&(e.bottom=`${b.footer.size}px`)),e}),be=g(()=>{let e={"--q-drawer-width":`${O.value}px`,transform:`translateX(${K.value}px)`};return E.value?e:Object.assign(e,Y.value)}),xe=g(()=>`q-drawer__content fit `+(b.isContainer.value?`overflow-auto`:`scroll`)),Se=g(()=>`q-drawer q-drawer--${e.side}`+(G.value?` q-drawer--mini-animate`:``)+(e.bordered?` q-drawer--bordered`:``)+(m()?` q-drawer--dark q-dark`:``)+(W.value?` no-transition`:A.value?``:` q-layout--prevent-focus`)+(E.value?` fixed q-drawer--on-top q-drawer--mobile q-drawer--top-padding`:` q-drawer--${D.value?`mini`:`standard`}`+(k.value||!j.value?` fixed`:``)+(e.overlay||e.miniToOverlay?` q-drawer--on-top`:``)+(ve.value?` q-drawer--top-padding`:``))),Ce=g(()=>{let t=p.lang.rtl?e.side:q.value;return[[pe,ke,void 0,{[t]:!0,mouse:!0,prevent:!0}]]}),we=g(()=>{let t=p.lang.rtl?q.value:e.side;return[[pe,E.value&&!e.noSwipeClose?Ae:void 0,void 0,{[t]:!0,mouse:!0}]]}),Te=g(()=>{let t=p.lang.rtl?q.value:e.side;return[[pe,A.value&&!e.noSwipeBackdrop?Ae:void 0,void 0,{[t]:!0,mouse:!0,mouseAllDir:!0,prevent:!0}]]});function Ee(){he(E,e.behavior===`mobile`||e.behavior!==`desktop`&&b.totalWidth.value<=e.breakpoint)}r(E,t=>{t?(x=A.value,A.value&&I(!1)):A.value?(X(0),Z(0),je()):!e.overlay&&e.behavior!==`mobile`&&x!==!1&&F(!1)}),r(()=>e.side,(e,t)=>{b.instances[t]===z&&(b.instances[t]=void 0,b[t].space=!1,b[t].offset=0),b.instances[e]=z,b[e].size=O.value,b[e].space=j.value,b[e].offset=J.value}),r(b.totalWidth,()=>{(b.isContainer.value||!document.qScrollPrevented)&&Ee()}),r(()=>e.behavior+e.breakpoint,Ee),r(b.isContainer,e=>{A.value&&_(!e),e&&Ee()}),r(b.scrollbarWidth,()=>{X(A.value?0:void 0)}),r(J,e=>{Q(`offset`,e)}),r(j,e=>{l(`onLayout`,e),Q(`space`,e)}),r(B,()=>{X()}),r(O,t=>{X(),$(e.miniToOverlay,t)}),r(()=>e.miniToOverlay,e=>{$(e,O.value)}),r(()=>p.lang.rtl,()=>{X()}),r(()=>e.mini,()=>{e.noMiniAnimation||e.modelValue&&(Oe(),b.animate())}),r(D,e=>{l(`miniState`,e)});function X(e){e===void 0?a(()=>{e=A.value?0:O.value,X(V.value*e)}):(b.isContainer.value&&B.value&&(E.value||Math.abs(e)===O.value)&&(e+=V.value*b.scrollbarWidth.value),K.value=e)}function Z(e){U.value=e}function De(e){let t=e?`remove`:b.isContainer.value?``:`add`;t!==``&&document.body.classList[t](`q-body--drawer-toggle`)}function Oe(){w!==null&&clearTimeout(w),f.proxy&&f.proxy.$el&&f.proxy.$el.classList.add(`q-drawer--mini-animate`),G.value=!0,w=setTimeout(()=>{w=null,G.value=!1,f?.proxy?.$el?.classList.remove(`q-drawer--mini-animate`)},150)}function ke(e){if(A.value)return;let t=O.value,n=H(e.distance.x,0,t);if(e.isFinal){n>=Math.min(75,t)?(F(),l(`pan`,{type:`open`,stage:`end`})):(b.animate(),Z(0),X(V.value*t),l(`pan`,{type:`open`,stage:`cancel`})),W.value=!1;return}X((p.lang.rtl?!B.value:B.value)?Math.max(t-n,0):Math.min(0,n-t)),Z(H(n/t,0,1)),e.isFirst&&(W.value=!0,l(`pan`,{type:`open`,stage:`start`}))}function Ae(t){if(!A.value)return;let n=O.value,r=t.direction===e.side,i=(p.lang.rtl?!r:r)?H(t.distance.x,0,n):0;if(t.isFinal){Math.abs(i)<Math.min(75,n)?(b.animate(),Z(1),X(0),l(`pan`,{type:`close`,stage:`cancel`})):(I(),l(`pan`,{type:`close`,stage:`end`})),W.value=!1;return}X(V.value*i),Z(H(1-i/n,0,1)),t.isFirst&&(W.value=!0,l(`pan`,{type:`close`,stage:`start`}))}function je(){_(!1),De(!0)}function Q(t,n){b.update(e.side,t,n)}function $(t,n){Q(`size`,t?e.miniWidth:n)}return b.instances[e.side]=z,$(e.miniToOverlay,O.value),Q(`space`,j.value),Q(`offset`,J.value),e.showIfAbove&&!e.modelValue&&A.value&&e[`onUpdate:modelValue`]!==void 0&&l(`update:modelValue`,!0),o(()=>{l(`onLayout`,j.value),l(`miniState`,D.value),r(le,fe,{immediate:!0}),x=e.showIfAbove;let t=()=>{(A.value?N:P)(!1,!0)};if(b.totalWidth.value!==0){a(t);return}T=r(b.totalWidth,()=>{T(),T=void 0,!A.value&&e.showIfAbove&&!E.value?F(!1):t()})}),h(()=>{T?.(),ae(R),w!==null&&(clearTimeout(w),w=null),A.value&&je(),b.instances[e.side]===z&&(b.instances[e.side]=void 0,Q(`size`,0),Q(`offset`,0),Q(`space`,!1))}),()=>{let t=[];E.value&&(e.noSwipeOpen||t.push(c(n(`div`,{key:`open`,class:`q-drawer__opener fixed-${e.side}`,"aria-hidden":`true`}),Ce.value)),t.push(c(n(`div`,{ref:`backdrop`,class:ge.value,style:_e.value,"aria-hidden":`true`,onClick:I}),Te.value)));let r={},a={};for(let e in u)e===`role`||e.startsWith(`aria-`)?r[e]=u[e]:a[e]=u[e];let o=D.value&&i.mini!==void 0,s=[n(`div`,{...a,key:String(o),class:[xe.value,u.class]},o?i.mini():C(i.default))];return e.elevated&&A.value&&s.push(n(`div`,{class:`q-layout__shadow absolute-full overflow-hidden no-pointer-events`})),t.push(c(n(`aside`,{ref:`content`,class:Se.value,style:be.value,...r},s),we.value)),n(`div`,{class:`q-drawer-container`},t)}}}),ge={class:`text-h6`},_e=[`title`],ve={key:1,class:`row justify-center q-mt-sm`},ye=b({__name:`FolderPickerDialog`,props:{modelValue:{type:Boolean},initialPath:{}},emits:[`update:modelValue`,`select`],setup(n,{emit:a}){let o=n,s=a,d=t(``),h=t(null),g=t([]),b=t(!1),S=t(``);async function C(e){b.value=!0,S.value=``;try{let t=e?`?path=${encodeURIComponent(e)}`:``,n=await I(`/api/fs/list-dirs${t}`),r=await n.json();if(!n.ok){S.value=r?.error??`HTTP ${n.status}`;return}d.value=r.path??``,h.value=r.parent??null,g.value=Array.isArray(r.entries)?r.entries:[]}catch(e){S.value=e instanceof Error?e.message:String(e)}finally{b.value=!1}}function ee(){d.value&&(s(`select`,d.value),s(`update:modelValue`,!1))}return r(()=>o.modelValue,e=>{e&&C(o.initialPath||void 0)}),(t,r)=>(i(),f(z,{"model-value":n.modelValue,"onUpdate:modelValue":r[1]||=e=>t.$emit(`update:modelValue`,e)},{default:l(()=>[u(le,{class:`text-kobo-1`,style:{"min-width":`480px`,"max-width":`90vw`,background:`var(--kobo-surface)`}},{default:l(()=>[u(B,{class:`row items-center q-pb-none`},{default:l(()=>[y(`div`,ge,e(t.$t(`folderPicker.title`)),1),u(G),c(u(D,{flat:``,dense:``,round:``,icon:`close`,color:`kobo-2`},null,512),[[K]])]),_:1}),u(B,null,{default:l(()=>[y(`div`,{class:`text-caption text-kobo-3 ellipsis q-mb-sm`,style:{"font-family":`monospace`},title:d.value},e(d.value||`…`),9,_e),S.value?(i(),f(q,{key:0,dense:``,class:`bg-red-9 text-white q-mb-sm rounded-borders`},{default:l(()=>[m(e(S.value),1)]),_:1})):p(``,!0),u(V,{bordered:``,separator:``,class:`rounded-borders`,style:{"max-height":`320px`,"overflow-y":`auto`}},{default:l(()=>[h.value?c((i(),f(U,{key:0,clickable:``,onClick:r[0]||=e=>C(h.value)},{default:l(()=>[u(W,{avatar:``},{default:l(()=>[u(E,{name:`arrow_upward`,color:`kobo-2`})]),_:1}),u(W,null,{default:l(()=>[m(e(t.$t(`folderPicker.parent`)),1)]),_:1})]),_:1})),[[T]]):p(``,!0),(i(!0),_(v,null,x(g.value,t=>c((i(),f(U,{key:t.path,clickable:``,onClick:e=>C(t.path)},{default:l(()=>[u(W,{avatar:``},{default:l(()=>[u(E,{name:`folder`,color:`amber-6`})]),_:1}),u(W,null,{default:l(()=>[m(e(t.name),1)]),_:2},1024)]),_:2},1032,[`onClick`])),[[T]])),128)),!b.value&&g.value.length===0?(i(),f(U,{key:1},{default:l(()=>[u(W,{class:`text-kobo-3`},{default:l(()=>[m(e(t.$t(`folderPicker.empty`)),1)]),_:1})]),_:1})):p(``,!0)]),_:1}),b.value?(i(),_(`div`,ve,[u(O,{size:`20px`,color:`kobo-2`})])):p(``,!0)]),_:1}),u(R,{align:`right`},{default:l(()=>[c(u(D,{flat:``,label:t.$t(`common.cancel`),color:`kobo-2`},null,8,[`label`]),[[K]]),u(D,{flat:``,label:t.$t(`folderPicker.select`),color:`primary`,disable:!d.value||b.value,onClick:ee},null,8,[`label`,`disable`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),Y=new Map;function be(e){let t=Y.get(e);t&&URL.revokeObjectURL(t),Y.delete(e)}async function xe(e){if(!Y.has(e))try{let t=await I(N(e));if(!t.ok)throw await P(t);let n=URL.createObjectURL(await t.blob());if(Y.has(e)||!fe(e)){URL.revokeObjectURL(n);return}Y.set(e,n),ce(e,n)}catch(e){console.error(`[custom-sounds store] preload failed:`,e)}}var Se=se(`customSounds`,{state:()=>({sounds:[],loaded:!1,busy:!1}),getters:{options:e=>e.sounds.map(e=>({label:e.name,value:e.reference}))},actions:{apply(e){this.sounds=e,F(e.map(e=>e.reference));for(let t of Y.keys())e.some(e=>e.reference===t)||be(t);for(let t of e)xe(t.reference)},async fetchSounds(){if(!this.busy){this.busy=!0;try{this.apply((await L(`/api/sounds`)).sounds),this.loaded=!0}catch(e){console.error(`[custom-sounds store] fetchSounds failed:`,e)}finally{this.busy=!1}}},async uploadSound(e){let t=new FormData;t.append(`sound`,e),this.busy=!0;try{let e=await L(`/api/sounds`,{method:`POST`,body:t});return this.apply([...this.sounds,e]),e}finally{this.busy=!1}},async removeSound(e){this.busy=!0;try{await L(`/api/sounds/${encodeURIComponent(e)}`,{method:`DELETE`})}catch(e){if(!(e instanceof M)||e.status!==404)throw e}finally{this.busy=!1}this.apply(this.sounds.filter(t=>t.id!==e))}}});export{ye as n,J as r,Se as t};
@@ -8,7 +8,7 @@ KOBO_WORKSPACE_ID — Kōbō-Workspace-ID (auch nach Umbenennung stabil)
8
8
  KOBO_WORKSPACE_NAME — Anzeigename des Workspaces
9
9
  KOBO_FORGE — aufgelöste Forge: github / gitlab / none
10
10
  KOBO_PR_NUMBER — PR-/MR-Nummer auf der aufgelösten Forge (leer wenn keine offen)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
11
- # Dein Skript — benutze $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Auf Kōbō-Standard zurücksetzen`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Skript zurücksetzen?`,"settings.changeSourceBranchScript.replaceConfirm":`Deine Änderungen werden durch das Kōbō-Standardskript ersetzt. Fortfahren?`,"settings.cleanupScriptHint":`Shell-Skript, das im Worktree nach jeder Sitzung des Agenten ausgeführt wird. Im Auto-Loop läuft es nur, wenn alle Aufgaben erledigt sind. Leer lassen zum Deaktivieren.`,"settings.cleanupScriptPlaceholder":`z. B. temporäre Dateien löschen, Container stoppen…`,"settings.cleanupScriptMode":`Wann ausführen`,"settings.cleanupScriptMode.idle":`Nach jeder Sitzung — auch wenn Aufgaben übrig sind`,"settings.cleanupScriptMode.noTasks":`Nur wenn keine Kōbō-Aufgabe übrig ist`,"settings.cleanupScriptOnlyOnChanges":`Nur ausführen, wenn Dateien geändert, hinzugefügt oder gelöscht wurden`,"settings.cleanupScriptMode.inherit":`Globale Einstellung übernehmen`,"settings.taskPromptTemplate":`Aufgaben-Prompt`,"settings.taskPromptTemplatePlaceholder":`Prompt, der automatisch in die Aufgabenbeschreibung eingefügt wird…`,"settings.taskPromptTemplateHint":`Wird automatisch in die Aufgabenbeschreibung auf der Erstellungsseite eingefügt, wenn dieses Projekt ausgewählt ist. Unverändert wird er beim Projektwechsel ersetzt; sobald Sie ihn bearbeiten, bleibt Ihr Text erhalten.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Wird mit bash im Worktree nach der Erstellung ausgeführt, bevor der Agent startet. Kein Shebang erforderlich. Bei Fehler wird der Workspace auf Fehler gesetzt. Timeout: 5 Minuten.`,"settings.e2e.title":`E2E-Tests`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Keiner`,"settings.e2e.frameworkOther":`Anderer`,"settings.e2e.skill":`Skill (optional)`,"settings.e2e.skillPlaceholder":`z.B. cypress-tester`,"settings.e2e.prompt":`Eigene Anleitung (optional)`,"settings.e2e.promptPlaceholder":`z.B. Page-Object-Pattern, data-testid-Attribute verwenden`,"settings.e2e.helpText":`Wenn konfiguriert, fügt der Auto-Loop-Grooming-Agent E2E-Unteraufgaben für UI-Funktionen ein.`,"settings.finalization.title":`Auto-loop-Finalisierung`,"settings.finalization.helpText":`Optional: ein Prompt, den der Agent als allerletzte Auto-loop-Iteration ausführt. Wird typischerweise für finale Quality-Checks (Lint, Typecheck, Tests) verwendet. Die Grooming-Phase erstellt eine mit [FINAL] präfixierte Aufgabe, die diesen Prompt nutzt.`,"settings.finalization.prompt":`Finalisierungs-Prompt`,"settings.finalization.promptPlaceholder":`z. B. Führe npm run lint und npm test aus, dann markiere diese Aufgabe als erledigt.`,"settings.editorCommand":`Editor-Befehl`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Editor. Der Worktree-Pfad wird als Argument übergeben.`,"settings.fileManagerCommand":`Dateimanager-Befehl`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Dateimanager. Der Worktree-Pfad wird als Argument übergeben. Leer lassen, um den Button auszublenden.`,"settings.terminalCommand":`Terminal-Befehl`,"settings.terminalCommandHint":`Befehl zum Starten des Terminals im Worktree. Optionaler {path}-Platzhalter für das Verzeichnis.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Claude-MCP-Auswahl`,"settings.mcpAutoSelect":`Auto (erster passender aktiver MCP)`,"settings.notionMcp":`Notion-MCP-Schlüssel`,"settings.sentryMcp":`Sentry-MCP-Schlüssel`,"settings.mcpSelectionHint":`Aktive Einträge werden aus ~/.claude.json gelesen. Auto belassen für das Standard-Matching.`,"settings.configuredProjects":`Konfigurierte Projekte`,"settings.noProjects":`Keine Projekte konfiguriert`,"settings.addProject":`Projekt hinzufügen`,"settings.copyFrom":`Einstellungen kopieren von`,"settings.copyFromPlaceholder":`(keine — Standardwerte verwenden)`,"settings.copyFromHint":`Kopiert alle Einstellungen außer Pfad, Anzeigename und Quell-Branch.`,"settings.copyFromConfirmTitle":`Aktuelle Werte überschreiben?`,"settings.copyFromConfirm":`Damit werden die aktuellen Formularwerte durch die Einstellungen von „{project}" ersetzt. Fortfahren?`,"settings.newProject":`Neues Projekt`,"settings.editProject":`Projekt bearbeiten`,"help.title":`Hilfe`,"help.tours":`Geführte Touren`,"help.steps":`{n} Schritt | {n} Schritte`,"help.markAllSeen":`Alle als gesehen markieren`,"help.markAllSeenHint":`Markiert die aktuellen Touren als gesehen, ohne sie zu starten.`,"help.resetAll":`Alle Touren zurücksetzen`,"help.resetAllHint":`Startet jetzt die Start-Tour; jeder Bildschirm wiederholt seine beim nächsten Öffnen.`,"help.status.unseen":`nicht gesehen`,"help.status.partial":`teilweise`,"help.status.seen":`gesehen`,"help.replayThis":`Tour dieses Bildschirms wiederholen`,"tours.next":`Weiter`,"tours.prev":`Zurück`,"tours.done":`Fertig`,"tours.exitConfirm":`Geführte Tour beenden? Sie startet nicht mehr von selbst; du kannst sie jederzeit über das Hilfemenü wiederholen.`,"tours.home.title":`Orientierung`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Jede Mission lebt hier mit ihrem Status. Badges markieren eine fehlgeschlagene CI, ein Review mit Änderungswünschen oder einen merge-bereiten PR. Ziehe den inneren Rand einer Seitenleiste mit der Maus oder dem Finger, um ihre Breite zu ändern. Bei wenig Platz werden die Schaltflächen oben umgebrochen.`,"tours.home.create.title":`Workspace erstellen`,"tours.home.create.description":`Ein Workspace ist ein Git-Worktree, ein Branch und eine Agent-Session für eine Aufgabe.`,"tours.home.search.title":`Suche`,"tours.home.search.description":`Filtere die Liste nach Namen. Das Suchsymbol oben öffnet die Volltextsuche in den Agent-Gesprächen.`,"tours.home.dashboard.title":`Übersicht`,"tours.home.dashboard.description":`Eine Tabelle für alle aktiven Workspaces: Status, Aufmerksamkeit, PR, Diff, Aktivität sowie die Zuverlässigkeit der Engines.`,"tours.home.health.title":`Status und Changelog`,"tours.home.health.description":`Prüfe Datenbank, Runtimes und aktive Agents. Der Button daneben listet, was sich in jeder Version geändert hat.`,"tours.home.settings.title":`Einstellungen`,"tours.home.settings.description":`Engines, Integrationen, Automatisierung, Worktrees und Projekte. Erstelle jetzt deinen ersten Workspace.`,"tours.create.title":`Einen Workspace erstellen`,"tours.create.project.title":`Projekt und Branch`,"tours.create.project.description":`Wähle das Projekt und den Branch, von dem der Worktree ausgeht.`,"tours.create.mission.title":`Mission`,"tours.create.mission.description":`Beschreibe die Aufgabe oder importiere sie aus einer Notion-Seite oder einem Sentry-Issue.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Wende ein gespeichertes Preset an oder speichere dieses Formular als Preset. „Duplizieren“ auf einer Workspace-Karte öffnet dieses Formular vorausgefüllt.`,"tours.create.engine.title":`Engine und Modell`,"tours.create.engine.description":`Claude Code oder Codex, das Modell, der Reasoning-Aufwand und was der Agent ohne Nachfrage tun darf.`,"tours.create.brainstorm.title":`Brainstorm auf einem anderen Modell`,"tours.create.brainstorm.description":`Führe die erste Brainstorming-Session auf einem anderen Modell aus und wechsle für die Iterationen zurück.`,"tours.create.autoloop.title":`Auto-Loop`,"tours.create.autoloop.description":`Der Agent erledigt Aufgaben und Abschlussprüfungen. Eine optionale unabhängige Abschlussreview wird nach Korrekturen wiederholt, bis keine Findings mehr vorliegen; bei Stillstand pausiert die Schleife.`,"tours.create.finalReview.title":`Abschlussreview konfigurieren`,"tours.create.finalReview.description":`Wähle Engine, Modell, Denkaufwand und Anweisungen für den Reviewer im Voraus. Die Review läuft in einer separaten schreibgeschützten Sitzung. Der ursprüngliche Agent korrigiert Findings; die Review wiederholt sich, bis keine mehr übrig sind.`,"tours.workspace.finalReview.title":`Abschlussreview und Korrekturen`,"tours.workspace.finalReview.description":`Konfiguriere hier den optionalen Abschlussreviewer vor dem Start. Nach Aufgaben und Abschlussprüfungen prüft eine separate Sitzung die Arbeit. Findings gehen zur automatischen Korrektur und erneuten Review an die ursprüngliche Sitzung zurück. Der Zyklus bleibt beim Schließen von Kōbō erhalten.`,"tours.workspace.reviewReturn.title":`Rückkehr aus einer Review`,"tours.workspace.reviewReturn.description":`Die Zusammenfassung kehrt auch nach einem Neustart von Kōbō zur ursprünglichen Sitzung zurück. Prüfe bei unklarer Zustellung vor einem erneuten Versuch den Verlauf; Abbrechen verwirft die Rückkehr. Manuelle Reviews warten vor Korrekturen auf deine Anweisung, Auto-loop korrigiert automatisch.`,"tours.create.comparison.title":`Zwei Engines vergleichen`,"tours.create.comparison.description":`Erstelle zwei Geschwister-Workspaces für dieselbe Aufgabe und vergleiche Commits, Aufgaben und Aktivität.`,"tours.workspace.sessions.title":`Workspace-Sitzungen`,"tours.workspace.sessions.description":`Klicke auf den Titel, um eine Sitzung auszuwählen, anzulegen, umzubenennen oder ihre Kennung zu kopieren.`,"tours.workspace.actions.title":`Workspace-Aktionen`,"tours.workspace.actions.description":`Das Menü ⋯ enthält die geteilte Ansicht, die Befehlspalette, das Seitenpanel und die Führung.`,"tours.workspace.title":`In einem Workspace`,"tours.workspace.chat.title":`Gespräch`,"tours.workspace.chat.description":`Die Ausgabe des Agenten, live: Nachrichten, Tool-Aufrufe, Fragen und Fehler.`,"tours.workspace.input.title":`Mit dem Agenten sprechen`,"tours.workspace.input.description":`Sende eine Nachricht, nutze Slash-Befehle, diktiere per Stimme oder hänge Dateien an.`,"tours.workspace.selectors.title":`Session-Einstellungen`,"tours.workspace.selectors.description":`Öffne Konfigurieren für Modell, Denkaufwand, Berechtigungen und Auto-Loop. Dort steht auch die aktuelle Engine.`,"tours.workspace.status.title":`Status`,"tours.workspace.status.description":`Der Zustand der aktuellen Session; hier kannst du sie bei Bedarf stoppen.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, Diff, Push, Rebase und der PR dieses Branches.`,"tours.workspace.tasks.title":`Aufgaben`,"tours.workspace.tasks.description":`Was der Agent vorhat, und die Akzeptanzkriterien, die er erfüllen muss.`,"tours.workspace.timeline.title":`Zeitachse`,"tours.workspace.timeline.description":`Jede Session dieses Workspaces; öffne eine ältere, um sie nachzulesen.`,"tours.workspace.subagents.title":`Sub-Agents`,"tours.workspace.subagents.description":`Verfolge die Sub-Agents, die der Agent gestartet hat, mit ihrem Live-Fortschritt.`,"tours.workspace.documents.title":`Dokumente`,"tours.workspace.documents.description":`Pläne und Dateien, die der Agent geschrieben hat, lesbar ohne den Chat zu verlassen.`,"tours.workspace.schedule.title":`Zeitplan`,"tours.workspace.schedule.description":`Wake-ups und Crons, die den Agenten später neu starten.`,"tours.workspace.memory.title":`Workspace-Erinnerungen`,"tours.workspace.memory.description":`Sieh die an die ausgewählte Unterhaltung übermittelten Erinnerungen, offene Vorschläge und Workspace-Vorgänge ein. Das Löschen ändert nicht den Chatverlauf des Anbieters.`,"tours.workspace.handoff.title":`Mit frischem Kontext fortfahren`,"tours.workspace.handoff.description":`Lange Unterhaltung? Starte hier eine frische Sitzung oder nutze „LLM wechseln“. Die aktuelle Arbeit wird sofort unterbrochen und die neue Sitzung setzt automatisch im selben Workspace fort. Die Zusammenfassung ist optional: Deaktiviere sie, wenn das Kontingent des aktuellen LLM erschöpft ist. Fortschritt, Bericht und Link zur vorherigen Sitzung erscheinen unter diesem Button.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Eine Shell im Worktree, ohne Kōbō zu verlassen.`,"tours.gitPr.title":`Pull Request`,"tours.gitPr.panel.title":`PR-Status`,"tours.gitPr.panel.description":`CI-Ergebnis, Review-Entscheidung und Reviewer, alle 30 Sekunden aktualisiert.`,"tours.gitPr.actions.title":`Git-Aktionen`,"tours.gitPr.actions.description":`Push, Pull, Rebase oder Basis-Branch wechseln. Bei einem Konflikt lässt ein Button den Agenten ihn lösen.`,"tours.gitPr.attention.title":`Aufmerksamkeits-Badges`,"tours.gitPr.attention.description":`Die Karte zeigt eine fehlgeschlagene CI, angeforderte Änderungen oder einen merge-bereiten PR.`,"tours.settings.title":`Einstellungen`,"tours.settings.engines.title":`Engines und Modelle`,"tours.settings.engines.description":`Standardmodelle, Berechtigungen und Grenzen für automatische Wiederholungen.`,"tours.settings.integrations.title":`Integrationen`,"tours.settings.integrations.description":`Notion- und Sentry-Verbindungen sowie Bitbucket-Zugangsdaten. GitHub und GitLab verwenden Ihre lokale CLI-Anmeldung.`,"tours.settings.automation.title":`Automatisierung`,"tours.settings.automation.description":`Setup- und Cleanup-Skripte, Lifecycle-Hooks, Prompt-Templates, Workspace-Templates und Skills.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.memory.title":`Erinnerungen`,"tours.settings.memory.description":`Wählen Sie manuelles, automatisches oder hybrides Verhalten und durchsuchen, prüfen oder löschen Sie die exakten Speicherdaten der Bereiche. Änderungen an Erinnerungen wirken sofort; der Modus wird über Speichern übernommen.`,"tours.settings.worktrees.description":`Wo Worktrees liegen, wie lange gemergte behalten werden, und das automatische Löschen.`,"tours.settings.projects.title":`Projekte`,"tours.settings.projects.description":`Registrierte Projekte und ihre projektspezifischen Überschreibungen.`,"tours.settings.misc.title":`Allgemein, Stimme, Benachrichtigungen, Export`,"tours.settings.misc.description":`Sprache, Netzwerkzugriff, Diktat, Töne und Browser-Benachrichtigungen sowie ein vollständiger Export deiner Einstellungen.`,"tours.dashboard.title":`Übersicht`,"tours.dashboard.overview.title":`Überblick`,"tours.dashboard.overview.description":`Alle aktiven Workspaces in einer Tabelle; klicke auf eine Zeile, um sie zu öffnen.`,"tours.dashboard.reliability.title":`Zuverlässigkeit der Engines`,"tours.dashboard.reliability.description":`Sessions, Fehler und Dauern pro Engine und Modell.`,"tours.health.title":`Status`,"tours.health.checks.title":`Prüfungen`,"tours.health.checks.description":`Umgebung, Datenbank, Runtimes, Workspaces und Sessions.`,"tours.health.active.title":`Aktiver Zustand`,"tours.health.active.description":`Aktuelle Quota-Back-offs, ausstehende Wake-ups und laufende Auto-Loops.`,"tours.search.title":`Suche`,"tours.search.input.title":`Suchanfrage`,"tours.search.input.description":`Findet Workspace-Namen und Agent-Gespräche.`,"tours.search.archived.title":`Archiviert`,"tours.search.archived.description":`Archivierte Workspaces in die Ergebnisse einbeziehen.`,"tours.changelog.title":`Was ist neu`,"tours.changelog.list.title":`Versionen`,"tours.changelog.list.description":`Was sich in jeder Version geändert hat, neueste zuerst.`,"settings.projectGroup.identity":`Identität`,"settings.projectGroup.defaults":`Standardwerte`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Skripte`,"settings.projectPath":`Projektpfad`,"settings.projectPathPlaceholder":`/pfad/zum/projekt`,"settings.displayName":`Anzeigename`,"settings.displayNamePlaceholder":`Mein Projekt`,"settings.defaultSourceBranch":`Standard-Quellbranch`,"settings.defaultModel.project":`Standardmodell`,"settings.skipPermissions.project":`Berechtigungsabfragen überspringen`,"settings.prPromptTemplate.project":`PR-Prompt-Vorlage`,"settings.prPromptPlaceholder.project":`Projektspezifische Anweisungen für PR-Erstellung...`,"settings.reviewPromptTemplate.project":`Review-Prompt-Vorlage`,"settings.ciFixPromptTemplate.project":`CI-Fix-Prompt-Vorlage`,"settings.gitConventions.project":`Git-Konventionen (Projekt)`,"settings.gitConventionsEmpty":`Leer lassen, um die globalen Konventionen zu verwenden.`,"settings.notionStatus":`Notion-Ticket-Status`,"settings.notionStatusProperty":`Eigenschaftsname`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Zu setzender Wert`,"settings.notionInProgressStatusPlaceholder":`In Bearbeitung, In progress...`,"settings.notionStatusHint":`Wenn ein Workspace mit einem Notion-Ticket erstellt wird, wird die angegebene Eigenschaft auf diesen Wert gesetzt. Beide Felder sind erforderlich. Leer lassen zum Deaktivieren.`,"settings.notionAssignee":`Notion-Zuweisung`,"settings.notionAssigneeHint":`Wenn ein Workspace mit einem Notion-Ticket erstellt wird, wird der über den Notion-MCP authentifizierte Benutzer dieser People-Eigenschaft hinzugefügt — nur wenn sie noch keinen Zuweisungsempfänger hat. Leer lassen zum Deaktivieren.`,"settings.notionAssigneeProperty":`Eigenschaftsname`,"settings.notionAssigneePropertyPlaceholder":`Entwickler, Assignees...`,"settings.notionUserId":`Deine Notion-UUID`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Wähle dein Konto aus der Liste. Notion lehnt Bot-Zuweisungen in People-Eigenschaften ab — dieses Feld ist erforderlich, um die automatische Zuweisung zu aktivieren.`,"settings.notionUsersRefresh":`Aktualisieren`,"settings.notionUsersLoading":`Notion-Benutzer werden geladen…`,"settings.notionUsersLoadFailed":`Liste konnte nicht geladen werden: {error}`,"settings.notionUsersManualFallback":`Liste nicht verfügbar — füge deine Notion-UUID manuell ein.`,"settings.devServer":`Dev-Server`,"settings.devServerStart":`Startskript`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Stoppskript`,"settings.devServerStopPlaceholder":`Optional — der Prozess wird automatisch beendet, wenn leer`,"settings.selectProject":`Projekt auswählen oder neues hinzufügen`,"settings.useGlobal":`Global verwenden`,"settings.saved":`Allgemeine Einstellungen gespeichert.`,"settings.unsavedChanges":`Nicht gespeicherte Änderungen`,"settings.nav.general":`Allgemein`,"settings.nav.agents":`Agenten`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Skripte`,"settings.nav.workspaceTemplates":`Workspace-Vorlagen`,"workspaceTemplates.title":`Workspace-Vorlagen`,"workspaceTemplates.hint":`Gespeicherte Voreinstellungen des Erstellungsformulars. Wählen Sie eine auf der Erstellungsseite; zum Ändern dort laden, anpassen und unter demselben Namen erneut speichern.`,"workspaceTemplates.empty":`Noch keine Vorlage. Füllen Sie das Erstellungsformular aus und nutzen Sie „Als Vorlage speichern“.`,"workspaceTemplates.anyProject":`Jedes Projekt`,"workspaceTemplates.rename":`Umbenennen`,"workspaceTemplates.renameTitle":`Vorlage umbenennen`,"workspaceTemplates.deleteConfirm":`Vorlage „{name}“ löschen?`,"workspaceTemplates.deleted":`Vorlage „{name}“ gelöscht`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Zugangsdaten bleiben lokal und werden nur von bkt verwendet.`,"settings.bitbucketUsername":`Atlassian-E-Mail`,"settings.bitbucketToken":`Bitbucket-API-Token`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Sprache`,"settings.nav.notifications":`Benachrichtigungen`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.help.general":`Sprache, Netzwerkzugriff und die Standardwerte, die jedes Projekt erbt.`,"settings.help.agents":`Standardmodelle und Berechtigungen sowie Grenzen für automatische Wiederholungen.`,"settings.help.skills":`Welche Skill-Suiten der Agent verwenden soll.`,"settings.help.prompts":`Agentenanweisungen nach dem Öffnen einer PR/MR, für Code-Reviews, CI-Korrekturen und Abschluss.`,"settings.help.scripts":`Setup-, Cleanup- und Change-Source-Branch-Skripte sowie Lifecycle-Hooks.`,"settings.help.notion":`Eine Notion-Seite als Source of Truth eines Workspace importieren.`,"settings.help.sentry":`Einen Workspace aus einem Sentry-Issue erstellen.`,"settings.help.forge":`Bitbucket-Zugangsdaten. GitHub und GitLab verwenden Ihre angemeldete gh/glab-CLI; wählen Sie die Forge pro Projekt.`,"settings.help.voice":`Diktat und Push-to-Talk.`,"settings.help.notifications":`Töne, Browser-Benachrichtigungen und die Erinnerung an unbeantwortete Fragen.`,"settings.help.worktrees":`Wo Worktrees angelegt werden, Aufbewahrung und automatisches Löschen.`,"settings.help.projects":`Registrierte Projekte und ihre projektspezifischen Überschreibungen.`,"settings.help.templates":`Prompt-Vorlagen, die in der Chat-Eingabe expandiert werden.`,"settings.help.workspaceTemplates":`Gespeicherte Voreinstellungen des Erstellungsformulars.`,"settings.help.export":`Alle Einstellungen als JSON exportieren und importieren.`,"settings.openNav":`Navigation öffnen`,"settings.saveError":`Fehler beim Speichern der Einstellungen.`,"settings.projectSaved":`Projekt gespeichert.`,"settings.projectSaveError":`Fehler beim Speichern des Projekts.`,"settings.projectDeleted":`Projekt gelöscht.`,"settings.deleteProjectConfirmTitle":`Projekt löschen?`,"settings.deleteProjectConfirmMessage":`„{name}" aus Ihren Projekten entfernen? Dies löscht nur die Kōbō-Einstellungen — Ihr Code und Ihre Worktrees bleiben unberührt.`,"settings.projectDeleteError":`Fehler beim Löschen des Projekts.`,"settings.projectPathRequired":`Projektpfad ist erforderlich.`,"templates.title":`Vorlagen`,"templates.newTemplate":`Neue Vorlage`,"templates.editTemplate":`Vorlage bearbeiten`,"templates.deleteTemplate":`Vorlage löschen`,"templates.deleteConfirm":`Vorlage '/{slug}' löschen?`,"templates.deleteConfirmMessage":`Dies kann nicht rückgängig gemacht werden.`,"templates.slug":`Slug`,"templates.slugHint":`Kleinbuchstaben, Ziffern, Bindestriche. Max. 64 Zeichen.`,"templates.slugInvalid":`Slug darf nur Kleinbuchstaben, Ziffern und Bindestriche enthalten`,"templates.slugDuplicate":`Eine Vorlage mit diesem Slug existiert bereits`,"templates.description":`Beschreibung`,"templates.descriptionHint":`Kurzes Label, das im Dropdown angezeigt wird.`,"templates.descriptionRequired":`Beschreibung ist erforderlich`,"templates.contentRequired":`Inhalt ist erforderlich`,"templates.content":`Inhalt`,"templates.contentHint":`Vorlageninhalt. Verwende {variable_name} für Substitutionen.`,"templates.availableVars":`Verfügbare Variablen`,"templates.filePath":`Datei: {path}`,"templates.empty":`Noch keine Vorlagen.`,"templates.createFailed":`Vorlage konnte nicht erstellt werden`,"templates.updateFailed":`Vorlage konnte nicht aktualisiert werden`,"templates.deleteFailed":`Vorlage konnte nicht gelöscht werden`,"templates.save":`Speichern`,"templates.create":`Erstellen`,"templates.reloadDefaults":`Standardvorlagen neu laden`,"templates.reloadDefaultsHint":`Fügt nur fehlende Standardvorlagen hinzu. Bestehende Vorlagen (auch geänderte) werden nie überschrieben.`,"templates.reloadDefaultsConfirmMessage":`Diese Aktion fügt die fehlenden Standardvorlagen wieder zur Liste hinzu. Bestehende Vorlagen — einschließlich derjenigen, die du angepasst hast — werden nicht berührt. Wenn du eine geänderte Standardvorlage zurücksetzen möchtest, lösche sie zuerst und führe diese Aktion dann erneut aus.`,"templates.reloadDefaultsSuccess":`{added} hinzugefügt, {kept} beibehalten`,"templates.reloadDefaultsFailed":`Standardvorlagen konnten nicht neu geladen werden`,"templates.resetToDefault":`Auf Standard zurücksetzen`,"templates.resetConfirmTitle":`Template auf Standard zurücksetzen?`,"templates.resetConfirmMessage":`Dies überschreibt deine lokalen Änderungen an /{slug} mit dem Standard. Kann nicht rückgängig gemacht werden.`,"templates.resetSuccess":`Template /{slug} auf Standard zurückgesetzt`,"templates.resetFailed":`Zurücksetzen des Templates fehlgeschlagen`,"chatInput.dropdownSkills":`Claude-Skills`,"chatInput.dropdownKobo":`Kōbō-Befehle`,"chatInput.dropdownTemplates":`Vorlagen`,"documents.title":`Dokumente`,"documents.empty":`Keine Dokumente gefunden`,"documents.refresh":`Aktualisieren`,"documents.back":`Zurück`,"documents.loadFailed":`Dokument konnte nicht geladen werden`,"git.title":`Git`,"git.outputDialogTitle":`Git hat einen Fehler gemeldet`,"git.statsFailed":`Der Git-Status konnte nicht gelesen werden`,"git.section.repository":`Repository`,"git.section.changes":`Änderungen`,"git.section.pullRequest":`Pull Request`,"git.section.actions":`Aktionen`,"git.actions.more":`Mehr`,"git.localOnly":`nur lokal`,"git.pushed":`gepusht`,"git.unpushed":`{count} nicht gepusht`,"git.commits":`{count} Commit | {count} Commits`,"git.commits.loading":`Commits werden geladen…`,"git.commits.empty":`Keine Commits auf diesem Branch`,"git.commits.pushed":`Gepusht`,"git.commits.unpushed":`Ungepusht`,"git.commits.clickToAppend":`klicken, um SHA an Chat anzuhängen`,"git.commits.diffThisCommit":`Diff dieses Commits (vs Parent)`,"git.compareCommits":`Commits vergleichen…`,"git.files":`{count} Datei | {count} Dateien`,"git.staged":`{count} vorgemerkt`,"git.modified":`{count} geändert`,"git.untracked":`{count} nicht verfolgt`,"git.workingTreeEmpty":`Keine nicht committeten Änderungen`,"git.fileStaged":`Bereitgestellt`,"git.fileModified":`Geändert`,"git.fileUntracked":`Nicht verfolgt`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.pushRejectedHistory":`Push abgelehnt: Lokaler und entfernter Branch haben unterschiedliche Historien. Nach einem Rebase veröffentlichter Commits verwenden Sie Force push mit Bestätigung. Andernfalls holen Sie die entfernten Änderungen und integrieren sie vor einem erneuten Versuch.`,"git.pushRejectedLease":`Force push abgelehnt: Der entfernte Branch hat sich seit dem letzten Fetch geändert. Holen und prüfen Sie diese Änderungen vor einem erneuten Versuch.`,"git.pushFailed":`Der Branch konnte nicht gepusht werden. Öffnen Sie die Details zur Ursache.`,"git.pushBlockedByOperation":`Zuerst die laufende {operation}-Operation abschließen oder abbrechen`,"git.pushUpToDate":`Nichts zu pushen: der Branch ist auf origin bereits aktuell`,"git.forcePushHint":`Sicherer als --force: Der Push wird abgelehnt, wenn der Remote Commits hat, die du nicht gesehen hast. Nach einem Rebase oder Amend bereits gepushter Commits verwenden.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`Kein Upstream für diesen Branch gesetzt — pushe ihn zuerst, um Pull zu aktivieren.`,"git.sync":`Sync`,"git.createPrNoRemote":`Branch zuerst pushen`,"git.viewRequest":`{request} anzeigen`,"git.createRequest":`{request} erstellen`,"git.changeRequestBase":`Zielbranch der {request} ändern`,"git.forgeCliMissing":`{cli} ist nicht installiert — installieren Sie es für {request}-Funktionen`,"git.forgeNotAuthenticated":`Nicht authentifiziert — {cli} auth login ausführen`,"settings.forge":`Forge`,"settings.forge.auto":`Automatisch erkennen`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Keine`,"git.pullConfirmTitle":`Branch pullen?`,"git.pullConfirmMessage":`{branch} vom Remote pullen (nur Fast-Forward).`,"git.branchPulled":`Branch gepullt`,"git.pullFailed":`Pull fehlgeschlagen`,"git.renameBranch":`Branch umbenennen`,"git.renameBranchPrompt":"`{branch}` umbenennen in:","git.renameBranchSuccess":"Branch umbenannt in `{branch}`","git.renameBranchFailed":`Branch umbenennen fehlgeschlagen`,"git.renameBranchExists":"Branch `{branch}` existiert bereits lokal oder auf origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Diff-Viewer im Review-Modus öffnen — Inline-Kommentare + Batch-Übergabe an den Agenten`,"pr.baseChanged":`PR-Base geändert: {oldBase} → {newBase}`,"pr.openPr":`PR öffnen`,"pr.openWorkspace":`Workspace öffnen`,"pr.dismiss":`Schließen`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Branch rebasen?`,"git.rebaseConfirmMessage":`Rebase auf {branch}. Es können Konflikte auftreten.`,"git.rebaseSuccess":`Rebase abgeschlossen`,"git.rebaseFailed":`Rebase fehlgeschlagen`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repository abgerufen`,"git.fetchFailed":`Fetch fehlgeschlagen: {error}`,"git.mergeConfirmTitle":`Branch mergen?`,"git.mergeConfirmMessage":`{branch} in diesen Branch mergen. Konflikte möglich.`,"git.mergeSuccess":`Merge abgeschlossen`,"git.mergeFailed":`Merge fehlgeschlagen`,"git.commitFailed":`Commit fehlgeschlagen`,"git.commitChanges":`Änderungen committen`,"git.commitDialogTitle":`Nicht committete Änderungen committen`,"git.commitDialogDescription":`Geben Sie Ihre Nachricht ein oder bitten Sie den Agenten, den Commit zu prüfen und zu erstellen.`,"git.commitMessage":`Commit-Nachricht`,"git.commitManual":`Committen`,"git.commitWithAgent":`Agenten fragen`,"git.commitAgentSuccess":`Commit-Anfrage an den Agenten gesendet`,"git.discardFailed":`Verwerfen fehlgeschlagen`,"git.conflictTitleMerge":`Merge-Konflikte erkannt`,"git.conflictTitleRebase":`Rebase-Konflikte erkannt`,"git.operationPausedTitle":`Git-Vorgang fortsetzen`,"git.operationPausedSubtitle":`Keine Dateien stehen im Konflikt. Git wartet nur darauf, dass du den Vorgang fortsetzt.`,"git.conflictSubtitle":`{count} Datei(en) mit Konflikten. Wie soll fortgefahren werden?`,"git.conflictAbortConfirmTitle":`Konfliktlösung verwerfen?`,"git.conflictAbortConfirmMessage":`Alles, was du in diesem {op} gelöst hast, wird verworfen und der Worktree kehrt in den Zustand davor zurück. Das lässt sich nicht rückgängig machen.`,"git.conflictAbort":`Abbrechen`,"git.conflictContinue":`Fortsetzen`,"git.conflictContinued":`Git-Vorgang fortgesetzt`,"git.conflictResolveWithAgent":`Agent soll auflösen`,"git.conflictAborted":`Vorgang abgebrochen`,"git.conflictHandoffSuccess":`Agent löst die Konflikte`,"git.dirtyTitleRebase":`Nicht committete Änderungen blockieren den Rebase`,"git.dirtyTitleMerge":`Nicht committete Änderungen blockieren den Merge`,"git.dirtyTitlePull":`Nicht committete Änderungen blockieren den Pull`,"git.dirtySubtitle":`{modified} geändert, {staged} bereitgestellt, {untracked} nicht verfolgt. Wähle, wie es weitergeht.`,"git.dirtyStash":`Stash & erneut versuchen`,"git.dirtyCommit":`Commit zuerst`,"git.dirtyCommitPlaceholder":`Commit-Nachricht`,"git.dirtyCommitConfirm":`Commit & erneut versuchen`,"git.dirtyDiscard":`Änderungen verwerfen`,"git.dirtyDiscardConfirmTitle":`Alle nicht committeten Änderungen verwerfen?`,"git.dirtyDiscardConfirmMessage":`Verfolgte Änderungen gehen verloren (git reset --hard). Nicht verfolgte Dateien bleiben erhalten. Nicht umkehrbar.`,"git.pushConfirmTitle":`Branch pushen?`,"git.pushConfirmMessage":`{branch} zum Remote pushen.`,"git.pushConfirmMessagePrefix":`Branch`,"git.pushConfirmMessageSuffix":`zum Remote pushen.`,"git.changePrBaseTitle":`Zielbranch ändern`,"git.changePrBaseMessage":`Geben Sie den neuen Zielbranch für den {request} ein.`,"git.changePrBaseSuccess":`{request}-Zielbranch aktualisiert`,"git.changePrBaseFailed":`{request}-Zielbranch konnte nicht geändert werden`,"git.mergeRequest":`{request} mergen`,"git.mergeRequestConfirmTitle":`{request} mergen?`,"git.mergeRequestConfirmMessage":`Dadurch wird die offene {request} in ihren Zielbranch gemergt.`,"git.mergeRequestSuccess":`{request} gemergt`,"git.mergeRequestFailed":`{request} konnte nicht gemergt werden`,"git.deleteRemoteBranch":`Remote-Branch löschen`,"git.deleteRemoteBranchTitle":`Remote-Branch löschen?`,"git.deleteRemoteBranchMessage":`Die Anfrage wurde gemergt. Remote-Branch {branch} löschen?`,"git.deleteRemoteBranchSuccess":`Remote-Branch {branch} gelöscht`,"git.deleteRemoteBranchFailed":`Remote-Branch konnte nicht gelöscht werden`,"git.changeSourceBranch":`Quellbranch ändern`,"git.changeSourceBranchTitle":`Quellbranch ändern`,"git.changeSourceBranchMessage":`Wähle den neuen Quellbranch. Der Arbeitsbranch wird darauf neu aufgebaut.`,"git.changeSourceBranchDone":`Quellbranch auf {branch} geändert`,"git.changeSourceBranchAligned":`Quellbranch auf {branch} geändert (Branch hatte keine eigenen Commits)`,"git.changeSourceBranchTooMany":`Der Branch hat zu viele eigene Commits ({n}) — bitte manuell rebasen`,"git.changeSourceBranchDirty":`Committe oder stashe deine Änderungen, bevor du den Quellbranch änderst`,"git.changeSourceBranchAgentRunning":`Stoppe den Agenten, bevor du den Quellbranch änderst`,"git.changeSourceBranchErrorTitle":`Quellbranch-Wechsel fehlgeschlagen`,"git.changeSourceBranchErrorOngoing":`Eine {op}-Operation läuft noch im Worktree. Brich sie ab, um zu einem sauberen Zustand zurückzukehren.`,"git.changeSourceBranchErrorAbort":`Operation abbrechen`,"git.changeSourceBranchLoading":`Quellbranch wird geändert…`,"git.changeSourceForcePushTitle":`Neu geschriebenen Branch force-pushen?`,"git.changeSourceForcePushMessage":`Die Branch-Historie wurde neu geschrieben. Mit --force-with-lease zum Remote pushen?`,"git.changeSourceForcePushDone":`Branch force-gepusht`,"git.openEditor":`Im Editor öffnen`,"git.openEditorFailed":`Editor konnte nicht geöffnet werden`,"git.branchPushed":`Branch gepusht`,"git.pushFirst":`Der Branch ist nicht auf dem Remote. Klicken Sie zuerst auf Push.`,"git.unpushedCommits":`Lokale Commits sind nicht gepusht. Klicken Sie zuerst auf Push.`,"git.from":`von`,"git.aheadBehindTooltip":`{ahead} commits voraus, {behind} hinterher gegenüber {source}`,"git.divergence.title":`Branch-Divergenz`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} voraus`,"git.divergence.behind":`↓ {count} hinterher`,"git.divergence.empty.ahead":`Keine Commits voraus.`,"git.divergence.empty.behind":`Keine Commits hinterher.`,"git.divergence.close":`Schließen`,"git.divergence.loading":`Commits werden geladen…`,"git.divergence.failed":`Divergenz konnte nicht geladen werden`,"git.divergence.retry":`Erneut versuchen`,"git.prCreated":`{request} #{n} erstellt`,"git.pr.author":`Autor`,"git.pr.reviewers":`Reviewer`,"git.pr.assignees":`Zugewiesen`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Änderungen angefordert`,"git.pr.approvedBadge":`Genehmigt`,"git.pr.ci.passed":`CI erfolgreich`,"git.pr.ci.failed":`CI fehlgeschlagen`,"git.pr.ci.pending":`CI läuft`,"git.pr.ci.failedCount":`{n} fehlgeschlagen`,"git.pr.ci.pendingCount":`{n} laufend`,"git.pr.ci.passedCount":`{n} erfolgreich`,"git.pr.ci.skippedCount":`{n} übersprungen`,"git.pr.ci.showPassed":`{n} erfolgreiche Jobs anzeigen`,"git.pr.ci.hidePassed":`Erfolgreiche Jobs ausblenden`,"toast.prChangesRequested":`Für PR #{n} wurden Änderungen angefordert`,"toast.prApproved":`PR #{n} wurde genehmigt`,"toast.prReadyToMerge":`PR #{n} ist bereit zum Mergen`,"toast.prCiFailed":`CI für PR #{n} ist fehlgeschlagen`,"toast.prCiRecovered":`CI für PR #{n} ist wieder erfolgreich`,"toast.prMergeConflict":`PR #{n} hat Merge-Konflikte`,"toast.prMerged":`PR #{n} wurde gemergt`,"devServer.title":`Dev-Server`,"devServer.noWorkspace":`Kein Arbeitsbereich ausgewählt`,"devServer.notConfigured":`Nicht konfiguriert —`,"devServer.goToSettings":`Einstellungen`,"devServer.logs":`Logs`,"devServer.running":`Läuft`,"devServer.starting":`Startet`,"devServer.stopping":`Wird gestoppt`,"devServer.error":`Fehler`,"devServer.stopped":`Gestoppt`,"devServer.unknown":`Unbekannt`,"devServer.containers":`{count} Container | {count} Container`,"devServer.logDialog.title":`Dev-Server-Logs`,"devServer.logDialog.empty":`Keine Logs verfügbar`,"notion.title":`Notion`,"tasks.title":`Aufgaben`,"notion.addTask":`Aufgabe hinzufügen`,"notion.noUrl":`Keine Notion-URL`,"notion.subtasks":`{done}/{total} Unteraufgaben`,"notion.noTasks":`Keine Aufgaben`,"notion.newTask":`Neue Aufgabe... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.title":`Akzeptanzkriterien`,"acceptance.addCriterion":`Kriterium hinzufügen`,"acceptance.newCriterion":`Neues Kriterium... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.empty":`Keine Akzeptanzkriterien`,"tasks.askProgress":`Agent auffordern, Fortschritt zu prüfen`,"agentTodos.title":`Agent-Todos`,"agentTodos.empty":`Keine Agent-Todos`,"subagents.title":`Sub-Agents`,"subagents.empty":`Noch keine Sub-Agent-Aktivität`,"subagents.tools":`{count} Tools`,"subagents.running":`Aktiv: `,"subagents.status.running":`Läuft`,"subagents.status.done":`Abgeschlossen`,"subagents.status.failed":`Fehlgeschlagen`,"subagents.status.stopped":`Gestoppt`,"subagents.ambient":`Hintergrundüberwachung`,"subagents.ambientTooltip":`Hintergrundüberwachung (z. B. Monitor): zählt nicht als Agent-Aktivität`,"subagents.stop":`Diesen Sub-Agenten stoppen`,"subagents.stopAll":`Alle stoppen`,"subagents.stopFailed":`Sub-Agent konnte nicht gestoppt werden: {error}`,"subagents.activity":`Aktivität des Sub-Agenten`,"subagents.noActivity":`Noch keine sichtbare Anbieteraktivität`,"chat.subagentActivity":`Unteragent-Aktivität`,"chat.openSubagentActivity":`Diesen Unteragenten im Seitenbereich öffnen`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Nutzungs-Bucket {n}`,"quotaFooter.lastUpdated":`Letzte Aktualisierung: {time}`,"quotaFooter.empty":`Lädt…`,"quotaFooter.popover.title":`Claude Code-Nutzung`,"quotaFooter.popover.refreshNow":`Aktualisieren`,"quotaFooter.popover.resetsIn":`Setzt sich zurück um {value}`,"quotaFooter.popover.unauthenticated":`Auth erforderlich`,"quotaFooter.popover.unauthenticatedHint":`Führe "claude" einmal aus, um dich zu authentifizieren.`,"quotaFooter.popover.error":`Fehler`,"quotaFooter.bucket.fiveHour":`5-Stunden`,"quotaFooter.bucket.sevenDay":`7 Tage`,"agent.error.spawn_failed":`Agent konnte nicht gestartet werden`,"agent.error.parse_error":`Eine Agent-Nachricht konnte nicht verarbeitet werden`,"agent.error.rate_limit":`Ratenlimit erreicht`,"agent.error.resume_failed":`Sitzung nicht gefunden — neue Sitzung wird gestartet`,"agent.error.other":`Agent-Fehler`,"quotaBackoff.banner.title":`Auto-Wiederaufnahme um {time}`,"quotaBackoff.banner.transientTitle":`Auto-Wiederaufnahme nach Unterbrechung um {time}`,"quotaBackoff.resumeNow":`Jetzt fortsetzen`,"quotaBackoff.banner.tooltip":`Claude-Kontingent erschöpft. Der Auto-Loop wird automatisch fortgesetzt, sobald sich das Kontingent bei {resets_at} zurücksetzt.`,"quotaBackoff.banner.cancel":`Wiederaufnahme abbrechen`,"quotaBackoff.cancelled":`Auto-Wiederaufnahme abgebrochen — du kannst jederzeit manuell fortfahren`,"rateLimitType.fiveHour":`5h-Sitzung`,"rateLimitType.sevenDay":`Wöchentlich`,"tooltip.addTask":`Aufgabe hinzufügen`,"tooltip.removeTask":`Aufgabe entfernen`,"tooltip.addCriterion":`Kriterium hinzufügen`,"tooltip.removeCriterion":`Kriterium entfernen`,"tooltip.startDevServer":`Dev-Server starten`,"tooltip.stopDevServer":`Dev-Server stoppen`,"tooltip.closeDiffViewer":`Diff schließen`,"tooltip.refreshLogs":`Logs aktualisieren`,"tooltip.closeDialog":`Schließen`,"tooltip.refreshGitStats":`Git-Statistiken aktualisieren`,"tooltip.removeImage":`Bild entfernen`,"tooltip.sendMessage":`Nachricht senden`,"tools.title":`Werkzeuge`,"tools.runSetupScript":`Setup-Skript erneut ausführen`,"tools.runSetupScriptTooltip":`Das Setup-Skript des Projekts im Worktree ausführen`,"tools.runSetupScriptConfirm":`Setup-Skript in diesem Workspace erneut ausführen? Vorhandene Artefakte können überschrieben werden.`,"tools.runSetupScriptBusy":`Setup kann nicht erneut ausgeführt werden, während der Agent arbeitet.`,"tools.noSetupScript":`Kein Setup-Skript konfiguriert —`,"tools.setupScriptSuccess":`Setup-Skript erfolgreich abgeschlossen.`,"tools.setupScriptFailed":`Setup-Skript fehlgeschlagen.`,"tools.openNotion":`In Notion öffnen`,"tools.openSentry":`In Sentry öffnen`,"tools.review":`Änderungen prüfen`,"tools.reviewTooltip":`Den Agenten bitten, die Änderungen auf diesem Branch zu prüfen`,"tools.reviewBusy":`Agent ist beschäftigt — warte, bis er inaktiv ist`,"tools.fixCi":`CI reparieren`,"tools.fixCiTooltip":`Den Agenten bitten, die fehlschlagenden CI-Jobs zu diagnostizieren und zu beheben`,"tools.fixCiLaunched":`CI-Fix-Aktion an den Agenten gesendet`,"tools.fixCiFailed":`CI-Fix-Aktion konnte nicht gestartet werden`,"tools.openFileManager":`Im Dateimanager öffnen`,"tools.openFileManagerTooltip":`Worktree-Ordner im konfigurierten Dateimanager öffnen`,"tools.openFileManagerFailed":`Dateimanager konnte nicht geöffnet werden`,"tools.openTerminal":`Im Terminal öffnen`,"tools.openTerminalTooltip":`Den Worktree im konfigurierten Terminal öffnen`,"tools.openTerminalFailed":`Terminal konnte nicht geöffnet werden`,"review.title":`Review starten`,"review.subtitle":`Bitte den Agenten, deine Änderungen zu prüfen und Feedback zu geben.`,"review.additionalInstructions":`Zusätzliche Anweisungen (optional)`,"review.additionalInstructionsPlaceholder":`Spezifische Hinweise für die Review hinzufügen…`,"review.newSession":`Neue Sitzung`,"review.newSessionHint":`Eine neue Agenten-Sitzung starten statt die aktuelle fortzusetzen.`,"review.newSessionRequired":`Andere Agenteneinstellungen oder eine automatische Rückkehr erfordern eine neue Sitzung.`,"review.returnToSession":`Nach dem Review zur aktuellen Sitzung zurückkehren`,"review.returnToSessionHint":`Setzt diese Sitzung mit der abschließenden Zusammenfassung des Reviewers fort. Andernfalls geht die Unterhaltung in der Review-Sitzung weiter.`,"review.readOnlyForced":`Ein Review, das zu dieser Session zurückkehrt, läuft schreibgeschützt (Plan): Es kann keine Dateien ändern und keine Fragen stellen.`,"review.returnUnavailable":`Die aktuelle Sitzung muss gestartet worden sein, bevor sie fortgesetzt werden kann.`,"review.start":`Review starten`,"review.cancel":`Abbrechen`,"review.launched":`Review gestartet`,"review.failed":`Review konnte nicht gestartet werden`,"diff.title":`Diff`,"diff.side":`Nebeneinander`,"diff.inline":`Inline`,"diff.hideUnchanged":`Unveränderten Code ausblenden`,"diff.showUnchanged":`Unveränderten Code anzeigen`,"diff.showUntracked":`Nicht versionierte Dateien anzeigen`,"diff.hideUntracked":`Nicht versionierte Dateien ausblenden`,"diff.rollbackToRemote":`Auf Remote-Version zurücksetzen`,"diff.rollbackConfirm":`{path} auf die Remote-Version (origin) zurücksetzen? Lokale Änderungen an dieser Datei gehen verloren.`,"diff.rollbackConfirmOk":`Zurücksetzen`,"diff.rollbackDone":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneRemote":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneHead":`Lokale Änderungen verworfen (Datei auf letzten Commit zurückgesetzt)`,"diff.rollbackDoneDeleted":`Nicht versionierte Datei gelöscht`,"diff.deleteUntracked":`Nicht versionierte Datei löschen`,"diff.deleteUntrackedConfirm":`{path} dauerhaft löschen? Diese Datei wird nicht von Git verfolgt — ihr Inhalt geht verloren.`,"diff.deleteUntrackedConfirmOk":`Löschen`,"diff.rollbackFailed":`Rollback fehlgeschlagen`,"diff.rollbackFailedDetail":`Rollback fehlgeschlagen: {error}`,"diff.modeInspect":`Bearbeiten`,"diff.modeReview":`Review`,"diff.addComment":`Kommentar hinzufügen`,"diff.replyComment":`Antworten`,"diff.editComment":`Bearbeiten`,"diff.deleteComment":`Löschen`,"diff.deleteCommentConfirm":`Diesen Kommentar löschen?`,"diff.commentPlaceholder":`Review-Kommentar schreiben… (Markdown unterstützt)`,"diff.reviewDraft":`Review-Entwurf`,"diff.reviewEmpty":`Noch keine Kommentare — fahre mit der Maus über eine Zeile im Diff und klicke +, um einen hinzuzufügen.`,"diff.reviewGlobalPlaceholder":`Optionale Gesamtnachricht zur Review`,"diff.submitReview":`Review absenden ({n})`,"diff.reviewPending":`Eine Überprüfung wird bereits gesendet.`,"diff.reviewEmptySubmission":`Die Überprüfung ist leer.`,"diff.reviewNotAccepted":`Die Nachricht wurde nicht angenommen. Ihre Überprüfung bleibt erhalten.`,"diff.reviewSubmitted":`Review an den Agenten gesendet`,"diff.reviewSubmitFailed":`Review konnte nicht gesendet werden: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Ungepusht`,"diff.noChanges":`Keine Änderungen`,"diff.searchFiles":`Dateien suchen…`,"diff.noFileMatch":`Keine passende Datei`,"diff.selectFile":`Datei auswählen, um den Diff anzuzeigen`,"diff.fileLoadFailed":`Dieser Diff konnte nicht geladen werden`,"diff.fileLoadFailedHint":`Die Datei auf der Festplatte ist unverändert — nur der Diff konnte nicht geladen werden.`,"diff.fileListLoadFailed":`Die Dateiliste konnte nicht geladen werden`,"diff.fileListLoadFailedHint":`Das ist eine fehlgeschlagene Anfrage, kein Branch ohne Änderungen.`,"diff.addToChat":`Zum Chat hinzufügen`,"diff.compareTitle":`Commits vergleichen`,"diff.compareFrom":`Von`,"diff.compareTo":`Bis`,"diff.compareSubmit":`Vergleichen`,"diff.compareSourceBase":`{branch} (Branch-Basis)`,"diff.commitsReadOnly":`schreibgeschützt`,"diffViewer.save":`Speichern`,"diffViewer.savedAt":`Gespeichert`,"diffViewer.saveFailed":`Speichern fehlgeschlagen`,"diffViewer.saveFailedDetail":`Speichern fehlgeschlagen: {error}`,"diffViewer.unsavedChanges.title":`Nicht gespeicherte Änderungen`,"diffViewer.unsavedChanges.message":`Du hast nicht gespeicherte Änderungen. Was möchtest du tun?`,"diffViewer.unsavedChanges.save":`Speichern`,"diffViewer.unsavedChanges.cancel":`Abbrechen`,"diffViewer.conflict.title":`Datei wurde extern geändert`,"diffViewer.conflict.message":`Die Datei wurde außerhalb von Kōbō geändert, seit du sie geöffnet hast.`,"diffViewer.conflict.reload":`Neu laden (lokale Änderungen verwerfen)`,"diffViewer.conflict.keep":`Eigene behalten`,"diffViewer.conflict.overwrite":`Trotzdem überschreiben`,"diffViewer.conflict.overwriteHint":`Ersetzt die Datei auf der Festplatte durch deine Version. Die andere Änderung geht verloren.`,"diffViewer.conflict.keepHint":`Behält deine Änderungen im Editor und übernimmt die neue Signatur der Datei, damit das nächste Speichern funktioniert.`,"diffViewer.saveBlocked":`Der Agent läuft — stoppe ihn, um deine Änderungen zu speichern.`,"diffViewer.unsavedBanner":`Ungespeicherte Änderungen. Stoppe den Agenten, um sie zu sichern.`,"diffViewer.closeConfirm.title":`Ungespeicherte Änderungen`,"diffViewer.closeConfirm.message":`Diese Datei enthält nie gespeicherte Änderungen. Beim Schließen des Diff-Viewers gehen sie verloren.`,"diffViewer.closeConfirm.discard":`Ohne Speichern schließen`,"diffViewer.criteriaRail":`Review-Checkliste`,"diffViewer.criteriaRailShow":`Review-Checkliste einblenden`,"diffViewer.criteriaRailHide":`Review-Checkliste ausblenden`,"diffViewer.fileTreeShow":`Dateibaum einblenden`,"diffViewer.fileTreeHide":`Dateibaum ausblenden`,"diffViewer.closeConfirm.saveAndClose":`Speichern und schließen`,"diffViewer.agentRunning":`Agent läuft — stoppe ihn zum Bearbeiten`,"diffViewer.fileDeleted":`Datei gelöscht`,"notification.agentFinished":`{name} — Agent fertig`,"notification.agentQuestion":`{name} — Agent stellt eine Frage`,"notification.awaitingReminder":`{name} - wartet weiterhin auf Sie ({minutes} Min.)`,"notification.agentPermissionRequest":`{name} — Agent fragt nach einer Berechtigung`,"notification.autoLoopCompleted":`{name} — Auto-Loop abgeschlossen`,"notification.autoLoopWaitingForSlot":`{name} - Auto-Loop wartet auf einen freien Agenten-Slot ({running}/{limit} aktiv)`,"notification.autoLoopStalled":`{name} — Auto-Loop blockiert (kein Fortschritt)`,"notification.autoLoopError":`{name} — Auto-Loop wegen Fehler gestoppt`,"notification.autoLoopAwaitingClarification":`{name} — Auto-Loop pausiert, wartet auf Ihre Klärung`,"notification.autoLoopPermissionOverridden":`{name} — Auto-Loop hat plan-Modus auf bypass erzwungen`,"notification.agentError":`{name} — Agent-Fehler`,"contextMenu.rename":`Umbenennen`,"contextMenu.editDescription":`Beschreibung bearbeiten`,"contextMenu.copyPath":`Worktree-Pfad kopieren`,"contextMenu.copyWorkspaceId":`Workspace-ID kopieren`,"contextMenu.openEditor":`Im Editor öffnen`,"contextMenu.openFileManager":`Im Dateimanager öffnen`,"contextMenu.unarchiveDisabledPurged":`Stellen Sie zuerst den Worktree über Worktree wiederherstellen oder manuell wieder her. Kōbō erkennt passende Worktrees automatisch.`,"workspaceList.unarchiveBlockedPurged":`Stellen Sie zuerst den Worktree über Worktree wiederherstellen oder manuell wieder her. Kōbō erkennt passende Worktrees automatisch.`,"contextMenu.purgeWorktree":`Speicherplatz freigeben (Worktree löschen)`,"contextMenu.purgeWorktreeTooltip":`Löscht den Worktree von der Festplatte zur Speicherplatz-Rückgewinnung — Chat- und Sitzungsverlauf bleiben erhalten. Archiviert den Workspace automatisch.`,"contextMenu.purgeWorktreeDialogTitle":`Speicherplatz freigeben?`,"contextMenu.purgeWorktreeDialogMessage":`Der Worktree-Ordner von „{name}" wird von der Festplatte gelöscht. Chat- und Sitzungsverlauf bleiben erhalten. Der Workspace wird automatisch archiviert. In der aktuellen Version nicht rückgängig zu machen.`,"contextMenu.purgeWorktreeDialogConfirm":`Worktree löschen`,"contextMenu.purgeWorktreeSuccess":`Worktree gelöscht — Speicherplatz zurückgewonnen.`,"settings.autoPurgeOnPrMerged":`Worktree automatisch löschen, wenn PR gemerged`,"settings.autoPurgeOnPrMergedHint":`Wenn aktiviert, wird der Worktree von der Festplatte gelöscht, sobald die PR gemerged wird (zusätzlich zur automatischen Archivierung). Chat-Verlauf bleibt erhalten.`,"settings.autoLoopMaxRetries":`Maximale automatische Wiederholungen`,"settings.awaitingUserReminder":`Erinnerung an unbeantwortete Frage`,"settings.awaitingUserReminderHint":`Minuten, die ein Workspace auf Ihre Antwort warten darf, bevor Kōbō Sie erinnert, danach in jedem weiteren Intervall. 0 deaktiviert.`,"settings.localeLoadFailed":`Diese Sprache konnte nicht geladen werden; die aktuelle bleibt aktiv.`,"settings.autoLoopMaxRetriesHint":`Pausiert den Auftrag nach dieser Anzahl vorübergehender Engine- oder Serverfehler. Kontingente warten auf ihre Zurücksetzung und zählen nicht zu diesem Limit.`,"settings.retentionTitle":`Aufbewahrung des Konversationsverlaufs (standardmäßig aus)`,"settings.retentionWarning":`Wird diese Option aktiviert, löscht sie den Konversationsverlauf der Agenten endgültig aus der Datenbank — zuerst alles, was bereits älter als das Zeitfenster ist. Gelöschte Ereignisse lassen sich nicht wiederherstellen.`,"settings.retentionHint":`Läuft einmal beim Start des Servers. Workspaces, Aufgaben, Sessions, Branches und Worktrees bleiben unberührt — betroffen ist nur die aufgezeichnete Agentenausgabe.`,"settings.retentionDaysLabel":`Ereignisse löschen, die älter sind als (Tage)`,"settings.retentionDaysHint":`0 — der Standard — behält alle Ereignisse dauerhaft. Tragen Sie einen Wert ein, um die Aufbewahrung zu aktivieren.`,"settings.retentionKeepLabel":`Immer behaltene Ereignisse pro Workspace`,"settings.retentionKeepHint":`Die neuesten Ereignisse jedes Workspace bleiben unabhängig von ihrem Alter erhalten, damit ein alter, aber noch offener Workspace einen lesbaren Verlauf behält. Empfohlen: 5000.`,"settings.retentionDisabledHint":`Aufbewahrung deaktiviert: Es wird nie etwas gelöscht.`,"settings.retentionConfirmTitle":`Konversationsverlauf endgültig löschen?`,"settings.retentionConfirmMessage":`Nur {days} Tag(e) Verlauf zu behalten löscht beim nächsten Serverstart endgültig {count} der {total} aufgezeichneten Agentenereignisse — einschließlich allem, was bereits älter ist. Das lässt sich nicht rückgängig machen. Fortfahren?`,"settings.retentionConfirmMessageUnknown":`Nur {days} Tag(e) Verlauf zu behalten löscht beim nächsten Serverstart endgültig alle älteren Agentenereignisse — einschließlich allem, was bereits angesammelt wurde. Die genaue Menge konnte nicht ermittelt werden. Das lässt sich nicht rückgängig machen. Fortfahren?`,"settings.purgeDocsTitle":`Wie Purge funktioniert — Wiederherstellung & Berechtigungen`,"settings.purgeDocsRestoreTitle":`Einen bereinigten Worktree wiederherstellen (automatisch erkannt)`,"settings.purgeDocsRestoreIntro":`Ein bereinigter Workspace behält seinen Chat-Verlauf und die PR-Metadaten, aber der Worktree-Ordner ist weg. Baue ihn manuell mit einem dieser Befehle wieder auf — Kōbō erkennt das Wiedererscheinen des Ordners innerhalb von 30 Sekunden und reaktiviert den Workspace automatisch (entarchivieren + Purge-Flag löschen):`,"settings.purgeDocsRestoreCommands":`# GitHub (mit gh CLI):
11
+ # Dein Skript — benutze $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Auf Kōbō-Standard zurücksetzen`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Skript zurücksetzen?`,"settings.changeSourceBranchScript.replaceConfirm":`Deine Änderungen werden durch das Kōbō-Standardskript ersetzt. Fortfahren?`,"settings.cleanupScriptHint":`Shell-Skript, das im Worktree nach jeder Sitzung des Agenten ausgeführt wird. Im Auto-Loop läuft es nur, wenn alle Aufgaben erledigt sind. Leer lassen zum Deaktivieren.`,"settings.cleanupScriptPlaceholder":`z. B. temporäre Dateien löschen, Container stoppen…`,"settings.cleanupScriptMode":`Wann ausführen`,"settings.cleanupScriptMode.idle":`Nach jeder Sitzung — auch wenn Aufgaben übrig sind`,"settings.cleanupScriptMode.noTasks":`Nur wenn keine Kōbō-Aufgabe übrig ist`,"settings.cleanupScriptOnlyOnChanges":`Nur ausführen, wenn Dateien geändert, hinzugefügt oder gelöscht wurden`,"settings.cleanupScriptMode.inherit":`Globale Einstellung übernehmen`,"settings.taskPromptTemplate":`Aufgaben-Prompt`,"settings.taskPromptTemplatePlaceholder":`Prompt, der automatisch in die Aufgabenbeschreibung eingefügt wird…`,"settings.taskPromptTemplateHint":`Wird automatisch in die Aufgabenbeschreibung auf der Erstellungsseite eingefügt, wenn dieses Projekt ausgewählt ist. Unverändert wird er beim Projektwechsel ersetzt; sobald Sie ihn bearbeiten, bleibt Ihr Text erhalten.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Wird mit bash im Worktree nach der Erstellung ausgeführt, bevor der Agent startet. Kein Shebang erforderlich. Bei Fehler wird der Workspace auf Fehler gesetzt. Timeout: 5 Minuten.`,"settings.e2e.title":`E2E-Tests`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Keiner`,"settings.e2e.frameworkOther":`Anderer`,"settings.e2e.skill":`Skill (optional)`,"settings.e2e.skillPlaceholder":`z.B. cypress-tester`,"settings.e2e.prompt":`Eigene Anleitung (optional)`,"settings.e2e.promptPlaceholder":`z.B. Page-Object-Pattern, data-testid-Attribute verwenden`,"settings.e2e.helpText":`Wenn konfiguriert, fügt der Auto-Loop-Grooming-Agent E2E-Unteraufgaben für UI-Funktionen ein.`,"settings.finalization.title":`Auto-loop-Finalisierung`,"settings.finalization.helpText":`Optional: ein Prompt, den der Agent als allerletzte Auto-loop-Iteration ausführt. Wird typischerweise für finale Quality-Checks (Lint, Typecheck, Tests) verwendet. Die Grooming-Phase erstellt eine mit [FINAL] präfixierte Aufgabe, die diesen Prompt nutzt.`,"settings.finalization.prompt":`Finalisierungs-Prompt`,"settings.finalization.promptPlaceholder":`z. B. Führe npm run lint und npm test aus, dann markiere diese Aufgabe als erledigt.`,"settings.editorCommand":`Editor-Befehl`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Editor. Der Worktree-Pfad wird als Argument übergeben.`,"settings.fileManagerCommand":`Dateimanager-Befehl`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Dateimanager. Der Worktree-Pfad wird als Argument übergeben. Leer lassen, um den Button auszublenden.`,"settings.terminalCommand":`Terminal-Befehl`,"settings.terminalCommandHint":`Befehl zum Starten des Terminals im Worktree. Optionaler {path}-Platzhalter für das Verzeichnis.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Claude-MCP-Auswahl`,"settings.mcpAutoSelect":`Auto (erster passender aktiver MCP)`,"settings.notionMcp":`Notion-MCP-Schlüssel`,"settings.sentryMcp":`Sentry-MCP-Schlüssel`,"settings.mcpSelectionHint":`Aktive Einträge werden aus ~/.claude.json gelesen. Auto belassen für das Standard-Matching.`,"settings.configuredProjects":`Konfigurierte Projekte`,"settings.noProjects":`Keine Projekte konfiguriert`,"settings.addProject":`Projekt hinzufügen`,"settings.copyFrom":`Einstellungen kopieren von`,"settings.copyFromPlaceholder":`(keine — Standardwerte verwenden)`,"settings.copyFromHint":`Kopiert alle Einstellungen außer Pfad, Anzeigename und Quell-Branch.`,"settings.copyFromConfirmTitle":`Aktuelle Werte überschreiben?`,"settings.copyFromConfirm":`Damit werden die aktuellen Formularwerte durch die Einstellungen von „{project}" ersetzt. Fortfahren?`,"settings.newProject":`Neues Projekt`,"settings.editProject":`Projekt bearbeiten`,"help.title":`Hilfe`,"help.tours":`Geführte Touren`,"help.steps":`{n} Schritt | {n} Schritte`,"help.markAllSeen":`Alle als gesehen markieren`,"help.markAllSeenHint":`Markiert die aktuellen Touren als gesehen, ohne sie zu starten.`,"help.resetAll":`Alle Touren zurücksetzen`,"help.resetAllHint":`Startet jetzt die Start-Tour; jeder Bildschirm wiederholt seine beim nächsten Öffnen.`,"help.status.unseen":`nicht gesehen`,"help.status.partial":`teilweise`,"help.status.seen":`gesehen`,"help.replayThis":`Tour dieses Bildschirms wiederholen`,"tours.next":`Weiter`,"tours.prev":`Zurück`,"tours.done":`Fertig`,"tours.exitConfirm":`Geführte Tour beenden? Sie startet nicht mehr von selbst; du kannst sie jederzeit über das Hilfemenü wiederholen.`,"tours.home.title":`Orientierung`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Jede Mission lebt hier mit ihrem Status. Badges markieren eine fehlgeschlagene CI, ein Review mit Änderungswünschen oder einen merge-bereiten PR. Ziehe den inneren Rand einer Seitenleiste mit der Maus oder dem Finger, um ihre Breite zu ändern. Bei wenig Platz werden die Schaltflächen oben umgebrochen.`,"tours.home.create.title":`Workspace erstellen`,"tours.home.create.description":`Ein Workspace ist ein Git-Worktree, ein Branch und eine Agent-Session für eine Aufgabe.`,"tours.home.search.title":`Suche`,"tours.home.search.description":`Filtere die Liste nach Namen. Das Suchsymbol oben öffnet die Volltextsuche in den Agent-Gesprächen.`,"tours.home.dashboard.title":`Übersicht`,"tours.home.dashboard.description":`Eine Tabelle für alle aktiven Workspaces: Status, Aufmerksamkeit, PR, Diff, Aktivität sowie die Zuverlässigkeit der Engines.`,"tours.home.health.title":`Status und Changelog`,"tours.home.health.description":`Prüfe Datenbank, Runtimes und aktive Agents. Der Button daneben listet, was sich in jeder Version geändert hat.`,"tours.home.settings.title":`Einstellungen`,"tours.home.settings.description":`Engines, Integrationen, Automatisierung, Worktrees und Projekte. Erstelle jetzt deinen ersten Workspace.`,"tours.create.title":`Einen Workspace erstellen`,"tours.create.project.title":`Projekt und Branch`,"tours.create.project.description":`Wähle das Projekt und den Branch, von dem der Worktree ausgeht.`,"tours.create.mission.title":`Mission`,"tours.create.mission.description":`Beschreibe die Aufgabe oder importiere sie aus einer Notion-Seite oder einem Sentry-Issue.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Wende ein gespeichertes Preset an oder speichere dieses Formular als Preset. „Duplizieren“ auf einer Workspace-Karte öffnet dieses Formular vorausgefüllt.`,"tours.create.engine.title":`Engine und Modell`,"tours.create.engine.description":`Claude Code oder Codex, das Modell, der Reasoning-Aufwand und was der Agent ohne Nachfrage tun darf.`,"tours.create.brainstorm.title":`Brainstorm auf einem anderen Modell`,"tours.create.brainstorm.description":`Führe die erste Brainstorming-Session auf einem anderen Modell aus und wechsle für die Iterationen zurück.`,"tours.create.autoloop.title":`Auto-Loop`,"tours.create.autoloop.description":`Der Agent erledigt Aufgaben und Abschlussprüfungen. Eine optionale unabhängige Abschlussreview wird nach Korrekturen wiederholt, bis keine Findings mehr vorliegen; bei Stillstand pausiert die Schleife.`,"tours.create.finalReview.title":`Abschlussreview konfigurieren`,"tours.create.finalReview.description":`Wähle Engine, Modell, Denkaufwand und Anweisungen für den Reviewer im Voraus. Die Review läuft in einer separaten schreibgeschützten Sitzung. Der ursprüngliche Agent korrigiert Findings; die Review wiederholt sich, bis keine mehr übrig sind.`,"tours.workspace.finalReview.title":`Abschlussreview und Korrekturen`,"tours.workspace.finalReview.description":`Konfiguriere hier den optionalen Abschlussreviewer vor dem Start. Nach Aufgaben und Abschlussprüfungen prüft eine separate Sitzung die Arbeit. Findings gehen zur automatischen Korrektur und erneuten Review an die ursprüngliche Sitzung zurück. Der Zyklus bleibt beim Schließen von Kōbō erhalten.`,"tours.workspace.reviewReturn.title":`Rückkehr aus einer Review`,"tours.workspace.reviewReturn.description":`Die Zusammenfassung kehrt auch nach einem Neustart von Kōbō zur ursprünglichen Sitzung zurück. Prüfe bei unklarer Zustellung vor einem erneuten Versuch den Verlauf; Abbrechen verwirft die Rückkehr. Manuelle Reviews warten vor Korrekturen auf deine Anweisung, Auto-loop korrigiert automatisch.`,"tours.create.comparison.title":`Zwei Engines vergleichen`,"tours.create.comparison.description":`Erstelle zwei Geschwister-Workspaces für dieselbe Aufgabe und vergleiche Commits, Aufgaben und Aktivität.`,"tours.workspace.sessions.title":`Workspace-Sitzungen`,"tours.workspace.sessions.description":`Klicke auf den Titel, um eine Sitzung auszuwählen, anzulegen, umzubenennen oder ihre Kennung zu kopieren.`,"tours.workspace.actions.title":`Workspace-Aktionen`,"tours.workspace.actions.description":`Das Menü ⋯ enthält die geteilte Ansicht, die Befehlspalette, das Seitenpanel und die Führung.`,"tours.workspace.title":`In einem Workspace`,"tours.workspace.chat.title":`Gespräch`,"tours.workspace.chat.description":`Die Ausgabe des Agenten, live: Nachrichten, Tool-Aufrufe, Fragen und Fehler.`,"tours.workspace.input.title":`Mit dem Agenten sprechen`,"tours.workspace.input.description":`Sende eine Nachricht, nutze Slash-Befehle, diktiere per Stimme oder hänge Dateien an.`,"tours.workspace.selectors.title":`Session-Einstellungen`,"tours.workspace.selectors.description":`Öffne Konfigurieren für Modell, Denkaufwand, Berechtigungen und Auto-Loop. Dort steht auch die aktuelle Engine.`,"tours.workspace.status.title":`Status`,"tours.workspace.status.description":`Der Zustand der aktuellen Session; hier kannst du sie bei Bedarf stoppen.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, Diff, Push, Rebase und der PR dieses Branches.`,"tours.workspace.tasks.title":`Aufgaben`,"tours.workspace.tasks.description":`Was der Agent vorhat, und die Akzeptanzkriterien, die er erfüllen muss.`,"tours.workspace.timeline.title":`Zeitachse`,"tours.workspace.timeline.description":`Jede Session dieses Workspaces; öffne eine ältere, um sie nachzulesen.`,"tours.workspace.subagents.title":`Sub-Agents`,"tours.workspace.subagents.description":`Verfolge die Sub-Agents, die der Agent gestartet hat, mit ihrem Live-Fortschritt.`,"tours.workspace.documents.title":`Dokumente`,"tours.workspace.documents.description":`Pläne und Dateien, die der Agent geschrieben hat, lesbar ohne den Chat zu verlassen.`,"tours.workspace.schedule.title":`Zeitplan`,"tours.workspace.schedule.description":`Wake-ups und Crons, die den Agenten später neu starten.`,"tours.workspace.memory.title":`Workspace-Erinnerungen`,"tours.workspace.memory.description":`Sieh die an die ausgewählte Unterhaltung übermittelten Erinnerungen, offene Vorschläge und Workspace-Vorgänge ein. Das Löschen ändert nicht den Chatverlauf des Anbieters.`,"tours.workspace.handoff.title":`Mit frischem Kontext fortfahren`,"tours.workspace.handoff.description":`Lange Unterhaltung? Starte hier eine frische Sitzung oder nutze „LLM wechseln“. Die aktuelle Arbeit wird sofort unterbrochen und die neue Sitzung setzt automatisch im selben Workspace fort. Die Zusammenfassung ist optional: Deaktiviere sie, wenn das Kontingent des aktuellen LLM erschöpft ist. Fortschritt, Bericht und Link zur vorherigen Sitzung erscheinen unter diesem Button.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Eine Shell im Worktree, ohne Kōbō zu verlassen.`,"tours.gitPr.title":`Pull Request`,"tours.gitPr.panel.title":`PR-Status`,"tours.gitPr.panel.description":`CI-Ergebnis, Review-Entscheidung und Reviewer, alle 30 Sekunden aktualisiert.`,"tours.gitPr.actions.title":`Git-Aktionen`,"tours.gitPr.actions.description":`Push, Pull, Rebase oder Basis-Branch wechseln. Bei einem Konflikt lässt ein Button den Agenten ihn lösen.`,"tours.gitPr.attention.title":`Aufmerksamkeits-Badges`,"tours.gitPr.attention.description":`Die Karte zeigt eine fehlgeschlagene CI, angeforderte Änderungen oder einen merge-bereiten PR.`,"tours.settings.title":`Einstellungen`,"tours.settings.engines.title":`Engines und Modelle`,"tours.settings.engines.description":`Standardmodelle, Berechtigungen und Grenzen für automatische Wiederholungen.`,"tours.settings.integrations.title":`Integrationen`,"tours.settings.integrations.description":`Notion- und Sentry-Verbindungen sowie Bitbucket-Zugangsdaten. GitHub und GitLab verwenden Ihre lokale CLI-Anmeldung.`,"tours.settings.automation.title":`Automatisierung`,"tours.settings.automation.description":`Setup- und Cleanup-Skripte, Lifecycle-Hooks, Prompt-Templates, Workspace-Templates und Skills.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.memory.title":`Erinnerungen`,"tours.settings.memory.description":`Wählen Sie manuelles, automatisches oder hybrides Verhalten und durchsuchen, prüfen oder löschen Sie die exakten Speicherdaten der Bereiche. Änderungen an Erinnerungen wirken sofort; der Modus wird über Speichern übernommen.`,"tours.settings.worktrees.description":`Wo Worktrees liegen, wie lange gemergte behalten werden, und das automatische Löschen.`,"tours.settings.projects.title":`Projekte`,"tours.settings.projects.description":`Registrierte Projekte und ihre projektspezifischen Überschreibungen.`,"tours.settings.misc.title":`Allgemein, Stimme, Benachrichtigungen, Export`,"tours.settings.misc.description":`Sprache, Netzwerkzugriff, Diktat, Töne und Browser-Benachrichtigungen sowie ein vollständiger Export deiner Einstellungen.`,"tours.dashboard.title":`Übersicht`,"tours.dashboard.overview.title":`Überblick`,"tours.dashboard.overview.description":`Alle aktiven Workspaces in einer Tabelle; klicke auf eine Zeile, um sie zu öffnen.`,"tours.dashboard.reliability.title":`Zuverlässigkeit der Engines`,"tours.dashboard.reliability.description":`Sessions, Fehler und Dauern pro Engine und Modell.`,"tours.health.title":`Status`,"tours.health.checks.title":`Prüfungen`,"tours.health.checks.description":`Umgebung, Datenbank, Runtimes, Workspaces und Sessions.`,"tours.health.active.title":`Aktiver Zustand`,"tours.health.active.description":`Aktuelle Quota-Back-offs, ausstehende Wake-ups und laufende Auto-Loops.`,"tours.search.title":`Suche`,"tours.search.input.title":`Suchanfrage`,"tours.search.input.description":`Findet Workspace-Namen und Agent-Gespräche.`,"tours.search.archived.title":`Archiviert`,"tours.search.archived.description":`Archivierte Workspaces in die Ergebnisse einbeziehen.`,"tours.changelog.title":`Was ist neu`,"tours.changelog.list.title":`Versionen`,"tours.changelog.list.description":`Was sich in jeder Version geändert hat, neueste zuerst.`,"settings.projectGroup.identity":`Identität`,"settings.projectGroup.defaults":`Standardwerte`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Skripte`,"settings.projectPath":`Projektpfad`,"settings.projectPathPlaceholder":`/pfad/zum/projekt`,"settings.displayName":`Anzeigename`,"settings.displayNamePlaceholder":`Mein Projekt`,"settings.defaultSourceBranch":`Standard-Quellbranch`,"settings.defaultModel.project":`Standardmodell`,"settings.skipPermissions.project":`Berechtigungsabfragen überspringen`,"settings.prPromptTemplate.project":`PR-Prompt-Vorlage`,"settings.prPromptPlaceholder.project":`Projektspezifische Anweisungen für PR-Erstellung...`,"settings.reviewPromptTemplate.project":`Review-Prompt-Vorlage`,"settings.ciFixPromptTemplate.project":`CI-Fix-Prompt-Vorlage`,"settings.gitConventions.project":`Git-Konventionen (Projekt)`,"settings.gitConventionsEmpty":`Leer lassen, um die globalen Konventionen zu verwenden.`,"settings.notionStatus":`Notion-Ticket-Status`,"settings.notionStatusProperty":`Eigenschaftsname`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Zu setzender Wert`,"settings.notionInProgressStatusPlaceholder":`In Bearbeitung, In progress...`,"settings.notionStatusHint":`Wenn ein Workspace mit einem Notion-Ticket erstellt wird, wird die angegebene Eigenschaft auf diesen Wert gesetzt. Beide Felder sind erforderlich. Leer lassen zum Deaktivieren.`,"settings.notionAssignee":`Notion-Zuweisung`,"settings.notionAssigneeHint":`Wenn ein Workspace mit einem Notion-Ticket erstellt wird, wird der über den Notion-MCP authentifizierte Benutzer dieser People-Eigenschaft hinzugefügt — nur wenn sie noch keinen Zuweisungsempfänger hat. Leer lassen zum Deaktivieren.`,"settings.notionAssigneeProperty":`Eigenschaftsname`,"settings.notionAssigneePropertyPlaceholder":`Entwickler, Assignees...`,"settings.notionUserId":`Deine Notion-UUID`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Wähle dein Konto aus der Liste. Notion lehnt Bot-Zuweisungen in People-Eigenschaften ab — dieses Feld ist erforderlich, um die automatische Zuweisung zu aktivieren.`,"settings.notionUsersRefresh":`Aktualisieren`,"settings.notionUsersLoading":`Notion-Benutzer werden geladen…`,"settings.notionUsersLoadFailed":`Liste konnte nicht geladen werden: {error}`,"settings.notionUsersManualFallback":`Liste nicht verfügbar — füge deine Notion-UUID manuell ein.`,"settings.devServer":`Dev-Server`,"settings.devServerStart":`Startskript`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Stoppskript`,"settings.devServerStopPlaceholder":`Optional — der Prozess wird automatisch beendet, wenn leer`,"settings.selectProject":`Projekt auswählen oder neues hinzufügen`,"settings.useGlobal":`Global verwenden`,"settings.saved":`Allgemeine Einstellungen gespeichert.`,"settings.unsavedChanges":`Nicht gespeicherte Änderungen`,"settings.nav.general":`Allgemein`,"settings.nav.agents":`Agenten`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Skripte`,"settings.nav.workspaceTemplates":`Workspace-Vorlagen`,"workspaceTemplates.title":`Workspace-Vorlagen`,"workspaceTemplates.hint":`Gespeicherte Voreinstellungen des Erstellungsformulars. Wählen Sie eine auf der Erstellungsseite; zum Ändern dort laden, anpassen und unter demselben Namen erneut speichern.`,"workspaceTemplates.empty":`Noch keine Vorlage. Füllen Sie das Erstellungsformular aus und nutzen Sie „Als Vorlage speichern“.`,"workspaceTemplates.anyProject":`Jedes Projekt`,"workspaceTemplates.rename":`Umbenennen`,"workspaceTemplates.renameTitle":`Vorlage umbenennen`,"workspaceTemplates.deleteConfirm":`Vorlage „{name}“ löschen?`,"workspaceTemplates.deleted":`Vorlage „{name}“ gelöscht`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Zugangsdaten bleiben lokal und werden nur von bkt verwendet.`,"settings.bitbucketUsername":`Atlassian-E-Mail`,"settings.bitbucketToken":`Bitbucket-API-Token`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Sprache`,"settings.nav.notifications":`Benachrichtigungen`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.help.general":`Sprache, Netzwerkzugriff und die Standardwerte, die jedes Projekt erbt.`,"settings.help.agents":`Standardmodelle und Berechtigungen sowie Grenzen für automatische Wiederholungen.`,"settings.help.skills":`Welche Skill-Suiten der Agent verwenden soll.`,"settings.help.prompts":`Agentenanweisungen nach dem Öffnen einer PR/MR, für Code-Reviews, CI-Korrekturen und Abschluss.`,"settings.help.scripts":`Setup-, Cleanup- und Change-Source-Branch-Skripte sowie Lifecycle-Hooks.`,"settings.help.notion":`Eine Notion-Seite als Source of Truth eines Workspace importieren.`,"settings.help.sentry":`Einen Workspace aus einem Sentry-Issue erstellen.`,"settings.help.forge":`Bitbucket-Zugangsdaten. GitHub und GitLab verwenden Ihre angemeldete gh/glab-CLI; wählen Sie die Forge pro Projekt.`,"settings.help.voice":`Diktat und Push-to-Talk.`,"settings.help.notifications":`Töne, Browser-Benachrichtigungen und die Erinnerung an unbeantwortete Fragen.`,"settings.help.worktrees":`Wo Worktrees angelegt werden, Aufbewahrung und automatisches Löschen.`,"settings.help.projects":`Registrierte Projekte und ihre projektspezifischen Überschreibungen.`,"settings.help.templates":`Prompt-Vorlagen, die in der Chat-Eingabe expandiert werden.`,"settings.help.workspaceTemplates":`Gespeicherte Voreinstellungen des Erstellungsformulars.`,"settings.help.export":`Alle Einstellungen als JSON exportieren und importieren.`,"settings.openNav":`Navigation öffnen`,"settings.saveError":`Fehler beim Speichern der Einstellungen.`,"settings.projectSaved":`Projekt gespeichert.`,"settings.projectSaveError":`Fehler beim Speichern des Projekts.`,"settings.projectDeleted":`Projekt gelöscht.`,"settings.deleteProjectConfirmTitle":`Projekt löschen?`,"settings.deleteProjectConfirmMessage":`„{name}" aus Ihren Projekten entfernen? Dies löscht nur die Kōbō-Einstellungen — Ihr Code und Ihre Worktrees bleiben unberührt.`,"settings.projectDeleteError":`Fehler beim Löschen des Projekts.`,"settings.projectPathRequired":`Projektpfad ist erforderlich.`,"templates.title":`Vorlagen`,"templates.newTemplate":`Neue Vorlage`,"templates.editTemplate":`Vorlage bearbeiten`,"templates.deleteTemplate":`Vorlage löschen`,"templates.deleteConfirm":`Vorlage '/{slug}' löschen?`,"templates.deleteConfirmMessage":`Dies kann nicht rückgängig gemacht werden.`,"templates.slug":`Slug`,"templates.slugHint":`Kleinbuchstaben, Ziffern, Bindestriche. Max. 64 Zeichen.`,"templates.slugInvalid":`Slug darf nur Kleinbuchstaben, Ziffern und Bindestriche enthalten`,"templates.slugDuplicate":`Eine Vorlage mit diesem Slug existiert bereits`,"templates.description":`Beschreibung`,"templates.descriptionHint":`Kurzes Label, das im Dropdown angezeigt wird.`,"templates.descriptionRequired":`Beschreibung ist erforderlich`,"templates.contentRequired":`Inhalt ist erforderlich`,"templates.content":`Inhalt`,"templates.contentHint":`Vorlageninhalt. Verwende {variable_name} für Substitutionen.`,"templates.availableVars":`Verfügbare Variablen`,"templates.filePath":`Datei: {path}`,"templates.empty":`Noch keine Vorlagen.`,"templates.createFailed":`Vorlage konnte nicht erstellt werden`,"templates.updateFailed":`Vorlage konnte nicht aktualisiert werden`,"templates.deleteFailed":`Vorlage konnte nicht gelöscht werden`,"templates.save":`Speichern`,"templates.create":`Erstellen`,"templates.reloadDefaults":`Standardvorlagen neu laden`,"templates.reloadDefaultsHint":`Fügt nur fehlende Standardvorlagen hinzu. Bestehende Vorlagen (auch geänderte) werden nie überschrieben.`,"templates.reloadDefaultsConfirmMessage":`Diese Aktion fügt die fehlenden Standardvorlagen wieder zur Liste hinzu. Bestehende Vorlagen — einschließlich derjenigen, die du angepasst hast — werden nicht berührt. Wenn du eine geänderte Standardvorlage zurücksetzen möchtest, lösche sie zuerst und führe diese Aktion dann erneut aus.`,"templates.reloadDefaultsSuccess":`{added} hinzugefügt, {kept} beibehalten`,"templates.reloadDefaultsFailed":`Standardvorlagen konnten nicht neu geladen werden`,"templates.resetToDefault":`Auf Standard zurücksetzen`,"templates.resetConfirmTitle":`Template auf Standard zurücksetzen?`,"templates.resetConfirmMessage":`Dies überschreibt deine lokalen Änderungen an /{slug} mit dem Standard. Kann nicht rückgängig gemacht werden.`,"templates.resetSuccess":`Template /{slug} auf Standard zurückgesetzt`,"templates.resetFailed":`Zurücksetzen des Templates fehlgeschlagen`,"chatInput.dropdownSkills":`Claude-Skills`,"chatInput.dropdownKobo":`Kōbō-Befehle`,"chatInput.dropdownTemplates":`Vorlagen`,"documents.title":`Dokumente`,"documents.empty":`Keine Dokumente gefunden`,"documents.refresh":`Aktualisieren`,"documents.back":`Zurück`,"documents.loadFailed":`Dokument konnte nicht geladen werden`,"git.title":`Git`,"git.outputDialogTitle":`Git hat einen Fehler gemeldet`,"git.statsFailed":`Der Git-Status konnte nicht gelesen werden`,"git.section.repository":`Repository`,"git.section.changes":`Änderungen`,"git.section.pullRequest":`Pull Request`,"git.section.actions":`Aktionen`,"git.actions.more":`Mehr`,"git.localOnly":`nur lokal`,"git.pushed":`gepusht`,"git.unpushed":`{count} nicht gepusht`,"git.commits":`{count} Commit | {count} Commits`,"git.commits.loading":`Commits werden geladen…`,"git.commits.empty":`Keine Commits auf diesem Branch`,"git.commits.pushed":`Gepusht`,"git.commits.unpushed":`Ungepusht`,"git.commits.clickToAppend":`klicken, um SHA an Chat anzuhängen`,"git.commits.diffThisCommit":`Diff dieses Commits (vs Parent)`,"git.compareCommits":`Commits vergleichen…`,"git.files":`{count} Datei | {count} Dateien`,"git.staged":`{count} vorgemerkt`,"git.modified":`{count} geändert`,"git.untracked":`{count} nicht verfolgt`,"git.workingTreeEmpty":`Keine nicht committeten Änderungen`,"git.fileStaged":`Bereitgestellt`,"git.fileModified":`Geändert`,"git.fileUntracked":`Nicht verfolgt`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.pushRejectedHistory":`Push abgelehnt: Lokaler und entfernter Branch haben unterschiedliche Historien. Nach einem Rebase veröffentlichter Commits verwenden Sie Force push mit Bestätigung. Andernfalls holen Sie die entfernten Änderungen und integrieren sie vor einem erneuten Versuch.`,"git.pushRejectedLease":`Force push abgelehnt: Der entfernte Branch hat sich seit dem letzten Fetch geändert. Holen und prüfen Sie diese Änderungen vor einem erneuten Versuch.`,"git.pushFailed":`Der Branch konnte nicht gepusht werden. Öffnen Sie die Details zur Ursache.`,"git.pushBlockedByOperation":`Zuerst die laufende {operation}-Operation abschließen oder abbrechen`,"git.pushUpToDate":`Nichts zu pushen: der Branch ist auf origin bereits aktuell`,"git.forcePushHint":`Sicherer als --force: Der Push wird abgelehnt, wenn der Remote Commits hat, die du nicht gesehen hast. Nach einem Rebase oder Amend bereits gepushter Commits verwenden.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`Kein Upstream für diesen Branch gesetzt — pushe ihn zuerst, um Pull zu aktivieren.`,"git.sync":`Sync`,"git.createPrNoRemote":`Branch zuerst pushen`,"git.viewRequest":`{request} anzeigen`,"git.createRequest":`{request} erstellen`,"git.changeRequestBase":`Zielbranch der {request} ändern`,"git.forgeCliMissing":`{cli} ist nicht installiert — installieren Sie es für {request}-Funktionen`,"git.forgeNotAuthenticated":`Nicht authentifiziert — {cli} auth login ausführen`,"settings.forge":`Forge`,"settings.forge.auto":`Automatisch erkennen`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Keine`,"git.pullConfirmTitle":`Branch pullen?`,"git.pullConfirmMessage":`{branch} vom Remote pullen (nur Fast-Forward).`,"git.branchPulled":`Branch gepullt`,"git.pullFailed":`Pull fehlgeschlagen`,"git.renameBranch":`Branch umbenennen`,"git.renameBranchPrompt":"`{branch}` umbenennen in:","git.renameBranchSuccess":"Branch umbenannt in `{branch}`","git.renameBranchFailed":`Branch umbenennen fehlgeschlagen`,"git.renameBranchExists":"Branch `{branch}` existiert bereits lokal oder auf origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Diff-Viewer im Review-Modus öffnen — Inline-Kommentare + Batch-Übergabe an den Agenten`,"pr.baseChanged":`PR-Base geändert: {oldBase} → {newBase}`,"pr.openPr":`PR öffnen`,"pr.openWorkspace":`Workspace öffnen`,"pr.dismiss":`Schließen`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Branch rebasen?`,"git.rebaseConfirmMessage":`Rebase auf {branch}. Es können Konflikte auftreten.`,"git.rebaseSuccess":`Rebase abgeschlossen`,"git.rebaseFailed":`Rebase fehlgeschlagen`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repository abgerufen`,"git.fetchFailed":`Fetch fehlgeschlagen: {error}`,"git.mergeConfirmTitle":`Branch mergen?`,"git.mergeConfirmMessage":`{branch} in diesen Branch mergen. Konflikte möglich.`,"git.mergeSuccess":`Merge abgeschlossen`,"git.mergeFailed":`Merge fehlgeschlagen`,"git.commitFailed":`Commit fehlgeschlagen`,"git.commitChanges":`Änderungen committen`,"git.commitDialogTitle":`Nicht committete Änderungen committen`,"git.commitDialogDescription":`Geben Sie Ihre Nachricht ein oder bitten Sie den Agenten, den Commit zu prüfen und zu erstellen.`,"git.commitMessage":`Commit-Nachricht`,"git.commitManual":`Committen`,"git.commitWithAgent":`Agenten fragen`,"git.commitAgentSuccess":`Commit-Anfrage an den Agenten gesendet`,"git.discardFailed":`Verwerfen fehlgeschlagen`,"git.conflictTitleMerge":`Merge-Konflikte erkannt`,"git.conflictTitleRebase":`Rebase-Konflikte erkannt`,"git.operationPausedTitle":`Git-Vorgang fortsetzen`,"git.operationPausedSubtitle":`Keine Dateien stehen im Konflikt. Git wartet nur darauf, dass du den Vorgang fortsetzt.`,"git.conflictSubtitle":`{count} Datei(en) mit Konflikten. Wie soll fortgefahren werden?`,"git.conflictAbortConfirmTitle":`Konfliktlösung verwerfen?`,"git.conflictAbortConfirmMessage":`Alles, was du in diesem {op} gelöst hast, wird verworfen und der Worktree kehrt in den Zustand davor zurück. Das lässt sich nicht rückgängig machen.`,"git.conflictAbort":`Abbrechen`,"git.conflictContinue":`Fortsetzen`,"git.conflictContinued":`Git-Vorgang fortgesetzt`,"git.conflictResolveWithAgent":`Agent soll auflösen`,"git.conflictAborted":`Vorgang abgebrochen`,"git.conflictHandoffSuccess":`Agent löst die Konflikte`,"git.dirtyTitleRebase":`Nicht committete Änderungen blockieren den Rebase`,"git.dirtyTitleMerge":`Nicht committete Änderungen blockieren den Merge`,"git.dirtyTitlePull":`Nicht committete Änderungen blockieren den Pull`,"git.dirtySubtitle":`{modified} geändert, {staged} bereitgestellt, {untracked} nicht verfolgt. Wähle, wie es weitergeht.`,"git.dirtyStash":`Stash & erneut versuchen`,"git.dirtyCommit":`Commit zuerst`,"git.dirtyCommitPlaceholder":`Commit-Nachricht`,"git.dirtyCommitConfirm":`Commit & erneut versuchen`,"git.dirtyDiscard":`Änderungen verwerfen`,"git.dirtyDiscardConfirmTitle":`Alle nicht committeten Änderungen verwerfen?`,"git.dirtyDiscardConfirmMessage":`Verfolgte Änderungen gehen verloren (git reset --hard). Nicht verfolgte Dateien bleiben erhalten. Nicht umkehrbar.`,"git.pushConfirmTitle":`Branch pushen?`,"git.pushConfirmMessage":`{branch} zum Remote pushen.`,"git.pushConfirmMessagePrefix":`Branch`,"git.pushConfirmMessageSuffix":`zum Remote pushen.`,"git.changePrBaseTitle":`Zielbranch ändern`,"git.changePrBaseMessage":`Geben Sie den neuen Zielbranch für den {request} ein.`,"git.changePrBaseSuccess":`{request}-Zielbranch aktualisiert`,"git.changePrBaseFailed":`{request}-Zielbranch konnte nicht geändert werden`,"git.mergeRequest":`{request} mergen`,"git.mergeRequestConfirmTitle":`{request} mergen?`,"git.mergeRequestConfirmMessage":`Dadurch wird die offene {request} in ihren Zielbranch gemergt.`,"git.mergeRequestSuccess":`{request} gemergt`,"git.mergeRequestFailed":`{request} konnte nicht gemergt werden`,"git.deleteRemoteBranch":`Remote-Branch löschen`,"git.deleteRemoteBranchTitle":`Remote-Branch löschen?`,"git.deleteRemoteBranchMessage":`Die Anfrage wurde gemergt. Remote-Branch {branch} löschen?`,"git.deleteRemoteBranchSuccess":`Remote-Branch {branch} gelöscht`,"git.deleteRemoteBranchFailed":`Remote-Branch konnte nicht gelöscht werden`,"git.changeSourceBranch":`Quellbranch ändern`,"git.changeSourceBranchTitle":`Quellbranch ändern`,"git.changeSourceBranchMessage":`Wähle den neuen Quellbranch. Der Arbeitsbranch wird darauf neu aufgebaut.`,"git.changeSourceBranchDone":`Quellbranch auf {branch} geändert`,"git.changeSourceBranchAligned":`Quellbranch auf {branch} geändert (Branch hatte keine eigenen Commits)`,"git.changeSourceBranchTooMany":`Der Branch hat zu viele eigene Commits ({n}) — bitte manuell rebasen`,"git.changeSourceBranchDirty":`Committe oder stashe deine Änderungen, bevor du den Quellbranch änderst`,"git.changeSourceBranchAgentRunning":`Stoppe den Agenten, bevor du den Quellbranch änderst`,"git.changeSourceBranchErrorTitle":`Quellbranch-Wechsel fehlgeschlagen`,"git.changeSourceBranchErrorOngoing":`Eine {op}-Operation läuft noch im Worktree. Brich sie ab, um zu einem sauberen Zustand zurückzukehren.`,"git.changeSourceBranchErrorAbort":`Operation abbrechen`,"git.changeSourceBranchLoading":`Quellbranch wird geändert…`,"git.changeSourceForcePushTitle":`Neu geschriebenen Branch force-pushen?`,"git.changeSourceForcePushMessage":`Die Branch-Historie wurde neu geschrieben. Mit --force-with-lease zum Remote pushen?`,"git.changeSourceForcePushDone":`Branch force-gepusht`,"git.openEditor":`Im Editor öffnen`,"git.openEditorFailed":`Editor konnte nicht geöffnet werden`,"git.branchPushed":`Branch gepusht`,"git.pushFirst":`Der Branch ist nicht auf dem Remote. Klicken Sie zuerst auf Push.`,"git.unpushedCommits":`Lokale Commits sind nicht gepusht. Klicken Sie zuerst auf Push.`,"git.from":`von`,"git.aheadBehindTooltip":`{ahead} commits voraus, {behind} hinterher gegenüber {source}`,"git.divergence.title":`Branch-Divergenz`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} voraus`,"git.divergence.behind":`↓ {count} hinterher`,"git.divergence.empty.ahead":`Keine Commits voraus.`,"git.divergence.empty.behind":`Keine Commits hinterher.`,"git.divergence.close":`Schließen`,"git.divergence.loading":`Commits werden geladen…`,"git.divergence.failed":`Divergenz konnte nicht geladen werden`,"git.divergence.retry":`Erneut versuchen`,"git.prCreated":`{request} #{n} erstellt`,"git.pr.author":`Autor`,"git.pr.reviewers":`Reviewer`,"git.pr.assignees":`Zugewiesen`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Änderungen angefordert`,"git.pr.approvedBadge":`Genehmigt`,"git.pr.ci.passed":`CI erfolgreich`,"git.pr.ci.failed":`CI fehlgeschlagen`,"git.pr.ci.pending":`CI läuft`,"git.pr.ci.failedCount":`{n} fehlgeschlagen`,"git.pr.ci.pendingCount":`{n} laufend`,"git.pr.ci.passedCount":`{n} erfolgreich`,"git.pr.ci.skippedCount":`{n} übersprungen`,"git.pr.ci.showPassed":`{n} erfolgreiche Jobs anzeigen`,"git.pr.ci.hidePassed":`Erfolgreiche Jobs ausblenden`,"toast.prChangesRequested":`Für PR #{n} wurden Änderungen angefordert`,"toast.prApproved":`PR #{n} wurde genehmigt`,"toast.prReadyToMerge":`PR #{n} ist bereit zum Mergen`,"toast.prCiFailed":`CI für PR #{n} ist fehlgeschlagen`,"toast.prCiRecovered":`CI für PR #{n} ist wieder erfolgreich`,"toast.prMergeConflict":`PR #{n} hat Merge-Konflikte`,"toast.prMerged":`PR #{n} wurde gemergt`,"devServer.title":`Dev-Server`,"devServer.noWorkspace":`Kein Arbeitsbereich ausgewählt`,"devServer.notConfigured":`Nicht konfiguriert —`,"devServer.goToSettings":`Einstellungen`,"devServer.logs":`Logs`,"devServer.running":`Läuft`,"devServer.starting":`Startet`,"devServer.stopping":`Wird gestoppt`,"devServer.error":`Fehler`,"devServer.stopped":`Gestoppt`,"devServer.unknown":`Unbekannt`,"devServer.containers":`{count} Container | {count} Container`,"devServer.logDialog.title":`Dev-Server-Logs`,"devServer.logDialog.empty":`Keine Logs verfügbar`,"notion.title":`Notion`,"tasks.title":`Aufgaben`,"notion.addTask":`Aufgabe hinzufügen`,"notion.noUrl":`Keine Notion-URL`,"notion.subtasks":`{done}/{total} Unteraufgaben`,"notion.noTasks":`Keine Aufgaben`,"notion.newTask":`Neue Aufgabe... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.title":`Akzeptanzkriterien`,"acceptance.addCriterion":`Kriterium hinzufügen`,"acceptance.newCriterion":`Neues Kriterium... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.empty":`Keine Akzeptanzkriterien`,"tasks.askProgress":`Agent auffordern, Fortschritt zu prüfen`,"agentTodos.title":`Agent-Todos`,"agentTodos.empty":`Keine Agent-Todos`,"subagents.title":`Sub-Agents`,"subagents.empty":`Noch keine Sub-Agent-Aktivität`,"subagents.tools":`{count} Tools`,"subagents.running":`Aktiv: `,"subagents.status.running":`Läuft`,"subagents.status.done":`Abgeschlossen`,"subagents.status.failed":`Fehlgeschlagen`,"subagents.status.stopped":`Gestoppt`,"subagents.ambient":`Hintergrundüberwachung`,"subagents.ambientTooltip":`Hintergrundüberwachung (z. B. Monitor): zählt nicht als Agent-Aktivität`,"subagents.stop":`Diesen Sub-Agenten stoppen`,"subagents.stopAll":`Alle stoppen`,"subagents.stopFailed":`Sub-Agent konnte nicht gestoppt werden: {error}`,"subagents.activity":`Aktivität des Sub-Agenten`,"subagents.noActivity":`Noch keine sichtbare Anbieteraktivität`,"chat.subagentActivity":`Unteragent-Aktivität`,"chat.openSubagentActivity":`Diesen Unteragenten im Seitenbereich öffnen`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Nutzungs-Bucket {n}`,"quotaFooter.lastUpdated":`Letzte Aktualisierung: {time}`,"quotaFooter.empty":`Lädt…`,"quotaFooter.popover.title":`Claude Code-Nutzung`,"quotaFooter.popover.refreshNow":`Aktualisieren`,"quotaFooter.popover.resetsIn":`Setzt sich zurück um {value}`,"quotaFooter.popover.unauthenticated":`Auth erforderlich`,"quotaFooter.popover.unauthenticatedHint":`Führe "claude" einmal aus, um dich zu authentifizieren.`,"quotaFooter.popover.error":`Fehler`,"quotaFooter.bucket.fiveHour":`5-Stunden`,"quotaFooter.bucket.sevenDay":`7 Tage`,"agent.error.spawn_failed":`Agent konnte nicht gestartet werden`,"agent.error.parse_error":`Eine Agent-Nachricht konnte nicht verarbeitet werden`,"agent.error.rate_limit":`Ratenlimit erreicht`,"agent.error.resume_failed":`Sitzung nicht gefunden — neue Sitzung wird gestartet`,"agent.error.other":`Agent-Fehler`,"quotaBackoff.banner.title":`Auto-Wiederaufnahme um {time}`,"quotaBackoff.banner.transientTitle":`Auto-Wiederaufnahme nach Unterbrechung um {time}`,"quotaBackoff.resumeNow":`Jetzt fortsetzen`,"quotaBackoff.banner.tooltip":`Claude-Kontingent erschöpft. Der Auto-Loop wird automatisch fortgesetzt, sobald sich das Kontingent bei {resets_at} zurücksetzt.`,"quotaBackoff.banner.cancel":`Wiederaufnahme abbrechen`,"quotaBackoff.cancelled":`Auto-Wiederaufnahme abgebrochen — du kannst jederzeit manuell fortfahren`,"rateLimitType.fiveHour":`5h-Sitzung`,"rateLimitType.sevenDay":`Wöchentlich`,"tooltip.addTask":`Aufgabe hinzufügen`,"tooltip.removeTask":`Aufgabe entfernen`,"tooltip.addCriterion":`Kriterium hinzufügen`,"tooltip.removeCriterion":`Kriterium entfernen`,"tooltip.startDevServer":`Dev-Server starten`,"tooltip.stopDevServer":`Dev-Server stoppen`,"tooltip.closeDiffViewer":`Diff schließen`,"tooltip.refreshLogs":`Logs aktualisieren`,"tooltip.closeDialog":`Schließen`,"tooltip.refreshGitStats":`Git-Statistiken aktualisieren`,"tooltip.removeImage":`Bild entfernen`,"tooltip.sendMessage":`Nachricht senden`,"tools.title":`Werkzeuge`,"tools.runSetupScript":`Setup-Skript erneut ausführen`,"tools.runSetupScriptTooltip":`Das Setup-Skript des Projekts im Worktree ausführen`,"tools.runSetupScriptConfirm":`Setup-Skript in diesem Workspace erneut ausführen? Vorhandene Artefakte können überschrieben werden.`,"tools.runSetupScriptBusy":`Setup kann nicht erneut ausgeführt werden, während der Agent arbeitet.`,"tools.noSetupScript":`Kein Setup-Skript konfiguriert —`,"tools.setupScriptSuccess":`Setup-Skript erfolgreich abgeschlossen.`,"tools.setupScriptFailed":`Setup-Skript fehlgeschlagen.`,"tools.openNotion":`In Notion öffnen`,"tools.openSentry":`In Sentry öffnen`,"tools.review":`Änderungen prüfen`,"tools.reviewTooltip":`Den Agenten bitten, die Änderungen auf diesem Branch zu prüfen`,"tools.reviewBusy":`Agent ist beschäftigt — warte, bis er inaktiv ist`,"tools.fixCi":`CI reparieren`,"tools.fixCiTooltip":`Den Agenten bitten, die fehlschlagenden CI-Jobs zu diagnostizieren und zu beheben`,"tools.fixCiLaunched":`CI-Fix-Aktion an den Agenten gesendet`,"tools.fixCiFailed":`CI-Fix-Aktion konnte nicht gestartet werden`,"tools.openFileManager":`Im Dateimanager öffnen`,"tools.openFileManagerTooltip":`Worktree-Ordner im konfigurierten Dateimanager öffnen`,"tools.openFileManagerFailed":`Dateimanager konnte nicht geöffnet werden`,"tools.openTerminal":`Im Terminal öffnen`,"tools.openTerminalTooltip":`Den Worktree im konfigurierten Terminal öffnen`,"tools.openTerminalFailed":`Terminal konnte nicht geöffnet werden`,"review.title":`Review starten`,"review.subtitle":`Bitte den Agenten, deine Änderungen zu prüfen und Feedback zu geben.`,"review.additionalInstructions":`Zusätzliche Anweisungen (optional)`,"review.additionalInstructionsPlaceholder":`Spezifische Hinweise für die Review hinzufügen…`,"review.newSession":`Neue Sitzung`,"review.newSessionHint":`Eine neue Agenten-Sitzung starten statt die aktuelle fortzusetzen.`,"review.newSessionRequired":`Andere Agenteneinstellungen oder eine automatische Rückkehr erfordern eine neue Sitzung.`,"review.returnToSession":`Nach dem Review zur aktuellen Sitzung zurückkehren`,"review.returnToSessionHint":`Setzt diese Sitzung mit der abschließenden Zusammenfassung des Reviewers fort. Andernfalls geht die Unterhaltung in der Review-Sitzung weiter.`,"review.readOnlyForced":`Ein Review, das zu dieser Session zurückkehrt, läuft schreibgeschützt (Plan): Es kann keine Dateien ändern und keine Fragen stellen.`,"review.returnUnavailable":`Die aktuelle Sitzung muss gestartet worden sein, bevor sie fortgesetzt werden kann.`,"review.start":`Review starten`,"review.cancel":`Abbrechen`,"review.launched":`Review gestartet`,"review.failed":`Review konnte nicht gestartet werden`,"diff.title":`Diff`,"diff.side":`Nebeneinander`,"diff.inline":`Inline`,"diff.hideUnchanged":`Unveränderten Code ausblenden`,"diff.showUnchanged":`Unveränderten Code anzeigen`,"diff.showUntracked":`Nicht versionierte Dateien anzeigen`,"diff.hideUntracked":`Nicht versionierte Dateien ausblenden`,"diff.rollbackToRemote":`Auf Remote-Version zurücksetzen`,"diff.rollbackConfirm":`{path} auf die Remote-Version (origin) zurücksetzen? Lokale Änderungen an dieser Datei gehen verloren.`,"diff.rollbackConfirmOk":`Zurücksetzen`,"diff.rollbackDone":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneRemote":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneHead":`Lokale Änderungen verworfen (Datei auf letzten Commit zurückgesetzt)`,"diff.rollbackDoneDeleted":`Nicht versionierte Datei gelöscht`,"diff.deleteUntracked":`Nicht versionierte Datei löschen`,"diff.deleteUntrackedConfirm":`{path} dauerhaft löschen? Diese Datei wird nicht von Git verfolgt — ihr Inhalt geht verloren.`,"diff.deleteUntrackedConfirmOk":`Löschen`,"diff.rollbackFailed":`Rollback fehlgeschlagen`,"diff.rollbackFailedDetail":`Rollback fehlgeschlagen: {error}`,"diff.modeInspect":`Bearbeiten`,"diff.modeReview":`Review`,"diff.addComment":`Kommentar hinzufügen`,"diff.replyComment":`Antworten`,"diff.editComment":`Bearbeiten`,"diff.deleteComment":`Löschen`,"diff.deleteCommentConfirm":`Diesen Kommentar löschen?`,"diff.commentPlaceholder":`Review-Kommentar schreiben… (Markdown unterstützt)`,"diff.reviewDraft":`Review-Entwurf`,"diff.reviewEmpty":`Noch keine Kommentare — fahre mit der Maus über eine Zeile im Diff und klicke +, um einen hinzuzufügen.`,"diff.reviewGlobalPlaceholder":`Optionale Gesamtnachricht zur Review`,"diff.submitReview":`Review absenden ({n})`,"diff.reviewPending":`Eine Überprüfung wird bereits gesendet.`,"diff.reviewEmptySubmission":`Die Überprüfung ist leer.`,"diff.reviewNotAccepted":`Die Nachricht wurde nicht angenommen. Ihre Überprüfung bleibt erhalten.`,"diff.reviewSubmitted":`Review an den Agenten gesendet`,"diff.reviewSubmitFailed":`Review konnte nicht gesendet werden: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Ungepusht`,"diff.noChanges":`Keine Änderungen`,"diff.searchFiles":`Dateien suchen…`,"diff.noFileMatch":`Keine passende Datei`,"diff.selectFile":`Datei auswählen, um den Diff anzuzeigen`,"diff.fileLoadFailed":`Dieser Diff konnte nicht geladen werden`,"diff.fileLoadFailedHint":`Die Datei auf der Festplatte ist unverändert — nur der Diff konnte nicht geladen werden.`,"diff.fileListLoadFailed":`Die Dateiliste konnte nicht geladen werden`,"diff.fileListLoadFailedHint":`Das ist eine fehlgeschlagene Anfrage, kein Branch ohne Änderungen.`,"diff.addToChat":`Zum Chat hinzufügen`,"diff.compareTitle":`Commits vergleichen`,"diff.compareFrom":`Von`,"diff.compareTo":`Bis`,"diff.compareSubmit":`Vergleichen`,"diff.compareSourceBase":`{branch} (Branch-Basis)`,"diff.commitsReadOnly":`schreibgeschützt`,"diffViewer.save":`Speichern`,"diffViewer.savedAt":`Gespeichert`,"diffViewer.saveFailed":`Speichern fehlgeschlagen`,"diffViewer.saveFailedDetail":`Speichern fehlgeschlagen: {error}`,"diffViewer.unsavedChanges.title":`Nicht gespeicherte Änderungen`,"diffViewer.unsavedChanges.message":`Du hast nicht gespeicherte Änderungen. Was möchtest du tun?`,"diffViewer.unsavedChanges.save":`Speichern`,"diffViewer.unsavedChanges.cancel":`Abbrechen`,"diffViewer.conflict.title":`Datei wurde extern geändert`,"diffViewer.conflict.message":`Die Datei wurde außerhalb von Kōbō geändert, seit du sie geöffnet hast.`,"diffViewer.conflict.reload":`Neu laden (lokale Änderungen verwerfen)`,"diffViewer.conflict.keep":`Eigene behalten`,"diffViewer.conflict.overwrite":`Trotzdem überschreiben`,"diffViewer.conflict.overwriteHint":`Ersetzt die Datei auf der Festplatte durch deine Version. Die andere Änderung geht verloren.`,"diffViewer.conflict.keepHint":`Behält deine Änderungen im Editor und übernimmt die neue Signatur der Datei, damit das nächste Speichern funktioniert.`,"diffViewer.saveBlocked":`Der Agent läuft — stoppe ihn, um deine Änderungen zu speichern.`,"diffViewer.unsavedBanner":`Ungespeicherte Änderungen. Stoppe den Agenten, um sie zu sichern.`,"diffViewer.closeConfirm.title":`Ungespeicherte Änderungen`,"diffViewer.closeConfirm.message":`Diese Datei enthält nie gespeicherte Änderungen. Beim Schließen des Diff-Viewers gehen sie verloren.`,"diffViewer.closeConfirm.discard":`Ohne Speichern schließen`,"diffViewer.criteriaRail":`Review-Checkliste`,"diffViewer.criteriaRailShow":`Review-Checkliste einblenden`,"diffViewer.criteriaRailHide":`Review-Checkliste ausblenden`,"diffViewer.fileTreeShow":`Dateibaum einblenden`,"diffViewer.fileTreeHide":`Dateibaum ausblenden`,"diffViewer.closeConfirm.saveAndClose":`Speichern und schließen`,"diffViewer.agentRunning":`Agent läuft — stoppe ihn zum Bearbeiten`,"diffViewer.fileDeleted":`Datei gelöscht`,"notification.agentFinished":`{name} — Agent fertig`,"notification.agentQuestion":`{name} — Agent stellt eine Frage`,"notification.awaitingReminder":`{name} - wartet weiterhin auf Sie ({minutes} Min.)`,"notification.agentPermissionRequest":`{name} — Agent fragt nach einer Berechtigung`,"notification.autoLoopCompleted":`{name} — Auto-Loop abgeschlossen`,"notification.autoLoopWaitingForSlot":`{name} - Auto-Loop wartet auf einen freien Agenten-Slot ({running}/{limit} aktiv)`,"notification.autoLoopStalled":`{name} — Auto-Loop blockiert (kein Fortschritt)`,"notification.autoLoopError":`{name} — Auto-Loop wegen Fehler gestoppt`,"notification.autoLoopAwaitingClarification":`{name} — Auto-Loop pausiert, wartet auf Ihre Klärung`,"notification.autoLoopPermissionOverridden":`{name} — Auto-Loop hat plan-Modus auf bypass erzwungen`,"notification.agentError":`{name} — Agent-Fehler`,"contextMenu.rename":`Umbenennen`,"contextMenu.editDescription":`Beschreibung bearbeiten`,"contextMenu.copyPath":`Worktree-Pfad kopieren`,"contextMenu.copyWorkspaceId":`Workspace-ID kopieren`,"contextMenu.openEditor":`Im Editor öffnen`,"contextMenu.openFileManager":`Im Dateimanager öffnen`,"contextMenu.unarchiveDisabledPurged":`Stellen Sie zuerst den Worktree über Worktree wiederherstellen oder manuell wieder her. Kōbō erkennt passende Worktrees automatisch.`,"workspaceList.unarchiveBlockedPurged":`Stellen Sie zuerst den Worktree über Worktree wiederherstellen oder manuell wieder her. Kōbō erkennt passende Worktrees automatisch.`,"contextMenu.purgeWorktree":`Speicherplatz freigeben (Worktree löschen)`,"contextMenu.purgeWorktreeTooltip":`Löscht den Worktree von der Festplatte zur Speicherplatz-Rückgewinnung — Chat- und Sitzungsverlauf bleiben erhalten. Archiviert den Workspace automatisch.`,"contextMenu.purgeWorktreeDialogTitle":`Speicherplatz freigeben?`,"contextMenu.purgeWorktreeDialogMessage":`Der Worktree-Ordner von „{name}" wird von der Festplatte gelöscht. Chat- und Sitzungsverlauf bleiben erhalten. Der Workspace wird automatisch archiviert. In der aktuellen Version nicht rückgängig zu machen.`,"contextMenu.purgeWorktreeDialogConfirm":`Worktree löschen`,"contextMenu.purgeWorktreeSuccess":`Worktree gelöscht — Speicherplatz zurückgewonnen.`,"settings.autoPurgeOnPrMerged":`Worktree automatisch löschen, wenn PR gemerged`,"settings.autoPurgeOnPrMergedHint":`Wenn aktiviert, wird der Worktree von der Festplatte gelöscht, sobald die PR gemerged wird (zusätzlich zur automatischen Archivierung). Chat-Verlauf bleibt erhalten.`,"settings.showProgressBars":`Fortschrittsbalken anzeigen`,"settings.showProgressBarsHint":`Standardmäßig aktiviert. Das Ausblenden schließt keine Aktivitäten und beendet nicht deren Verfolgung. Änderungen gelten nach dem Speichern.`,"tours.settings.progressBars.title":`Fortschrittsbalken`,"tours.settings.progressBars.description":`Blenden Sie die Balken über dem Nachrichtenfeld ein oder aus. Die Verfolgung läuft auch ausgeblendet weiter.`,"settings.agentWatchdogEnabled":`Inaktivitäts-Watchdogs für Agenten aktivieren`,"settings.agentWatchdogHint":`Standardmäßig deaktiviert. Wenn aktiviert, kann Kōbō Claude oder Codex nach längerer Stille beenden, einschließlich Tools, Unteragenten und Kontextkomprimierung. Gilt beim nächsten Start oder Fortsetzen des Agenten.`,"tours.settings.agentWatchdog.title":`Inaktivitäts-Watchdogs`,"tours.settings.agentWatchdog.description":`Deaktiviert lassen, damit lange Aufgaben ohne sichtbare Aktivität warten können. Aktivieren, um blockierte Sitzungen automatisch zu schließen. Gilt beim nächsten Start oder Fortsetzen des Agenten.`,"settings.autoLoopMaxRetries":`Maximale automatische Wiederholungen`,"settings.awaitingUserReminder":`Erinnerung an unbeantwortete Frage`,"settings.awaitingUserReminderHint":`Minuten, die ein Workspace auf Ihre Antwort warten darf, bevor Kōbō Sie erinnert, danach in jedem weiteren Intervall. 0 deaktiviert.`,"settings.localeLoadFailed":`Diese Sprache konnte nicht geladen werden; die aktuelle bleibt aktiv.`,"settings.autoLoopMaxRetriesHint":`Pausiert den Auftrag nach dieser Anzahl vorübergehender Engine- oder Serverfehler. Kontingente warten auf ihre Zurücksetzung und zählen nicht zu diesem Limit.`,"settings.retentionTitle":`Aufbewahrung des Konversationsverlaufs (standardmäßig aus)`,"settings.retentionWarning":`Wird diese Option aktiviert, löscht sie den Konversationsverlauf der Agenten endgültig aus der Datenbank — zuerst alles, was bereits älter als das Zeitfenster ist. Gelöschte Ereignisse lassen sich nicht wiederherstellen.`,"settings.retentionHint":`Läuft einmal beim Start des Servers. Workspaces, Aufgaben, Sessions, Branches und Worktrees bleiben unberührt — betroffen ist nur die aufgezeichnete Agentenausgabe.`,"settings.retentionDaysLabel":`Ereignisse löschen, die älter sind als (Tage)`,"settings.retentionDaysHint":`0 — der Standard — behält alle Ereignisse dauerhaft. Tragen Sie einen Wert ein, um die Aufbewahrung zu aktivieren.`,"settings.retentionKeepLabel":`Immer behaltene Ereignisse pro Workspace`,"settings.retentionKeepHint":`Die neuesten Ereignisse jedes Workspace bleiben unabhängig von ihrem Alter erhalten, damit ein alter, aber noch offener Workspace einen lesbaren Verlauf behält. Empfohlen: 5000.`,"settings.retentionDisabledHint":`Aufbewahrung deaktiviert: Es wird nie etwas gelöscht.`,"settings.retentionConfirmTitle":`Konversationsverlauf endgültig löschen?`,"settings.retentionConfirmMessage":`Nur {days} Tag(e) Verlauf zu behalten löscht beim nächsten Serverstart endgültig {count} der {total} aufgezeichneten Agentenereignisse — einschließlich allem, was bereits älter ist. Das lässt sich nicht rückgängig machen. Fortfahren?`,"settings.retentionConfirmMessageUnknown":`Nur {days} Tag(e) Verlauf zu behalten löscht beim nächsten Serverstart endgültig alle älteren Agentenereignisse — einschließlich allem, was bereits angesammelt wurde. Die genaue Menge konnte nicht ermittelt werden. Das lässt sich nicht rückgängig machen. Fortfahren?`,"settings.purgeDocsTitle":`Wie Purge funktioniert — Wiederherstellung & Berechtigungen`,"settings.purgeDocsRestoreTitle":`Einen bereinigten Worktree wiederherstellen (automatisch erkannt)`,"settings.purgeDocsRestoreIntro":`Ein bereinigter Workspace behält seinen Chat-Verlauf und die PR-Metadaten, aber der Worktree-Ordner ist weg. Baue ihn manuell mit einem dieser Befehle wieder auf — Kōbō erkennt das Wiedererscheinen des Ordners innerhalb von 30 Sekunden und reaktiviert den Workspace automatisch (entarchivieren + Purge-Flag löschen):`,"settings.purgeDocsRestoreCommands":`# GitHub (mit gh CLI):
12
12
  gh pr checkout [pr-nummer] --recurse-submodules
13
13
 
14
14
  # Oder direkt über git (funktioniert auf GitHub auch nach Löschen des Branches):