@loicngr/kobo 1.5.6 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +2 -0
  2. package/dist/server/db/migrations.js +14 -0
  3. package/dist/server/db/schema.js +2 -0
  4. package/dist/server/index.js +17 -1
  5. package/dist/server/routes/dev-server.js +1 -1
  6. package/dist/server/routes/health.js +95 -0
  7. package/dist/server/routes/search.js +33 -0
  8. package/dist/server/routes/settings.js +30 -0
  9. package/dist/server/routes/workspaces.js +150 -0
  10. package/dist/server/services/db-backup-service.js +66 -0
  11. package/dist/server/services/dev-server-service.js +24 -1
  12. package/dist/server/services/search-service.js +102 -0
  13. package/dist/server/services/settings-service.js +73 -6
  14. package/dist/server/services/templates-service.js +31 -0
  15. package/dist/server/services/workspace-service.js +54 -0
  16. package/dist/server/utils/git-ops.js +78 -9
  17. package/package.json +1 -1
  18. package/src/client/dist/spa/assets/ActivityFeed-0GR1zPoc.js +10 -0
  19. package/src/client/dist/spa/assets/ClosePopup-CdSn7HO8.js +1 -0
  20. package/src/client/dist/spa/assets/CreatePage-dMi4xVYN.css +1 -0
  21. package/src/client/dist/spa/assets/CreatePage-je_7dC5I.js +2 -0
  22. package/src/client/dist/spa/assets/DiffViewer-DREYX-8k.js +2 -0
  23. package/src/client/dist/spa/assets/HealthPage-Do8QZdxw.js +1 -0
  24. package/src/client/dist/spa/assets/MainLayout-B5poKEy_.css +1 -0
  25. package/src/client/dist/spa/assets/MainLayout-_oPM07ln.js +37 -0
  26. package/src/client/dist/spa/assets/QBadge-Bvh-hQ8K.js +1 -0
  27. package/src/client/dist/spa/assets/QBtn-BsD8vrWq.js +1 -0
  28. package/src/client/dist/spa/assets/QDialog-CkbLS1If.js +1 -0
  29. package/src/client/dist/spa/assets/QExpansionItem-UgkE560c.js +1 -0
  30. package/src/client/dist/spa/assets/QList-D80ms7bw.js +1 -0
  31. package/src/client/dist/spa/assets/QMenu-DU-wiY_A.js +1 -0
  32. package/src/client/dist/spa/assets/QPage-BKY2-sf-.js +1 -0
  33. package/src/client/dist/spa/assets/QSpace-C5Ebr0vq.js +1 -0
  34. package/src/client/dist/spa/assets/QSpinner-CliSLjf8.js +1 -0
  35. package/src/client/dist/spa/assets/QSpinnerDots-Dp12eHrB.js +1 -0
  36. package/src/client/dist/spa/assets/QTabPanels-C7lWp1yU.js +1 -0
  37. package/src/client/dist/spa/assets/QToggle-B0HvuNEg.js +1 -0
  38. package/src/client/dist/spa/assets/QTooltip-kLXuUa_m.js +1 -0
  39. package/src/client/dist/spa/assets/SearchPage-CCfyqBKh.js +1 -0
  40. package/src/client/dist/spa/assets/SearchPage-DWglAeQv.css +1 -0
  41. package/src/client/dist/spa/assets/SettingsPage-CLMCHMpz.css +1 -0
  42. package/src/client/dist/spa/assets/SettingsPage-CmyIsV-S.js +1 -0
  43. package/src/client/dist/spa/assets/TouchPan-CVMnGs0y.js +1 -0
  44. package/src/client/dist/spa/assets/{WorkspacePage-Ck8G2Lhl.css → WorkspacePage-CWRMLYs-.css} +1 -1
  45. package/src/client/dist/spa/assets/WorkspacePage-Cl7YrG51.js +4 -0
  46. package/src/client/dist/spa/assets/_plugin-vue_export-helper-Cxt1D8wE.js +1 -0
  47. package/src/client/dist/spa/assets/{cssMode-TmSd3FtN.js → cssMode-DMX8jq8u.js} +1 -1
  48. package/src/client/dist/spa/assets/{editor.api-BYoDPXci.js → editor.api-DirOkGGg.js} +1 -1
  49. package/src/client/dist/spa/assets/{editor.main-D2_WTVNi.js → editor.main-DC4ezIu0.js} +3 -3
  50. package/src/client/dist/spa/assets/focus-manager-DYbz9jFW.js +1 -0
  51. package/src/client/dist/spa/assets/formatters-BzaS4w0I.js +1 -0
  52. package/src/client/dist/spa/assets/{freemarker2-BK0cJTj4.js → freemarker2-DI9xJfj0.js} +1 -1
  53. package/src/client/dist/spa/assets/{handlebars-BT6xKkcN.js → handlebars-B9F-pScn.js} +1 -1
  54. package/src/client/dist/spa/assets/{html-G6AG34m0.js → html-DTe2v8Q8.js} +1 -1
  55. package/src/client/dist/spa/assets/{htmlMode-Cal36mmb.js → htmlMode-F_XLjWfJ.js} +1 -1
  56. package/src/client/dist/spa/assets/i18n-B13zBh1H.js +1 -0
  57. package/src/client/dist/spa/assets/i18n-CCWLBc0p.js +1 -0
  58. package/src/client/dist/spa/assets/index-DoNZ_5QK.js +5 -0
  59. package/src/client/dist/spa/assets/{javascript-B-6wB4JQ.js → javascript-B9xJRPC6.js} +1 -1
  60. package/src/client/dist/spa/assets/{jsonMode-CT4pwl6t.js → jsonMode-DTZ6j6UO.js} +1 -1
  61. package/src/client/dist/spa/assets/{liquid-BneTrBrq.js → liquid-BjU5MtW6.js} +1 -1
  62. package/src/client/dist/spa/assets/{marked.esm-C01v3JRg.js → marked.esm-DCmk6NO8.js} +1 -1
  63. package/src/client/dist/spa/assets/{mdx-ByZYBp9K.js → mdx-BMUpG7Be.js} +1 -1
  64. package/src/client/dist/spa/assets/models-B8fzv7K4.js +1 -0
  65. package/src/client/dist/spa/assets/{monaco.contribution-B2_1EuRF.js → monaco.contribution-D7JUf8DP.js} +2 -2
  66. package/src/client/dist/spa/assets/pinia-C3JsrLkB.js +1 -0
  67. package/src/client/dist/spa/assets/private.use-form-BhKyDtO7.js +1 -0
  68. package/src/client/dist/spa/assets/{python-CqrolrIy.js → python-Dz0D4uSk.js} +1 -1
  69. package/src/client/dist/spa/assets/rate-limit-labels-dCPVjS61.js +6 -0
  70. package/src/client/dist/spa/assets/{razor-CPg4dghH.js → razor-D7CFxuwR.js} +1 -1
  71. package/src/client/dist/spa/assets/runtime-core.esm-bundler-C3IgBgY5.js +1 -0
  72. package/src/client/dist/spa/assets/scroll-CLibRGI-.js +1 -0
  73. package/src/client/dist/spa/assets/settings-B69lIVX0.js +1 -0
  74. package/src/client/dist/spa/assets/symbols-CAg-nBkV.js +1 -0
  75. package/src/client/dist/spa/assets/touch-ChrvzrnI.js +1 -0
  76. package/src/client/dist/spa/assets/{tsMode-CRHW8cKK.js → tsMode-DjscaxpS.js} +1 -1
  77. package/src/client/dist/spa/assets/{typescript-D2lNktM6.js → typescript-DozCWZl2.js} +1 -1
  78. package/src/client/dist/spa/assets/use-dark-DnuCB6tC.js +1 -0
  79. package/src/client/dist/spa/assets/use-quasar-DBoizHBW.js +1 -0
  80. package/src/client/dist/spa/assets/vue-i18n-eUDnMrPl.js +3 -0
  81. package/src/client/dist/spa/assets/{xml-C-qye9BU.js → xml-DFOJMT39.js} +1 -1
  82. package/src/client/dist/spa/assets/{yaml-DujvOKOb.js → yaml-yEefnsXm.js} +1 -1
  83. package/src/client/dist/spa/index.html +15 -7
  84. package/src/client/dist/spa/assets/ActivityFeed-BScp_ie9.js +0 -10
  85. package/src/client/dist/spa/assets/ClosePopup-BfANRQ7n.js +0 -1
  86. package/src/client/dist/spa/assets/CreatePage-Cam6EJCg.js +0 -2
  87. package/src/client/dist/spa/assets/CreatePage-Cy1V2bdx.css +0 -1
  88. package/src/client/dist/spa/assets/DiffViewer-DMa0FFUV.js +0 -2
  89. package/src/client/dist/spa/assets/MainLayout-1KXWlMYS.css +0 -1
  90. package/src/client/dist/spa/assets/MainLayout-DB5sQk0j.js +0 -37
  91. package/src/client/dist/spa/assets/QBadge-DENdn6Dv.js +0 -1
  92. package/src/client/dist/spa/assets/QExpansionItem-BBe4EJ8c.js +0 -1
  93. package/src/client/dist/spa/assets/QList-DJTvuGop.js +0 -1
  94. package/src/client/dist/spa/assets/QMenu-DnNUsPHb.js +0 -1
  95. package/src/client/dist/spa/assets/QSpinnerDots-DytntAbf.js +0 -1
  96. package/src/client/dist/spa/assets/SettingsPage-BedYmy7N.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-DcVj7f0F.js +0 -4
  100. package/src/client/dist/spa/assets/_plugin-vue_export-helper-DkL3SKZ8.js +0 -1
  101. package/src/client/dist/spa/assets/formatters-hnFdqDO2.js +0 -6
  102. package/src/client/dist/spa/assets/i18n-ByuXBoTq.js +0 -1
  103. package/src/client/dist/spa/assets/i18n-DyD-u9TB.js +0 -1
  104. package/src/client/dist/spa/assets/index-C9F8lzbI.js +0 -5
  105. package/src/client/dist/spa/assets/models-C4seT9_L.js +0 -1
  106. package/src/client/dist/spa/assets/private.use-form-BWfHn8G9.js +0 -1
  107. package/src/client/dist/spa/assets/scroll-CHtHNzvE.js +0 -1
  108. package/src/client/dist/spa/assets/settings-DNNmyYf-.js +0 -1
  109. package/src/client/dist/spa/assets/touch-5Jv2Ep3F.js +0 -1
  110. package/src/client/dist/spa/assets/use-checkbox-By4PLtaB.js +0 -1
  111. package/src/client/dist/spa/assets/vue-i18n-CFW7O-jl.js +0 -3
  112. /package/src/client/dist/spa/assets/{abap-Dvixoi-w.js → abap-CFuyUYKP.js} +0 -0
  113. /package/src/client/dist/spa/assets/{apex-DP7X7Z9Q.js → apex-Ctq_xcrv.js} +0 -0
  114. /package/src/client/dist/spa/assets/{azcli-BdzyZYsP.js → azcli-BBQSVn-C.js} +0 -0
  115. /package/src/client/dist/spa/assets/{bat-BskgK8bi.js → bat-DbnqAfvr.js} +0 -0
  116. /package/src/client/dist/spa/assets/{bicep-BB_erhjR.js → bicep-BtDlIXop.js} +0 -0
  117. /package/src/client/dist/spa/assets/{cameligo-PvLD8t4t.js → cameligo-BLeJgKTj.js} +0 -0
  118. /package/src/client/dist/spa/assets/{clojure-CjHVLzZR.js → clojure-aZUQIUKP.js} +0 -0
  119. /package/src/client/dist/spa/assets/{coffee-DCoMPIwW.js → coffee-Secadq9U.js} +0 -0
  120. /package/src/client/dist/spa/assets/{cpp-kftb9yup.js → cpp-JicRPTRv.js} +0 -0
  121. /package/src/client/dist/spa/assets/{csharp-CYKl40UV.js → csharp-C7NSOZyj.js} +0 -0
  122. /package/src/client/dist/spa/assets/{csp-d1_9kWqP.js → csp-CIje7830.js} +0 -0
  123. /package/src/client/dist/spa/assets/{css-CSa8r6i8.js → css-G0bm1q_M.js} +0 -0
  124. /package/src/client/dist/spa/assets/{cypher-FoBj7udD.js → cypher-CldD5D0u.js} +0 -0
  125. /package/src/client/dist/spa/assets/{dart-BoITdHw1.js → dart-DIK3l8YT.js} +0 -0
  126. /package/src/client/dist/spa/assets/{dockerfile-CRYieHSB.js → dockerfile-czxaGh2L.js} +0 -0
  127. /package/src/client/dist/spa/assets/{ecl-BisizQmF.js → ecl-BqdYhwmw.js} +0 -0
  128. /package/src/client/dist/spa/assets/{elixir-DMza7PS-.js → elixir-m52LePTW.js} +0 -0
  129. /package/src/client/dist/spa/assets/{flow9-DZyDUZ6t.js → flow9-B5QJ9GvZ.js} +0 -0
  130. /package/src/client/dist/spa/assets/{format-Ex4UmWdz.js → format-Cyg8IgRi.js} +0 -0
  131. /package/src/client/dist/spa/assets/{fsharp-CKv7fFew.js → fsharp-B15czHsH.js} +0 -0
  132. /package/src/client/dist/spa/assets/{go-DXZqPXQn.js → go-BkoQxDo1.js} +0 -0
  133. /package/src/client/dist/spa/assets/{graphql-DrGE7IlY.js → graphql-BnI6uRa_.js} +0 -0
  134. /package/src/client/dist/spa/assets/{hcl-DLEN_UIX.js → hcl-CAwwENT7.js} +0 -0
  135. /package/src/client/dist/spa/assets/{ini-mQpaJDpd.js → ini-BHM5zh1H.js} +0 -0
  136. /package/src/client/dist/spa/assets/{java-jjG-xxwG.js → java-B5i95QvQ.js} +0 -0
  137. /package/src/client/dist/spa/assets/{julia-C50bVRho.js → julia-DPDm885q.js} +0 -0
  138. /package/src/client/dist/spa/assets/{kotlin-DwU9Bxzl.js → kotlin-qoccd5BP.js} +0 -0
  139. /package/src/client/dist/spa/assets/{less-Duxayr-t.js → less-B6RU166D.js} +0 -0
  140. /package/src/client/dist/spa/assets/{lexon-D3Je_oKk.js → lexon-YfUeoL1V.js} +0 -0
  141. /package/src/client/dist/spa/assets/{lua-DqW2q2h7.js → lua-BIUI5y9b.js} +0 -0
  142. /package/src/client/dist/spa/assets/{m3-CO3sU7vD.js → m3-D5SAbSdU.js} +0 -0
  143. /package/src/client/dist/spa/assets/{markdown-CbqjBAOS.js → markdown-CVJLwHzJ.js} +0 -0
  144. /package/src/client/dist/spa/assets/{mips-Bj7AN96v.js → mips-R-FZ3zOR.js} +0 -0
  145. /package/src/client/dist/spa/assets/{msdax-aLgc6HYp.js → msdax-Blveyl9r.js} +0 -0
  146. /package/src/client/dist/spa/assets/{mysql-QJHu-LiC.js → mysql-D4mY1AFx.js} +0 -0
  147. /package/src/client/dist/spa/assets/{objective-c-BRcZj02O.js → objective-c-BmXrLr4h.js} +0 -0
  148. /package/src/client/dist/spa/assets/{pascal-j04gUgnY.js → pascal-yxckoyvV.js} +0 -0
  149. /package/src/client/dist/spa/assets/{pascaligo-6Lz1Pduc.js → pascaligo-Q5JCwXMI.js} +0 -0
  150. /package/src/client/dist/spa/assets/{perl-Ny9A9N4B.js → perl-BF1Rrs5h.js} +0 -0
  151. /package/src/client/dist/spa/assets/{pgsql-gEZ-9kd2.js → pgsql-CnYB97wm.js} +0 -0
  152. /package/src/client/dist/spa/assets/{php-B81GxKax.js → php-CdDfQfSg.js} +0 -0
  153. /package/src/client/dist/spa/assets/{pla-DS3E9Auu.js → pla-whj-d71F.js} +0 -0
  154. /package/src/client/dist/spa/assets/{postiats-CHuHziKk.js → postiats-ClfLr4I-.js} +0 -0
  155. /package/src/client/dist/spa/assets/{powerquery-DWZsw4AU.js → powerquery-iRaBhuuk.js} +0 -0
  156. /package/src/client/dist/spa/assets/{powershell-MAGzBvoK.js → powershell-DjiEt5xK.js} +0 -0
  157. /package/src/client/dist/spa/assets/{protobuf-CuqThPZN.js → protobuf-B6dcIEUr.js} +0 -0
  158. /package/src/client/dist/spa/assets/{pug-DpwILTue.js → pug-DtmHnjM9.js} +0 -0
  159. /package/src/client/dist/spa/assets/{qsharp-Clbrosr3.js → qsharp-CELCyd79.js} +0 -0
  160. /package/src/client/dist/spa/assets/{r-dNsdrNRn.js → r-ZpJXWV-o.js} +0 -0
  161. /package/src/client/dist/spa/assets/{redis-DRY-nYja.js → redis-BiHSNkAl.js} +0 -0
  162. /package/src/client/dist/spa/assets/{redshift-CGzDbZLe.js → redshift-DzuwYCHP.js} +0 -0
  163. /package/src/client/dist/spa/assets/{restructuredtext-DiI6OCjv.js → restructuredtext-YOT94bbS.js} +0 -0
  164. /package/src/client/dist/spa/assets/{ruby-DTTFtlqw.js → ruby-BfiHr6Uu.js} +0 -0
  165. /package/src/client/dist/spa/assets/{rust-Cv26V_Fa.js → rust-JZ-uOoYM.js} +0 -0
  166. /package/src/client/dist/spa/assets/{sb-WM3UPTLr.js → sb-CBglP1-t.js} +0 -0
  167. /package/src/client/dist/spa/assets/{scala-Brw-oZFc.js → scala-C9l41paw.js} +0 -0
  168. /package/src/client/dist/spa/assets/{scheme-B9_NJi2n.js → scheme-B-InQ6hy.js} +0 -0
  169. /package/src/client/dist/spa/assets/{scss-AJXcdTUI.js → scss-v6OmJRN9.js} +0 -0
  170. /package/src/client/dist/spa/assets/{shell-B8rXUKDl.js → shell-Dyp6iwB6.js} +0 -0
  171. /package/src/client/dist/spa/assets/{solidity-DBduMAba.js → solidity-D5epNWue.js} +0 -0
  172. /package/src/client/dist/spa/assets/{sophia-CLkSrv5f.js → sophia-Eva-79sB.js} +0 -0
  173. /package/src/client/dist/spa/assets/{sparql-8jfjvjhF.js → sparql-gvALLO1w.js} +0 -0
  174. /package/src/client/dist/spa/assets/{sql-DCI2HndY.js → sql-COdamZYI.js} +0 -0
  175. /package/src/client/dist/spa/assets/{st-YiBlEXuf.js → st-eMoImIwE.js} +0 -0
  176. /package/src/client/dist/spa/assets/{swift-BpRZ1CVX.js → swift-7R_T9RYH.js} +0 -0
  177. /package/src/client/dist/spa/assets/{systemverilog-2_XLvhYi.js → systemverilog-1pCEfaHU.js} +0 -0
  178. /package/src/client/dist/spa/assets/{tcl-6xehSJT3.js → tcl-B_KgnhfE.js} +0 -0
  179. /package/src/client/dist/spa/assets/{twig-B80I9c0D.js → twig-CFZUJxb9.js} +0 -0
  180. /package/src/client/dist/spa/assets/{typespec-BsAPJtGA.js → typespec-B1ZgHlud.js} +0 -0
  181. /package/src/client/dist/spa/assets/{vb-B6Q-99Bj.js → vb-DKdun5tL.js} +0 -0
  182. /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,6 +138,14 @@ 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;
