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