@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.
Files changed (80) hide show
  1. package/README.md +1 -1
  2. package/dist/server/db/migrations.js +7 -0
  3. package/dist/server/db/schema.js +2 -1
  4. package/dist/server/index.js +2 -2
  5. package/dist/server/routes/workspaces.js +22 -5
  6. package/dist/server/services/agent-manager.js +4 -1
  7. package/dist/server/services/settings-service.js +42 -8
  8. package/dist/server/services/workspace-service.js +16 -3
  9. package/dist/server/services/worktree-service.js +3 -2
  10. package/dist/server/utils/git-ops.js +14 -0
  11. package/dist/server/utils/paths.js +20 -0
  12. package/package.json +3 -3
  13. package/src/client/dist/spa/assets/ActivityFeed-BScp_ie9.js +10 -0
  14. package/src/client/dist/spa/assets/{ClosePopup-jSuaV6dg.js → ClosePopup-BfANRQ7n.js} +1 -1
  15. package/src/client/dist/spa/assets/CreatePage-Cam6EJCg.js +2 -0
  16. package/src/client/dist/spa/assets/CreatePage-Cy1V2bdx.css +1 -0
  17. package/src/client/dist/spa/assets/DiffViewer-DMa0FFUV.js +2 -0
  18. package/src/client/dist/spa/assets/MainLayout-1KXWlMYS.css +1 -0
  19. package/src/client/dist/spa/assets/{MainLayout-liO7poC9.js → MainLayout-DB5sQk0j.js} +17 -17
  20. package/src/client/dist/spa/assets/{QBadge-xNMZEqT-.js → QBadge-DENdn6Dv.js} +1 -1
  21. package/src/client/dist/spa/assets/QExpansionItem-BBe4EJ8c.js +1 -0
  22. package/src/client/dist/spa/assets/{QList-B7DWhM2q.js → QList-DJTvuGop.js} +1 -1
  23. package/src/client/dist/spa/assets/QMenu-DnNUsPHb.js +1 -0
  24. package/src/client/dist/spa/assets/{QSpinnerDots-FJCnAvfw.js → QSpinnerDots-DytntAbf.js} +1 -1
  25. package/src/client/dist/spa/assets/SettingsPage-BedYmy7N.js +1 -0
  26. package/src/client/dist/spa/assets/SettingsPage-oWZ8sGFm.css +1 -0
  27. package/src/client/dist/spa/assets/{TouchPan-DuISf80E.js → TouchPan-D_gmnARo.js} +1 -1
  28. package/src/client/dist/spa/assets/WorkspacePage-Ck8G2Lhl.css +1 -0
  29. package/src/client/dist/spa/assets/WorkspacePage-DcVj7f0F.js +4 -0
  30. package/src/client/dist/spa/assets/{_plugin-vue_export-helper-fkfRoKj2.js → _plugin-vue_export-helper-DkL3SKZ8.js} +1 -1
  31. package/src/client/dist/spa/assets/{cssMode-DiBSKuoC.js → cssMode-TmSd3FtN.js} +1 -1
  32. package/src/client/dist/spa/assets/{editor.api-hOnUFdOA.js → editor.api-BYoDPXci.js} +1 -1
  33. package/src/client/dist/spa/assets/{editor.main-DNa8GpeG.js → editor.main-D2_WTVNi.js} +3 -3
  34. package/src/client/dist/spa/assets/{formatters-B5Igo0Lf.js → formatters-hnFdqDO2.js} +1 -1
  35. package/src/client/dist/spa/assets/{freemarker2-Dj7P1Jpi.js → freemarker2-BK0cJTj4.js} +1 -1
  36. package/src/client/dist/spa/assets/{handlebars-DEMCvy8L.js → handlebars-BT6xKkcN.js} +1 -1
  37. package/src/client/dist/spa/assets/{html-CPhzMOby.js → html-G6AG34m0.js} +1 -1
  38. package/src/client/dist/spa/assets/{htmlMode-DneB4Mlv.js → htmlMode-Cal36mmb.js} +1 -1
  39. package/src/client/dist/spa/assets/i18n-ByuXBoTq.js +1 -0
  40. package/src/client/dist/spa/assets/i18n-DyD-u9TB.js +1 -0
  41. package/src/client/dist/spa/assets/index-C9F8lzbI.js +5 -0
  42. package/src/client/dist/spa/assets/{javascript-xA20aQhN.js → javascript-B-6wB4JQ.js} +1 -1
  43. package/src/client/dist/spa/assets/{jsonMode-DB1q7_RO.js → jsonMode-CT4pwl6t.js} +1 -1
  44. package/src/client/dist/spa/assets/{liquid-DUaXf8Ca.js → liquid-BneTrBrq.js} +1 -1
  45. package/src/client/dist/spa/assets/{marked.esm-hG3KqOZk.js → marked.esm-C01v3JRg.js} +1 -1
  46. package/src/client/dist/spa/assets/{mdx-DhSPjkRN.js → mdx-ByZYBp9K.js} +1 -1
  47. package/src/client/dist/spa/assets/models-C4seT9_L.js +1 -0
  48. package/src/client/dist/spa/assets/{monaco.contribution-BRz6c5Oe.js → monaco.contribution-B2_1EuRF.js} +2 -2
  49. package/src/client/dist/spa/assets/{private.use-form-1cZLVjGN.js → private.use-form-BWfHn8G9.js} +1 -1
  50. package/src/client/dist/spa/assets/{python-Cf6SIZRF.js → python-CqrolrIy.js} +1 -1
  51. package/src/client/dist/spa/assets/{razor-N0lXOpYt.js → razor-CPg4dghH.js} +1 -1
  52. package/src/client/dist/spa/assets/scroll-CHtHNzvE.js +1 -0
  53. package/src/client/dist/spa/assets/settings-DNNmyYf-.js +1 -0
  54. package/src/client/dist/spa/assets/touch-5Jv2Ep3F.js +1 -0
  55. package/src/client/dist/spa/assets/{tsMode-rGOAcVzO.js → tsMode-CRHW8cKK.js} +1 -1
  56. package/src/client/dist/spa/assets/{typescript-BDFRwi4p.js → typescript-D2lNktM6.js} +1 -1
  57. package/src/client/dist/spa/assets/{use-checkbox-DwkIkUAc.js → use-checkbox-By4PLtaB.js} +1 -1
  58. package/src/client/dist/spa/assets/vue-i18n-CFW7O-jl.js +3 -0
  59. package/src/client/dist/spa/assets/{xml-Bu77_PI9.js → xml-C-qye9BU.js} +1 -1
  60. package/src/client/dist/spa/assets/{yaml-wD3nav-2.js → yaml-DujvOKOb.js} +1 -1
  61. package/src/client/dist/spa/index.html +7 -7
  62. package/src/client/dist/spa/assets/ActivityFeed-DwLZQtds.js +0 -10
  63. package/src/client/dist/spa/assets/CreatePage-DnV87-Ej.js +0 -2
  64. package/src/client/dist/spa/assets/CreatePage-y7wOGccu.css +0 -1
  65. package/src/client/dist/spa/assets/DiffViewer-DGMt53xq.js +0 -2
  66. package/src/client/dist/spa/assets/MainLayout-DH5FgF9v.css +0 -1
  67. package/src/client/dist/spa/assets/QExpansionItem-DG5mKIcR.js +0 -1
  68. package/src/client/dist/spa/assets/QMenu-hku3VAGZ.js +0 -1
  69. package/src/client/dist/spa/assets/QPage-BhzgHYFd.js +0 -1
  70. package/src/client/dist/spa/assets/SettingsPage-C26BwQT7.css +0 -1
  71. package/src/client/dist/spa/assets/SettingsPage-LzfsgdZ9.js +0 -1
  72. package/src/client/dist/spa/assets/WorkspacePage-BIYgMXby.css +0 -1
  73. package/src/client/dist/spa/assets/WorkspacePage-BaOtXfiF.js +0 -4
  74. package/src/client/dist/spa/assets/i18n-BYjjZp-H.js +0 -1
  75. package/src/client/dist/spa/assets/i18n-Dho6KmW_.js +0 -1
  76. package/src/client/dist/spa/assets/index-CFlp44pN.js +0 -5
  77. package/src/client/dist/spa/assets/scroll-CWjBCoBR.js +0 -1
  78. package/src/client/dist/spa/assets/settings-CrHkitxT.js +0 -1
  79. package/src/client/dist/spa/assets/touch-Bojc73iM.js +0 -1
  80. 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 `3000` (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.
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;
@@ -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-6',
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,
@@ -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 && body.model === undefined && body.permissionMode === undefined && body.name === undefined) {
776
- return c.json({ error: 'Missing field: status, model, permissionMode, or name' }, 400);
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
- let settingsFilePath = getSettingsPath();
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: 'auto',
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
- // If migrations bumped the version, persist the upgraded settings so the
231
- // next process doesn't re-run them on every load.
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 writeSettings(settings) {
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-6', data.permissionMode ?? 'auto-accept', now, now);
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
- // Try creating a new branch + worktree
50
- git(projectPath, ['worktree', 'add', '-b', branchName, worktreePath, sourceBranch]);
49
+ // Use origin/<sourceBranch> as the base so the worktree starts from the
50
+ // freshly-fetched remote ref (fetchSourceBranch is always called first).
51
+ git(projectPath, ['worktree', 'add', '-b', branchName, worktreePath, `origin/${sourceBranch}`]);
51
52
  }
52
53
  catch (err) {
53
54
  const message = err instanceof Error ? err.message : String(err);
@@ -109,6 +109,20 @@ export function pushBranch(repoPath, branchName, remote = 'origin') {
109
109
  throw new Error(`Failed to push branch '${branchName}' to '${remote}': ${message}`);
110
110
  }
111
111
  }
112
+ /**
113
+ * Fetch a single branch from the remote. Throws if the fetch fails (no remote,
114
+ * branch absent on remote, network error, etc.). Call this before creating a
115
+ * worktree to ensure `origin/<sourceBranch>` is up to date.
116
+ */
117
+ export function fetchSourceBranch(repoPath, sourceBranch, remote = 'origin') {
118
+ try {
119
+ git(repoPath, ['fetch', remote, sourceBranch]);
120
+ }
121
+ catch (err) {
122
+ const message = err instanceof Error ? err.message : String(err);
123
+ throw new Error(`Failed to fetch '${sourceBranch}' from '${remote}': ${message}`);
124
+ }
125
+ }
112
126
  /** Pull the current branch from the remote using fast-forward only. */
113
127
  export function pullBranch(repoPath, branchName, remote = 'origin') {
114
128
  try {
@@ -20,6 +20,15 @@ const packageRoot = path.resolve(selfDir, '..', '..', '..');
20
20
  export function getPackageAssetPath(...parts) {
21
21
  return path.join(packageRoot, ...parts);
22
22
  }
23
+ // Dev-mode protection: when this module is loaded from its TypeScript source
24
+ // (i.e. via tsx/ts-node during development), automatically enforce the local
25
+ // data directory so production settings in ~/.config/kobo are never touched.
26
+ // Bypassed in Vitest (VITEST env var) so unit tests can exercise all paths.
27
+ let _devModeProtection = fileURLToPath(import.meta.url).endsWith('.ts') && !process.env.VITEST;
28
+ /** Override the dev-mode protection flag. Used by tests only. */
29
+ export function _setDevModeProtection(value) {
30
+ _devModeProtection = value;
31
+ }
23
32
  /**
24
33
  * Resolves the Kōbō home directory for user data (DB, settings). Respects
25
34
  * KOBO_HOME when set, otherwise defaults to an XDG-compliant location under
@@ -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.4",
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-CWjBCoBR.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};
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}