@@ -175,6 +185,7 @@ function defaultSettings() {
175
185
  defaultPermissionMode: 'plan',
176
186
  notionMcpKey: '',
177
187
  sentryMcpKey: '',
188
+ tags: [...DEFAULT_WORKSPACE_TAGS],
178
189
  },
179
190
  projects: [],
180
191
  };
@@ -189,8 +200,6 @@ function defaultProjectSettings(projectPath) {
189
200
  prPromptTemplate: '',
190
201
  gitConventions: '',
191
202
  setupScript: '',
192
- notionInProgressStatus: '',
193
- notionStatusProperty: '',
194
203
  devServer: {
195
204
  startCommand: '',
196
205
  stopCommand: '',
@@ -281,6 +290,58 @@ function writeSettings(settings, options) {
281
290
  export function getSettings() {
282
291
  return readSettings();
283
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
+ }
284
345
  /** Return only the global settings section. */
285
346
  export function getGlobalSettings() {
286
347
  return readSettings().global;
@@ -315,8 +376,8 @@ export function getEffectiveSettings(projectPath) {
315
376
  sourceBranch: project.defaultSourceBranch,
316
377
  devServer: project.devServer,
317
378
  setupScript: project.setupScript || '',
318
- notionStatusProperty: project.notionStatusProperty || settings.global.notionStatusProperty,
319
- notionInProgressStatus: project.notionInProgressStatus || settings.global.notionInProgressStatus,
379
+ notionStatusProperty: settings.global.notionStatusProperty,
380
+ notionInProgressStatus: settings.global.notionInProgressStatus,
320
381
  };
321
382
  }
322
383
  /** Merge partial updates into global settings and persist. */
@@ -335,8 +396,16 @@ export function updateGlobalSettings(data) {
335
396
  'defaultPermissionMode',
336
397
  'notionMcpKey',
337
398
  'sentryMcpKey',
399
+ 'tags',
338
400
  ];
339
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
+ }
340
409
  settings.global = { ...settings.global, ...filtered };
341
410
  writeSettings(settings, { backup: true });
342
411
  return settings.global;
@@ -351,8 +420,6 @@ export function upsertProject(projectPath, data) {
351
420
  'prPromptTemplate',
352
421
  'gitConventions',
353
422
  'setupScript',
354
- 'notionStatusProperty',
355
- 'notionInProgressStatus',
356
423
  'devServer',
357
424
  ];
358
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,
@@ -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,
@@ -1,5 +1,5 @@
1
1
  import { execFile as execFileCb, execFileSync } from 'node:child_process';
2
- import { readFileSync } from 'node:fs';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import { promisify } from 'node:util';
5
5
  const execFileAsync = promisify(execFileCb);
@@ -133,7 +133,47 @@ export function pullBranch(repoPath, branchName, remote = 'origin') {
133
133
  throw new Error(`Failed to pull branch '${branchName}' from '${remote}': ${message}`);
134
134
  }
135
135
  }
136
- /** Rebase the current branch onto the given base branch. Fetches origin first to get latest changes. */
136
+ /** Thrown when a rebase or merge produces conflicts. Leaves the repo in the mid-operation state
137
+ * so the caller can decide between abort and agent-assisted resolution. */
138
+ export class GitConflictError extends Error {
139
+ operation;
140
+ files;
141
+ constructor(operation, files) {
142
+ super(`${operation} produced ${files.length} conflicted file(s)`);
143
+ this.name = 'GitConflictError';
144
+ this.operation = operation;
145
+ this.files = files;
146
+ }
147
+ }
148
+ /** List files currently in a conflicted state (unmerged paths). */
149
+ export function getConflictedFiles(repoPath) {
150
+ try {
151
+ const output = git(repoPath, ['diff', '--name-only', '--diff-filter=U']);
152
+ return output
153
+ .split('\n')
154
+ .map((f) => f.trim())
155
+ .filter(Boolean);
156
+ }
157
+ catch {
158
+ return [];
159
+ }
160
+ }
161
+ /** Detect whether a merge or rebase is currently in progress in the worktree. */
162
+ export function getOngoingGitOperation(repoPath) {
163
+ try {
164
+ const gitDir = git(repoPath, ['rev-parse', '--git-dir']);
165
+ const dir = gitDir.startsWith('/') ? gitDir : join(repoPath, gitDir);
166
+ if (existsSync(join(dir, 'MERGE_HEAD')))
167
+ return 'merge';
168
+ if (existsSync(join(dir, 'rebase-merge')) || existsSync(join(dir, 'rebase-apply')))
169
+ return 'rebase';
170
+ return null;
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ /** Rebase the current branch onto the given base branch. Fetches origin first. Leaves conflicts in place. */
137
177
  export function rebaseBranch(repoPath, baseBranch) {
138
178
  try {
139
179
  git(repoPath, ['fetch', 'origin', baseBranch]);
@@ -145,17 +185,46 @@ export function rebaseBranch(repoPath, baseBranch) {
145
185
  git(repoPath, ['rebase', `origin/${baseBranch}`]);
146
186
  }
147
187
  catch (err) {
148
- const message = err instanceof Error ? err.message : String(err);
149
- // Abort the rebase if it fails (conflicts etc.)
150
- try {
151
- git(repoPath, ['rebase', '--abort']);
152
- }
153
- catch {
154
- /* best-effort */
188
+ const conflicted = getConflictedFiles(repoPath);
189
+ if (conflicted.length > 0 || getOngoingGitOperation(repoPath) === 'rebase') {
190
+ // Leave the rebase in progress so the caller can abort or request agent-assisted resolution.
191
+ throw new GitConflictError('rebase', conflicted);
155
192
  }
193
+ const message = err instanceof Error ? err.message : String(err);
156
194
  throw new Error(`Rebase onto '${baseBranch}' failed: ${message}`);
157
195
  }
158
196
  }
197
+ /** Merge `origin/<baseBranch>` into the current branch. Fetches first. Leaves conflicts in place. */
198
+ export function mergeBranch(repoPath, baseBranch) {
199
+ try {
200
+ git(repoPath, ['fetch', 'origin', baseBranch]);
201
+ }
202
+ catch {
203
+ // offline — continue with local ref
204
+ }
205
+ try {
206
+ git(repoPath, ['merge', '--no-ff', '--no-edit', `origin/${baseBranch}`]);
207
+ }
208
+ catch (err) {
209
+ const conflicted = getConflictedFiles(repoPath);
210
+ if (conflicted.length > 0 || getOngoingGitOperation(repoPath) === 'merge') {
211
+ throw new GitConflictError('merge', conflicted);
212
+ }
213
+ const message = err instanceof Error ? err.message : String(err);
214
+ throw new Error(`Merge of 'origin/${baseBranch}' failed: ${message}`);
215
+ }
216
+ }
217
+ /** Abort an in-progress merge or rebase. No-op if nothing is in progress. */
218
+ export function abortOngoingGitOperation(repoPath) {
219
+ const op = getOngoingGitOperation(repoPath);
220
+ if (op === 'merge') {
221
+ git(repoPath, ['merge', '--abort']);
222
+ }
223
+ else if (op === 'rebase') {
224
+ git(repoPath, ['rebase', '--abort']);
225
+ }
226
+ return op;
227
+ }
159
228
  /** Try a git command with `base`, falling back to `origin/base` if the local ref is missing. */
160
229
  function resolveBase(repoPath, base) {
161
230
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.5.6",
3
+ "version": "1.6.0",
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-DoNZ_5QK.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-DCmk6NO8.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 @@
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
+ 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-DoNZ_5QK.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 T,t as pe}from"./use-quasar-DBoizHBW.js";import{t as me}from"./QExpansionItem-UgkE560c.js";import{n as E,t as he}from"./models-B8fzv7K4.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(w,ee(t,{class:`model-option`}),{default:o(()=>[u(T,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(w,re(ie(t)),{default:o(()=>[u(T,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(w,null,{default:o(()=>[u(T,{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(w,null,{default:o(()=>[u(T,{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,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-DC4ezIu0.js","assets/index-DoNZ_5QK.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-B13zBh1H.js","assets/vue-i18n-eUDnMrPl.js","assets/settings-B69lIVX0.js","assets/index-eX_lKHSg.css","assets/editor.api-DirOkGGg.js","assets/editor-COGk2gAX.css","assets/monaco.contribution-D7JUf8DP.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-DoNZ_5QK.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-DC4ezIu0.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-DoNZ_5QK.js";import{t as _}from"./QSpace-C5Ebr0vq.js";import{n as ie,r as ae,t as oe}from"./use-quasar-DBoizHBW.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=oe(),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(ie,{key:t.workspaceId},{default:i(()=>[c(ae,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};
@@ -0,0 +1 @@
1
+ .acceptance-item[data-v-63b144ad]{padding:2px 0}.acceptance-item[data-v-63b144ad]:hover{background-color:#ffffff08}.acceptance-item:hover .criterion-delete-btn[data-v-63b144ad]{opacity:1}.criterion-delete-btn[data-v-63b144ad]{opacity:0;transition:opacity .15s}.acceptance-title[data-v-63b144ad]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-63b144ad]{opacity:.7;text-decoration:line-through}.criterion-input[data-v-63b144ad] .q-field__control{height:22px;min-height:22px;padding:0}.criterion-input[data-v-63b144ad] input{color:#e0e0e0;font-size:12px}.criterion-input[data-v-63b144ad] input::placeholder{color:#555}.criterion-add-row[data-v-63b144ad],.todo-item[data-v-4eddf754]{padding:2px 0}.todo-title[data-v-4eddf754]{word-break:break-word;line-height:1.4}.text-strike[data-v-4eddf754]{opacity:.7;text-decoration:line-through}.git-btn[data-v-bd0c8440]{padding:2px 10px;font-size:11px}.notion-link[data-v-99e38dbd]{text-decoration:none;display:inline-flex}.notion-link[data-v-99e38dbd]:hover{text-decoration:underline}.task-item[data-v-99e38dbd]{padding:2px 0}.task-item[data-v-99e38dbd]:hover{background-color:#ffffff08}.task-item:hover .task-delete-btn[data-v-99e38dbd]{opacity:1}.task-delete-btn[data-v-99e38dbd]{opacity:0;transition:opacity .15s}.task-title[data-v-99e38dbd]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-99e38dbd]{opacity:.7;text-decoration:line-through}.task-input[data-v-99e38dbd] .q-field__control{height:22px;min-height:22px;padding:0}.task-input[data-v-99e38dbd] input{color:#e0e0e0;font-size:12px}.task-input[data-v-99e38dbd] input::placeholder{color:#555}.task-add-row[data-v-99e38dbd]{padding:2px 0}.plan-content[data-v-442c2eef]{color:#d0d0d0;overflow-wrap:break-word;font-size:12px;line-height:1.6}.plan-content[data-v-442c2eef] h1{color:#e0e0e0;margin:16px 0 8px;font-size:16px}.plan-content[data-v-442c2eef] h2{color:#e0e0e0;margin:14px 0 6px;font-size:14px}.plan-content[data-v-442c2eef] h3{color:#e0e0e0;margin:12px 0 4px;font-size:13px}.plan-content[data-v-442c2eef] code{background:#1a1a2e;border-radius:3px;padding:1px 4px;font-family:Roboto Mono,monospace;font-size:11px}.plan-content[data-v-442c2eef] pre{background:#1a1a2e;border-radius:6px;padding:8px 12px;font-size:11px;overflow-x:auto}.plan-content[data-v-442c2eef] pre code{background:0 0;padding:0}.plan-content[data-v-442c2eef] ul,.plan-content[data-v-442c2eef] ol{padding-left:20px}.plan-content[data-v-442c2eef] li{margin-bottom:2px}.plan-content[data-v-442c2eef] input[type=checkbox]{pointer-events:none;margin-right:6px}.plan-content[data-v-442c2eef] table{border-collapse:collapse;width:100%;margin:8px 0;font-size:11px}.plan-content[data-v-442c2eef] th,.plan-content[data-v-442c2eef] td{text-align:left;border:1px solid #2a2a4a;padding:4px 8px}.plan-content[data-v-442c2eef] th{color:#e0e0e0;background:#1a1a2e}.plan-content[data-v-442c2eef] blockquote{color:#a0a0b0;border-left:3px solid #4a4a6a;margin:8px 0;padding:4px 12px}.plan-content[data-v-442c2eef] a{color:#818cf8}.plan-content[data-v-442c2eef] hr{border:none;border-top:1px solid #2a2a4a;margin:12px 0}.stat-group-label[data-v-61fd94e7]{text-transform:uppercase;letter-spacing:.05em;color:#888;font-size:10px;font-weight:600}.stat-row[data-v-61fd94e7]{justify-content:space-between;align-items:center;padding:2px 0;display:flex}.stat-label[data-v-61fd94e7]{color:#999;font-size:12px}.stat-value[data-v-61fd94e7]{color:#ddd;font-family:Roboto Mono,monospace;font-size:12px;font-weight:500}.stat-value-muted[data-v-61fd94e7]{color:#999;margin-left:4px;font-size:11px}.stat-subtext[data-v-61fd94e7]{color:#8a8aa8;font-size:11px}.usage-breakdown[data-v-61fd94e7]{background:#2a2a4f;border:1px solid #3b3b61;border-radius:999px;width:100%;height:8px;display:flex;overflow:hidden}.usage-breakdown-input[data-v-61fd94e7]{background:linear-gradient(90deg,#6d76ff 0%,#8f96ff 100%);height:100%}.usage-breakdown-output[data-v-61fd94e7]{background:linear-gradient(90deg,#7f6bff 0%,#a598ff 100%);height:100%}.stat-value-ellipsis[data-v-61fd94e7]{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.stat-section[data-v-61fd94e7]{justify-content:space-between;align-items:center;display:flex}.subagents-panel[data-v-81ad2481]{overflow-y:auto}.subagent-item[data-v-81ad2481]{background:#1e1e3a;border:1px solid #2a2a4a}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility-tree:not(.debug) ::-moz-selection{color:#0000}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:-moz-fit-content;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.log-content[data-v-9e03d2b2]{max-height:60vh;overflow-y:auto}.log-text[data-v-9e03d2b2]{color:#ccc;white-space:pre-wrap;word-break:break-all;background:#0d0d1a;margin:0;font-family:JetBrains Mono,Fira Code,monospace;font-size:11px}.dd-panel[data-v-20c5f4bd],.tools-panel[data-v-e0d46842]{min-height:48px}.workspace-list[data-v-d338c975]{background-color:#16162a;overflow-x:hidden}.wl-search[data-v-d338c975]{background-color:#224;padding:0 8px}.wl-search[data-v-d338c975] .q-field__control{height:32px}.wl-search[data-v-d338c975] input{color:#ccc;font-size:12px}.wl-group-header[data-v-d338c975]:hover{background-color:#ffffff08}.wl-project-group+.wl-project-group[data-v-d338c975]{margin-top:6px}.wl-project-label[data-v-d338c975]{align-items:center;padding-bottom:2px;font-size:11px;display:flex}.wl-item[data-v-d338c975]{background-color:#224;margin-bottom:4px;transition:background-color .15s;position:relative}.wl-item[data-v-d338c975]:last-child{margin-bottom:0}.wl-item[data-v-d338c975]:hover{background-color:#2a2a4a}.wl-item--selected[data-v-d338c975]{background-color:#2a2a4a;outline:1px solid #6c63ff66}.wl-item-action[data-v-d338c975]{position:absolute;top:4px;right:4px}.wl-item--archived .wl-item-action[data-v-d338c975]{opacity:0;transition:opacity .15s}.wl-item--archived:hover .wl-item-action[data-v-d338c975]{opacity:1}.wl-item-unarchive[data-v-d338c975]{right:28px}.wl-item-delete[data-v-d338c975]{right:4px}.wl-item--archived[data-v-d338c975]{opacity:.6;background-color:#1a1a30}.wl-item--archived[data-v-d338c975]:hover{opacity:.85}.wl-item--archived.wl-item--selected[data-v-d338c975]{opacity:1}.dd-dot[data-v-d338c975]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.dd-dot--running[data-v-d338c975]{background-color:#22c55e;box-shadow:0 0 4px #22c55e80}.bg-dark[data-v-0ee91c5b]{background-color:#16162a!important;border-color:#2a2a4a!important}.resize-handle[data-v-0ee91c5b]{cursor:col-resize;z-index:10;width:4px;height:100%;transition:background-color .15s;position:absolute;top:0;right:-2px}.resize-handle[data-v-0ee91c5b]:hover,.resize-handle[data-v-0ee91c5b]:active{background-color:#6c63ff80}.resize-handle--right[data-v-0ee91c5b]{left:-2px;right:auto}.vertical-resize-handle[data-v-0ee91c5b]{cursor:row-resize;background-color:#2a2a4a;height:4px;transition:background-color .15s}.vertical-resize-handle[data-v-0ee91c5b]:hover,.vertical-resize-handle[data-v-0ee91c5b]:active{background-color:#6c63ff80}