@loicngr/kobo 1.5.5 → 1.5.7

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 (183) hide show
  1. package/dist/server/db/migrations.js +14 -0
  2. package/dist/server/db/schema.js +3 -1
  3. package/dist/server/index.js +17 -1
  4. package/dist/server/routes/dev-server.js +1 -1
  5. package/dist/server/routes/health.js +95 -0
  6. package/dist/server/routes/search.js +33 -0
  7. package/dist/server/routes/settings.js +30 -0
  8. package/dist/server/routes/workspaces.js +55 -0
  9. package/dist/server/services/db-backup-service.js +66 -0
  10. package/dist/server/services/dev-server-service.js +24 -1
  11. package/dist/server/services/search-service.js +102 -0
  12. package/dist/server/services/settings-service.js +98 -10
  13. package/dist/server/services/templates-service.js +31 -0
  14. package/dist/server/services/workspace-service.js +55 -1
  15. package/dist/server/services/worktree-service.js +3 -2
  16. package/dist/server/utils/git-ops.js +14 -0
  17. package/dist/server/utils/paths.js +13 -1
  18. package/package.json +1 -1
  19. package/src/client/dist/spa/assets/ActivityFeed-Dc1oLbwJ.js +10 -0
  20. package/src/client/dist/spa/assets/ClosePopup-CdSn7HO8.js +1 -0
  21. package/src/client/dist/spa/assets/CreatePage-BDKfkW-N.js +2 -0
  22. package/src/client/dist/spa/assets/CreatePage-dMi4xVYN.css +1 -0
  23. package/src/client/dist/spa/assets/DiffViewer-DZ9h2M2n.js +2 -0
  24. package/src/client/dist/spa/assets/HealthPage-BkqexlJb.js +1 -0
  25. package/src/client/dist/spa/assets/{MainLayout-D9UzZ0l0.js → MainLayout-VxUBOt-P.js} +17 -17
  26. package/src/client/dist/spa/assets/MainLayout-rVleAIBi.css +1 -0
  27. package/src/client/dist/spa/assets/QBadge-Bvh-hQ8K.js +1 -0
  28. package/src/client/dist/spa/assets/QBtn-BsD8vrWq.js +1 -0
  29. package/src/client/dist/spa/assets/QDialog-CkbLS1If.js +1 -0
  30. package/src/client/dist/spa/assets/QExpansionItem-C735ptO9.js +1 -0
  31. package/src/client/dist/spa/assets/QItem-DfoP6eYj.js +1 -0
  32. package/src/client/dist/spa/assets/QList-D80ms7bw.js +1 -0
  33. package/src/client/dist/spa/assets/QMenu-DU-wiY_A.js +1 -0
  34. package/src/client/dist/spa/assets/QPage-BKY2-sf-.js +1 -0
  35. package/src/client/dist/spa/assets/QSpace-C5Ebr0vq.js +1 -0
  36. package/src/client/dist/spa/assets/QSpinner-CliSLjf8.js +1 -0
  37. package/src/client/dist/spa/assets/QSpinnerDots-Dp12eHrB.js +1 -0
  38. package/src/client/dist/spa/assets/QTabPanels-DV1b1MQb.js +1 -0
  39. package/src/client/dist/spa/assets/QToggle-B0HvuNEg.js +1 -0
  40. package/src/client/dist/spa/assets/QTooltip-kLXuUa_m.js +1 -0
  41. package/src/client/dist/spa/assets/SearchPage-DWglAeQv.css +1 -0
  42. package/src/client/dist/spa/assets/SearchPage-ZDAo7WgD.js +1 -0
  43. package/src/client/dist/spa/assets/SettingsPage-CLMCHMpz.css +1 -0
  44. package/src/client/dist/spa/assets/SettingsPage-D89evCuo.js +1 -0
  45. package/src/client/dist/spa/assets/TouchPan-CVMnGs0y.js +1 -0
  46. package/src/client/dist/spa/assets/WorkspacePage-CWRMLYs-.css +1 -0
  47. package/src/client/dist/spa/assets/WorkspacePage-Ds5Dqxas.js +4 -0
  48. package/src/client/dist/spa/assets/_plugin-vue_export-helper-Cxt1D8wE.js +1 -0
  49. package/src/client/dist/spa/assets/{cssMode-CzYfUUcg.js → cssMode-C9wGTDAD.js} +1 -1
  50. package/src/client/dist/spa/assets/{editor.api-Do3RvGrr.js → editor.api-K7V5sl05.js} +1 -1
  51. package/src/client/dist/spa/assets/{editor.main-BXGLrNaH.js → editor.main-vZ6V2hrP.js} +3 -3
  52. package/src/client/dist/spa/assets/focus-manager-DYbz9jFW.js +1 -0
  53. package/src/client/dist/spa/assets/formatters-BzaS4w0I.js +1 -0
  54. package/src/client/dist/spa/assets/{freemarker2-DD7dLGS5.js → freemarker2-CRk6pTND.js} +1 -1
  55. package/src/client/dist/spa/assets/{handlebars-C6fNrY_c.js → handlebars-Cs3bFomb.js} +1 -1
  56. package/src/client/dist/spa/assets/{html-CsN_ZrNj.js → html-BT4-1gwt.js} +1 -1
  57. package/src/client/dist/spa/assets/{htmlMode-BePbSvxH.js → htmlMode-DZ9LYDVG.js} +1 -1
  58. package/src/client/dist/spa/assets/i18n-C0RbMxeL.js +1 -0
  59. package/src/client/dist/spa/assets/i18n-CkN9X6lQ.js +1 -0
  60. package/src/client/dist/spa/assets/index-Br4eMfSu.js +5 -0
  61. package/src/client/dist/spa/assets/{javascript-CkZZHPRD.js → javascript-C0nTLIDg.js} +1 -1
  62. package/src/client/dist/spa/assets/{jsonMode-CsqbZ0c2.js → jsonMode-LIrD4Pxq.js} +1 -1
  63. package/src/client/dist/spa/assets/{liquid-CB4bbF-9.js → liquid-BbaUnvHA.js} +1 -1
  64. package/src/client/dist/spa/assets/{marked.esm-DIsIySzr.js → marked.esm-gIBce057.js} +1 -1
  65. package/src/client/dist/spa/assets/{mdx-goM-jFgd.js → mdx-B6iNIRi2.js} +1 -1
  66. package/src/client/dist/spa/assets/models-C3h6lSte.js +1 -0
  67. package/src/client/dist/spa/assets/{monaco.contribution-tq8HWx81.js → monaco.contribution-CZ_PxrB6.js} +2 -2
  68. package/src/client/dist/spa/assets/pinia-C3JsrLkB.js +1 -0
  69. package/src/client/dist/spa/assets/private.use-form-BhKyDtO7.js +1 -0
  70. package/src/client/dist/spa/assets/{python-BKb3PkXw.js → python-C0uk6BYc.js} +1 -1
  71. package/src/client/dist/spa/assets/rate-limit-labels-dCPVjS61.js +6 -0
  72. package/src/client/dist/spa/assets/{razor-rLKJylZh.js → razor-Bj__h6OQ.js} +1 -1
  73. package/src/client/dist/spa/assets/runtime-core.esm-bundler-C3IgBgY5.js +1 -0
  74. package/src/client/dist/spa/assets/scroll-CLibRGI-.js +1 -0
  75. package/src/client/dist/spa/assets/settings-B69lIVX0.js +1 -0
  76. package/src/client/dist/spa/assets/symbols-CAg-nBkV.js +1 -0
  77. package/src/client/dist/spa/assets/touch-ChrvzrnI.js +1 -0
  78. package/src/client/dist/spa/assets/{tsMode-CjX_dUdq.js → tsMode-ZSZcAFKU.js} +1 -1
  79. package/src/client/dist/spa/assets/{typescript-Bg5NM6yP.js → typescript-Bgw42jIH.js} +1 -1
  80. package/src/client/dist/spa/assets/use-dark-DnuCB6tC.js +1 -0
  81. package/src/client/dist/spa/assets/vue-i18n-eUDnMrPl.js +3 -0
  82. package/src/client/dist/spa/assets/{xml-BMWcIRqp.js → xml-B9gVeW9V.js} +1 -1
  83. package/src/client/dist/spa/assets/{yaml-C2uOvXS0.js → yaml-DUqEwwz-.js} +1 -1
  84. package/src/client/dist/spa/index.html +15 -7
  85. package/src/client/dist/spa/assets/ActivityFeed-CAgtfoqj.js +0 -10
  86. package/src/client/dist/spa/assets/ClosePopup-BfANRQ7n.js +0 -1
  87. package/src/client/dist/spa/assets/CreatePage-CNnVeRGC.css +0 -1
  88. package/src/client/dist/spa/assets/CreatePage-CnsmjbZl.js +0 -2
  89. package/src/client/dist/spa/assets/DiffViewer-CwAhR0Bt.js +0 -2
  90. package/src/client/dist/spa/assets/MainLayout-1KXWlMYS.css +0 -1
  91. package/src/client/dist/spa/assets/QBadge-DENdn6Dv.js +0 -1
  92. package/src/client/dist/spa/assets/QExpansionItem-ZAI_l6AW.js +0 -1
  93. package/src/client/dist/spa/assets/QList-aKZe9BNZ.js +0 -1
  94. package/src/client/dist/spa/assets/QMenu-DDXq2SFM.js +0 -1
  95. package/src/client/dist/spa/assets/QSpinnerDots-DytntAbf.js +0 -1
  96. package/src/client/dist/spa/assets/SettingsPage-DCgRTq-c.js +0 -1
  97. package/src/client/dist/spa/assets/SettingsPage-oWZ8sGFm.css +0 -1
  98. package/src/client/dist/spa/assets/TouchPan-D_gmnARo.js +0 -1
  99. package/src/client/dist/spa/assets/WorkspacePage-BSBiQTKy.js +0 -4
  100. package/src/client/dist/spa/assets/WorkspacePage-DZwv9kFd.css +0 -1
  101. package/src/client/dist/spa/assets/_plugin-vue_export-helper-DkL3SKZ8.js +0 -1
  102. package/src/client/dist/spa/assets/formatters-hnFdqDO2.js +0 -6
  103. package/src/client/dist/spa/assets/i18n-C_tQYbyT.js +0 -1
  104. package/src/client/dist/spa/assets/i18n-zwZDkEfm.js +0 -1
  105. package/src/client/dist/spa/assets/index-BJT6ZfVp.js +0 -5
  106. package/src/client/dist/spa/assets/models-Dwzf2zDK.js +0 -1
  107. package/src/client/dist/spa/assets/private.use-form-BWfHn8G9.js +0 -1
  108. package/src/client/dist/spa/assets/scroll-CHtHNzvE.js +0 -1
  109. package/src/client/dist/spa/assets/settings-BdrDg_dO.js +0 -1
  110. package/src/client/dist/spa/assets/touch-5Jv2Ep3F.js +0 -1
  111. package/src/client/dist/spa/assets/use-checkbox-By4PLtaB.js +0 -1
  112. package/src/client/dist/spa/assets/vue-i18n-CFW7O-jl.js +0 -3
  113. /package/src/client/dist/spa/assets/{abap-Dvixoi-w.js → abap-CFuyUYKP.js} +0 -0
  114. /package/src/client/dist/spa/assets/{apex-DP7X7Z9Q.js → apex-Ctq_xcrv.js} +0 -0
  115. /package/src/client/dist/spa/assets/{azcli-BdzyZYsP.js → azcli-BBQSVn-C.js} +0 -0
  116. /package/src/client/dist/spa/assets/{bat-BskgK8bi.js → bat-DbnqAfvr.js} +0 -0
  117. /package/src/client/dist/spa/assets/{bicep-BB_erhjR.js → bicep-BtDlIXop.js} +0 -0
  118. /package/src/client/dist/spa/assets/{cameligo-PvLD8t4t.js → cameligo-BLeJgKTj.js} +0 -0
  119. /package/src/client/dist/spa/assets/{clojure-CjHVLzZR.js → clojure-aZUQIUKP.js} +0 -0
  120. /package/src/client/dist/spa/assets/{coffee-DCoMPIwW.js → coffee-Secadq9U.js} +0 -0
  121. /package/src/client/dist/spa/assets/{cpp-kftb9yup.js → cpp-JicRPTRv.js} +0 -0
  122. /package/src/client/dist/spa/assets/{csharp-CYKl40UV.js → csharp-C7NSOZyj.js} +0 -0
  123. /package/src/client/dist/spa/assets/{csp-d1_9kWqP.js → csp-CIje7830.js} +0 -0
  124. /package/src/client/dist/spa/assets/{css-CSa8r6i8.js → css-G0bm1q_M.js} +0 -0
  125. /package/src/client/dist/spa/assets/{cypher-FoBj7udD.js → cypher-CldD5D0u.js} +0 -0
  126. /package/src/client/dist/spa/assets/{dart-BoITdHw1.js → dart-DIK3l8YT.js} +0 -0
  127. /package/src/client/dist/spa/assets/{dockerfile-CRYieHSB.js → dockerfile-czxaGh2L.js} +0 -0
  128. /package/src/client/dist/spa/assets/{ecl-BisizQmF.js → ecl-BqdYhwmw.js} +0 -0
  129. /package/src/client/dist/spa/assets/{elixir-DMza7PS-.js → elixir-m52LePTW.js} +0 -0
  130. /package/src/client/dist/spa/assets/{flow9-DZyDUZ6t.js → flow9-B5QJ9GvZ.js} +0 -0
  131. /package/src/client/dist/spa/assets/{format-Ex4UmWdz.js → format-Cyg8IgRi.js} +0 -0
  132. /package/src/client/dist/spa/assets/{fsharp-CKv7fFew.js → fsharp-B15czHsH.js} +0 -0
  133. /package/src/client/dist/spa/assets/{go-DXZqPXQn.js → go-BkoQxDo1.js} +0 -0
  134. /package/src/client/dist/spa/assets/{graphql-DrGE7IlY.js → graphql-BnI6uRa_.js} +0 -0
  135. /package/src/client/dist/spa/assets/{hcl-DLEN_UIX.js → hcl-CAwwENT7.js} +0 -0
  136. /package/src/client/dist/spa/assets/{ini-mQpaJDpd.js → ini-BHM5zh1H.js} +0 -0
  137. /package/src/client/dist/spa/assets/{java-jjG-xxwG.js → java-B5i95QvQ.js} +0 -0
  138. /package/src/client/dist/spa/assets/{julia-C50bVRho.js → julia-DPDm885q.js} +0 -0
  139. /package/src/client/dist/spa/assets/{kotlin-DwU9Bxzl.js → kotlin-qoccd5BP.js} +0 -0
  140. /package/src/client/dist/spa/assets/{less-Duxayr-t.js → less-B6RU166D.js} +0 -0
  141. /package/src/client/dist/spa/assets/{lexon-D3Je_oKk.js → lexon-YfUeoL1V.js} +0 -0
  142. /package/src/client/dist/spa/assets/{lua-DqW2q2h7.js → lua-BIUI5y9b.js} +0 -0
  143. /package/src/client/dist/spa/assets/{m3-CO3sU7vD.js → m3-D5SAbSdU.js} +0 -0
  144. /package/src/client/dist/spa/assets/{markdown-CbqjBAOS.js → markdown-CVJLwHzJ.js} +0 -0
  145. /package/src/client/dist/spa/assets/{mips-Bj7AN96v.js → mips-R-FZ3zOR.js} +0 -0
  146. /package/src/client/dist/spa/assets/{msdax-aLgc6HYp.js → msdax-Blveyl9r.js} +0 -0
  147. /package/src/client/dist/spa/assets/{mysql-QJHu-LiC.js → mysql-D4mY1AFx.js} +0 -0
  148. /package/src/client/dist/spa/assets/{objective-c-BRcZj02O.js → objective-c-BmXrLr4h.js} +0 -0
  149. /package/src/client/dist/spa/assets/{pascal-j04gUgnY.js → pascal-yxckoyvV.js} +0 -0
  150. /package/src/client/dist/spa/assets/{pascaligo-6Lz1Pduc.js → pascaligo-Q5JCwXMI.js} +0 -0
  151. /package/src/client/dist/spa/assets/{perl-Ny9A9N4B.js → perl-BF1Rrs5h.js} +0 -0
  152. /package/src/client/dist/spa/assets/{pgsql-gEZ-9kd2.js → pgsql-CnYB97wm.js} +0 -0
  153. /package/src/client/dist/spa/assets/{php-B81GxKax.js → php-CdDfQfSg.js} +0 -0
  154. /package/src/client/dist/spa/assets/{pla-DS3E9Auu.js → pla-whj-d71F.js} +0 -0
  155. /package/src/client/dist/spa/assets/{postiats-CHuHziKk.js → postiats-ClfLr4I-.js} +0 -0
  156. /package/src/client/dist/spa/assets/{powerquery-DWZsw4AU.js → powerquery-iRaBhuuk.js} +0 -0
  157. /package/src/client/dist/spa/assets/{powershell-MAGzBvoK.js → powershell-DjiEt5xK.js} +0 -0
  158. /package/src/client/dist/spa/assets/{protobuf-CuqThPZN.js → protobuf-B6dcIEUr.js} +0 -0
  159. /package/src/client/dist/spa/assets/{pug-DpwILTue.js → pug-DtmHnjM9.js} +0 -0
  160. /package/src/client/dist/spa/assets/{qsharp-Clbrosr3.js → qsharp-CELCyd79.js} +0 -0
  161. /package/src/client/dist/spa/assets/{r-dNsdrNRn.js → r-ZpJXWV-o.js} +0 -0
  162. /package/src/client/dist/spa/assets/{redis-DRY-nYja.js → redis-BiHSNkAl.js} +0 -0
  163. /package/src/client/dist/spa/assets/{redshift-CGzDbZLe.js → redshift-DzuwYCHP.js} +0 -0
  164. /package/src/client/dist/spa/assets/{restructuredtext-DiI6OCjv.js → restructuredtext-YOT94bbS.js} +0 -0
  165. /package/src/client/dist/spa/assets/{ruby-DTTFtlqw.js → ruby-BfiHr6Uu.js} +0 -0
  166. /package/src/client/dist/spa/assets/{rust-Cv26V_Fa.js → rust-JZ-uOoYM.js} +0 -0
  167. /package/src/client/dist/spa/assets/{sb-WM3UPTLr.js → sb-CBglP1-t.js} +0 -0
  168. /package/src/client/dist/spa/assets/{scala-Brw-oZFc.js → scala-C9l41paw.js} +0 -0
  169. /package/src/client/dist/spa/assets/{scheme-B9_NJi2n.js → scheme-B-InQ6hy.js} +0 -0
  170. /package/src/client/dist/spa/assets/{scss-AJXcdTUI.js → scss-v6OmJRN9.js} +0 -0
  171. /package/src/client/dist/spa/assets/{shell-B8rXUKDl.js → shell-Dyp6iwB6.js} +0 -0
  172. /package/src/client/dist/spa/assets/{solidity-DBduMAba.js → solidity-D5epNWue.js} +0 -0
  173. /package/src/client/dist/spa/assets/{sophia-CLkSrv5f.js → sophia-Eva-79sB.js} +0 -0
  174. /package/src/client/dist/spa/assets/{sparql-8jfjvjhF.js → sparql-gvALLO1w.js} +0 -0
  175. /package/src/client/dist/spa/assets/{sql-DCI2HndY.js → sql-COdamZYI.js} +0 -0
  176. /package/src/client/dist/spa/assets/{st-YiBlEXuf.js → st-eMoImIwE.js} +0 -0
  177. /package/src/client/dist/spa/assets/{swift-BpRZ1CVX.js → swift-7R_T9RYH.js} +0 -0
  178. /package/src/client/dist/spa/assets/{systemverilog-2_XLvhYi.js → systemverilog-1pCEfaHU.js} +0 -0
  179. /package/src/client/dist/spa/assets/{tcl-6xehSJT3.js → tcl-B_KgnhfE.js} +0 -0
  180. /package/src/client/dist/spa/assets/{twig-B80I9c0D.js → twig-CFZUJxb9.js} +0 -0
  181. /package/src/client/dist/spa/assets/{typespec-BsAPJtGA.js → typespec-B1ZgHlud.js} +0 -0
  182. /package/src/client/dist/spa/assets/{vb-B6Q-99Bj.js → vb-DKdun5tL.js} +0 -0
  183. /package/src/client/dist/spa/assets/{wgsl-DPkCsCSS.js → wgsl-CzNaxTrn.js} +0 -0
