@loicngr/kobo 1.5.4 → 1.5.6
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/README.md +1 -1
- package/dist/server/db/migrations.js +7 -0
- package/dist/server/db/schema.js +2 -1
- package/dist/server/index.js +2 -2
- package/dist/server/routes/workspaces.js +22 -5
- package/dist/server/services/agent-manager.js +4 -1
- package/dist/server/services/settings-service.js +42 -8
- package/dist/server/services/workspace-service.js +16 -3
- package/dist/server/services/worktree-service.js +3 -2
- package/dist/server/utils/git-ops.js +14 -0
- package/dist/server/utils/paths.js +20 -0
- package/package.json +3 -3
- package/src/client/dist/spa/assets/ActivityFeed-BScp_ie9.js +10 -0
- package/src/client/dist/spa/assets/{ClosePopup-jSuaV6dg.js → ClosePopup-BfANRQ7n.js} +1 -1
- package/src/client/dist/spa/assets/CreatePage-Cam6EJCg.js +2 -0
- package/src/client/dist/spa/assets/CreatePage-Cy1V2bdx.css +1 -0
- package/src/client/dist/spa/assets/DiffViewer-DMa0FFUV.js +2 -0
- package/src/client/dist/spa/assets/MainLayout-1KXWlMYS.css +1 -0
- package/src/client/dist/spa/assets/{MainLayout-liO7poC9.js → MainLayout-DB5sQk0j.js} +17 -17
- package/src/client/dist/spa/assets/{QBadge-xNMZEqT-.js → QBadge-DENdn6Dv.js} +1 -1
- package/src/client/dist/spa/assets/QExpansionItem-BBe4EJ8c.js +1 -0
- package/src/client/dist/spa/assets/{QList-B7DWhM2q.js → QList-DJTvuGop.js} +1 -1
- package/src/client/dist/spa/assets/QMenu-DnNUsPHb.js +1 -0
- package/src/client/dist/spa/assets/{QSpinnerDots-FJCnAvfw.js → QSpinnerDots-DytntAbf.js} +1 -1
- package/src/client/dist/spa/assets/SettingsPage-BedYmy7N.js +1 -0
- package/src/client/dist/spa/assets/SettingsPage-oWZ8sGFm.css +1 -0
- package/src/client/dist/spa/assets/{TouchPan-DuISf80E.js → TouchPan-D_gmnARo.js} +1 -1
- package/src/client/dist/spa/assets/WorkspacePage-Ck8G2Lhl.css +1 -0
- package/src/client/dist/spa/assets/WorkspacePage-DcVj7f0F.js +4 -0
- package/src/client/dist/spa/assets/{_plugin-vue_export-helper-fkfRoKj2.js → _plugin-vue_export-helper-DkL3SKZ8.js} +1 -1
- package/src/client/dist/spa/assets/{cssMode-DiBSKuoC.js → cssMode-TmSd3FtN.js} +1 -1
- package/src/client/dist/spa/assets/{editor.api-hOnUFdOA.js → editor.api-BYoDPXci.js} +1 -1
- package/src/client/dist/spa/assets/{editor.main-DNa8GpeG.js → editor.main-D2_WTVNi.js} +3 -3
- package/src/client/dist/spa/assets/{formatters-B5Igo0Lf.js → formatters-hnFdqDO2.js} +1 -1
- package/src/client/dist/spa/assets/{freemarker2-Dj7P1Jpi.js → freemarker2-BK0cJTj4.js} +1 -1
- package/src/client/dist/spa/assets/{handlebars-DEMCvy8L.js → handlebars-BT6xKkcN.js} +1 -1
- package/src/client/dist/spa/assets/{html-CPhzMOby.js → html-G6AG34m0.js} +1 -1
- package/src/client/dist/spa/assets/{htmlMode-DneB4Mlv.js → htmlMode-Cal36mmb.js} +1 -1
- package/src/client/dist/spa/assets/i18n-ByuXBoTq.js +1 -0
- package/src/client/dist/spa/assets/i18n-DyD-u9TB.js +1 -0
- package/src/client/dist/spa/assets/index-C9F8lzbI.js +5 -0
- package/src/client/dist/spa/assets/{javascript-xA20aQhN.js → javascript-B-6wB4JQ.js} +1 -1
- package/src/client/dist/spa/assets/{jsonMode-DB1q7_RO.js → jsonMode-CT4pwl6t.js} +1 -1
- package/src/client/dist/spa/assets/{liquid-DUaXf8Ca.js → liquid-BneTrBrq.js} +1 -1
- package/src/client/dist/spa/assets/{marked.esm-hG3KqOZk.js → marked.esm-C01v3JRg.js} +1 -1
- package/src/client/dist/spa/assets/{mdx-DhSPjkRN.js → mdx-ByZYBp9K.js} +1 -1
- package/src/client/dist/spa/assets/models-C4seT9_L.js +1 -0
- package/src/client/dist/spa/assets/{monaco.contribution-BRz6c5Oe.js → monaco.contribution-B2_1EuRF.js} +2 -2
- package/src/client/dist/spa/assets/{private.use-form-1cZLVjGN.js → private.use-form-BWfHn8G9.js} +1 -1
- package/src/client/dist/spa/assets/{python-Cf6SIZRF.js → python-CqrolrIy.js} +1 -1
- package/src/client/dist/spa/assets/{razor-N0lXOpYt.js → razor-CPg4dghH.js} +1 -1
- package/src/client/dist/spa/assets/scroll-CHtHNzvE.js +1 -0
- package/src/client/dist/spa/assets/settings-DNNmyYf-.js +1 -0
- package/src/client/dist/spa/assets/touch-5Jv2Ep3F.js +1 -0
- package/src/client/dist/spa/assets/{tsMode-rGOAcVzO.js → tsMode-CRHW8cKK.js} +1 -1
- package/src/client/dist/spa/assets/{typescript-BDFRwi4p.js → typescript-D2lNktM6.js} +1 -1
- package/src/client/dist/spa/assets/{use-checkbox-DwkIkUAc.js → use-checkbox-By4PLtaB.js} +1 -1
- package/src/client/dist/spa/assets/vue-i18n-CFW7O-jl.js +3 -0
- package/src/client/dist/spa/assets/{xml-Bu77_PI9.js → xml-C-qye9BU.js} +1 -1
- package/src/client/dist/spa/assets/{yaml-wD3nav-2.js → yaml-DujvOKOb.js} +1 -1
- package/src/client/dist/spa/index.html +7 -7
- package/src/client/dist/spa/assets/ActivityFeed-DwLZQtds.js +0 -10
- package/src/client/dist/spa/assets/CreatePage-DnV87-Ej.js +0 -2
- package/src/client/dist/spa/assets/CreatePage-y7wOGccu.css +0 -1
- package/src/client/dist/spa/assets/DiffViewer-DGMt53xq.js +0 -2
- package/src/client/dist/spa/assets/MainLayout-DH5FgF9v.css +0 -1
- package/src/client/dist/spa/assets/QExpansionItem-DG5mKIcR.js +0 -1
- package/src/client/dist/spa/assets/QMenu-hku3VAGZ.js +0 -1
- package/src/client/dist/spa/assets/QPage-BhzgHYFd.js +0 -1
- package/src/client/dist/spa/assets/SettingsPage-C26BwQT7.css +0 -1
- package/src/client/dist/spa/assets/SettingsPage-LzfsgdZ9.js +0 -1
- package/src/client/dist/spa/assets/WorkspacePage-BIYgMXby.css +0 -1
- package/src/client/dist/spa/assets/WorkspacePage-BaOtXfiF.js +0 -4
- package/src/client/dist/spa/assets/i18n-BYjjZp-H.js +0 -1
- package/src/client/dist/spa/assets/i18n-Dho6KmW_.js +0 -1
- package/src/client/dist/spa/assets/index-CFlp44pN.js +0 -5
- package/src/client/dist/spa/assets/scroll-CWjBCoBR.js +0 -1
- package/src/client/dist/spa/assets/settings-CrHkitxT.js +0 -1
- package/src/client/dist/spa/assets/touch-Bojc73iM.js +0 -1
- package/src/client/dist/spa/assets/vue-i18n-nv59vAyH.js +0 -3
package/README.md
CHANGED
|
@@ -69,7 +69,7 @@ npm install
|
|
|
69
69
|
npm run dev:all
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
-
This starts the Hono backend on port `
|
|
72
|
+
This starts the Hono backend on port `3300` (via `tsx watch`, with `KOBO_HOME=./data` so dev uses the repo-local data directory and never touches your real `~/.config/kobo/`) and the Quasar dev server on port `8080` concurrently. Open <http://localhost:8080> in your browser.
|
|
73
73
|
|
|
74
74
|
You can run a production-installed Kōbō (`npx @loicngr/kobo`) alongside a dev server without any conflict — they use different data directories by design.
|
|
75
75
|
|
|
@@ -57,6 +57,13 @@ export const migrations = [
|
|
|
57
57
|
`);
|
|
58
58
|
},
|
|
59
59
|
},
|
|
60
|
+
{
|
|
61
|
+
version: 7,
|
|
62
|
+
name: 'add-reasoning-effort',
|
|
63
|
+
migrate: (db) => {
|
|
64
|
+
db.exec("ALTER TABLE workspaces ADD COLUMN reasoning_effort TEXT NOT NULL DEFAULT 'auto'");
|
|
65
|
+
},
|
|
66
|
+
},
|
|
60
67
|
];
|
|
61
68
|
/** Current schema version — always equals the highest migration version. */
|
|
62
69
|
export const SCHEMA_VERSION = migrations.length > 0 ? migrations[migrations.length - 1].version : 1;
|
package/dist/server/db/schema.js
CHANGED
|
@@ -10,7 +10,8 @@ export function initSchema(db) {
|
|
|
10
10
|
status TEXT NOT NULL DEFAULT 'created',
|
|
11
11
|
notion_url TEXT,
|
|
12
12
|
notion_page_id TEXT,
|
|
13
|
-
model TEXT NOT NULL DEFAULT 'claude-opus-4-
|
|
13
|
+
model TEXT NOT NULL DEFAULT 'claude-opus-4-7',
|
|
14
|
+
reasoning_effort TEXT NOT NULL DEFAULT 'auto',
|
|
14
15
|
permission_mode TEXT NOT NULL DEFAULT 'auto-accept',
|
|
15
16
|
dev_server_status TEXT NOT NULL DEFAULT 'stopped',
|
|
16
17
|
has_unread INTEGER NOT NULL DEFAULT 0,
|
package/dist/server/index.js
CHANGED
|
@@ -217,7 +217,7 @@ setMessageHandler((type, payload) => {
|
|
|
217
217
|
const workspace = getWorkspace(p.workspaceId);
|
|
218
218
|
if (workspace) {
|
|
219
219
|
const worktreePath = `${workspace.projectPath}/.worktrees/${workspace.workingBranch}`;
|
|
220
|
-
startAgent(p.workspaceId, worktreePath, p.content, workspace.model, true, workspace.permissionMode, p.sessionId);
|
|
220
|
+
startAgent(p.workspaceId, worktreePath, p.content, workspace.model, true, workspace.permissionMode, p.sessionId, workspace.reasoningEffort);
|
|
221
221
|
updateWorkspaceStatus(p.workspaceId, 'executing');
|
|
222
222
|
}
|
|
223
223
|
}
|
|
@@ -235,7 +235,7 @@ setMessageHandler((type, payload) => {
|
|
|
235
235
|
}
|
|
236
236
|
const worktreePath = `${workspace.projectPath}/.worktrees/${workspace.workingBranch}`;
|
|
237
237
|
const prompt = p.prompt ?? 'Continue the previous task where you left off.';
|
|
238
|
-
startAgent(p.workspaceId, worktreePath, prompt, workspace.model, false, workspace.permissionMode);
|
|
238
|
+
startAgent(p.workspaceId, worktreePath, prompt, workspace.model, false, workspace.permissionMode, undefined, workspace.reasoningEffort);
|
|
239
239
|
}
|
|
240
240
|
catch (err) {
|
|
241
241
|
console.error('[ws] Failed to start agent:', err);
|
|
@@ -38,6 +38,15 @@ app.post('/', async (c) => {
|
|
|
38
38
|
if (!body.name || !body.projectPath || !body.sourceBranch || !body.workingBranch) {
|
|
39
39
|
return c.json({ error: 'Missing required fields: name, projectPath, sourceBranch, workingBranch' }, 400);
|
|
40
40
|
}
|
|
41
|
+
// Fetch the source branch from origin first — if this fails, block creation
|
|
42
|
+
// immediately (no DB records created, user stays on the create page).
|
|
43
|
+
try {
|
|
44
|
+
gitOps.fetchSourceBranch(body.projectPath, body.sourceBranch);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
48
|
+
return c.json({ error: message }, 422);
|
|
49
|
+
}
|
|
41
50
|
// Create workspace record
|
|
42
51
|
const globalSettings = settingsService.getGlobalSettings();
|
|
43
52
|
// workingBranch may be updated after Notion extraction to inject the ticket ID
|
|
@@ -50,6 +59,7 @@ app.post('/', async (c) => {
|
|
|
50
59
|
notionUrl: body.notionUrl,
|
|
51
60
|
notionPageId: body.notionPageId,
|
|
52
61
|
model: body.model,
|
|
62
|
+
reasoningEffort: body.reasoningEffort,
|
|
53
63
|
permissionMode: body.permissionMode || globalSettings.defaultPermissionMode || 'plan',
|
|
54
64
|
});
|
|
55
65
|
let notionContent = null;
|
|
@@ -410,7 +420,7 @@ app.post('/', async (c) => {
|
|
|
410
420
|
brainstormPrompt += `\nIMPORTANT: Start by reading CLAUDE.md and/or AGENTS.md at the project root if they exist — they contain project conventions and instructions you must follow.`;
|
|
411
421
|
brainstormPrompt += `\n\nThen brainstorm the implementation approach. Explore the codebase to understand the existing structure. Ask clarifying questions if needed. When you're done brainstorming and have a clear plan, create a plan file and proceed with implementation. Once you have completed the brainstorming phase, output [BRAINSTORM_COMPLETE] on its own line.`;
|
|
412
422
|
try {
|
|
413
|
-
const agent = agentManager.startAgent(workspace.id, worktreePath, brainstormPrompt, workspace.model);
|
|
423
|
+
const agent = agentManager.startAgent(workspace.id, worktreePath, brainstormPrompt, workspace.model, false, workspace.permissionMode, undefined, workspace.reasoningEffort);
|
|
414
424
|
// Persist the initial prompt in the feed so it's visible in the chat,
|
|
415
425
|
// tagged with the freshly created session id so the strict session filter shows it.
|
|
416
426
|
wsService.emit(workspace.id, 'user:message', { content: brainstormPrompt, sender: 'system-prompt' }, agent.agentSessionId);
|
|
@@ -759,6 +769,9 @@ app.patch('/:id', async (c) => {
|
|
|
759
769
|
if (body.model !== undefined) {
|
|
760
770
|
updated = workspaceService.updateWorkspaceModel(id, body.model);
|
|
761
771
|
}
|
|
772
|
+
if (body.reasoningEffort !== undefined) {
|
|
773
|
+
updated = workspaceService.updateWorkspaceReasoningEffort(id, body.reasoningEffort);
|
|
774
|
+
}
|
|
762
775
|
if (body.permissionMode !== undefined) {
|
|
763
776
|
const validModes = ['auto-accept', 'plan'];
|
|
764
777
|
if (!validModes.includes(body.permissionMode)) {
|
|
@@ -772,8 +785,12 @@ app.patch('/:id', async (c) => {
|
|
|
772
785
|
if (body.name !== undefined) {
|
|
773
786
|
updated = workspaceService.updateWorkspaceName(id, body.name);
|
|
774
787
|
}
|
|
775
|
-
if (!body.status &&
|
|
776
|
-
|
|
788
|
+
if (!body.status &&
|
|
789
|
+
body.model === undefined &&
|
|
790
|
+
body.reasoningEffort === undefined &&
|
|
791
|
+
body.permissionMode === undefined &&
|
|
792
|
+
body.name === undefined) {
|
|
793
|
+
return c.json({ error: 'Missing field: status, model, reasoningEffort, permissionMode, or name' }, 400);
|
|
777
794
|
}
|
|
778
795
|
return c.json(updated);
|
|
779
796
|
}
|
|
@@ -1011,7 +1028,7 @@ app.post('/:id/start', async (c) => {
|
|
|
1011
1028
|
// Agent may not be running — ignore
|
|
1012
1029
|
}
|
|
1013
1030
|
const worktreePath = `${workspace.projectPath}/.worktrees/${workspace.workingBranch}`;
|
|
1014
|
-
const agent = agentManager.startAgent(id, worktreePath, prompt, workspace.model, resume, workspace.permissionMode, agentSessionId);
|
|
1031
|
+
const agent = agentManager.startAgent(id, worktreePath, prompt, workspace.model, resume, workspace.permissionMode, agentSessionId, workspace.reasoningEffort);
|
|
1015
1032
|
workspaceService.updateWorkspaceStatus(id, 'executing');
|
|
1016
1033
|
// Persist the user prompt so it survives page refresh.
|
|
1017
1034
|
// When agentSessionId is provided (idle-session flow), the prompt was typed
|
|
@@ -1288,7 +1305,7 @@ app.post('/:id/open-pr', async (c) => {
|
|
|
1288
1305
|
// Agent not running — resume it with the PR prompt
|
|
1289
1306
|
try {
|
|
1290
1307
|
const worktreePathForResume = `${workspace.projectPath}/.worktrees/${workspace.workingBranch}`;
|
|
1291
|
-
agentManager.startAgent(workspace.id, worktreePathForResume, rendered, workspace.model, true, workspace.permissionMode);
|
|
1308
|
+
agentManager.startAgent(workspace.id, worktreePathForResume, rendered, workspace.model, true, workspace.permissionMode, undefined, workspace.reasoningEffort);
|
|
1292
1309
|
workspaceService.updateWorkspaceStatus(workspace.id, 'executing');
|
|
1293
1310
|
messageSent = true;
|
|
1294
1311
|
}
|
|
@@ -108,7 +108,7 @@ export function stopWatchdog() {
|
|
|
108
108
|
}
|
|
109
109
|
// ── Start agent ────────────────────────────────────────────────────────────────
|
|
110
110
|
/** Spawn a Claude Code CLI process for a workspace and wire up stdout/stderr/exit handling. */
|
|
111
|
-
export function startAgent(workspaceId, workingDir, prompt, model, resume = false, permissionMode = 'auto-accept', existingSessionId) {
|
|
111
|
+
export function startAgent(workspaceId, workingDir, prompt, model, resume = false, permissionMode = 'auto-accept', existingSessionId, reasoningEffort) {
|
|
112
112
|
// Check if agent already running for this workspace
|
|
113
113
|
if (agents.has(workspaceId)) {
|
|
114
114
|
throw new Error(`Agent already running for workspace '${workspaceId}'`);
|
|
@@ -131,6 +131,9 @@ export function startAgent(workspaceId, workingDir, prompt, model, resume = fals
|
|
|
131
131
|
if (model && model !== 'auto') {
|
|
132
132
|
args.push('--model', model);
|
|
133
133
|
}
|
|
134
|
+
if (reasoningEffort && reasoningEffort !== 'auto') {
|
|
135
|
+
args.push('--effort', reasoningEffort);
|
|
136
|
+
}
|
|
134
137
|
if (resume) {
|
|
135
138
|
// Prefer resuming the specific session requested by the caller (existingSessionId).
|
|
136
139
|
// Otherwise fall back to the most recent session for the workspace.
|
|
@@ -139,7 +139,22 @@ const settingsMigrations = [
|
|
|
139
139
|
];
|
|
140
140
|
/** Current settings schema version — always equals the highest migration version. */
|
|
141
141
|
export const SETTINGS_SCHEMA_VERSION = settingsMigrations.length > 0 ? settingsMigrations[settingsMigrations.length - 1].version : 0;
|
|
142
|
-
|
|
142
|
+
// In Vitest runs, default to a sentinel path so any test that reaches a real
|
|
143
|
+
// read/write without explicitly calling `_setSettingsPath()` first fails loud
|
|
144
|
+
// instead of silently clobbering the user's production `~/.config/kobo/settings.json`.
|
|
145
|
+
// A past incident (see investigation 2026-04-17) showed a `vi.spyOn(fs, 'readFileSync')`
|
|
146
|
+
// in another test file indirectly triggered `readSettings()` and overwrote the
|
|
147
|
+
// real settings file. This guard ensures such a regression cannot recur.
|
|
148
|
+
const VITEST_UNINITIALIZED_PATH = '__VITEST_SETTINGS_PATH_NOT_SET__';
|
|
149
|
+
let settingsFilePath = process.env.VITEST ? VITEST_UNINITIALIZED_PATH : getSettingsPath();
|
|
150
|
+
let settingsBackupSequence = 0;
|
|
151
|
+
function ensureSettingsPathInitialized() {
|
|
152
|
+
if (settingsFilePath === VITEST_UNINITIALIZED_PATH) {
|
|
153
|
+
throw new Error('[settings-service] Attempted to access settings in test mode without calling `_setSettingsPath()` first. ' +
|
|
154
|
+
'This means a test is exercising settings-service indirectly (e.g. via `extractSentryIssue`, `getEffectiveSettings`) ' +
|
|
155
|
+
'without proper isolation. Either `vi.mock("../server/services/settings-service.js", ...)` or call `_setSettingsPath(tmpPath)` in `beforeEach`.');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
143
158
|
/** Override the settings file path (used by tests). */
|
|
144
159
|
export function _setSettingsPath(p) {
|
|
145
160
|
settingsFilePath = p;
|
|
@@ -148,7 +163,7 @@ function defaultSettings() {
|
|
|
148
163
|
return {
|
|
149
164
|
schemaVersion: SETTINGS_SCHEMA_VERSION,
|
|
150
165
|
global: {
|
|
151
|
-
defaultModel: '
|
|
166
|
+
defaultModel: 'claude-opus-4-7',
|
|
152
167
|
dangerouslySkipPermissions: true,
|
|
153
168
|
prPromptTemplate: DEFAULT_PR_PROMPT_TEMPLATE,
|
|
154
169
|
gitConventions: DEFAULT_GIT_CONVENTIONS,
|
|
@@ -205,6 +220,7 @@ export function runSettingsMigrations(raw) {
|
|
|
205
220
|
return current;
|
|
206
221
|
}
|
|
207
222
|
function readSettings() {
|
|
223
|
+
ensureSettingsPathInitialized();
|
|
208
224
|
if (!fs.existsSync(settingsFilePath)) {
|
|
209
225
|
const defaults = defaultSettings();
|
|
210
226
|
writeSettings(defaults);
|
|
@@ -216,30 +232,48 @@ function readSettings() {
|
|
|
216
232
|
parsed = JSON.parse(raw);
|
|
217
233
|
}
|
|
218
234
|
catch {
|
|
235
|
+
createSettingsBackupIfPresent();
|
|
219
236
|
const defaults = defaultSettings();
|
|
220
237
|
writeSettings(defaults);
|
|
221
238
|
return defaults;
|
|
222
239
|
}
|
|
223
240
|
if (!parsed || typeof parsed !== 'object') {
|
|
241
|
+
createSettingsBackupIfPresent();
|
|
224
242
|
const defaults = defaultSettings();
|
|
225
243
|
writeSettings(defaults);
|
|
226
244
|
return defaults;
|
|
227
245
|
}
|
|
228
246
|
const originalVersion = parsed.schemaVersion;
|
|
229
247
|
const migrated = runSettingsMigrations(parsed);
|
|
230
|
-
//
|
|
231
|
-
//
|
|
248
|
+
// Restore any global fields that may have been removed by external edits.
|
|
249
|
+
// Defaults act as fallback for missing keys; existing values are preserved.
|
|
250
|
+
const globalDefaults = defaultSettings().global;
|
|
251
|
+
migrated.global = { ...globalDefaults, ...migrated.global };
|
|
252
|
+
// Persist if migrations bumped the version, or if global fields were restored.
|
|
232
253
|
if (migrated.schemaVersion !== originalVersion) {
|
|
233
254
|
writeSettings(migrated);
|
|
234
255
|
}
|
|
235
256
|
return migrated;
|
|
236
257
|
}
|
|
237
|
-
function
|
|
258
|
+
function createSettingsBackupIfPresent() {
|
|
259
|
+
if (!fs.existsSync(settingsFilePath))
|
|
260
|
+
return;
|
|
261
|
+
const dir = path.dirname(settingsFilePath);
|
|
262
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
263
|
+
settingsBackupSequence += 1;
|
|
264
|
+
const backupPath = path.join(dir, `settings.json.backup-${stamp}-${settingsBackupSequence}`);
|
|
265
|
+
fs.copyFileSync(settingsFilePath, backupPath);
|
|
266
|
+
}
|
|
267
|
+
function writeSettings(settings, options) {
|
|
268
|
+
ensureSettingsPathInitialized();
|
|
238
269
|
const tmpPath = `${settingsFilePath}.tmp`;
|
|
239
270
|
const dir = path.dirname(settingsFilePath);
|
|
240
271
|
if (!fs.existsSync(dir)) {
|
|
241
272
|
fs.mkdirSync(dir, { recursive: true });
|
|
242
273
|
}
|
|
274
|
+
if (options?.backup) {
|
|
275
|
+
createSettingsBackupIfPresent();
|
|
276
|
+
}
|
|
243
277
|
fs.writeFileSync(tmpPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
244
278
|
fs.renameSync(tmpPath, settingsFilePath);
|
|
245
279
|
}
|
|
@@ -304,7 +338,7 @@ export function updateGlobalSettings(data) {
|
|
|
304
338
|
];
|
|
305
339
|
const filtered = pickKnownKeys(data, allowedGlobalKeys);
|
|
306
340
|
settings.global = { ...settings.global, ...filtered };
|
|
307
|
-
writeSettings(settings);
|
|
341
|
+
writeSettings(settings, { backup: true });
|
|
308
342
|
return settings.global;
|
|
309
343
|
}
|
|
310
344
|
/** Create or update project-specific settings. Merges devServer fields on update. */
|
|
@@ -351,14 +385,14 @@ export function upsertProject(projectPath, data) {
|
|
|
351
385
|
}
|
|
352
386
|
settings.projects.push(newProject);
|
|
353
387
|
}
|
|
354
|
-
writeSettings(settings);
|
|
388
|
+
writeSettings(settings, { backup: true });
|
|
355
389
|
return settings.projects.find((p) => p.path === projectPath);
|
|
356
390
|
}
|
|
357
391
|
/** Remove a project from the settings file. */
|
|
358
392
|
export function deleteProject(projectPath) {
|
|
359
393
|
const settings = readSettings();
|
|
360
394
|
settings.projects = settings.projects.filter((p) => p.path !== projectPath);
|
|
361
|
-
writeSettings(settings);
|
|
395
|
+
writeSettings(settings, { backup: true });
|
|
362
396
|
}
|
|
363
397
|
/** List all configured projects. */
|
|
364
398
|
export function listProjects() {
|
|
@@ -22,6 +22,7 @@ function mapWorkspace(row) {
|
|
|
22
22
|
notionUrl: row.notion_url,
|
|
23
23
|
notionPageId: row.notion_page_id,
|
|
24
24
|
model: row.model,
|
|
25
|
+
reasoningEffort: row.reasoning_effort ?? 'auto',
|
|
25
26
|
permissionMode: (row.permission_mode ?? 'auto-accept'),
|
|
26
27
|
devServerStatus: row.dev_server_status,
|
|
27
28
|
hasUnread: row.has_unread === 1,
|
|
@@ -48,9 +49,9 @@ export function createWorkspace(data) {
|
|
|
48
49
|
const now = new Date().toISOString();
|
|
49
50
|
const id = nanoid();
|
|
50
51
|
db.prepare(`
|
|
51
|
-
INSERT INTO workspaces (id, name, project_path, source_branch, working_branch, status, notion_url, notion_page_id, model, permission_mode, created_at, updated_at)
|
|
52
|
-
VALUES (?, ?, ?, ?, ?, 'created', ?, ?, ?, ?, ?, ?)
|
|
53
|
-
`).run(id, data.name, data.projectPath, data.sourceBranch, data.workingBranch, data.notionUrl ?? null, data.notionPageId ?? null, data.model ?? 'claude-opus-4-
|
|
52
|
+
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
|
+
VALUES (?, ?, ?, ?, ?, 'created', ?, ?, ?, ?, ?, ?, ?)
|
|
54
|
+
`).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);
|
|
54
55
|
return getWorkspace(id);
|
|
55
56
|
}
|
|
56
57
|
/** Fetch a single workspace by ID, or null if not found. */
|
|
@@ -124,6 +125,18 @@ export function updateWorkspaceModel(id, model) {
|
|
|
124
125
|
}
|
|
125
126
|
return getWorkspace(id);
|
|
126
127
|
}
|
|
128
|
+
/** Update the reasoning effort used by a workspace's agent. */
|
|
129
|
+
export function updateWorkspaceReasoningEffort(id, reasoningEffort) {
|
|
130
|
+
const db = getDb();
|
|
131
|
+
const now = new Date().toISOString();
|
|
132
|
+
const result = db
|
|
133
|
+
.prepare('UPDATE workspaces SET reasoning_effort = ?, updated_at = ? WHERE id = ?')
|
|
134
|
+
.run(reasoningEffort, now, id);
|
|
135
|
+
if (result.changes === 0) {
|
|
136
|
+
throw new Error(`Workspace '${id}' not found`);
|
|
137
|
+
}
|
|
138
|
+
return getWorkspace(id);
|
|
139
|
+
}
|
|
127
140
|
/** Update the working branch for a workspace (e.g. after ticket ID injection). */
|
|
128
141
|
export function updateWorkingBranch(id, workingBranch) {
|
|
129
142
|
const db = getDb();
|
|
@@ -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
|
|
@@ -28,8 +37,19 @@ export function getPackageAssetPath(...parts) {
|
|
|
28
37
|
*
|
|
29
38
|
* Dev workflow: `npm run dev` sets KOBO_HOME=./data so local development uses
|
|
30
39
|
* the repo-relative data/ directory and never touches the user's real home.
|
|
40
|
+
* For stricter isolation, set KOBO_ENFORCE_LOCAL_HOME=1 to force local writes
|
|
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.
|
|
31
45
|
*/
|
|
32
46
|
export function getKoboHome() {
|
|
47
|
+
if (process.env.KOBO_ENFORCE_LOCAL_HOME === '1' || _devModeProtection) {
|
|
48
|
+
if (process.env.KOBO_HOME) {
|
|
49
|
+
return path.resolve(process.env.KOBO_HOME);
|
|
50
|
+
}
|
|
51
|
+
return getPackageAssetPath('data');
|
|
52
|
+
}
|
|
33
53
|
if (process.env.KOBO_HOME) {
|
|
34
54
|
return path.resolve(process.env.KOBO_HOME);
|
|
35
55
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.6",
|
|
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",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"node": ">=20"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
|
-
"dev": "KOBO_HOME=./data tsx watch src/server/index.ts",
|
|
51
|
-
"dev:client": "cd src/client && npx quasar dev",
|
|
50
|
+
"dev": "KOBO_ENFORCE_LOCAL_HOME=1 KOBO_HOME=./data PORT=3300 tsx watch src/server/index.ts",
|
|
51
|
+
"dev:client": "cd src/client && KOBO_BACKEND_PORT=3300 npx quasar dev",
|
|
52
52
|
"dev:all": "concurrently \"npm run dev\" \"npm run dev:client\"",
|
|
53
53
|
"build:client": "cd src/client && npx quasar build",
|
|
54
54
|
"build:server": "npx tsc && chmod +x dist/server/index.js",
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{$ as e,D as t,I as n,N as r,P as i,R as a,U as o,W as s,_ as c,a as l,d as u,f as d,g as f,it as ee,m as p,n as te,p as m,u as h,vt as g,xt as _,y as ne}from"./vue-i18n-CFW7O-jl.js";import{L as v,T as y,bt as re}from"./scroll-CHtHNzvE.js";import{E as ie,O as ae}from"./index-C9F8lzbI.js";import{t as b}from"./QSpinnerDots-DytntAbf.js";import{n as x,p as S,t as C}from"./_plugin-vue_export-helper-DkL3SKZ8.js";import{n as oe,t as se}from"./marked.esm-C01v3JRg.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(ne({__name:`ActivityFeed`,setup(ne){function C(e){let t=se.parse(e,{async:!1,breaks:!0,gfm:!0});return oe.sanitize(t)}let{t:T}=te(),E=ae(),et=ie(),D=e(null),O=e(!1),k=e(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=h(()=>{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=e(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=e(-1);function at(){let e=E.activityFeed,n=e.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=e.length-r;a>L.value&&(L.value=Math.min(a+10,e.length)),t(()=>{let e=D.value?.querySelector(`[data-item-id="${i}"]`);e&&e.scrollIntoView({behavior:`smooth`,block:`center`})})}o(()=>E.selectedWorkspaceId,()=>{I.value=-1,A.clear(),P.value.clear(),M.clear(),W.clear(),B=0,O.value=!1});let L=e(w),R=h(()=>{let e=E.activityFeed;return e.length<=L.value?e:e.slice(-L.value)});o(()=>E.selectedWorkspaceId,()=>{L.value=w}),o(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=e(!1),B=0;function V(){let e=D.value;if(e&&(e.scrollHeight-e.scrollTop-e.clientHeight<50?z.value=!1:e.scrollTop<B&&(z.value=!0),B=e.scrollTop,e.scrollTop<200&&!O.value)){let n=E.activityFeed.length;if(L.value<n){O.value=!0;let r=e.scrollHeight;L.value=Math.min(L.value+$e,n),t(()=>{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=e.scrollHeight;E.fetchOlderEvents(E.selectedWorkspaceId).then(e=>{e?(L.value=E.activityFeed.length,t(()=>{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,t(()=>{let e=D.value;e&&(e.scrollTop=e.scrollHeight)})}o(()=>E.activityFeed.length,()=>{t(H)}),r(()=>{D.value?.addEventListener(`scroll`,V),t(H)}),i(()=>{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=h(()=>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,t)=>(n(),p(`div`,{ref_key:`feedContainer`,ref:D,class:`activity-feed q-pa-sm`},[ee(E).activityFeed.length===0?(n(),p(`div`,ce,[c(v,{name:`forum`,size:`48px`,color:`grey-8`}),u(`div`,le,_(e.$t(`activityFeed.empty`)),1),u(`div`,ue,_(e.$t(`activityFeed.emptyHint`)),1)])):m(``,!0),O.value?(n(),p(`div`,de,[c(b,{size:`24px`,color:`grey-6`})])):m(``,!0),(n(!0),p(l,null,a(R.value,r=>(n(),p(`div`,{key:r.id,"data-item-id":r.id,class:g([`af-item text-caption rounded-borders`,pt(r)])},[r.type===`tool_use`&&j(r.id,r)?(n(),p(l,{key:0},[u(`div`,pe,[c(v,{name:`help_outline`,size:`14px`,color:`indigo-4`}),u(`span`,me,_(e.$t(`activityFeed.question`)),1),c(S),u(`span`,he,_(U(r.timestamp)),1)]),(n(!0),p(l,null,a(j(r.id,r),(e,t)=>(n(),p(`div`,{key:t,class:`q-mt-sm`},[e.question?(n(),p(`div`,ge,_(e.question),1)):m(``,!0),u(`div`,_e,[(n(!0),p(l,null,a(e.options,(e,t)=>(n(),p(`div`,{key:t,class:`af-ask-option-item text-caption text-grey-5`},[u(`span`,ve,_(t+1)+`. `+_(e.label),1),e.description?(n(),p(`span`,ye,` — `+_(e.description),1)):m(``,!0)]))),128))]),r.id===N.value?(n(),p(`div`,be,[(n(!0),p(l,null,a(e.options,(e,i)=>(n(),d(y,{key:e.label,"no-caps":``,dense:``,outline:!F(r.id,t,i),unelevated:F(r.id,t,i),color:F(r.id,t,i)?`indigo-6`:`indigo-4`,"text-color":F(r.id,t,i)?`white`:void 0,class:`af-option-btn`,onClick:e=>nt(r.id,t,i)},{default:s(()=>[f(_(e.label),1)]),_:2},1032,[`outline`,`unelevated`,`color`,`text-color`,`onClick`]))),128))])):m(``,!0)]))),128)),r.id===N.value?(n(),p(`div`,xe,[c(y,{"no-caps":``,unelevated:``,dense:``,color:`indigo-6`,label:e.$t(`activityFeed.sendAnswers`),icon:`send`,disable:!rt(r.id),onClick:e=>it(r.id,j(r.id,r))},null,8,[`label`,`disable`,`onClick`])])):m(``,!0)],64)):r.type===`tool_use`&&G(r)?(n(),p(`div`,{key:1,class:`af-file-change cursor-pointer`,onClick:e=>Z(r.id)},[u(`div`,Ce,[u(`span`,{class:g([`af-lang-badge`,`text-${dt(q(G(r).filePath))}`])},_(ut(q(G(r).filePath))),3),u(`span`,we,_(K(G(r).filePath)),1),u(`span`,Te,[G(r).additions?(n(),p(`span`,Ee,`+`+_(G(r).additions),1)):m(``,!0),G(r).deletions?(n(),p(`span`,De,`-`+_(G(r).deletions),1)):m(``,!0)]),c(v,{name:Q(r.id)?`expand_less`:`expand_more`,size:`14px`,color:`grey-6`},null,8,[`name`]),c(S),u(`span`,Oe,_(U(r.timestamp)),1)]),Q(r.id)?(n(),p(`div`,{key:0,class:`af-diff-body q-mt-xs`,onClick:t[0]||=re(()=>{},[`stop`])},[G(r).toolName===`Edit`?(n(!0),p(l,{key:0},a(ct(r.id,G(r).oldString??``,G(r).newString??``),(e,t)=>(n(),p(`div`,{key:t,class:g([`af-diff-line`,{"af-diff-del":e.type===`del`,"af-diff-add":e.type===`add`,"af-diff-context":e.type===`context`}])},[u(`span`,ke,_(e.type===`del`?`-`:e.type===`add`?`+`:` `),1),f(_(e.content),1)],2))),128)):G(r).toolName===`Bash:rm`?(n(),p(`div`,Ae,[...t[1]||=[u(`span`,{class:`af-diff-sign`},`-`,-1),f(`File deleted`,-1)]])):(n(),p(l,{key:2},[(n(!0),p(l,null,a((G(r).content??``).split(`
|
|
8
|
+
`).slice(0,30),(e,r)=>(n(),p(`div`,{key:`w-${r}`,class:`af-diff-line af-diff-add`},[t[2]||=u(`span`,{class:`af-diff-sign`},`+`,-1),f(_(e),1)]))),128)),(G(r).content??``).split(`
|
|
9
|
+
`).length>30?(n(),p(`div`,je,`… `+_((G(r).content??``).split(`
|
|
10
|
+
`).length-30)+` more lines`,1)):m(``,!0)],64))])):m(``,!0)],8,Se)):r.type===`tool_use`?(n(),p(l,{key:2},[u(`div`,{class:g([`af-tool row items-center q-gutter-xs`,{"cursor-pointer":X(r)}]),onClick:e=>X(r)&&Z(r.id)},[c(v,{name:ft(r.content),size:`14px`,color:`grey-6`},null,8,[`name`]),u(`span`,Ne,_(gt(r)),1),J(r)?(n(),p(`span`,Pe,`— `+_(J(r)),1)):m(``,!0),X(r)?(n(),d(v,{key:1,name:Q(r.id)?`expand_less`:`expand_more`,size:`14px`,color:`grey-7`},null,8,[`name`])):m(``,!0),c(S),u(`span`,Fe,_(U(r.timestamp)),1)],10,Me),Q(r.id)?(n(),p(`div`,Ie,[u(`pre`,Le,_(_t(r)),1)])):m(``,!0)],64)):r.type===`text`?(n(),p(l,{key:3},[u(`div`,Re,[u(`span`,{class:g([`text-caption text-weight-bold`,ht(r)])},_(mt(r)),3),r.meta?.pending?(n(),d(b,{key:0,size:`14px`,color:`grey-5`,class:`q-ml-sm`})):m(``,!0),c(S),u(`span`,ze,_(U(r.timestamp)),1)]),u(`div`,{class:`af-text-content af-markdown`,innerHTML:tt(r.id,r.content)},null,8,Be)],64)):r.type===`system`?(n(),p(l,{key:4},[u(`div`,{class:g([`row items-center`,{"cursor-pointer":$(r)}]),onClick:e=>$(r)&&Z(r.id)},[c(v,{name:`info`,size:`14px`,color:`amber-6`,class:`q-mr-xs`}),u(`span`,He,_(r.content),1),$(r)?(n(),d(v,{key:0,name:Q(r.id)?`expand_less`:`expand_more`,size:`14px`,color:`amber-8`,class:`q-ml-xs`},null,8,[`name`])):m(``,!0),c(S),u(`span`,Ue,_(U(r.timestamp)),1)],10,Ve),Q(r.id)&&$(r)?(n(),p(`div`,We,[u(`pre`,Ge,_(yt(r)),1)])):m(``,!0)],64)):r.type===`error`?(n(),p(`div`,Ke,[c(v,{name:`error`,size:`14px`,color:`red-5`,class:`q-mr-xs`}),u(`span`,qe,_(r.content),1),c(S),u(`span`,Je,_(U(r.timestamp)),1)])):(n(),p(`div`,Ye,[u(`span`,Xe,_(r.content),1),c(S),u(`span`,Ze,_(U(r.timestamp)),1)]))],10,fe))),128)),u(`div`,Qe,[vt.value?(n(),d(y,{key:0,round:``,dense:``,size:`sm`,icon:`person_search`,color:`indigo-8`,class:`scroll-btn`,onClick:at},{default:s(()=>[c(x,null,{default:s(()=>[f(_(e.$t(`activityFeed.goToPrevious`)),1)]),_:1})]),_:1})):m(``,!0),z.value?(n(),d(y,{key:1,round:``,dense:``,size:`sm`,icon:`keyboard_double_arrow_down`,color:`indigo-8`,class:`scroll-btn`,onClick:ot},{default:s(()=>[c(x,null,{default:s(()=>[f(_(e.$t(`activityFeed.scrollToBottom`)),1)]),_:1})]),_:1})):m(``,!0)])],512))}}),[[`__scopeId`,`data-v-c5b7e063`]]);export{T as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{J as e,d as t,f as n,lt as r}from"./scroll-
|
|
1
|
+
import{J as e,d as t,f as n,lt as r}from"./scroll-CHtHNzvE.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=r({name:`close-popup`,beforeMount(r,{value:a}){let o={depth:i(a),handler(e){o.depth!==0&&setTimeout(()=>{let i=n(r);i!==void 0&&t(i,e,o.depth)})},handlerKey(t){e(t,13)===!0&&o.handler(t)}};r.__qclosepopup=o,r.addEventListener(`click`,o.handler),r.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{$ as e,E as t,I as n,N as r,P as i,R as ee,S as te,U as ne,W as a,_ as o,a as s,d as c,f as l,g as u,it as re,m as d,n as ie,p as f,u as p,xt as m,y as ae,yt as oe}from"./vue-i18n-CFW7O-jl.js";import{L as h,T as g,bt as _,ht as se,yt as v}from"./scroll-CHtHNzvE.js";import{i as y}from"./private.use-form-BWfHn8G9.js";import{t as ce}from"./settings-DNNmyYf-.js";import{E as le,O as ue,r as b,w as de}from"./index-C9F8lzbI.js";import{n as x,p as fe,t as pe}from"./_plugin-vue_export-helper-DkL3SKZ8.js";import{a as me,i as S,n as C,r as w}from"./QMenu-DnNUsPHb.js";import{t as he}from"./QExpansionItem-BBe4EJ8c.js";import{n as ge,r as T,t as _e}from"./models-C4seT9_L.js";var ve={class:`create-inner`},ye={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},be={class:`create-card rounded-borders`},xe={class:`card-top-bar row items-center q-px-md q-py-xs`},Se={class:`model-badge cursor-default row items-center q-gutter-xs`},Ce={class:`text-indigo-3 text-weight-medium text-caption`},we={key:0,class:`notion-url-wrap`},Te={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ee={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},De={key:0,class:`sentry-url-wrap`},Oe={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},ke={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},Ae={class:`card-name-wrap`},je={class:`card-textarea-wrap`},Me={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},Ne={class:`q-pa-sm manual-section-body`},Pe={class:`row items-center q-gutter-sm q-mb-sm`},Fe={class:`col text-caption text-grey-4`},Ie={class:`q-pa-sm manual-section-body`},Le={class:`row items-center q-gutter-sm q-mb-sm`},Re={class:`col text-caption text-grey-4`},ze={class:`card-bottom-bar row items-center wrap q-px-sm q-py-xs q-gutter-xs`},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:`bottom-select-label row items-center no-wrap`},Ke={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},E=pe(ae({__name:`CreatePage`,setup(ae){let pe=de(),E=me(),qe=ue(),D=ce(),{t:O}=ie(),Je=e([]),k=e(``),A=e(``),j=e(``),M=e(!1),N=e(`claude-opus-4-7`),P=e(`auto`),F=e(``),I=e(null),L=e(`feature`),R=e(!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`}],z=e(D.global.defaultPermissionMode||`plan`),B=e([]),V=e(!1),H=e(!1),Xe=p(()=>[..._e.map(e=>({label:O(e.i18nLabelKey),value:e.value,description:O(e.i18nDescriptionKey)}))]);function U(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Ze=p(()=>[{label:U(O(`reasoning.auto`)),value:`auto`,description:O(`reasoning.autoDescription`)},{label:U(O(`reasoning.low`)),value:`low`,description:O(`reasoning.lowDescription`)},{label:U(O(`reasoning.medium`)),value:`medium`,description:O(`reasoning.mediumDescription`)},{label:U(O(`reasoning.high`)),value:`high`,description:O(`reasoning.highDescription`)},{label:U(O(`reasoning.xhigh`)),value:`xhigh`,description:O(`reasoning.xhighDescription`)},{label:U(O(`reasoning.max`)),value:`max`,description:O(`reasoning.maxDescription`)}]),W=p(()=>j.value.trim().startsWith(`https://www.notion.so/`)),G=e([]),K=e([]),q=e(``),J=e(``),Qe=p(()=>!M.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(){M.value=!M.value,M.value||(j.value=``)}let Y=e(!1),X=e(``),Z=p(()=>/\/issues\/\d+/.test(X.value.trim()));function it(){Y.value=!Y.value,Y.value||(X.value=``)}async function at(e){if(!e.trim()){B.value=[],I.value=null;return}V.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();B.value=n.local??n.branches??[],B.value.length>0&&!I.value&&(I.value=B.value[0]??null)}catch{B.value=[],I.value=null}finally{V.value=!1}}function ot(e){let t=D.getProjectByPath(e);t&&(t.defaultSourceBranch&&(I.value=t.defaultSourceBranch),t.defaultModel?N.value=t.defaultModel:D.global.defaultModel&&(N.value=D.global.defaultModel))}let Q=null;ne(F,e=>{Q&&clearTimeout(Q),Q=setTimeout(()=>{I.value=null,at(e),ot(e)},500)});function st(e,t){t(()=>{Je.value=D.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}r(()=>{D.fetchSettings()}),i(()=>{Q&&clearTimeout(Q)});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 k.value.trim()?k.value.trim().substring(0,80):!M.value&&A.value.trim()&&(A.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 M.value&&!W.value?O(`createPage.validationNotionUrl`):Y.value&&!Z.value?O(`createPage.sentryValidation`):!M.value&&!Y.value&&!A.value.trim()?O(`createPage.validationDescription`):!M.value&&!Y.value&&(!lt()||lt()===`workspace`)&&!k.value.trim()&&!A.value.trim()?O(`createPage.validationName`):F.value.trim()?I.value?null:O(`createPage.validationBranch`):O(`createPage.validationPath`)}async function $(){let e=dt();if(e){E.notify({type:`negative`,message:e,position:`top`});return}H.value=!0;try{let e=lt(),t;t=M.value&&W.value?ut(j.value.trim()):e===`workspace`?`task-${Date.now()}`:ct(e);let n=`${L.value}/${t}`,r={name:e,projectPath:F.value.trim(),sourceBranch:I.value,workingBranch:n,model:N.value,reasoningEffort:P.value,...M.value&&W.value?{notionUrl:j.value.trim()}:{},...Y.value&&Z.value?{sentryUrl:X.value.trim()}:{},...Qe.value&&G.value.length>0?{tasks:G.value}:{},...Qe.value&&K.value.length>0?{acceptanceCriteria:K.value}:{},...R.value?{skipSetupScript:!0}:{},...A.value.trim()?{description:A.value.trim()}:{},permissionMode:z.value},i=await qe.createWorkspace(r);le().subscribe(i.id),qe.selectWorkspace(i.id),pe.push({name:`workspace`,params:{id:i.id}})}catch{E.notify({type:`negative`,message:O(`createPage.errorCreating`),position:`top`})}finally{H.value=!1}}return(e,r)=>(n(),l(ge,{class:`create-page flex flex-center column`},{default:a(()=>[c(`div`,ve,[c(`div`,ye,m(e.$t(`createPage.title`)),1),c(`div`,be,[c(`div`,xe,[c(`span`,Se,[o(h,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),c(`span`,Ce,m(e.$t(`createPage.claudeCode`)),1)]),o(fe),o(g,{flat:``,dense:``,"no-caps":``,size:`sm`,color:M.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,onClick:rt},{default:a(()=>[o(h,{name:`description`,size:`14px`,class:`q-mr-xs`}),u(` `+m(M.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`]),o(g,{flat:``,dense:``,"no-caps":``,size:`sm`,color:Y.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,onClick:it},{default:a(()=>[o(h,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),u(` `+m(Y.value?e.$t(`createPage.sentryEnabled`):e.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`])]),o(y,{color:`grey-9`}),o(se,{name:`slide`},{default:a(()=>[M.value?(n(),d(`div`,we,[o(b,{modelValue:j.value,"onUpdate:modelValue":r[0]||=e=>j.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:a(()=>[o(h,{name:`link`,size:`16px`,color:W.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),j.value.trim()&&!W.value?(n(),d(`div`,Te,m(e.$t(`createPage.notionValidation`)),1)):f(``,!0),W.value?(n(),d(`div`,Ee,m(e.$t(`createPage.notionAutoExtract`)),1)):f(``,!0)])):f(``,!0)]),_:1}),M.value?(n(),l(y,{key:0,color:`grey-9`})):f(``,!0),o(se,{name:`slide`},{default:a(()=>[Y.value?(n(),d(`div`,De,[o(b,{modelValue:X.value,"onUpdate:modelValue":r[1]||=e=>X.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:a(()=>[o(h,{name:`link`,size:`16px`,color:Z.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),X.value.trim()&&!Z.value?(n(),d(`div`,Oe,m(e.$t(`createPage.sentryValidation`)),1)):f(``,!0),Z.value?(n(),d(`div`,ke,m(e.$t(`createPage.sentryAutoExtract`)),1)):f(``,!0)])):f(``,!0)]),_:1}),Y.value?(n(),l(y,{key:1,color:`grey-9`})):f(``,!0),c(`div`,Ae,[o(b,{modelValue:k.value,"onUpdate:modelValue":r[2]||=e=>k.value=e,borderless:``,dense:``,placeholder:M.value&&W.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),o(y,{color:`grey-9`}),c(`div`,je,[o(b,{modelValue:A.value,"onUpdate:modelValue":r[3]||=e=>A.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:M.value?e.$t(`createPage.instructions`):e.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[v(_($,[`ctrl`]),[`enter`]),v(_($,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`])]),o(y,{color:`grey-9`}),Qe.value?(n(),d(s,{key:2},[c(`div`,Me,m(e.$t(`createPage.manualHint`)),1),o(he,{dark:``,dense:``,label:e.$t(`createPage.tasks`,{count:G.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:a(()=>[c(`div`,Ne,[c(`div`,Pe,[o(b,{modelValue:q.value,"onUpdate:modelValue":r[4]||=e=>q.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:v(_($e,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),o(g,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!q.value.trim(),onClick:$e},{default:a(()=>[o(x,null,{default:a(()=>[u(m(e.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(n(!0),d(s,null,ee(G.value,(t,r)=>(n(),d(`div`,{key:`task-${r}`,class:`row items-center q-py-xs manual-item`},[c(`span`,Fe,m(t),1),o(g,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>et(r)},{default:a(()=>[o(x,null,{default:a(()=>[u(m(e.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),o(he,{dark:``,dense:``,label:e.$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:a(()=>[c(`div`,Ie,[c(`div`,Le,[o(b,{modelValue:J.value,"onUpdate:modelValue":r[5]||=e=>J.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:v(_(tt,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),o(g,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!J.value.trim(),onClick:tt},{default:a(()=>[o(x,null,{default:a(()=>[u(m(e.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(n(!0),d(s,null,ee(K.value,(t,r)=>(n(),d(`div`,{key:`crit-${r}`,class:`row items-center q-py-xs manual-item`},[c(`span`,Re,m(t),1),o(g,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>nt(r)},{default:a(()=>[o(x,null,{default:a(()=>[u(m(e.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),o(y,{color:`grey-9`})],64)):f(``,!0),c(`div`,ze,[o(T,{modelValue:N.value,"onUpdate:modelValue":r[6]||=e=>N.value=e,options:Xe.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:a(()=>[c(`span`,Be,[u(m(Xe.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),o(h,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:a(({opt:e,itemProps:n})=>[o(C,t(n,{class:`model-option`}),{default:a(()=>[o(S,null,{default:a(()=>[o(w,{class:`text-white`},{default:a(()=>[u(m(e.label),1)]),_:2},1024),o(w,{caption:``,class:`text-grey-5`},{default:a(()=>[u(m(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),o(T,{modelValue:P.value,"onUpdate:modelValue":r[7]||=e=>P.value=e,options:Ze.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:a(()=>[c(`span`,Ve,[o(h,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),u(` `+m(Ze.value.find(e=>e.value===P.value)?.label??P.value)+` `,1),o(h,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:a(({opt:e,itemProps:t})=>[o(C,oe(te(t)),{default:a(()=>[o(S,null,{default:a(()=>[o(w,{class:`text-white`},{default:a(()=>[u(m(e.label),1)]),_:2},1024),o(w,{caption:``,class:`text-grey-5`},{default:a(()=>[u(m(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),o(T,{modelValue:z.value,"onUpdate:modelValue":r[8]||=e=>z.value=e,options:[{label:e.$t(`permissionMode.plan`),value:`plan`},{label:e.$t(`permissionMode.autoAccept`),value:`auto-accept`}],dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``},{selected:a(()=>[c(`span`,He,[o(h,{name:z.value===`plan`?`visibility`:`flash_on`,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),u(` `+m(z.value===`plan`?e.$t(`permissionMode.plan`):e.$t(`permissionMode.autoAccept`))+` `,1),o(h,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),_:1},8,[`modelValue`,`options`]),o(g,{flat:``,round:``,dense:``,size:`sm`,icon:R.value?`play_disabled`:`play_circle`,color:R.value?`orange-4`:`grey-6`,onClick:r[9]||=e=>R.value=!R.value},{default:a(()=>[o(x,null,{default:a(()=>[u(m(e.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`]),o(fe),o(T,{modelValue:F.value,"onUpdate:modelValue":r[10]||=e=>F.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:re(D).projectPaths.length>0?`menu`:`dialog`,onFilter:st,onInputValue:r[11]||=e=>{F.value=e}},{prepend:a(()=>[o(h,{name:`attach_file`,size:`12px`,color:`grey-5`})]),selected:a(()=>[c(`span`,Ue,m(F.value||e.$t(`createPage.projectPath`)),1)]),"no-option":a(()=>[o(C,null,{default:a(()=>[o(S,{class:`text-grey-6 text-caption`},{default:a(()=>[u(m(e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`behavior`]),o(T,{modelValue:L.value,"onUpdate:modelValue":r[12]||=e=>L.value=e,options:Ye,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:a(()=>[c(`span`,We,[o(h,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),u(` `+m(L.value)+`/ `,1),o(h,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:a(()=>[o(x,null,{default:a(()=>[u(m(e.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`]),o(T,{modelValue:I.value,"onUpdate:modelValue":r[13]||=e=>I.value=e,options:B.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,loading:V.value,disable:!F.value.trim()||V.value},{selected:a(()=>[c(`span`,Ge,[o(h,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),u(` `+m(I.value??e.$t(`createPage.branch`))+` `,1),o(h,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":a(()=>[o(C,null,{default:a(()=>[o(S,{class:`text-grey-6 text-caption`},{default:a(()=>[u(m(F.value.trim()?e.$t(`createPage.noBranches`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`]),o(g,{label:e.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:H.value,onClick:$},null,8,[`label`,`loading`])])]),c(`div`,Ke,m(M.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-05191dfd`]]);export{E as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.create-page[data-v-05191dfd]{background-color:#1a1a2e;min-height:100%;padding:48px 24px}.create-inner[data-v-05191dfd]{width:100%;max-width:700px}.create-title[data-v-05191dfd]{font-size:24px;line-height:1.3}.create-card[data-v-05191dfd]{background:#224;border:1px solid #444;overflow:hidden}.card-top-bar[data-v-05191dfd]{background:#1e1e3a;min-height:36px}.card-name-wrap[data-v-05191dfd]{background:#224;padding:8px 16px 4px}.card-name-wrap[data-v-05191dfd] .q-field__control{height:32px;min-height:32px;padding:0}.card-name-wrap[data-v-05191dfd] input{color:#e0e0e0;font-size:15px;font-weight:500}.card-name-wrap[data-v-05191dfd] input::placeholder{color:#555}.card-textarea-wrap[data-v-05191dfd]{background:#224}.repo-select[data-v-05191dfd]{min-width:160px;max-width:260px}.repo-select[data-v-05191dfd] .q-field__prepend{align-items:center;height:auto;padding-top:0}.create-textarea[data-v-05191dfd]{color:#d0d0d0;width:100%;padding:12px 16px 4px}.create-textarea[data-v-05191dfd] .q-field__control{padding:0}.create-textarea[data-v-05191dfd] textarea{color:#d0d0d0;resize:none;min-height:100px;font-size:14px;line-height:1.6}.create-textarea[data-v-05191dfd] textarea::placeholder{color:#666}.notion-toggle-btn[data-v-05191dfd]{background:#333;padding:2px 10px}.notion-url-wrap[data-v-05191dfd]{background:#1e1e3a;padding:8px 0 0}.notion-url-input[data-v-05191dfd]{padding:0 12px}.notion-url-input[data-v-05191dfd] .q-field__control{height:36px;min-height:36px;padding:0}.notion-url-input[data-v-05191dfd] input{color:#d0d0d0;font-size:13px}.notion-url-input[data-v-05191dfd] input::placeholder{color:#555;font-size:12px}.notion-error[data-v-05191dfd],.notion-valid[data-v-05191dfd]{padding-bottom:6px}.sentry-toggle-btn[data-v-05191dfd]{background:#333;padding:2px 10px}.sentry-url-wrap[data-v-05191dfd]{background:#1e1e3a;padding:8px 0 0}.sentry-url-input[data-v-05191dfd]{padding:0 12px}.sentry-url-input[data-v-05191dfd] .q-field__control{height:36px;min-height:36px;padding:0}.sentry-url-input[data-v-05191dfd] input{color:#d0d0d0;font-size:13px}.sentry-url-input[data-v-05191dfd] input::placeholder{color:#555;font-size:12px}.sentry-error[data-v-05191dfd],.sentry-valid[data-v-05191dfd]{padding-bottom:6px}.slide-enter-active[data-v-05191dfd],.slide-leave-active[data-v-05191dfd]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-05191dfd],.slide-leave-to[data-v-05191dfd]{opacity:0;max-height:0}.slide-enter-to[data-v-05191dfd],.slide-leave-from[data-v-05191dfd]{opacity:1;max-height:120px}.card-bottom-bar[data-v-05191dfd]{background:#1e1e3a;min-height:40px}.bottom-select[data-v-05191dfd]{background:#333;min-width:60px;height:28px;padding:0 6px}.bottom-select[data-v-05191dfd] .q-field__control{height:28px;min-height:28px;padding:0}.bottom-select[data-v-05191dfd] .q-field__native{min-height:unset;padding:0}.bottom-select-label[data-v-05191dfd]{color:#bbb;gap:2px;font-size:11px}.bottom-sep[data-v-05191dfd]{color:#555;padding:0 2px;font-size:12px;line-height:1}.repo-path-wrap[data-v-05191dfd]{background:#333;border-radius:6px;height:28px;padding:0 8px}.repo-input[data-v-05191dfd]{min-width:140px}.repo-input[data-v-05191dfd] .q-field__control{height:28px;min-height:28px;padding:0}.repo-input[data-v-05191dfd] input{color:#bbb;font-size:11px}.repo-input[data-v-05191dfd] input::placeholder{color:#666;font-size:11px}.branch-select[data-v-05191dfd]{min-width:80px}.create-btn[data-v-05191dfd]{color:#fff;background:#4f46e5;height:28px;padding:0 14px;font-size:12px}.create-btn[data-v-05191dfd] .q-btn__content{height:28px}.create-hint[data-v-05191dfd]{line-height:1.5}.fade-enter-active[data-v-05191dfd],.fade-leave-active[data-v-05191dfd]{transition:opacity .2s}.fade-enter-from[data-v-05191dfd],.fade-leave-to[data-v-05191dfd]{opacity:0}.manual-hint[data-v-05191dfd]{background:#1e1e3a;line-height:1.4}.manual-expansion[data-v-05191dfd]{background:#1e1e3a;border:1px solid #333;border-radius:4px;margin-top:6px;overflow:hidden}.manual-expansion[data-v-05191dfd] .manual-expansion-header{min-height:32px;padding:4px 10px;font-size:12px}.manual-expansion[data-v-05191dfd] .q-expansion-item__content,.manual-section-body[data-v-05191dfd]{background:#1a1a2e}.manual-input[data-v-05191dfd] .q-field__control{height:26px;min-height:26px;padding:0}.manual-input[data-v-05191dfd] input{color:#e0e0e0;font-size:12px}.manual-input[data-v-05191dfd] input::placeholder{color:#555}.manual-item[data-v-05191dfd]{border-top:1px solid #ffffff0a}.manual-item[data-v-05191dfd]: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-D2_WTVNi.js","assets/index-C9F8lzbI.js","assets/vue-i18n-CFW7O-jl.js","assets/scroll-CHtHNzvE.js","assets/settings-DNNmyYf-.js","assets/use-checkbox-By4PLtaB.js","assets/private.use-form-BWfHn8G9.js","assets/i18n-DyD-u9TB.js","assets/index-eX_lKHSg.css","assets/editor.api-BYoDPXci.js","assets/editor-COGk2gAX.css","assets/monaco.contribution-B2_1EuRF.js","assets/editor-CS3NEPi9.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{$ as e,A as t,C as n,G as r,I as i,M as a,N as o,O as s,P as c,R as l,U as u,W as d,_ as f,a as p,b as m,bt as h,d as g,f as _,g as v,m as y,n as b,p as x,u as S,vt as C,xt as w,y as T}from"./vue-i18n-CFW7O-jl.js";import{E,L as D,T as O,V as k,c as A,ct as j,s as M,z as N}from"./scroll-CHtHNzvE.js";import{a as P,i as F,o as I,r as L,s as R,t as z}from"./private.use-form-BWfHn8G9.js";import{S as B}from"./index-C9F8lzbI.js";import{t as V}from"./QSpinnerDots-DytntAbf.js";import{n as H,p as ee,t as U}from"./_plugin-vue_export-helper-DkL3SKZ8.js";import{t as W}from"./QBadge-DENdn6Dv.js";import{r as G}from"./touch-5Jv2Ep3F.js";import{n as K,t as q}from"./TouchPan-D_gmnARo.js";import{t as J}from"./format-Ex4UmWdz.js";var Y=j({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 r=S(()=>{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()=>n(`div`,{class:r.value},k(t.default))}}),te=j({name:`QBtnToggle`,props:{...L,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:r}){let i=S(()=>e.options.find(t=>t.value===e.modelValue)!==void 0),a=z(S(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),o=S(()=>E(e)),s=S(()=>({rounded:e.rounded,dense:e.dense,...o.value})),c=S(()=>e.options.map((t,n)=>{let{attrs:r,value:i,slot:a,...o}=t;return{slot:a,props:{key:n,"aria-pressed":i===e.modelValue?`true`:`false`,...r,...o,...s.value,disable:e.disable===!0||o.disable===!0,color:i===e.modelValue?u(o,`toggleColor`):u(o,`color`),textColor:i===e.modelValue?u(o,`toggleTextColor`):u(o,`textColor`),noCaps:u(o,`noCaps`)===!0,noWrap:u(o,`noWrap`)===!0,size:u(o,`size`),padding:u(o,`padding`),ripple:u(o,`ripple`),stack:u(o,`stack`)===!0,stretch:u(o,`stretch`)===!0,onClick(e){l(i,t,e)}}}}));function l(t,n,i){e.readonly!==!0&&(e.modelValue===t?e.clearable===!0&&(r(`update:modelValue`,null,null),r(`clear`)):r(`update:modelValue`,t,n),r(`click`,i))}function u(t,n){return t[n]===void 0?e[n]:t[n]}function d(){let r=c.value.map(e=>n(O,e.props,e.slot===void 0?void 0:t[e.slot]));return e.name!==void 0&&e.disable!==!0&&i.value===!0&&a(r,`push`),N(t.default,r)}return()=>n(Y,{class:`q-btn-toggle`,...o.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}}),X=j({props:[`store`,`barStyle`,`verticalBarStyle`,`horizontalBarStyle`],setup(e){return()=>[n(`div`,{class:e.store.scroll.vertical.barClass.value,style:[e.barStyle,e.verticalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onVerticalMousedown}),n(`div`,{class:e.store.scroll.horizontal.barClass.value,style:[e.barStyle,e.horizontalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onHorizontalMousedown}),r(n(`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),r(n(`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)]}}),Z=[`vertical`,`horizontal`],Q={vertical:{offset:`offsetY`,scroll:`scrollTop`,dir:`down`,dist:`y`},horizontal:{offset:`offsetX`,scroll:`scrollLeft`,dir:`right`,dist:`x`}},$={prevent:!0,mouse:!0,mouseAllDir:!0},ne=e=>e>=250?50:Math.ceil(e/5),re=j({name:`QScrollArea`,props:{...I,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(r,{slots:i,emit:o}){let c=e(!1),l=e(!1),d=e(!1),f={vertical:e(0),horizontal:e(0)},p={vertical:{ref:e(null),position:e(0),size:e(0)},horizontal:{ref:e(null),position:e(0),size:e(0)}},{proxy:h}=m(),g=P(r,h.$q),_=null,v,y=e(null),b=S(()=>`q-scrollarea`+(g.value===!0?` q-scrollarea--dark`:``));Object.assign(f,{verticalInner:S(()=>f.vertical.value-r.verticalOffset[0]-r.verticalOffset[1]),horizontalInner:S(()=>f.horizontal.value-r.horizontalOffset[0]-r.horizontalOffset[1])}),p.vertical.percentage=S(()=>{let e=p.vertical.size.value-f.vertical.value;if(e<=0)return 0;let t=J(p.vertical.position.value/e,0,1);return Math.round(t*1e4)/1e4}),p.vertical.thumbHidden=S(()=>(r.visible===null?d.value:r.visible)!==!0&&c.value===!1&&l.value===!1||p.vertical.size.value<=f.vertical.value+1),p.vertical.thumbStart=S(()=>r.verticalOffset[0]+p.vertical.percentage.value*(f.verticalInner.value-p.vertical.thumbSize.value)),p.vertical.thumbSize=S(()=>Math.round(J(f.verticalInner.value*f.verticalInner.value/p.vertical.size.value,ne(f.verticalInner.value),f.verticalInner.value))),p.vertical.style=S(()=>({...r.thumbStyle,...r.verticalThumbStyle,top:`${p.vertical.thumbStart.value}px`,height:`${p.vertical.thumbSize.value}px`,right:`${r.horizontalOffset[1]}px`})),p.vertical.thumbClass=S(()=>`q-scrollarea__thumb q-scrollarea__thumb--v absolute-right`+(p.vertical.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),p.vertical.barClass=S(()=>`q-scrollarea__bar q-scrollarea__bar--v absolute-right`+(p.vertical.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``)),p.horizontal.percentage=S(()=>{let e=p.horizontal.size.value-f.horizontal.value;if(e<=0)return 0;let t=J(Math.abs(p.horizontal.position.value)/e,0,1);return Math.round(t*1e4)/1e4}),p.horizontal.thumbHidden=S(()=>(r.visible===null?d.value:r.visible)!==!0&&c.value===!1&&l.value===!1||p.horizontal.size.value<=f.horizontal.value+1),p.horizontal.thumbStart=S(()=>r.horizontalOffset[0]+p.horizontal.percentage.value*(f.horizontalInner.value-p.horizontal.thumbSize.value)),p.horizontal.thumbSize=S(()=>Math.round(J(f.horizontalInner.value*f.horizontalInner.value/p.horizontal.size.value,ne(f.horizontalInner.value),f.horizontalInner.value))),p.horizontal.style=S(()=>({...r.thumbStyle,...r.horizontalThumbStyle,[h.$q.lang.rtl===!0?`right`:`left`]:`${p.horizontal.thumbStart.value}px`,width:`${p.horizontal.thumbSize.value}px`,bottom:`${r.verticalOffset[1]}px`})),p.horizontal.thumbClass=S(()=>`q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom`+(p.horizontal.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),p.horizontal.barClass=S(()=>`q-scrollarea__bar q-scrollarea__bar--h absolute-bottom`+(p.horizontal.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``));let x=S(()=>p.vertical.thumbHidden.value===!0&&p.horizontal.thumbHidden.value===!0?r.contentStyle:r.contentActiveStyle);function C(){let e={};return Z.forEach(t=>{let n=p[t];Object.assign(e,{[t+`Position`]:n.position.value,[t+`Percentage`]:n.percentage.value,[t+`Size`]:n.size.value,[t+`ContainerSize`]:f[t].value,[t+`ContainerInnerSize`]:f[t+`Inner`].value})}),e}let w=R(()=>{let e=C();e.ref=h,o(`scroll`,e)},0);function T(e,t,n){if(Z.includes(e)===!1){console.error(`[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)`);return}(e===`vertical`?A:M)(y.value,t,n)}function E({height:e,width:t}){let n=!1;f.vertical.value!==e&&(f.vertical.value=e,n=!0),f.horizontal.value!==t&&(f.horizontal.value=t,n=!0),n===!0&&F()}function D({position:e}){let t=!1;p.vertical.position.value!==e.top&&(p.vertical.position.value=e.top,t=!0),p.horizontal.position.value!==e.left&&(p.horizontal.position.value=e.left,t=!0),t===!0&&F()}function O({height:e,width:t}){p.horizontal.size.value!==t&&(p.horizontal.size.value=t,F()),p.vertical.size.value!==e&&(p.vertical.size.value=e,F())}function k(e,t){let n=p[t];if(e.isFirst===!0){if(n.thumbHidden.value===!0)return;v=n.position.value,l.value=!0}else if(l.value!==!0)return;e.isFinal===!0&&(l.value=!1);let r=Q[t],i=(n.size.value-f[t].value)/(f[t+`Inner`].value-n.thumbSize.value),a=e.distance[r.dist];I(v+(e.direction===r.dir?1:-1)*a*i,t)}function j(e,t){let n=p[t];if(n.thumbHidden.value!==!0){let i=t===`vertical`?r.verticalOffset[0]:r.horizontalOffset[0],a=e[Q[t].offset]-i,o=n.thumbStart.value-i;(a<o||a>o+n.thumbSize.value)&&I(J((a-n.thumbSize.value/2)/(f[t+`Inner`].value-n.thumbSize.value),0,1)*Math.max(0,n.size.value-f[t].value),t),n.ref.value!==null&&n.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function F(){c.value=!0,_!==null&&clearTimeout(_),_=setTimeout(()=>{_=null,c.value=!1},r.delay),r.onScroll!==void 0&&w()}function I(e,t){y.value[Q[t].scroll]=e}let L=null;function z(){L!==null&&clearTimeout(L),L=setTimeout(()=>{L=null,d.value=!0},h.$q.platform.is.ios?50:0)}function B(){L!==null&&(clearTimeout(L),L=null),d.value=!1}let V=null;u(()=>h.$q.lang.rtl,e=>{y.value!==null&&M(y.value,Math.abs(p.horizontal.position.value)*(e===!0?-1:1))}),a(()=>{V={top:p.vertical.position.value,left:p.horizontal.position.value}}),s(()=>{if(V===null)return;let e=y.value;e!==null&&(M(e,V.left),A(e,V.top))}),t(w.cancel),Object.assign(h,{getScrollTarget:()=>y.value,getScroll:C,getScrollPosition:()=>({top:p.vertical.position.value,left:p.horizontal.position.value}),getScrollPercentage:()=>({top:p.vertical.percentage.value,left:p.horizontal.percentage.value}),setScrollPosition:T,setScrollPercentage(e,t,n){T(e,t*(p[e].size.value-f[e].value)*(e===`horizontal`&&h.$q.lang.rtl===!0?-1:1),n)}});let H={scroll:p,thumbVertDir:[[q,e=>{k(e,`vertical`)},void 0,{vertical:!0,...$}]],thumbHorizDir:[[q,e=>{k(e,`horizontal`)},void 0,{horizontal:!0,...$}]],onVerticalMousedown(e){j(e,`vertical`)},onHorizontalMousedown(e){j(e,`horizontal`)}};return()=>n(`div`,{class:b.value,onMouseenter:z,onMouseleave:B},[n(`div`,{ref:y,class:`q-scrollarea__container scroll relative-position fit hide-scrollbar`,tabindex:r.tabindex===void 0?void 0:r.tabindex},[n(`div`,{class:`q-scrollarea__content absolute`,style:x.value},N(i.default,[n(G,{debounce:0,onResize:O})])),n(K,{axis:`both`,onScroll:D})]),n(G,{debounce:0,onResize:E}),n(X,{store:H,barStyle:r.barStyle,verticalBarStyle:r.verticalBarStyle,horizontalBarStyle:r.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=U(T({__name:`DiffViewer`,props:{workspaceId:{}},emits:[`close`,`sendToChat`],setup(t,{emit:n}){let r=t,a=n,{t:s}=b(),m=e([]),T=e(``),E=e(``),k=e(null),A=e(!1),j=e(!1),M=e(null),N=e(`side`),P=e(new Set),I=null,L=null,R=[];function z(e){let t=0;for(let n of e)n.isDir?t+=z(n.children):t++;return t}let U=S(()=>{let e=[];for(let t of m.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}),G=S(()=>{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:z(i.children)}),P.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(U.value,0),e});function K(e){P.value.has(e)?P.value.delete(e):P.value.add(e)}async function q(){A.value=!0;try{let e=await fetch(`/api/workspaces/${r.workspaceId}/diff`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();m.value=t.files,T.value=t.sourceBranch??``,E.value=t.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{A.value=!1}}async function J(e){if(M.value){j.value=!0;try{I||(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`})}},I=await B(()=>import(`./editor.main-D2_WTVNi.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),I.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/${r.workspaceId}/diff-file?path=${encodeURIComponent(e)}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json(),i={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(L){for(let e of R)e.dispose();R=[];let e=L.getModel();L.dispose(),L=null,e?.original?.dispose(),e?.modified?.dispose()}let a=I.editor.createModel(n.original??``,i),o=I.editor.createModel(n.modified??``,i);L=I.editor.createDiffEditor(M.value,{theme:`kobo-dark`,readOnly:!0,renderSideBySide:N.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18}),L.setModel({original:a,modified:o}),X()}catch(e){console.error(`Failed to load file diff:`,e)}finally{j.value=!1}}}let Y=e(!1);function X(){if(!L)return;for(let e of R)e.dispose();R=[];let e=L.getModifiedEditor(),t=L.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();Y.value=!!(e&&!e.isEmpty())});R.push(e)}}function Z(){if(!(!L||!k.value))for(let e of[L.getModifiedEditor(),L.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===L.getModifiedEditor()?`modified`:`original`;a(`sendToChat`,`\`\`\`\n// ${k.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}u(k,e=>{e&&J(e)}),u(N,()=>{L&&L.updateOptions({renderSideBySide:N.value===`side`})});function Q(e){switch(e){case`added`:return`add_circle`;case`deleted`:return`remove_circle`;case`renamed`:return`drive_file_rename_outline`;default:return`edit`}}function $(e){switch(e){case`added`:return`#4ade80`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return o(q),c(()=>{for(let e of R)e.dispose();if(R=[],L){let e=L.getModel();L.dispose(),L=null,e?.original?.dispose(),e?.modified?.dispose()}}),(e,t)=>(i(),y(`div`,ie,[g(`div`,ae,[f(D,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),g(`span`,oe,w(e.$t(`diff.title`)),1),f(W,{label:`${m.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),T.value?(i(),y(`span`,se,[g(`span`,ce,w(T.value),1),f(D,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),g(`span`,le,w(E.value),1)])):x(``,!0),k.value?(i(),y(`span`,ue,w(k.value),1)):x(``,!0),f(ee),f(te,{modelValue:N.value,"onUpdate:modelValue":t[0]||=e=>N.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`]),f(O,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,onClick:t[1]||=e=>a(`close`)},{default:d(()=>[f(H,null,{default:d(()=>[v(w(e.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1})]),f(F,{dark:``}),g(`div`,de,[f(re,{class:`diff-file-list q-pa-xs`,style:{width:`280px`,"min-width":`200px`,height:`100%`,"border-right":`1px solid #2a2a4a`}},{default:d(()=>[A.value?(i(),_(V,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):m.value.length===0?(i(),y(`div`,fe,w(e.$t(`diff.noChanges`)),1)):(i(!0),y(p,{key:2},l(G.value,e=>(i(),y(p,{key:e.path},[e.isDir?(i(),y(`div`,{key:0,class:`diff-dir-item cursor-pointer`,style:h({paddingLeft:`${e.depth*12+4}px`}),onClick:t=>K(e.path)},[f(D,{name:P.value.has(e.path)?`chevron_right`:`expand_more`,size:`14px`,color:`grey-6`},null,8,[`name`]),f(D,{name:`folder`,size:`13px`,color:`amber-7`,class:`q-mx-xs`}),g(`span`,me,w(e.name),1),f(W,{label:e.fileCount,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])],12,pe)):(i(),y(`div`,{key:1,class:C([`diff-file-item cursor-pointer`,{"diff-file-item--active":k.value===e.path}]),style:h({paddingLeft:`${e.depth*12+20}px`}),onClick:t=>k.value=e.path},[f(D,{name:Q(e.status),size:`11px`,style:h({color:$(e.status)}),class:`q-mr-xs`},null,8,[`name`,`style`]),g(`span`,ge,w(e.name),1)],14,he))],64))),128))]),_:1}),g(`div`,_e,[j.value?(i(),y(`div`,ve,[f(V,{size:`32px`,color:`indigo-4`})])):k.value?x(``,!0):(i(),y(`div`,ye,w(e.$t(`diff.selectFile`)),1)),g(`div`,{ref_key:`editorContainer`,ref:M,class:`col`,style:{"min-height":`0`}},null,512),Y.value?(i(),_(O,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:e.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:Z},null,8,[`label`])):x(``,!0)])])]))}}),[[`__scopeId`,`data-v-4ed3860e`]]);export{be as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.acceptance-item[data-v-63b144ad]{padding:2px 0}.acceptance-item[data-v-63b144ad]:hover{background-color:#ffffff08}.acceptance-item:hover .criterion-delete-btn[data-v-63b144ad]{opacity:1}.criterion-delete-btn[data-v-63b144ad]{opacity:0;transition:opacity .15s}.acceptance-title[data-v-63b144ad]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-63b144ad]{opacity:.7;text-decoration:line-through}.criterion-input[data-v-63b144ad] .q-field__control{height:22px;min-height:22px;padding:0}.criterion-input[data-v-63b144ad] input{color:#e0e0e0;font-size:12px}.criterion-input[data-v-63b144ad] input::placeholder{color:#555}.criterion-add-row[data-v-63b144ad],.todo-item[data-v-4eddf754]{padding:2px 0}.todo-title[data-v-4eddf754]{word-break:break-word;line-height:1.4}.text-strike[data-v-4eddf754]{opacity:.7;text-decoration:line-through}.log-content[data-v-9e03d2b2]{max-height:60vh;overflow-y:auto}.log-text[data-v-9e03d2b2]{color:#ccc;white-space:pre-wrap;word-break:break-all;background:#0d0d1a;margin:0;font-family:JetBrains Mono,Fira Code,monospace;font-size:11px}.dd-panel[data-v-20c5f4bd]{min-height:48px}.git-btn[data-v-54c55a94]{padding:2px 10px;font-size:11px}.notion-link[data-v-99e38dbd]{text-decoration:none;display:inline-flex}.notion-link[data-v-99e38dbd]:hover{text-decoration:underline}.task-item[data-v-99e38dbd]{padding:2px 0}.task-item[data-v-99e38dbd]:hover{background-color:#ffffff08}.task-item:hover .task-delete-btn[data-v-99e38dbd]{opacity:1}.task-delete-btn[data-v-99e38dbd]{opacity:0;transition:opacity .15s}.task-title[data-v-99e38dbd]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-99e38dbd]{opacity:.7;text-decoration:line-through}.task-input[data-v-99e38dbd] .q-field__control{height:22px;min-height:22px;padding:0}.task-input[data-v-99e38dbd] input{color:#e0e0e0;font-size:12px}.task-input[data-v-99e38dbd] input::placeholder{color:#555}.task-add-row[data-v-99e38dbd]{padding:2px 0}.plan-content[data-v-442c2eef]{color:#d0d0d0;overflow-wrap:break-word;font-size:12px;line-height:1.6}.plan-content[data-v-442c2eef] h1{color:#e0e0e0;margin:16px 0 8px;font-size:16px}.plan-content[data-v-442c2eef] h2{color:#e0e0e0;margin:14px 0 6px;font-size:14px}.plan-content[data-v-442c2eef] h3{color:#e0e0e0;margin:12px 0 4px;font-size:13px}.plan-content[data-v-442c2eef] code{background:#1a1a2e;border-radius:3px;padding:1px 4px;font-family:Roboto Mono,monospace;font-size:11px}.plan-content[data-v-442c2eef] pre{background:#1a1a2e;border-radius:6px;padding:8px 12px;font-size:11px;overflow-x:auto}.plan-content[data-v-442c2eef] pre code{background:0 0;padding:0}.plan-content[data-v-442c2eef] ul,.plan-content[data-v-442c2eef] ol{padding-left:20px}.plan-content[data-v-442c2eef] li{margin-bottom:2px}.plan-content[data-v-442c2eef] input[type=checkbox]{pointer-events:none;margin-right:6px}.plan-content[data-v-442c2eef] table{border-collapse:collapse;width:100%;margin:8px 0;font-size:11px}.plan-content[data-v-442c2eef] th,.plan-content[data-v-442c2eef] td{text-align:left;border:1px solid #2a2a4a;padding:4px 8px}.plan-content[data-v-442c2eef] th{color:#e0e0e0;background:#1a1a2e}.plan-content[data-v-442c2eef] blockquote{color:#a0a0b0;border-left:3px solid #4a4a6a;margin:8px 0;padding:4px 12px}.plan-content[data-v-442c2eef] a{color:#818cf8}.plan-content[data-v-442c2eef] hr{border:none;border-top:1px solid #2a2a4a;margin:12px 0}.stat-group-label[data-v-b2f461ff]{text-transform:uppercase;letter-spacing:.05em;color:#888;font-size:10px;font-weight:600}.stat-row[data-v-b2f461ff]{justify-content:space-between;align-items:center;padding:2px 0;display:flex}.stat-label[data-v-b2f461ff]{color:#999;font-size:12px}.stat-value[data-v-b2f461ff]{color:#ddd;font-family:Roboto Mono,monospace;font-size:12px;font-weight:500}.stat-value-muted[data-v-b2f461ff]{color:#999;margin-left:4px;font-size:11px}.stat-subtext[data-v-b2f461ff]{color:#8a8aa8;font-size:11px}.usage-breakdown[data-v-b2f461ff]{background:#2a2a4f;border:1px solid #3b3b61;border-radius:999px;width:100%;height:8px;display:flex;overflow:hidden}.usage-breakdown-input[data-v-b2f461ff]{background:linear-gradient(90deg,#6d76ff 0%,#8f96ff 100%);height:100%}.usage-breakdown-output[data-v-b2f461ff]{background:linear-gradient(90deg,#7f6bff 0%,#a598ff 100%);height:100%}.stat-value-ellipsis[data-v-b2f461ff]{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.stat-section[data-v-b2f461ff]{justify-content:space-between;align-items:center;display:flex}.subagents-panel[data-v-81ad2481]{overflow-y:auto}.subagent-item[data-v-81ad2481]{background:#1e1e3a;border:1px solid #2a2a4a}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility-tree:not(.debug) ::-moz-selection{color:#0000}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:-moz-fit-content;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.tools-panel[data-v-b6669c42]{min-height:48px}.workspace-list[data-v-5d93447b]{background-color:#16162a;overflow-x:hidden}.wl-search[data-v-5d93447b]{background-color:#224;padding:0 8px}.wl-search[data-v-5d93447b] .q-field__control{height:32px}.wl-search[data-v-5d93447b] input{color:#ccc;font-size:12px}.wl-group-header[data-v-5d93447b]:hover{background-color:#ffffff08}.wl-project-group+.wl-project-group[data-v-5d93447b]{margin-top:6px}.wl-project-label[data-v-5d93447b]{align-items:center;padding-bottom:2px;font-size:11px;display:flex}.wl-item[data-v-5d93447b]{background-color:#224;margin-bottom:4px;transition:background-color .15s;position:relative}.wl-item[data-v-5d93447b]:last-child{margin-bottom:0}.wl-item[data-v-5d93447b]:hover{background-color:#2a2a4a}.wl-item--selected[data-v-5d93447b]{background-color:#2a2a4a;outline:1px solid #6c63ff66}.wl-item-action[data-v-5d93447b]{position:absolute;top:4px;right:4px}.wl-item--archived .wl-item-action[data-v-5d93447b]{opacity:0;transition:opacity .15s}.wl-item--archived:hover .wl-item-action[data-v-5d93447b]{opacity:1}.wl-item-unarchive[data-v-5d93447b]{right:28px}.wl-item-delete[data-v-5d93447b]{right:4px}.wl-item--archived[data-v-5d93447b]{opacity:.6;background-color:#1a1a30}.wl-item--archived[data-v-5d93447b]:hover{opacity:.85}.wl-item--archived.wl-item--selected[data-v-5d93447b]{opacity:1}.dd-dot[data-v-5d93447b]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.dd-dot--running[data-v-5d93447b]{background-color:#22c55e;box-shadow:0 0 4px #22c55e80}.bg-dark[data-v-a47eb368]{background-color:#16162a!important;border-color:#2a2a4a!important}.resize-handle[data-v-a47eb368]{cursor:col-resize;z-index:10;width:4px;height:100%;transition:background-color .15s;position:absolute;top:0;right:-2px}.resize-handle[data-v-a47eb368]:hover,.resize-handle[data-v-a47eb368]:active{background-color:#6c63ff80}.vertical-resize-handle[data-v-a47eb368]{cursor:row-resize;background-color:#2a2a4a;height:4px;transition:background-color .15s}.vertical-resize-handle[data-v-a47eb368]:hover,.vertical-resize-handle[data-v-a47eb368]:active{background-color:#6c63ff80}
|