@loicngr/kobo 1.6.15 → 1.7.0

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 (185) hide show
  1. package/README.md +4 -3
  2. package/dist/mcp-server/kobo-tasks-server.js +51 -0
  3. package/dist/server/db/migrations.js +40 -0
  4. package/dist/server/db/schema.js +7 -5
  5. package/dist/server/index.js +12 -11
  6. package/dist/server/routes/workspaces.js +160 -21
  7. package/dist/server/services/agent/engines/claude-code/capabilities.js +1 -1
  8. package/dist/server/services/agent/engines/claude-code/engine.js +237 -132
  9. package/dist/server/services/agent/engines/claude-code/event-mapper.js +234 -0
  10. package/dist/server/services/agent/engines/claude-code/options-builder.js +68 -0
  11. package/dist/server/services/agent/engines/claude-code/precompact-hook.js +27 -0
  12. package/dist/server/services/agent/engines/types.js +1 -0
  13. package/dist/server/services/agent/orchestrator.js +536 -94
  14. package/dist/server/services/agent/session-controller.js +14 -43
  15. package/dist/server/services/auto-loop-service.js +17 -6
  16. package/dist/server/services/content-migration-service.js +24 -94
  17. package/dist/server/services/wakeup-service.js +8 -9
  18. package/dist/server/services/workspace-service.js +40 -36
  19. package/package.json +2 -1
  20. package/src/client/dist/spa/assets/ActivityFeed-CIJPN8TH.js +7 -0
  21. package/src/client/dist/spa/assets/ActivityFeed-LXnbg3ff.css +1 -0
  22. package/src/client/dist/spa/assets/{ClosePopup-D7BBEcaf.js → ClosePopup-DzB3mDtj.js} +1 -1
  23. package/src/client/dist/spa/assets/CreatePage-BE3xfQsC.css +1 -0
  24. package/src/client/dist/spa/assets/CreatePage-U6TtJzNe.js +2 -0
  25. package/src/client/dist/spa/assets/{DiffViewer-BJZADilo.js → DiffViewer-Di85TBIi.js} +3 -3
  26. package/src/client/dist/spa/assets/HealthPage-B7aWFxAZ.js +1 -0
  27. package/src/client/dist/spa/assets/MainLayout-BHBrz4c9.js +37 -0
  28. package/src/client/dist/spa/assets/MainLayout-Dba6SdpU.css +1 -0
  29. package/src/client/dist/spa/assets/QCheckbox-CcY7ZSk9.js +1 -0
  30. package/src/client/dist/spa/assets/{QChip-D905z6BM.js → QChip-BhT0W2Dg.js} +1 -1
  31. package/src/client/dist/spa/assets/QExpansionItem-VS4b4eY6.js +1 -0
  32. package/src/client/dist/spa/assets/{QInput-6U0_avSY.js → QInput-D4WJro4e.js} +1 -1
  33. package/src/client/dist/spa/assets/{QItemSection-Cloi4ErY.js → QItemSection-KFAnxzMK.js} +1 -1
  34. package/src/client/dist/spa/assets/{QMenu-BPzgTm2k.js → QMenu-CchbRXbp.js} +1 -1
  35. package/src/client/dist/spa/assets/{QPage-C6h_ah5z.js → QPage-Cu7zkfc6.js} +1 -1
  36. package/src/client/dist/spa/assets/QRadio-DaZhdLCg.js +1 -0
  37. package/src/client/dist/spa/assets/{touch-DBLw8vQK.js → QResizeObserver-Cf79V-VZ.js} +1 -1
  38. package/src/client/dist/spa/assets/QScrollArea-DrVTDLU0.js +1 -0
  39. package/src/client/dist/spa/assets/QTabPanels-HXz-evuj.js +1 -0
  40. package/src/client/dist/spa/assets/QToggle-CGpiJLDJ.js +1 -0
  41. package/src/client/dist/spa/assets/QTooltip-DjJYMTkN.js +1 -0
  42. package/src/client/dist/spa/assets/SearchPage-CVm-sqxH.js +1 -0
  43. package/src/client/dist/spa/assets/SettingsPage-ayDKGo9H.js +1 -0
  44. package/src/client/dist/spa/assets/SettingsPage-wTBCvK6t.css +1 -0
  45. package/src/client/dist/spa/assets/WorkspacePage-DQxGe62K.css +1 -0
  46. package/src/client/dist/spa/assets/WorkspacePage-xaVy8s5i.js +4 -0
  47. package/src/client/dist/spa/assets/build-path-tree-CdY1A6aP.js +1 -0
  48. package/src/client/dist/spa/assets/{cssMode-QQTtBrD_.js → cssMode-BVNBMOxh.js} +1 -1
  49. package/src/client/dist/spa/assets/{editor.api-YqpktRoe.js → editor.api-D6Vfp5yv.js} +1 -1
  50. package/src/client/dist/spa/assets/{editor.main-DDGqfxYm.js → editor.main-CTCYF6V4.js} +3 -3
  51. package/src/client/dist/spa/assets/expand-template-vHV2iwXf.js +1 -0
  52. package/src/client/dist/spa/assets/{formatters-DWeOzSfw.js → formatters-ejxELb0M.js} +1 -1
  53. package/src/client/dist/spa/assets/{freemarker2-BC_Lt7t3.js → freemarker2-nmzwPmzi.js} +1 -1
  54. package/src/client/dist/spa/assets/{handlebars-BphhRg2c.js → handlebars-CI9lR7Ef.js} +1 -1
  55. package/src/client/dist/spa/assets/{html-C84Ufc1n.js → html-BQ21REnv.js} +1 -1
  56. package/src/client/dist/spa/assets/{htmlMode-CIlyKZJ4.js → htmlMode-io5J5Qr1.js} +1 -1
  57. package/src/client/dist/spa/assets/i18n-Do8Kn8n0.js +1 -0
  58. package/src/client/dist/spa/assets/index-C_e7KOYh.js +2 -0
  59. package/src/client/dist/spa/assets/{javascript-D5LTZTWn.js → javascript--u9PDBCv.js} +1 -1
  60. package/src/client/dist/spa/assets/{jsonMode-YBOBMJNl.js → jsonMode-DBG5llk4.js} +1 -1
  61. package/src/client/dist/spa/assets/{kobo-commands-DFflpxts.js → kobo-commands-DiUm1Y34.js} +1 -1
  62. package/src/client/dist/spa/assets/{liquid-UNCP2Jl6.js → liquid-DxAS4nYF.js} +1 -1
  63. package/src/client/dist/spa/assets/{marked.esm-D7ibHC_y.js → marked.esm-DuOsJx63.js} +1 -1
  64. package/src/client/dist/spa/assets/{mdx-CsHyBm_B.js → mdx-BNXTiODW.js} +1 -1
  65. package/src/client/dist/spa/assets/{models-tXWASlTL.js → models-DNYEhFF7.js} +1 -1
  66. package/src/client/dist/spa/assets/{monaco.contribution-Bv79M2zD.js → monaco.contribution-CT3LAK0J.js} +2 -2
  67. package/src/client/dist/spa/assets/{python-B3h-WTW0.js → python-DztNww13.js} +1 -1
  68. package/src/client/dist/spa/assets/{razor-Cs79ULMl.js → razor-Cyr82NZF.js} +1 -1
  69. package/src/client/dist/spa/assets/{settings-Cw4mtk9x.js → settings-Dbx1_ksA.js} +1 -1
  70. package/src/client/dist/spa/assets/symbols-BVRrMH2r.js +1 -0
  71. package/src/client/dist/spa/assets/touch-Co9pfjUU.js +1 -0
  72. package/src/client/dist/spa/assets/{tsMode-238NR35q.js → tsMode-CbQVgsIP.js} +1 -1
  73. package/src/client/dist/spa/assets/{typescript-C93UakWa.js → typescript-UHOe4d1S.js} +1 -1
  74. package/src/client/dist/spa/assets/{use-checkbox-w-raiu10.js → use-checkbox-DzHmcu7s.js} +1 -1
  75. package/src/client/dist/spa/assets/use-panel-Br8QNRMk.js +1 -0
  76. package/src/client/dist/spa/assets/{xml-24CcVrVJ.js → xml-DC88eFpV.js} +1 -1
  77. package/src/client/dist/spa/assets/{yaml-BLhB8_OL.js → yaml-DSTsIRJr.js} +1 -1
  78. package/src/client/dist/spa/index.html +10 -7
  79. package/src/mcp-server/kobo-tasks-server.ts +60 -1
  80. package/dist/server/services/agent/engines/claude-code/args-builder.js +0 -57
  81. package/dist/server/services/agent/engines/claude-code/mcp-config.js +0 -23
  82. package/dist/server/services/agent/engines/claude-code/stream-parser.js +0 -386
  83. package/src/client/dist/spa/assets/ActivityFeed-BHdMJRwS.css +0 -1
  84. package/src/client/dist/spa/assets/ActivityFeed-D7MF6IK1.js +0 -8
  85. package/src/client/dist/spa/assets/CreatePage-DJbZH8wp.css +0 -1
  86. package/src/client/dist/spa/assets/CreatePage-rp-9_jOF.js +0 -2
  87. package/src/client/dist/spa/assets/HealthPage-CZQB2pvh.js +0 -1
  88. package/src/client/dist/spa/assets/MainLayout-CFHf3zKv.js +0 -37
  89. package/src/client/dist/spa/assets/MainLayout-Db3dwSTM.css +0 -1
  90. package/src/client/dist/spa/assets/QExpansionItem-CUXuOfeR.js +0 -1
  91. package/src/client/dist/spa/assets/QScrollArea-N10UpHIf.js +0 -1
  92. package/src/client/dist/spa/assets/QSlideTransition-BMX92yUu.js +0 -1
  93. package/src/client/dist/spa/assets/QTabPanels-PPompnxw.js +0 -1
  94. package/src/client/dist/spa/assets/QTooltip-DLT8jCHz.js +0 -1
  95. package/src/client/dist/spa/assets/SearchPage-CfYy4vGJ.js +0 -1
  96. package/src/client/dist/spa/assets/SettingsPage-B8DhSZw7.css +0 -1
  97. package/src/client/dist/spa/assets/SettingsPage-ONWYC-Bn.js +0 -1
  98. package/src/client/dist/spa/assets/WorkspacePage-B2VAbf6l.js +0 -4
  99. package/src/client/dist/spa/assets/WorkspacePage-k2pgeRoy.css +0 -1
  100. package/src/client/dist/spa/assets/build-path-tree-DETFP2lL.js +0 -1
  101. package/src/client/dist/spa/assets/expand-template-CZkefibF.js +0 -1
  102. package/src/client/dist/spa/assets/i18n-CNdSgNP6.js +0 -1
  103. package/src/client/dist/spa/assets/index-pGAaG7Rh.js +0 -2
  104. package/src/client/dist/spa/assets/stats-BrLStQKj.js +0 -1
  105. package/src/client/dist/spa/assets/symbols-TAFELniU.js +0 -1
  106. /package/src/client/dist/spa/assets/{QBadge-BUkmTO0P.js → QBadge-fsQ2AokU.js} +0 -0
  107. /package/src/client/dist/spa/assets/{QBtn-CyzfM9-_.js → QBtn-DHwAb18J.js} +0 -0
  108. /package/src/client/dist/spa/assets/{QItemLabel-DwnV_S8y.js → QItemLabel-DWwenW2S.js} +0 -0
  109. /package/src/client/dist/spa/assets/{QList-DZfpUv3n.js → QList-NmIE6Rd9.js} +0 -0
  110. /package/src/client/dist/spa/assets/{QSpace-PlDK6Fg3.js → QSpace-COlmM_4F.js} +0 -0
  111. /package/src/client/dist/spa/assets/{QSpinnerDots-D7bo_KgI.js → QSpinnerDots-DwtnRN2r.js} +0 -0
  112. /package/src/client/dist/spa/assets/{_plugin-vue_export-helper-CpNzZuug.js → _plugin-vue_export-helper-B8bB5DBd.js} +0 -0
  113. /package/src/client/dist/spa/assets/{abap-DrZwwXZX.js → abap-DzK-OTGh.js} +0 -0
  114. /package/src/client/dist/spa/assets/{apex-CrCz0btt.js → apex-Bj60_dRt.js} +0 -0
  115. /package/src/client/dist/spa/assets/{azcli-BapzKHay.js → azcli-B6NwaBAZ.js} +0 -0
  116. /package/src/client/dist/spa/assets/{bat-C_NRAiA1.js → bat-bf7wXV68.js} +0 -0
  117. /package/src/client/dist/spa/assets/{bicep-C7pp2CNk.js → bicep-C_bg8UgA.js} +0 -0
  118. /package/src/client/dist/spa/assets/{cameligo-BhhK9vxZ.js → cameligo-CTWw4D4B.js} +0 -0
  119. /package/src/client/dist/spa/assets/{clojure-D0ujmUyE.js → clojure-CgdPoH0r.js} +0 -0
  120. /package/src/client/dist/spa/assets/{coffee-DHEl7Jbb.js → coffee-gHQfdA5M.js} +0 -0
  121. /package/src/client/dist/spa/assets/{cpp-Iil-3nzZ.js → cpp-BM4Jj4aW.js} +0 -0
  122. /package/src/client/dist/spa/assets/{csharp-Dh0Ee7SY.js → csharp-D8-bh4Cd.js} +0 -0
  123. /package/src/client/dist/spa/assets/{csp-mwzjw0JL.js → csp-CXBxRx0n.js} +0 -0
  124. /package/src/client/dist/spa/assets/{css-COIa8ZTR.js → css-DKjIxrmY.js} +0 -0
  125. /package/src/client/dist/spa/assets/{cypher-GVc17FC4.js → cypher-C5e5inIh.js} +0 -0
  126. /package/src/client/dist/spa/assets/{dart-phiCaE7_.js → dart-BhRHHm4x.js} +0 -0
  127. /package/src/client/dist/spa/assets/{dockerfile-BMaDhdim.js → dockerfile-DW5REF8E.js} +0 -0
  128. /package/src/client/dist/spa/assets/{documents-BMdAS6h8.js → documents-D6A3wRry.js} +0 -0
  129. /package/src/client/dist/spa/assets/{ecl-Cj47kvqp.js → ecl-Bw4Hg3n_.js} +0 -0
  130. /package/src/client/dist/spa/assets/{elixir-DBbstcE1.js → elixir-DHmoBvpZ.js} +0 -0
  131. /package/src/client/dist/spa/assets/{flow9-ChHb1adO.js → flow9-BsFExz3v.js} +0 -0
  132. /package/src/client/dist/spa/assets/{fsharp-CDI_AxQw.js → fsharp-BaeLhgfq.js} +0 -0
  133. /package/src/client/dist/spa/assets/{go-DmsC2k-Y.js → go-Bd-NFKIC.js} +0 -0
  134. /package/src/client/dist/spa/assets/{graphql-C8hjT6Ki.js → graphql-DZVerJfy.js} +0 -0
  135. /package/src/client/dist/spa/assets/{hcl-C15cAQOZ.js → hcl-CAVzrZfH.js} +0 -0
  136. /package/src/client/dist/spa/assets/{ini-CKrAe0ag.js → ini-CyXdX58t.js} +0 -0
  137. /package/src/client/dist/spa/assets/{java-BVhjILyl.js → java-B5pNgvhy.js} +0 -0
  138. /package/src/client/dist/spa/assets/{julia-BzPDHDOG.js → julia-XRhmV3AN.js} +0 -0
  139. /package/src/client/dist/spa/assets/{kotlin-DQMAn-b6.js → kotlin-DOd3J5vr.js} +0 -0
  140. /package/src/client/dist/spa/assets/{less-428mfr1h.js → less-veZSnyw6.js} +0 -0
  141. /package/src/client/dist/spa/assets/{lexon-B09dCO6A.js → lexon-QWGkuK0H.js} +0 -0
  142. /package/src/client/dist/spa/assets/{lua-CVQ0BJif.js → lua-CYGpjuO5.js} +0 -0
  143. /package/src/client/dist/spa/assets/{m3-CiPQ1ljw.js → m3-yNnrZkdc.js} +0 -0
  144. /package/src/client/dist/spa/assets/{markdown--G0dqL-7.js → markdown-BCSWEPSX.js} +0 -0
  145. /package/src/client/dist/spa/assets/{mips-BaboCM3T.js → mips-OpYmcC30.js} +0 -0
  146. /package/src/client/dist/spa/assets/{msdax-DUaqkqre.js → msdax-2oxoTO9Z.js} +0 -0
  147. /package/src/client/dist/spa/assets/{mysql-CUE6XF4r.js → mysql-5KlC-K_9.js} +0 -0
  148. /package/src/client/dist/spa/assets/{objective-c-C4MUnzeT.js → objective-c-CcDCgtLx.js} +0 -0
  149. /package/src/client/dist/spa/assets/{pascal-CWMUMx__.js → pascal-BZGsbaEV.js} +0 -0
  150. /package/src/client/dist/spa/assets/{pascaligo-DLCVutek.js → pascaligo-DtD5qU3G.js} +0 -0
  151. /package/src/client/dist/spa/assets/{perl-JYoirQpx.js → perl-C1jNNS3E.js} +0 -0
  152. /package/src/client/dist/spa/assets/{pgsql-BqOy7sqx.js → pgsql-CT0fhiZa.js} +0 -0
  153. /package/src/client/dist/spa/assets/{php-PZqsysO1.js → php-D6DrXoPM.js} +0 -0
  154. /package/src/client/dist/spa/assets/{pla-BiwqVlg6.js → pla-b3-HN2pF.js} +0 -0
  155. /package/src/client/dist/spa/assets/{postiats-COxQtXCD.js → postiats-Bin2ApVS.js} +0 -0
  156. /package/src/client/dist/spa/assets/{powerquery-DdXUmaWa.js → powerquery-7ASnn-ZG.js} +0 -0
  157. /package/src/client/dist/spa/assets/{powershell-D05yu9sz.js → powershell-t4p7sU1H.js} +0 -0
  158. /package/src/client/dist/spa/assets/{protobuf-BDsm0ZB_.js → protobuf-BUGeWa_j.js} +0 -0
  159. /package/src/client/dist/spa/assets/{pug-3CmTiGoi.js → pug-BuKcgC9s.js} +0 -0
  160. /package/src/client/dist/spa/assets/{qsharp-C4eHfCpJ.js → qsharp-DSMtI_O7.js} +0 -0
  161. /package/src/client/dist/spa/assets/{r-Decg_RIU.js → r-DMlFgn7A.js} +0 -0
  162. /package/src/client/dist/spa/assets/{redis-Cl3EBA4R.js → redis-cXItkC5u.js} +0 -0
  163. /package/src/client/dist/spa/assets/{redshift-5ZsNLhOp.js → redshift-BZVbW7HE.js} +0 -0
  164. /package/src/client/dist/spa/assets/{restructuredtext-BulNNF_e.js → restructuredtext-BzjxwS8h.js} +0 -0
  165. /package/src/client/dist/spa/assets/{ruby-D3Axi_9w.js → ruby-C5nyLV4l.js} +0 -0
  166. /package/src/client/dist/spa/assets/{rust-Csys1Tos.js → rust-BcmMsHdf.js} +0 -0
  167. /package/src/client/dist/spa/assets/{sb-C_iBPphi.js → sb-Dnb1iy6B.js} +0 -0
  168. /package/src/client/dist/spa/assets/{scala-Cg4p-EZ2.js → scala-anMIFYpA.js} +0 -0
  169. /package/src/client/dist/spa/assets/{scheme-BlVnEL_j.js → scheme-BItQTe08.js} +0 -0
  170. /package/src/client/dist/spa/assets/{scss-CmLW8ojr.js → scss-BOv51BJ5.js} +0 -0
  171. /package/src/client/dist/spa/assets/{shell-B1DV_gpl.js → shell-BsRYRTNN.js} +0 -0
  172. /package/src/client/dist/spa/assets/{solidity-glFpNhe3.js → solidity-BtuLgGDx.js} +0 -0
  173. /package/src/client/dist/spa/assets/{sophia-D9j4cFkA.js → sophia-B0Vkc5MF.js} +0 -0
  174. /package/src/client/dist/spa/assets/{sparql-DV5Ux9cO.js → sparql-B7lvkZQM.js} +0 -0
  175. /package/src/client/dist/spa/assets/{sql-K8tNKFcf.js → sql-DvP5MpA3.js} +0 -0
  176. /package/src/client/dist/spa/assets/{st-BhIdE2hj.js → st-GVUeyB3U.js} +0 -0
  177. /package/src/client/dist/spa/assets/{swift-B0pzSmmx.js → swift-DSPIoCjm.js} +0 -0
  178. /package/src/client/dist/spa/assets/{systemverilog-CeBgixbN.js → systemverilog-Icj2-k23.js} +0 -0
  179. /package/src/client/dist/spa/assets/{tcl-B0Ji3IbZ.js → tcl-Cd8KQcm-.js} +0 -0
  180. /package/src/client/dist/spa/assets/{twig-KUgPCP41.js → twig-CBHmt8z3.js} +0 -0
  181. /package/src/client/dist/spa/assets/{typespec-ryrhjid6.js → typespec-Ckc037mq.js} +0 -0
  182. /package/src/client/dist/spa/assets/{use-quasar-Clv5nVxk.js → use-quasar-Cc4smfg5.js} +0 -0
  183. /package/src/client/dist/spa/assets/{vb-Z68-YtMY.js → vb-B97GW9Wb.js} +0 -0
  184. /package/src/client/dist/spa/assets/{vue-i18n-BVrBmgZa.js → vue-i18n-eUDnMrPl.js} +0 -0
  185. /package/src/client/dist/spa/assets/{wgsl-bH-W-d_T.js → wgsl-DIKmb3YH.js} +0 -0
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MainLayout-CFHf3zKv.js","assets/_plugin-vue_export-helper-CpNzZuug.js","assets/vue-i18n-BVrBmgZa.js","assets/runtime-core.esm-bundler-C3IgBgY5.js","assets/QIcon-B0-pH3Qs.js","assets/marked.esm-D7ibHC_y.js","assets/use-id-CDuXkR0Z.js","assets/touch-DBLw8vQK.js","assets/QTooltip-DLT8jCHz.js","assets/settings-Cw4mtk9x.js","assets/QBtn-CyzfM9-_.js","assets/QBadge-BUkmTO0P.js","assets/build-path-tree-DETFP2lL.js","assets/QSlideTransition-BMX92yUu.js","assets/QChip-D905z6BM.js","assets/QInput-6U0_avSY.js","assets/symbols-TAFELniU.js","assets/QItemSection-Cloi4ErY.js","assets/QList-DZfpUv3n.js","assets/QMenu-BPzgTm2k.js","assets/QSpace-PlDK6Fg3.js","assets/QTabPanels-PPompnxw.js","assets/is-BbsvEMaT.js","assets/use-quasar-Clv5nVxk.js","assets/ClosePopup-D7BBEcaf.js","assets/documents-BMdAS6h8.js","assets/stats-BrLStQKj.js","assets/formatters-DWeOzSfw.js","assets/kobo-commands-DFflpxts.js","assets/MainLayout-Db3dwSTM.css","assets/WorkspacePage-B2VAbf6l.js","assets/models-tXWASlTL.js","assets/QItemLabel-DwnV_S8y.js","assets/QPage-C6h_ah5z.js","assets/QSpinnerDots-D7bo_KgI.js","assets/expand-template-CZkefibF.js","assets/expand-template-D2yUa54D.css","assets/WorkspacePage-k2pgeRoy.css","assets/CreatePage-rp-9_jOF.js","assets/QExpansionItem-CUXuOfeR.js","assets/CreatePage-DJbZH8wp.css","assets/SettingsPage-ONWYC-Bn.js","assets/SettingsPage-B8DhSZw7.css","assets/SearchPage-CfYy4vGJ.js","assets/SearchPage-cVwt0DaQ.css","assets/HealthPage-CZQB2pvh.js"])))=>i.map(i=>d[i]);
2
- import{$ as e,E as t,F as n,H as r,I as i,M as a,N as o,Q as s,R as c,S as l,U as u,Y as d,Z as f,bt as p,d as m,et as h,f as g,g as _,k as ee,l as v,p as y,r as b,rt as x,tt as te,u as S,v as C,w,y as T}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{A as E,D,M as ne,N as O,O as k,P as A,S as re,a as j,f as ie,h as ae,j as oe,l as se,m as M,n as N,o as ce,p as P,r as F,s as I,t as L,x as R,y as le}from"./QIcon-B0-pH3Qs.js";import{a as ue,d as de,f as z,i as fe,o as pe,p as me,r as he,u as ge}from"./use-id-CDuXkR0Z.js";import{A as _e,C as ve,D as ye,E as be,O as xe,S as Se,T as Ce,a as we,b as Te,i as Ee,k as De,l as Oe,m as ke,n as Ae,o as je,r as Me,t as Ne,u as Pe,w as Fe,x as Ie,y as Le}from"./settings-Cw4mtk9x.js";import{n as B}from"./is-BbsvEMaT.js";import{l as Re,o as ze,s as Be,t as Ve}from"./QBtn-CyzfM9-_.js";import{n as He,t as Ue}from"./vue-i18n-BVrBmgZa.js";import{a as We,r as Ge,t as Ke}from"./QInput-6U0_avSY.js";import{a as qe,i as Je,n as Ye,r as Xe,t as Ze}from"./use-checkbox-w-raiu10.js";var Qe=[`sm`,`md`,`lg`,`xl`],{passive:$e}=R,et=E({width:0,height:0,name:`xs`,sizes:{sm:600,md:1024,lg:1440,xl:1920},lt:{sm:!0,md:!0,lg:!0,xl:!0},gt:{xs:!1,sm:!1,md:!1,lg:!1},xs:!0,sm:!1,md:!1,lg:!1,xl:!1},{setSizes:re,setDebounce:re,install({$q:e,onSSRHydrated:t}){if(e.screen=this,this.__installed===!0){e.config.screen!==void 0&&(e.config.screen.bodyClasses===!1?document.body.classList.remove(`screen--${this.name}`):this.__update(!0));return}let{visualViewport:n}=window,r=n||window,i=document.scrollingElement||document.documentElement,a=n===void 0||z.is.mobile===!0?()=>[Math.max(window.innerWidth,i.clientWidth),Math.max(window.innerHeight,i.clientHeight)]:()=>[n.width*n.scale+window.innerWidth-i.clientWidth,n.height*n.scale+window.innerHeight-i.clientHeight],o=e.config.screen?.bodyClasses===!0;this.__update=e=>{let[t,n]=a();if(n!==this.height&&(this.height=n),t!==this.width)this.width=t;else if(e!==!0)return;let r=this.sizes;this.gt.xs=t>=r.sm,this.gt.sm=t>=r.md,this.gt.md=t>=r.lg,this.gt.lg=t>=r.xl,this.lt.sm=t<r.sm,this.lt.md=t<r.md,this.lt.lg=t<r.lg,this.lt.xl=t<r.xl,this.xs=this.lt.sm,this.sm=this.gt.xs===!0&&this.lt.md===!0,this.md=this.gt.sm===!0&&this.lt.lg===!0,this.lg=this.gt.md===!0&&this.lt.xl===!0,this.xl=this.gt.lg,r=this.xs===!0&&`xs`||this.sm===!0&&`sm`||this.md===!0&&`md`||this.lg===!0&&`lg`||`xl`,r!==this.name&&(o===!0&&(document.body.classList.remove(`screen--${this.name}`),document.body.classList.add(`screen--${r}`)),this.name=r)};let s,c={},l=16;this.setSizes=e=>{Qe.forEach(t=>{e[t]!==void 0&&(c[t]=e[t])})},this.setDebounce=e=>{l=e};let u=()=>{let e=getComputedStyle(document.body);e.getPropertyValue(`--q-size-sm`)&&Qe.forEach(t=>{this.sizes[t]=parseInt(e.getPropertyValue(`--q-size-${t}`),10)}),this.setSizes=e=>{Qe.forEach(t=>{e[t]&&(this.sizes[t]=e[t])}),this.__update(!0)},this.setDebounce=e=>{s!==void 0&&r.removeEventListener(`resize`,s,$e),s=e>0?ge(this.__update,e):this.__update,r.addEventListener(`resize`,s,$e)},this.setDebounce(l),Object.keys(c).length===0?this.__update():(this.setSizes(c),c=void 0),o===!0&&this.name===`xs`&&document.body.classList.add(`screen--xs`)};me.value===!0?t.push(u):u()}}),V=E({isActive:!1,mode:!1},{__media:void 0,set(e){V.mode=e,e===`auto`?(V.__media===void 0&&(V.__media=window.matchMedia(`(prefers-color-scheme: dark)`),V.__updateMedia=()=>{V.set(`auto`)},V.__media.addListener(V.__updateMedia)),e=V.__media.matches):V.__media!==void 0&&(V.__media.removeListener(V.__updateMedia),V.__media=void 0),V.isActive=e===!0,document.body.classList.remove(`body--${e===!0?`light`:`dark`}`),document.body.classList.add(`body--${e===!0?`dark`:`light`}`)},toggle(){V.set(V.isActive===!1)},install({$q:e,ssrContext:t}){let n=e.config.dark;e.dark=this,this.__installed!==!0&&this.set(n===void 0?!1:n)}});function tt(e,t,n=document.body){if(typeof e!=`string`)throw TypeError(`Expected a string as propName`);if(typeof t!=`string`)throw TypeError(`Expected a string as value`);if(!(n instanceof Element))throw TypeError(`Expected a DOM element`);n.style.setProperty(`--q-${e}`,t)}function nt(e){if(e.ios===!0)return`ios`;if(e.android===!0)return`android`}function rt({is:e,has:t,within:n},r){let i=[e.desktop===!0?`desktop`:`mobile`,`${t.touch===!1?`no-`:``}touch`];if(e.mobile===!0){let t=nt(e);t!==void 0&&i.push(`platform-`+t)}if(e.nativeMobile===!0){let t=e.nativeMobileWrapper;i.push(t),i.push(`native-mobile`),e.ios===!0&&(r[t]===void 0||r[t].iosStatusBarPadding!==!1)&&i.push(`q-ios-padding`)}else e.electron===!0?i.push(`electron`):e.bex===!0&&i.push(`bex`);return n.iframe===!0&&i.push(`within-iframe`),i}function it(){let{is:e}=z,t=document.body.className,n=new Set(t.replace(/ {2}/g,` `).split(` `));if(e.nativeMobile!==!0&&e.electron!==!0&&e.bex!==!0){if(e.desktop===!0)n.delete(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`),n.add(`desktop`);else if(e.mobile===!0){n.delete(`desktop`),n.add(`mobile`),n.delete(`platform-ios`),n.delete(`platform-android`);let t=nt(e);t!==void 0&&n.add(`platform-${t}`)}}z.has.touch===!0&&(n.delete(`no-touch`),n.add(`touch`)),z.within.iframe===!0&&n.add(`within-iframe`);let r=Array.from(n).join(` `);t!==r&&(document.body.className=r)}function at(e){for(let t in e)tt(t,e[t])}var ot={install(e){if(this.__installed!==!0){if(me.value===!0)it();else{let{$q:t}=e;t.config.brand!==void 0&&at(t.config.brand);let n=rt(z,t.config);document.body.classList.add.apply(document.body.classList,n)}z.is.ios===!0&&document.body.addEventListener(`touchstart`,re),window.addEventListener(`keydown`,ae,!0)}}},st=()=>!0;function ct(e){return typeof e==`string`&&e!==``&&e!==`/`&&e!==`#/`}function lt(e){return e.startsWith(`#`)===!0&&(e=e.substring(1)),e.startsWith(`/`)===!1&&(e=`/`+e),e.endsWith(`/`)===!0&&(e=e.substring(0,e.length-1)),`#`+e}function ut(e){if(e.backButtonExit===!1)return()=>!1;if(e.backButtonExit===`*`)return st;let t=[`#/`];return Array.isArray(e.backButtonExit)===!0&&t.push(...e.backButtonExit.filter(ct).map(lt)),()=>t.includes(window.location.hash)}var dt={__history:[],add:re,remove:re,install({$q:e}){if(this.__installed===!0)return;let{cordova:t,capacitor:n}=z.is;if(t!==!0&&n!==!0)return;let r=e.config[t===!0?`cordova`:`capacitor`];if(r?.backButton===!1||n===!0&&(window.Capacitor===void 0||window.Capacitor.Plugins.App===void 0))return;this.add=e=>{e.condition===void 0&&(e.condition=st),this.__history.push(e)},this.remove=e=>{let t=this.__history.indexOf(e);t>=0&&this.__history.splice(t,1)};let i=ut(Object.assign({backButtonExit:!0},r)),a=()=>{if(this.__history.length){let e=this.__history[this.__history.length-1];e.condition()===!0&&(this.__history.pop(),e.handler())}else i()===!0?navigator.app.exitApp():window.history.back()};t===!0?document.addEventListener(`deviceready`,()=>{document.addEventListener(`backbutton`,a,!1)}):window.Capacitor.Plugins.App.addListener(`backButton`,a)}},ft={isoName:`en-US`,nativeName:`English (US)`,label:{clear:`Clear`,ok:`OK`,cancel:`Cancel`,close:`Close`,set:`Set`,select:`Select`,reset:`Reset`,remove:`Remove`,update:`Update`,create:`Create`,search:`Search`,filter:`Filter`,refresh:`Refresh`,expand:e=>e?`Expand "${e}"`:`Expand`,collapse:e=>e?`Collapse "${e}"`:`Collapse`},date:{days:`Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday`.split(`_`),daysShort:`Sun_Mon_Tue_Wed_Thu_Fri_Sat`.split(`_`),months:`January_February_March_April_May_June_July_August_September_October_November_December`.split(`_`),monthsShort:`Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec`.split(`_`),firstDayOfWeek:0,format24h:!1,pluralDay:`days`,prevMonth:`Previous month`,nextMonth:`Next month`,prevYear:`Previous year`,nextYear:`Next year`,today:`Today`,prevRangeYears:e=>`Previous ${e} years`,nextRangeYears:e=>`Next ${e} years`},table:{noData:`No data available`,noResults:`No matching records found`,loading:`Loading...`,selectedRecords:e=>e===1?`1 record selected.`:(e===0?`No`:e)+` records selected.`,recordsPerPage:`Records per page:`,allRows:`All`,pagination:(e,t,n)=>e+`-`+t+` of `+n,columns:`Columns`},pagination:{first:`First page`,prev:`Previous page`,next:`Next page`,last:`Last page`},editor:{url:`URL`,bold:`Bold`,italic:`Italic`,strikethrough:`Strikethrough`,underline:`Underline`,unorderedList:`Unordered List`,orderedList:`Ordered List`,subscript:`Subscript`,superscript:`Superscript`,hyperlink:`Hyperlink`,toggleFullscreen:`Toggle Fullscreen`,quote:`Quote`,left:`Left align`,center:`Center align`,right:`Right align`,justify:`Justify align`,print:`Print`,outdent:`Decrease indentation`,indent:`Increase indentation`,removeFormat:`Remove formatting`,formatting:`Formatting`,fontSize:`Font Size`,align:`Align`,hr:`Insert Horizontal Rule`,undo:`Undo`,redo:`Redo`,heading1:`Heading 1`,heading2:`Heading 2`,heading3:`Heading 3`,heading4:`Heading 4`,heading5:`Heading 5`,heading6:`Heading 6`,paragraph:`Paragraph`,code:`Code`,size1:`Very small`,size2:`A bit small`,size3:`Normal`,size4:`Medium-large`,size5:`Big`,size6:`Very big`,size7:`Maximum`,defaultFont:`Default Font`,viewSource:`View Source`},tree:{noNodes:`No nodes available`,noResults:`No matching nodes found`}};function pt(){let e=Array.isArray(navigator.languages)===!0&&navigator.languages.length!==0?navigator.languages[0]:navigator.language;if(typeof e==`string`)return e.split(/[-_]/).map((e,t)=>t===0?e.toLowerCase():t>1||e.length<4?e.toUpperCase():e[0].toUpperCase()+e.slice(1).toLowerCase()).join(`-`)}var H=E({__qLang:{}},{getLocale:pt,set(e=ft,t){let n={...e,rtl:e.rtl===!0,getLocale:pt};if(n.set=H.set,H.__langConfig===void 0||H.__langConfig.noHtmlAttrs!==!0){let e=document.documentElement;e.setAttribute(`dir`,n.rtl===!0?`rtl`:`ltr`),e.setAttribute(`lang`,n.isoName)}Object.assign(H.__qLang,n)},install({$q:e,lang:t,ssrContext:n}){e.lang=H.__qLang,H.__langConfig=e.config.lang,this.__installed===!0?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qLang,{get(){return Reflect.get(...arguments)},ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`&&e!==`getLocale`)}}),this.set(t||ft))}}),mt={name:`material-icons`,type:{positive:`check_circle`,negative:`warning`,info:`info`,warning:`priority_high`},arrow:{up:`arrow_upward`,right:`arrow_forward`,down:`arrow_downward`,left:`arrow_back`,dropdown:`arrow_drop_down`},chevron:{left:`chevron_left`,right:`chevron_right`},colorPicker:{spectrum:`gradient`,tune:`tune`,palette:`style`},pullToRefresh:{icon:`refresh`},carousel:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`,navigationIcon:`lens`},chip:{remove:`cancel`,selected:`check`},datetime:{arrowLeft:`chevron_left`,arrowRight:`chevron_right`,now:`access_time`,today:`today`},editor:{bold:`format_bold`,italic:`format_italic`,strikethrough:`strikethrough_s`,underline:`format_underlined`,unorderedList:`format_list_bulleted`,orderedList:`format_list_numbered`,subscript:`vertical_align_bottom`,superscript:`vertical_align_top`,hyperlink:`link`,toggleFullscreen:`fullscreen`,quote:`format_quote`,left:`format_align_left`,center:`format_align_center`,right:`format_align_right`,justify:`format_align_justify`,print:`print`,outdent:`format_indent_decrease`,indent:`format_indent_increase`,removeFormat:`format_clear`,formatting:`text_format`,fontSize:`format_size`,align:`format_align_left`,hr:`remove`,undo:`undo`,redo:`redo`,heading:`format_size`,code:`code`,size:`format_size`,font:`font_download`,viewSource:`code`},expansionItem:{icon:`keyboard_arrow_down`,denseIcon:`arrow_drop_down`},fab:{icon:`add`,activeIcon:`close`},field:{clear:`cancel`,error:`error`},pagination:{first:`first_page`,prev:`keyboard_arrow_left`,next:`keyboard_arrow_right`,last:`last_page`},rating:{icon:`grade`},stepper:{done:`check`,active:`edit`,error:`warning`},tabs:{left:`chevron_left`,right:`chevron_right`,up:`keyboard_arrow_up`,down:`keyboard_arrow_down`},table:{arrowUp:`arrow_upward`,warning:`warning`,firstPage:`first_page`,prevPage:`chevron_left`,nextPage:`chevron_right`,lastPage:`last_page`},tree:{icon:`play_arrow`},uploader:{done:`done`,clear:`clear`,add:`add_box`,upload:`cloud_upload`,removeQueue:`clear_all`,removeUploaded:`done_all`}},ht=E({iconMapFn:null,__qIconSet:{}},{set(e,t){let n={...e};n.set=ht.set,Object.assign(ht.__qIconSet,n)},install({$q:e,iconSet:t,ssrContext:n}){e.config.iconMapFn!==void 0&&(this.iconMapFn=e.config.iconMapFn),e.iconSet=this.__qIconSet,oe(e,`iconMapFn`,()=>this.iconMapFn,e=>{this.iconMapFn=e}),this.__installed===!0?t!==void 0&&this.set(t):(this.props=new Proxy(this.__qIconSet,{get(){return Reflect.get(...arguments)},ownKeys(e){return Reflect.ownKeys(e).filter(e=>e!==`set`)}}),this.set(t||mt))}}),gt=[de,ot,V,et,dt,H,ht];function _t(e,t){let n=A(e);n.config.globalProperties=t.config.globalProperties;let{reload:r,...i}=t._context;return Object.assign(n._context,i),n}function vt(e,t){t.forEach(t=>{t.install(e),t.__installed=!0})}function yt(e,t,n){e.config.globalProperties.$q=n.$q,e.provide(`_q_`,n.$q),vt(n,gt),t.components!==void 0&&Object.values(t.components).forEach(t=>{B(t)===!0&&t.name!==void 0&&e.component(t.name,t)}),t.directives!==void 0&&Object.values(t.directives).forEach(t=>{B(t)===!0&&t.name!==void 0&&e.directive(t.name,t)}),t.plugins!==void 0&&vt(n,Object.values(t.plugins).filter(e=>typeof e.install==`function`&&gt.includes(e)===!1)),me.value===!0&&(n.$q.onSSRHydrated=()=>{n.onSSRHydrated.forEach(e=>{e()}),n.$q.onSSRHydrated=()=>{}})}var bt={name:`Quasar`,version:`2.19.3`,install:function(e,t={}){let n={version:`2.19.3`};_e===!1?(t.config!==void 0&&Object.assign(De,t.config),n.config={...De},xe()):n.config=t.config||{},yt(e,t,{parentApp:e,$q:n,lang:t.lang,iconSet:t.iconSet,onSSRHydrated:[]})},lang:H,iconSet:ht},U=k({name:`QCardSection`,props:{tag:{type:String,default:`div`},horizontal:Boolean},setup(e,{slots:t}){let n=v(()=>`q-card__section q-card__section--${e.horizontal===!0?`horiz row no-wrap`:`vert`}`);return()=>l(e.tag,{class:n.value},I(t.default))}}),xt={xs:2,sm:4,md:6,lg:10,xl:14};function St(e,t,n){return{transform:t===!0?`translateX(${n.lang.rtl===!0?`-`:``}100%) scale3d(${-e},1,1)`:`scale3d(${e},1,1)`}}var Ct=k({name:`QLinearProgress`,props:{...F,...P,value:{type:Number,default:0},buffer:Number,color:String,trackColor:String,reverse:Boolean,stripe:Boolean,indeterminate:Boolean,query:Boolean,rounded:Boolean,animationSpeed:{type:[String,Number],default:2100},instantFeedback:Boolean},setup(e,{slots:t}){let{proxy:n}=T(),r=N(e,n.$q),i=ie(e,xt),a=v(()=>e.indeterminate===!0||e.query===!0),o=v(()=>e.reverse!==e.query),s=v(()=>({...i.value===null?{}:i.value,"--q-linear-progress-speed":`${e.animationSpeed}ms`})),c=v(()=>`q-linear-progress`+(e.color===void 0?``:` text-${e.color}`)+(e.reverse===!0||e.query===!0?` q-linear-progress--reverse`:``)+(e.rounded===!0?` rounded-borders`:``)),u=v(()=>St(e.buffer===void 0?1:e.buffer,o.value,n.$q)),d=v(()=>`with${e.instantFeedback===!0?`out`:``}-transition`),f=v(()=>`q-linear-progress__track absolute-full q-linear-progress__track--${d.value} q-linear-progress__track--${r.value===!0?`dark`:`light`}`+(e.trackColor===void 0?``:` bg-${e.trackColor}`)),p=v(()=>St(a.value===!0?1:e.value,o.value,n.$q)),m=v(()=>`q-linear-progress__model absolute-full q-linear-progress__model--${d.value} q-linear-progress__model--${a.value===!0?`in`:``}determinate`),h=v(()=>({width:`${e.value*100}%`})),g=v(()=>`q-linear-progress__stripe absolute-${e.reverse===!0?`right`:`left`} q-linear-progress__stripe--${d.value}`);return()=>{let n=[l(`div`,{class:f.value,style:u.value}),l(`div`,{class:m.value,style:p.value})];return e.stripe===!0&&a.value===!1&&n.push(l(`div`,{class:g.value,style:h.value})),l(`div`,{class:c.value,style:s.value,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":e.indeterminate===!0?void 0:e.value},j(t.default,n))}}}),wt=k({name:`QCard`,props:{...F,tag:{type:String,default:`div`},square:Boolean,flat:Boolean,bordered:Boolean},setup(e,{slots:t}){let{proxy:{$q:n}}=T(),r=N(e,n),i=v(()=>`q-card`+(r.value===!0?` q-card--dark q-dark`:``)+(e.bordered===!0?` q-card--bordered`:``)+(e.square===!0?` q-card--square no-border-radius`:``)+(e.flat===!0?` q-card--flat no-shadow`:``));return()=>l(e.tag,{class:i.value},I(t.default))}});function Tt(e,t,n){let r;function i(){r!==void 0&&(dt.remove(r),r=void 0)}return ee(()=>{e.value===!0&&i()}),{removeFromHistory:i,addToHistory(){r={condition:()=>n.value===!0,handler:t},dt.add(r)}}}var Et=0,Dt,Ot,kt,At=!1,jt,Mt,Nt,Pt=null;function Ft(e){It(e)&&D(e)}function It(e){if(e.target===document.body||e.target.classList.contains(`q-layout__backdrop`))return!0;let t=le(e),n=e.shiftKey&&!e.deltaX,r=!n&&Math.abs(e.deltaX)<=Math.abs(e.deltaY),i=n||r?e.deltaY:e.deltaX;for(let e=0;e<t.length;e++){let n=t[e];if(Pe(n,r))return r?i<0&&n.scrollTop===0?!0:i>0&&n.scrollTop+n.clientHeight===n.scrollHeight:i<0&&n.scrollLeft===0?!0:i>0&&n.scrollLeft+n.clientWidth===n.scrollWidth}return!0}function Lt(e){e.target===document&&(document.scrollingElement.scrollTop=document.scrollingElement.scrollTop)}function Rt(e){At!==!0&&(At=!0,requestAnimationFrame(()=>{At=!1;let{height:t}=e.target,{clientHeight:n,scrollTop:r}=document.scrollingElement;(kt===void 0||t!==window.innerHeight)&&(kt=n-t,document.scrollingElement.scrollTop=r),r>kt&&(document.scrollingElement.scrollTop-=Math.ceil((r-kt)/8))}))}function zt(e){let t=document.body,n=window.visualViewport!==void 0;if(e===`add`){let{overflowY:e,overflowX:r}=window.getComputedStyle(t);Dt=je(window),Ot=Oe(window),jt=t.style.left,Mt=t.style.top,Nt=window.location.href,t.style.left=`-${Dt}px`,t.style.top=`-${Ot}px`,r!==`hidden`&&(r===`scroll`||t.scrollWidth>window.innerWidth)&&t.classList.add(`q-body--force-scrollbar-x`),e!==`hidden`&&(e===`scroll`||t.scrollHeight>window.innerHeight)&&t.classList.add(`q-body--force-scrollbar-y`),t.classList.add(`q-body--prevent-scroll`),document.qScrollPrevented=!0,z.is.ios===!0&&(n===!0?(window.scrollTo(0,0),window.visualViewport.addEventListener(`resize`,Rt,R.passiveCapture),window.visualViewport.addEventListener(`scroll`,Rt,R.passiveCapture),window.scrollTo(0,0)):window.addEventListener(`scroll`,Lt,R.passiveCapture))}z.is.desktop===!0&&z.is.mac===!0&&window[`${e}EventListener`](`wheel`,Ft,R.notPassive),e===`remove`&&(z.is.ios===!0&&(n===!0?(window.visualViewport.removeEventListener(`resize`,Rt,R.passiveCapture),window.visualViewport.removeEventListener(`scroll`,Rt,R.passiveCapture)):window.removeEventListener(`scroll`,Lt,R.passiveCapture)),t.classList.remove(`q-body--prevent-scroll`),t.classList.remove(`q-body--force-scrollbar-x`),t.classList.remove(`q-body--force-scrollbar-y`),document.qScrollPrevented=!1,t.style.left=jt,t.style.top=Mt,window.location.href===Nt&&window.scrollTo(Dt,Ot),kt=void 0)}function Bt(e){let t=`add`;if(e===!0){if(Et++,Pt!==null){clearTimeout(Pt),Pt=null;return}if(Et>1)return}else{if(Et===0||(Et--,Et>0))return;if(t=`remove`,z.is.ios===!0&&z.is.nativeMobile===!0){Pt!==null&&clearTimeout(Pt),Pt=setTimeout(()=>{zt(t),Pt=null},100);return}}zt(t)}function Vt(){let e;return{preventBodyScroll(t){t!==e&&(e!==void 0||t===!0)&&(e=t,Bt(t))}}}var Ht=0,Ut={standard:`fixed-full flex-center`,top:`fixed-top justify-center`,bottom:`fixed-bottom justify-center`,right:`fixed-right items-center`,left:`fixed-left items-center`},Wt={standard:[`scale`,`scale`],top:[`slide-down`,`slide-up`],bottom:[`slide-up`,`slide-down`],right:[`slide-left`,`slide-right`],left:[`slide-right`,`slide-left`]},Gt=k({name:`QDialog`,inheritAttrs:!1,props:{...Ce,...Se,transitionShow:String,transitionHide:String,persistent:Boolean,autoClose:Boolean,allowFocusOutside:Boolean,noEscDismiss:Boolean,noBackdropDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,noShake:Boolean,seamless:Boolean,maximized:Boolean,fullWidth:Boolean,fullHeight:Boolean,square:Boolean,backdropFilter:String,position:{type:String,default:`standard`,validator:e=>[`standard`,`top`,`bottom`,`left`,`right`].includes(e)}},emits:[...Fe,`shake`,`click`,`escapeKey`],setup(e,{slots:t,emit:n,attrs:i}){let a=T(),o=s(null),c=s(!1),u=s(!1),d=null,f=null,p,m,h=v(()=>e.persistent!==!0&&e.noRouteDismiss!==!0&&e.seamless!==!0),{preventBodyScroll:g}=Vt(),{registerTimeout:_}=ye(),{registerTick:y,removeTick:b}=be(),{transitionProps:x,transitionStyle:te}=Ie(e,()=>Wt[e.position][0],()=>Wt[e.position][1]),S=v(()=>te.value+(e.backdropFilter===void 0?``:`;backdrop-filter:${e.backdropFilter};-webkit-backdrop-filter:${e.backdropFilter}`)),{showPortal:C,hidePortal:w,portalIsAccessible:E,renderPortal:D}=ke(a,o,ue,`dialog`),{hide:O}=ve({showing:c,hideOnRouteChange:h,handleShow:oe,handleHide:se,processOnMount:!0}),{addToHistory:k,removeFromHistory:A}=Tt(c,O,h),re=v(()=>`q-dialog__inner flex no-pointer-events q-dialog__inner--${e.maximized===!0?`maximized`:`minimized`} q-dialog__inner--${e.position} ${Ut[e.position]}`+(u.value===!0?` q-dialog__inner--animating`:``)+(e.fullWidth===!0?` q-dialog__inner--fullwidth`:``)+(e.fullHeight===!0?` q-dialog__inner--fullheight`:``)+(e.square===!0?` q-dialog__inner--square`:``)),j=v(()=>c.value===!0&&e.seamless!==!0),ie=v(()=>e.autoClose===!0?{onClick:L}:{}),ae=v(()=>[`q-dialog fullscreen no-pointer-events q-dialog--${j.value===!0?`modal`:`seamless`}`,i.class]);r(()=>e.maximized,e=>{c.value===!0&&F(e)}),r(j,e=>{g(e),e===!0?(Ae(le),Ee(ce)):(Me(le),we(ce))});function oe(t){k(),f=e.noRefocus===!1&&document.activeElement!==null?document.activeElement:null,F(e.maximized),C(),u.value=!0,e.noFocus===!0?b():(document.activeElement?.blur(),y(M)),_(()=>{if(a.proxy.$q.platform.is.ios===!0){if(e.seamless!==!0&&document.activeElement){let{top:e,bottom:t}=document.activeElement.getBoundingClientRect(),{innerHeight:n}=window,r=window.visualViewport===void 0?n:window.visualViewport.height;e>0&&t>r/2&&(document.scrollingElement.scrollTop=Math.min(document.scrollingElement.scrollHeight-r,t>=n?1/0:Math.ceil(document.scrollingElement.scrollTop+t-r/2))),document.activeElement.scrollIntoView()}m=!0,o.value.click(),m=!1}C(!0),u.value=!1,n(`show`,t)},e.transitionDuration)}function se(t){b(),A(),P(!0),u.value=!0,w(),f!==null&&(((t?.type.indexOf(`key`)===0?f.closest(`[tabindex]:not([tabindex^="-"])`):void 0)||f).focus(),f=null),_(()=>{w(!0),u.value=!1,n(`hide`,t)},e.transitionDuration)}function M(e){pe(()=>{let t=o.value;if(t!==null){if(e!==void 0){let n=t.querySelector(e);if(n!==null){n.focus({preventScroll:!0});return}}t.contains(document.activeElement)!==!0&&(t=t.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||t.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||t.querySelector(`[autofocus], [data-autofocus]`)||t,t.focus({preventScroll:!0}))}})}function N(e){e&&typeof e.focus==`function`?e.focus({preventScroll:!0}):M(),n(`shake`);let t=o.value;t!==null&&(t.classList.remove(`q-animate--scale`),t.classList.add(`q-animate--scale`),d!==null&&clearTimeout(d),d=setTimeout(()=>{d=null,o.value!==null&&(t.classList.remove(`q-animate--scale`),M())},170))}function ce(){e.seamless!==!0&&(e.persistent===!0||e.noEscDismiss===!0?e.maximized!==!0&&e.noShake!==!0&&N():(n(`escapeKey`),O()))}function P(t){d!==null&&(clearTimeout(d),d=null),(t===!0||c.value===!0)&&(F(!1),e.seamless!==!0&&(g(!1),Me(le),we(ce))),t!==!0&&(f=null)}function F(e){e===!0?p!==!0&&(Ht<1&&document.body.classList.add(`q-body--dialog`),Ht++,p=!0):p===!0&&(Ht<2&&document.body.classList.remove(`q-body--dialog`),Ht--,p=!1)}function L(e){m!==!0&&(O(e),n(`click`,e))}function R(t){e.persistent!==!0&&e.noBackdropDismiss!==!0?O(t):e.noShake!==!0&&N()}function le(t){e.allowFocusOutside!==!0&&E.value===!0&&Re(o.value,t.target)!==!0&&M(`[tabindex]:not([tabindex="-1"])`)}Object.assign(a.proxy,{focus:M,shake:N,__updateRefocusTarget(e){f=e||null}}),ee(P);function ue(){return l(`div`,{role:`dialog`,"aria-modal":j.value===!0?`true`:`false`,...i,class:ae.value},[l(ne,{name:`q-transition--fade`,appear:!0},()=>j.value===!0?l(`div`,{class:`q-dialog__backdrop fixed-full`,style:S.value,"aria-hidden":`true`,tabindex:-1,onClick:R}):null),l(ne,x.value,()=>c.value===!0?l(`div`,{ref:o,class:re.value,style:te.value,tabindex:-1,...ie.value},I(t.default)):null)])}return D}}),Kt=ue(`migration`,()=>{let e=s({state:`idle`});async function t(){try{let t=await fetch(`/api/migration/status`);if(!t.ok)return;e.value=await t.json()}catch{}}function n(t){e.value={...t}}return{status:e,fetchInitial:t,update:n}}),qt={class:`text-h6`},Jt={class:`text-h6`},Yt={class:`text-h6 text-negative`},Xt={class:`q-mt-sm`},Zt={key:0,class:`q-mt-md text-caption`},Qt={class:`q-mt-md text-caption`},$t=C({__name:`MigrationOverlay`,setup(e){let{t}=He(),r=Kt(),i=v(()=>[`backing-up`,`running`,`error`].includes(r.status.state));return a(()=>{r.fetchInitial()}),(e,a)=>(n(),m(Gt,{modelValue:i.value,"onUpdate:modelValue":a[0]||=e=>i.value=e,persistent:``,"no-backdrop-dismiss":``},{default:u(()=>[_(wt,{style:{"min-width":`400px`}},{default:u(()=>[x(r).status.state===`backing-up`?(n(),m(U,{key:0},{default:u(()=>[S(`div`,qt,p(x(t)(`migration.backing_up`)),1),_(se,{class:`q-mt-md`})]),_:1})):x(r).status.state===`running`?(n(),m(U,{key:1},{default:u(()=>[S(`div`,Jt,p(x(t)(`migration.running`,{processed:x(r).status.processed,total:x(r).status.total})),1),_(Ct,{value:x(r).status.total>0?x(r).status.processed/x(r).status.total:0,class:`q-mt-md`},null,8,[`value`])]),_:1})):x(r).status.state===`error`?(n(),m(U,{key:2},{default:u(()=>[S(`div`,Yt,p(x(t)(`migration.error`)),1),S(`div`,Xt,p(x(r).status.errorMessage),1),x(r).status.backupPath?(n(),y(`div`,Zt,p(x(t)(`migration.backup_location`,{path:x(r).status.backupPath})),1)):g(``,!0),S(`div`,Qt,p(x(t)(`migration.retry`)),1)]),_:1})):g(``,!0)]),_:1})]),_:1},8,[`modelValue`]))}}),en=ue(`templates`,{state:()=>({templates:[],loading:!1,loaded:!1}),actions:{async fetchTemplates(){if(!this.loading){this.loading=!0;try{let e=await fetch(`/api/templates`);if(!e.ok)throw Error(`HTTP ${e.status}`);this.templates=(await e.json()).templates,this.loaded=!0}catch(e){console.error(`[templates store] fetchTemplates failed:`,e)}finally{this.loading=!1}}},async createTemplate(e){let t=await fetch(`/api/templates`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}let n=await t.json();return this.templates.push(n),n},async updateTemplate(e,t){let n=await fetch(`/api/templates/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json(),i=this.templates.findIndex(t=>t.slug===e);return i>=0&&(this.templates[i]=r),r},async deleteTemplate(e){let t=await fetch(`/api/templates/${encodeURIComponent(e)}`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}this.templates=this.templates.filter(t=>t.slug!==e)}}}),tn={"common.save":`Speichern`,"common.cancel":`Abbrechen`,"common.delete":`Löschen`,"common.close":`Schließen`,"common.loading":`Laden...`,"common.search":`Suchen...`,"common.refresh":`Aktualisieren`,"common.start":`Starten`,"common.stop":`Stoppen`,"common.archive":`Archivieren`,"common.unarchive":`Wiederherstellen`,"common.selectWorkspace":`Arbeitsbereich auswählen`,"common.noResults":`Keine Ergebnisse für „{query}"`,"common.send":`senden`,"common.newLine":`neue Zeile`,"common.history":`Verlauf`,"common.justNow":`gerade eben`,"common.minutesAgo":`vor {count}m`,"common.hoursAgo":`vor {count}h`,"common.daysAgo":`vor {count}T`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude wählt das optimale Modell`,"model.opus47ClassicDescription":`Neuestes Opus, am leistungsfähigsten`,"model.opus471mDescription":`Neuestes Opus, 1M Kontext`,"model.opusClassicDescription":`Am leistungsstärksten`,"model.opus1mDescription":`Am leistungsstärksten, 1M Kontext`,"model.sonnetClassicDescription":`Ausgewogen`,"model.sonnet1mDescription":`Ausgewogen, 1M Kontext`,"model.haikuDescription":`Am schnellsten`,"reasoning.auto":`auto`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Claude entscheidet automatisch`,"reasoning.lowDescription":`Schneller, weniger Tiefe`,"reasoning.mediumDescription":`Ausgewogen`,"reasoning.highDescription":`Mehr Tiefe`,"reasoning.xhighDescription":`Erweiterte Tiefe, langfristige Aufgaben (Opus 4.7)`,"reasoning.maxDescription":`Maximale Tiefe`,"permissionMode.autoAccept":`Auto-accept`,"permissionMode.plan":`Plan`,"permissionProfile.strict":`Strenge Berechtigungen`,"permissionProfile.strictTooltip":`Aktiviert: Claude respektiert die allow/deny-Listen aus .claude/settings.json (Schreibvorgänge unter .claude/** oder .github/workflows/** sind erlaubt, wenn du sie auf allow gesetzt hast). Nachteil: Bash/MCP außerhalb der Liste führen zu einem Prompt und können den Auto-Loop blockieren. Deaktiviert (Standard): Kōbō verwendet --dangerously-skip-permissions — maximal permissiv, aber die CLI blockiert .claude/** und .github/workflows/** hart. Wirksam ab der nächsten Session.`,"workspaceList.title":`Arbeitsbereiche`,"workspaceList.needsAttention":`Aufmerksamkeit erforderlich`,"workspaceList.running":`Aktiv`,"workspaceList.idle":`Inaktiv`,"workspaceList.archived":`Archiviert`,"workspaceList.noWorkspaces":`Noch keine Arbeitsbereiche`,"workspaceList.footer":`{count} Arbeitsbereich | {count} Arbeitsbereiche`,"workspaceList.footerRunning":`{count} aktiv`,"workspaceList.deleteDialog.title":`Arbeitsbereich löschen?`,"workspaceList.deleteDialog.deleteLocal":`Lokalen Branch löschen`,"workspaceList.deleteDialog.deleteRemote":`Remote-Branch löschen`,"workspaceList.deleteDialog.warning":`Achtung: Diese Aktion ist auf dem Remote unwiderruflich.`,"workspacePage.selectWorkspace":`Arbeitsbereich auswählen, um zu beginnen`,"workspacePage.session":`Sitzung #{n}`,"workspacePage.newSession":`+ Neue Sitzung`,"workspacePage.renameSession":`Umbenennen`,"workspacePage.renameSessionTitle":`Sitzung umbenennen`,"workspacePage.sessionNameLabel":`Sitzungsname`,"workspacePage.sessionEndedNotice":`Diese Sitzung ist beendet. Erstelle eine neue Sitzung um fortzufahren.`,"workspacePage.renameFailed":`Umbenennung fehlgeschlagen`,"workspacePage.createSessionFailed":`Sitzung konnte nicht erstellt werden`,"workspacePage.startFailed":`Start fehlgeschlagen`,"workspacePage.stopFailed":`Stopp fehlgeschlagen`,"workspacePage.interrupt":`Unterbrechen`,"workspacePage.interrupted":`Agent unterbrochen — wartet auf Ihre nächste Nachricht`,"workspacePage.interruptFailed":`Unterbrechung fehlgeschlagen`,"workspacePage.interruptTooltip":`Sanfte Unterbrechung (wie Escape) — stoppt das aktuelle Tool, hält die Sitzung aktiv`,"workspacePage.pendingNextRun":`Beim nächsten Start angewendet`,"search.title":`Suche`,"search.tooltip":`Agent-Verlauf durchsuchen`,"search.placeholder":`In allen Agent-Nachrichten suchen…`,"search.includeArchived":`Archivierte Arbeitsbereiche einbeziehen`,"search.loading":`Suche läuft…`,"search.noResults":`Keine Treffer`,"search.error":`Suche fehlgeschlagen: {message}`,"search.resultCount":`{n} Treffer`,"search.eventType.userMessage":`Sie`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Noch keine Aktivität`,"activityFeed.emptyHint":`Starten Sie einen Arbeitsbereich, um die Agentenausgabe hier zu sehen`,"activityFeed.initialPrompt":`Initialer Prompt`,"activityFeed.you":`Sie`,"activityFeed.agent":`Agent`,"activityFeed.question":`Frage`,"activityFeed.goToPrevious":`Zur vorherigen Nachricht`,"activityFeed.scrollToBottom":`Nach unten scrollen`,"activityFeed.sendAnswers":`Antworten senden`,"agentBusy.banner":`Agent ist beschäftigt`,"agentBusy.subagentsRunning":`1 Sub-Agent aktiv | {n} Sub-Agents aktiv`,"agentBusy.viewSubagents":`Sub-Agents anzeigen`,"agentBusy.pendingMessage":`Warten — Agent ist beschäftigt`,"terminal.title":`Terminal`,"terminal.open":`Terminal öffnen`,"terminal.close":`Terminal schließen`,"terminal.noWorkspace":`Workspace auswählen`,"terminal.noWorktree":`Worktree noch nicht erstellt`,"terminal.error":`Terminalfehler`,"terminal.exited":`Terminal beendet`,"chatInput.placeholder":`Nachricht... (/ für Skills)`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Bild anhängen`,"chatInput.queueBanner":`Nachricht in Warteschlange — wird gesendet, wenn der Agent fertig ist`,"chatInput.cancelQueue":`Warteschlange abbrechen`,"chatInput.autoLoopBanner":`Auto-Loop läuft — beende ihn, um eine Nachricht zu senden`,"chatInput.autoLoopStop":`Beenden`,"koboCommand.checkProgressDesc":`Fortschritt bei Aufgaben und Akzeptanzkriterien prüfen`,"chatInput.uploading":`Wird hochgeladen...`,"createPage.title":`Woran möchten Sie arbeiten?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion aktiviert`,"createPage.importNotion":`Aus Notion importieren`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`Die URL muss mit https://www.notion.so/ beginnen`,"createPage.notionAutoExtract":`Unteraufgaben und Akzeptanzkriterien werden automatisch extrahiert.`,"createPage.notionPanelChoiceLabel":`Diese URL verweist auf eine Unterseite (?p=). An welcher möchtest du arbeiten?`,"createPage.notionPanelOption":`Unterseite (Panel)`,"createPage.notionPanelOptionDesc":`Die Seite, die du angesehen hast — empfohlen`,"createPage.notionParentOption":`Übergeordnete Seite`,"createPage.notionParentOptionDesc":`Das Epic / die Datenbank dazu`,"createPage.importSentry":`Sentry importieren`,"createPage.sentryEnabled":`Sentry aktiviert`,"createPage.sentryPlaceholder":`https://ihre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`Die URL muss auf ein Sentry-Issue zeigen (/issues/<id>)`,"createPage.sentryAutoExtract":`Sentry-Issue wird automatisch importiert`,"createPage.sentryExtractHint":`Kobo extrahiert das Issue und schreibt es nach .ai/thoughts/`,"createPage.workspaceName":`Name des Arbeitsbereichs (Standard: Notion-Seitentitel)`,"createPage.workspaceNamePlaceholder":`Name des Arbeitsbereichs...`,"createPage.instructions":`Zusätzliche Anweisungen (optional)...`,"createPage.instructionsPlaceholder":`Aufgabe beschreiben...`,"createPage.manualHint":`Kein Notion-Ticket? Fügen Sie Ihre Aufgaben und Akzeptanzkriterien manuell hinzu — sie werden dem Claude-Agent als Kontext mitgegeben.`,"createPage.tasks":`Aufgaben ({count})`,"createPage.addTask":`Aufgabe hinzufügen...`,"createPage.acceptanceCriteria":`Akzeptanzkriterien ({count})`,"createPage.addCriterion":`Kriterium hinzufügen...`,"createPage.projectPath":`Projektpfad eingeben`,"createPage.branchType":`Branch-Typ`,"createPage.branch":`Branch`,"createPage.noBranches":`Keine Branches gefunden`,"createPage.enterPath":`Projektpfad eingeben`,"createPage.create":`Erstellen`,"createPage.skipSetupScript":`Setup-Skript überspringen`,"createPage.attachWorktreeToggle":`Bestehenden Worktree anhängen`,"createPage.attachWorktreeEnabled":`Bestehenden Worktree wiederverwenden`,"createPage.worktreePickerLabel":`Bestehender Worktree`,"createPage.noOrphanWorktrees":`Kein verwaister Worktree in diesem Projekt`,"createPage.pickWorktreeRequired":`Bitte einen Worktree zum Anhängen auswählen`,"createPage.notionExtractHint":`Unteraufgaben und Akzeptanzkriterien werden aus der Notion-Seite extrahiert.`,"createPage.notionImportHint":`Klicken Sie auf „Aus Notion importieren", um Unteraufgaben automatisch aus einem Ticket zu extrahieren.`,"createPage.errorCreating":`Fehler beim Erstellen des Arbeitsbereichs.`,"createPage.validationNotionUrl":`Bitte eine gültige Notion-URL einfügen (https://www.notion.so/...).`,"createPage.validationDescription":`Bitte beschreiben Sie die Aufgabe.`,"createPage.validationName":`Bitte geben Sie einen Arbeitsbereichnamen an.`,"createPage.validationPath":`Bitte geben Sie den Projektpfad ein.`,"createPage.validationBranch":`Bitte wählen Sie einen Branch aus.`,"settings.title":`Einstellungen`,"settings.language":`Sprache`,"settings.global":`Allgemein`,"settings.projects":`Projekte`,"settings.globalSettings":`Allgemeine Einstellungen`,"settings.defaultModel":`Standardmodell`,"settings.agentPermissions":`Agentenberechtigungen`,"settings.skipPermissions":`Berechtigungsabfragen überspringen (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Achtung: Wird diese Option deaktiviert, werden alle Tool-Berechtigungen (Write, Edit, Bash...) im Headless-Modus automatisch abgelehnt. Der Agent kann dann nur lesen.`,"settings.notifications":`Benachrichtigungen`,"settings.browserNotifications":`Browser-Benachrichtigung wenn Agent fertig ist`,"settings.audioNotifications":`Ton-Benachrichtigung wenn Agent fertig ist`,"settings.defaultPermissionMode":`Standard-Berechtigungsmodus`,"settings.defaultPermissionModeHint":`Modus bei der Erstellung eines neuen Workspaces. Plan = Nur-Lesen-Brainstorming zuerst, Auto-accept = sofortige vollständige Ausführung.`,"settings.activityFeed":`Aktivitätsfeed`,"settings.verboseMessages":`Ausführliche Systemnachrichten anzeigen (task_progress, task_started)`,"settings.availableVariables":`Verfügbare Variablen in der PR-Prompt-Vorlage`,"settings.prPromptTemplate":`PR-Prompt-Vorlage`,"settings.prPromptPlaceholder":`Anweisungen für den Agenten bei der Erstellung von GitHub-PRs...`,"settings.prPromptHint":`Verwenden Sie die oben aufgeführten Platzhalter (doppelte geschweifte Klammern).`,"settings.var.prNumber":`PR-Nummer (z. B. 42)`,"settings.var.prUrl":`Vollständige URL der erstellten PR`,"settings.var.branchName":`Name des Arbeitsbranches`,"settings.var.sourceBranch":`Quellbranch, auf den die PR abzielt`,"settings.var.workspaceName":`Workspace-Name`,"settings.var.projectName":`Letztes Segment des Projektpfads`,"settings.var.notionUrl":`Notion-URL falls gesetzt, sonst leer`,"settings.var.commits":`Aufzählung der Commits zwischen Source und Head`,"settings.var.diffStats":`Git-Shortstat-Zusammenfassung (Dateien, Einfügungen, Löschungen)`,"settings.var.tasks":`Reguläre Aufgaben als Checkliste`,"settings.var.acceptanceCriteria":`Akzeptanzkriterien als Checkliste`,"settings.gitConventions":`Git-Konventionen (global)`,"settings.gitConventionsPlaceholder":`# Git-Konventionen...`,"settings.gitConventionsHint":`Diese Konventionen werden in .ai/.git-conventions.md jedes neuen Arbeitsbereichs geschrieben und müssen vom Agenten vor jeder Git-Operation eingehalten werden. Werden durch projektspezifische Konventionen überschrieben, falls definiert.`,"settings.setupScript":`Setup-Skript`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Wird mit bash im Worktree nach der Erstellung ausgeführt, bevor der Agent startet. Kein Shebang erforderlich. Bei Fehler wird der Workspace auf Fehler gesetzt. Timeout: 5 Minuten.`,"settings.e2e.title":`E2E-Tests`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Keiner`,"settings.e2e.frameworkOther":`Anderer`,"settings.e2e.skill":`Skill (optional)`,"settings.e2e.skillPlaceholder":`z.B. cypress-tester`,"settings.e2e.prompt":`Eigene Anleitung (optional)`,"settings.e2e.promptPlaceholder":`z.B. Page-Object-Pattern, data-testid-Attribute verwenden`,"settings.e2e.helpText":`Wenn konfiguriert, fügt der Auto-Loop-Grooming-Agent E2E-Unteraufgaben für UI-Funktionen ein.`,"settings.finalization.title":`Auto-loop-Finalisierung`,"settings.finalization.helpText":`Optional: ein Prompt, den der Agent als allerletzte Auto-loop-Iteration ausführt. Wird typischerweise für finale Quality-Checks (Lint, Typecheck, Tests) verwendet. Die Grooming-Phase erstellt eine mit [FINAL] präfixierte Aufgabe, die diesen Prompt nutzt.`,"settings.finalization.prompt":`Finalisierungs-Prompt`,"settings.finalization.promptPlaceholder":`z. B. Führe npm run lint und npm test aus, dann markiere diese Aufgabe als erledigt.`,"settings.editorCommand":`Editor-Befehl`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Befehl zum Öffnen des Worktrees in Ihrem Editor. Der Worktree-Pfad wird als Argument übergeben.`,"settings.mcpSelection":`Claude-MCP-Auswahl`,"settings.mcpAutoSelect":`Auto (erster passender aktiver MCP)`,"settings.notionMcp":`Notion-MCP-Schlüssel`,"settings.sentryMcp":`Sentry-MCP-Schlüssel`,"settings.mcpSelectionHint":`Aktive Einträge werden aus ~/.claude.json gelesen. Auto belassen für das Standard-Matching.`,"settings.configuredProjects":`Konfigurierte Projekte`,"settings.noProjects":`Keine Projekte konfiguriert`,"settings.addProject":`Projekt hinzufügen`,"settings.newProject":`Neues Projekt`,"settings.editProject":`Projekt bearbeiten`,"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.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.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.saveError":`Fehler beim Speichern der Einstellungen.`,"settings.projectSaved":`Projekt gespeichert.`,"settings.projectSaveError":`Fehler beim Speichern des Projekts.`,"settings.projectDeleted":`Projekt gelöscht.`,"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`,"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.localOnly":`nur lokal`,"git.pushed":`gepusht`,"git.unpushed":`{count} nicht gepusht`,"git.commits":`{count} Commit | {count} Commits`,"git.commits.loading":`Commits werden geladen…`,"git.commits.empty":`Keine Commits auf diesem Branch`,"git.commits.pushed":`Gepusht`,"git.commits.unpushed":`Ungepusht`,"git.commits.clickToAppend":`klicken, um SHA an Chat anzuhängen`,"git.files":`{count} Datei | {count} Dateien`,"git.staged":`{count} vorgemerkt`,"git.modified":`{count} geändert`,"git.untracked":`{count} nicht verfolgt`,"git.viewPr":`PR anzeigen`,"git.createPr":`PR erstellen`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Sicherer als --force: Der Push wird abgelehnt, wenn der Remote Commits hat, die du nicht gesehen hast. Nach einem Rebase oder Amend bereits gepushter Commits verwenden.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`Kein Upstream für diesen Branch gesetzt — pushe ihn zuerst, um Pull zu aktivieren.`,"git.sync":`Sync`,"git.createPrNoRemote":`Branch zuerst pushen`,"git.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.renameDisabledForExternal":`Umbenennen ist für angehängte externe Worktrees deaktiviert.`,"git.diff":`Diff`,"git.diffReview":`Diff Review`,"git.diffReviewTooltip":`Diff-Viewer im Review-Modus öffnen — Inline-Kommentare + Batch-Übergabe an den Agenten`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Branch rebasen?`,"git.rebaseConfirmMessage":`Rebase auf {branch}. Es können Konflikte auftreten.`,"git.rebaseSuccess":`Rebase abgeschlossen`,"git.rebaseFailed":`Rebase fehlgeschlagen`,"git.merge":`Merge`,"git.mergeConfirmTitle":`Branch mergen?`,"git.mergeConfirmMessage":`{branch} in diesen Branch mergen. Konflikte möglich.`,"git.mergeSuccess":`Merge abgeschlossen`,"git.mergeFailed":`Merge fehlgeschlagen`,"git.conflictTitleMerge":`Merge-Konflikte erkannt`,"git.conflictTitleRebase":`Rebase-Konflikte erkannt`,"git.conflictSubtitle":`{count} Datei(en) mit Konflikten. Wie soll fortgefahren werden?`,"git.conflictAbort":`Abbrechen`,"git.conflictResolveWithAgent":`Agent soll auflösen`,"git.conflictAborted":`Vorgang abgebrochen`,"git.conflictHandoffSuccess":`Agent löst die Konflikte`,"git.pushConfirmTitle":`Branch pushen?`,"git.pushConfirmMessage":`{branch} zum Remote pushen.`,"git.pushConfirmMessagePrefix":`Branch`,"git.pushConfirmMessageSuffix":`zum Remote pushen.`,"git.changePrBase":`PR-Zielbranch ändern`,"git.changePrBaseTitle":`Zielbranch ändern`,"git.changePrBaseMessage":`Geben Sie den neuen Zielbranch für den Pull Request ein.`,"git.changePrBaseSuccess":`PR-Zielbranch aktualisiert`,"git.changePrBaseFailed":`PR-Zielbranch konnte nicht geändert werden`,"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.prCreated":`PR #{n} erstellt`,"devServer.title":`Dev-Server`,"devServer.noWorkspace":`Kein Arbeitsbereich ausgewählt`,"devServer.notConfigured":`Nicht konfiguriert —`,"devServer.goToSettings":`Einstellungen`,"devServer.logs":`Logs`,"devServer.running":`Läuft`,"devServer.starting":`Startet`,"devServer.stopping":`Wird gestoppt`,"devServer.error":`Fehler`,"devServer.stopped":`Gestoppt`,"devServer.unknown":`Unbekannt`,"devServer.containers":`{count} Container | {count} Container`,"devServer.logDialog.title":`Dev-Server-Logs`,"devServer.logDialog.empty":`Keine Logs verfügbar`,"notion.title":`Notion`,"tasks.title":`Aufgaben`,"notion.addTask":`Aufgabe hinzufügen`,"notion.noUrl":`Keine Notion-URL`,"notion.subtasks":`{done}/{total} Unteraufgaben`,"notion.noTasks":`Keine Aufgaben`,"notion.newTask":`Neue Aufgabe... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.title":`Akzeptanzkriterien`,"acceptance.addCriterion":`Kriterium hinzufügen`,"acceptance.newCriterion":`Neues Kriterium... (Enter zum Hinzufügen, Esc zum Abbrechen)`,"acceptance.empty":`Keine Akzeptanzkriterien`,"tasks.askProgress":`Agent auffordern, Fortschritt zu prüfen`,"agentTodos.title":`Agent-Todos`,"agentTodos.empty":`Keine Agent-Todos`,"subagents.title":`Sub-Agents`,"subagents.empty":`Noch keine Sub-Agent-Aktivität`,"subagents.tools":`{count} Tools`,"subagents.running":`Aktiv: `,"stats.title":`Statistiken`,"stats.info":`Info`,"stats.status":`Status`,"stats.model":`Modell`,"stats.branch":`Branch`,"stats.sessions":`Sitzungen`,"stats.duration":`Dauer`,"stats.timeline":`Zeitverlauf`,"stats.created":`Erstellt`,"stats.firstSession":`Erste Sitzung`,"stats.lastPrompt":`Letzter Prompt`,"stats.lastResponse":`Letzte Antwort`,"stats.updated":`Aktualisiert`,"stats.activity":`Aktivität`,"stats.agentMessages":`Agent-Nachrichten`,"stats.userMessages":`Benutzernachrichten`,"stats.toolCalls":`Tool-Aufrufe`,"stats.errors":`Fehler`,"stats.usage":`Verbrauch`,"stats.inputTokens":`Eingabe-Tokens`,"stats.outputTokens":`Ausgabe-Tokens`,"stats.totalTokens":`Tokens gesamt`,"stats.cost":`Kosten`,"stats.usageLimits":`Nutzungslimits`,"stats.used":`verbraucht`,"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.openStatsPanel":`Stats-Panel öffnen`,"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`,"rateLimitType.fiveHour":`5h-Sitzung`,"rateLimitType.sevenDay":`Wöchentlich`,"stats.subagents":`Sub-Agents`,"stats.completed":`Abgeschlossen`,"stats.tokens":`Tokens`,"stats.progress":`Fortschritt`,"stats.tasks":`Aufgaben`,"stats.acceptanceCriteria":`Akzeptanzkriterien`,"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`,"tooltip.refreshStats":`Statistiken aktualisieren`,"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`,"diff.title":`Diff`,"diff.side":`Nebeneinander`,"diff.inline":`Inline`,"diff.hideUnchanged":`Unveränderten Code ausblenden`,"diff.showUnchanged":`Unveränderten Code anzeigen`,"diff.showUntracked":`Nicht versionierte Dateien anzeigen`,"diff.hideUntracked":`Nicht versionierte Dateien ausblenden`,"diff.rollbackToRemote":`Auf Remote-Version zurücksetzen`,"diff.rollbackConfirm":`{path} auf die Remote-Version (origin) zurücksetzen? Lokale Änderungen an dieser Datei gehen verloren.`,"diff.rollbackConfirmOk":`Zurücksetzen`,"diff.rollbackDone":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneRemote":`Datei auf Remote-Version zurückgesetzt`,"diff.rollbackDoneHead":`Lokale Änderungen verworfen (Datei auf letzten Commit zurückgesetzt)`,"diff.rollbackDoneDeleted":`Nicht versionierte Datei gelöscht`,"diff.deleteUntracked":`Nicht versionierte Datei löschen`,"diff.deleteUntrackedConfirm":`{path} dauerhaft löschen? Diese Datei wird nicht von Git verfolgt — ihr Inhalt geht verloren.`,"diff.deleteUntrackedConfirmOk":`Löschen`,"diff.rollbackFailed":`Rollback fehlgeschlagen`,"diff.modeInspect":`Inspect`,"diff.modeReview":`Review`,"diff.addComment":`Kommentar hinzufügen`,"diff.replyComment":`Antworten`,"diff.editComment":`Bearbeiten`,"diff.deleteComment":`Löschen`,"diff.deleteCommentConfirm":`Diesen Kommentar löschen?`,"diff.commentPlaceholder":`Review-Kommentar schreiben… (Markdown unterstützt)`,"diff.reviewDraft":`Review-Entwurf`,"diff.reviewEmpty":`Noch keine Kommentare — fahre mit der Maus über eine Zeile im Diff und klicke +, um einen hinzuzufügen.`,"diff.reviewGlobalPlaceholder":`Optionale Gesamtnachricht zur Review`,"diff.submitReview":`Review absenden ({n})`,"diff.reviewSubmitted":`Review an den Agenten gesendet`,"diff.reviewSubmitFailed":`Review konnte nicht gesendet werden: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Ungepusht`,"diff.noChanges":`Keine Änderungen`,"diff.selectFile":`Datei auswählen, um den Diff anzuzeigen`,"diff.addToChat":`Zum Chat hinzufügen`,"notification.agentFinished":`{name} — Agent fertig`,"notification.agentError":`{name} — Agent-Fehler`,"contextMenu.rename":`Umbenennen`,"contextMenu.copyPath":`Worktree-Pfad kopieren`,"contextMenu.openEditor":`Im Editor öffnen`,"contextMenu.runSetup":`Setup-Skript ausführen`,"contextMenu.openNotion":`In Notion öffnen`,"contextMenu.openSentry":`In Sentry öffnen`,"workspace.favorite":`Als Favorit markieren`,"workspace.unfavorite":`Aus Favoriten entfernen`,"workspace.showFavoritesOnly":`Nur Favoriten anzeigen`,"tags.manage":`Tags verwalten`,"tags.manageTitle":`Workspace-Tags verwalten`,"tags.noTagsDefined":`Keine Tags definiert. Füge welche in Einstellungen > Global > Tags hinzu.`,"tags.orphanedHint":`{count} Tag(s) sind nicht mehr im globalen Katalog. Abwählen zum Entfernen.`,"settings.tagsTitle":`Workspace-Tags`,"settings.tagsHint":`Definiere die Tags, die Workspaces zugewiesen werden können. Tippe zum Hinzufügen, klicke auf das Kreuz zum Entfernen.`,"settings.tagsLabel":`Verfügbare Tags`,"settings.shareTitle":`Konfiguration teilen`,"settings.shareHint":`Exportiere Einstellungen, Templates und Tags als JSON-Bundle. MCP-Keys werden aus Sicherheitsgründen nicht exportiert.`,"settings.exportConfig":`Exportieren`,"settings.importConfig":`Importieren`,"settings.exportSuccess":`Konfiguration exportiert`,"settings.importSuccess":`Konfiguration importiert`,"settings.importConfirmTitle":`Konfiguration importieren`,"settings.importConfirmMessage":`Dies ersetzt deine aktuellen Einstellungen, Templates und Tags. MCP-Keys bleiben erhalten. Fortfahren?`,"health.title":`Status`,"health.tooltip":`Systemstatus`,"health.envTitle":`Umgebung`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Datenbank`,"health.dbPath":`Pfad`,"health.dbSize":`Größe`,"health.schemaVersion":`Schema-Version`,"health.cliTitle":`Claude CLI`,"health.cliMissing":`claude nicht im PATH gefunden. Installiere Claude Code, um Agenten zu starten.`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} gesamt, {archived} archiviert`,"health.worktreesMissing":`{count} Worktree(s) auf der Festplatte fehlen`,"health.sessionsTitle":`Agent-Sitzungen`,"health.sessionsOrphaned":`{n} verwaiste laufende Sitzung(en)`,"health.integrationsTitle":`Integrationen`,"health.integrationConfigured":`konfiguriert`,"health.integrationMissing":`nicht konfiguriert`,"session.started":`Sitzung gestartet`,"session.ended":`Sitzung beendet`,"session.compacted":`Kontext komprimiert`,"tool.running":`Läuft...`,"activity.raw_lines":`Rohausgabezeilen ({n})`,"activity.loading_older":`Ältere Nachrichten werden geladen…`,"activity.prev_user_message":`Vorherige Nachricht des Benutzers`,"activity.scroll_to_bottom":`Nach unten scrollen`,"chat.systemPrompt":`System-Prompt`,"chat.agent":`Agent`,"chat.you":`Du`,"chat.session":`Sitzung`,"chat.nActions":`{n} Aktion | {n} Aktionen`,"chat.lastUpdatedAt":`Zuletzt aktualisiert um {time}`,"chat.scrollToTurnTop":`Zum Nachrichtenanfang scrollen`,"migration.backing_up":`Datenbank wird gesichert…`,"migration.running":`Agent-Daten werden migriert — {processed}/{total}`,"migration.error":`Migration fehlgeschlagen`,"migration.backup_location":`Ein Backup wurde unter {path} gespeichert. Starte Kōbō neu, um erneut zu versuchen.`,"migration.retry":`Starte Kōbō neu, um erneut zu versuchen.`,"engine.select":`Engine`,"engine.model":`Modell`,"engine.effort":`Reasoning-Aufwand`,"engine.permission":`Berechtigungsmodus`,"createPage.permissionLockedByAutoLoop":`Auto-Schleife benötigt Auto-Accept (MCP + Änderungen). Deaktiviere die Auto-Schleife, um den Plan-Modus zu wählen.`,"engine.permission.auto-accept":`Automatisch akzeptieren`,"engine.permission.plan":`Plan (schreibgeschützt)`,"wakeup.scheduledIn":`Nächste Weckung in {n}s`,"wakeup.scheduledAt":`Nächste Weckung um {time}`,"wakeup.firing":`Wecke auf...`,"wakeup.reason":`Grund: {reason}`,"wakeup.cancel":`Diese Weckung abbrechen`,"wakeup.pendingIndicator":`Weckung geplant`,"workspaceList.prOpen":`Pull Request offen`,"autoLoop.toggle":`Auto-Schleife`,"autoLoop.start":`Auto-Schleife starten`,"autoLoop.prepare":`Auto-Schleife vorbereiten`,"autoLoop.prepareBusy":`Warte, bis der Agent fertig ist, bevor du vorbereitest`,"autoLoop.forceReady":`Ich weiß, was ich tue — Grooming überspringen`,"autoLoop.forceReadyConfirm":`Grooming überspringen und Auto-Schleife als bereit markieren? Kann hängen bleiben, wenn Aufgaben nicht atomar sind.`,"autoLoop.stop":`Auto-Schleife stoppen`,"autoLoop.notReady":`Zuerst „Auto-Schleife vorbereiten" ausführen`,"autoLoop.noTasks":`Zuerst Aufgaben hinzufügen`,"autoLoop.progress":`Auto-Schleife · {done}/{total} Aufgaben`,"autoLoop.preparing":`Auto-Schleife · Vorbereitung`,"autoLoop.preparingTooltip":`Grooming läuft — der Agent erstellt / überprüft Aufgaben. Die Schleife startet, sobald mark_auto_loop_ready aufgerufen wird.`,"autoLoop.running":`Auto-Schleife läuft`,"autoLoop.startInMode":`Im Auto-Schleifen-Modus starten`,"koboCommand.prepAutoloopDesc":`Aufgaben für Auto-Schleifen-Modus vorbereiten (auf Atomarität prüfen)`,"staleSessionBanner.title":`Auto-Schleife läuft`,"staleSessionBanner.message":`Du siehst eine ältere Sitzung — der Agent arbeitet gerade in der neuesten.`,"staleSessionBanner.switchToCurrent":`Zur aktuellen wechseln`},nn={"common.save":`Save`,"common.cancel":`Cancel`,"common.delete":`Delete`,"common.close":`Close`,"common.loading":`Loading...`,"common.search":`Search...`,"common.refresh":`Refresh`,"common.start":`Start`,"common.stop":`Stop`,"common.archive":`Archive`,"common.unarchive":`Unarchive`,"common.selectWorkspace":`Select a workspace`,"common.noResults":`No results for "{query}"`,"common.send":`send`,"common.newLine":`new line`,"common.history":`history`,"common.justNow":`just now`,"common.minutesAgo":`{count}m ago`,"common.hoursAgo":`{count}h ago`,"common.daysAgo":`{count}d ago`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude picks the optimal model`,"model.opus47ClassicDescription":`Latest Opus, most capable`,"model.opus471mDescription":`Latest Opus, 1M context`,"model.opusClassicDescription":`Most powerful`,"model.opus1mDescription":`Most powerful, 1M context`,"model.sonnetClassicDescription":`Balanced`,"model.sonnet1mDescription":`Balanced, 1M context`,"model.haikuDescription":`Fastest`,"reasoning.auto":`auto`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Claude decides automatically`,"reasoning.lowDescription":`Faster, less depth`,"reasoning.mediumDescription":`Balanced`,"reasoning.highDescription":`More depth`,"reasoning.xhighDescription":`Extended depth, long-horizon tasks (Opus 4.7)`,"reasoning.maxDescription":`Maximum depth`,"permissionMode.autoAccept":`Auto-accept`,"permissionMode.plan":`Plan`,"permissionProfile.strict":`Strict permissions`,"permissionProfile.strictTooltip":`When ON, Claude respects the project's .claude/settings.json allow/deny list (lets writes under .claude/** or .github/workflows/** through when you've allowed them). Trade-off: un-allow-listed Bash or MCP calls will prompt and may stall the auto-loop. When OFF (default), Kōbō passes --dangerously-skip-permissions — maximum permissiveness but the CLI hard-denies .claude/** and .github/workflows/** regardless of your allow list. Takes effect on the next session spawn.`,"workspaceList.title":`Workspaces`,"workspaceList.needsAttention":`Needs Attention`,"workspaceList.running":`Running`,"workspaceList.idle":`Idle`,"workspaceList.archived":`Archived`,"workspaceList.noWorkspaces":`No workspaces yet`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} running`,"workspaceList.deleteDialog.title":`Delete workspace?`,"workspaceList.deleteDialog.deleteLocal":`Delete local branch`,"workspaceList.deleteDialog.deleteRemote":`Delete remote branch`,"workspaceList.deleteDialog.warning":`Warning: this action is irreversible on the remote.`,"workspacePage.selectWorkspace":`Select a workspace to begin`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ New session`,"workspacePage.renameSession":`Rename`,"workspacePage.renameSessionTitle":`Rename session`,"workspacePage.sessionNameLabel":`Session name`,"workspacePage.sessionEndedNotice":`This session has ended. Create a new session to continue.`,"workspacePage.renameFailed":`Rename failed`,"workspacePage.createSessionFailed":`Failed to create session`,"workspacePage.startFailed":`Start failed`,"workspacePage.stopFailed":`Stop failed`,"workspacePage.interrupt":`Interrupt`,"workspacePage.interrupted":`Agent interrupted — waiting for your next message`,"workspacePage.interruptFailed":`Interrupt failed`,"workspacePage.interruptTooltip":`Soft interrupt (like Escape) — stops the current tool but keeps the session alive`,"workspacePage.pendingNextRun":`Applied on next start`,"search.title":`Search`,"search.tooltip":`Search across agent history`,"search.placeholder":`Search across all agent messages…`,"search.includeArchived":`Include archived workspaces`,"search.loading":`Searching…`,"search.noResults":`No matches`,"search.error":`Search failed: {message}`,"search.resultCount":`{n} result(s)`,"search.eventType.userMessage":`You`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`No activity yet`,"activityFeed.emptyHint":`Start a workspace to see agent output here`,"activityFeed.initialPrompt":`Initial Prompt`,"activityFeed.you":`You`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Go to previous message`,"activityFeed.scrollToBottom":`Scroll to bottom`,"activityFeed.sendAnswers":`Send answers`,"agentBusy.banner":`Agent is busy`,"agentBusy.subagentsRunning":`1 sub-agent running | {n} sub-agents running`,"agentBusy.viewSubagents":`View sub-agents`,"agentBusy.pendingMessage":`Waiting — agent is busy`,"terminal.title":`Terminal`,"terminal.open":`Open terminal`,"terminal.close":`Close terminal`,"terminal.noWorkspace":`Select a workspace`,"terminal.noWorktree":`Worktree not created yet`,"terminal.error":`Terminal error`,"terminal.exited":`Terminal exited`,"chatInput.placeholder":`Message... (/ for skills)`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Attach image`,"chatInput.queueBanner":`Message queued — will be sent when the agent finishes`,"chatInput.cancelQueue":`Cancel Queue`,"chatInput.autoLoopBanner":`Auto-loop is running — stop it to send a message`,"chatInput.autoLoopStop":`Stop`,"koboCommand.checkProgressDesc":`Verify progress on tasks and acceptance criteria`,"chatInput.uploading":`Uploading...`,"createPage.title":`What would you like to work on?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion enabled`,"createPage.importNotion":`Import from Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`URL must start with https://www.notion.so/`,"createPage.notionAutoExtract":`Subtasks and acceptance criteria will be extracted automatically.`,"createPage.notionPanelChoiceLabel":`This URL points to a sub-page (?p=). Which one do you want to work on?`,"createPage.notionPanelOption":`Sub-page (panel)`,"createPage.notionPanelOptionDesc":`The page you were viewing — recommended`,"createPage.notionParentOption":`Parent page`,"createPage.notionParentOptionDesc":`The epic / database it belongs to`,"createPage.importSentry":`Import Sentry`,"createPage.sentryEnabled":`Sentry enabled`,"createPage.sentryPlaceholder":`https://your-org.sentry.io/issues/123456`,"createPage.sentryValidation":`URL must point to a Sentry issue (/issues/<id>)`,"createPage.sentryAutoExtract":`Sentry issue will be imported automatically`,"createPage.sentryExtractHint":`Kobo will extract the issue and write it to .ai/thoughts/`,"createPage.workspaceName":`Workspace name (defaults to Notion page title)`,"createPage.workspaceNamePlaceholder":`Workspace name...`,"createPage.instructions":`Additional instructions (optional)...`,"createPage.instructionsPlaceholder":`Describe the task...`,"createPage.manualHint":`No Notion ticket? Add your tasks and acceptance criteria manually — they'll be sent to the Claude agent as context.`,"createPage.tasks":`Tasks ({count})`,"createPage.addTask":`Add a task...`,"createPage.acceptanceCriteria":`Acceptance Criteria ({count})`,"createPage.addCriterion":`Add a criterion...`,"createPage.projectPath":`Enter the project path`,"createPage.branchType":`Branch type`,"createPage.branch":`Branch`,"createPage.noBranches":`No branches found`,"createPage.enterPath":`Enter a project path`,"createPage.create":`Create`,"createPage.skipSetupScript":`Skip setup script`,"createPage.attachWorktreeToggle":`Attach existing worktree`,"createPage.attachWorktreeEnabled":`Reusing existing worktree`,"createPage.worktreePickerLabel":`Existing worktree`,"createPage.noOrphanWorktrees":`No orphan worktrees in this project`,"createPage.pickWorktreeRequired":`Please pick a worktree to attach`,"createPage.notionExtractHint":`Subtasks and acceptance criteria will be extracted from the Notion page.`,"createPage.notionImportHint":`Click "Import from Notion" to automatically extract subtasks from a ticket.`,"createPage.errorCreating":`Error creating workspace.`,"createPage.validationNotionUrl":`Please paste a valid Notion URL (https://www.notion.so/...).`,"createPage.validationDescription":`Please describe the task.`,"createPage.validationName":`Please provide a workspace name.`,"createPage.validationPath":`Please enter the project path.`,"createPage.validationBranch":`Please select a branch.`,"settings.title":`Settings`,"settings.language":`Language`,"settings.global":`Global`,"settings.projects":`Projects`,"settings.globalSettings":`Global Settings`,"settings.defaultModel":`Default model`,"settings.agentPermissions":`Agent permissions`,"settings.skipPermissions":`Skip permission prompts (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Warning: disabling this will cause all tool permissions (Write, Edit, Bash...) to be auto-denied in headless mode. The agent will only be able to read.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Browser notifications when agent finishes`,"settings.audioNotifications":`Sound notification when agent finishes`,"settings.defaultPermissionMode":`Default permission mode`,"settings.defaultPermissionModeHint":`Permission mode applied when creating a new workspace. Plan = read-only brainstorming first, Auto-accept = full execution immediately.`,"settings.activityFeed":`Activity feed`,"settings.verboseMessages":`Show verbose system messages (task_progress, task_started)`,"settings.availableVariables":`Available variables in PR prompt template`,"settings.prPromptTemplate":`PR prompt template`,"settings.prPromptPlaceholder":`Instructions for the agent when creating GitHub PRs...`,"settings.prPromptHint":`Use the template variables listed above (double curly brace syntax).`,"settings.var.prNumber":`PR number (e.g., 42)`,"settings.var.prUrl":`Full URL of the created PR`,"settings.var.branchName":`Working branch name`,"settings.var.sourceBranch":`Source branch the PR targets`,"settings.var.workspaceName":`Workspace name`,"settings.var.projectName":`Last segment of the project path`,"settings.var.notionUrl":`Notion URL if set, empty otherwise`,"settings.var.commits":`Bulleted commit list between source and head`,"settings.var.diffStats":`Git shortstat summary (files, insertions, deletions)`,"settings.var.tasks":`Regular tasks as a checkbox list`,"settings.var.acceptanceCriteria":`Acceptance criteria as a checkbox list`,"settings.gitConventions":`Git conventions (global)`,"settings.gitConventionsPlaceholder":`# Git conventions...`,"settings.gitConventionsHint":`These conventions are written to .ai/.git-conventions.md in each new workspace and must be followed by the agent before any git operation. Overridden by per-project conventions if defined.`,"settings.setupScript":`Setup script`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Executed with bash in the worktree after creation, before the agent starts. No shebang needed. If it fails, the workspace is set to error. Timeout: 5 minutes.`,"settings.e2e.title":`E2E tests`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`None`,"settings.e2e.frameworkOther":`Other`,"settings.e2e.skill":`Skill (optional)`,"settings.e2e.skillPlaceholder":`e.g. cypress-tester`,"settings.e2e.prompt":`Custom guidance (optional)`,"settings.e2e.promptPlaceholder":`e.g. use page-object pattern, target data-testid attributes`,"settings.e2e.helpText":`When configured, the auto-loop grooming agent inserts E2E sub-tasks for user-visible features.`,"settings.finalization.title":`Auto-loop finalization`,"settings.finalization.helpText":`Optional: a prompt the agent runs as the very last auto-loop iteration. Typically used for final quality checks (lint, typecheck, tests). The grooming step will create a [FINAL]-prefixed task that uses this prompt.`,"settings.finalization.prompt":`Finalization prompt`,"settings.finalization.promptPlaceholder":`e.g. Run npm run lint and npm test, then mark this task done.`,"settings.editorCommand":`Editor command`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Command used to open the worktree in your editor. The worktree path is passed as argument.`,"settings.mcpSelection":`Claude MCP selection`,"settings.mcpAutoSelect":`Auto (first matching active MCP)`,"settings.notionMcp":`Notion MCP key`,"settings.sentryMcp":`Sentry MCP key`,"settings.mcpSelectionHint":`Active entries are read from ~/.claude.json. Leave Auto to use default matching behavior.`,"settings.configuredProjects":`Configured projects`,"settings.noProjects":`No projects configured`,"settings.addProject":`Add project`,"settings.newProject":`New project`,"settings.editProject":`Edit project`,"settings.projectPath":`Project path`,"settings.projectPathPlaceholder":`/path/to/project`,"settings.displayName":`Display name`,"settings.displayNamePlaceholder":`My project`,"settings.defaultSourceBranch":`Default source branch`,"settings.defaultModel.project":`Default model`,"settings.skipPermissions.project":`Skip permission prompts`,"settings.prPromptTemplate.project":`PR prompt template`,"settings.prPromptPlaceholder.project":`Project-specific instructions for PR creation...`,"settings.gitConventions.project":`Git conventions (project override)`,"settings.gitConventionsEmpty":`Leave empty to use the global conventions.`,"settings.notionStatus":`Notion ticket status`,"settings.notionStatusProperty":`Property name`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Value to set`,"settings.notionInProgressStatusPlaceholder":`In progress, En cours...`,"settings.notionStatusHint":`When a workspace is created with a Notion ticket, the specified property is set to this value. Both fields are required. Leave empty to disable.`,"settings.devServer":`Dev server`,"settings.devServerStart":`Script start`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script stop`,"settings.devServerStopPlaceholder":`Optional — the process will be killed automatically if empty`,"settings.selectProject":`Select a project or add a new one`,"settings.projectPathRequired":`Project path is required.`,"settings.useGlobal":`Use global`,"settings.saved":`Global settings saved.`,"settings.saveError":`Error saving settings.`,"settings.projectSaved":`Project saved.`,"settings.projectSaveError":`Error saving project.`,"settings.projectDeleted":`Project deleted.`,"settings.projectDeleteError":`Error deleting project.`,"templates.title":`Templates`,"templates.newTemplate":`New template`,"templates.editTemplate":`Edit template`,"templates.deleteTemplate":`Delete template`,"templates.deleteConfirm":`Delete template '/{slug}'?`,"templates.deleteConfirmMessage":`This cannot be undone.`,"templates.slug":`Slug`,"templates.slugHint":`Lowercase letters, digits, hyphens. Max 64 chars.`,"templates.slugInvalid":`Slug must contain only lowercase letters, digits, and hyphens`,"templates.slugDuplicate":`A template with this slug already exists`,"templates.description":`Description`,"templates.descriptionHint":`Short label shown in the dropdown.`,"templates.descriptionRequired":`Description is required`,"templates.contentRequired":`Content is required`,"templates.content":`Content`,"templates.contentHint":`Template content. Use {variable_name} for substitutions.`,"templates.availableVars":`Available variables`,"templates.filePath":`File: {path}`,"templates.empty":`No templates yet.`,"templates.createFailed":`Failed to create template`,"templates.updateFailed":`Failed to update template`,"templates.deleteFailed":`Failed to delete template`,"templates.save":`Save`,"templates.create":`Create`,"chatInput.dropdownSkills":`Claude skills`,"chatInput.dropdownKobo":`Kōbō commands`,"chatInput.dropdownTemplates":`Templates`,"documents.title":`Documents`,"documents.empty":`No documents found`,"documents.refresh":`Refresh`,"documents.back":`Back`,"documents.loadFailed":`Failed to load document`,"git.title":`Git`,"git.localOnly":`local only`,"git.pushed":`pushed`,"git.unpushed":`{count} unpushed`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Loading commits…`,"git.commits.empty":`No commits on this branch`,"git.commits.pushed":`Pushed`,"git.commits.unpushed":`Not pushed`,"git.commits.clickToAppend":`click to append SHA to chat`,"git.files":`{count} file | {count} files`,"git.staged":`{count} staged`,"git.modified":`{count} modified`,"git.untracked":`{count} untracked`,"git.viewPr":`View PR`,"git.createPr":`Create PR`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Safer than plain --force: the push is rejected if the remote has commits you haven’t seen. Use after rebasing or amending already-pushed commits.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No upstream set for this branch — push it first to enable pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push the branch first`,"git.pullConfirmTitle":`Pull branch?`,"git.pullConfirmMessage":`Pull {branch} from remote (fast-forward only).`,"git.branchPulled":`Branch pulled`,"git.pullFailed":`Pull failed`,"git.renameBranch":`Rename branch`,"git.renameBranchPrompt":"Rename `{branch}` to:","git.renameBranchSuccess":"Branch renamed to `{branch}`","git.renameBranchFailed":`Failed to rename branch`,"git.renameBranchExists":"Branch `{branch}` already exists locally or on origin","git.renameDisabledForExternal":`Renaming is disabled for attached external worktrees.`,"git.diff":`Diff`,"git.diffReview":`Diff Review`,"git.diffReviewTooltip":`Open the diff viewer in Review mode — inline comments + batch submit to the agent`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase branch?`,"git.rebaseConfirmMessage":`Rebase onto {branch}. This may cause conflicts.`,"git.rebaseSuccess":`Rebase completed`,"git.rebaseFailed":`Rebase failed`,"git.merge":`Merge`,"git.mergeConfirmTitle":`Merge branch?`,"git.mergeConfirmMessage":`Merge {branch} into this branch. This may cause conflicts.`,"git.mergeSuccess":`Merge completed`,"git.mergeFailed":`Merge failed`,"git.conflictTitleMerge":`Merge conflicts detected`,"git.conflictTitleRebase":`Rebase conflicts detected`,"git.conflictSubtitle":`{count} file(s) have conflicts. Choose how to continue.`,"git.conflictAbort":`Abort`,"git.conflictResolveWithAgent":`Ask agent to resolve`,"git.conflictAborted":`Operation aborted`,"git.conflictHandoffSuccess":`Agent is resolving the conflicts`,"git.pushConfirmTitle":`Push branch?`,"git.pushConfirmMessage":`Push {branch} to remote.`,"git.pushConfirmMessagePrefix":`Push branch`,"git.pushConfirmMessageSuffix":`to remote.`,"git.changePrBase":`Change PR base branch`,"git.changePrBaseTitle":`Change base branch`,"git.changePrBaseMessage":`Enter the new target branch for the pull request.`,"git.changePrBaseSuccess":`PR base branch updated`,"git.changePrBaseFailed":`Failed to change PR base branch`,"git.openEditor":`Open in editor`,"git.openEditorFailed":`Failed to open editor`,"git.branchPushed":`Branch pushed`,"git.pushFirst":`Branch is not on remote. Click Push first.`,"git.unpushedCommits":`Local commits are not pushed. Click Push first.`,"git.from":`from`,"git.prCreated":`PR #{n} created`,"devServer.title":`Dev Server`,"devServer.noWorkspace":`No workspace selected`,"devServer.notConfigured":`Not configured —`,"devServer.goToSettings":`Settings`,"devServer.logs":`Logs`,"devServer.running":`Running`,"devServer.starting":`Starting`,"devServer.stopping":`Stopping`,"devServer.error":`Error`,"devServer.stopped":`Stopped`,"devServer.unknown":`Unknown`,"devServer.containers":`{count} container | {count} containers`,"devServer.logDialog.title":`Logs Dev Server`,"devServer.logDialog.empty":`No logs available`,"notion.title":`Notion`,"tasks.title":`Tasks`,"notion.addTask":`Add task`,"notion.noUrl":`No Notion URL`,"notion.subtasks":`{done}/{total} subtasks`,"notion.noTasks":`No tasks`,"notion.newTask":`New task... (Enter to add, Esc to cancel)`,"acceptance.title":`Acceptance Criteria`,"acceptance.addCriterion":`Add criterion`,"acceptance.newCriterion":`New criterion... (Enter to add, Esc to cancel)`,"acceptance.empty":`No acceptance criteria`,"tasks.askProgress":`Ask agent to review progress`,"agentTodos.title":`Agent Todos`,"agentTodos.empty":`No agent todos`,"subagents.title":`Sub-agents`,"subagents.empty":`No sub-agent activity yet`,"subagents.tools":`{count} tools`,"subagents.running":`Running: `,"stats.title":`Statistics`,"stats.info":`Info`,"stats.status":`Status`,"stats.model":`Model`,"stats.branch":`Branch`,"stats.sessions":`Sessions`,"stats.duration":`Duration`,"stats.timeline":`Timeline`,"stats.created":`Created`,"stats.firstSession":`First session`,"stats.lastPrompt":`Last prompt`,"stats.lastResponse":`Last response`,"stats.updated":`Updated`,"stats.activity":`Activity`,"stats.agentMessages":`Agent messages`,"stats.userMessages":`User messages`,"stats.toolCalls":`Tool calls`,"stats.errors":`Errors`,"stats.usage":`Usage`,"stats.inputTokens":`Input tokens`,"stats.outputTokens":`Output tokens`,"stats.totalTokens":`Total tokens`,"stats.cost":`Cost`,"stats.usageLimits":`Usage limits`,"stats.used":`used`,"stats.resetsAt":`Resets {value}`,"stats.usageBucket":`Usage bucket {n}`,"quotaFooter.lastUpdated":`Last update: {time}`,"quotaFooter.empty":`Loading…`,"quotaFooter.popover.title":`Claude Code usage`,"quotaFooter.popover.refreshNow":`Refresh now`,"quotaFooter.popover.openStatsPanel":`Open Stats panel`,"quotaFooter.popover.resetsIn":`Resets at {value}`,"quotaFooter.popover.unauthenticated":`Auth required`,"quotaFooter.popover.unauthenticatedHint":`Run "claude" once to authenticate.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5-hour`,"quotaFooter.bucket.sevenDay":`7-day`,"agent.error.spawn_failed":`Failed to launch the agent`,"agent.error.parse_error":`Unable to parse an agent message`,"agent.error.rate_limit":`Rate limit hit`,"agent.error.resume_failed":`Session not found — starting fresh`,"agent.error.other":`Agent error`,"rateLimitType.fiveHour":`5h session`,"rateLimitType.sevenDay":`Weekly`,"stats.subagents":`Sub-agents`,"stats.completed":`Completed`,"stats.tokens":`Tokens`,"stats.progress":`Progress`,"stats.tasks":`Tasks`,"stats.acceptanceCriteria":`Acceptance criteria`,"tooltip.addTask":`Add task`,"tooltip.removeTask":`Remove task`,"tooltip.addCriterion":`Add criterion`,"tooltip.removeCriterion":`Remove criterion`,"tooltip.startDevServer":`Start dev server`,"tooltip.stopDevServer":`Stop dev server`,"tooltip.closeDiffViewer":`Close diff viewer`,"tooltip.refreshLogs":`Refresh logs`,"tooltip.closeDialog":`Close`,"tooltip.refreshGitStats":`Refresh Git stats`,"tooltip.removeImage":`Remove image`,"tooltip.sendMessage":`Send message`,"tooltip.refreshStats":`Refresh statistics`,"tools.title":`Tools`,"tools.runSetupScript":`Re-run setup script`,"tools.runSetupScriptTooltip":`Execute the project setup script in the worktree`,"tools.runSetupScriptConfirm":`Re-run the setup script in this workspace? Existing artifacts may be overwritten.`,"tools.runSetupScriptBusy":`Cannot re-run setup while the agent is working.`,"tools.noSetupScript":`No setup script configured —`,"tools.setupScriptSuccess":`Setup script completed successfully.`,"tools.setupScriptFailed":`Setup script failed.`,"tools.openNotion":`Open in Notion`,"tools.openSentry":`Open in Sentry`,"diff.title":`Diff`,"diff.side":`Side`,"diff.inline":`Inline`,"diff.hideUnchanged":`Hide unchanged code`,"diff.showUnchanged":`Show unchanged code`,"diff.showUntracked":`Show untracked files`,"diff.hideUntracked":`Hide untracked files`,"diff.rollbackToRemote":`Rollback to remote`,"diff.rollbackConfirm":`Reset {path} to its remote (origin) version? Local edits to this file will be lost.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`File reset to remote version`,"diff.rollbackDoneRemote":`File reset to remote version`,"diff.rollbackDoneHead":`Local edits discarded (file reset to last commit)`,"diff.rollbackDoneDeleted":`Untracked file deleted`,"diff.deleteUntracked":`Delete untracked file`,"diff.deleteUntrackedConfirm":`Permanently delete {path}? This file is not tracked — its content will be lost.`,"diff.deleteUntrackedConfirmOk":`Delete`,"diff.rollbackFailed":`Rollback failed`,"diff.modeInspect":`Inspect`,"diff.modeReview":`Review`,"diff.addComment":`Add comment`,"diff.replyComment":`Reply`,"diff.editComment":`Edit`,"diff.deleteComment":`Delete`,"diff.deleteCommentConfirm":`Delete this comment?`,"diff.commentPlaceholder":`Write a review comment… (Markdown supported)`,"diff.reviewDraft":`Review draft`,"diff.reviewEmpty":`No comments yet — hover a line in the diff and click + to add one.`,"diff.reviewGlobalPlaceholder":`Add an overall review message (optional)`,"diff.submitReview":`Submit review ({n})`,"diff.reviewSubmitted":`Review submitted to agent`,"diff.reviewSubmitFailed":`Failed to submit review: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Unpushed`,"diff.noChanges":`No changes`,"diff.selectFile":`Select a file to view diff`,"diff.addToChat":`Add to chat`,"notification.agentFinished":`{name} — Agent finished`,"notification.agentError":`{name} — Agent error`,"contextMenu.rename":`Rename`,"contextMenu.copyPath":`Copy worktree path`,"contextMenu.openEditor":`Open in editor`,"contextMenu.runSetup":`Run setup script`,"contextMenu.openNotion":`Open in Notion`,"contextMenu.openSentry":`Open in Sentry`,"workspace.favorite":`Mark as favorite`,"workspace.unfavorite":`Remove from favorites`,"workspace.showFavoritesOnly":`Show favorites only`,"tags.manage":`Manage tags`,"tags.manageTitle":`Manage workspace tags`,"tags.noTagsDefined":`No tags defined. Add some in Settings > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) are no longer in the global catalog. Uncheck to remove them.`,"settings.tagsTitle":`Workspace tags`,"settings.tagsHint":`Define the tags you can assign to workspaces. Type to add, click the cross to remove.`,"settings.tagsLabel":`Available tags`,"settings.shareTitle":`Share configuration`,"settings.shareHint":`Export your settings, templates and tags as a JSON bundle. MCP API keys are stripped from exports for security.`,"settings.exportConfig":`Export`,"settings.importConfig":`Import`,"settings.exportSuccess":`Configuration exported`,"settings.importSuccess":`Configuration imported`,"settings.importConfirmTitle":`Import configuration`,"settings.importConfirmMessage":`This will replace your current settings, templates and tags. Your MCP keys are preserved. Continue?`,"health.title":`Health`,"health.tooltip":`System health`,"health.envTitle":`Environment`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Database`,"health.dbPath":`Path`,"health.dbSize":`Size`,"health.schemaVersion":`Schema version`,"health.cliTitle":`Claude CLI`,"health.cliMissing":`claude not found on PATH. Install Claude Code to spawn agents.`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} total, {archived} archived`,"health.worktreesMissing":`{count} worktree(s) missing on disk`,"health.sessionsTitle":`Agent sessions`,"health.sessionsOrphaned":`{n} orphaned running session(s)`,"health.integrationsTitle":`Integrations`,"health.integrationConfigured":`configured`,"health.integrationMissing":`not configured`,"session.started":`Session started`,"session.ended":`Session ended`,"session.compacted":`Context compacted`,"tool.running":`Running...`,"activity.raw_lines":`Raw output lines ({n})`,"activity.loading_older":`Loading older messages…`,"activity.prev_user_message":`Previous user message`,"activity.scroll_to_bottom":`Scroll to bottom`,"chat.systemPrompt":`System prompt`,"chat.agent":`Agent`,"chat.you":`You`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Last updated at {time}`,"chat.scrollToTurnTop":`Scroll to top of this message`,"migration.backing_up":`Backing up the database…`,"migration.running":`Migrating agent data — {processed}/{total}`,"migration.error":`Migration failed`,"migration.backup_location":`A backup was saved at {path}. Restart Kōbō to retry.`,"migration.retry":`Restart Kōbō to retry.`,"engine.select":`Engine`,"engine.model":`Model`,"engine.effort":`Reasoning effort`,"engine.permission":`Permission mode`,"createPage.permissionLockedByAutoLoop":`Auto-loop requires Auto-accept (MCP + edits). Toggle auto-loop off to choose Plan mode.`,"engine.permission.auto-accept":`Auto-accept`,"engine.permission.plan":`Plan (read-only)`,"wakeup.scheduledIn":`Next wakeup in {n}s`,"wakeup.scheduledAt":`Next wakeup at {time}`,"wakeup.firing":`Waking up...`,"wakeup.reason":`Reason: {reason}`,"wakeup.cancel":`Cancel this wakeup`,"wakeup.pendingIndicator":`Wakeup scheduled`,"workspaceList.prOpen":`Pull request open`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Start auto-loop`,"autoLoop.prepare":`Prepare for auto-loop`,"autoLoop.prepareBusy":`Wait for the agent to finish before preparing`,"autoLoop.forceReady":`I know what I'm doing — skip grooming`,"autoLoop.forceReadyConfirm":`Skip grooming and mark auto-loop ready? This may cause the loop to stall if tasks aren't atomic.`,"autoLoop.stop":`Stop auto-loop`,"autoLoop.notReady":`Run 'Prepare for auto-loop' first`,"autoLoop.noTasks":`Add tasks first`,"autoLoop.progress":`Auto-loop · {done}/{total} tasks`,"autoLoop.preparing":`Auto-loop · preparing`,"autoLoop.preparingTooltip":`Grooming in progress — the agent is creating / reviewing tasks. The loop will start running once it calls mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop running`,"autoLoop.startInMode":`Start in auto-loop mode`,"koboCommand.prepAutoloopDesc":`Prepare tasks for auto-loop mode (groom for atomicity)`,"staleSessionBanner.title":`Auto-loop running`,"staleSessionBanner.message":`You're viewing an older session — the agent is currently working in the latest one.`,"staleSessionBanner.switchToCurrent":`Switch to current`},rn={"common.save":`Guardar`,"common.cancel":`Cancelar`,"common.delete":`Eliminar`,"common.close":`Cerrar`,"common.loading":`Cargando...`,"common.search":`Buscar...`,"common.refresh":`Actualizar`,"common.start":`Iniciar`,"common.stop":`Detener`,"common.archive":`Archivar`,"common.unarchive":`Desarchivar`,"common.selectWorkspace":`Selecciona un workspace`,"common.noResults":`Sin resultados para "{query}"`,"common.send":`enviar`,"common.newLine":`nueva línea`,"common.history":`historial`,"common.justNow":`ahora mismo`,"common.minutesAgo":`hace {count}m`,"common.hoursAgo":`hace {count}h`,"common.daysAgo":`hace {count}d`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude elige el modelo óptimo`,"model.opus47ClassicDescription":`Último Opus, el más capaz`,"model.opus471mDescription":`Último Opus, contexto 1M`,"model.opusClassicDescription":`El más potente`,"model.opus1mDescription":`El más potente, contexto 1M`,"model.sonnetClassicDescription":`Equilibrado`,"model.sonnet1mDescription":`Equilibrado, contexto 1M`,"model.haikuDescription":`El más rápido`,"reasoning.auto":`auto`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Claude decide automáticamente`,"reasoning.lowDescription":`Más rápido, menos profundidad`,"reasoning.mediumDescription":`Equilibrado`,"reasoning.highDescription":`Más profundidad`,"reasoning.xhighDescription":`Profundidad extendida, tareas largas (Opus 4.7)`,"reasoning.maxDescription":`Profundidad máxima`,"permissionMode.autoAccept":`Aceptación automática`,"permissionMode.plan":`Plan`,"permissionProfile.strict":`Permisos estrictos`,"permissionProfile.strictTooltip":`Activado: Claude respeta las listas allow/deny de .claude/settings.json del proyecto (permite escrituras bajo .claude/** o .github/workflows/** si las has allow-listado). Contrapartida: Bash o MCP fuera de la lista solicitarán confirmación y pueden parar el auto-loop. Desactivado (defecto): Kōbō pasa --dangerously-skip-permissions — máximo permisivo pero el CLI deniega .claude/** y .github/workflows/** pase lo que pase. Se aplica en la próxima sesión.`,"workspaceList.title":`Workspaces`,"workspaceList.needsAttention":`Requiere atención`,"workspaceList.running":`En ejecución`,"workspaceList.idle":`Inactivo`,"workspaceList.archived":`Archivados`,"workspaceList.noWorkspaces":`Aún no hay workspaces`,"workspaceList.footer":`{count} workspace | {count} workspaces`,"workspaceList.footerRunning":`{count} en ejecución`,"workspaceList.deleteDialog.title":`¿Eliminar workspace?`,"workspaceList.deleteDialog.deleteLocal":`Eliminar rama local`,"workspaceList.deleteDialog.deleteRemote":`Eliminar rama remota`,"workspaceList.deleteDialog.warning":`Advertencia: esta acción es irreversible en el remoto.`,"workspacePage.selectWorkspace":`Selecciona un workspace para comenzar`,"workspacePage.session":`Sesión #{n}`,"workspacePage.newSession":`+ Nueva sesión`,"workspacePage.renameSession":`Renombrar`,"workspacePage.renameSessionTitle":`Renombrar sesión`,"workspacePage.sessionNameLabel":`Nombre de sesión`,"workspacePage.sessionEndedNotice":`Esta sesión ha terminado. Crea una nueva sesión para continuar.`,"workspacePage.renameFailed":`Error al renombrar`,"workspacePage.createSessionFailed":`Error al crear la sesión`,"workspacePage.startFailed":`Error al iniciar`,"workspacePage.stopFailed":`Error al detener`,"workspacePage.interrupt":`Interrumpir`,"workspacePage.interrupted":`Agente interrumpido — esperando tu próximo mensaje`,"workspacePage.interruptFailed":`Error al interrumpir`,"workspacePage.interruptTooltip":`Interrupción suave (como Escape) — detiene la herramienta actual pero mantiene la sesión activa`,"workspacePage.pendingNextRun":`Se aplicará en el próximo inicio`,"search.title":`Búsqueda`,"search.tooltip":`Buscar en el historial de agentes`,"search.placeholder":`Buscar en todos los mensajes de agentes…`,"search.includeArchived":`Incluir workspaces archivados`,"search.loading":`Buscando…`,"search.noResults":`Sin resultados`,"search.error":`Búsqueda fallida: {message}`,"search.resultCount":`{n} resultado(s)`,"search.eventType.userMessage":`Tú`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Aún no hay actividad`,"activityFeed.emptyHint":`Inicia un workspace para ver la salida del agente aquí`,"activityFeed.initialPrompt":`Prompt inicial`,"activityFeed.you":`Tú`,"activityFeed.agent":`Agente`,"activityFeed.question":`Pregunta`,"activityFeed.goToPrevious":`Ir al mensaje anterior`,"activityFeed.scrollToBottom":`Ir al final`,"activityFeed.sendAnswers":`Enviar respuestas`,"agentBusy.banner":`El agente está ocupado`,"agentBusy.subagentsRunning":`1 sub-agente en ejecución | {n} sub-agentes en ejecución`,"agentBusy.viewSubagents":`Ver sub-agentes`,"agentBusy.pendingMessage":`Esperando — el agente está ocupado`,"terminal.title":`Terminal`,"terminal.open":`Abrir terminal`,"terminal.close":`Cerrar terminal`,"terminal.noWorkspace":`Seleccione un espacio de trabajo`,"terminal.noWorktree":`Worktree aún no creado`,"terminal.error":`Error del terminal`,"terminal.exited":`Terminal cerrado`,"chatInput.placeholder":`Mensaje... (/ para skills)`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Adjuntar imagen`,"chatInput.queueBanner":`Mensaje en cola — se enviará cuando el agente termine`,"chatInput.cancelQueue":`Cancelar cola`,"chatInput.autoLoopBanner":`Auto-loop activo — deténlo para enviar un mensaje`,"chatInput.autoLoopStop":`Detener`,"koboCommand.checkProgressDesc":`Verificar el progreso de las tareas y criterios de aceptación`,"chatInput.uploading":`Subiendo...`,"createPage.title":`¿En qué te gustaría trabajar?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion activado`,"createPage.importNotion":`Importar desde Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`La URL debe empezar por https://www.notion.so/`,"createPage.notionAutoExtract":`Las subtareas y criterios de aceptación se extraerán automáticamente.`,"createPage.notionPanelChoiceLabel":`Esta URL apunta a una subpágina (?p=). ¿Sobre cuál quieres trabajar?`,"createPage.notionPanelOption":`Subpágina (panel)`,"createPage.notionPanelOptionDesc":`La página que estabas viendo — recomendado`,"createPage.notionParentOption":`Página principal`,"createPage.notionParentOptionDesc":`La épica / base de datos a la que pertenece`,"createPage.importSentry":`Importar Sentry`,"createPage.sentryEnabled":`Sentry activado`,"createPage.sentryPlaceholder":`https://tu-org.sentry.io/issues/123456`,"createPage.sentryValidation":`La URL debe apuntar a una issue de Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`La issue de Sentry se importará automáticamente`,"createPage.sentryExtractHint":`Kobo extraerá la issue y la escribirá en .ai/thoughts/`,"createPage.workspaceName":`Nombre del workspace (por defecto el título de la página Notion)`,"createPage.workspaceNamePlaceholder":`Nombre del workspace...`,"createPage.instructions":`Instrucciones adicionales (opcional)...`,"createPage.instructionsPlaceholder":`Describe la tarea...`,"createPage.manualHint":`¿Sin ticket Notion? Añade tus tareas y criterios de aceptación manualmente — se enviarán al agente Claude como contexto.`,"createPage.tasks":`Tareas ({count})`,"createPage.addTask":`Añadir una tarea...`,"createPage.acceptanceCriteria":`Criterios de aceptación ({count})`,"createPage.addCriterion":`Añadir un criterio...`,"createPage.projectPath":`Introduce la ruta del proyecto`,"createPage.branchType":`Tipo de rama`,"createPage.branch":`Rama`,"createPage.noBranches":`No se encontraron ramas`,"createPage.enterPath":`Introduce la ruta del proyecto`,"createPage.create":`Crear`,"createPage.skipSetupScript":`Omitir script de setup`,"createPage.attachWorktreeToggle":`Adjuntar worktree existente`,"createPage.attachWorktreeEnabled":`Reutilizando worktree existente`,"createPage.worktreePickerLabel":`Worktree existente`,"createPage.noOrphanWorktrees":`No hay worktrees huérfanos en este proyecto`,"createPage.pickWorktreeRequired":`Selecciona un worktree para adjuntar`,"createPage.notionExtractHint":`Las subtareas y criterios de aceptación se extraerán de la página Notion.`,"createPage.notionImportHint":`Haz clic en "Importar desde Notion" para extraer automáticamente las subtareas de un ticket.`,"createPage.errorCreating":`Error al crear el workspace.`,"createPage.validationNotionUrl":`Introduce una URL de Notion válida (https://www.notion.so/...).`,"createPage.validationDescription":`Describe la tarea.`,"createPage.validationName":`Indica un nombre para el workspace.`,"createPage.validationPath":`Introduce la ruta del proyecto.`,"createPage.validationBranch":`Selecciona una rama.`,"settings.title":`Ajustes`,"settings.language":`Idioma`,"settings.global":`Global`,"settings.projects":`Proyectos`,"settings.globalSettings":`Ajustes globales`,"settings.defaultModel":`Modelo por defecto`,"settings.agentPermissions":`Permisos del agente`,"settings.skipPermissions":`Omitir solicitudes de permisos (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Advertencia: desactivar esto hará que todos los permisos de herramientas (Write, Edit, Bash...) se denieguen automáticamente en modo headless. El agente solo podrá leer.`,"settings.notifications":`Notificaciones`,"settings.browserNotifications":`Notificación del navegador cuando el agente termina`,"settings.audioNotifications":`Notificación sonora cuando el agente termina`,"settings.defaultPermissionMode":`Modo de permisos por defecto`,"settings.defaultPermissionModeHint":`Modo aplicado al crear un workspace. Plan = brainstorming de solo lectura primero, Auto-accept = ejecución completa inmediatamente.`,"settings.activityFeed":`Feed de actividad`,"settings.verboseMessages":`Mostrar mensajes detallados del sistema (task_progress, task_started)`,"settings.availableVariables":`Variables disponibles en la plantilla de prompt PR`,"settings.prPromptTemplate":`Plantilla de prompt PR`,"settings.prPromptPlaceholder":`Instrucciones para el agente al crear PRs en GitHub...`,"settings.prPromptHint":`Usa las variables listadas arriba (sintaxis de dobles llaves).`,"settings.var.prNumber":`Número de PR (ej: 42)`,"settings.var.prUrl":`URL completa de la PR creada`,"settings.var.branchName":`Nombre de la rama de trabajo`,"settings.var.sourceBranch":`Rama fuente a la que apunta la PR`,"settings.var.workspaceName":`Nombre del workspace`,"settings.var.projectName":`Último segmento de la ruta del proyecto`,"settings.var.notionUrl":`URL de Notion si está definida, vacía en caso contrario`,"settings.var.commits":`Lista de commits entre source y head`,"settings.var.diffStats":`Resumen shortstat de Git (archivos, inserciones, eliminaciones)`,"settings.var.tasks":`Tareas regulares como lista de verificación`,"settings.var.acceptanceCriteria":`Criterios de aceptación como lista de verificación`,"settings.gitConventions":`Convenciones Git (global)`,"settings.gitConventionsPlaceholder":`# Convenciones Git...`,"settings.gitConventionsHint":`Estas convenciones se escriben en .ai/.git-conventions.md en cada nuevo workspace y deben ser seguidas por el agente antes de cualquier operación Git. Se anulan con convenciones por proyecto si están definidas.`,"settings.setupScript":`Script de setup`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Se ejecuta con bash en el worktree después de su creación, antes de que el agente inicie. No necesita shebang. Si falla, el workspace se establece en error. Timeout: 5 minutos.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Ninguno`,"settings.e2e.frameworkOther":`Otro`,"settings.e2e.skill":`Skill (opcional)`,"settings.e2e.skillPlaceholder":`p. ej. cypress-tester`,"settings.e2e.prompt":`Guía personalizada (opcional)`,"settings.e2e.promptPlaceholder":`p. ej. usar el patrón page-object, apuntar a data-testid`,"settings.e2e.helpText":`Cuando está configurado, el agente de grooming auto-loop inserta subtareas E2E para funciones UI.`,"settings.finalization.title":`Finalización del auto-loop`,"settings.finalization.helpText":`Opcional: un prompt que el agente ejecuta como la última iteración del auto-loop. Típicamente usado para controles de calidad finales (lint, typecheck, tests). La fase de grooming creará una tarea con prefijo [FINAL] que usará este prompt.`,"settings.finalization.prompt":`Prompt de finalización`,"settings.finalization.promptPlaceholder":`p. ej. Ejecuta npm run lint y npm test, luego marca esta tarea como hecha.`,"settings.editorCommand":`Comando del editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando para abrir el worktree en su editor. La ruta del worktree se pasa como argumento.`,"settings.mcpSelection":`Selección MCP de Claude`,"settings.mcpAutoSelect":`Auto (primer MCP activo que coincide)`,"settings.notionMcp":`Clave MCP de Notion`,"settings.sentryMcp":`Clave MCP de Sentry`,"settings.mcpSelectionHint":`Las entradas activas se leen desde ~/.claude.json. Deja Auto para usar el comportamiento por defecto.`,"settings.configuredProjects":`Proyectos configurados`,"settings.noProjects":`No hay proyectos configurados`,"settings.addProject":`Añadir proyecto`,"settings.newProject":`Nuevo proyecto`,"settings.editProject":`Editar proyecto`,"settings.projectPath":`Ruta del proyecto`,"settings.projectPathPlaceholder":`/ruta/al/proyecto`,"settings.displayName":`Nombre para mostrar`,"settings.displayNamePlaceholder":`Mi proyecto`,"settings.defaultSourceBranch":`Rama fuente por defecto`,"settings.defaultModel.project":`Modelo por defecto`,"settings.skipPermissions.project":`Omitir solicitudes de permisos`,"settings.prPromptTemplate.project":`Plantilla de prompt PR`,"settings.prPromptPlaceholder.project":`Instrucciones específicas del proyecto para la creación de PRs...`,"settings.gitConventions.project":`Convenciones Git (por proyecto)`,"settings.gitConventionsEmpty":`Dejar vacío para usar las convenciones globales.`,"settings.notionStatus":`Estado ticket Notion`,"settings.notionStatusProperty":`Nombre de la propiedad`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valor a establecer`,"settings.notionInProgressStatusPlaceholder":`En progreso, In progress...`,"settings.notionStatusHint":`Cuando se crea un workspace con un ticket Notion, la propiedad especificada se establece a este valor. Ambos campos son obligatorios. Dejar vacío para desactivar.`,"settings.devServer":`Servidor de desarrollo`,"settings.devServerStart":`Script de inicio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script de parada`,"settings.devServerStopPlaceholder":`Opcional — el proceso se cerrará automáticamente si está vacío`,"settings.selectProject":`Selecciona un proyecto o añade uno nuevo`,"settings.projectPathRequired":`La ruta del proyecto es obligatoria.`,"settings.useGlobal":`Usar global`,"settings.saved":`Ajustes globales guardados.`,"settings.saveError":`Error al guardar los ajustes.`,"settings.projectSaved":`Proyecto guardado.`,"settings.projectSaveError":`Error al guardar el proyecto.`,"settings.projectDeleted":`Proyecto eliminado.`,"settings.projectDeleteError":`Error al eliminar el proyecto.`,"templates.title":`Plantillas`,"templates.newTemplate":`Nueva plantilla`,"templates.editTemplate":`Editar plantilla`,"templates.deleteTemplate":`Eliminar plantilla`,"templates.deleteConfirm":`¿Eliminar la plantilla '/{slug}'?`,"templates.deleteConfirmMessage":`Esta acción no se puede deshacer.`,"templates.slug":`Slug`,"templates.slugHint":`Minúsculas, dígitos, guiones. Máx. 64 caracteres.`,"templates.slugInvalid":`El slug solo puede contener minúsculas, dígitos y guiones`,"templates.slugDuplicate":`Ya existe una plantilla con este slug`,"templates.description":`Descripción`,"templates.descriptionHint":`Etiqueta corta mostrada en el dropdown.`,"templates.descriptionRequired":`La descripción es obligatoria`,"templates.contentRequired":`El contenido es obligatorio`,"templates.content":`Contenido`,"templates.contentHint":`Contenido de la plantilla. Usa {variable_name} para las sustituciones.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Archivo: {path}`,"templates.empty":`Aún no hay plantillas.`,"templates.createFailed":`Error al crear la plantilla`,"templates.updateFailed":`Error al actualizar la plantilla`,"templates.deleteFailed":`Error al eliminar la plantilla`,"templates.save":`Guardar`,"templates.create":`Crear`,"chatInput.dropdownSkills":`Skills de Claude`,"chatInput.dropdownKobo":`Comandos Kōbō`,"chatInput.dropdownTemplates":`Plantillas`,"documents.title":`Documentos`,"documents.empty":`No se encontraron documentos`,"documents.refresh":`Actualizar`,"documents.back":`Volver`,"documents.loadFailed":`Error al cargar el documento`,"git.title":`Git`,"git.localOnly":`solo local`,"git.pushed":`pushed`,"git.unpushed":`{count} sin push`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Cargando commits…`,"git.commits.empty":`Sin commits en esta rama`,"git.commits.pushed":`Pusheado`,"git.commits.unpushed":`Sin pushear`,"git.commits.clickToAppend":`click para agregar SHA al chat`,"git.files":`{count} archivo | {count} archivos`,"git.staged":`{count} staged`,"git.modified":`{count} modificados`,"git.untracked":`{count} sin seguimiento`,"git.viewPr":`Ver PR`,"git.createPr":`Crear PR`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Más seguro que --force: el push se rechaza si el remoto tiene commits que no has visto. Úsalo tras un rebase o amend de commits ya pusheados.`,"git.branchForcePushed":`Rama force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No hay upstream para esta rama — hazle push primero para habilitar Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la rama primero`,"git.pullConfirmTitle":`¿Pull la rama?`,"git.pullConfirmMessage":`Pull {branch} desde el remoto (solo fast-forward).`,"git.branchPulled":`Rama actualizada`,"git.pullFailed":`Error al hacer pull`,"git.renameBranch":`Renombrar rama`,"git.renameBranchPrompt":"Renombrar `{branch}` a:","git.renameBranchSuccess":"Rama renombrada a `{branch}`","git.renameBranchFailed":`Error al renombrar la rama`,"git.renameBranchExists":"La rama `{branch}` ya existe localmente o en origin","git.renameDisabledForExternal":`El renombrado está desactivado para worktrees externos.`,"git.diff":`Diff`,"git.diffReview":`Diff Review`,"git.diffReviewTooltip":`Abre el visor de diff en modo Review — comentarios en línea + envío por lotes al agente`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`¿Rebase de la rama?`,"git.rebaseConfirmMessage":`Rebase sobre {branch}. Pueden surgir conflictos.`,"git.rebaseSuccess":`Rebase completado`,"git.rebaseFailed":`Rebase fallido`,"git.merge":`Merge`,"git.mergeConfirmTitle":`¿Fusionar la rama?`,"git.mergeConfirmMessage":`Fusionar {branch} en esta rama. Puede haber conflictos.`,"git.mergeSuccess":`Merge completado`,"git.mergeFailed":`Merge fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbort":`Abortar`,"git.conflictResolveWithAgent":`Pedir al agente que resuelva`,"git.conflictAborted":`Operación abortada`,"git.conflictHandoffSuccess":`El agente está resolviendo los conflictos`,"git.pushConfirmTitle":`¿Pushar la rama?`,"git.pushConfirmMessage":`Pushar {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Pushar la rama`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBase":`Cambiar rama base de la PR`,"git.changePrBaseTitle":`Cambiar rama base`,"git.changePrBaseMessage":`Ingrese la nueva rama destino para el pull request.`,"git.changePrBaseSuccess":`Rama base de la PR actualizada`,"git.changePrBaseFailed":`No se pudo cambiar la rama base de la PR`,"git.openEditor":`Abrir en editor`,"git.openEditorFailed":`No se pudo abrir el editor`,"git.branchPushed":`Rama enviada`,"git.pushFirst":`La rama no está en el remoto. Haz Push primero.`,"git.unpushedCommits":`Los commits locales no están enviados. Haz Push primero.`,"git.from":`desde`,"git.prCreated":`PR #{n} creada`,"devServer.title":`Servidor de desarrollo`,"devServer.noWorkspace":`Ningún workspace seleccionado`,"devServer.notConfigured":`No configurado —`,"devServer.goToSettings":`Ajustes`,"devServer.logs":`Logs`,"devServer.running":`En ejecución`,"devServer.starting":`Iniciando`,"devServer.stopping":`Deteniendo`,"devServer.error":`Error`,"devServer.stopped":`Detenido`,"devServer.unknown":`Desconocido`,"devServer.containers":`{count} contenedor | {count} contenedores`,"devServer.logDialog.title":`Logs del servidor de desarrollo`,"devServer.logDialog.empty":`No hay logs disponibles`,"notion.title":`Notion`,"tasks.title":`Tareas`,"notion.addTask":`Añadir tarea`,"notion.noUrl":`Sin URL de Notion`,"notion.subtasks":`{done}/{total} subtareas`,"notion.noTasks":`Sin tareas`,"notion.newTask":`Nueva tarea... (Enter para añadir, Esc para cancelar)`,"acceptance.title":`Criterios de aceptación`,"acceptance.addCriterion":`Añadir criterio`,"acceptance.newCriterion":`Nuevo criterio... (Enter para añadir, Esc para cancelar)`,"acceptance.empty":`Sin criterios de aceptación`,"tasks.askProgress":`Pedir al agente que revise el progreso`,"agentTodos.title":`Tareas del agente`,"agentTodos.empty":`Sin tareas del agente`,"subagents.title":`Sub-agentes`,"subagents.empty":`Aún no hay actividad de sub-agentes`,"subagents.tools":`{count} herramientas`,"subagents.running":`En ejecución: `,"stats.title":`Estadísticas`,"stats.info":`Info`,"stats.status":`Estado`,"stats.model":`Modelo`,"stats.branch":`Rama`,"stats.sessions":`Sesiones`,"stats.duration":`Duración`,"stats.timeline":`Cronología`,"stats.created":`Creado`,"stats.firstSession":`Primera sesión`,"stats.lastPrompt":`Último prompt`,"stats.lastResponse":`Última respuesta`,"stats.updated":`Actualizado`,"stats.activity":`Actividad`,"stats.agentMessages":`Mensajes del agente`,"stats.userMessages":`Mensajes del usuario`,"stats.toolCalls":`Llamadas a herramientas`,"stats.errors":`Errores`,"stats.usage":`Consumo`,"stats.inputTokens":`Tokens de entrada`,"stats.outputTokens":`Tokens de salida`,"stats.totalTokens":`Tokens totales`,"stats.cost":`Coste`,"stats.usageLimits":`Límites de uso`,"stats.used":`usado`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket de uso {n}`,"quotaFooter.lastUpdated":`Última actualización: {time}`,"quotaFooter.empty":`Cargando…`,"quotaFooter.popover.title":`Uso de Claude Code`,"quotaFooter.popover.refreshNow":`Actualizar`,"quotaFooter.popover.openStatsPanel":`Abrir panel Stats`,"quotaFooter.popover.resetsIn":`Se reinicia a las {value}`,"quotaFooter.popover.unauthenticated":`Auth requerida`,"quotaFooter.popover.unauthenticatedHint":`Ejecuta "claude" una vez para autenticarte.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5 horas`,"quotaFooter.bucket.sevenDay":`7 días`,"agent.error.spawn_failed":`No se pudo iniciar el agente`,"agent.error.parse_error":`No se pudo analizar un mensaje del agente`,"agent.error.rate_limit":`Límite de tasa alcanzado`,"agent.error.resume_failed":`Sesión no encontrada — iniciando sesión nueva`,"agent.error.other":`Error del agente`,"rateLimitType.fiveHour":`Sesión 5h`,"rateLimitType.sevenDay":`Semanal`,"stats.subagents":`Sub-agentes`,"stats.completed":`Completados`,"stats.tokens":`Tokens`,"stats.progress":`Progreso`,"stats.tasks":`Tareas`,"stats.acceptanceCriteria":`Criterios de aceptación`,"tooltip.addTask":`Añadir tarea`,"tooltip.removeTask":`Eliminar tarea`,"tooltip.addCriterion":`Añadir criterio`,"tooltip.removeCriterion":`Eliminar criterio`,"tooltip.startDevServer":`Iniciar servidor de desarrollo`,"tooltip.stopDevServer":`Detener servidor de desarrollo`,"tooltip.closeDiffViewer":`Cerrar visor de diff`,"tooltip.refreshLogs":`Actualizar logs`,"tooltip.closeDialog":`Cerrar`,"tooltip.refreshGitStats":`Actualizar estadísticas Git`,"tooltip.removeImage":`Eliminar imagen`,"tooltip.sendMessage":`Enviar mensaje`,"tooltip.refreshStats":`Actualizar estadísticas`,"tools.title":`Herramientas`,"tools.runSetupScript":`Volver a ejecutar script de setup`,"tools.runSetupScriptTooltip":`Ejecutar el script de setup del proyecto en el worktree`,"tools.runSetupScriptConfirm":`¿Volver a ejecutar el script de setup en este workspace? Los artefactos existentes pueden ser sobrescritos.`,"tools.runSetupScriptBusy":`No se puede volver a ejecutar el setup mientras el agente está trabajando.`,"tools.noSetupScript":`Ningún script de setup configurado —`,"tools.setupScriptSuccess":`Script de setup completado con éxito.`,"tools.setupScriptFailed":`Falló el script de setup.`,"tools.openNotion":`Abrir en Notion`,"tools.openSentry":`Abrir en Sentry`,"diff.title":`Diff`,"diff.side":`Lado a lado`,"diff.inline":`En línea`,"diff.hideUnchanged":`Ocultar código sin cambios`,"diff.showUnchanged":`Mostrar código sin cambios`,"diff.showUntracked":`Mostrar archivos no rastreados`,"diff.hideUntracked":`Ocultar archivos no rastreados`,"diff.rollbackToRemote":`Restaurar a la versión remota`,"diff.rollbackConfirm":`¿Restaurar {path} a su versión remota (origin)? Los cambios locales en este archivo se perderán.`,"diff.rollbackConfirmOk":`Restaurar`,"diff.rollbackDone":`Archivo restaurado a la versión remota`,"diff.rollbackDoneRemote":`Archivo restaurado a la versión remota`,"diff.rollbackDoneHead":`Cambios locales descartados (archivo restaurado al último commit)`,"diff.rollbackDoneDeleted":`Archivo no rastreado eliminado`,"diff.deleteUntracked":`Eliminar archivo no rastreado`,"diff.deleteUntrackedConfirm":`¿Eliminar definitivamente {path}? Este archivo no está rastreado por git — su contenido se perderá.`,"diff.deleteUntrackedConfirmOk":`Eliminar`,"diff.rollbackFailed":`Falló el rollback`,"diff.modeInspect":`Inspect`,"diff.modeReview":`Review`,"diff.addComment":`Añadir comentario`,"diff.replyComment":`Responder`,"diff.editComment":`Editar`,"diff.deleteComment":`Eliminar`,"diff.deleteCommentConfirm":`¿Eliminar este comentario?`,"diff.commentPlaceholder":`Escribe un comentario de revisión… (Markdown soportado)`,"diff.reviewDraft":`Borrador de revisión`,"diff.reviewEmpty":`Aún no hay comentarios — pasa el cursor sobre una línea del diff y haz clic en + para añadir uno.`,"diff.reviewGlobalPlaceholder":`Mensaje general de revisión (opcional)`,"diff.submitReview":`Enviar revisión ({n})`,"diff.reviewSubmitted":`Revisión enviada al agente`,"diff.reviewSubmitFailed":`No se pudo enviar la revisión: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Sin pushear`,"diff.noChanges":`Sin cambios`,"diff.selectFile":`Selecciona un archivo para ver el diff`,"diff.addToChat":`Añadir al chat`,"notification.agentFinished":`{name} — Agente terminado`,"notification.agentError":`{name} — Error del agente`,"contextMenu.rename":`Renombrar`,"contextMenu.copyPath":`Copiar ruta del worktree`,"contextMenu.openEditor":`Abrir en editor`,"contextMenu.runSetup":`Ejecutar script de setup`,"contextMenu.openNotion":`Abrir en Notion`,"contextMenu.openSentry":`Abrir en Sentry`,"workspace.favorite":`Marcar como favorito`,"workspace.unfavorite":`Quitar de favoritos`,"workspace.showFavoritesOnly":`Mostrar solo favoritos`,"tags.manage":`Gestionar etiquetas`,"tags.manageTitle":`Gestionar etiquetas del workspace`,"tags.noTagsDefined":`Sin etiquetas. Añádelas en Ajustes > Global > Etiquetas.`,"tags.orphanedHint":`{count} etiqueta(s) ya no están en el catálogo global. Desmárcalas para quitarlas.`,"settings.tagsTitle":`Etiquetas de workspace`,"settings.tagsHint":`Define las etiquetas asignables a los workspaces. Escribe para añadir, clic en la cruz para quitar.`,"settings.tagsLabel":`Etiquetas disponibles`,"settings.shareTitle":`Compartir configuración`,"settings.shareHint":`Exporta tus ajustes, plantillas y etiquetas en un bundle JSON. Las claves MCP no se incluyen por seguridad.`,"settings.exportConfig":`Exportar`,"settings.importConfig":`Importar`,"settings.exportSuccess":`Configuración exportada`,"settings.importSuccess":`Configuración importada`,"settings.importConfirmTitle":`Importar configuración`,"settings.importConfirmMessage":`Esto reemplazará tus ajustes, plantillas y etiquetas actuales. Las claves MCP se conservan. ¿Continuar?`,"health.title":`Salud`,"health.tooltip":`Estado del sistema`,"health.envTitle":`Entorno`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de datos`,"health.dbPath":`Ruta`,"health.dbSize":`Tamaño`,"health.schemaVersion":`Versión del esquema`,"health.cliTitle":`Claude CLI`,"health.cliMissing":`claude no encontrado en PATH. Instala Claude Code para iniciar agentes.`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} en total, {archived} archivados`,"health.worktreesMissing":`{count} worktree(s) faltan en el disco`,"health.sessionsTitle":`Sesiones de agente`,"health.sessionsOrphaned":`{n} sesión/sesiones huérfana(s) en ejecución`,"health.integrationsTitle":`Integraciones`,"health.integrationConfigured":`configurada`,"health.integrationMissing":`sin configurar`,"session.started":`Sesión iniciada`,"session.ended":`Sesión finalizada`,"session.compacted":`Contexto compactado`,"tool.running":`Ejecutando...`,"activity.raw_lines":`Líneas de salida brutas ({n})`,"activity.loading_older":`Cargando mensajes anteriores…`,"activity.prev_user_message":`Mensaje anterior del usuario`,"activity.scroll_to_bottom":`Desplazar al final`,"chat.systemPrompt":`Prompt del sistema`,"chat.agent":`Agente`,"chat.you":`Tú`,"chat.session":`Sesión`,"chat.nActions":`{n} acción | {n} acciones`,"chat.lastUpdatedAt":`Última actualización a las {time}`,"chat.scrollToTurnTop":`Desplazar al inicio del mensaje`,"migration.backing_up":`Haciendo copia de seguridad de la base de datos…`,"migration.running":`Migrando datos del agente — {processed}/{total}`,"migration.error":`La migración falló`,"migration.backup_location":`Se guardó una copia de seguridad en {path}. Reinicia Kōbō para reintentar.`,"migration.retry":`Reinicia Kōbō para reintentar.`,"engine.select":`Motor`,"engine.model":`Modelo`,"engine.effort":`Esfuerzo de razonamiento`,"engine.permission":`Modo de permisos`,"createPage.permissionLockedByAutoLoop":`El auto-loop requiere Auto-accept (MCP + ediciones). Desactiva el auto-loop para elegir el modo Plan.`,"engine.permission.auto-accept":`Aceptar automáticamente`,"engine.permission.plan":`Plan (solo lectura)`,"wakeup.scheduledIn":`Próximo despertar en {n}s`,"wakeup.scheduledAt":`Próximo despertar a las {time}`,"wakeup.firing":`Despertando...`,"wakeup.reason":`Razón: {reason}`,"wakeup.cancel":`Cancelar este despertar`,"wakeup.pendingIndicator":`Despertar programado`,"workspaceList.prOpen":`Pull request abierta`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Iniciar auto-loop`,"autoLoop.prepare":`Preparar para auto-loop`,"autoLoop.prepareBusy":`Espera a que el agente termine antes de preparar`,"autoLoop.forceReady":`Sé lo que hago — omitir preparación`,"autoLoop.forceReadyConfirm":`¿Omitir la preparación y marcar auto-loop listo? El loop puede quedarse bloqueado si las tareas no son atómicas.`,"autoLoop.stop":`Detener auto-loop`,"autoLoop.notReady":`Ejecute primero 'Preparar para auto-loop'`,"autoLoop.noTasks":`Añada tareas primero`,"autoLoop.progress":`Auto-loop · {done}/{total} tareas`,"autoLoop.preparing":`Auto-loop · preparando`,"autoLoop.preparingTooltip":`Preparación en curso — el agente está creando / revisando tareas. El bucle arrancará cuando llame a mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en ejecución`,"autoLoop.startInMode":`Iniciar en modo auto-loop`,"koboCommand.prepAutoloopDesc":`Preparar tareas para modo auto-loop (atomicidad)`,"staleSessionBanner.title":`Auto-loop en curso`,"staleSessionBanner.message":`Estás viendo una sesión anterior — el agente está trabajando en la más reciente.`,"staleSessionBanner.switchToCurrent":`Cambiar a la actual`},an={"common.save":`Enregistrer`,"common.cancel":`Annuler`,"common.delete":`Supprimer`,"common.close":`Fermer`,"common.loading":`Chargement...`,"common.search":`Rechercher...`,"common.refresh":`Actualiser`,"common.start":`Démarrer`,"common.stop":`Arrêter`,"common.archive":`Archiver`,"common.unarchive":`Désarchiver`,"common.selectWorkspace":`Sélectionnez un espace de travail`,"common.noResults":`Aucun résultat pour « {query} »`,"common.send":`envoyer`,"common.newLine":`nouvelle ligne`,"common.history":`historique`,"common.justNow":`a l'instant`,"common.minutesAgo":`il y a {count}m`,"common.hoursAgo":`il y a {count}h`,"common.daysAgo":`il y a {count}j`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude choisit le modèle optimal`,"model.opus47ClassicDescription":`Dernier Opus, le plus capable`,"model.opus471mDescription":`Dernier Opus, contexte 1M`,"model.opusClassicDescription":`Le plus puissant`,"model.opus1mDescription":`Le plus puissant, contexte 1M`,"model.sonnetClassicDescription":`Équilibré`,"model.sonnet1mDescription":`Équilibré, contexte 1M`,"model.haikuDescription":`Le plus rapide`,"reasoning.auto":`auto`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Claude décide automatiquement`,"reasoning.lowDescription":`Plus rapide, moins profond`,"reasoning.mediumDescription":`Équilibré`,"reasoning.highDescription":`Plus de profondeur`,"reasoning.xhighDescription":`Profondeur étendue, tâches longues (Opus 4.7)`,"reasoning.maxDescription":`Profondeur maximale`,"permissionMode.autoAccept":`Auto-accept`,"permissionMode.plan":`Plan`,"permissionProfile.strict":`Permissions strictes`,"permissionProfile.strictTooltip":`Quand activé, Claude respecte les listes allow/deny du .claude/settings.json du projet (autorise les écritures sous .claude/** ou .github/workflows/** si tu les as allow-listées). Contrepartie : Bash ou MCP hors allow provoquent un prompt et peuvent stopper l'auto-loop. Désactivé (défaut) : Kōbō passe --dangerously-skip-permissions — max permissif mais le CLI hard-deny .claude/** et .github/workflows/** quelle que soit ta allow-list. Prend effet à la prochaine session.`,"workspaceList.title":`Espaces de travail`,"workspaceList.needsAttention":`Attention requise`,"workspaceList.running":`En cours`,"workspaceList.idle":`Inactif`,"workspaceList.archived":`Archivés`,"workspaceList.noWorkspaces":`Aucun espace de travail`,"workspaceList.footer":`{count} espace de travail | {count} espaces de travail`,"workspaceList.footerRunning":`{count} en cours`,"workspaceList.deleteDialog.title":`Supprimer l'espace de travail ?`,"workspaceList.deleteDialog.deleteLocal":`Supprimer la branche locale`,"workspaceList.deleteDialog.deleteRemote":`Supprimer la branche distante`,"workspaceList.deleteDialog.warning":`Attention : cette action est irréversible sur le dépôt distant.`,"workspacePage.selectWorkspace":`Sélectionnez un espace de travail pour commencer`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ Nouvelle session`,"workspacePage.renameSession":`Renommer`,"workspacePage.renameSessionTitle":`Renommer la session`,"workspacePage.sessionNameLabel":`Nom de la session`,"workspacePage.sessionEndedNotice":`Cette session est terminée. Crée une nouvelle session pour continuer.`,"workspacePage.renameFailed":`Échec du renommage`,"workspacePage.createSessionFailed":`Échec de la création de la session`,"workspacePage.startFailed":`Échec du démarrage`,"workspacePage.stopFailed":`Échec de l'arrêt`,"workspacePage.interrupt":`Interrompre`,"workspacePage.interrupted":`Agent interrompu — en attente de votre prochain message`,"workspacePage.interruptFailed":`Échec de l'interruption`,"workspacePage.interruptTooltip":`Interruption douce (comme Escape) — arrête le tool en cours mais garde la session active`,"workspacePage.pendingNextRun":`Appliqué au prochain démarrage`,"search.title":`Recherche`,"search.tooltip":`Rechercher dans l'historique des agents`,"search.placeholder":`Rechercher dans tous les messages agents…`,"search.includeArchived":`Inclure les workspaces archivés`,"search.loading":`Recherche en cours…`,"search.noResults":`Aucun résultat`,"search.error":`Échec de la recherche : {message}`,"search.resultCount":`{n} résultat(s)`,"search.eventType.userMessage":`Vous`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Aucune activité`,"activityFeed.emptyHint":`Démarrez un espace de travail pour voir la sortie de l'agent ici`,"activityFeed.initialPrompt":`Prompt initial`,"activityFeed.you":`Vous`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Aller au message précédent`,"activityFeed.scrollToBottom":`Défiler vers le bas`,"activityFeed.sendAnswers":`Envoyer les réponses`,"agentBusy.banner":`L'agent est occupé`,"agentBusy.subagentsRunning":`1 sub-agent en cours | {n} sub-agents en cours`,"agentBusy.viewSubagents":`Voir les sub-agents`,"agentBusy.pendingMessage":`En attente — l'agent est occupé`,"terminal.title":`Terminal`,"terminal.open":`Ouvrir le terminal`,"terminal.close":`Fermer le terminal`,"terminal.noWorkspace":`Sélectionnez un espace de travail`,"terminal.noWorktree":`Worktree pas encore créé`,"terminal.error":`Erreur du terminal`,"terminal.exited":`Terminal fermé`,"chatInput.placeholder":`Message... (/ pour les skills)`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Joindre une image`,"chatInput.queueBanner":`Message en file d'attente — sera envoyé quand l'agent aura terminé`,"chatInput.cancelQueue":`Annuler la file d'attente`,"chatInput.autoLoopBanner":`L'auto-loop tourne — arrête-le pour envoyer un message`,"chatInput.autoLoopStop":`Arrêter`,"koboCommand.checkProgressDesc":`Vérifier la progression des tâches et critères d'acceptation`,"chatInput.uploading":`Envoi en cours...`,"createPage.title":`Sur quoi souhaitez-vous travailler ?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion activé`,"createPage.importNotion":`Importer depuis Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL doit commencer par https://www.notion.so/`,"createPage.notionAutoExtract":`Les sous-tâches et critères d'acceptation seront extraits automatiquement.`,"createPage.notionPanelChoiceLabel":`Cette URL pointe vers une sous-page (?p=). Sur laquelle veux-tu travailler ?`,"createPage.notionPanelOption":`Sous-page (panel)`,"createPage.notionPanelOptionDesc":`La page que tu consultais — recommandé`,"createPage.notionParentOption":`Page parente`,"createPage.notionParentOptionDesc":`L'epic / database qui la contient`,"createPage.importSentry":`Importer Sentry`,"createPage.sentryEnabled":`Sentry activé`,"createPage.sentryPlaceholder":`https://votre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL doit pointer vers une issue Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue Sentry sera importée automatiquement`,"createPage.sentryExtractHint":`Kobo va extraire l'issue et l'écrire dans .ai/thoughts/`,"createPage.workspaceName":`Nom de l'espace de travail (par défaut le titre de la page Notion)`,"createPage.workspaceNamePlaceholder":`Nom de l'espace de travail...`,"createPage.instructions":`Instructions supplémentaires (optionnel)...`,"createPage.instructionsPlaceholder":`Décrivez la tâche...`,"createPage.manualHint":`Pas de ticket Notion ? Ajoutez vos tâches et critères d'acceptation manuellement — ils seront envoyés à l'agent Claude comme contexte.`,"createPage.tasks":`Tâches ({count})`,"createPage.addTask":`Ajouter une tâche...`,"createPage.acceptanceCriteria":`Critères d'acceptation ({count})`,"createPage.addCriterion":`Ajouter un critère...`,"createPage.projectPath":`Chemin du projet`,"createPage.branchType":`Type de branche`,"createPage.branch":`Branche`,"createPage.noBranches":`Aucune branche trouvée`,"createPage.enterPath":`Entrez le chemin du projet`,"createPage.create":`Créer`,"createPage.skipSetupScript":`Ignorer le script de setup`,"createPage.attachWorktreeToggle":`Réutiliser un worktree existant`,"createPage.attachWorktreeEnabled":`Worktree existant sélectionné`,"createPage.worktreePickerLabel":`Worktree existant`,"createPage.noOrphanWorktrees":`Aucun worktree orphelin pour ce projet`,"createPage.pickWorktreeRequired":`Sélectionne un worktree à réutiliser`,"createPage.notionExtractHint":`Les sous-tâches et critères d'acceptation seront extraits de la page Notion.`,"createPage.notionImportHint":`Cliquez sur « Importer depuis Notion » pour extraire automatiquement les sous-tâches d'un ticket.`,"createPage.errorCreating":`Erreur lors de la création de l'espace de travail.`,"createPage.validationNotionUrl":`Veuillez coller une URL Notion valide (https://www.notion.so/...).`,"createPage.validationDescription":`Veuillez décrire la tâche.`,"createPage.validationName":`Veuillez fournir un nom d'espace de travail.`,"createPage.validationPath":`Veuillez entrer le chemin du projet.`,"createPage.validationBranch":`Veuillez sélectionner une branche.`,"settings.title":`Paramètres`,"settings.language":`Langue`,"settings.global":`Général`,"settings.projects":`Projets`,"settings.globalSettings":`Paramètres généraux`,"settings.defaultModel":`Modèle par défaut`,"settings.agentPermissions":`Permissions de l'agent`,"settings.skipPermissions":`Ignorer les invites de permission (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attention : désactiver cette option entraînera le refus automatique de toutes les permissions d'outils (Write, Edit, Bash...) en mode headless. L'agent ne pourra que lire.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Notification navigateur quand l'agent termine`,"settings.audioNotifications":`Notification sonore quand l'agent termine`,"settings.defaultPermissionMode":`Mode de permission par défaut`,"settings.defaultPermissionModeHint":`Mode appliqué à la création d'un workspace. Plan = brainstorming lecture seule d'abord, Auto-accept = exécution complète immédiatement.`,"settings.activityFeed":`Flux d'activité`,"settings.verboseMessages":`Afficher les messages système détaillés (task_progress, task_started)`,"settings.availableVariables":`Variables disponibles dans le modèle de prompt PR`,"settings.prPromptTemplate":`Modèle de prompt PR`,"settings.prPromptPlaceholder":`Instructions pour l'agent lors de la création de PR GitHub...`,"settings.prPromptHint":`Utilisez les variables listées ci-dessus (syntaxe doubles accolades).`,"settings.var.prNumber":`Numéro de PR (ex : 42)`,"settings.var.prUrl":`URL complète de la PR créée`,"settings.var.branchName":`Nom de la branche de travail`,"settings.var.sourceBranch":`Branche source ciblée par la PR`,"settings.var.workspaceName":`Nom du workspace`,"settings.var.projectName":`Dernier segment du chemin du projet`,"settings.var.notionUrl":`URL Notion si définie, vide sinon`,"settings.var.commits":`Liste à puces des commits entre source et head`,"settings.var.diffStats":`Résumé shortstat Git (fichiers, insertions, suppressions)`,"settings.var.tasks":`Tâches classiques en liste à cocher`,"settings.var.acceptanceCriteria":`Critères d'acceptation en liste à cocher`,"settings.gitConventions":`Conventions Git (global)`,"settings.gitConventionsPlaceholder":`# Conventions Git...`,"settings.gitConventionsHint":`Ces conventions sont écrites dans .ai/.git-conventions.md pour chaque nouvel espace de travail et doivent être respectées par l'agent avant toute opération Git. Remplacées par les conventions par projet si définies.`,"settings.setupScript":`Script de setup`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.viewPr":`Voir la PR`,"git.createPr":`Créer une PR`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.renameDisabledForExternal":`Le renommage est désactivé pour les worktrees externes attachés.`,"git.diff":`Diff`,"git.diffReview":`Diff Review`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbort":`Abandonner`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBase":`Changer la branche cible de la PR`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la pull request.`,"git.changePrBaseSuccess":`Branche cible de la PR mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la PR`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.prCreated":`PR #{n} créée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sub-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"stats.title":`Statistiques`,"stats.info":`Info`,"stats.status":`Statut`,"stats.model":`Modèle`,"stats.branch":`Branche`,"stats.sessions":`Sessions`,"stats.duration":`Durée`,"stats.timeline":`Chronologie`,"stats.created":`Créé`,"stats.firstSession":`Première session`,"stats.lastPrompt":`Dernier prompt`,"stats.lastResponse":`Dernière réponse`,"stats.updated":`Mis à jour`,"stats.activity":`Activité`,"stats.agentMessages":`Messages de l'agent`,"stats.userMessages":`Messages utilisateur`,"stats.toolCalls":`Appels d'outils`,"stats.errors":`Erreurs`,"stats.usage":`Utilisation`,"stats.inputTokens":`Tokens en entrée`,"stats.outputTokens":`Tokens en sortie`,"stats.totalTokens":`Tokens totaux`,"stats.cost":`Coût`,"stats.usageLimits":`Limites d'usage`,"stats.used":`utilisé`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.openStatsPanel":`Ouvrir l'onglet Stats`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"stats.subagents":`Sub-agents`,"stats.completed":`Terminés`,"stats.tokens":`Tokens`,"stats.progress":`Progression`,"stats.tasks":`Tâches`,"stats.acceptanceCriteria":`Critères d'acceptation`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tooltip.refreshStats":`Actualiser les statistiques`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.modeInspect":`Inspect`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.addToChat":`Ajouter au chat`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.runSetup":`Lancer le script de setup`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"health.envTitle":`Environnement`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.cliTitle":`Claude CLI`,"health.cliMissing":`claude introuvable dans le PATH. Installe Claude Code pour lancer des agents.`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"chat.systemPrompt":`Prompt système`,"chat.agent":`Agent`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"engine.permission":`Mode de permission`,"createPage.permissionLockedByAutoLoop":`L'auto-loop nécessite Auto-accept (MCP + éditions). Désactive l'auto-loop pour choisir le mode Plan.`,"engine.permission.auto-accept":`Acceptation auto`,"engine.permission.plan":`Plan (lecture seule)`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"workspaceList.prOpen":`Pull request ouverte`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`},on={"common.save":`Salva`,"common.cancel":`Annulla`,"common.delete":`Elimina`,"common.close":`Chiudi`,"common.loading":`Caricamento...`,"common.search":`Cerca...`,"common.refresh":`Aggiorna`,"common.start":`Avvia`,"common.stop":`Arresta`,"common.archive":`Archivia`,"common.unarchive":`Ripristina`,"common.selectWorkspace":`Seleziona un workspace`,"common.noResults":`Nessun risultato per "{query}"`,"common.send":`invia`,"common.newLine":`nuova riga`,"common.history":`cronologia`,"common.justNow":`adesso`,"common.minutesAgo":`{count}m fa`,"common.hoursAgo":`{count}h fa`,"common.daysAgo":`{count}g fa`,"model.auto":`Auto`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude sceglie il modello ottimale`,"model.opus47ClassicDescription":`Ultimo Opus, il più capace`,"model.opus471mDescription":`Ultimo Opus, contesto 1M`,"model.opusClassicDescription":`Più potente`,"model.opus1mDescription":`Più potente, contesto 1M`,"model.sonnetClassicDescription":`Bilanciato`,"model.sonnet1mDescription":`Bilanciato, contesto 1M`,"model.haikuDescription":`Più veloce`,"reasoning.auto":`auto`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Claude decide automaticamente`,"reasoning.lowDescription":`Più veloce, meno profondità`,"reasoning.mediumDescription":`Bilanciato`,"reasoning.highDescription":`Più profondità`,"reasoning.xhighDescription":`Profondità estesa, attività lunghe (Opus 4.7)`,"reasoning.maxDescription":`Profondità massima`,"permissionMode.autoAccept":`Accettazione automatica`,"permissionMode.plan":`Piano`,"permissionProfile.strict":`Permessi stretti`,"permissionProfile.strictTooltip":`Attivato: Claude rispetta le liste allow/deny in .claude/settings.json del progetto (permette scritture sotto .claude/** o .github/workflows/** se le hai allow-listate). Contropartita: Bash o MCP fuori dalla lista chiederanno conferma e possono bloccare l'auto-loop. Disattivato (default): Kōbō passa --dangerously-skip-permissions — massima permissività ma il CLI blocca .claude/** e .github/workflows/** in ogni caso. Si applica alla prossima sessione.`,"workspaceList.title":`Workspace`,"workspaceList.needsAttention":`Richiede attenzione`,"workspaceList.running":`In esecuzione`,"workspaceList.idle":`Inattivo`,"workspaceList.archived":`Archiviati`,"workspaceList.noWorkspaces":`Nessun workspace ancora`,"workspaceList.footer":`{count} workspace | {count} workspace`,"workspaceList.footerRunning":`{count} in esecuzione`,"workspaceList.deleteDialog.title":`Eliminare il workspace?`,"workspaceList.deleteDialog.deleteLocal":`Elimina branch locale`,"workspaceList.deleteDialog.deleteRemote":`Elimina branch remoto`,"workspaceList.deleteDialog.warning":`Attenzione: questa azione è irreversibile sul remoto.`,"workspacePage.selectWorkspace":`Seleziona un workspace per iniziare`,"workspacePage.session":`Sessione #{n}`,"workspacePage.newSession":`+ Nuova sessione`,"workspacePage.renameSession":`Rinomina`,"workspacePage.renameSessionTitle":`Rinomina sessione`,"workspacePage.sessionNameLabel":`Nome sessione`,"workspacePage.sessionEndedNotice":`Questa sessione è terminata. Crea una nuova sessione per continuare.`,"workspacePage.renameFailed":`Rinomina fallita`,"workspacePage.createSessionFailed":`Creazione sessione fallita`,"workspacePage.startFailed":`Avvio fallito`,"workspacePage.stopFailed":`Arresto fallito`,"workspacePage.interrupt":`Interrompi`,"workspacePage.interrupted":`Agente interrotto — in attesa del tuo prossimo messaggio`,"workspacePage.interruptFailed":`Interruzione fallita`,"workspacePage.interruptTooltip":`Interruzione leggera (come Escape) — ferma lo strumento corrente ma mantiene la sessione attiva`,"workspacePage.pendingNextRun":`Applicato al prossimo avvio`,"search.title":`Ricerca`,"search.tooltip":`Cerca nella cronologia degli agenti`,"search.placeholder":`Cerca in tutti i messaggi degli agenti…`,"search.includeArchived":`Includi workspace archiviati`,"search.loading":`Ricerca in corso…`,"search.noResults":`Nessun risultato`,"search.error":`Ricerca fallita: {message}`,"search.resultCount":`{n} risultato/i`,"search.eventType.userMessage":`Tu`,"search.eventType.agentOutput":`Agente`,"activityFeed.empty":`Nessuna attività ancora`,"activityFeed.emptyHint":`Avvia un workspace per vedere l'output dell'agente qui`,"activityFeed.initialPrompt":`Prompt iniziale`,"activityFeed.you":`Tu`,"activityFeed.agent":`Agente`,"activityFeed.question":`Domanda`,"activityFeed.goToPrevious":`Vai al messaggio precedente`,"activityFeed.scrollToBottom":`Vai in fondo`,"activityFeed.sendAnswers":`Invia risposte`,"agentBusy.banner":`L'agente è occupato`,"agentBusy.subagentsRunning":`1 sub-agente in esecuzione | {n} sub-agenti in esecuzione`,"agentBusy.viewSubagents":`Vedi sub-agenti`,"agentBusy.pendingMessage":`In attesa — l'agente è occupato`,"terminal.title":`Terminale`,"terminal.open":`Apri terminale`,"terminal.close":`Chiudi terminale`,"terminal.noWorkspace":`Seleziona un workspace`,"terminal.noWorktree":`Worktree non ancora creato`,"terminal.error":`Errore del terminale`,"terminal.exited":`Terminale chiuso`,"chatInput.placeholder":`Messaggio... (/ per le skill)`,"chatInput.skills":`Skill`,"chatInput.attachImage":`Allega immagine`,"chatInput.queueBanner":`Messaggio in coda — verrà inviato quando l'agente avrà terminato`,"chatInput.cancelQueue":`Annulla coda`,"chatInput.autoLoopBanner":`Auto-loop attivo — fermalo per inviare un messaggio`,"chatInput.autoLoopStop":`Ferma`,"koboCommand.checkProgressDesc":`Verificare il progresso delle attività e dei criteri di accettazione`,"chatInput.uploading":`Caricamento...`,"createPage.title":`Su cosa vorresti lavorare?`,"createPage.claudeCode":`Claude Code`,"createPage.notionEnabled":`Notion attivato`,"createPage.importNotion":`Importa da Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL deve iniziare con https://www.notion.so/`,"createPage.notionAutoExtract":`Le sottotask e i criteri di accettazione verranno estratti automaticamente.`,"createPage.notionPanelChoiceLabel":`Questo URL punta a una sotto-pagina (?p=). Su quale vuoi lavorare?`,"createPage.notionPanelOption":`Sotto-pagina (panel)`,"createPage.notionPanelOptionDesc":`La pagina che stavi visualizzando — consigliato`,"createPage.notionParentOption":`Pagina principale`,"createPage.notionParentOptionDesc":`L'epic / database a cui appartiene`,"createPage.importSentry":`Importa Sentry`,"createPage.sentryEnabled":`Sentry attivato`,"createPage.sentryPlaceholder":`https://tua-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL deve puntare a una issue di Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue di Sentry verrà importata automaticamente`,"createPage.sentryExtractHint":`Kobo estrarrà l'issue e la scriverà in .ai/thoughts/`,"createPage.workspaceName":`Nome del workspace (predefinito: titolo della pagina Notion)`,"createPage.workspaceNamePlaceholder":`Nome del workspace...`,"createPage.instructions":`Istruzioni aggiuntive (opzionale)...`,"createPage.instructionsPlaceholder":`Descrivi il task...`,"createPage.manualHint":`Nessun ticket Notion? Aggiungi i tuoi task e criteri di accettazione manualmente — verranno inviati all'agente Claude come contesto.`,"createPage.tasks":`Task ({count})`,"createPage.addTask":`Aggiungi un task...`,"createPage.acceptanceCriteria":`Criteri di accettazione ({count})`,"createPage.addCriterion":`Aggiungi un criterio...`,"createPage.projectPath":`Inserisci il percorso del progetto`,"createPage.branchType":`Tipo di branch`,"createPage.branch":`Branch`,"createPage.noBranches":`Nessun branch trovato`,"createPage.enterPath":`Inserisci il percorso del progetto`,"createPage.create":`Crea`,"createPage.skipSetupScript":`Salta script di setup`,"createPage.attachWorktreeToggle":`Aggancia worktree esistente`,"createPage.attachWorktreeEnabled":`Riutilizzo worktree esistente`,"createPage.worktreePickerLabel":`Worktree esistente`,"createPage.noOrphanWorktrees":`Nessun worktree orfano in questo progetto`,"createPage.pickWorktreeRequired":`Seleziona un worktree da agganciare`,"createPage.notionExtractHint":`Le sottotask e i criteri di accettazione verranno estratti dalla pagina Notion.`,"createPage.notionImportHint":`Clicca su "Importa da Notion" per estrarre automaticamente le sottotask da un ticket.`,"createPage.errorCreating":`Errore durante la creazione del workspace.`,"createPage.validationNotionUrl":`Inserisci un URL Notion valido (https://www.notion.so/...).`,"createPage.validationDescription":`Descrivi il task.`,"createPage.validationName":`Indica un nome per il workspace.`,"createPage.validationPath":`Inserisci il percorso del progetto.`,"createPage.validationBranch":`Seleziona un branch.`,"settings.title":`Impostazioni`,"settings.language":`Lingua`,"settings.global":`Globale`,"settings.projects":`Progetti`,"settings.globalSettings":`Impostazioni globali`,"settings.defaultModel":`Modello predefinito`,"settings.agentPermissions":`Permessi dell'agente`,"settings.skipPermissions":`Salta le richieste di permesso (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attenzione: disattivando questa opzione, tutti i permessi degli strumenti (Write, Edit, Bash...) verranno negati automaticamente in modalità headless. L'agente potrà solo leggere.`,"settings.notifications":`Notifiche`,"settings.browserNotifications":`Notifica browser quando l'agente termina`,"settings.audioNotifications":`Notifica sonora quando l'agente termina`,"settings.defaultPermissionMode":`Modalità permessi predefinita`,"settings.defaultPermissionModeHint":`Modalità applicata alla creazione di un workspace. Plan = brainstorming in sola lettura prima, Auto-accept = esecuzione completa immediata.`,"settings.activityFeed":`Feed attività`,"settings.verboseMessages":`Mostra messaggi di sistema dettagliati (task_progress, task_started)`,"settings.availableVariables":`Variabili disponibili nel template del prompt PR`,"settings.prPromptTemplate":`Template del prompt PR`,"settings.prPromptPlaceholder":`Istruzioni per l'agente durante la creazione di PR su GitHub...`,"settings.prPromptHint":`Usa le variabili elencate sopra (sintassi doppia parentesi graffa).`,"settings.var.prNumber":`Numero della PR (es: 42)`,"settings.var.prUrl":`URL completo della PR creata`,"settings.var.branchName":`Nome del branch di lavoro`,"settings.var.sourceBranch":`Branch sorgente a cui punta la PR`,"settings.var.workspaceName":`Nome del workspace`,"settings.var.projectName":`Ultimo segmento del percorso del progetto`,"settings.var.notionUrl":`URL Notion se impostato, vuoto altrimenti`,"settings.var.commits":`Elenco puntato dei commit tra source e head`,"settings.var.diffStats":`Riepilogo shortstat Git (file, inserimenti, eliminazioni)`,"settings.var.tasks":`Attività regolari come lista di controllo`,"settings.var.acceptanceCriteria":`Criteri di accettazione come lista di controllo`,"settings.gitConventions":`Convenzioni Git (globale)`,"settings.gitConventionsPlaceholder":`# Convenzioni Git...`,"settings.gitConventionsHint":`Queste convenzioni vengono scritte in .ai/.git-conventions.md in ogni nuovo workspace e devono essere seguite dall'agente prima di qualsiasi operazione Git. Sovrascritte dalle convenzioni per progetto se definite.`,"settings.setupScript":`Script di setup`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Eseguito con bash nel worktree dopo la creazione, prima dell'avvio dell'agente. Nessun shebang necessario. In caso di errore, il workspace viene impostato su errore. Timeout: 5 minuti.`,"settings.e2e.title":`Test E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Nessuno`,"settings.e2e.frameworkOther":`Altro`,"settings.e2e.skill":`Skill (opzionale)`,"settings.e2e.skillPlaceholder":`es. cypress-tester`,"settings.e2e.prompt":`Linee guida personalizzate (opzionale)`,"settings.e2e.promptPlaceholder":`es. usare il pattern page-object, mirare a data-testid`,"settings.e2e.helpText":`Quando configurato, l'agente di grooming auto-loop inserisce sotto-task E2E per funzionalità UI.`,"settings.finalization.title":`Finalizzazione dell'auto-loop`,"settings.finalization.helpText":`Opzionale: un prompt che l'agente esegue come ultima iterazione dell'auto-loop. Tipicamente usato per controlli di qualità finali (lint, typecheck, test). La fase di grooming creerà un task con prefisso [FINAL] che userà questo prompt.`,"settings.finalization.prompt":`Prompt di finalizzazione`,"settings.finalization.promptPlaceholder":`es. Esegui npm run lint e npm test, poi marca questo task come fatto.`,"settings.editorCommand":`Comando editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando per aprire il worktree nel proprio editor. Il percorso del worktree viene passato come argomento.`,"settings.mcpSelection":`Selezione MCP Claude`,"settings.mcpAutoSelect":`Auto (primo MCP attivo corrispondente)`,"settings.notionMcp":`Chiave MCP Notion`,"settings.sentryMcp":`Chiave MCP Sentry`,"settings.mcpSelectionHint":`Le voci attive vengono lette da ~/.claude.json. Lascia Auto per usare il comportamento predefinito.`,"settings.configuredProjects":`Progetti configurati`,"settings.noProjects":`Nessun progetto configurato`,"settings.addProject":`Aggiungi progetto`,"settings.newProject":`Nuovo progetto`,"settings.editProject":`Modifica progetto`,"settings.projectPath":`Percorso del progetto`,"settings.projectPathPlaceholder":`/percorso/del/progetto`,"settings.displayName":`Nome visualizzato`,"settings.displayNamePlaceholder":`Il mio progetto`,"settings.defaultSourceBranch":`Branch sorgente predefinito`,"settings.defaultModel.project":`Modello predefinito`,"settings.skipPermissions.project":`Salta le richieste di permesso`,"settings.prPromptTemplate.project":`Template del prompt PR`,"settings.prPromptPlaceholder.project":`Istruzioni specifiche del progetto per la creazione di PR...`,"settings.gitConventions.project":`Convenzioni Git (per progetto)`,"settings.gitConventionsEmpty":`Lascia vuoto per usare le convenzioni globali.`,"settings.notionStatus":`Stato ticket Notion`,"settings.notionStatusProperty":`Nome della proprietà`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valore da impostare`,"settings.notionInProgressStatusPlaceholder":`In corso, In progress...`,"settings.notionStatusHint":`Quando un workspace viene creato con un ticket Notion, la proprietà specificata viene impostata a questo valore. Entrambi i campi sono obbligatori. Lasciare vuoto per disattivare.`,"settings.devServer":`Server di sviluppo`,"settings.devServerStart":`Script di avvio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script di arresto`,"settings.devServerStopPlaceholder":`Opzionale — il processo verrà terminato automaticamente se vuoto`,"settings.selectProject":`Seleziona un progetto o aggiungine uno nuovo`,"settings.projectPathRequired":`Il percorso del progetto è obbligatorio.`,"settings.useGlobal":`Usa globale`,"settings.saved":`Impostazioni globali salvate.`,"settings.saveError":`Errore durante il salvataggio delle impostazioni.`,"settings.projectSaved":`Progetto salvato.`,"settings.projectSaveError":`Errore durante il salvataggio del progetto.`,"settings.projectDeleted":`Progetto eliminato.`,"settings.projectDeleteError":`Errore durante l'eliminazione del progetto.`,"templates.title":`Template`,"templates.newTemplate":`Nuovo template`,"templates.editTemplate":`Modifica template`,"templates.deleteTemplate":`Elimina template`,"templates.deleteConfirm":`Eliminare il template '/{slug}'?`,"templates.deleteConfirmMessage":`Questa azione non può essere annullata.`,"templates.slug":`Slug`,"templates.slugHint":`Minuscole, cifre, trattini. Max 64 caratteri.`,"templates.slugInvalid":`Lo slug può contenere solo minuscole, cifre e trattini`,"templates.slugDuplicate":`Un template con questo slug esiste già`,"templates.description":`Descrizione`,"templates.descriptionHint":`Etichetta breve mostrata nel dropdown.`,"templates.descriptionRequired":`La descrizione è obbligatoria`,"templates.contentRequired":`Il contenuto è obbligatorio`,"templates.content":`Contenuto`,"templates.contentHint":`Contenuto del template. Usa {variable_name} per le sostituzioni.`,"templates.availableVars":`Variabili disponibili`,"templates.filePath":`File: {path}`,"templates.empty":`Nessun template ancora.`,"templates.createFailed":`Creazione del template fallita`,"templates.updateFailed":`Aggiornamento del template fallito`,"templates.deleteFailed":`Eliminazione del template fallita`,"templates.save":`Salva`,"templates.create":`Crea`,"chatInput.dropdownSkills":`Skill Claude`,"chatInput.dropdownKobo":`Comandi Kōbō`,"chatInput.dropdownTemplates":`Template`,"documents.title":`Documenti`,"documents.empty":`Nessun documento trovato`,"documents.refresh":`Aggiorna`,"documents.back":`Indietro`,"documents.loadFailed":`Caricamento del documento fallito`,"git.title":`Git`,"git.localOnly":`solo locale`,"git.pushed":`pushed`,"git.unpushed":`{count} non pushati`,"git.commits":`{count} commit | {count} commit`,"git.commits.loading":`Caricamento commit…`,"git.commits.empty":`Nessun commit su questo branch`,"git.commits.pushed":`Pushato`,"git.commits.unpushed":`Non pushato`,"git.commits.clickToAppend":`clicca per aggiungere SHA alla chat`,"git.files":`{count} file | {count} file`,"git.staged":`{count} staged`,"git.modified":`{count} modificati`,"git.untracked":`{count} non tracciati`,"git.viewPr":`Vedi PR`,"git.createPr":`Crea PR`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Più sicuro di --force: il push viene rifiutato se il remoto ha commit che non hai visto. Da usare dopo un rebase o amend di commit già pushati.`,"git.branchForcePushed":`Branch force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`Nessun upstream per questo branch — fai push prima per abilitare Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push del branch prima`,"git.pullConfirmTitle":`Pull della branch?`,"git.pullConfirmMessage":`Pull {branch} dal remoto (solo fast-forward).`,"git.branchPulled":`Branch aggiornata`,"git.pullFailed":`Pull fallito`,"git.renameBranch":`Rinomina branch`,"git.renameBranchPrompt":"Rinomina `{branch}` in:","git.renameBranchSuccess":"Branch rinominato in `{branch}`","git.renameBranchFailed":`Rinomina branch fallita`,"git.renameBranchExists":"Il branch `{branch}` esiste già localmente o su origin","git.renameDisabledForExternal":`La rinomina è disattivata per i worktree esterni agganciati.`,"git.diff":`Diff`,"git.diffReview":`Diff Review`,"git.diffReviewTooltip":`Apre il visualizzatore diff in modalità Review — commenti inline + invio batch all'agente`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase del branch?`,"git.rebaseConfirmMessage":`Rebase su {branch}. Potrebbero verificarsi conflitti.`,"git.rebaseSuccess":`Rebase completato`,"git.rebaseFailed":`Rebase fallito`,"git.merge":`Merge`,"git.mergeConfirmTitle":`Fondere il branch?`,"git.mergeConfirmMessage":`Fonde {branch} in questo branch. Possibili conflitti.`,"git.mergeSuccess":`Merge completato`,"git.mergeFailed":`Merge fallito`,"git.conflictTitleMerge":`Conflitti di merge rilevati`,"git.conflictTitleRebase":`Conflitti di rebase rilevati`,"git.conflictSubtitle":`{count} file con conflitti. Scegli come continuare.`,"git.conflictAbort":`Annulla`,"git.conflictResolveWithAgent":`Chiedi all'agente di risolvere`,"git.conflictAborted":`Operazione annullata`,"git.conflictHandoffSuccess":`L'agente sta risolvendo i conflitti`,"git.pushConfirmTitle":`Push del branch?`,"git.pushConfirmMessage":`Push di {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Push del branch`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBase":`Cambiare branch base della PR`,"git.changePrBaseTitle":`Cambiare branch base`,"git.changePrBaseMessage":`Inserire il nuovo branch destinazione per la pull request.`,"git.changePrBaseSuccess":`Branch base della PR aggiornato`,"git.changePrBaseFailed":`Impossibile cambiare il branch base della PR`,"git.openEditor":`Apri nell'editor`,"git.openEditorFailed":`Impossibile aprire l'editor`,"git.branchPushed":`Branch pushato`,"git.pushFirst":`Il branch non è sul remoto. Fai Push prima.`,"git.unpushedCommits":`I commit locali non sono pushati. Fai Push prima.`,"git.from":`da`,"git.prCreated":`PR #{n} creata`,"devServer.title":`Server di sviluppo`,"devServer.noWorkspace":`Nessun workspace selezionato`,"devServer.notConfigured":`Non configurato —`,"devServer.goToSettings":`Impostazioni`,"devServer.logs":`Log`,"devServer.running":`In esecuzione`,"devServer.starting":`Avvio in corso`,"devServer.stopping":`Arresto in corso`,"devServer.error":`Errore`,"devServer.stopped":`Arrestato`,"devServer.unknown":`Sconosciuto`,"devServer.containers":`{count} container | {count} container`,"devServer.logDialog.title":`Log del server di sviluppo`,"devServer.logDialog.empty":`Nessun log disponibile`,"notion.title":`Notion`,"tasks.title":`Attività`,"notion.addTask":`Aggiungi task`,"notion.noUrl":`Nessun URL Notion`,"notion.subtasks":`{done}/{total} sottotask`,"notion.noTasks":`Nessun task`,"notion.newTask":`Nuovo task... (Invio per aggiungere, Esc per annullare)`,"acceptance.title":`Criteri di accettazione`,"acceptance.addCriterion":`Aggiungi criterio`,"acceptance.newCriterion":`Nuovo criterio... (Invio per aggiungere, Esc per annullare)`,"acceptance.empty":`Nessun criterio di accettazione`,"tasks.askProgress":`Chiedere all'agente di verificare il progresso`,"agentTodos.title":`Todo dell'agente`,"agentTodos.empty":`Nessun todo dell'agente`,"subagents.title":`Sub-agenti`,"subagents.empty":`Nessuna attività dei sub-agenti ancora`,"subagents.tools":`{count} strumenti`,"subagents.running":`In esecuzione: `,"stats.title":`Statistiche`,"stats.info":`Info`,"stats.status":`Stato`,"stats.model":`Modello`,"stats.branch":`Branch`,"stats.sessions":`Sessioni`,"stats.duration":`Durata`,"stats.timeline":`Cronologia`,"stats.created":`Creato`,"stats.firstSession":`Prima sessione`,"stats.lastPrompt":`Ultimo prompt`,"stats.lastResponse":`Ultima risposta`,"stats.updated":`Aggiornato`,"stats.activity":`Attività`,"stats.agentMessages":`Messaggi dell'agente`,"stats.userMessages":`Messaggi dell'utente`,"stats.toolCalls":`Chiamate agli strumenti`,"stats.errors":`Errori`,"stats.usage":`Consumo`,"stats.inputTokens":`Token in ingresso`,"stats.outputTokens":`Token in uscita`,"stats.totalTokens":`Token totali`,"stats.cost":`Costo`,"stats.usageLimits":`Limiti di utilizzo`,"stats.used":`usato`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket utilizzo {n}`,"quotaFooter.lastUpdated":`Ultimo aggiornamento: {time}`,"quotaFooter.empty":`Caricamento…`,"quotaFooter.popover.title":`Utilizzo Claude Code`,"quotaFooter.popover.refreshNow":`Aggiorna`,"quotaFooter.popover.openStatsPanel":`Apri pannello Stats`,"quotaFooter.popover.resetsIn":`Reset alle {value}`,"quotaFooter.popover.unauthenticated":`Auth richiesta`,"quotaFooter.popover.unauthenticatedHint":`Esegui "claude" una volta per autenticarti.`,"quotaFooter.popover.error":`Errore`,"quotaFooter.bucket.fiveHour":`5 ore`,"quotaFooter.bucket.sevenDay":`7 giorni`,"agent.error.spawn_failed":`Impossibile avviare l'agente`,"agent.error.parse_error":`Impossibile analizzare un messaggio dell'agente`,"agent.error.rate_limit":`Limite di frequenza raggiunto`,"agent.error.resume_failed":`Sessione non trovata — avvio di una nuova sessione`,"agent.error.other":`Errore dell'agente`,"rateLimitType.fiveHour":`Sessione 5h`,"rateLimitType.sevenDay":`Settimanale`,"stats.subagents":`Sub-agenti`,"stats.completed":`Completati`,"stats.tokens":`Token`,"stats.progress":`Progresso`,"stats.tasks":`Task`,"stats.acceptanceCriteria":`Criteri di accettazione`,"tooltip.addTask":`Aggiungi task`,"tooltip.removeTask":`Rimuovi task`,"tooltip.addCriterion":`Aggiungi criterio`,"tooltip.removeCriterion":`Rimuovi criterio`,"tooltip.startDevServer":`Avvia server di sviluppo`,"tooltip.stopDevServer":`Arresta server di sviluppo`,"tooltip.closeDiffViewer":`Chiudi diff`,"tooltip.refreshLogs":`Aggiorna log`,"tooltip.closeDialog":`Chiudi`,"tooltip.refreshGitStats":`Aggiorna statistiche Git`,"tooltip.removeImage":`Rimuovi immagine`,"tooltip.sendMessage":`Invia messaggio`,"tooltip.refreshStats":`Aggiorna statistiche`,"tools.title":`Strumenti`,"tools.runSetupScript":`Rieseguire script di setup`,"tools.runSetupScriptTooltip":`Eseguire lo script di setup del progetto nel worktree`,"tools.runSetupScriptConfirm":`Rieseguire lo script di setup in questo workspace? Gli artefatti esistenti potrebbero essere sovrascritti.`,"tools.runSetupScriptBusy":`Impossibile rieseguire il setup mentre l'agent sta lavorando.`,"tools.noSetupScript":`Nessun script di setup configurato —`,"tools.setupScriptSuccess":`Script di setup completato con successo.`,"tools.setupScriptFailed":`Script di setup fallito.`,"tools.openNotion":`Apri in Notion`,"tools.openSentry":`Apri in Sentry`,"diff.title":`Diff`,"diff.side":`Affiancato`,"diff.inline":`In linea`,"diff.hideUnchanged":`Nascondi codice invariato`,"diff.showUnchanged":`Mostra codice invariato`,"diff.showUntracked":`Mostra file non tracciati`,"diff.hideUntracked":`Nascondi file non tracciati`,"diff.rollbackToRemote":`Ripristina alla versione remota`,"diff.rollbackConfirm":`Ripristinare {path} alla sua versione remota (origin)? Le modifiche locali a questo file andranno perse.`,"diff.rollbackConfirmOk":`Ripristina`,"diff.rollbackDone":`File ripristinato alla versione remota`,"diff.rollbackDoneRemote":`File ripristinato alla versione remota`,"diff.rollbackDoneHead":`Modifiche locali annullate (file ripristinato all'ultimo commit)`,"diff.rollbackDoneDeleted":`File non tracciato eliminato`,"diff.deleteUntracked":`Elimina file non tracciato`,"diff.deleteUntrackedConfirm":`Eliminare definitivamente {path}? Questo file non è tracciato da git — il suo contenuto andrà perso.`,"diff.deleteUntrackedConfirmOk":`Elimina`,"diff.rollbackFailed":`Rollback fallito`,"diff.modeInspect":`Inspect`,"diff.modeReview":`Review`,"diff.addComment":`Aggiungi commento`,"diff.replyComment":`Rispondi`,"diff.editComment":`Modifica`,"diff.deleteComment":`Elimina`,"diff.deleteCommentConfirm":`Eliminare questo commento?`,"diff.commentPlaceholder":`Scrivi un commento di revisione… (Markdown supportato)`,"diff.reviewDraft":`Bozza di revisione`,"diff.reviewEmpty":`Nessun commento — passa sopra una riga del diff e clicca + per aggiungerne uno.`,"diff.reviewGlobalPlaceholder":`Messaggio generale di revisione (opzionale)`,"diff.submitReview":`Invia revisione ({n})`,"diff.reviewSubmitted":`Revisione inviata all'agente`,"diff.reviewSubmitFailed":`Invio della revisione fallito: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Non pushato`,"diff.noChanges":`Nessuna modifica`,"diff.selectFile":`Seleziona un file per visualizzare il diff`,"diff.addToChat":`Aggiungi alla chat`,"notification.agentFinished":`{name} — Agente terminato`,"notification.agentError":`{name} — Errore agente`,"contextMenu.rename":`Rinomina`,"contextMenu.copyPath":`Copia percorso worktree`,"contextMenu.openEditor":`Apri nell'editor`,"contextMenu.runSetup":`Esegui script di setup`,"contextMenu.openNotion":`Apri in Notion`,"contextMenu.openSentry":`Apri in Sentry`,"workspace.favorite":`Segna come preferito`,"workspace.unfavorite":`Rimuovi dai preferiti`,"workspace.showFavoritesOnly":`Mostra solo i preferiti`,"tags.manage":`Gestisci tag`,"tags.manageTitle":`Gestisci i tag del workspace`,"tags.noTagsDefined":`Nessun tag definito. Aggiungine in Impostazioni > Globale > Tag.`,"tags.orphanedHint":`{count} tag non sono più nel catalogo globale. Deseleziona per rimuoverli.`,"settings.tagsTitle":`Tag dei workspace`,"settings.tagsHint":`Definisci i tag assegnabili ai workspace. Digita per aggiungere, clicca la croce per rimuovere.`,"settings.tagsLabel":`Tag disponibili`,"settings.shareTitle":`Condividi configurazione`,"settings.shareHint":`Esporta impostazioni, template e tag come bundle JSON. Le chiavi MCP sono escluse per sicurezza.`,"settings.exportConfig":`Esporta`,"settings.importConfig":`Importa`,"settings.exportSuccess":`Configurazione esportata`,"settings.importSuccess":`Configurazione importata`,"settings.importConfirmTitle":`Importa configurazione`,"settings.importConfirmMessage":`Questo sostituirà le tue impostazioni, template e tag attuali. Le chiavi MCP vengono preservate. Continuare?`,"health.title":`Stato`,"health.tooltip":`Stato del sistema`,"health.envTitle":`Ambiente`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Database`,"health.dbPath":`Percorso`,"health.dbSize":`Dimensione`,"health.schemaVersion":`Versione schema`,"health.cliTitle":`Claude CLI`,"health.cliMissing":`claude non trovato nel PATH. Installa Claude Code per avviare gli agenti.`,"health.workspacesTitle":`Workspace`,"health.workspacesCount":`{total} totali, {archived} archiviati`,"health.worktreesMissing":`{count} worktree mancanti sul disco`,"health.sessionsTitle":`Sessioni agente`,"health.sessionsOrphaned":`{n} sessione/sessioni orfana/e in esecuzione`,"health.integrationsTitle":`Integrazioni`,"health.integrationConfigured":`configurata`,"health.integrationMissing":`non configurata`,"session.started":`Sessione avviata`,"session.ended":`Sessione terminata`,"session.compacted":`Contesto compattato`,"tool.running":`In corso...`,"activity.raw_lines":`Righe di output grezze ({n})`,"activity.loading_older":`Caricamento messaggi precedenti…`,"activity.prev_user_message":`Messaggio utente precedente`,"activity.scroll_to_bottom":`Scorri in fondo`,"chat.systemPrompt":`Prompt di sistema`,"chat.agent":`Agente`,"chat.you":`Tu`,"chat.session":`Sessione`,"chat.nActions":`{n} azione | {n} azioni`,"chat.lastUpdatedAt":`Ultimo aggiornamento alle {time}`,"chat.scrollToTurnTop":`Scorri all'inizio del messaggio`,"migration.backing_up":`Backup del database in corso…`,"migration.running":`Migrazione dei dati dell'agente — {processed}/{total}`,"migration.error":`Migrazione non riuscita`,"migration.backup_location":`Un backup è stato salvato in {path}. Riavvia Kōbō per riprovare.`,"migration.retry":`Riavvia Kōbō per riprovare.`,"engine.select":`Engine`,"engine.model":`Modello`,"engine.effort":`Livello di ragionamento`,"engine.permission":`Modalità permessi`,"createPage.permissionLockedByAutoLoop":`L'auto-loop richiede Auto-accept (MCP + modifiche). Disattiva l'auto-loop per scegliere la modalità Plan.`,"engine.permission.auto-accept":`Accettazione automatica`,"engine.permission.plan":`Plan (sola lettura)`,"wakeup.scheduledIn":`Prossimo risveglio tra {n}s`,"wakeup.scheduledAt":`Prossimo risveglio alle {time}`,"wakeup.firing":`Risveglio in corso...`,"wakeup.reason":`Motivo: {reason}`,"wakeup.cancel":`Annulla questo risveglio`,"wakeup.pendingIndicator":`Risveglio programmato`,"workspaceList.prOpen":`Pull request aperta`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Avvia l'auto-loop`,"autoLoop.prepare":`Prepara per l'auto-loop`,"autoLoop.prepareBusy":`Attendi che l'agente finisca prima di preparare`,"autoLoop.forceReady":`So cosa faccio — salta la preparazione`,"autoLoop.forceReadyConfirm":`Saltare la preparazione e segnare auto-loop pronto? Il loop potrebbe bloccarsi se le attività non sono atomiche.`,"autoLoop.stop":`Ferma l'auto-loop`,"autoLoop.notReady":`Esegui prima «Prepara per l'auto-loop»`,"autoLoop.noTasks":`Aggiungi prima delle attività`,"autoLoop.progress":`Auto-loop · {done}/{total} attività`,"autoLoop.preparing":`Auto-loop · preparazione`,"autoLoop.preparingTooltip":`Grooming in corso — l'agente sta creando / revisionando le attività. Il loop partirà quando chiamerà mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop in corso`,"autoLoop.startInMode":`Avvia in modalità auto-loop`,"koboCommand.prepAutoloopDesc":`Preparare le attività per la modalità auto-loop (atomicità)`,"staleSessionBanner.title":`Auto-loop in corso`,"staleSessionBanner.message":`Stai visualizzando una sessione precedente — l'agente sta lavorando nella più recente.`,"staleSessionBanner.switchToCurrent":`Passa a quella corrente`},sn=`kobo:locale`,cn=[`en`,`fr`,`de`,`es`,`it`];function ln(e){return cn.includes(e)}function un(){let e=localStorage.getItem(sn);if(e&&ln(e))return e;let t=navigator.language.split(`-`)[0];return t&&ln(t)?(localStorage.setItem(sn,t),t):(localStorage.setItem(sn,`en`),`en`)}var dn=Ue({legacy:!1,locale:un(),fallbackLocale:`en`,messages:{en:nn,fr:an,de:tn,es:rn,it:on}}),fn=ue(`agent-stream`,()=>{let e=s(new Map),t=s(new Map),n=s(new Map),r=s(new Map),i=s(new Map),a=s(new Map),o=s(0);function c(t){return o.value,e.value.get(t)??[]}function l(e){return o.value,t.value.get(e)??[]}function u(e){return o.value,n.value.get(e)??[]}function d(e){return o.value,r.value.get(e)??[]}function f(e){return o.value,i.value.get(e)}function p(e){return o.value,a.value.get(e)??!0}function m(a,s,c,l,u){let d=e.value.get(a)??[],f=t.value.get(a)??[],p=n.value.get(a)??[],m=r.value.get(a)??[],h=d.length===0;d.push(s),f.push(c??new Date().toISOString()),p.push(u??null),m.push(l??null),e.value.set(a,d),t.value.set(a,f),n.value.set(a,p),r.value.set(a,m),h&&l&&i.value.set(a,l),o.value++}function h(s,c,l,u){e.value.set(s,[...c]),t.value.set(s,l?[...l]:c.map(()=>new Date().toISOString())),n.value.set(s,u?.sessionIds?[...u.sessionIds]:c.map(()=>null)),r.value.set(s,u?.eventIds?[...u.eventIds]:c.map(()=>null)),u?.oldestId?i.value.set(s,u.oldestId):i.value.delete(s),u&&typeof u.hasMoreOlder==`boolean`?a.value.set(s,u.hasMoreOlder):a.value.delete(s),o.value++}function g(s,c,l,u){if(c.length===0){a.value.set(s,u.hasMoreOlder),o.value++;return}let d=e.value.get(s)??[],f=t.value.get(s)??[],p=n.value.get(s)??[],m=r.value.get(s)??[],h=u.sessionIds??c.map(()=>null),g=u.eventIds??c.map(()=>null);e.value.set(s,[...c,...d]),t.value.set(s,[...l,...f]),n.value.set(s,[...h,...p]),r.value.set(s,[...g,...m]),u.oldestId&&i.value.set(s,u.oldestId),a.value.set(s,u.hasMoreOlder),o.value++}function _(s){e.value.delete(s),t.value.delete(s),n.value.delete(s),r.value.delete(s),i.value.delete(s),a.value.delete(s),o.value++}return{events:e,timestamps:t,sessionIds:n,eventIds:r,version:o,eventsFor:c,timestampsFor:l,sessionIdsFor:u,eventIdsFor:d,oldestIdFor:f,hasMoreOlderFor:p,append:m,reset:h,prepend:g,clear:_}}),pn=null;function mn(){return pn||=new Audio(`/notification.mp3`),pn}function hn(){`Notification`in window&&Notification.permission===`default`&&Notification.requestPermission()}function gn(e,t,n){let r=Ne();if(!document.hasFocus()&&r.global.browserNotifications&&`Notification`in window&&Notification.permission===`granted`){let r=new Notification(e,{body:t,icon:`/favicon.ico`});n&&(r.onclick=()=>{window.focus(),window.location.hash=`#/workspace/${n}`,r.close()})}if(r.global.audioNotifications){let e=mn();e.currentTime=0,e.play().catch(()=>{})}}var _n=ue(`devServer`,{state:()=>({statuses:{},logs:{}}),getters:{getStatus:e=>t=>e.statuses[t]??null},actions:{async fetchStatus(e){try{let t=await fetch(`/api/dev-server/${e}/status`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){console.error(`[dev-server store] fetchStatus failed:`,e)}},async startDevServer(e){try{let t=await fetch(`/api/dev-server/${e}/start`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){throw console.error(`[dev-server store] startDevServer failed:`,e),e}},async stopDevServer(e){try{let t=await fetch(`/api/dev-server/${e}/stop`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.statuses[e]=n}catch(e){throw console.error(`[dev-server store] stopDevServer failed:`,e),e}},async fetchLogs(e,t=200){try{let n=await fetch(`/api/dev-server/${e}/logs?tail=${t}`);if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json();return this.logs[e]=r.logs,r.logs}catch(e){return console.error(`[dev-server store] fetchLogs failed:`,e),``}},updateFromWsEvent(e,t){this.statuses[e]=t}}}),vn=[`executing`,`extracting`,`brainstorming`];function yn(e){return!!e&&vn.includes(e)}function bn(e){"@babel/helpers - typeof";return bn=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},bn(e)}function xn(e,t){if(bn(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(bn(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Sn(e){var t=xn(e,`string`);return bn(t)==`symbol`?t:t+``}function Cn(e,t,n){return(t=Sn(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var wn=class extends Error{constructor(e,t){super(e),Cn(this,`code`,void 0),this.name=`WorkspaceActionError`,this.code=t}},Tn=5e3,En=500,Dn=null;function On(e){return e===`claude-code`?`claude-code`:null}var kn=ue(`workspace`,{state:()=>({workspaces:[],selectedWorkspaceId:null,tasks:[],activityFeeds:{},activityFeedIds:{},activityCounts:{},subagents:{},agentTodos:{},sessions:[],selectedSessionId:null,archivedWorkspaces:[],archivedLoaded:!1,loading:!1,loadingOlderEvents:!1,hasMoreEvents:{},usageStats:{},rateLimitUsage:{},providerUsage:{},chatDraft:``,queuedMessages:{},gitRefreshTrigger:0,gitStatsCache:{},pendingWakeups:{},prStates:{},autoLoopStates:{}}),getters:{selectedWorkspace:e=>e.workspaces.find(t=>t.id===e.selectedWorkspaceId)??null,needsAttention:e=>e.workspaces.filter(e=>[`error`,`quota`].includes(e.status)),running:e=>e.workspaces.filter(e=>yn(e.status)),idle:e=>e.workspaces.filter(e=>[`completed`,`idle`,`created`].includes(e.status)),favorites(e){return e.workspaces.filter(e=>e.favoritedAt!==null)},currentAgentTodos:e=>e.selectedWorkspaceId?e.agentTodos[e.selectedWorkspaceId]??[]:[],currentSubagents:e=>{if(!e.selectedWorkspaceId)return[];let t=e.subagents[e.selectedWorkspaceId]??{};return Object.values(t).sort((e,t)=>e.startedAt.localeCompare(t.startedAt))},activityFeed:e=>{if(!e.selectedWorkspaceId)return[];let t=e.activityFeeds[e.selectedWorkspaceId]??[];if(!e.selectedSessionId)return e.sessions.length===0?t:[];let n=e.sessions.find(t=>t.id===e.selectedSessionId)?.engineSessionId??null,r=e.sessions.length>0?e.sessions[e.sessions.length-1].id:null,i=e.selectedSessionId===r;return t.filter(t=>t.sessionId?t.sessionId===e.selectedSessionId||n!==null&&t.sessionId===n:i)},acceptanceCriteria:e=>e.tasks.filter(e=>e.isAcceptanceCriterion),archived:e=>e.archivedWorkspaces,currentProviderUsage(e){let t=e.workspaces.find(t=>t.id===e.selectedWorkspaceId);if(!t)return null;let n=On(t.engine);return n?e.providerUsage[n]??null:null}},actions:{async toggleFavorite(e){let t=this.workspaces.find(t=>t.id===e);if(!t)return;let n=t.favoritedAt,r=n===null,i=r?new Date().toISOString():null;this.workspaces=this.workspaces.map(t=>t.id===e?{...t,favoritedAt:i}:t);try{let t=await fetch(`/api/workspaces/${e}/favorite`,{method:r?`POST`:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();this.workspaces=this.workspaces.map(t=>t.id===e?n:t)}catch(t){throw this.workspaces=this.workspaces.map(t=>t.id===e?{...t,favoritedAt:n}:t),t}},async setWorkspaceTags(e,t){let n=this.workspaces.find(t=>t.id===e);if(!n)return;let r=n.tags,i=[...t];this.workspaces=this.workspaces.map(t=>t.id===e?{...t,tags:i}:t);try{let n=await fetch(`/api/workspaces/${e}/tags`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tags:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json();this.workspaces=this.workspaces.map(t=>t.id===e?r:t)}catch(t){throw this.workspaces=this.workspaces.map(t=>t.id===e?{...t,tags:r}:t),t}},async fetchOrphanWorktrees(e){let t=`/api/git/orphan-worktrees?projectPath=${encodeURIComponent(e)}`,n=await fetch(t,{cache:`no-store`});if(!n.ok)throw Error(`HTTP ${n.status}`);return n.json()},async fetchWorkspaces(){this.loading=!0;try{let e=await fetch(`/api/workspaces`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();this.workspaces=t.workspaces??t;for(let e of this.workspaces)[`completed`,`idle`,`error`,`quota`].includes(e.status)&&this.finalizeRunningSubagents(e.id)}catch(e){console.error(`[workspace store] fetchWorkspaces failed:`,e)}finally{this.loading=!1}},async fetchArchivedWorkspaces(){try{let e=await fetch(`/api/workspaces/archived`);if(!e.ok)throw Error(`HTTP ${e.status}`);this.archivedWorkspaces=await e.json(),this.archivedLoaded=!0}catch(e){console.error(`[workspace store] fetchArchivedWorkspaces failed:`,e)}},async fetchWorkspaceDetails(e){try{let t=await fetch(`/api/workspaces/${e}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();if(this.selectedWorkspaceId!==e)return;let r=this.workspaces.findIndex(t=>t.id===e);r>=0&&(this.workspaces[r]={...this.workspaces[r],...n.workspace??n}),n.tasks&&(this.tasks=n.tasks)}catch(e){console.error(`[workspace store] fetchWorkspaceDetails failed:`,e)}},async createWorkspace(e){try{let t=await fetch(`/api/workspaces`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json(),r=n.workspace??n;return this.workspaces.push(r),e.autoLoop&&this.fetchAutoLoopStates(),r}catch(e){throw console.error(`[workspace store] createWorkspace failed:`,e),e}},async startWorkspace(e,t,n,r){try{let i=await fetch(`/api/workspaces/${e}/start`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:t,agentSessionId:n,resume:r})});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error??`HTTP ${i.status}`)}await this.fetchWorkspaces()}catch(e){throw console.error(`[workspace store] startWorkspace failed:`,e),e}},async stopWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/stop`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);await this.fetchWorkspaces()}catch(e){throw console.error(`[workspace store] stopWorkspace failed:`,e),e}},async interruptAgent(e){try{let t=await fetch(`/api/workspaces/${e}/interrupt`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}}catch(e){throw console.error(`[workspace store] interruptAgent failed:`,e),e}},async deleteWorkspace(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t??{})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=[];if(n.status===200){let e=await n.json().catch(()=>({}));r=Array.isArray(e.warnings)?e.warnings:[]}return this.workspaces=this.workspaces.filter(t=>t.id!==e),this.archivedWorkspaces=this.archivedWorkspaces.filter(t=>t.id!==e),delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e],delete this.subagents[e],delete this.agentTodos[e],delete this.usageStats[e],delete this.rateLimitUsage[e],this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]),{warnings:r}}catch(e){throw console.error(`[workspace store] deleteWorkspace failed:`,e),e}},async updateModel(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({model:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updateModel failed:`,e),e}},async updateReasoningEffort(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({reasoningEffort:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updateReasoningEffort failed:`,e),e}},async renameWorkspaceBranch(e,t){let n=await fetch(`/api/workspaces/${e}/rename-branch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({newName:t})}),r=await n.json().catch(()=>null);if(!n.ok)throw new wn(r?.error??`Rename failed`,r?.code);let i=r,a=this.workspaces.findIndex(t=>t.id===e);return a>=0&&(this.workspaces[a]=i),i},async resyncWorkspaceBranch(e){let t=await fetch(`/api/workspaces/${e}/resync-branch`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();if(n.changed){let t=this.workspaces.findIndex(t=>t.id===e);t>=0&&(this.workspaces[t]={...this.workspaces[t],workingBranch:n.workingBranch})}return n},async updatePermissionMode(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({permissionMode:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updatePermissionMode failed:`,e),e}},async updatePermissionProfile(e,t){try{let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({permissionProfile:t})});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]=r)}catch(e){throw console.error(`[workspace store] updatePermissionProfile failed:`,e),e}},async pushBranch(e,t={}){let n=await fetch(`/api/workspaces/${e}/push`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({force:t.force===!0})});if(!n.ok){let e=await n.json().catch(()=>({error:`Push failed`}));throw new wn(e.error??`Push failed`,e.code)}},async pullBranch(e){let t=await fetch(`/api/workspaces/${e}/pull`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({error:`Pull failed`}));throw new wn(e.error??`Pull failed`,e.code)}},async fetchGitStats(e){let t=await fetch(`/api/workspaces/${e}/git-stats`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();return this.gitStatsCache[e]=n,n},async openPullRequest(e){let t=await fetch(`/api/workspaces/${e}/open-pr`,{method:`POST`}),n=await t.json().catch(()=>null);if(!t.ok)throw new wn(n?.error??`Open PR failed`,n?.code);return n},async archiveWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/archive`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();return this.workspaces=this.workspaces.filter(t=>t.id!==e),this.archivedLoaded&&this.archivedWorkspaces.unshift(n),this.selectedWorkspaceId===e&&(this.selectedWorkspaceId=null,this.tasks=[]),n}catch(e){throw console.error(`[workspace store] archiveWorkspace failed:`,e),e}},async unarchiveWorkspace(e){try{let t=await fetch(`/api/workspaces/${e}/unarchive`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();return this.archivedWorkspaces=this.archivedWorkspaces.filter(t=>t.id!==e),this.workspaces.unshift(n),n}catch(e){throw console.error(`[workspace store] unarchiveWorkspace failed:`,e),e}},async createTask(e,t,n){try{let r=await fetch(`/api/workspaces/${e}/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:t,isAcceptanceCriterion:n})});if(!r.ok)throw Error(`HTTP ${r.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] createTask failed:`,e),e}},async updateTaskTitle(e,t,n){try{let r=await fetch(`/api/workspaces/${e}/tasks/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:n})});if(!r.ok)throw Error(`HTTP ${r.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] updateTaskTitle failed:`,e),e}},async deleteTask(e,t){try{let n=await fetch(`/api/workspaces/${e}/tasks/${t}`,{method:`DELETE`});if(!n.ok)throw Error(`HTTP ${n.status}`);await this.fetchWorkspaceDetails(e)}catch(e){throw console.error(`[workspace store] deleteTask failed:`,e),e}},selectWorkspace(e){this.selectedWorkspaceId=e,this.selectedSessionId=null,this.tasks=[],this.markRead(e),this.fetchWorkspaceDetails(e),this.fetchSessions(e),this.fetchGitStats(e).catch(()=>{}),this.activityFeeds[e]?.length||Ln().subscribe(e)},async fetchSessions(e,t){try{let n=await fetch(`/api/workspaces/${e}/sessions`);if(!n.ok)throw Error(`HTTP ${n.status}`);if(this.selectedWorkspaceId!==e)return;if(this.sessions=await n.json(),t&&this.sessions.some(e=>e.id===t)){this.selectSession(t);return}let r=this.selectedSessionId&&this.sessions.some(e=>e.id===this.selectedSessionId);if(this.sessions.length>0&&!r){let t=localStorage.getItem(`kobo:session:${e}`),n=t?this.sessions.find(e=>e.id===t):null;this.selectSession(n?n.id:this.sessions[0].id)}}catch(e){console.error(`[workspace store] fetchSessions failed:`,e)}},async fetchOlderEvents(e){if(this.loadingOlderEvents||this.hasMoreEvents[e]===!1)return!1;let t=this.activityFeeds[e];if(!t?.length)return!1;let n=t[0].id;this.loadingOlderEvents=!0;try{let t=await fetch(`/api/workspaces/${e}/events?before=${encodeURIComponent(n)}&limit=100`);if(!t.ok)throw Error(`HTTP ${t.status}`);let r=await t.json();if(this.hasMoreEvents[e]=r.hasMore,r.events.length>0){let e=Ln();for(let t of r.events)e._routeMessage(t)}return r.events.length>0}catch(e){return console.error(`[workspace store] fetchOlderEvents failed:`,e),!1}finally{this.loadingOlderEvents=!1}},selectSession(e){this.selectedSessionId=e,this.selectedWorkspaceId&&localStorage.setItem(`kobo:session:${this.selectedWorkspaceId}`,e)},async createSession(e){try{let t=await fetch(`/api/workspaces/${e}/sessions`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}let n=await t.json();return this.sessions.unshift(n),this.selectSession(n.id),n}catch(e){throw console.error(`[workspace store] createSession failed:`,e),e}},async renameWorkspace(e,t){let n=await fetch(`/api/workspaces/${e}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}let r=await n.json(),i=this.workspaces.findIndex(t=>t.id===e);i>=0&&(this.workspaces[i]={...this.workspaces[i],...r});let a=this.archivedWorkspaces.findIndex(t=>t.id===e);a>=0&&(this.archivedWorkspaces[a]={...this.archivedWorkspaces[a],...r})},async renameSession(e,t,n){let r=await fetch(`/api/workspaces/${e}/sessions/${t}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:n})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`HTTP ${r.status}`)}let i=await r.json().catch(()=>null),a=this.sessions.find(e=>e.id===t);a&&(a.name=i?.name??n)},addActivityItem(e,t){if(this.activityFeeds[e]||(this.activityFeeds[e]=[]),this.activityFeedIds[e]||(this.activityFeedIds[e]=new Set),this.activityCounts[e]||(this.activityCounts[e]={toolUses:0,agentMessages:0,userMessages:0,errors:0}),t.meta?.sender!==`user`&&t.meta?.sender!==`system-prompt`)for(let t of this.activityFeeds[e])t.meta?.pending&&(t.meta.pending=!1);if(!this.activityFeedIds[e].has(t.id)){this.activityFeedIds[e].add(t.id),this.activityFeeds[e].push(t);let n=this.activityCounts[e];t.type===`tool_use`?n.toolUses++:t.type===`error`&&n.errors++,t.meta?.sender===`user`?n.userMessages++:t.type===`text`&&t.meta?.sender!==`system-prompt`&&n.agentMessages++}let n=this.activityFeeds[e];if(n.length>Tn){let t=n.splice(0,n.length-Tn),r=this.activityFeedIds[e];for(let e of t)r.delete(e.id)}},removeActivityItem(e,t){let n=this.activityFeeds[e],r=this.activityFeedIds[e];if(!n||!r)return;let i=n.findIndex(e=>e.id===t);if(i<0)return;let[a]=n.splice(i,1);r.delete(t);let o=this.activityCounts[e];o&&a&&(a.type===`tool_use`?o.toolUses=Math.max(0,o.toolUses-1):a.type===`error`&&(o.errors=Math.max(0,o.errors-1)),a.meta?.sender===`user`?o.userMessages=Math.max(0,o.userMessages-1):a.type===`text`&&a.meta?.sender!==`system-prompt`&&(o.agentMessages=Math.max(0,o.agentMessages-1)))},clearActivityFeed(e){e?(delete this.activityFeeds[e],delete this.activityFeedIds[e],delete this.activityCounts[e]):(this.activityFeeds={},this.activityFeedIds={},this.activityCounts={})},addUsageStats(e,t){this.usageStats[e]||(this.usageStats[e]={inputTokens:0,outputTokens:0,costUsd:0,sessionCount:0});let n=this.usageStats[e];n.inputTokens+=t.inputTokens??0,n.outputTokens+=t.outputTokens??0,n.costUsd+=t.costUsd??0,n.sessionCount++},setRateLimitUsage(e,t){if(typeof t.updatedAt==`string`){this.rateLimitUsage[e]=t;return}let n=t;this.rateLimitUsage[e]={updatedAt:new Date().toISOString(),buckets:n.buckets.map(e=>({id:e.id,label:e.label,usedPct:e.usedPct,resetAt:e.resetsAt,details:e.details}))}},applyUsageSnapshot(e){this.providerUsage[e.providerId]=e.snapshot},async requestUsageRefresh(e){try{await fetch(`/api/usage/${e}/refresh`,{method:`POST`})}catch(e){console.error(`[workspace store] requestUsageRefresh failed:`,e)}},triggerGitRefresh(){this.gitRefreshTrigger++,this.schedulePrStatesRefresh()},schedulePrStatesRefresh(){Dn!==null&&clearTimeout(Dn),Dn=setTimeout(()=>{Dn=null,this.fetchPrStates()},En)},async fetchPrStates(){try{let e=await fetch(`/api/workspaces/pr-states`,{cache:`no-store`});if(!e.ok)return;this.prStates=await e.json()}catch(e){console.error(`[workspace-store] fetchPrStates failed:`,e)}},async fetchAutoLoopStates(){try{let e=await fetch(`/api/workspaces/auto-loop-states`,{cache:`no-store`});if(!e.ok)return;this.autoLoopStates=await e.json()}catch(e){console.error(`[workspace-store] fetchAutoLoopStates failed:`,e)}},async enableAutoLoop(e){let t=this.workspaces.find(t=>t.id===e);if(t&&t.permissionMode!==`auto-accept`)try{await this.updatePermissionMode(e,`auto-accept`)}catch{}let n=await fetch(`/api/workspaces/${e}/auto-loop`,{method:`POST`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`HTTP ${n.status}`)}await this.fetchAutoLoopStates()},async disableAutoLoop(e){let t=await fetch(`/api/workspaces/${e}/auto-loop`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}await this.fetchAutoLoopStates()},async forceAutoLoopReady(e){let t=await fetch(`/api/workspaces/${e}/auto-loop-ready`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);await this.fetchAutoLoopStates()},setAutoLoopState(e,t){this.autoLoopStates[e]=t},clearAutoLoopState(e){delete this.autoLoopStates[e]},async fetchPendingWakeup(e){try{let t=await fetch(`/api/workspaces/${e}/pending-wakeup`,{cache:`no-store`});if(!t.ok)return;let n=await t.json();n?this.pendingWakeups[e]=n:delete this.pendingWakeups[e]}catch(e){console.error(`[workspace-store] fetchPendingWakeup failed:`,e)}},setPendingWakeup(e,t){this.pendingWakeups[e]=t},clearPendingWakeup(e){delete this.pendingWakeups[e]},async cancelPendingWakeup(e){let t=this.pendingWakeups[e]!==void 0;delete this.pendingWakeups[e];try{let t=await fetch(`/api/workspaces/${e}/pending-wakeup`,{method:`DELETE`});if(!t.ok)throw Error(`HTTP ${t.status}`)}catch(n){console.error(`[workspace-store] cancelPendingWakeup failed:`,n),t&&await this.fetchPendingWakeup(e)}},updateAgentTodos(e,t){this.agentTodos[e]=t},finalizeRunningSubagents(e){let t=this.subagents[e];if(!t)return;let n=new Date().toISOString();for(let e of Object.keys(t)){let r=t[e];r.status===`running`&&(t[e]={...r,status:`done`,updatedAt:n})}},upsertSubagent(e,t){this.subagents[e]||(this.subagents[e]={});let n=this.subagents[e][t.toolUseId],r=new Date().toISOString(),i=n?.status===`done`?`done`:t.status??n?.status??`running`;this.subagents[e][t.toolUseId]={toolUseId:t.toolUseId,description:t.description??n?.description??``,taskType:t.taskType??n?.taskType,status:i,lastToolName:t.lastToolName??n?.lastToolName,lastDescription:t.lastDescription??n?.lastDescription,totalTokens:t.totalTokens??n?.totalTokens,toolUses:t.toolUses??n?.toolUses,durationMs:t.durationMs??n?.durationMs,startedAt:n?.startedAt??r,updatedAt:r}},async markRead(e){try{let t=await fetch(`/api/workspaces/${e}/mark-read`,{method:`POST`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=this.workspaces.findIndex(t=>t.id===e);n>=0&&(this.workspaces[n]={...this.workspaces[n],hasUnread:!1})}catch(e){console.error(`[workspace store] markRead failed:`,e)}},queueMessage(e,t,n){this.queuedMessages[e]={content:t,sessionId:n}},cancelQueuedMessage(e){delete this.queuedMessages[e]},updateWorkspaceFromEvent(e,t){let n=this.workspaces.findIndex(t=>t.id===e);if(n>=0&&(this.workspaces[n]={...this.workspaces[n],...t}),t.status&&[`completed`,`idle`,`error`,`quota`].includes(t.status)){let n=this.activityFeeds[e];if(n)for(let e of n)e.meta?.pending&&(e.meta.pending=!1);let r=this.subagents[e];if(r)for(let[e,t]of Object.entries(r))t.status===`running`&&(r[e]={...t,status:`done`});let i=this.queuedMessages[e];(t.status===`completed`||t.status===`idle`)&&i&&(delete this.queuedMessages[e],Ln().sendChatMessage(e,i.content,i.sessionId),this.addActivityItem(e,{id:`user-${Date.now()}`,type:`text`,content:i.content,timestamp:new Date().toISOString(),sessionId:i.sessionId,meta:{sender:`user`,pending:!0}}))}}}}),An=dn.global.t,W=null,jn=null,Mn=0,Nn=!1;function Pn(e){Nn=e}function Fn(e,t,n){if(t.kind!==`session:started`)return;let r=kn(),i=r.workspaces.find(t=>t.id===e);i&&(i.status===`completed`||i.status===`idle`||i.status===`error`||i.status===`quota`)&&r.updateWorkspaceFromEvent(e,{status:`executing`}),!Nn&&n&&r.selectedWorkspaceId===e&&r.selectedSessionId!==n&&r.fetchSessions(e,n).catch(e=>{console.error(`[websocket] fetchSessions on session:started failed:`,e)})}function In(e,t,n,r,i){fn().append(e,t,n,r,i),Fn(e,t,i??void 0);let a=kn();if(t.kind===`usage`){a.addUsageStats(e,{inputTokens:t.inputTokens,outputTokens:t.outputTokens,costUsd:t.costUsd??0});return}if(t.kind===`rate_limit`){a.setRateLimitUsage(e,t.info);return}if(t.kind===`subagent:progress`){a.upsertSubagent(e,{toolUseId:t.toolCallId,status:t.status,description:t.description,taskType:t.taskType,lastToolName:t.lastToolName,totalTokens:t.totalTokens,toolUses:t.toolUses,durationMs:t.durationMs});return}if(t.kind===`tool:call`&&t.name===`TodoWrite`){let n=t.input?.todos;Array.isArray(n)&&a.updateAgentTodos(e,n.map(e=>({content:typeof e.content==`string`?e.content:``,status:typeof e.status==`string`?e.status:`pending`,activeForm:typeof e.activeForm==`string`?e.activeForm:void 0})));return}if(t.kind===`tool:call`&&t.name===`Bash`){let n=t.input,r=`${n?.command??``} ${n?.description??``}`;/\bgit\b|commit|push|pull|merge|rebase|checkout|branch/i.test(r)&&a.triggerGitRefresh(),/\bgit\s+branch\s+-m\b/i.test(r)&&setTimeout(()=>{a.resyncWorkspaceBranch(e).catch(e=>{console.error(`[websocket] Branch resync failed:`,e)})},2500),/\bgh\s+pr\s+create\b/i.test(r)&&setTimeout(()=>a.triggerGitRefresh(),3e3)}if(t.kind===`tool:call`&&t.name===`ExitPlanMode`&&a.workspaces.find(t=>t.id===e)?.permissionMode===`plan`&&(a.updateWorkspaceFromEvent(e,{permissionMode:`auto-accept`}),a.updatePermissionMode(e,`auto-accept`).catch(e=>{console.error(`[websocket] failed to persist ExitPlanMode flip:`,e)})),t.kind!==`session:started`){if(t.kind===`session:ended`){let n=a.workspaces.find(t=>t.id===e)?.status===`quota`?`quota`:t.reason===`completed`?`completed`:t.reason===`error`?`error`:`idle`;if(a.updateWorkspaceFromEvent(e,{status:n}),a.finalizeRunningSubagents(e),a.fetchWorkspaces(),!Nn&&t.reason!==`killed`){let n=a.workspaces.find(t=>t.id===e)?.name??``;gn(t.reason===`error`?An(`notification.agentError`,{name:n}):An(`notification.agentFinished`,{name:n}),void 0,e)}return}t.kind===`error`&&t.category===`quota`&&(a.updateWorkspaceFromEvent(e,{status:`quota`}),a.fetchWorkspaces())}}var Ln=ue(`websocket`,{state:()=>({connected:!1,lastEventId:null,_replaying:!1}),actions:{connect(){if(W)return;let e=`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/ws`,t=new WebSocket(e);W=t,t.addEventListener(`open`,()=>{this.connected=!0,Mn=0;let e=kn().workspaces.map(e=>e.id);for(let t of e)this._send({type:`subscribe`,payload:{workspaceId:t}});this.lastEventId&&this._send({type:`sync:request`,payload:{lastEventId:this.lastEventId,workspaceIds:e}})}),t.addEventListener(`message`,e=>{try{let t=JSON.parse(e.data);this._routeMessage(t)}catch{}}),t.addEventListener(`close`,()=>{this.connected=!1,W=null,this._scheduleReconnect()}),t.addEventListener(`error`,()=>{})},disconnect(){jn&&=(clearTimeout(jn),null),W&&=(W.close(),null),this.connected=!1},subscribe(e){this._send({type:`subscribe`,payload:{workspaceId:e}}),this._send({type:`sync:request`,payload:{workspaceIds:[e]}})},unsubscribe(e){this._send({type:`unsubscribe`,payload:{workspaceId:e}})},sendChatMessage(e,t,n,r){this._send({type:`chat:message`,payload:{workspaceId:e,content:t,sessionId:n,permissionModeOverride:r}});let i=kn(),a=i.workspaces.find(t=>t.id===e);a&&(a.status===`completed`||a.status===`idle`||a.status===`error`||a.status===`quota`)&&i.updateWorkspaceFromEvent(e,{status:`executing`})},_send(e){W&&W.readyState===WebSocket.OPEN&&W.send(JSON.stringify(e))},isConnected(){return W!==null&&W.readyState===WebSocket.OPEN},_scheduleReconnect(){if(jn)return;let e=Math.min(1e3*2**Mn,3e4);Mn++,jn=setTimeout(()=>{jn=null,this.connect()},e)},_routeMessage(e){let t=kn();e.id?this.lastEventId=e.id:e.eventId&&(this.lastEventId=e.eventId);let n=e.payload??{},r=e.workspaceId??n.workspaceId??``;switch(e.type){case`agent:event`:{if(!r)break;let t=e.createdAt;In(r,n,t,e.id??e.eventId,e.sessionId??null);break}case`agent:progress`:n.tasks&&Array.isArray(n.tasks)&&(t.tasks=n.tasks);break;case`user:message`:if(r&&n.content){let i=n.content,a=n.sender??`user`,o=e.sessionId,s=e.id??e.eventId??`user-${Date.now()}`,c=e.createdAt??new Date().toISOString(),l=t.activityFeeds[r]??[];if(a===`user`&&l.some(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending)){let e=l.findIndex(e=>e.meta?.sender===`user`&&e.content===i&&e.meta?.pending);e>=0&&(l[e]={...l[e],id:s,sessionId:o})}else t.addActivityItem(r,{id:s,type:`text`,content:i,timestamp:c,sessionId:o,meta:{sender:a}})}break;case`sync:response`:this._replaying=!0,Pn(!0);try{let e=n.events??[],t=new Map;for(let n of e)if(n.type!==`sync:response`){if(n.type===`agent:event`&&n.workspaceId){let e=t.get(n.workspaceId)??{events:[],timestamps:[],sessionIds:[],eventIds:[],oldestId:void 0};e.events.push(n.payload),e.timestamps.push(n.createdAt),e.sessionIds.push(n.sessionId??null),e.eventIds.push(n.id??null),e.oldestId||=n.id,t.set(n.workspaceId,e);continue}this._routeMessage(n)}if(t.size>0){let e=fn();for(let[n,{events:r,timestamps:i,sessionIds:a,eventIds:o,oldestId:s}]of t){e.reset(n,r,i,{oldestId:s,hasMoreOlder:!0,sessionIds:a,eventIds:o});for(let e of r)if(e.kind===`usage`||e.kind===`rate_limit`||e.kind===`subagent:progress`){let t=kn();e.kind===`usage`?t.addUsageStats(n,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,costUsd:e.costUsd??0}):e.kind===`rate_limit`?t.setRateLimitUsage(n,e.info):e.kind===`subagent:progress`&&t.upsertSubagent(n,{toolUseId:e.toolCallId,status:e.status,description:e.description,taskType:e.taskType,lastToolName:e.lastToolName,totalTokens:e.totalTokens,toolUses:e.toolUses,durationMs:e.durationMs})}}}}finally{this._replaying=!1,Pn(!1)}break;case`usage:snapshot`:{let e=n;e.providerId&&e.snapshot&&t.applyUsageSnapshot({providerId:e.providerId,snapshot:e.snapshot});break}case`devserver:status`:{let e=_n();r&&e.updateFromWsEvent(r,n);break}case`task:updated`:r&&t.fetchWorkspaceDetails(r);break;case`setup:output`:t.addActivityItem(r,{id:e.id??`setup-${Date.now()}`,type:`text`,content:e.payload?.text??``,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`setup`}});break;case`setup:complete`:t.addActivityItem(r,{id:e.id??`setup-complete-${Date.now()}`,type:`text`,content:`[setup] Complete`,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`setup`}});break;case`setup:error`:t.addActivityItem(r,{id:e.id??`setup-error-${Date.now()}`,type:`text`,content:`[setup] Error: ${e.payload?.message??`unknown`}`,timestamp:e.createdAt??new Date().toISOString(),meta:{sender:`error`}});break;case`workspace:unread`:if(r){let e=n.hasUnread??!1;t.updateWorkspaceFromEvent(r,{hasUnread:e})}break;case`workspace:archived`:case`workspace:unarchived`:t.fetchWorkspaces(),t.archivedLoaded&&t.fetchArchivedWorkspaces();break;case`wakeup:scheduled`:if(r){let e=n;typeof e.targetAt==`string`&&t.setPendingWakeup(r,{targetAt:e.targetAt,reason:e.reason})}break;case`wakeup:cancelled`:case`wakeup:fired`:case`wakeup:skipped`:r&&t.clearPendingWakeup(r);break;case`autoloop:enabled`:case`autoloop:disabled`:case`autoloop:iteration-started`:case`autoloop:ready-flipped`:t.fetchAutoLoopStates();break;case`migration:progress`:case`migration:error`:Kt().update(n);break}}}}),Rn=C({__name:`App`,setup(e){let t=Ln(),r=en();return a(()=>{t.connect(),r.fetchTemplates(),hn()}),o(()=>{t.disconnect()}),(e,t)=>{let r=c(`router-view`);return n(),y(b,null,[_(r),_($t)],64)}}});function zn(e){return e}function Bn(e){return e}function Vn(e){return e}var Hn=Vn(()=>fe()),Un=typeof document<`u`;function Wn(e){return typeof e==`object`||`displayName`in e||`props`in e||`__vccOpts`in e}function Gn(e){return e.__esModule||e[Symbol.toStringTag]===`Module`||e.default&&Wn(e.default)}var G=Object.assign;function Kn(e,t){let n={};for(let r in t){let i=t[r];n[r]=K(i)?i.map(e):e(i)}return n}var qn=()=>{},K=Array.isArray;function Jn(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var Yn=/#/g,Xn=/&/g,Zn=/\//g,Qn=/=/g,$n=/\?/g,er=/\+/g,tr=/%5B/g,nr=/%5D/g,rr=/%5E/g,ir=/%60/g,ar=/%7B/g,or=/%7C/g,sr=/%7D/g,cr=/%20/g;function lr(e){return e==null?``:encodeURI(``+e).replace(or,`|`).replace(tr,`[`).replace(nr,`]`)}function ur(e){return lr(e).replace(ar,`{`).replace(sr,`}`).replace(rr,`^`)}function dr(e){return lr(e).replace(er,`%2B`).replace(cr,`+`).replace(Yn,`%23`).replace(Xn,`%26`).replace(ir,"`").replace(ar,`{`).replace(sr,`}`).replace(rr,`^`)}function fr(e){return dr(e).replace(Qn,`%3D`)}function pr(e){return lr(e).replace(Yn,`%23`).replace($n,`%3F`)}function mr(e){return pr(e).replace(Zn,`%2F`)}function hr(e){if(e==null)return null;try{return decodeURIComponent(``+e)}catch{}return``+e}var gr=/\/$/,_r=e=>e.replace(gr,``);function vr(e,t,n=`/`){let r,i={},a=``,o=``,s=t.indexOf(`#`),c=t.indexOf(`?`);return c=s>=0&&c>s?-1:c,c>=0&&(r=t.slice(0,c),a=t.slice(c,s>0?s:t.length),i=e(a.slice(1))),s>=0&&(r||=t.slice(0,s),o=t.slice(s,t.length)),r=Er(r??t,n),{fullPath:r+a+o,path:r,query:i,hash:hr(o)}}function yr(e,t){let n=t.query?e(t.query):``;return t.path+(n&&`?`)+n+(t.hash||``)}function br(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||`/`}function xr(e,t,n){let r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&Sr(t.matched[r],n.matched[i])&&Cr(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Sr(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Cr(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!wr(e[n],t[n]))return!1;return!0}function wr(e,t){return K(e)?Tr(e,t):K(t)?Tr(t,e):e?.valueOf()===t?.valueOf()}function Tr(e,t){return K(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function Er(e,t){if(e.startsWith(`/`))return e;if(!e)return t;let n=t.split(`/`),r=e.split(`/`),i=r[r.length-1];(i===`..`||i===`.`)&&r.push(``);let a=n.length-1,o,s;for(o=0;o<r.length;o++)if(s=r[o],s!==`.`)if(s===`..`)a>1&&a--;else break;return n.slice(0,a).join(`/`)+`/`+r.slice(o).join(`/`)}var q={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0},Dr=function(e){return e.pop=`pop`,e.push=`push`,e}({}),Or=function(e){return e.back=`back`,e.forward=`forward`,e.unknown=``,e}({});function kr(e){if(!e)if(Un){let t=document.querySelector(`base`);e=t&&t.getAttribute(`href`)||`/`,e=e.replace(/^\w+:\/\/[^\/]+/,``)}else e=`/`;return e[0]!==`/`&&e[0]!==`#`&&(e=`/`+e),_r(e)}var Ar=/^[^#]+#/;function jr(e,t){return e.replace(Ar,`#`)+t}function Mr(e,t){let n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}var Nr=()=>({left:window.scrollX,top:window.scrollY});function Pr(e){let t;if(`el`in e){let n=e.el,r=typeof n==`string`&&n.startsWith(`#`),i=typeof n==`string`?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;t=Mr(i,e)}else t=e;`scrollBehavior`in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left==null?window.scrollX:t.left,t.top==null?window.scrollY:t.top)}function Fr(e,t){return(history.state?history.state.position-t:-1)+e}var Ir=new Map;function Lr(e,t){Ir.set(e,t)}function Rr(e){let t=Ir.get(e);return Ir.delete(e),t}function zr(e){return typeof e==`string`||e&&typeof e==`object`}function Br(e){return typeof e==`string`||typeof e==`symbol`}var J=function(e){return e[e.MATCHER_NOT_FOUND=1]=`MATCHER_NOT_FOUND`,e[e.NAVIGATION_GUARD_REDIRECT=2]=`NAVIGATION_GUARD_REDIRECT`,e[e.NAVIGATION_ABORTED=4]=`NAVIGATION_ABORTED`,e[e.NAVIGATION_CANCELLED=8]=`NAVIGATION_CANCELLED`,e[e.NAVIGATION_DUPLICATED=16]=`NAVIGATION_DUPLICATED`,e}({}),Vr=Symbol(``);J.MATCHER_NOT_FOUND,J.NAVIGATION_GUARD_REDIRECT,J.NAVIGATION_ABORTED,J.NAVIGATION_CANCELLED,J.NAVIGATION_DUPLICATED;function Hr(e,t){return G(Error(),{type:e,[Vr]:!0},t)}function Y(e,t){return e instanceof Error&&Vr in e&&(t==null||!!(e.type&t))}function Ur(e){let t={};if(e===``||e===`?`)return t;let n=(e[0]===`?`?e.slice(1):e).split(`&`);for(let e=0;e<n.length;++e){let r=n[e].replace(er,` `),i=r.indexOf(`=`),a=hr(i<0?r:r.slice(0,i)),o=i<0?null:hr(r.slice(i+1));if(a in t){let e=t[a];K(e)||(e=t[a]=[e]),e.push(o)}else t[a]=o}return t}function Wr(e){let t=``;for(let n in e){let r=e[n];if(n=fr(n),r==null){r!==void 0&&(t+=(t.length?`&`:``)+n);continue}(K(r)?r.map(e=>e&&dr(e)):[r&&dr(r)]).forEach(e=>{e!==void 0&&(t+=(t.length?`&`:``)+n,e!=null&&(t+=`=`+e))})}return t}function Gr(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=K(r)?r.map(e=>e==null?null:``+e):r==null?r:``+r)}return t}var Kr=Symbol(``),qr=Symbol(``),Jr=Symbol(``),Yr=Symbol(``),Xr=Symbol(``);function Zr(){let e=[];function t(t){return e.push(t),()=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function X(e,t,n,r,i,a=e=>e()){let o=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((s,c)=>{let l=e=>{e===!1?c(Hr(J.NAVIGATION_ABORTED,{from:n,to:t})):e instanceof Error?c(e):zr(e)?c(Hr(J.NAVIGATION_GUARD_REDIRECT,{from:t,to:e})):(o&&r.enterCallbacks[i]===o&&typeof e==`function`&&o.push(e),s())},u=a(()=>e.call(r&&r.instances[i],t,n,l)),d=Promise.resolve(u);e.length<3&&(d=d.then(l)),d.catch(e=>c(e))})}function Qr(e,t,n,r,i=e=>e()){let a=[];for(let o of e)for(let e in o.components){let s=o.components[e];if(!(t!==`beforeRouteEnter`&&!o.instances[e]))if(Wn(s)){let c=(s.__vccOpts||s)[t];c&&a.push(X(c,n,r,o,e,i))}else{let c=s();a.push(()=>c.then(a=>{if(!a)throw Error(`Couldn't resolve component "${e}" at "${o.path}"`);let s=Gn(a)?a.default:a;o.mods[e]=a,o.components[e]=s;let c=(s.__vccOpts||s)[t];return c&&X(c,n,r,o,e,i)()}))}}return a}function $r(e,t){let n=[],r=[],i=[],a=Math.max(t.matched.length,e.matched.length);for(let o=0;o<a;o++){let a=t.matched[o];a&&(e.matched.find(e=>Sr(e,a))?r.push(a):n.push(a));let s=e.matched[o];s&&(t.matched.find(e=>Sr(e,s))||i.push(s))}return[n,r,i]}var ei=()=>location.protocol+`//`+location.host;function ti(e,t){let{pathname:n,search:r,hash:i}=t,a=e.indexOf(`#`);if(a>-1){let t=i.includes(e.slice(a))?e.slice(a).length:1,n=i.slice(t);return n[0]!==`/`&&(n=`/`+n),br(n,``)}return br(n,e)+r+i}function ni(e,t,n,r){let i=[],a=[],o=null,s=({state:a})=>{let s=ti(e,location),c=n.value,l=t.value,u=0;if(a){if(n.value=s,t.value=a,o&&o===c){o=null;return}u=l?a.position-l.position:0}else r(s);i.forEach(e=>{e(n.value,c,{delta:u,type:Dr.pop,direction:u?u>0?Or.forward:Or.back:Or.unknown})})};function c(){o=n.value}function l(e){i.push(e);let t=()=>{let t=i.indexOf(e);t>-1&&i.splice(t,1)};return a.push(t),t}function u(){if(document.visibilityState===`hidden`){let{history:e}=window;if(!e.state)return;e.replaceState(G({},e.state,{scroll:Nr()}),``)}}function d(){for(let e of a)e();a=[],window.removeEventListener(`popstate`,s),window.removeEventListener(`pagehide`,u),document.removeEventListener(`visibilitychange`,u)}return window.addEventListener(`popstate`,s),window.addEventListener(`pagehide`,u),document.addEventListener(`visibilitychange`,u),{pauseListeners:c,listen:l,destroy:d}}function ri(e,t,n,r=!1,i=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:i?Nr():null}}function ii(e){let{history:t,location:n}=window,r={value:ti(e,n)},i={value:t.state};i.value||a(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(r,a,o){let s=e.indexOf(`#`),c=s>-1?(n.host&&document.querySelector(`base`)?e:e.slice(s))+r:ei()+e+r;try{t[o?`replaceState`:`pushState`](a,``,c),i.value=a}catch(e){console.error(e),n[o?`replace`:`assign`](c)}}function o(e,n){a(e,G({},t.state,ri(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),r.value=e}function s(e,n){let o=G({},i.value,t.state,{forward:e,scroll:Nr()});a(o.current,o,!0),a(e,G({},ri(r.value,e,null),{position:o.position+1},n),!1),r.value=e}return{location:r,state:i,push:s,replace:o}}function ai(e){e=kr(e);let t=ii(e),n=ni(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}let i=G({location:``,base:e,go:r,createHref:jr.bind(null,e)},t,n);return Object.defineProperty(i,`location`,{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,`state`,{enumerable:!0,get:()=>t.state.value}),i}function oi(e){return e=location.host?e||location.pathname+location.search:``,e.includes(`#`)||(e+=`#`),ai(e)}var si=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.Group=2]=`Group`,e}({}),Z=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.ParamRegExp=2]=`ParamRegExp`,e[e.ParamRegExpEnd=3]=`ParamRegExpEnd`,e[e.EscapeNext=4]=`EscapeNext`,e}(Z||{}),ci={type:si.Static,value:``},li=/[a-zA-Z0-9_]/;function ui(e){if(!e)return[[]];if(e===`/`)return[[ci]];if(!e.startsWith(`/`))throw Error(`Invalid path "${e}"`);function t(e){throw Error(`ERR (${n})/"${l}": ${e}`)}let n=Z.Static,r=n,i=[],a;function o(){a&&i.push(a),a=[]}let s=0,c,l=``,u=``;function d(){l&&=(n===Z.Static?a.push({type:si.Static,value:l}):n===Z.Param||n===Z.ParamRegExp||n===Z.ParamRegExpEnd?(a.length>1&&(c===`*`||c===`+`)&&t(`A repeatable param (${l}) must be alone in its segment. eg: '/:ids+.`),a.push({type:si.Param,value:l,regexp:u,repeatable:c===`*`||c===`+`,optional:c===`*`||c===`?`})):t(`Invalid state to consume buffer`),``)}function f(){l+=c}for(;s<e.length;){if(c=e[s++],c===`\\`&&n!==Z.ParamRegExp){r=n,n=Z.EscapeNext;continue}switch(n){case Z.Static:c===`/`?(l&&d(),o()):c===`:`?(d(),n=Z.Param):f();break;case Z.EscapeNext:f(),n=r;break;case Z.Param:c===`(`?n=Z.ParamRegExp:li.test(c)?f():(d(),n=Z.Static,c!==`*`&&c!==`?`&&c!==`+`&&s--);break;case Z.ParamRegExp:c===`)`?u[u.length-1]==`\\`?u=u.slice(0,-1)+c:n=Z.ParamRegExpEnd:u+=c;break;case Z.ParamRegExpEnd:d(),n=Z.Static,c!==`*`&&c!==`?`&&c!==`+`&&s--,u=``;break;default:t(`Unknown state`);break}}return n===Z.ParamRegExp&&t(`Unfinished custom RegExp for param "${l}"`),d(),o(),i}var di=`[^/]+?`,fi={sensitive:!1,strict:!1,start:!0,end:!0},Q=function(e){return e[e._multiplier=10]=`_multiplier`,e[e.Root=90]=`Root`,e[e.Segment=40]=`Segment`,e[e.SubSegment=30]=`SubSegment`,e[e.Static=40]=`Static`,e[e.Dynamic=20]=`Dynamic`,e[e.BonusCustomRegExp=10]=`BonusCustomRegExp`,e[e.BonusWildcard=-50]=`BonusWildcard`,e[e.BonusRepeatable=-20]=`BonusRepeatable`,e[e.BonusOptional=-8]=`BonusOptional`,e[e.BonusStrict=.7000000000000001]=`BonusStrict`,e[e.BonusCaseSensitive=.25]=`BonusCaseSensitive`,e}(Q||{}),pi=/[.+*?^${}()[\]/\\]/g;function mi(e,t){let n=G({},fi,t),r=[],i=n.start?`^`:``,a=[];for(let t of e){let e=t.length?[]:[Q.Root];n.strict&&!t.length&&(i+=`/`);for(let r=0;r<t.length;r++){let o=t[r],s=Q.Segment+(n.sensitive?Q.BonusCaseSensitive:0);if(o.type===si.Static)r||(i+=`/`),i+=o.value.replace(pi,`\\$&`),s+=Q.Static;else if(o.type===si.Param){let{value:e,repeatable:n,optional:c,regexp:l}=o;a.push({name:e,repeatable:n,optional:c});let u=l||di;if(u!==di){s+=Q.BonusCustomRegExp;try{`${u}`}catch(t){throw Error(`Invalid custom RegExp for param "${e}" (${u}): `+t.message)}}let d=n?`((?:${u})(?:/(?:${u}))*)`:`(${u})`;r||(d=c&&t.length<2?`(?:/${d})`:`/`+d),c&&(d+=`?`),i+=d,s+=Q.Dynamic,c&&(s+=Q.BonusOptional),n&&(s+=Q.BonusRepeatable),u===`.*`&&(s+=Q.BonusWildcard)}e.push(s)}r.push(e)}if(n.strict&&n.end){let e=r.length-1;r[e][r[e].length-1]+=Q.BonusStrict}n.strict||(i+=`/?`),n.end?i+=`$`:n.strict&&!i.endsWith(`/`)&&(i+=`(?:/|$)`);let o=new RegExp(i,n.sensitive?``:`i`);function s(e){let t=e.match(o),n={};if(!t)return null;for(let e=1;e<t.length;e++){let r=t[e]||``,i=a[e-1];n[i.name]=r&&i.repeatable?r.split(`/`):r}return n}function c(t){let n=``,r=!1;for(let i of e){(!r||!n.endsWith(`/`))&&(n+=`/`),r=!1;for(let e of i)if(e.type===si.Static)n+=e.value;else if(e.type===si.Param){let{value:a,repeatable:o,optional:s}=e,c=a in t?t[a]:``;if(K(c)&&!o)throw Error(`Provided param "${a}" is an array but it is not repeatable (* or + modifiers)`);let l=K(c)?c.join(`/`):c;if(!l)if(s)i.length<2&&(n.endsWith(`/`)?n=n.slice(0,-1):r=!0);else throw Error(`Missing required param "${a}"`);n+=l}}return n||`/`}return{re:o,score:r,keys:a,parse:s,stringify:c}}function hi(e,t){let n=0;for(;n<e.length&&n<t.length;){let r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?e.length===1&&e[0]===Q.Static+Q.Segment?-1:1:e.length>t.length?t.length===1&&t[0]===Q.Static+Q.Segment?1:-1:0}function gi(e,t){let n=0,r=e.score,i=t.score;for(;n<r.length&&n<i.length;){let e=hi(r[n],i[n]);if(e)return e;n++}if(Math.abs(i.length-r.length)===1){if(_i(r))return 1;if(_i(i))return-1}return i.length-r.length}function _i(e){let t=e[e.length-1];return e.length>0&&t[t.length-1]<0}var vi={strict:!1,end:!0,sensitive:!1};function yi(e,t,n){let r=G(mi(ui(e.path),n),{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function bi(e,t){let n=[],r=new Map;t=Jn(vi,t);function i(e){return r.get(e)}function a(e,n,r){let i=!r,s=Si(e);s.aliasOf=r&&r.record;let l=Jn(t,e),u=[s];if(`alias`in e){let t=typeof e.alias==`string`?[e.alias]:e.alias;for(let e of t)u.push(Si(G({},s,{components:r?r.record.components:s.components,path:e,aliasOf:r?r.record:s})))}let d,f;for(let t of u){let{path:u}=t;if(n&&u[0]!==`/`){let e=n.record.path,r=e[e.length-1]===`/`?``:`/`;t.path=n.record.path+(u&&r+u)}if(d=yi(t,n,l),r?r.alias.push(d):(f||=d,f!==d&&f.alias.push(d),i&&e.name&&!wi(d)&&o(e.name)),Oi(d)&&c(d),s.children){let e=s.children;for(let t=0;t<e.length;t++)a(e[t],d,r&&r.children[t])}r||=d}return f?()=>{o(f)}:qn}function o(e){if(Br(e)){let t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(o),t.alias.forEach(o))}else{let t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(o),e.alias.forEach(o))}}function s(){return n}function c(e){let t=Ei(e,n);n.splice(t,0,e),e.record.name&&!wi(e)&&r.set(e.record.name,e)}function l(e,t){let i,a={},o,s;if(`name`in e&&e.name){if(i=r.get(e.name),!i)throw Hr(J.MATCHER_NOT_FOUND,{location:e});s=i.record.name,a=G(xi(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&xi(e.params,i.keys.map(e=>e.name))),o=i.stringify(a)}else if(e.path!=null)o=e.path,i=n.find(e=>e.re.test(o)),i&&(a=i.parse(o),s=i.record.name);else{if(i=t.name?r.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw Hr(J.MATCHER_NOT_FOUND,{location:e,currentLocation:t});s=i.record.name,a=G({},t.params,e.params),o=i.stringify(a)}let c=[],l=i;for(;l;)c.unshift(l.record),l=l.parent;return{name:s,path:o,params:a,matched:c,meta:Ti(c)}}e.forEach(e=>a(e));function u(){n.length=0,r.clear()}return{addRoute:a,resolve:l,removeRoute:o,clearRoutes:u,getRoutes:s,getRecordMatcher:i}}function xi(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Si(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Ci(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:`components`in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,`mods`,{value:{}}),t}function Ci(e){let t={},n=e.props||!1;if(`component`in e)t.default=n;else for(let r in e.components)t[r]=typeof n==`object`?n[r]:n;return t}function wi(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Ti(e){return e.reduce((e,t)=>G(e,t.meta),{})}function Ei(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;gi(e,t[i])<0?r=i:n=i+1}let i=Di(e);return i&&(r=t.lastIndexOf(i,r-1)),r}function Di(e){let t=e;for(;t=t.parent;)if(Oi(t)&&gi(e,t)===0)return t}function Oi({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function ki(e){let t=w(Jr),n=w(Yr),r=v(()=>{let n=x(e.to);return t.resolve(n)}),i=v(()=>{let{matched:e}=r.value,{length:t}=e,i=e[t-1],a=n.matched;if(!i||!a.length)return-1;let o=a.findIndex(Sr.bind(null,i));if(o>-1)return o;let s=Pi(e[t-2]);return t>1&&Pi(i)===s&&a[a.length-1].path!==s?a.findIndex(Sr.bind(null,e[t-2])):o}),a=v(()=>i.value>-1&&Ni(n.params,r.value.params)),o=v(()=>i.value>-1&&i.value===n.matched.length-1&&Cr(n.params,r.value.params));function s(n={}){if(Mi(n)){let n=t[x(e.replace)?`replace`:`push`](x(e.to)).catch(qn);return e.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}return{route:r,href:v(()=>r.value.href),isActive:a,isExactActive:o,navigate:s}}function Ai(e){return e.length===1?e[0]:e}var ji=C({name:`RouterLink`,compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:`page`},viewTransition:Boolean},useLink:ki,setup(e,{slots:t}){let n=f(ki(e)),{options:r}=w(Jr),i=v(()=>({[Fi(e.activeClass,r.linkActiveClass,`router-link-active`)]:n.isActive,[Fi(e.exactActiveClass,r.linkExactActiveClass,`router-link-exact-active`)]:n.isExactActive}));return()=>{let r=t.default&&Ai(t.default(n));return e.custom?r:l(`a`,{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},r)}}});function Mi(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){let t=e.currentTarget.getAttribute(`target`);if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Ni(e,t){for(let n in t){let r=t[n],i=e[n];if(typeof r==`string`){if(r!==i)return!1}else if(!K(i)||i.length!==r.length||r.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}function Pi(e){return e?e.aliasOf?e.aliasOf.path:e.path:``}var Fi=(e,t,n)=>e??t??n,Ii=C({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){let a=w(Xr),o=v(()=>e.route||a.value),c=w(qr,0),u=v(()=>{let e=x(c),{matched:t}=o.value,n;for(;(n=t[e])&&!n.components;)e++;return e}),d=v(()=>o.value.matched[u.value]);i(qr,v(()=>u.value+1)),i(Kr,d),i(Xr,o);let f=s();return r(()=>[f.value,d.value,e.name],([e,t,n],[r,i,a])=>{t&&(t.instances[n]=e,i&&i!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=i.leaveGuards),t.updateGuards.size||(t.updateGuards=i.updateGuards))),e&&t&&(!i||!Sr(t,i)||!r)&&(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:`post`}),()=>{let r=o.value,i=e.name,a=d.value,s=a&&a.components[i];if(!s)return Li(n.default,{Component:s,route:r});let c=a.props[i],u=l(s,G({},c?c===!0?r.params:typeof c==`function`?c(r):c:null,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(a.instances[i]=null)},ref:f}));return Li(n.default,{Component:u,route:r})||u}}});function Li(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var Ri=Ii;function zi(n){let r=bi(n.routes,n),i=n.parseQuery||Ur,a=n.stringifyQuery||Wr,o=n.history,s=Zr(),c=Zr(),l=Zr(),u=h(q),d=q;Un&&n.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let f=Kn.bind(null,e=>``+e),p=Kn.bind(null,mr),m=Kn.bind(null,hr);function g(e,t){let n,i;return Br(e)?(n=r.getRecordMatcher(e),i=t):i=e,r.addRoute(i,n)}function _(e){let t=r.getRecordMatcher(e);t&&r.removeRoute(t)}function ee(){return r.getRoutes().map(e=>e.record)}function v(e){return!!r.getRecordMatcher(e)}function y(e,t){if(t=G({},t||u.value),typeof e==`string`){let n=vr(i,e,t.path),a=r.resolve({path:n.path},t),s=o.createHref(n.fullPath);return G(n,a,{params:m(a.params),hash:hr(n.hash),redirectedFrom:void 0,href:s})}let n;if(e.path!=null)n=G({},e,{path:vr(i,e.path,t.path).path});else{let r=G({},e.params);for(let e in r)r[e]??delete r[e];n=G({},e,{params:p(r)}),t.params=p(t.params)}let s=r.resolve(n,t),c=e.hash||``;s.params=f(m(s.params));let l=yr(a,G({},e,{hash:ur(c),path:s.path})),d=o.createHref(l);return G({fullPath:l,hash:c,query:a===Wr?Gr(e.query):e.query||{}},s,{redirectedFrom:void 0,href:d})}function b(e){return typeof e==`string`?vr(i,e,u.value.path):G({},e)}function te(e,t){if(d!==e)return Hr(J.NAVIGATION_CANCELLED,{from:t,to:e})}function S(e){return T(e)}function C(e){return S(G(b(e),{replace:!0}))}function w(e,t){let n=e.matched[e.matched.length-1];if(n&&n.redirect){let{redirect:r}=n,i=typeof r==`function`?r(e,t):r;return typeof i==`string`&&(i=i.includes(`?`)||i.includes(`#`)?i=b(i):{path:i},i.params={}),G({query:e.query,hash:e.hash,params:i.path==null?e.params:{}},i)}}function T(e,t){let n=d=y(e),r=u.value,i=e.state,o=e.force,s=e.replace===!0,c=w(n,r);if(c)return T(G(b(c),{state:typeof c==`object`?G({},i,c.state):i,force:o,replace:s}),t||n);let l=n;l.redirectedFrom=t;let f;return!o&&xr(a,r,n)&&(f=Hr(J.NAVIGATION_DUPLICATED,{to:l,from:r}),N(r,r,!0,!1)),(f?Promise.resolve(f):ne(l,r)).catch(e=>Y(e)?Y(e,J.NAVIGATION_GUARD_REDIRECT)?e:M(e):oe(e,l,r)).then(e=>{if(e){if(Y(e,J.NAVIGATION_GUARD_REDIRECT))return T(G({replace:s},b(e.to),{state:typeof e.to==`object`?G({},i,e.to.state):i,force:o}),t||l)}else e=k(l,r,!0,s,i);return O(l,r,e),e})}function E(e,t){let n=te(e,t);return n?Promise.reject(n):Promise.resolve()}function D(e){let t=F.values().next().value;return t&&typeof t.runWithContext==`function`?t.runWithContext(e):e()}function ne(e,t){let n,[r,i,a]=$r(e,t);n=Qr(r.reverse(),`beforeRouteLeave`,e,t);for(let i of r)i.leaveGuards.forEach(r=>{n.push(X(r,e,t))});let o=E.bind(null,e,t);return n.push(o),L(n).then(()=>{n=[];for(let r of s.list())n.push(X(r,e,t));return n.push(o),L(n)}).then(()=>{n=Qr(i,`beforeRouteUpdate`,e,t);for(let r of i)r.updateGuards.forEach(r=>{n.push(X(r,e,t))});return n.push(o),L(n)}).then(()=>{n=[];for(let r of a)if(r.beforeEnter)if(K(r.beforeEnter))for(let i of r.beforeEnter)n.push(X(i,e,t));else n.push(X(r.beforeEnter,e,t));return n.push(o),L(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=Qr(a,`beforeRouteEnter`,e,t,D),n.push(o),L(n))).then(()=>{n=[];for(let r of c.list())n.push(X(r,e,t));return n.push(o),L(n)}).catch(e=>Y(e,J.NAVIGATION_CANCELLED)?e:Promise.reject(e))}function O(e,t,n){l.list().forEach(r=>D(()=>r(e,t,n)))}function k(e,t,n,r,i){let a=te(e,t);if(a)return a;let s=t===q,c=Un?history.state:{};n&&(r||s?o.replace(e.fullPath,G({scroll:s&&c&&c.scroll},i)):o.push(e.fullPath,i)),u.value=e,N(e,t,n,s),M()}let A;function re(){A||=o.listen((e,t,n)=>{if(!I.listening)return;let r=y(e),i=w(r,I.currentRoute.value);if(i){T(G(i,{replace:!0,force:!0}),r).catch(qn);return}d=r;let a=u.value;Un&&Lr(Fr(a.fullPath,n.delta),Nr()),ne(r,a).catch(e=>Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_CANCELLED)?e:Y(e,J.NAVIGATION_GUARD_REDIRECT)?(T(G(b(e.to),{force:!0}),r).then(e=>{Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_DUPLICATED)&&!n.delta&&n.type===Dr.pop&&o.go(-1,!1)}).catch(qn),Promise.reject()):(n.delta&&o.go(-n.delta,!1),oe(e,r,a))).then(e=>{e||=k(r,a,!1),e&&(n.delta&&!Y(e,J.NAVIGATION_CANCELLED)?o.go(-n.delta,!1):n.type===Dr.pop&&Y(e,J.NAVIGATION_ABORTED|J.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),O(r,a,e)}).catch(qn)})}let j=Zr(),ie=Zr(),ae;function oe(e,t,n){M(e);let r=ie.list();return r.length?r.forEach(r=>r(e,t,n)):console.error(e),Promise.reject(e)}function se(){return ae&&u.value!==q?Promise.resolve():new Promise((e,t)=>{j.add([e,t])})}function M(e){return ae||(ae=!e,re(),j.list().forEach(([t,n])=>e?n(e):t()),j.reset()),e}function N(e,r,i,a){let{scrollBehavior:o}=n;if(!Un||!o)return Promise.resolve();let s=!i&&Rr(Fr(e.fullPath,0))||(a||!i)&&history.state&&history.state.scroll||null;return t().then(()=>o(e,r,s)).then(e=>e&&Pr(e)).catch(t=>oe(t,e,r))}let ce=e=>o.go(e),P,F=new Set,I={currentRoute:u,listening:!0,addRoute:g,removeRoute:_,clearRoutes:r.clearRoutes,hasRoute:v,getRoutes:ee,resolve:y,options:n,push:S,replace:C,go:ce,back:()=>ce(-1),forward:()=>ce(1),beforeEach:s.add,beforeResolve:c.add,afterEach:l.add,onError:ie.add,isReady:se,install(t){t.component(`RouterLink`,ji),t.component(`RouterView`,Ri),t.config.globalProperties.$router=I,Object.defineProperty(t.config.globalProperties,`$route`,{enumerable:!0,get:()=>x(u)}),Un&&!P&&u.value===q&&(P=!0,S(o.location).catch(e=>{}));let n={};for(let e in q)Object.defineProperty(n,e,{get:()=>u.value[e],enumerable:!0});t.provide(Jr,I),t.provide(Yr,e(n)),t.provide(Xr,u);let r=t.unmount;F.add(t),t.unmount=function(){F.delete(t),F.size<1&&(d=q,A&&A(),A=null,u.value=q,P=!1,ae=!1),r()}}};function L(e){return e.reduce((e,t)=>e.then(()=>D(t)),Promise.resolve())}return I}function Bi(){return w(Jr)}function Vi(e){return w(Yr)}var Hi=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Ui=function(e){return`/`+e},Wi={},Gi=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=Ui(t,n),t in Wi)return;Wi[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Hi,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Ki=[{path:`/`,component:()=>Gi(()=>import(`./MainLayout-CFHf3zKv.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29])),children:[{path:``,redirect:{name:`workspace`}},{path:`workspace/:id?`,name:`workspace`,component:()=>Gi(()=>import(`./WorkspacePage-B2VAbf6l.js`),__vite__mapDeps([30,1,2,3,4,6,11,10,14,31,15,16,17,32,19,8,9,22,33,20,34,23,24,35,28,36,26,27,37]))},{path:`create`,name:`create`,component:()=>Gi(()=>import(`./CreatePage-rp-9_jOF.js`),__vite__mapDeps([38,1,2,3,4,6,10,39,17,32,13,9,31,14,15,16,19,8,22,33,20,23,35,28,36,40]))},{path:`settings`,name:`settings`,component:()=>Gi(()=>import(`./SettingsPage-ONWYC-Bn.js`),__vite__mapDeps([41,1,2,3,4,6,10,39,17,32,13,9,31,14,15,16,19,8,22,18,33,20,21,7,23,24,42]))},{path:`search`,name:`search`,component:()=>Gi(()=>import(`./SearchPage-CfYy4vGJ.js`),__vite__mapDeps([43,1,2,3,4,6,11,15,16,33,20,27,44]))},{path:`health`,name:`health`,component:()=>Gi(()=>import(`./HealthPage-CZQB2pvh.js`),__vite__mapDeps([45,3,4,10,17,18,33,16,20,23]))}]},{path:`/:catchAll(.*)*`,redirect:`/`}],qi=Bn(()=>zi({scrollBehavior:()=>({left:0,top:0}),routes:Ki,history:oi()}));async function Ji(e,t){let n=e(Rn);n.use(bt,t);let r=typeof Hn==`function`?await Hn({}):Hn;n.use(r);let i=d(typeof qi==`function`?await qi({store:r}):qi);return r.use(({store:e})=>{e.router=i}),{app:n,store:r,router:i}}var Yi=k({name:`QAvatar`,props:{...P,fontSize:String,color:String,textColor:String,icon:String,square:Boolean,rounded:Boolean},setup(e,{slots:t}){let n=ie(e),r=v(()=>`q-avatar`+(e.color?` bg-${e.color}`:``)+(e.textColor?` text-${e.textColor} q-chip--colored`:``)+(e.square===!0?` q-avatar--square`:e.rounded===!0?` rounded-borders`:``)),i=v(()=>e.fontSize?{fontSize:e.fontSize}:null);return()=>{let a=e.icon===void 0?void 0:[l(L,{name:e.icon})];return l(`div`,{class:r.value,style:n.value},[l(`div`,{class:`q-avatar__content row flex-center overflow-hidden`,style:i.value},ce(t.default,a))])}}}),Xi=0,Zi={},Qi={},$={},$i={},ea=/^\s*$/,ta=[],na=[void 0,null,!0,!1,``],ra=[`top-left`,`top-right`,`bottom-left`,`bottom-right`,`top`,`bottom`,`left`,`right`,`center`],ia=[`top-left`,`top-right`,`bottom-left`,`bottom-right`],aa={positive:{icon:e=>e.iconSet.type.positive,color:`positive`},negative:{icon:e=>e.iconSet.type.negative,color:`negative`},warning:{icon:e=>e.iconSet.type.warning,color:`warning`,textColor:`dark`},info:{icon:e=>e.iconSet.type.info,color:`info`},ongoing:{group:!1,timeout:0,spinner:!0,color:`grey-8`}};function oa(e,t,n){if(!e)return la(`parameter required`);let r,i={textColor:`white`};if(e.ignoreDefaults!==!0&&Object.assign(i,Zi),B(e)===!1&&(i.type&&Object.assign(i,aa[i.type]),e={message:e}),Object.assign(i,aa[e.type||i.type],e),typeof i.icon==`function`&&(i.icon=i.icon(t)),i.spinner?(i.spinner===!0&&(i.spinner=se),i.spinner=d(i.spinner)):i.spinner=!1,i.meta={hasMedia:!!(i.spinner!==!1||i.icon||i.avatar),hasText:ca(i.message)||ca(i.caption)},i.position){if(ra.includes(i.position)===!1)return la(`wrong position`,e)}else i.position=`bottom`;if(na.includes(i.timeout)===!0)i.timeout=5e3;else{let t=Number(i.timeout);if(isNaN(t)||t<0)return la(`wrong timeout`,e);i.timeout=Number.isFinite(t)?t:0}i.timeout===0?i.progress=!1:i.progress===!0&&(i.meta.progressClass=`q-notification__progress`+(i.progressClass?` ${i.progressClass}`:``),i.meta.progressStyle={animationDuration:`${i.timeout+1e3}ms`});let a=(Array.isArray(e.actions)===!0?e.actions:[]).concat(e.ignoreDefaults!==!0&&Array.isArray(Zi.actions)===!0?Zi.actions:[]).concat(Array.isArray(aa[e.type]?.actions)===!0?aa[e.type].actions:[]),{closeBtn:o}=i;if(o&&a.push({label:typeof o==`string`?o:t.lang.label.close}),i.actions=a.map(({handler:e,noDismiss:t,...n})=>({flat:!0,...n,onClick:typeof e==`function`?()=>{e(),t!==!0&&s()}:()=>{s()}})),i.multiLine===void 0&&(i.multiLine=i.actions.length>1),Object.assign(i.meta,{class:`q-notification row items-stretch q-notification--${i.multiLine===!0?`multi-line`:`standard`}`+(i.color===void 0?``:` bg-${i.color}`)+(i.textColor===void 0?``:` text-${i.textColor}`)+(i.classes===void 0?``:` ${i.classes}`),wrapperClass:`q-notification__wrapper col relative-position border-radius-inherit `+(i.multiLine===!0?`column no-wrap justify-center`:`row items-center`),contentClass:`q-notification__content row items-center`+(i.multiLine===!0?``:` col`),leftClass:i.meta.hasText===!0?`additional`:`single`,attrs:{role:`alert`,...i.attrs}}),i.group===!1?(i.group=void 0,i.meta.group=void 0):((i.group===void 0||i.group===!0)&&(i.group=[i.message,i.caption,i.multiline].concat(i.actions.map(e=>`${e.label}*${e.icon}`)).join(`|`)),i.meta.group=i.group+`|`+i.position),i.actions.length===0?i.actions=void 0:i.meta.actionsClass=`q-notification__actions row items-center `+(i.multiLine===!0?`justify-end`:`col-auto`)+(i.meta.hasMedia===!0?` q-notification__actions--with-media`:``),n!==void 0){n.notif.meta.timer&&(clearTimeout(n.notif.meta.timer),n.notif.meta.timer=void 0),i.meta.uid=n.notif.meta.uid;let e=$[i.position].value.indexOf(n.notif);$[i.position].value[e]=i}else{let t=Qi[i.meta.group];if(t===void 0){if(i.meta.uid=Xi++,i.meta.badge=1,[`left`,`right`,`center`].indexOf(i.position)!==-1)$[i.position].value.splice(Math.floor($[i.position].value.length/2),0,i);else{let e=i.position.indexOf(`top`)===-1?`push`:`unshift`;$[i.position].value[e](i)}i.group!==void 0&&(Qi[i.meta.group]=i)}else{if(t.meta.timer&&(clearTimeout(t.meta.timer),t.meta.timer=void 0),i.badgePosition!==void 0){if(ia.includes(i.badgePosition)===!1)return la(`wrong badgePosition`,e)}else i.badgePosition=`top-${i.position.indexOf(`left`)===-1?`left`:`right`}`;i.meta.uid=t.meta.uid,i.meta.badge=t.meta.badge+1,i.meta.badgeClass=`q-notification__badge q-notification__badge--${i.badgePosition}`+(i.badgeColor===void 0?``:` bg-${i.badgeColor}`)+(i.badgeTextColor===void 0?``:` text-${i.badgeTextColor}`)+(i.badgeClass?` ${i.badgeClass}`:``);let n=$[i.position].value.indexOf(t);$[i.position].value[n]=Qi[i.meta.group]=i}}let s=()=>{sa(i),r=void 0};if(i.timeout>0&&(i.meta.timer=setTimeout(()=>{i.meta.timer=void 0,s()},i.timeout+1e3)),i.group!==void 0)return t=>{t===void 0?s():la(`trying to update a grouped one which is forbidden`,e)};if(r={dismiss:s,config:e,notif:i},n!==void 0){Object.assign(n,r);return}return e=>{r!==void 0&&(e===void 0?r.dismiss():oa(Object.assign({},r.config,e,{group:!1,position:i.position}),t,r))}}function sa(e){e.meta.timer&&(clearTimeout(e.meta.timer),e.meta.timer=void 0);let t=$[e.position].value.indexOf(e);if(t!==-1){e.group!==void 0&&delete Qi[e.meta.group];let n=ta[String(e.meta.uid)];if(n){let{width:e,height:t}=getComputedStyle(n);n.style.left=`${n.offsetLeft}px`,n.style.width=e,n.style.height=t}$[e.position].value.splice(t,1),typeof e.onDismiss==`function`&&e.onDismiss()}}function ca(e){return e!=null&&ea.test(e)!==!0}function la(e,t){return console.error(`Notify: ${e}`,t),!1}function ua(){return k({name:`QNotifications`,devtools:{hide:!0},setup(){return()=>l(`div`,{class:`q-notifications`},ra.map(e=>l(O,{key:e,class:$i[e],tag:`div`,name:`q-notification--${e}`},()=>$[e].value.map(e=>{let t=e.meta,n=[];if(t.hasMedia===!0&&(e.spinner===!1?e.icon?n.push(l(L,{class:`q-notification__icon q-notification__icon--`+t.leftClass,name:e.icon,color:e.iconColor,size:e.iconSize,role:`img`})):e.avatar&&n.push(l(Yi,{class:`q-notification__avatar q-notification__avatar--`+t.leftClass},()=>l(`img`,{src:e.avatar,"aria-hidden":`true`}))):n.push(l(e.spinner,{class:`q-notification__spinner q-notification__spinner--`+t.leftClass,color:e.spinnerColor,size:e.spinnerSize}))),t.hasText===!0){let t,r={class:`q-notification__message col`};if(e.html===!0)r.innerHTML=e.caption?`<div>${e.message}</div><div class="q-notification__caption">${e.caption}</div>`:e.message;else{let n=[e.message];t=e.caption?[l(`div`,n),l(`div`,{class:`q-notification__caption`},[e.caption])]:n}n.push(l(`div`,r,t))}let r=[l(`div`,{class:t.contentClass},n)];return e.progress===!0&&r.push(l(`div`,{key:`${t.uid}|p|${t.badge}`,class:t.progressClass,style:t.progressStyle})),e.actions!==void 0&&r.push(l(`div`,{class:t.actionsClass},e.actions.map(e=>l(Ve,e)))),t.badge>1&&r.push(l(`div`,{key:`${t.uid}|${t.badge}`,class:e.meta.badgeClass,style:e.badgeStyle},[t.badge])),l(`div`,{ref:e=>{ta[String(t.uid)]=e},key:t.uid,class:t.class,...t.attrs},[l(`div`,{class:t.wrapperClass},r)])}))))}})}var da={setDefaults(e){B(e)===!0&&Object.assign(Zi,e)},registerType(e,t){B(t)===!0&&(aa[e]=t)},install({$q:e,parentApp:t}){if(e.notify=this.create=t=>oa(t,e),e.notify.setDefaults=this.setDefaults,e.notify.registerType=this.registerType,e.config.notify!==void 0&&this.setDefaults(e.config.notify),this.__installed!==!0){ra.forEach(e=>{$[e]=s([]);let t=[`left`,`center`,`right`].includes(e)===!0?`center`:e.indexOf(`top`)===-1?`bottom`:`top`,n=e.indexOf(`left`)===-1?e.indexOf(`right`)===-1?`center`:`end`:`start`;$i[e]=`q-notifications__list q-notifications__list--${t} fixed column no-wrap ${[`left`,`right`].includes(e)?`items-${e===`left`?`start`:`end`} justify-center`:e===`center`?`flex-center`:`items-${n}`}`});let e=Le(`q-notify`);_t(ua(),t).mount(e)}}},fa=k({name:`QCardActions`,props:{...Be,vertical:Boolean},setup(e,{slots:t}){let n=ze(e),r=v(()=>`q-card__actions ${n.value} q-card__actions--${e.vertical===!0?`vert column`:`horiz row`}`);return()=>l(`div`,{class:r.value},I(t.default))}}),pa=()=>l(`svg`,{key:`svg`,class:`q-radio__bg absolute non-selectable`,viewBox:`0 0 24 24`},[l(`path`,{d:`M12,22a10,10 0 0 1 -10,-10a10,10 0 0 1 10,-10a10,10 0 0 1 10,10a10,10 0 0 1 -10,10m0,-22a12,12 0 0 0 -12,12a12,12 0 0 0 12,12a12,12 0 0 0 12,-12a12,12 0 0 0 -12,-12`}),l(`path`,{class:`q-radio__check`,d:`M12,6a6,6 0 0 0 -6,6a6,6 0 0 0 6,6a6,6 0 0 0 6,-6a6,6 0 0 0 -6,-6`})]),ma=k({name:`QRadio`,props:{...F,...P,...We,modelValue:{required:!0},val:{required:!0},label:String,leftLabel:Boolean,checkedIcon:String,uncheckedIcon:String,color:String,keepColor:Boolean,dense:Boolean,disable:Boolean,tabindex:[String,Number]},emits:[`update:modelValue`],setup(e,{slots:t,emit:n}){let{proxy:r}=T(),i=N(e,r.$q),a=ie(e,Je),o=s(null),{refocusTargetEl:c,refocusTarget:u}=qe(e,o),d=v(()=>te(e.modelValue)===te(e.val)),f=v(()=>`q-radio cursor-pointer no-outline row inline no-wrap items-center`+(e.disable===!0?` disabled`:``)+(i.value===!0?` q-radio--dark`:``)+(e.dense===!0?` q-radio--dense`:``)+(e.leftLabel===!0?` reverse`:``)),p=v(()=>{let t=e.color!==void 0&&(e.keepColor===!0||d.value===!0)?` text-${e.color}`:``;return`q-radio__inner relative-position q-radio__inner--${d.value===!0?`truthy`:`falsy`}${t}`}),m=v(()=>(d.value===!0?e.checkedIcon:e.uncheckedIcon)||null),h=v(()=>e.disable===!0?-1:e.tabindex||0),g=Ge(v(()=>{let t={type:`radio`};return e.name!==void 0&&Object.assign(t,{".checked":d.value===!0,"^checked":d.value===!0?`checked`:void 0,name:e.name,value:e.val}),t}));function _(t){t!==void 0&&(D(t),u(t)),e.disable!==!0&&d.value!==!0&&n(`update:modelValue`,e.val,t)}function ee(e){(e.keyCode===13||e.keyCode===32)&&D(e)}function y(e){(e.keyCode===13||e.keyCode===32)&&_(e)}Object.assign(r,{set:_});let b=pa();return()=>{let n=m.value===null?[b]:[l(`div`,{key:`icon`,class:`q-radio__icon-container absolute-full flex flex-center no-wrap`},[l(L,{class:`q-radio__icon`,name:m.value})])];e.disable!==!0&&g(n,`unshift`,` q-radio__native q-ma-none q-pa-none`);let r=[l(`div`,{class:p.value,style:a.value,"aria-hidden":`true`},n)];c.value!==null&&r.push(c.value);let i=e.label===void 0?I(t.default):j(t.default,[e.label]);return i!==void 0&&r.push(l(`div`,{class:`q-radio__label q-anchor--skip`},i)),l(`div`,{ref:o,class:f.value,tabindex:h.value,role:`radio`,"aria-label":e.label,"aria-checked":d.value===!0?`true`:`false`,"aria-disabled":e.disable===!0?`true`:void 0,onClick:_,onKeydown:ee,onKeyup:y},r)}}}),ha=()=>l(`div`,{key:`svg`,class:`q-checkbox__bg absolute`},[l(`svg`,{class:`q-checkbox__svg fit absolute-full`,viewBox:`0 0 24 24`},[l(`path`,{class:`q-checkbox__truthy`,fill:`none`,d:`M1.73,12.91 8.1,19.28 22.79,4.59`}),l(`path`,{class:`q-checkbox__indet`,d:`M4,14H20V10H4`})])]),ga=k({name:`QCheckbox`,props:Xe,emits:Ye,setup(e){let t=ha();function n(n,r){let i=v(()=>(n.value===!0?e.checkedIcon:r.value===!0?e.indeterminateIcon:e.uncheckedIcon)||null);return()=>i.value===null?[t]:[l(`div`,{key:`icon`,class:`q-checkbox__icon-container absolute-full flex flex-center no-wrap`},[l(L,{class:`q-checkbox__icon`,name:i.value})])]}return Ze(`checkbox`,n)}}),_a=k({name:`QToggle`,props:{...Xe,icon:String,iconColor:String},emits:Ye,setup(e){function t(t,n){let r=v(()=>(t.value===!0?e.checkedIcon:n.value===!0?e.indeterminateIcon:e.uncheckedIcon)||e.icon),i=v(()=>t.value===!0?e.iconColor:null);return()=>[l(`div`,{class:`q-toggle__track`}),l(`div`,{class:`q-toggle__thumb absolute flex flex-center no-wrap`},r.value===void 0?void 0:[l(L,{name:r.value,color:i.value})])]}return Ze(`toggle`,t)}}),va={radio:ma,checkbox:ga,toggle:_a},ya=Object.keys(va);function ba(e,t){if(typeof e==`function`)return e;let n=e===void 0?t:e;return e=>e[n]}var xa=k({name:`QOptionGroup`,props:{...F,modelValue:{required:!0},options:{type:Array,validator:e=>e.every(B),default:()=>[]},optionValue:[Function,String],optionLabel:[Function,String],optionDisable:[Function,String],name:String,type:{type:String,default:`radio`,validator:e=>ya.includes(e)},color:String,keepColor:Boolean,dense:Boolean,size:String,leftLabel:Boolean,inline:Boolean,disable:Boolean},emits:[`update:modelValue`],setup(e,{emit:t,slots:n}){let{proxy:{$q:r}}=T(),i=Array.isArray(e.modelValue);e.type===`radio`?i===!0&&console.error(`q-option-group: model should not be array`):i===!1&&console.error(`q-option-group: model should be array in your case`);let a=N(e,r),o=v(()=>va[e.type]),s=v(()=>ba(e.optionValue,`value`)),c=v(()=>ba(e.optionLabel,`label`)),u=v(()=>ba(e.optionDisable,`disable`)),d=v(()=>e.options.map(t=>({val:s.value(t),name:t.name===void 0?e.name:t.name,disable:e.disable||u.value(t),leftLabel:t.leftLabel===void 0?e.leftLabel:t.leftLabel,color:t.color===void 0?e.color:t.color,checkedIcon:t.checkedIcon,uncheckedIcon:t.uncheckedIcon,dark:t.dark===void 0?a.value:t.dark,size:t.size===void 0?e.size:t.size,dense:e.dense,keepColor:t.keepColor===void 0?e.keepColor:t.keepColor}))),f=v(()=>`q-option-group q-gutter-x-sm`+(e.inline===!0?` q-option-group--inline`:``)),p=v(()=>{let t={role:`group`};return e.type===`radio`&&(t.role=`radiogroup`,e.disable===!0&&(t[`aria-disabled`]=`true`)),t});function m(e){t(`update:modelValue`,e)}return()=>l(`div`,{class:f.value,...p.value},e.options.map((t,r)=>{let i=n[`label-`+r]===void 0?n.label===void 0?void 0:()=>n.label(t):()=>n[`label-`+r](t);return l(`div`,[l(o.value,{label:i===void 0?c.value(t):null,modelValue:e.modelValue,"onUpdate:modelValue":m,...d.value[r]},i)])}))}}),Sa=k({name:`DialogPluginComponent`,props:{...F,title:String,message:String,prompt:Object,options:Object,progress:[Boolean,Object],html:Boolean,ok:{type:[String,Object,Boolean],default:!0},cancel:[String,Object,Boolean],focus:{type:String,default:`ok`,validator:e=>[`ok`,`cancel`,`none`].includes(e)},stackButtons:Boolean,color:String,cardClass:[String,Array,Object],cardStyle:[String,Array,Object]},emits:[`ok`,`hide`],setup(e,{emit:t}){let{proxy:n}=T(),{$q:i}=n,a=N(e,i),o=s(null),c=s(e.prompt===void 0?e.options===void 0?void 0:e.options.model:e.prompt.model),u=v(()=>`q-dialog-plugin`+(a.value===!0?` q-dialog-plugin--dark q-dark`:``)+(e.progress===!1?``:` q-dialog-plugin--progress`)),d=v(()=>e.color||(a.value===!0?`amber`:`primary`)),f=v(()=>e.progress===!1?null:B(e.progress)===!0?{component:e.progress.spinner||se,props:{color:e.progress.color||d.value}}:{component:se,props:{color:d.value}}),p=v(()=>e.prompt!==void 0||e.options!==void 0),m=v(()=>{if(p.value!==!0)return{};let{model:t,isValid:n,items:r,...i}=e.prompt===void 0?e.options:e.prompt;return i}),h=v(()=>B(e.ok)===!0||e.ok===!0?i.lang.label.ok:e.ok),g=v(()=>B(e.cancel)===!0||e.cancel===!0?i.lang.label.cancel:e.cancel),_=v(()=>e.prompt===void 0?e.options===void 0?!1:e.options.isValid!==void 0&&e.options.isValid(c.value)!==!0:e.prompt.isValid!==void 0&&e.prompt.isValid(c.value)!==!0),ee=v(()=>({color:d.value,label:h.value,ripple:!1,disable:_.value,...B(e.ok)===!0?e.ok:{flat:!0},"data-autofocus":e.focus===`ok`&&p.value!==!0||void 0,onClick:S})),y=v(()=>({color:d.value,label:g.value,ripple:!1,...B(e.cancel)===!0?e.cancel:{flat:!0},"data-autofocus":e.focus===`cancel`&&p.value!==!0||void 0,onClick:C}));r(()=>e.prompt&&e.prompt.model,E),r(()=>e.options&&e.options.model,E);function b(){o.value.show()}function x(){o.value.hide()}function S(){t(`ok`,te(c.value)),x()}function C(){x()}function w(){t(`hide`)}function E(e){c.value=e}function D(t){_.value!==!0&&e.prompt.type!==`textarea`&&M(t,13)===!0&&S()}function ne(t,n){return e.html===!0?l(U,{class:t,innerHTML:n}):l(U,{class:t},()=>n)}function O(){return[l(Ke,{color:d.value,dense:!0,autofocus:!0,dark:a.value,...m.value,modelValue:c.value,"onUpdate:modelValue":E,onKeyup:D})]}function k(){return[l(xa,{color:d.value,options:e.options.items,dark:a.value,...m.value,modelValue:c.value,"onUpdate:modelValue":E})]}function A(){let t=[];return e.cancel&&t.push(l(Ve,y.value)),e.ok&&t.push(l(Ve,ee.value)),l(fa,{class:e.stackButtons===!0?`items-end`:``,vertical:e.stackButtons,align:`right`},()=>t)}function re(){let t=[];return e.title&&t.push(ne(`q-dialog__title`,e.title)),e.progress!==!1&&t.push(l(U,{class:`q-dialog__progress`},()=>l(f.value.component,f.value.props))),e.message&&t.push(ne(`q-dialog__message`,e.message)),e.prompt===void 0?e.options!==void 0&&t.push(l(he,{dark:a.value}),l(U,{class:`scroll q-dialog-plugin__form`},k),l(he,{dark:a.value})):t.push(l(U,{class:`scroll q-dialog-plugin__form`},O)),(e.ok||e.cancel)&&t.push(A()),t}function j(){return[l(wt,{class:[u.value,e.cardClass],style:e.cardStyle,dark:a.value},re)]}return Object.assign(n,{show:b,hide:x}),()=>l(Gt,{ref:o,onHide:w},j)}});function Ca(e,t){for(let n in t)n!==`spinner`&&Object(t[n])===t[n]?(e[n]=Object(e[n])===e[n]?{...e[n]}:{},Ca(e[n],t[n])):e[n]=t[n]}function wa(e,n,r){return i=>{let a,o,c=n===!0&&i.component!==void 0;if(c===!0){let{component:e,componentProps:t}=i;a=typeof e==`string`?r.component(e):e,o=t||{}}else{let{class:t,style:n,...r}=i;a=e,o=r,t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n)}let u,d=!1,f=s(null),p=Le(!1,`dialog`),m=e=>{if(f.value?.[e]!==void 0){f.value[e]();return}let t=u.$.subTree;if(t?.component){if(t.component.proxy&&t.component.proxy[e]){t.component.proxy[e]();return}if(t.component.subTree&&t.component.subTree.component&&t.component.subTree.component.proxy&&t.component.subTree.component.proxy[e]){t.component.subTree.component.proxy[e]();return}}console.error(`[Quasar] Incorrectly defined Dialog component`)},h=[],g=[],_={onOk(e){return h.push(e),_},onCancel(e){return g.push(e),_},onDismiss(e){return h.push(e),g.push(e),_},hide(){return m(`hide`),_},update(e){if(u!==null){if(c===!0)Object.assign(o,e);else{let{class:t,style:n,...r}=e;t!==void 0&&(r.cardClass=t),n!==void 0&&(r.cardStyle=n),Ca(o,r)}u.$forceUpdate()}return _}},ee=e=>{d=!0,h.forEach(t=>{t(e)})},v=()=>{y.unmount(p),Te(p),y=null,u=null,d!==!0&&g.forEach(e=>{e()})},y=_t({name:`QGlobalDialog`,setup:()=>()=>l(a,{...o,ref:f,onOk:ee,onHide:v,onVnodeMounted(...e){typeof o.onVnodeMounted==`function`&&o.onVnodeMounted(...e),t(()=>m(`show`))}})},r);return u=y.mount(p),_}}var Ta={install({$q:e,parentApp:t}){e.dialog=this.create=wa(Sa,!0,t)}},Ea={config:{dark:!0,brand:{primary:`#6c63ff`,secondary:`#26a69a`,accent:`#9c27b0`,dark:`#1a1a2e`,"dark-page":`#1a1a2e`,positive:`#21ba45`,negative:`#c10015`,info:`#31ccec`,warning:`#f2c037`}},plugins:{Notify:da,Dialog:Ta}},Da=`/`;async function Oa({app:e,router:t,store:n},r){let i=!1,a=e=>{try{return t.resolve(e).href}catch{}return Object(e)===e?null:e},o=e=>{if(i=!0,typeof e==`string`&&/^https?:\/\//.test(e)){window.location.href=e;return}let t=a(e);t!==null&&(window.location.href=t,window.location.reload())},s=window.location.href.replace(window.location.origin,``);for(let a=0;i===!1&&a<r.length;a++)try{await r[a]({app:e,router:t,store:n,ssrContext:null,redirect:o,urlPath:s,publicPath:Da})}catch(e){if(e&&e.url){o(e.url);return}console.error(`[Quasar] boot error:`,e);return}i!==!0&&(e.use(t),e.mount(`#q-app`))}Ji(A,Ea).then(e=>{let[t,n]=Promise.allSettled===void 0?[`all`,e=>e.map(e=>e.default)]:[`allSettled`,e=>e.map(e=>{if(e.status===`rejected`){console.error(`[Quasar] boot error:`,e.reason);return}return e.value.default})];return Promise[t]([Gi(()=>import(`./i18n-CNdSgNP6.js`),[])]).then(t=>{Oa(e,n(t).filter(e=>typeof e==`function`))})});export{U as C,Ct as S,en as _,Gi as a,Tt as b,zn as c,kn as d,Cn as f,dn as g,fn as h,fa as i,Ln as l,_n as m,_a as n,Vi as o,yn as p,ga as r,Bi as s,xa as t,wn as u,Gt as v,wt as x,Vt as y};