@@ -53,6 +53,8 @@ Please:
53
53
  3. Post a comment on the PR summarizing what was done and any follow-up items
54
54
  4. Do NOT add a "Generated with Claude Code" footer or any AI attribution to the PR description
55
55
  `;
56
+ /** Default workspace tags seeded on fresh install and on settings upgrade. */
57
+ export const DEFAULT_WORKSPACE_TAGS = ['bug', 'feature', 'refactor', 'docs', 'wip', 'urgent', 'blocked'];
56
58
  const settingsMigrations = [
57
59
  {
58
60
  version: 1,
@@ -136,11 +138,33 @@ const settingsMigrations = [
136
138
  global.sentryMcpKey = '';
137
139
  },
138
140
  },
141
+ {
142
+ version: 8,
143
+ name: 'add-workspace-tags',
144
+ migrate({ global }) {
145
+ if (!Array.isArray(global.tags))
146
+ global.tags = [...DEFAULT_WORKSPACE_TAGS];
147
+ },
148
+ },
139
149
  ];
140
150
  /** Current settings schema version — always equals the highest migration version. */
141
151
  export const SETTINGS_SCHEMA_VERSION = settingsMigrations.length > 0 ? settingsMigrations[settingsMigrations.length - 1].version : 0;
142
- let settingsFilePath = getSettingsPath();
152
+ // In Vitest runs, default to a sentinel path so any test that reaches a real
153
+ // read/write without explicitly calling `_setSettingsPath()` first fails loud
154
+ // instead of silently clobbering the user's production `~/.config/kobo/settings.json`.
155
+ // A past incident (see investigation 2026-04-17) showed a `vi.spyOn(fs, 'readFileSync')`
156
+ // in another test file indirectly triggered `readSettings()` and overwrote the
157
+ // real settings file. This guard ensures such a regression cannot recur.
158
+ const VITEST_UNINITIALIZED_PATH = '__VITEST_SETTINGS_PATH_NOT_SET__';
159
+ let settingsFilePath = process.env.VITEST ? VITEST_UNINITIALIZED_PATH : getSettingsPath();
143
160
  let settingsBackupSequence = 0;
161
+ function ensureSettingsPathInitialized() {
162
+ if (settingsFilePath === VITEST_UNINITIALIZED_PATH) {
163
+ throw new Error('[settings-service] Attempted to access settings in test mode without calling `_setSettingsPath()` first. ' +
164
+ 'This means a test is exercising settings-service indirectly (e.g. via `extractSentryIssue`, `getEffectiveSettings`) ' +
165
+ 'without proper isolation. Either `vi.mock("../server/services/settings-service.js", ...)` or call `_setSettingsPath(tmpPath)` in `beforeEach`.');
166
+ }
167
+ }
144
168
  /** Override the settings file path (used by tests). */
145
169
  export function _setSettingsPath(p) {
146
170
  settingsFilePath = p;
@@ -149,7 +173,7 @@ function defaultSettings() {
149
173
  return {
150
174
  schemaVersion: SETTINGS_SCHEMA_VERSION,
151
175
  global: {
152
- defaultModel: 'auto',
176
+ defaultModel: 'claude-opus-4-7',
153
177
  dangerouslySkipPermissions: true,
154
178
  prPromptTemplate: DEFAULT_PR_PROMPT_TEMPLATE,
155
179
  gitConventions: DEFAULT_GIT_CONVENTIONS,
@@ -161,6 +185,7 @@ function defaultSettings() {
161
185
  defaultPermissionMode: 'plan',
162
186
  notionMcpKey: '',
163
187
  sentryMcpKey: '',
188
+ tags: [...DEFAULT_WORKSPACE_TAGS],
164
189
  },
165
190
  projects: [],
166
191
  };
@@ -175,8 +200,6 @@ function defaultProjectSettings(projectPath) {
175
200
  prPromptTemplate: '',
176
201
  gitConventions: '',
177
202
  setupScript: '',
178
- notionInProgressStatus: '',
179
- notionStatusProperty: '',
180
203
  devServer: {
181
204
  startCommand: '',
182
205
  stopCommand: '',
@@ -206,6 +229,7 @@ export function runSettingsMigrations(raw) {
206
229
  return current;
207
230
  }
208
231
  function readSettings() {
232
+ ensureSettingsPathInitialized();
209
233
  if (!fs.existsSync(settingsFilePath)) {
210
234
  const defaults = defaultSettings();
211
235
  writeSettings(defaults);
@@ -217,19 +241,24 @@ function readSettings() {
217
241
  parsed = JSON.parse(raw);
218
242
  }
219
243
  catch {
244
+ createSettingsBackupIfPresent();
220
245
  const defaults = defaultSettings();
221
246
  writeSettings(defaults);
222
247
  return defaults;
223
248
  }
224
249
  if (!parsed || typeof parsed !== 'object') {
250
+ createSettingsBackupIfPresent();
225
251
  const defaults = defaultSettings();
226
252
  writeSettings(defaults);
227
253
  return defaults;
228
254
  }
229
255
  const originalVersion = parsed.schemaVersion;
230
256
  const migrated = runSettingsMigrations(parsed);
231
- // If migrations bumped the version, persist the upgraded settings so the
232
- // next process doesn't re-run them on every load.
257
+ // Restore any global fields that may have been removed by external edits.
258
+ // Defaults act as fallback for missing keys; existing values are preserved.
259
+ const globalDefaults = defaultSettings().global;
260
+ migrated.global = { ...globalDefaults, ...migrated.global };
261
+ // Persist if migrations bumped the version, or if global fields were restored.
233
262
  if (migrated.schemaVersion !== originalVersion) {
234
263
  writeSettings(migrated);
235
264
  }
@@ -245,6 +274,7 @@ function createSettingsBackupIfPresent() {
245
274
  fs.copyFileSync(settingsFilePath, backupPath);
246
275
  }
247
276
  function writeSettings(settings, options) {
277
+ ensureSettingsPathInitialized();
248
278
  const tmpPath = `${settingsFilePath}.tmp`;
249
279
  const dir = path.dirname(settingsFilePath);
250
280
  if (!fs.existsSync(dir)) {
@@ -260,6 +290,58 @@ function writeSettings(settings, options) {
260
290
  export function getSettings() {
261
291
  return readSettings();
262
292
  }
293
+ /** Keys stripped from exports — secrets that should stay on the machine. */
294
+ const SECRET_GLOBAL_KEYS = ['notionMcpKey', 'sentryMcpKey'];
295
+ /** Build an export bundle with settings + templates. MCP keys are stripped. */
296
+ export function exportConfigBundle(templates) {
297
+ const settings = readSettings();
298
+ const sanitizedGlobal = { ...settings.global };
299
+ for (const key of SECRET_GLOBAL_KEYS) {
300
+ sanitizedGlobal[key] = '';
301
+ }
302
+ return {
303
+ bundleVersion: 1,
304
+ exportedAt: new Date().toISOString(),
305
+ settings: { ...settings, global: sanitizedGlobal },
306
+ templates,
307
+ };
308
+ }
309
+ /** Replace the settings file with an imported bundle. MCP keys in the current settings are preserved. */
310
+ export function importConfigBundle(bundle) {
311
+ if (!bundle || typeof bundle !== 'object') {
312
+ throw new Error('Invalid bundle: payload must be an object');
313
+ }
314
+ if (bundle.bundleVersion !== 1) {
315
+ throw new Error('Invalid bundle: expected bundleVersion = 1');
316
+ }
317
+ const incoming = bundle.settings;
318
+ if (!incoming || typeof incoming !== 'object') {
319
+ throw new Error('Invalid bundle: missing or malformed settings');
320
+ }
321
+ const incomingSettings = incoming;
322
+ if (!incomingSettings.global ||
323
+ typeof incomingSettings.global !== 'object' ||
324
+ Array.isArray(incomingSettings.global)) {
325
+ throw new Error('Invalid bundle: settings.global must be an object');
326
+ }
327
+ if (!Array.isArray(incomingSettings.projects)) {
328
+ throw new Error('Invalid bundle: settings.projects must be an array');
329
+ }
330
+ for (let i = 0; i < incomingSettings.projects.length; i++) {
331
+ const p = incomingSettings.projects[i];
332
+ if (!p || typeof p !== 'object' || Array.isArray(p)) {
333
+ throw new Error(`Invalid bundle: settings.projects[${i}] must be an object`);
334
+ }
335
+ }
336
+ const current = readSettings();
337
+ // Run the incoming through the migration pipeline in case an older version is imported.
338
+ const migrated = runSettingsMigrations(incoming);
339
+ // Preserve existing MCP keys — the export stripped them and we don't want to clobber a local config.
340
+ for (const key of SECRET_GLOBAL_KEYS) {
341
+ migrated.global[key] = current.global[key];
342
+ }
343
+ writeSettings(migrated, { backup: true });
344
+ }
263
345
  /** Return only the global settings section. */
264
346
  export function getGlobalSettings() {
265
347
  return readSettings().global;
@@ -294,8 +376,8 @@ export function getEffectiveSettings(projectPath) {
294
376
  sourceBranch: project.defaultSourceBranch,
295
377
  devServer: project.devServer,
296
378
  setupScript: project.setupScript || '',
297
- notionStatusProperty: project.notionStatusProperty || settings.global.notionStatusProperty,
298
- notionInProgressStatus: project.notionInProgressStatus || settings.global.notionInProgressStatus,
379
+ notionStatusProperty: settings.global.notionStatusProperty,
380
+ notionInProgressStatus: settings.global.notionInProgressStatus,
299
381
  };
300
382
  }
301
383
  /** Merge partial updates into global settings and persist. */
@@ -314,8 +396,16 @@ export function updateGlobalSettings(data) {
314
396
  'defaultPermissionMode',
315
397
  'notionMcpKey',
316
398
  'sentryMcpKey',
399
+ 'tags',
317
400
  ];
318
401
  const filtered = pickKnownKeys(data, allowedGlobalKeys);
402
+ if (filtered.tags !== undefined) {
403
+ filtered.tags = Array.isArray(filtered.tags)
404
+ ? Array.from(new Set(filtered.tags
405
+ .map((t) => (typeof t === 'string' ? t.trim() : ''))
406
+ .filter((t) => t.length > 0 && t.length <= 50)))
407
+ : settings.global.tags;
408
+ }
319
409
  settings.global = { ...settings.global, ...filtered };
320
410
  writeSettings(settings, { backup: true });
321
411
  return settings.global;
@@ -330,8 +420,6 @@ export function upsertProject(projectPath, data) {
330
420
  'prPromptTemplate',
331
421
  'gitConventions',
332
422
  'setupScript',
333
- 'notionStatusProperty',
334
- 'notionInProgressStatus',
335
423
  'devServer',
336
424
  ];
337
425
  const allowedDevServerKeys = ['startCommand', 'stopCommand'];
@@ -95,6 +95,37 @@ function writeTemplates(templates) {
95
95
  const file = { version: CURRENT_FILE_VERSION, templates };
96
96
  writeFileSync(filePath, JSON.stringify(file, null, 2), 'utf-8');
97
97
  }
98
+ /**
99
+ * Replace the entire templates list atomically. Validates each entry and
100
+ * rejects the whole write on any invalid row — do not partially accept.
101
+ * Used by config import.
102
+ */
103
+ export function replaceAllTemplates(templates) {
104
+ if (!Array.isArray(templates)) {
105
+ throw new Error('Invalid templates payload: expected an array');
106
+ }
107
+ const now = new Date().toISOString();
108
+ const validated = [];
109
+ const seenSlugs = new Set();
110
+ for (let i = 0; i < templates.length; i++) {
111
+ const t = templates[i];
112
+ if (!t || typeof t !== 'object') {
113
+ throw new Error(`Invalid template at index ${i}: not an object`);
114
+ }
115
+ const slug = typeof t.slug === 'string' ? t.slug : '';
116
+ const description = typeof t.description === 'string' ? t.description : '';
117
+ const content = typeof t.content === 'string' ? t.content : '';
118
+ validateTemplateInput({ slug, description, content });
119
+ if (seenSlugs.has(slug)) {
120
+ throw new Error(`Duplicate template slug: '${slug}'`);
121
+ }
122
+ seenSlugs.add(slug);
123
+ const createdAt = typeof t.createdAt === 'string' ? t.createdAt : now;
124
+ const updatedAt = typeof t.updatedAt === 'string' ? t.updatedAt : now;
125
+ validated.push({ slug, description, content, createdAt, updatedAt });
126
+ }
127
+ writeTemplates(validated);
128
+ }
98
129
  function seedTemplates() {
99
130
  const now = new Date().toISOString();
100
131
  const seed = [
@@ -27,10 +27,26 @@ function mapWorkspace(row) {
27
27
  devServerStatus: row.dev_server_status,
28
28
  hasUnread: row.has_unread === 1,
29
29
  archivedAt: row.archived_at,
30
+ favoritedAt: row.favorited_at,
31
+ tags: parseTags(row.tags),
30
32
  createdAt: row.created_at,
31
33
  updatedAt: row.updated_at,
32
34
  };
33
35
  }
36
+ /** Parse the JSON-serialized tags column to a string[]. Returns [] on null/invalid. */
37
+ function parseTags(raw) {
38
+ if (!raw)
39
+ return [];
40
+ try {
41
+ const parsed = JSON.parse(raw);
42
+ if (!Array.isArray(parsed))
43
+ return [];
44
+ return parsed.filter((t) => typeof t === 'string');
45
+ }
46
+ catch {
47
+ return [];
48
+ }
49
+ }
34
50
  function mapTask(row) {
35
51
  return {
36
52
  id: row.id,
@@ -51,7 +67,7 @@ export function createWorkspace(data) {
51
67
  db.prepare(`
52
68
  INSERT INTO workspaces (id, name, project_path, source_branch, working_branch, status, notion_url, notion_page_id, model, reasoning_effort, permission_mode, created_at, updated_at)
53
69
  VALUES (?, ?, ?, ?, ?, 'created', ?, ?, ?, ?, ?, ?, ?)
54
- `).run(id, data.name, data.projectPath, data.sourceBranch, data.workingBranch, data.notionUrl ?? null, data.notionPageId ?? null, data.model ?? 'claude-opus-4-6', data.reasoningEffort ?? 'auto', data.permissionMode ?? 'auto-accept', now, now);
70
+ `).run(id, data.name, data.projectPath, data.sourceBranch, data.workingBranch, data.notionUrl ?? null, data.notionPageId ?? null, data.model ?? 'claude-opus-4-7', data.reasoningEffort ?? 'auto', data.permissionMode ?? 'auto-accept', now, now);
55
71
  return getWorkspace(id);
56
72
  }
57
73
  /** Fetch a single workspace by ID, or null if not found. */
@@ -277,6 +293,44 @@ export function unarchiveWorkspace(id) {
277
293
  db.prepare('UPDATE workspaces SET archived_at = NULL, updated_at = ? WHERE id = ?').run(now, id);
278
294
  return getWorkspace(id);
279
295
  }
296
+ /** Mark a workspace as a favorite. Idempotent — refreshes the timestamp if already favorited. */
297
+ export function setFavorite(id) {
298
+ const db = getDb();
299
+ const now = new Date().toISOString();
300
+ const result = db.prepare('UPDATE workspaces SET favorited_at = ?, updated_at = ? WHERE id = ?').run(now, now, id);
301
+ if (result.changes === 0) {
302
+ throw new Error(`Workspace '${id}' not found`);
303
+ }
304
+ return getWorkspace(id);
305
+ }
306
+ /** Remove a workspace from favorites. Idempotent: safe to call on a non-favorite, though `updated_at` still refreshes. */
307
+ export function unsetFavorite(id) {
308
+ const db = getDb();
309
+ const now = new Date().toISOString();
310
+ const result = db.prepare('UPDATE workspaces SET favorited_at = NULL, updated_at = ? WHERE id = ?').run(now, id);
311
+ if (result.changes === 0) {
312
+ throw new Error(`Workspace '${id}' not found`);
313
+ }
314
+ return getWorkspace(id);
315
+ }
316
+ /** Maximum tag length (characters) and max number of tags per workspace. */
317
+ export const MAX_TAG_LENGTH = 50;
318
+ export const MAX_WORKSPACE_TAGS = 50;
319
+ /** Replace the workspace's tag list. Trims, dedupes, caps length per tag and count total. */
320
+ export function setWorkspaceTags(id, tags) {
321
+ const normalized = Array.from(new Set(tags
322
+ .map((t) => (typeof t === 'string' ? t.trim() : ''))
323
+ .filter((t) => t.length > 0 && t.length <= MAX_TAG_LENGTH))).slice(0, MAX_WORKSPACE_TAGS);
324
+ const db = getDb();
325
+ const now = new Date().toISOString();
326
+ const result = db
327
+ .prepare('UPDATE workspaces SET tags = ?, updated_at = ? WHERE id = ?')
328
+ .run(JSON.stringify(normalized), now, id);
329
+ if (result.changes === 0) {
330
+ throw new Error(`Workspace '${id}' not found`);
331
+ }
332
+ return getWorkspace(id);
333
+ }
280
334
  function mapSession(row) {
281
335
  return {
282
336
  id: row.id,
@@ -46,8 +46,9 @@ export function createWorktree(projectPath, branchName, sourceBranch) {
46
46
  }
47
47
  const worktreePath = path.join(worktreesDir, branchName);
48
48
  try {
49
- // Try creating a new branch + worktree
50
- git(projectPath, ['worktree', 'add', '-b', branchName, worktreePath, sourceBranch]);
49
+ // Use origin/<sourceBranch> as the base so the worktree starts from the
50
+ // freshly-fetched remote ref (fetchSourceBranch is always called first).
51
+ git(projectPath, ['worktree', 'add', '-b', branchName, worktreePath, `origin/${sourceBranch}`]);
51
52
  }
52
53
  catch (err) {
53
54
  const message = err instanceof Error ? err.message : String(err);
@@ -109,6 +109,20 @@ export function pushBranch(repoPath, branchName, remote = 'origin') {
109
109
  throw new Error(`Failed to push branch '${branchName}' to '${remote}': ${message}`);
110
110
  }
111
111
  }
112
+ /**
113
+ * Fetch a single branch from the remote. Throws if the fetch fails (no remote,
114
+ * branch absent on remote, network error, etc.). Call this before creating a
115
+ * worktree to ensure `origin/<sourceBranch>` is up to date.
116
+ */
117
+ export function fetchSourceBranch(repoPath, sourceBranch, remote = 'origin') {
118
+ try {
119
+ git(repoPath, ['fetch', remote, sourceBranch]);
120
+ }
121
+ catch (err) {
122
+ const message = err instanceof Error ? err.message : String(err);
123
+ throw new Error(`Failed to fetch '${sourceBranch}' from '${remote}': ${message}`);
124
+ }
125
+ }
112
126
  /** Pull the current branch from the remote using fast-forward only. */
113
127
  export function pullBranch(repoPath, branchName, remote = 'origin') {
114
128
  try {
@@ -20,6 +20,15 @@ const packageRoot = path.resolve(selfDir, '..', '..', '..');
20
20
  export function getPackageAssetPath(...parts) {
21
21
  return path.join(packageRoot, ...parts);
22
22
  }
23
+ // Dev-mode protection: when this module is loaded from its TypeScript source
24
+ // (i.e. via tsx/ts-node during development), automatically enforce the local
25
+ // data directory so production settings in ~/.config/kobo are never touched.
26
+ // Bypassed in Vitest (VITEST env var) so unit tests can exercise all paths.
27
+ let _devModeProtection = fileURLToPath(import.meta.url).endsWith('.ts') && !process.env.VITEST;
28
+ /** Override the dev-mode protection flag. Used by tests only. */
29
+ export function _setDevModeProtection(value) {
30
+ _devModeProtection = value;
31
+ }
23
32
  /**
24
33
  * Resolves the Kōbō home directory for user data (DB, settings). Respects
25
34
  * KOBO_HOME when set, otherwise defaults to an XDG-compliant location under
@@ -30,9 +39,12 @@ export function getPackageAssetPath(...parts) {
30
39
  * the repo-relative data/ directory and never touches the user's real home.
31
40
  * For stricter isolation, set KOBO_ENFORCE_LOCAL_HOME=1 to force local writes
32
41
  * to either KOBO_HOME (if provided) or <packageRoot>/data.
42
+ *
43
+ * Dev-mode auto-detection: when running from TypeScript source (tsx), the module
44
+ * automatically enforces the local data directory even without env vars set.
33
45
  */
34
46
  export function getKoboHome() {
35
- if (process.env.KOBO_ENFORCE_LOCAL_HOME === '1') {
47
+ if (process.env.KOBO_ENFORCE_LOCAL_HOME === '1' || _devModeProtection) {
36
48
  if (process.env.KOBO_HOME) {
37
49
  return path.resolve(process.env.KOBO_HOME);
38
50
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.5.5",
3
+ "version": "1.5.7",
4
4
  "description": "Kōbō — multi-workspace agent manager for Claude Code. Orchestrates isolated git worktrees with dev servers, Notion integration, and MCP tools.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-or-later",
@@ -0,0 +1,10 @@
1
+ import{E as e,F as t,H as n,L as r,M as i,N as a,Q as o,U as s,_t as c,bt as l,d as u,f as d,g as f,h as p,l as m,p as h,r as g,rt as ee,u as _,v as te}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{F as ne,i as v}from"./QSpinner-CliSLjf8.js";import{n as re}from"./vue-i18n-eUDnMrPl.js";import{t as y}from"./QBtn-BsD8vrWq.js";import{x as ie,y as ae}from"./index-Br4eMfSu.js";import{t as b}from"./QSpinnerDots-Dp12eHrB.js";import{t as x}from"./QSpace-C5Ebr0vq.js";import{t as S}from"./QTooltip-kLXuUa_m.js";import{n as oe,t as se}from"./marked.esm-gIBce057.js";import{t as C}from"./_plugin-vue_export-helper-Cxt1D8wE.js";var ce={key:0,class:`af-empty column items-center justify-center text-center q-pa-xl`},le={class:`text-grey-6 q-mt-md text-body2`},ue={class:`text-grey-8 text-caption q-mt-xs`},de={key:1,class:`row justify-center q-my-sm`},fe=[`data-item-id`],pe={class:`af-tool row items-center q-gutter-xs`},me={class:`af-tool-label text-indigo-4`},he={class:`af-time`},ge={key:0,class:`text-grey-4 q-mb-xs`},_e={class:`af-ask-options-list q-mb-sm`},ve={class:`text-weight-bold text-grey-3`},ye={key:0},be={key:1,class:`af-ask-buttons q-gutter-xs`},xe={key:0,class:`q-mt-sm row justify-end`},Se=[`onClick`],Ce={class:`af-file-header row items-center no-wrap q-gutter-xs`},we={class:`af-file-path text-grey-4 ellipsis`},Te={class:`af-diff-stats`},Ee={key:0,class:`text-green-5`},De={key:1,class:`text-red-5 q-ml-xs`},Oe={class:`af-time`},ke={class:`af-diff-sign`},Ae={key:1,class:`af-diff-line af-diff-del`},je={key:0,class:`af-diff-line text-grey-7 text-italic`},Me=[`onClick`],Ne={class:`af-tool-label text-grey-7`},Pe={key:0,class:`af-tool-desc text-grey-8`},Fe={class:`af-time`},Ie={key:0,class:`af-tool-args q-mt-xs rounded-borders`},Le={class:`af-args-pre`},Re={class:`af-text-header row items-center q-mb-xs`},ze={class:`af-time`},Be=[`innerHTML`],Ve=[`onClick`],He={class:`af-system-content text-caption text-amber-6`},Ue={class:`af-time`},We={key:0,class:`af-system-details q-mt-xs rounded-borders`},Ge={class:`af-args-pre`},Ke={key:5,class:`row items-center`},qe={class:`af-error-content text-red-5`},Je={class:`af-time`},Ye={key:6,class:`row items-center`},Xe={class:`af-raw-content text-grey-7`},Ze={class:`af-time`},Qe={class:`scroll-buttons`},w=50,$e=50,T=C(te({__name:`ActivityFeed`,setup(te){function C(e){let t=se.parse(e,{async:!1,breaks:!0,gfm:!0});return oe.sanitize(t)}let{t:T}=re(),E=ie(),et=ae(),D=o(null),O=o(!1),k=o(new Set),A=new Map;function j(e,t){return A.has(e)||A.set(e,Y(t)),A.get(e)}let M=new Map;function tt(e,t){return M.has(e)||M.set(e,C(t)),M.get(e)}let N=m(()=>{let e=E.activityFeed;for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.meta?.sender===`user`)return null;if(n.type===`tool_use`&&n.content===`AskUserQuestion`)return n.id}return null}),P=o(new Map);function nt(e,t,n){P.value.has(e)||P.value.set(e,new Map);let r=P.value.get(e);r.get(t)===n?r.delete(t):r.set(t,n)}function F(e,t,n){return P.value.get(e)?.get(t)===n}function rt(e){let t=P.value.get(e);return!!t&&t.size>0}function it(e,t){let n=E.selectedWorkspaceId;if(!n)return;let r=P.value.get(e);if(!r||r.size===0)return;let i=[];for(let[e,n]of r.entries()){let r=t[e];if(!r)continue;let a=r.options[n];a&&i.push(`${r.question}: ${a.label}`)}i.length>0&&et.sendChatMessage(n,i.join(`
2
+ `))}let I=o(-1);function at(){let t=E.activityFeed,n=t.map((e,t)=>({item:e,idx:t})).filter(({item:e})=>e.meta?.sender===`user`);if(n.length===0)return;I.value<=0?I.value=n.length-1:I.value--;let r=n[I.value].idx,i=n[I.value].item.id,a=t.length-r;a>L.value&&(L.value=Math.min(a+10,t.length)),e(()=>{let e=D.value?.querySelector(`[data-item-id="${i}"]`);e&&e.scrollIntoView({behavior:`smooth`,block:`center`})})}n(()=>E.selectedWorkspaceId,()=>{I.value=-1,A.clear(),P.value.clear(),M.clear(),W.clear(),B=0,O.value=!1});let L=o(w),R=m(()=>{let e=E.activityFeed;return e.length<=L.value?e:e.slice(-L.value)});n(()=>E.selectedWorkspaceId,()=>{L.value=w}),n(R,e=>{let t=new Set(e.map(e=>e.id));for(let e of A.keys())t.has(e)||A.delete(e);for(let e of P.value.keys())t.has(e)||P.value.delete(e);for(let e of M.keys())t.has(e)||M.delete(e);for(let e of W.keys())t.has(e)||W.delete(e)},{flush:`post`});let z=o(!1),B=0;function V(){let t=D.value;if(t&&(t.scrollHeight-t.scrollTop-t.clientHeight<50?z.value=!1:t.scrollTop<B&&(z.value=!0),B=t.scrollTop,t.scrollTop<200&&!O.value)){let n=E.activityFeed.length;if(L.value<n){O.value=!0;let r=t.scrollHeight;L.value=Math.min(L.value+$e,n),e(()=>{D.value&&(D.value.scrollTop+=D.value.scrollHeight-r),O.value=!1})}else if(E.selectedWorkspaceId&&E.hasMoreEvents[E.selectedWorkspaceId]!==!1){O.value=!0;let n=t.scrollHeight;E.fetchOlderEvents(E.selectedWorkspaceId).then(t=>{t?(L.value=E.activityFeed.length,e(()=>{D.value&&(D.value.scrollTop+=D.value.scrollHeight-n),O.value=!1})):O.value=!1})}}}function H(){if(z.value)return;let e=D.value;e&&(e.scrollTop=e.scrollHeight)}function ot(){z.value=!1,L.value=w,e(()=>{let e=D.value;e&&(e.scrollTop=e.scrollHeight)})}n(()=>E.activityFeed.length,()=>{e(H)}),i(()=>{D.value?.addEventListener(`scroll`,V),e(H)}),a(()=>{D.value?.removeEventListener(`scroll`,V)});function U(e){return new Date(e).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}function st(e,t){let n=e.split(`
3
+ `),r=t.split(`
4
+ `),i=n.length,a=r.length,o=Array.from({length:i+1},()=>Array(a+1).fill(0));for(let e=i-1;e>=0;e--)for(let t=a-1;t>=0;t--)n[e]===r[t]?o[e][t]=o[e+1][t+1]+1:o[e][t]=Math.max(o[e+1][t],o[e][t+1]);let s=[],c=0,l=0;for(;c<i&&l<a;)n[c]===r[l]?(s.push({type:`context`,content:n[c]}),c++,l++):o[c+1][l]>=o[c][l+1]?(s.push({type:`del`,content:n[c]}),c++):(s.push({type:`add`,content:r[l]}),l++);for(;c<i;)s.push({type:`del`,content:n[c++]});for(;l<a;)s.push({type:`add`,content:r[l++]});return s}let W=new Map;function ct(e,t,n){return W.has(e)||W.set(e,st(t,n)),W.get(e)}function G(e){if(e.type!==`tool_use`)return null;let t=e.meta?.input;if(e.content===`Edit`){if(!t?.file_path)return null;let e=t.file_path,n=t.old_string??``,r=t.new_string??``,i=n.split(`
5
+ `),a=r.split(`
6
+ `);return{toolName:`Edit`,filePath:e,oldString:n,newString:r,replaceAll:t.replace_all??!1,additions:a.length,deletions:i.length}}if(e.content===`Write`){if(!t?.file_path)return null;let e=t.file_path,n=t.content??``;return{toolName:`Write`,filePath:e,content:n,additions:n.split(`
7
+ `).length,deletions:0}}if(e.content===`Bash`){let e=(t?.command??``).match(/^\s*rm\s+(?:-[a-zA-Z]*\s+)*(.+)/);if(e)return{toolName:`Bash:rm`,filePath:e[1].trim().replace(/["']/g,``),additions:0,deletions:1}}return null}function K(e){let t=E.selectedWorkspace;if(t){let n=`${t.projectPath}/.worktrees/${t.workingBranch}/`;if(e.startsWith(n))return e.slice(n.length);if(e.startsWith(`${t.projectPath}/`))return e.slice(t.projectPath.length+1)}return e.startsWith(`/`)&&e.split(`/`).length>4?`…/${e.split(`/`).slice(-3).join(`/`)}`:e}function lt(e){return e.split(`/`).pop()??e}function q(e){let t=lt(e),n=t.lastIndexOf(`.`);return n>=0?t.substring(n+1):``}function ut(e){return{ts:`JS`,tsx:`TS`,js:`JS`,jsx:`JS`,vue:`VU`,py:`PY`,rs:`RS`,go:`GO`,java:`JA`,php:`PH`,css:`CS`,scss:`SC`,html:`HT`,md:`MD`,json:`JS`,sql:`SQ`,sh:`SH`,yaml:`YA`,yml:`YA`,toml:`TM`}[e.toLowerCase()]??e.substring(0,2).toUpperCase()}function dt(e){return{ts:`blue-5`,tsx:`blue-5`,js:`yellow-8`,jsx:`yellow-8`,vue:`green-5`,py:`blue-4`,rs:`orange-5`,go:`cyan-5`,java:`red-5`,php:`indigo-4`,css:`purple-4`,scss:`pink-4`,html:`orange-4`,md:`grey-5`,json:`yellow-6`}[e.toLowerCase()]??`grey-5`}function ft(e){let t=e.toLowerCase();return t.includes(`read`)||t.includes(`grep`)||t.includes(`glob`)?`search`:t.includes(`write`)||t.includes(`edit`)?`edit`:t.includes(`bash`)||t.includes(`terminal`)?`terminal`:t.includes(`agent`)||t.includes(`task`)?`smart_toy`:`build`}function pt(e){switch(e.type){case`text`:return e.meta?.sender===`system-prompt`?`af-item--prompt`:e.meta?.sender===`user`?`af-item--user`:`af-item--text`;case`system`:return`af-item--system`;case`error`:return`af-item--error`;case`tool_use`:return`af-item--tool`;case`raw`:return`af-item--raw`;default:return``}}function mt(e){switch(e.meta?.sender){case`system-prompt`:return T(`activityFeed.initialPrompt`);case`user`:return T(`activityFeed.you`);default:return T(`activityFeed.agent`)}}function ht(e){switch(e.meta?.sender){case`system-prompt`:return`text-indigo-4`;case`user`:return`text-green-4`;default:return`text-blue-4`}}function gt(e){if(e.content===`Skill`&&e.meta){let t=e.meta.input;if(t&&typeof t.skill==`string`)return`Skill — ${t.skill}`}return e.content}function J(e){if(!e.meta)return``;let t=e.meta.input;if(!t)return``;if(typeof t.description==`string`)return t.description;if(typeof t.file_path==`string`)return K(t.file_path);if(typeof t.pattern==`string`)return`${typeof t.path==`string`?`${K(t.path)}/`:``}${t.pattern}`;if(typeof t.path==`string`)return K(t.path);if(typeof t.command==`string`){let e=t.command;return e.length>80?`${e.slice(0,80)}…`:e}return``}function Y(e){if(e.type!==`tool_use`||e.content!==`AskUserQuestion`)return null;let t=e.meta?.input;return!t?.questions||!Array.isArray(t.questions)?null:t.questions.filter(e=>Array.isArray(e.options)&&e.options.length>0).map(e=>({question:e.question??``,options:e.options.map(e=>({label:e.label??``,description:e.description??``}))}))}function X(e){if(!e.meta)return!1;let t=e.meta;return t.input!==void 0&&t.input!==null}function Z(e){k.value.has(e)?k.value.delete(e):k.value.add(e)}function Q(e){return k.value.has(e)}function _t(e){if(!e.meta)return``;let t=e.meta;if(!t.input)return``;try{return JSON.stringify(t.input,null,2)}catch{return String(t.input)}}let vt=m(()=>E.activityFeed.some(e=>e.meta?.sender===`user`));function $(e){return e.type!==`system`||!e.meta?!1:Object.keys(e.meta).length>0}function yt(e){if(!e.meta)return``;try{return JSON.stringify(e.meta,null,2)}catch{return``}}return(e,n)=>(t(),h(`div`,{ref_key:`feedContainer`,ref:D,class:`activity-feed q-pa-sm`},[ee(E).activityFeed.length===0?(t(),h(`div`,ce,[f(v,{name:`forum`,size:`48px`,color:`grey-8`}),_(`div`,le,l(e.$t(`activityFeed.empty`)),1),_(`div`,ue,l(e.$t(`activityFeed.emptyHint`)),1)])):d(``,!0),O.value?(t(),h(`div`,de,[f(b,{size:`24px`,color:`grey-6`})])):d(``,!0),(t(!0),h(g,null,r(R.value,i=>(t(),h(`div`,{key:i.id,"data-item-id":i.id,class:c([`af-item text-caption rounded-borders`,pt(i)])},[i.type===`tool_use`&&j(i.id,i)?(t(),h(g,{key:0},[_(`div`,pe,[f(v,{name:`help_outline`,size:`14px`,color:`indigo-4`}),_(`span`,me,l(e.$t(`activityFeed.question`)),1),f(x),_(`span`,he,l(U(i.timestamp)),1)]),(t(!0),h(g,null,r(j(i.id,i),(e,n)=>(t(),h(`div`,{key:n,class:`q-mt-sm`},[e.question?(t(),h(`div`,ge,l(e.question),1)):d(``,!0),_(`div`,_e,[(t(!0),h(g,null,r(e.options,(e,n)=>(t(),h(`div`,{key:n,class:`af-ask-option-item text-caption text-grey-5`},[_(`span`,ve,l(n+1)+`. `+l(e.label),1),e.description?(t(),h(`span`,ye,` — `+l(e.description),1)):d(``,!0)]))),128))]),i.id===N.value?(t(),h(`div`,be,[(t(!0),h(g,null,r(e.options,(e,r)=>(t(),u(y,{key:e.label,"no-caps":``,dense:``,outline:!F(i.id,n,r),unelevated:F(i.id,n,r),color:F(i.id,n,r)?`indigo-6`:`indigo-4`,"text-color":F(i.id,n,r)?`white`:void 0,class:`af-option-btn`,onClick:e=>nt(i.id,n,r)},{default:s(()=>[p(l(e.label),1)]),_:2},1032,[`outline`,`unelevated`,`color`,`text-color`,`onClick`]))),128))])):d(``,!0)]))),128)),i.id===N.value?(t(),h(`div`,xe,[f(y,{"no-caps":``,unelevated:``,dense:``,color:`indigo-6`,label:e.$t(`activityFeed.sendAnswers`),icon:`send`,disable:!rt(i.id),onClick:e=>it(i.id,j(i.id,i))},null,8,[`label`,`disable`,`onClick`])])):d(``,!0)],64)):i.type===`tool_use`&&G(i)?(t(),h(`div`,{key:1,class:`af-file-change cursor-pointer`,onClick:e=>Z(i.id)},[_(`div`,Ce,[_(`span`,{class:c([`af-lang-badge`,`text-${dt(q(G(i).filePath))}`])},l(ut(q(G(i).filePath))),3),_(`span`,we,l(K(G(i).filePath)),1),_(`span`,Te,[G(i).additions?(t(),h(`span`,Ee,`+`+l(G(i).additions),1)):d(``,!0),G(i).deletions?(t(),h(`span`,De,`-`+l(G(i).deletions),1)):d(``,!0)]),f(v,{name:Q(i.id)?`expand_less`:`expand_more`,size:`14px`,color:`grey-6`},null,8,[`name`]),f(x),_(`span`,Oe,l(U(i.timestamp)),1)]),Q(i.id)?(t(),h(`div`,{key:0,class:`af-diff-body q-mt-xs`,onClick:n[0]||=ne(()=>{},[`stop`])},[G(i).toolName===`Edit`?(t(!0),h(g,{key:0},r(ct(i.id,G(i).oldString??``,G(i).newString??``),(e,n)=>(t(),h(`div`,{key:n,class:c([`af-diff-line`,{"af-diff-del":e.type===`del`,"af-diff-add":e.type===`add`,"af-diff-context":e.type===`context`}])},[_(`span`,ke,l(e.type===`del`?`-`:e.type===`add`?`+`:` `),1),p(l(e.content),1)],2))),128)):G(i).toolName===`Bash:rm`?(t(),h(`div`,Ae,[...n[1]||=[_(`span`,{class:`af-diff-sign`},`-`,-1),p(`File deleted`,-1)]])):(t(),h(g,{key:2},[(t(!0),h(g,null,r((G(i).content??``).split(`
8
+ `).slice(0,30),(e,r)=>(t(),h(`div`,{key:`w-${r}`,class:`af-diff-line af-diff-add`},[n[2]||=_(`span`,{class:`af-diff-sign`},`+`,-1),p(l(e),1)]))),128)),(G(i).content??``).split(`
9
+ `).length>30?(t(),h(`div`,je,`… `+l((G(i).content??``).split(`
10
+ `).length-30)+` more lines`,1)):d(``,!0)],64))])):d(``,!0)],8,Se)):i.type===`tool_use`?(t(),h(g,{key:2},[_(`div`,{class:c([`af-tool row items-center q-gutter-xs`,{"cursor-pointer":X(i)}]),onClick:e=>X(i)&&Z(i.id)},[f(v,{name:ft(i.content),size:`14px`,color:`grey-6`},null,8,[`name`]),_(`span`,Ne,l(gt(i)),1),J(i)?(t(),h(`span`,Pe,`— `+l(J(i)),1)):d(``,!0),X(i)?(t(),u(v,{key:1,name:Q(i.id)?`expand_less`:`expand_more`,size:`14px`,color:`grey-7`},null,8,[`name`])):d(``,!0),f(x),_(`span`,Fe,l(U(i.timestamp)),1)],10,Me),Q(i.id)?(t(),h(`div`,Ie,[_(`pre`,Le,l(_t(i)),1)])):d(``,!0)],64)):i.type===`text`?(t(),h(g,{key:3},[_(`div`,Re,[_(`span`,{class:c([`text-caption text-weight-bold`,ht(i)])},l(mt(i)),3),i.meta?.pending?(t(),u(b,{key:0,size:`14px`,color:`grey-5`,class:`q-ml-sm`})):d(``,!0),f(x),_(`span`,ze,l(U(i.timestamp)),1)]),_(`div`,{class:`af-text-content af-markdown`,innerHTML:tt(i.id,i.content)},null,8,Be)],64)):i.type===`system`?(t(),h(g,{key:4},[_(`div`,{class:c([`row items-center`,{"cursor-pointer":$(i)}]),onClick:e=>$(i)&&Z(i.id)},[f(v,{name:`info`,size:`14px`,color:`amber-6`,class:`q-mr-xs`}),_(`span`,He,l(i.content),1),$(i)?(t(),u(v,{key:0,name:Q(i.id)?`expand_less`:`expand_more`,size:`14px`,color:`amber-8`,class:`q-ml-xs`},null,8,[`name`])):d(``,!0),f(x),_(`span`,Ue,l(U(i.timestamp)),1)],10,Ve),Q(i.id)&&$(i)?(t(),h(`div`,We,[_(`pre`,Ge,l(yt(i)),1)])):d(``,!0)],64)):i.type===`error`?(t(),h(`div`,Ke,[f(v,{name:`error`,size:`14px`,color:`red-5`,class:`q-mr-xs`}),_(`span`,qe,l(i.content),1),f(x),_(`span`,Je,l(U(i.timestamp)),1)])):(t(),h(`div`,Ye,[_(`span`,Xe,l(i.content),1),f(x),_(`span`,Ze,l(U(i.timestamp)),1)]))],10,fe))),128)),_(`div`,Qe,[vt.value?(t(),u(y,{key:0,round:``,dense:``,size:`sm`,icon:`person_search`,color:`indigo-8`,class:`scroll-btn`,onClick:at},{default:s(()=>[f(S,null,{default:s(()=>[p(l(e.$t(`activityFeed.goToPrevious`)),1)]),_:1})]),_:1})):d(``,!0),z.value?(t(),u(y,{key:1,round:``,dense:``,size:`sm`,icon:`keyboard_double_arrow_down`,color:`indigo-8`,class:`scroll-btn`,onClick:ot},{default:s(()=>[f(S,null,{default:s(()=>[p(l(e.$t(`activityFeed.scrollToBottom`)),1)]),_:1})]),_:1})):d(``,!0)])],512))}}),[[`__scopeId`,`data-v-c5b7e063`]]);export{T as default};
@@ -0,0 +1 @@
1
+ import{D as e,f as t}from"./QSpinner-CliSLjf8.js";import{d as n,f as r}from"./scroll-CLibRGI-.js";function i(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var a=e({name:`close-popup`,beforeMount(e,{value:a}){let o={depth:i(a),handler(t){o.depth!==0&&setTimeout(()=>{let i=r(e);i!==void 0&&n(i,t,o.depth)})},handlerKey(e){t(e,13)===!0&&o.handler(e)}};e.__qclosepopup=o,e.addEventListener(`click`,o.handler),e.addEventListener(`keyup`,o.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=i(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{a as t};
@@ -0,0 +1,2 @@
1
+ import{F as e,H as t,L as n,M as r,N as i,Q as a,T as ee,U as o,bt as s,d as c,f as l,g as u,h as d,l as f,p,r as m,rt as te,u as h,v as ne,vt as re,x as ie}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{A as ae,F as g,P as _,i as v}from"./QSpinner-CliSLjf8.js";import{i as y}from"./private.use-form-BhKyDtO7.js";import{n as oe}from"./vue-i18n-eUDnMrPl.js";import{t as se}from"./settings-B69lIVX0.js";import{t as b}from"./QBtn-BsD8vrWq.js";import{_ as ce,r as x,x as le,y as ue}from"./index-Br4eMfSu.js";import{t as de}from"./QSpace-C5Ebr0vq.js";import{t as S}from"./QTooltip-kLXuUa_m.js";import{t as fe}from"./_plugin-vue_export-helper-Cxt1D8wE.js";import{r as C}from"./QMenu-DU-wiY_A.js";import{n as w,r as pe,t as T}from"./QItem-DfoP6eYj.js";import{t as me}from"./QExpansionItem-C735ptO9.js";import{n as E,t as he}from"./models-C3h6lSte.js";import{t as ge}from"./QPage-BKY2-sf-.js";var _e={class:`create-inner`},ve={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},ye={class:`create-card rounded-borders`},be={class:`card-top-bar row items-center q-px-md q-py-xs`},xe={class:`model-badge cursor-default row items-center q-gutter-xs`},Se={class:`text-indigo-3 text-weight-medium text-caption`},Ce={key:0,class:`notion-url-wrap`},we={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Te={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},Ee={key:0,class:`sentry-url-wrap`},De={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},Oe={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},ke={class:`card-name-wrap`},Ae={class:`card-textarea-wrap`},je={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},Me={class:`q-pa-sm manual-section-body`},Ne={class:`row items-center q-gutter-sm q-mb-sm`},Pe={class:`col text-caption text-grey-4`},Fe={class:`q-pa-sm manual-section-body`},Ie={class:`row items-center q-gutter-sm q-mb-sm`},Le={class:`col text-caption text-grey-4`},Re={class:`card-bottom-bar row items-center wrap q-px-sm q-py-xs q-gutter-xs`},ze={class:`bottom-select-label row items-center no-wrap`},Be={class:`bottom-select-label row items-center no-wrap`},Ve={class:`bottom-select-label row items-center no-wrap`},He={class:`bottom-select-label row items-center no-wrap`},Ue={class:`bottom-select-label row items-center no-wrap`},We={class:`bottom-select-label row items-center no-wrap`},Ge={class:`row justify-center q-px-sm q-py-sm`},Ke={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},D=fe(ne({__name:`CreatePage`,setup(ne){let fe=ce(),D=pe(),qe=le(),O=se(),{t:k}=oe(),Je=a([]),A=a(``),j=a(``),M=a(``),N=a(!1),P=a(`claude-opus-4-7`),F=a(`auto`),I=a(``),L=a(null),R=a(`feature`),z=a(!1),Ye=[{label:`feature/`,value:`feature`},{label:`fix/`,value:`fix`},{label:`hotfix/`,value:`hotfix`},{label:`chore/`,value:`chore`},{label:`refactor/`,value:`refactor`},{label:`docs/`,value:`docs`},{label:`test/`,value:`test`}],B=a(O.global.defaultPermissionMode||`plan`),V=a([]),H=a(!1),Xe=a(!1),Ze=f(()=>[...he.map(e=>({label:k(e.i18nLabelKey),value:e.value,description:k(e.i18nDescriptionKey)}))]);function U(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Qe=f(()=>[{label:U(k(`reasoning.auto`)),value:`auto`,description:k(`reasoning.autoDescription`)},{label:U(k(`reasoning.low`)),value:`low`,description:k(`reasoning.lowDescription`)},{label:U(k(`reasoning.medium`)),value:`medium`,description:k(`reasoning.mediumDescription`)},{label:U(k(`reasoning.high`)),value:`high`,description:k(`reasoning.highDescription`)},{label:U(k(`reasoning.xhigh`)),value:`xhigh`,description:k(`reasoning.xhighDescription`)},{label:U(k(`reasoning.max`)),value:`max`,description:k(`reasoning.maxDescription`)}]),W=f(()=>M.value.trim().startsWith(`https://www.notion.so/`)),G=a([]),K=a([]),q=a(``),J=a(``),Y=f(()=>!N.value||!W.value);function $e(){let e=q.value.trim();e&&(G.value.push(e),q.value=``)}function et(e){G.value.splice(e,1)}function tt(){let e=J.value.trim();e&&(K.value.push(e),J.value=``)}function nt(e){K.value.splice(e,1)}function rt(){N.value=!N.value,N.value||(M.value=``)}let X=a(!1),Z=a(``),Q=f(()=>/\/issues\/\d+/.test(Z.value.trim()));function it(){X.value=!X.value,X.value||(Z.value=``)}async function at(e){if(!e.trim()){V.value=[],L.value=null;return}H.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();V.value=n.local??n.branches??[],V.value.length>0&&!L.value&&(L.value=V.value[0]??null)}catch{V.value=[],L.value=null}finally{H.value=!1}}function ot(e){let t=O.getProjectByPath(e);t&&(t.defaultSourceBranch&&(L.value=t.defaultSourceBranch),t.defaultModel?P.value=t.defaultModel:O.global.defaultModel&&(P.value=O.global.defaultModel))}let $=null;t(I,e=>{$&&clearTimeout($),$=setTimeout(()=>{L.value=null,at(e),ot(e)},500)});function st(e,t){t(()=>{Je.value=O.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}r(()=>{O.fetchSettings()}),i(()=>{$&&clearTimeout($)});function ct(e){return e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`).substring(0,50)}function lt(){return A.value.trim()?A.value.trim().substring(0,80):!N.value&&j.value.trim()&&(j.value.trim().split(`
2
+ `)[0]??``).substring(0,80)||`workspace`}function ut(e){let t=(e.split(`/`).pop()??``).split(`-`);t.length>1&&/^[0-9a-f]{12,}$/i.test(t[t.length-1])&&t.pop();let n=t.join(`-`).toLowerCase(),r=n.match(/tk-(\d+)/);if(r){let e=`TK-${r[1]}`,t=n.replace(/tk-\d+/i,``).replace(/-+/g,`-`).replace(/^-|-$/g,``).substring(0,40);return t?`${e}--${t}`:e}return n.substring(0,50)||`task-${Date.now()}`}function dt(){return N.value&&!W.value?k(`createPage.validationNotionUrl`):X.value&&!Q.value?k(`createPage.sentryValidation`):!N.value&&!X.value&&!j.value.trim()?k(`createPage.validationDescription`):!N.value&&!X.value&&(!lt()||lt()===`workspace`)&&!A.value.trim()&&!j.value.trim()?k(`createPage.validationName`):I.value.trim()?L.value?null:k(`createPage.validationBranch`):k(`createPage.validationPath`)}async function ft(){let e=dt();if(e){D.notify({type:`negative`,message:e,position:`top`});return}Xe.value=!0;try{let e=lt(),t;t=N.value&&W.value?ut(M.value.trim()):e===`workspace`?`task-${Date.now()}`:ct(e);let n=`${R.value}/${t}`,r={name:e,projectPath:I.value.trim(),sourceBranch:L.value,workingBranch:n,model:P.value,reasoningEffort:F.value,...N.value&&W.value?{notionUrl:M.value.trim()}:{},...X.value&&Q.value?{sentryUrl:Z.value.trim()}:{},...Y.value&&G.value.length>0?{tasks:G.value}:{},...Y.value&&K.value.length>0?{acceptanceCriteria:K.value}:{},...z.value?{skipSetupScript:!0}:{},...j.value.trim()?{description:j.value.trim()}:{},permissionMode:B.value},i=await qe.createWorkspace(r);ue().subscribe(i.id),qe.selectWorkspace(i.id),fe.push({name:`workspace`,params:{id:i.id}})}catch{D.notify({type:`negative`,message:k(`createPage.errorCreating`),position:`top`})}finally{Xe.value=!1}}return(t,r)=>(e(),c(ge,{class:`create-page flex flex-center column`},{default:o(()=>[h(`div`,_e,[h(`div`,ve,s(t.$t(`createPage.title`)),1),h(`div`,ye,[h(`div`,be,[h(`span`,xe,[u(v,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),h(`span`,Se,s(t.$t(`createPage.claudeCode`)),1)]),u(de),u(b,{flat:``,dense:``,"no-caps":``,size:`sm`,color:N.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,onClick:rt},{default:o(()=>[u(v,{name:`description`,size:`14px`,class:`q-mr-xs`}),d(` `+s(N.value?t.$t(`createPage.notionEnabled`):t.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`]),u(b,{flat:``,dense:``,"no-caps":``,size:`sm`,color:X.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,onClick:it},{default:o(()=>[u(v,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),d(` `+s(X.value?t.$t(`createPage.sentryEnabled`):t.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`])]),u(y,{color:`grey-9`}),u(ae,{name:`slide`},{default:o(()=>[N.value?(e(),p(`div`,Ce,[u(x,{modelValue:M.value,"onUpdate:modelValue":r[0]||=e=>M.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:o(()=>[u(v,{name:`link`,size:`16px`,color:W.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),M.value.trim()&&!W.value?(e(),p(`div`,we,s(t.$t(`createPage.notionValidation`)),1)):l(``,!0),W.value?(e(),p(`div`,Te,s(t.$t(`createPage.notionAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),N.value?(e(),c(y,{key:0,color:`grey-9`})):l(``,!0),u(ae,{name:`slide`},{default:o(()=>[X.value?(e(),p(`div`,Ee,[u(x,{modelValue:Z.value,"onUpdate:modelValue":r[1]||=e=>Z.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:o(()=>[u(v,{name:`link`,size:`16px`,color:Q.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Z.value.trim()&&!Q.value?(e(),p(`div`,De,s(t.$t(`createPage.sentryValidation`)),1)):l(``,!0),Q.value?(e(),p(`div`,Oe,s(t.$t(`createPage.sentryAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),X.value?(e(),c(y,{key:1,color:`grey-9`})):l(``,!0),h(`div`,ke,[u(x,{modelValue:A.value,"onUpdate:modelValue":r[2]||=e=>A.value=e,borderless:``,dense:``,placeholder:N.value&&W.value?t.$t(`createPage.workspaceName`):t.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),u(y,{color:`grey-9`}),h(`div`,Ae,[u(x,{modelValue:j.value,"onUpdate:modelValue":r[3]||=e=>j.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:N.value?t.$t(`createPage.instructions`):t.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[_(g(ft,[`ctrl`]),[`enter`]),_(g(ft,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`])]),u(y,{color:`grey-9`}),Y.value?(e(),p(m,{key:2},[h(`div`,je,s(t.$t(`createPage.manualHint`)),1),u(me,{dark:``,dense:``,label:t.$t(`createPage.tasks`,{count:G.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:o(()=>[h(`div`,Me,[h(`div`,Ne,[u(x,{modelValue:q.value,"onUpdate:modelValue":r[4]||=e=>q.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:_(g($e,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(b,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!q.value.trim(),onClick:$e},{default:o(()=>[u(S,null,{default:o(()=>[d(s(t.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),p(m,null,n(G.value,(n,r)=>(e(),p(`div`,{key:`task-${r}`,class:`row items-center q-py-xs manual-item`},[h(`span`,Pe,s(n),1),u(b,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>et(r)},{default:o(()=>[u(S,null,{default:o(()=>[d(s(t.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(me,{dark:``,dense:``,label:t.$t(`createPage.acceptanceCriteria`,{count:K.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:o(()=>[h(`div`,Fe,[h(`div`,Ie,[u(x,{modelValue:J.value,"onUpdate:modelValue":r[5]||=e=>J.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:_(g(tt,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(b,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!J.value.trim(),onClick:tt},{default:o(()=>[u(S,null,{default:o(()=>[d(s(t.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),p(m,null,n(K.value,(n,r)=>(e(),p(`div`,{key:`crit-${r}`,class:`row items-center q-py-xs manual-item`},[h(`span`,Le,s(n),1),u(b,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>nt(r)},{default:o(()=>[u(S,null,{default:o(()=>[d(s(t.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(y,{color:`grey-9`})],64)):l(``,!0),h(`div`,Re,[u(E,{modelValue:P.value,"onUpdate:modelValue":r[6]||=e=>P.value=e,options:Ze.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,ze,[d(s(Ze.value.find(e=>e.value===P.value)?.label??P.value)+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(T,ee(t,{class:`model-option`}),{default:o(()=>[u(w,null,{default:o(()=>[u(C,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(C,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),u(E,{modelValue:F.value,"onUpdate:modelValue":r[7]||=e=>F.value=e,options:Qe.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,Be,[u(v,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(Qe.value.find(e=>e.value===F.value)?.label??F.value)+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(T,re(ie(t)),{default:o(()=>[u(w,null,{default:o(()=>[u(C,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(C,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),u(E,{modelValue:B.value,"onUpdate:modelValue":r[8]||=e=>B.value=e,options:[{label:t.$t(`permissionMode.plan`),value:`plan`},{label:t.$t(`permissionMode.autoAccept`),value:`auto-accept`}],dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``},{selected:o(()=>[h(`span`,Ve,[u(v,{name:B.value===`plan`?`visibility`:`flash_on`,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),d(` `+s(B.value===`plan`?t.$t(`permissionMode.plan`):t.$t(`permissionMode.autoAccept`))+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),_:1},8,[`modelValue`,`options`]),u(b,{flat:``,round:``,dense:``,size:`sm`,icon:z.value?`play_disabled`:`play_circle`,color:z.value?`orange-4`:`grey-6`,onClick:r[9]||=e=>z.value=!z.value},{default:o(()=>[u(S,null,{default:o(()=>[d(s(t.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`]),u(de),u(E,{modelValue:I.value,"onUpdate:modelValue":r[10]||=e=>I.value=e,options:Je.value,dense:``,borderless:``,"use-input":``,"hide-selected":``,"fill-input":``,"input-debounce":`0`,"new-value-mode":`add`,class:`bottom-select rounded-borders repo-select`,"hide-dropdown-icon":``,behavior:te(O).projectPaths.length>0?`menu`:`dialog`,onFilter:st,onInputValue:r[11]||=e=>{I.value=e}},{prepend:o(()=>[u(v,{name:`attach_file`,size:`12px`,color:`grey-5`})]),selected:o(()=>[h(`span`,He,s(I.value||t.$t(`createPage.projectPath`)),1)]),"no-option":o(()=>[u(T,null,{default:o(()=>[u(w,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`behavior`]),u(E,{modelValue:R.value,"onUpdate:modelValue":r[12]||=e=>R.value=e,options:Ye,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:o(()=>[h(`span`,Ue,[u(v,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(R.value)+`/ `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(S,null,{default:o(()=>[d(s(t.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`]),u(E,{modelValue:L.value,"onUpdate:modelValue":r[13]||=e=>L.value=e,options:V.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,loading:H.value,disable:!I.value.trim()||H.value},{selected:o(()=>[h(`span`,We,[u(v,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(L.value??t.$t(`createPage.branch`))+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":o(()=>[u(T,null,{default:o(()=>[u(w,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(I.value.trim()?t.$t(`createPage.noBranches`):t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])]),h(`div`,Ge,[u(b,{label:t.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:Xe.value,onClick:ft},null,8,[`label`,`loading`])])]),h(`div`,Ke,s(N.value?t.$t(`createPage.notionExtractHint`):t.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-ab47cf8d`]]);export{D as default};
@@ -0,0 +1 @@
1
+ .create-page[data-v-ab47cf8d]{background-color:#1a1a2e;min-height:100%;padding:48px 24px}.create-inner[data-v-ab47cf8d]{width:100%;max-width:700px}.create-title[data-v-ab47cf8d]{font-size:24px;line-height:1.3}.create-card[data-v-ab47cf8d]{background:#224;border:1px solid #444;overflow:hidden}.card-top-bar[data-v-ab47cf8d]{background:#1e1e3a;min-height:36px}.card-name-wrap[data-v-ab47cf8d]{background:#224;padding:8px 16px 4px}.card-name-wrap[data-v-ab47cf8d] .q-field__control{height:32px;min-height:32px;padding:0}.card-name-wrap[data-v-ab47cf8d] input{color:#e0e0e0;font-size:15px;font-weight:500}.card-name-wrap[data-v-ab47cf8d] input::placeholder{color:#555}.card-textarea-wrap[data-v-ab47cf8d]{background:#224}.repo-select[data-v-ab47cf8d]{min-width:160px;max-width:260px}.repo-select[data-v-ab47cf8d] .q-field__prepend{align-items:center;height:auto;padding-top:0}.create-textarea[data-v-ab47cf8d]{color:#d0d0d0;width:100%;padding:12px 16px 4px}.create-textarea[data-v-ab47cf8d] .q-field__control{padding:0}.create-textarea[data-v-ab47cf8d] textarea{color:#d0d0d0;resize:none;min-height:100px;font-size:14px;line-height:1.6}.create-textarea[data-v-ab47cf8d] textarea::placeholder{color:#666}.notion-toggle-btn[data-v-ab47cf8d]{background:#333;padding:2px 10px}.notion-url-wrap[data-v-ab47cf8d]{background:#1e1e3a;padding:8px 0 0}.notion-url-input[data-v-ab47cf8d]{padding:0 12px}.notion-url-input[data-v-ab47cf8d] .q-field__control{height:36px;min-height:36px;padding:0}.notion-url-input[data-v-ab47cf8d] input{color:#d0d0d0;font-size:13px}.notion-url-input[data-v-ab47cf8d] input::placeholder{color:#555;font-size:12px}.notion-error[data-v-ab47cf8d],.notion-valid[data-v-ab47cf8d]{padding-bottom:6px}.sentry-toggle-btn[data-v-ab47cf8d]{background:#333;padding:2px 10px}.sentry-url-wrap[data-v-ab47cf8d]{background:#1e1e3a;padding:8px 0 0}.sentry-url-input[data-v-ab47cf8d]{padding:0 12px}.sentry-url-input[data-v-ab47cf8d] .q-field__control{height:36px;min-height:36px;padding:0}.sentry-url-input[data-v-ab47cf8d] input{color:#d0d0d0;font-size:13px}.sentry-url-input[data-v-ab47cf8d] input::placeholder{color:#555;font-size:12px}.sentry-error[data-v-ab47cf8d],.sentry-valid[data-v-ab47cf8d]{padding-bottom:6px}.slide-enter-active[data-v-ab47cf8d],.slide-leave-active[data-v-ab47cf8d]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-ab47cf8d],.slide-leave-to[data-v-ab47cf8d]{opacity:0;max-height:0}.slide-enter-to[data-v-ab47cf8d],.slide-leave-from[data-v-ab47cf8d]{opacity:1;max-height:120px}.card-bottom-bar[data-v-ab47cf8d]{background:#1e1e3a;min-height:40px}.bottom-select[data-v-ab47cf8d]{background:#333;min-width:60px;height:28px;padding:0 6px}.bottom-select[data-v-ab47cf8d] .q-field__control{height:28px;min-height:28px;padding:0}.bottom-select[data-v-ab47cf8d] .q-field__native{min-height:unset;padding:0}.bottom-select-label[data-v-ab47cf8d]{color:#bbb;gap:2px;font-size:11px}.bottom-sep[data-v-ab47cf8d]{color:#555;padding:0 2px;font-size:12px;line-height:1}.repo-path-wrap[data-v-ab47cf8d]{background:#333;border-radius:6px;height:28px;padding:0 8px}.repo-input[data-v-ab47cf8d]{min-width:140px}.repo-input[data-v-ab47cf8d] .q-field__control{height:28px;min-height:28px;padding:0}.repo-input[data-v-ab47cf8d] input{color:#bbb;font-size:11px}.repo-input[data-v-ab47cf8d] input::placeholder{color:#666;font-size:11px}.branch-select[data-v-ab47cf8d]{min-width:80px}.create-btn[data-v-ab47cf8d]{color:#fff;background:#4f46e5;min-width:220px;height:32px;padding:0 32px;font-size:13px}.create-btn[data-v-ab47cf8d] .q-btn__content{height:32px}.create-hint[data-v-ab47cf8d]{line-height:1.5}.fade-enter-active[data-v-ab47cf8d],.fade-leave-active[data-v-ab47cf8d]{transition:opacity .2s}.fade-enter-from[data-v-ab47cf8d],.fade-leave-to[data-v-ab47cf8d]{opacity:0}.manual-hint[data-v-ab47cf8d]{background:#1e1e3a;line-height:1.4}.manual-expansion[data-v-ab47cf8d]{background:#1e1e3a;border:1px solid #333;border-radius:4px;margin-top:6px;overflow:hidden}.manual-expansion[data-v-ab47cf8d] .manual-expansion-header{min-height:32px;padding:4px 10px;font-size:12px}.manual-expansion[data-v-ab47cf8d] .q-expansion-item__content,.manual-section-body[data-v-ab47cf8d]{background:#1a1a2e}.manual-input[data-v-ab47cf8d] .q-field__control{height:26px;min-height:26px;padding:0}.manual-input[data-v-ab47cf8d] input{color:#e0e0e0;font-size:12px}.manual-input[data-v-ab47cf8d] input::placeholder{color:#555}.manual-item[data-v-ab47cf8d]{border-top:1px solid #ffffff0a}.manual-item[data-v-ab47cf8d]:first-child{border-top:none}
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-vZ6V2hrP.js","assets/index-Br4eMfSu.js","assets/runtime-core.esm-bundler-C3IgBgY5.js","assets/QSpinner-CliSLjf8.js","assets/pinia-C3JsrLkB.js","assets/QBtn-BsD8vrWq.js","assets/QToggle-B0HvuNEg.js","assets/private.use-form-BhKyDtO7.js","assets/use-dark-DnuCB6tC.js","assets/QDialog-CkbLS1If.js","assets/scroll-CLibRGI-.js","assets/focus-manager-DYbz9jFW.js","assets/symbols-CAg-nBkV.js","assets/i18n-CkN9X6lQ.js","assets/vue-i18n-eUDnMrPl.js","assets/settings-B69lIVX0.js","assets/index-eX_lKHSg.css","assets/editor.api-K7V5sl05.js","assets/editor-COGk2gAX.css","assets/monaco.contribution-CZ_PxrB6.js","assets/editor-CS3NEPi9.css"])))=>i.map(i=>d[i]);
2
+ import{D as e,F as t,H as n,L as r,M as i,N as a,Q as o,S as s,U as c,W as l,_t as u,bt as d,d as f,f as p,g as m,h,j as g,k as ee,l as _,p as v,r as y,u as b,v as x,y as S,yt as C}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{E as w,c as T,i as E,o as D}from"./QSpinner-CliSLjf8.js";import{a as O,i as k,r as A,t as j}from"./private.use-form-BhKyDtO7.js";import{c as M,s as N}from"./scroll-CLibRGI-.js";import{n as P}from"./vue-i18n-eUDnMrPl.js";import{n as F,t as I}from"./QBtn-BsD8vrWq.js";import{n as L,t as R}from"./use-dark-DnuCB6tC.js";import{h as z}from"./index-Br4eMfSu.js";import{t as B}from"./QSpinnerDots-Dp12eHrB.js";import{t as V}from"./QSpace-C5Ebr0vq.js";import{t as te}from"./QTooltip-kLXuUa_m.js";import{t as H}from"./_plugin-vue_export-helper-Cxt1D8wE.js";import{t as U}from"./QBadge-Bvh-hQ8K.js";import{r as W}from"./touch-ChrvzrnI.js";import{n as G,t as K}from"./TouchPan-CVMnGs0y.js";import{t as q}from"./format-Cyg8IgRi.js";var J=w({name:`QBtnGroup`,props:{unelevated:Boolean,outline:Boolean,flat:Boolean,rounded:Boolean,square:Boolean,push:Boolean,stretch:Boolean,glossy:Boolean,spread:Boolean},setup(e,{slots:t}){let n=_(()=>{let t=[`unelevated`,`outline`,`flat`,`rounded`,`square`,`push`,`stretch`,`glossy`].filter(t=>e[t]===!0).map(e=>`q-btn-group--${e}`).join(` `);return`q-btn-group row no-wrap${t.length===0?``:` `+t}`+(e.spread===!0?` q-btn-group--spread`:` inline`)});return()=>s(`div`,{class:n.value},T(t.default))}}),ne=w({name:`QBtnToggle`,props:{...A,modelValue:{required:!0},options:{type:Array,required:!0,validator:e=>e.every(e=>(`label`in e||`icon`in e||`slot`in e)&&`value`in e)},color:String,textColor:String,toggleColor:{type:String,default:`primary`},toggleTextColor:String,outline:Boolean,flat:Boolean,unelevated:Boolean,rounded:Boolean,push:Boolean,glossy:Boolean,size:String,padding:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,readonly:Boolean,disable:Boolean,stack:Boolean,stretch:Boolean,spread:Boolean,clearable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:[`update:modelValue`,`clear`,`click`],setup(e,{slots:t,emit:n}){let r=_(()=>e.options.find(t=>t.value===e.modelValue)!==void 0),i=j(_(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),a=_(()=>F(e)),o=_(()=>({rounded:e.rounded,dense:e.dense,...a.value})),c=_(()=>e.options.map((t,n)=>{let{attrs:r,value:i,slot:a,...s}=t;return{slot:a,props:{key:n,"aria-pressed":i===e.modelValue?`true`:`false`,...r,...s,...o.value,disable:e.disable===!0||s.disable===!0,color:i===e.modelValue?u(s,`toggleColor`):u(s,`color`),textColor:i===e.modelValue?u(s,`toggleTextColor`):u(s,`textColor`),noCaps:u(s,`noCaps`)===!0,noWrap:u(s,`noWrap`)===!0,size:u(s,`size`),padding:u(s,`padding`),ripple:u(s,`ripple`),stack:u(s,`stack`)===!0,stretch:u(s,`stretch`)===!0,onClick(e){l(i,t,e)}}}}));function l(t,r,i){e.readonly!==!0&&(e.modelValue===t?e.clearable===!0&&(n(`update:modelValue`,null,null),n(`clear`)):n(`update:modelValue`,t,r),n(`click`,i))}function u(t,n){return t[n]===void 0?e[n]:t[n]}function d(){let n=c.value.map(e=>s(I,e.props,e.slot===void 0?void 0:t[e.slot]));return e.name!==void 0&&e.disable!==!0&&r.value===!0&&i(n,`push`),D(t.default,n)}return()=>s(J,{class:`q-btn-toggle`,...a.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}}),Y=w({props:[`store`,`barStyle`,`verticalBarStyle`,`horizontalBarStyle`],setup(e){return()=>[s(`div`,{class:e.store.scroll.vertical.barClass.value,style:[e.barStyle,e.verticalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onVerticalMousedown}),s(`div`,{class:e.store.scroll.horizontal.barClass.value,style:[e.barStyle,e.horizontalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onHorizontalMousedown}),l(s(`div`,{ref:e.store.scroll.vertical.ref,class:e.store.scroll.vertical.thumbClass.value,style:e.store.scroll.vertical.style.value,"aria-hidden":`true`}),e.store.thumbVertDir),l(s(`div`,{ref:e.store.scroll.horizontal.ref,class:e.store.scroll.horizontal.thumbClass.value,style:e.store.scroll.horizontal.style.value,"aria-hidden":`true`}),e.store.thumbHorizDir)]}}),X=[`vertical`,`horizontal`],Z={vertical:{offset:`offsetY`,scroll:`scrollTop`,dir:`down`,dist:`y`},horizontal:{offset:`offsetX`,scroll:`scrollLeft`,dir:`right`,dist:`x`}},Q={prevent:!0,mouse:!0,mouseAllDir:!0},$=e=>e>=250?50:Math.ceil(e/5),re=w({name:`QScrollArea`,props:{...L,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],verticalOffset:{type:Array,default:[0,0]},horizontalOffset:{type:Array,default:[0,0]},contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(t,{slots:r,emit:i}){let a=o(!1),c=o(!1),l=o(!1),u={vertical:o(0),horizontal:o(0)},d={vertical:{ref:o(null),position:o(0),size:o(0)},horizontal:{ref:o(null),position:o(0),size:o(0)}},{proxy:f}=S(),p=R(t,f.$q),m=null,h,v=o(null),y=_(()=>`q-scrollarea`+(p.value===!0?` q-scrollarea--dark`:``));Object.assign(u,{verticalInner:_(()=>u.vertical.value-t.verticalOffset[0]-t.verticalOffset[1]),horizontalInner:_(()=>u.horizontal.value-t.horizontalOffset[0]-t.horizontalOffset[1])}),d.vertical.percentage=_(()=>{let e=d.vertical.size.value-u.vertical.value;if(e<=0)return 0;let t=q(d.vertical.position.value/e,0,1);return Math.round(t*1e4)/1e4}),d.vertical.thumbHidden=_(()=>(t.visible===null?l.value:t.visible)!==!0&&a.value===!1&&c.value===!1||d.vertical.size.value<=u.vertical.value+1),d.vertical.thumbStart=_(()=>t.verticalOffset[0]+d.vertical.percentage.value*(u.verticalInner.value-d.vertical.thumbSize.value)),d.vertical.thumbSize=_(()=>Math.round(q(u.verticalInner.value*u.verticalInner.value/d.vertical.size.value,$(u.verticalInner.value),u.verticalInner.value))),d.vertical.style=_(()=>({...t.thumbStyle,...t.verticalThumbStyle,top:`${d.vertical.thumbStart.value}px`,height:`${d.vertical.thumbSize.value}px`,right:`${t.horizontalOffset[1]}px`})),d.vertical.thumbClass=_(()=>`q-scrollarea__thumb q-scrollarea__thumb--v absolute-right`+(d.vertical.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),d.vertical.barClass=_(()=>`q-scrollarea__bar q-scrollarea__bar--v absolute-right`+(d.vertical.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``)),d.horizontal.percentage=_(()=>{let e=d.horizontal.size.value-u.horizontal.value;if(e<=0)return 0;let t=q(Math.abs(d.horizontal.position.value)/e,0,1);return Math.round(t*1e4)/1e4}),d.horizontal.thumbHidden=_(()=>(t.visible===null?l.value:t.visible)!==!0&&a.value===!1&&c.value===!1||d.horizontal.size.value<=u.horizontal.value+1),d.horizontal.thumbStart=_(()=>t.horizontalOffset[0]+d.horizontal.percentage.value*(u.horizontalInner.value-d.horizontal.thumbSize.value)),d.horizontal.thumbSize=_(()=>Math.round(q(u.horizontalInner.value*u.horizontalInner.value/d.horizontal.size.value,$(u.horizontalInner.value),u.horizontalInner.value))),d.horizontal.style=_(()=>({...t.thumbStyle,...t.horizontalThumbStyle,[f.$q.lang.rtl===!0?`right`:`left`]:`${d.horizontal.thumbStart.value}px`,width:`${d.horizontal.thumbSize.value}px`,bottom:`${t.verticalOffset[1]}px`})),d.horizontal.thumbClass=_(()=>`q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom`+(d.horizontal.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),d.horizontal.barClass=_(()=>`q-scrollarea__bar q-scrollarea__bar--h absolute-bottom`+(d.horizontal.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``));let b=_(()=>d.vertical.thumbHidden.value===!0&&d.horizontal.thumbHidden.value===!0?t.contentStyle:t.contentActiveStyle);function x(){let e={};return X.forEach(t=>{let n=d[t];Object.assign(e,{[t+`Position`]:n.position.value,[t+`Percentage`]:n.percentage.value,[t+`Size`]:n.size.value,[t+`ContainerSize`]:u[t].value,[t+`ContainerInnerSize`]:u[t+`Inner`].value})}),e}let C=O(()=>{let e=x();e.ref=f,i(`scroll`,e)},0);function w(e,t,n){if(X.includes(e)===!1){console.error(`[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)`);return}(e===`vertical`?M:N)(v.value,t,n)}function T({height:e,width:t}){let n=!1;u.vertical.value!==e&&(u.vertical.value=e,n=!0),u.horizontal.value!==t&&(u.horizontal.value=t,n=!0),n===!0&&P()}function E({position:e}){let t=!1;d.vertical.position.value!==e.top&&(d.vertical.position.value=e.top,t=!0),d.horizontal.position.value!==e.left&&(d.horizontal.position.value=e.left,t=!0),t===!0&&P()}function k({height:e,width:t}){d.horizontal.size.value!==t&&(d.horizontal.size.value=t,P()),d.vertical.size.value!==e&&(d.vertical.size.value=e,P())}function A(e,t){let n=d[t];if(e.isFirst===!0){if(n.thumbHidden.value===!0)return;h=n.position.value,c.value=!0}else if(c.value!==!0)return;e.isFinal===!0&&(c.value=!1);let r=Z[t],i=(n.size.value-u[t].value)/(u[t+`Inner`].value-n.thumbSize.value),a=e.distance[r.dist];F(h+(e.direction===r.dir?1:-1)*a*i,t)}function j(e,n){let r=d[n];if(r.thumbHidden.value!==!0){let i=n===`vertical`?t.verticalOffset[0]:t.horizontalOffset[0],a=e[Z[n].offset]-i,o=r.thumbStart.value-i;(a<o||a>o+r.thumbSize.value)&&F(q((a-r.thumbSize.value/2)/(u[n+`Inner`].value-r.thumbSize.value),0,1)*Math.max(0,r.size.value-u[n].value),n),r.ref.value!==null&&r.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function P(){a.value=!0,m!==null&&clearTimeout(m),m=setTimeout(()=>{m=null,a.value=!1},t.delay),t.onScroll!==void 0&&C()}function F(e,t){v.value[Z[t].scroll]=e}let I=null;function L(){I!==null&&clearTimeout(I),I=setTimeout(()=>{I=null,l.value=!0},f.$q.platform.is.ios?50:0)}function z(){I!==null&&(clearTimeout(I),I=null),l.value=!1}let B=null;n(()=>f.$q.lang.rtl,e=>{v.value!==null&&N(v.value,Math.abs(d.horizontal.position.value)*(e===!0?-1:1))}),g(()=>{B={top:d.vertical.position.value,left:d.horizontal.position.value}}),e(()=>{if(B===null)return;let e=v.value;e!==null&&(N(e,B.left),M(e,B.top))}),ee(C.cancel),Object.assign(f,{getScrollTarget:()=>v.value,getScroll:x,getScrollPosition:()=>({top:d.vertical.position.value,left:d.horizontal.position.value}),getScrollPercentage:()=>({top:d.vertical.percentage.value,left:d.horizontal.percentage.value}),setScrollPosition:w,setScrollPercentage(e,t,n){w(e,t*(d[e].size.value-u[e].value)*(e===`horizontal`&&f.$q.lang.rtl===!0?-1:1),n)}});let V={scroll:d,thumbVertDir:[[K,e=>{A(e,`vertical`)},void 0,{vertical:!0,...Q}]],thumbHorizDir:[[K,e=>{A(e,`horizontal`)},void 0,{horizontal:!0,...Q}]],onVerticalMousedown(e){j(e,`vertical`)},onHorizontalMousedown(e){j(e,`horizontal`)}};return()=>s(`div`,{class:y.value,onMouseenter:L,onMouseleave:z},[s(`div`,{ref:v,class:`q-scrollarea__container scroll relative-position fit hide-scrollbar`,tabindex:t.tabindex===void 0?void 0:t.tabindex},[s(`div`,{class:`q-scrollarea__content absolute`,style:b.value},D(r.default,[s(W,{debounce:0,onResize:k})])),s(G,{axis:`both`,onScroll:E})]),s(W,{debounce:0,onResize:T}),s(Y,{store:V,barStyle:t.barStyle,verticalBarStyle:t.verticalBarStyle,horizontalBarStyle:t.horizontalBarStyle})])}}),ie={class:`diff-viewer column full-height`},ae={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},oe={class:`text-body1 text-weight-medium text-grey-3`},se={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},ce={class:`text-grey-7`},le={class:`text-green-4`},ue={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},de={class:`row col no-wrap`,style:{"min-height":`0`}},fe={key:1,class:`text-caption text-grey-8 q-pa-sm`},pe=[`onClick`],me={class:`text-caption text-grey-4`,style:{"font-size":`11px`}},he=[`onClick`],ge={class:`text-caption text-grey-3 ellipsis`,style:{"font-size":`11px`}},_e={class:`col column`,style:{"min-width":`0`,position:`relative`}},ve={key:0,class:`col column items-center justify-center`},ye={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},be=H(x({__name:`DiffViewer`,props:{workspaceId:{}},emits:[`close`,`sendToChat`],setup(e,{emit:s}){let l=e,g=s,{t:ee}=P(),x=o([]),S=o(``),w=o(``),T=o(null),D=o(!1),O=o(!1),A=o(null),j=o(`side`),M=o(new Set),N=null,F=null,L=[];function R(e){let t=0;for(let n of e)n.isDir?t+=R(n.children):t++;return t}let H=_(()=>{let e=[];for(let t of x.value){let n=t.path.split(`/`),r=e;for(let e=0;e<n.length;e++){let i=n[e],a=e===n.length-1,o=n.slice(0,e+1).join(`/`),s=r.find(e=>e.name===i&&e.isDir===!a);s||(s={name:i,path:a?t.path:o,isDir:!a,status:a?t.status:void 0,children:[]},r.push(s)),r=s.children}}function t(e){e.sort((e,t)=>e.isDir===t.isDir?e.name.localeCompare(t.name):e.isDir?-1:1);for(let n of e)n.children.length>0&&t(n.children)}return t(e),e}),W=_(()=>{let e=[];function t(n,r){for(let i of n)i.isDir?(e.push({name:i.name,path:i.path,isDir:!0,depth:r,fileCount:R(i.children)}),M.value.has(i.path)||t(i.children,r+1)):e.push({name:i.name,path:i.path,isDir:!1,depth:r,status:i.status})}return t(H.value,0),e});function G(e){M.value.has(e)?M.value.delete(e):M.value.add(e)}async function K(){D.value=!0;try{let e=await fetch(`/api/workspaces/${l.workspaceId}/diff`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();x.value=t.files,S.value=t.sourceBranch??``,w.value=t.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{D.value=!1}}async function q(e){if(A.value){O.value=!0;try{N||(self.MonacoEnvironment={getWorker(e,t){return t===`json`?new Worker(new URL(`/assets/json.worker-C9p7xCYk.js`,``+import.meta.url),{type:`module`}):t===`css`||t===`scss`||t===`less`?new Worker(new URL(`/assets/css.worker-D1piIYC4.js`,``+import.meta.url),{type:`module`}):t===`html`||t===`handlebars`||t===`razor`?new Worker(new URL(`/assets/html.worker-C4q4XMPn.js`,``+import.meta.url),{type:`module`}):t===`typescript`||t===`javascript`?new Worker(new URL(`/assets/ts.worker-Cj3zTgVE.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/editor.worker-CJ9iTmkr.js`,``+import.meta.url),{type:`module`})}},N=await z(()=>import(`./editor.main-vZ6V2hrP.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])),N.editor.defineTheme(`kobo-dark`,{base:`vs-dark`,inherit:!0,rules:[],colors:{"editor.background":`#1a1a2e`,"diffEditor.insertedTextBackground":`#22c55e20`,"diffEditor.removedTextBackground":`#ef444420`}}));let t=await fetch(`/api/workspaces/${l.workspaceId}/diff-file?path=${encodeURIComponent(e)}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json(),r={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,vue:`html`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,sql:`sql`,py:`python`,rs:`rust`,go:`go`}[e.split(`.`).pop()??``]??`plaintext`;if(F){for(let e of L)e.dispose();L=[];let e=F.getModel();F.dispose(),F=null,e?.original?.dispose(),e?.modified?.dispose()}let i=N.editor.createModel(n.original??``,r),a=N.editor.createModel(n.modified??``,r);F=N.editor.createDiffEditor(A.value,{theme:`kobo-dark`,readOnly:!0,renderSideBySide:j.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18}),F.setModel({original:i,modified:a}),Y()}catch(e){console.error(`Failed to load file diff:`,e)}finally{O.value=!1}}}let J=o(!1);function Y(){if(!F)return;for(let e of L)e.dispose();L=[];let e=F.getModifiedEditor(),t=F.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();J.value=!!(e&&!e.isEmpty())});L.push(e)}}function X(){if(!(!F||!T.value))for(let e of[F.getModifiedEditor(),F.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===F.getModifiedEditor()?`modified`:`original`;g(`sendToChat`,`\`\`\`\n// ${T.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}n(T,e=>{e&&q(e)}),n(j,()=>{F&&F.updateOptions({renderSideBySide:j.value===`side`})});function Z(e){switch(e){case`added`:return`add_circle`;case`deleted`:return`remove_circle`;case`renamed`:return`drive_file_rename_outline`;default:return`edit`}}function Q(e){switch(e){case`added`:return`#4ade80`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return i(K),a(()=>{for(let e of L)e.dispose();if(L=[],F){let e=F.getModel();F.dispose(),F=null,e?.original?.dispose(),e?.modified?.dispose()}}),(e,n)=>(t(),v(`div`,ie,[b(`div`,ae,[m(E,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),b(`span`,oe,d(e.$t(`diff.title`)),1),m(U,{label:`${x.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),S.value?(t(),v(`span`,se,[b(`span`,ce,d(S.value),1),m(E,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),b(`span`,le,d(w.value),1)])):p(``,!0),T.value?(t(),v(`span`,ue,d(T.value),1)):p(``,!0),m(V),m(ne,{modelValue:j.value,"onUpdate:modelValue":n[0]||=e=>j.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:e.$t(`diff.side`),value:`side`},{label:e.$t(`diff.inline`),value:`inline`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),m(I,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,onClick:n[1]||=e=>g(`close`)},{default:c(()=>[m(te,null,{default:c(()=>[h(d(e.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1})]),m(k,{dark:``}),b(`div`,de,[m(re,{class:`diff-file-list q-pa-xs`,style:{width:`280px`,"min-width":`200px`,height:`100%`,"border-right":`1px solid #2a2a4a`}},{default:c(()=>[D.value?(t(),f(B,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):x.value.length===0?(t(),v(`div`,fe,d(e.$t(`diff.noChanges`)),1)):(t(!0),v(y,{key:2},r(W.value,e=>(t(),v(y,{key:e.path},[e.isDir?(t(),v(`div`,{key:0,class:`diff-dir-item cursor-pointer`,style:C({paddingLeft:`${e.depth*12+4}px`}),onClick:t=>G(e.path)},[m(E,{name:M.value.has(e.path)?`chevron_right`:`expand_more`,size:`14px`,color:`grey-6`},null,8,[`name`]),m(E,{name:`folder`,size:`13px`,color:`amber-7`,class:`q-mx-xs`}),b(`span`,me,d(e.name),1),m(U,{label:e.fileCount,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])],12,pe)):(t(),v(`div`,{key:1,class:u([`diff-file-item cursor-pointer`,{"diff-file-item--active":T.value===e.path}]),style:C({paddingLeft:`${e.depth*12+20}px`}),onClick:t=>T.value=e.path},[m(E,{name:Z(e.status),size:`11px`,style:C({color:Q(e.status)}),class:`q-mr-xs`},null,8,[`name`,`style`]),b(`span`,ge,d(e.name),1)],14,he))],64))),128))]),_:1}),b(`div`,_e,[O.value?(t(),v(`div`,ve,[m(B,{size:`32px`,color:`indigo-4`})])):T.value?p(``,!0):(t(),v(`div`,ye,d(e.$t(`diff.selectFile`)),1)),b(`div`,{ref_key:`editorContainer`,ref:A,class:`col`,style:{"min-height":`0`}},null,512),J.value?(t(),f(I,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:e.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:X},null,8,[`label`])):p(``,!0)])])]))}}),[[`__scopeId`,`data-v-4ed3860e`]]);export{be as default};
@@ -0,0 +1 @@
1
+ import{F as e,L as t,M as n,Q as r,U as i,_t as ee,bt as a,d as o,f as s,g as c,l,p as u,r as te,rt as ne,u as d,v as re}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{i as f}from"./QSpinner-CliSLjf8.js";import{t as p}from"./QBtn-BsD8vrWq.js";import{_ as m,m as h,p as g}from"./index-Br4eMfSu.js";import{t as _}from"./QSpace-C5Ebr0vq.js";import{n as ie,r as ae,t as oe}from"./QItem-DfoP6eYj.js";import{t as v}from"./QList-D80ms7bw.js";import{t as y}from"./QPage-BKY2-sf-.js";var b={class:`row items-center q-mb-md`},x={class:`text-h6 q-ml-sm`},S={key:0,class:`text-grey-6 text-center q-pa-lg`},C={key:1,class:`column q-gutter-md`},w={class:`text-subtitle2 q-mb-sm`},T={class:`text-caption text-grey-6`},E={class:`text-body2`},D={class:`row items-center`},O={class:`text-subtitle2`},k={class:`row q-col-gutter-md q-mt-xs`},A={class:`col`},j={class:`text-caption text-grey-6`},M={class:`text-body2`},N={class:`col-auto`},P={class:`text-caption text-grey-6`},F={class:`text-body2`},I={class:`col-auto`},L={class:`text-caption text-grey-6`},R={class:`text-body2`},z={class:`row items-center`},B={class:`text-subtitle2`},V={key:0,class:`text-caption text-grey-5 q-mt-xs`},se={key:1,class:`text-caption text-negative q-mt-xs`},H={class:`row items-center`},U={class:`text-subtitle2`},W={class:`text-caption text-grey-6 q-mt-xs`},G={key:0,class:`q-mt-sm`},K={class:`text-caption text-negative q-mb-xs`},ce={class:`text-body2`},le={class:`text-caption text-grey-6`},ue={class:`row items-center`},de={class:`text-subtitle2`},fe={class:`text-subtitle2 q-mb-sm`},pe={class:`column q-gutter-xs`},me={class:`row items-center`},he={class:`q-ml-sm text-caption text-grey-6`},ge={class:`row items-center`},_e={class:`q-ml-sm text-caption text-grey-6`},ve={class:`row items-center`},ye={class:`q-ml-sm text-caption text-grey-6`},q=re({__name:`HealthPage`,setup(re){let q=ae(),be=m(),J=r(null),Y=r(!1);async function X(){Y.value=!0;try{let e=await fetch(`/api/health/report`);if(!e.ok)throw Error(`HTTP ${e.status}`);J.value=await e.json()}catch(e){q.notify({type:`negative`,message:String(e),position:`top`,timeout:4e3})}finally{Y.value=!1}}n(X);let xe=l(()=>{let e=J.value?.db.sizeBytes;return e==null?`—`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}),Z=l(()=>{let e=J.value;return e?e.db.schemaVersion===e.db.currentSchemaVersion:!1});function Q(e){return e?`check_circle`:`error`}function $(e){return e?`positive`:`negative`}return(n,r)=>(e(),o(y,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:i(()=>[d(`div`,b,[c(p,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:r[0]||=e=>ne(be).back()}),d(`div`,x,a(n.$t(`health.title`)),1),c(_),c(p,{flat:``,dense:``,icon:`refresh`,loading:Y.value,label:n.$t(`common.refresh`),onClick:X},null,8,[`loading`,`label`])]),!J.value&&Y.value?(e(),u(`div`,S,a(n.$t(`common.loading`)),1)):J.value?(e(),u(`div`,C,[c(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,null,{default:i(()=>[d(`div`,w,a(n.$t(`health.envTitle`)),1),d(`div`,T,a(n.$t(`health.koboHome`)),1),d(`div`,E,a(J.value.koboHome),1)]),_:1})]),_:1}),c(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,null,{default:i(()=>[d(`div`,D,[d(`div`,O,a(n.$t(`health.dbTitle`)),1),c(_),c(f,{name:Q(Z.value),color:$(Z.value)},null,8,[`name`,`color`])]),d(`div`,k,[d(`div`,A,[d(`div`,j,a(n.$t(`health.dbPath`)),1),d(`div`,M,a(J.value.db.path),1)]),d(`div`,N,[d(`div`,P,a(n.$t(`health.dbSize`)),1),d(`div`,F,a(xe.value),1)]),d(`div`,I,[d(`div`,L,a(n.$t(`health.schemaVersion`)),1),d(`div`,R,a(J.value.db.schemaVersion)+` / `+a(J.value.db.currentSchemaVersion),1)])])]),_:1})]),_:1}),c(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,null,{default:i(()=>[d(`div`,z,[d(`div`,B,a(n.$t(`health.cliTitle`)),1),c(_),c(f,{name:Q(J.value.claudeCli.available),color:$(J.value.claudeCli.available)},null,8,[`name`,`color`])]),J.value.claudeCli.available?(e(),u(`div`,V,a(J.value.claudeCli.version),1)):(e(),u(`div`,se,a(n.$t(`health.cliMissing`)),1))]),_:1})]),_:1}),c(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,null,{default:i(()=>[d(`div`,H,[d(`div`,U,a(n.$t(`health.workspacesTitle`)),1),c(_),c(f,{name:Q(J.value.workspaces.worktreesMissing.length===0),color:$(J.value.workspaces.worktreesMissing.length===0)},null,8,[`name`,`color`])]),d(`div`,W,a(n.$t(`health.workspacesCount`,{total:J.value.workspaces.total,archived:J.value.workspaces.archived})),1),J.value.workspaces.worktreesMissing.length>0?(e(),u(`div`,G,[d(`div`,K,a(n.$t(`health.worktreesMissing`,{count:J.value.workspaces.worktreesMissing.length})),1),c(v,{dense:``,dark:``},{default:i(()=>[(e(!0),u(te,null,t(J.value.workspaces.worktreesMissing,t=>(e(),o(oe,{key:t.workspaceId},{default:i(()=>[c(ie,null,{default:i(()=>[d(`div`,ce,a(t.name),1),d(`div`,le,a(t.path),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):s(``,!0)]),_:1})]),_:1}),c(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,null,{default:i(()=>[d(`div`,ue,[d(`div`,de,a(n.$t(`health.sessionsTitle`)),1),c(_),c(f,{name:Q(J.value.agentSessions.orphaned===0),color:$(J.value.agentSessions.orphaned===0)},null,8,[`name`,`color`])]),d(`div`,{class:ee([`text-caption q-mt-xs`,J.value.agentSessions.orphaned>0?`text-negative`:`text-grey-6`])},a(n.$t(`health.sessionsOrphaned`,{n:J.value.agentSessions.orphaned})),3)]),_:1})]),_:1}),c(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,null,{default:i(()=>[d(`div`,fe,a(n.$t(`health.integrationsTitle`)),1),d(`div`,pe,[d(`div`,me,[c(f,{name:Q(J.value.integrations.notion.configured),color:$(J.value.integrations.notion.configured),size:`sm`},null,8,[`name`,`color`]),r[1]||=d(`span`,{class:`q-ml-sm text-body2`},`Notion`,-1),d(`span`,he,a(J.value.integrations.notion.configured?n.$t(`health.integrationConfigured`):n.$t(`health.integrationMissing`)),1)]),d(`div`,ge,[c(f,{name:Q(J.value.integrations.sentry.configured),color:$(J.value.integrations.sentry.configured),size:`sm`},null,8,[`name`,`color`]),r[2]||=d(`span`,{class:`q-ml-sm text-body2`},`Sentry`,-1),d(`span`,_e,a(J.value.integrations.sentry.configured?n.$t(`health.integrationConfigured`):n.$t(`health.integrationMissing`)),1)]),d(`div`,ve,[c(f,{name:Q(J.value.integrations.editor.configured),color:$(J.value.integrations.editor.configured),size:`sm`},null,8,[`name`,`color`]),r[3]||=d(`span`,{class:`q-ml-sm text-body2`},`Editor`,-1),d(`span`,ye,a(J.value.integrations.editor.configured?n.$t(`health.integrationConfigured`):n.$t(`health.integrationMissing`)),1)])])]),_:1})]),_:1})])):s(``,!0)]),_:1}))}});export{q as default};