@loicngr/kobo 1.7.19 → 1.7.21

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 (60) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/server/db/migrations.js +20 -0
  3. package/dist/server/db/schema.js +2 -0
  4. package/dist/server/index.js +9 -10
  5. package/dist/server/routes/workspaces.js +90 -3
  6. package/dist/server/services/pr-watcher-service.js +55 -34
  7. package/dist/server/services/settings-service.js +13 -0
  8. package/dist/server/services/workspace-service.js +12 -0
  9. package/package.json +1 -1
  10. package/src/client/dist/spa/assets/{ActivityFeed-4FmMcUzT.js → ActivityFeed-Ls7gPKuZ.js} +1 -1
  11. package/src/client/dist/spa/assets/{ChangelogPage-BTIcoTHM.js → ChangelogPage-CSRgAStv.js} +1 -1
  12. package/src/client/dist/spa/assets/{ClosePopup-cTUqStmn.js → ClosePopup-BG4U_b73.js} +1 -1
  13. package/src/client/dist/spa/assets/{CreatePage-DNaNhVRI.js → CreatePage-BBXfUL4a.js} +1 -1
  14. package/src/client/dist/spa/assets/{DiffViewer-CyQ3xZ9y.js → DiffViewer-DRxZ_K8m.js} +3 -3
  15. package/src/client/dist/spa/assets/{HealthPage-DeVdQ57j.js → HealthPage-96pm0R5c.js} +1 -1
  16. package/src/client/dist/spa/assets/MainLayout-BfQZxnxp.js +37 -0
  17. package/src/client/dist/spa/assets/{MainLayout-Cq4nlTx3.css → MainLayout-BxbC5qfx.css} +1 -1
  18. package/src/client/dist/spa/assets/{QExpansionItem-DEwaFJ-l.js → QExpansionItem-C3koMJhv.js} +1 -1
  19. package/src/client/dist/spa/assets/{QMenu-DqPMRjtc.js → QMenu-tPOTRRE_.js} +1 -1
  20. package/src/client/dist/spa/assets/{QScrollArea-BRZX618r.js → QScrollArea-HmkWoNcD.js} +1 -1
  21. package/src/client/dist/spa/assets/{QScrollObserver-B-U-JUNE.js → QScrollObserver-mISyeTiK.js} +1 -1
  22. package/src/client/dist/spa/assets/{QTooltip-CayfN3AV.js → QTooltip-CxkTFl9W.js} +1 -1
  23. package/src/client/dist/spa/assets/{SearchPage-CoStu9JM.js → SearchPage-DRZZXBej.js} +1 -1
  24. package/src/client/dist/spa/assets/SettingsPage-7GcC2IYi.js +9 -0
  25. package/src/client/dist/spa/assets/{SettingsPage-DV10Se1K.css → SettingsPage-D6AWEFEO.css} +1 -1
  26. package/src/client/dist/spa/assets/{TouchPan-CPNDMpOw.js → TouchPan-DWCVQZB9.js} +1 -1
  27. package/src/client/dist/spa/assets/{WorkspacePage-BWMcLN6l.js → WorkspacePage-Bclc0zJ-.js} +3 -3
  28. package/src/client/dist/spa/assets/{build-path-tree-C-c8LVcf.js → build-path-tree-CWS7OK1y.js} +1 -1
  29. package/src/client/dist/spa/assets/{cssMode-iA5eJq1h.js → cssMode-Bnh_9uhY.js} +1 -1
  30. package/src/client/dist/spa/assets/{editor.api-B85Aec2m.js → editor.api-DgWWfCkJ.js} +1 -1
  31. package/src/client/dist/spa/assets/{editor.main-D55xuhHL.js → editor.main-BKfeDnR3.js} +3 -3
  32. package/src/client/dist/spa/assets/{engineFeatures-BIgXMO3j.js → engineFeatures-DyLw36-5.js} +1 -1
  33. package/src/client/dist/spa/assets/{expand-template-B3Mua3eb.js → expand-template-ct-WAfuX.js} +1 -1
  34. package/src/client/dist/spa/assets/{freemarker2-D_SY8XAy.js → freemarker2-9RGddRAW.js} +1 -1
  35. package/src/client/dist/spa/assets/{handlebars-DYHJKLiX.js → handlebars-DT7lkiQM.js} +1 -1
  36. package/src/client/dist/spa/assets/{html-CBV84hsj.js → html-Bz175T2Z.js} +1 -1
  37. package/src/client/dist/spa/assets/{htmlMode-oAFa-pC8.js → htmlMode-DbtESN9R.js} +1 -1
  38. package/src/client/dist/spa/assets/i18n-wamOif7U.js +1 -0
  39. package/src/client/dist/spa/assets/index-CSvMoCLw.js +52 -0
  40. package/src/client/dist/spa/assets/{javascript-Dtki-9M1.js → javascript-BN2stm7K.js} +1 -1
  41. package/src/client/dist/spa/assets/{jsonMode-Dxgt3z_U.js → jsonMode-BYnYwZjI.js} +1 -1
  42. package/src/client/dist/spa/assets/{kobo-commands-ItyV88dT.js → kobo-commands-CvhobBu_.js} +1 -1
  43. package/src/client/dist/spa/assets/{liquid-AqH0N0cI.js → liquid-BE5VjF4C.js} +1 -1
  44. package/src/client/dist/spa/assets/{mdx-B2rkMIhO.js → mdx-DlXCpLNd.js} +1 -1
  45. package/src/client/dist/spa/assets/{monaco.contribution-fnrc8bv7.js → monaco.contribution-sw1lpzQF.js} +2 -2
  46. package/src/client/dist/spa/assets/{notifications-BmNlCl7A.js → notifications-Dq_CVZlr.js} +1 -1
  47. package/src/client/dist/spa/assets/{permissionModes-B2nlp6IT.js → permissionModes-CpgAOu0t.js} +1 -1
  48. package/src/client/dist/spa/assets/{python-DoQszzJj.js → python-Cg5ykpp-.js} +1 -1
  49. package/src/client/dist/spa/assets/{razor-CLSwglaW.js → razor-B_Mvy9yr.js} +1 -1
  50. package/src/client/dist/spa/assets/{render-chat-markdown-B3NEX5ju.js → render-chat-markdown-Cj_76hJe.js} +1 -1
  51. package/src/client/dist/spa/assets/{tsMode-CshiJr76.js → tsMode-DR8dS8qY.js} +1 -1
  52. package/src/client/dist/spa/assets/{typescript-CCaWpP5V.js → typescript-T68E_JG-.js} +1 -1
  53. package/src/client/dist/spa/assets/{use-onboarding-DxlBVNno.js → use-onboarding-Dz9n2QJO.js} +1 -1
  54. package/src/client/dist/spa/assets/{xml-WKm1dO8L.js → xml-DTS60gpD.js} +1 -1
  55. package/src/client/dist/spa/assets/{yaml-CSs38mRE.js → yaml-BhwqvEe2.js} +1 -1
  56. package/src/client/dist/spa/index.html +2 -2
  57. package/src/client/dist/spa/assets/MainLayout-Dbh8sZj9.js +0 -37
  58. package/src/client/dist/spa/assets/SettingsPage-BGHYXEmO.js +0 -9
  59. package/src/client/dist/spa/assets/i18n-BSaDh2Jk.js +0 -1
  60. package/src/client/dist/spa/assets/index-Dxua-s9Z.js +0 -52
package/CHANGELOG.md CHANGED
@@ -4,6 +4,17 @@ All notable changes to Kōbō are documented here. The format is based on
4
4
  [Keep a Changelog](https://keepachangelog.com/). Each release is an `## <version>`
5
5
  section — the in-app "What's new" dialog reads this file.
6
6
 
7
+ ## 1.7.21
8
+
9
+ - feat: assorted workspace polish and PR-watcher reliability
10
+ - feat: open worktree in the user's file manager
11
+ - fix(client): make archived workspace cards clickable
12
+
13
+ ## 1.7.20
14
+
15
+ - feat: open worktree in the user's file manager
16
+ - fix(client): make archived workspace cards clickable
17
+
7
18
  ## 1.7.19
8
19
 
9
20
  - feat(client): archived banner, Fix-CI button, changelog page, prompt-retry banner (Open archived workspace)
@@ -319,6 +319,26 @@ export const migrations = [
319
319
  }
320
320
  },
321
321
  },
322
+ {
323
+ version: 26,
324
+ name: 'add-pr-attention-dismiss',
325
+ migrate: (db) => {
326
+ // Per-workspace "I've seen this" snapshot for the PR attention badges
327
+ // (changes-requested + CI failure). Stores the pr.updatedAt at the
328
+ // moment the user clicked "Marquer comme vu". The badge stays hidden
329
+ // until a fresher pr.updatedAt is observed by the watcher.
330
+ const table = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='workspaces'").get();
331
+ if (!table)
332
+ return;
333
+ const cols = db.prepare('PRAGMA table_info(workspaces)').all();
334
+ if (!cols.some((c) => c.name === 'pr_changes_dismissed_at')) {
335
+ db.prepare('ALTER TABLE workspaces ADD COLUMN pr_changes_dismissed_at TEXT').run();
336
+ }
337
+ if (!cols.some((c) => c.name === 'pr_ci_failure_dismissed_at')) {
338
+ db.prepare('ALTER TABLE workspaces ADD COLUMN pr_ci_failure_dismissed_at TEXT').run();
339
+ }
340
+ },
341
+ },
322
342
  ];
323
343
  /** Current schema version — always equals the highest migration version. */
324
344
  export const SCHEMA_VERSION = migrations.length > 0 ? migrations[migrations.length - 1].version : 1;
@@ -30,6 +30,8 @@ export function initSchema(db) {
30
30
  description TEXT,
31
31
  agent_description TEXT,
32
32
  initial_prompt TEXT,
33
+ pr_changes_dismissed_at TEXT,
34
+ pr_ci_failure_dismissed_at TEXT,
33
35
  created_at TEXT NOT NULL,
34
36
  updated_at TEXT NOT NULL
35
37
  );
@@ -257,18 +257,17 @@ terminalWss.on('connection', (ws, workspaceId) => {
257
257
  setMessageHandler((type, payload) => {
258
258
  const p = payload;
259
259
  if (type === 'chat:message' && p?.workspaceId && p?.content) {
260
- // Auto-loop owns the agent's turns a stray user message would land in
261
- // the middle of an iteration (or in a freshly spawned next one) and break
262
- // the deterministic loop contract. Reject server-side so direct WS clients
263
- // can't bypass the frontend's input lock. Grooming phase (ready=0) is
264
- // skipped the user must stay free to answer the agent's questions.
260
+ // Auto-loop owns the agent's turns. A user message means the user wants
261
+ // to redirect the conversation, so disable the loop (idempotent the
262
+ // `autoloop:disabled` event is emitted with reason='user-action' so the
263
+ // frontend chip updates) and let the message through to the running
264
+ // session. The user can re-enable auto-loop manually once their
265
+ // intervention is done. Grooming phase (ready=0) is skipped — the loop
266
+ // hasn't started yet, so chat messages during grooming pass through
267
+ // untouched (the user can still answer the agent's questions).
265
268
  const autoLoopStatus = autoLoopService.getStatus(p.workspaceId);
266
269
  if (autoLoopStatus.auto_loop && autoLoopStatus.auto_loop_ready) {
267
- emitEphemeral(p.workspaceId, 'chat:rejected', {
268
- reason: 'auto-loop-active',
269
- message: 'Auto-loop is running — disable it before sending a message',
270
- });
271
- return;
270
+ autoLoopService.disable(p.workspaceId, 'user-action');
272
271
  }
273
272
  // Reject chat input while paused on canUseTool — sending here would spawn
274
273
  // a parallel session and orphan the pending callback.
@@ -1778,6 +1778,60 @@ app.post('/:id/open-editor', (c) => {
1778
1778
  return c.json({ error: message }, 500);
1779
1779
  }
1780
1780
  });
1781
+ /** Open the workspace worktree in the user's configured file manager. */
1782
+ app.post('/:id/open-file-manager', async (c) => {
1783
+ try {
1784
+ const id = c.req.param('id');
1785
+ const workspace = workspaceService.getWorkspace(id);
1786
+ if (!workspace)
1787
+ return c.json({ error: `Workspace '${id}' not found` }, 404);
1788
+ const globalSettings = settingsService.getGlobalSettings();
1789
+ if (!globalSettings.fileManagerCommand) {
1790
+ return c.json({ error: 'No file manager command configured' }, 400);
1791
+ }
1792
+ const worktreePath = workspace.worktreePath;
1793
+ if (!fs.existsSync(worktreePath)) {
1794
+ return c.json({ error: `Worktree path does not exist: ${worktreePath}` }, 400);
1795
+ }
1796
+ // Spawn + await either 'spawn' (process started OK → detach and respond)
1797
+ // or 'error' (ENOENT, permission denied → fail synchronously with a
1798
+ // clear 400 so the client toast shows a useful message instead of a
1799
+ // silent server log).
1800
+ try {
1801
+ await waitForSpawn(globalSettings.fileManagerCommand, [worktreePath]);
1802
+ }
1803
+ catch (err) {
1804
+ const msg = err instanceof Error ? err.message : String(err);
1805
+ return c.json({ error: `Failed to launch '${globalSettings.fileManagerCommand}': ${msg}` }, 400);
1806
+ }
1807
+ return c.json({ success: true });
1808
+ }
1809
+ catch (err) {
1810
+ const message = err instanceof Error ? err.message : String(err);
1811
+ return c.json({ error: message }, 500);
1812
+ }
1813
+ });
1814
+ /** Spawn a detached process and resolve as soon as it has started (or reject
1815
+ * on launch failure). Caller doesn't await process completion. */
1816
+ function waitForSpawn(command, args) {
1817
+ return new Promise((resolve, reject) => {
1818
+ const child = spawn(command, args, { detached: true, stdio: 'ignore' });
1819
+ let settled = false;
1820
+ child.once('spawn', () => {
1821
+ if (settled)
1822
+ return;
1823
+ settled = true;
1824
+ child.unref();
1825
+ resolve();
1826
+ });
1827
+ child.once('error', (err) => {
1828
+ if (settled)
1829
+ return;
1830
+ settled = true;
1831
+ reject(err);
1832
+ });
1833
+ });
1834
+ }
1781
1835
  /** Re-run the project setup script in the workspace worktree. */
1782
1836
  app.post('/:id/run-setup-script', async (c) => {
1783
1837
  try {
@@ -2638,12 +2692,12 @@ app.post('/:id/change-pr-base', async (c) => {
2638
2692
  });
2639
2693
  /** Re-target a workspace onto a new source branch (metadata + worktree + PR base). */
2640
2694
  app.post('/:id/change-source-branch', async (c) => {
2695
+ const id = c.req.param('id');
2696
+ const workspace = workspaceService.getWorkspace(id);
2641
2697
  try {
2642
- const id = c.req.param('id');
2643
2698
  const body = await c.req.json();
2644
2699
  if (!body.newBase)
2645
2700
  return c.json({ error: 'Missing newBase parameter' }, 400);
2646
- const workspace = workspaceService.getWorkspace(id);
2647
2701
  if (!workspace)
2648
2702
  return c.json({ error: `Workspace '${id}' not found` }, 404);
2649
2703
  const result = await changeSourceBranch(id, body.newBase);
@@ -2663,7 +2717,10 @@ app.post('/:id/change-source-branch', async (c) => {
2663
2717
  if (/does not exist|already '|is required/i.test(message)) {
2664
2718
  return c.json({ error: message }, 400);
2665
2719
  }
2666
- return c.json({ error: message }, 500);
2720
+ // A custom script (or the built-in reconstruct) may have left a partial
2721
+ // git operation behind — surface it so the UI can offer a one-click abort.
2722
+ const ongoingOperation = workspace ? gitOps.getOngoingGitOperation(workspace.worktreePath) : null;
2723
+ return c.json({ error: message, ongoingOperation }, 500);
2667
2724
  }
2668
2725
  });
2669
2726
  /** Cancel an in-flight source-branch change: abort the cherry-pick, restore the
@@ -3007,6 +3064,36 @@ app.post('/:id/start-ci-fix', migrationGuard, async (c) => {
3007
3064
  return c.json({ error: message }, 500);
3008
3065
  }
3009
3066
  });
3067
+ /**
3068
+ * POST /api/workspaces/:id/dismiss-pr-attention — record the user's
3069
+ * "I've seen this" on the changes-requested or CI-failure badge. The
3070
+ * badge stays hidden until the pr-watcher observes a fresher pr.updatedAt.
3071
+ */
3072
+ app.post('/:id/dismiss-pr-attention', async (c) => {
3073
+ try {
3074
+ const id = c.req.param('id');
3075
+ const workspace = workspaceService.getWorkspace(id);
3076
+ if (!workspace) {
3077
+ return c.json({ error: `Workspace '${id}' not found` }, 404);
3078
+ }
3079
+ const body = await c.req.json().catch(() => ({}));
3080
+ const kind = body.kind === 'changes-requested' || body.kind === 'ci-failed' ? body.kind : null;
3081
+ if (!kind) {
3082
+ return c.json({ error: "Field 'kind' must be 'changes-requested' or 'ci-failed'" }, 400);
3083
+ }
3084
+ const prUpdatedAt = typeof body.prUpdatedAt === 'string' ? body.prUpdatedAt : null;
3085
+ if (!prUpdatedAt) {
3086
+ return c.json({ error: "Field 'prUpdatedAt' (ISO timestamp) is required" }, 400);
3087
+ }
3088
+ workspaceService.dismissPrAttention(id, kind, prUpdatedAt);
3089
+ wsService.emitEphemeral(id, 'workspace:pr-attention-dismissed', { kind, prUpdatedAt });
3090
+ return c.json({ success: true });
3091
+ }
3092
+ catch (err) {
3093
+ const message = err instanceof Error ? err.message : String(err);
3094
+ return c.json({ error: message }, 500);
3095
+ }
3096
+ });
3010
3097
  /** POST /api/workspaces/:id/mark-read — mark workspace as read (clear unread indicator). */
3011
3098
  app.post('/:id/mark-read', (c) => {
3012
3099
  try {
@@ -79,6 +79,29 @@ export async function checkPrStatuses() {
79
79
  for (const ws of workspaces) {
80
80
  try {
81
81
  const pr = await getForgeProvider(resolveForge(ws.projectPath)).getPrStatus(ws.worktreePath, ws.workingBranch);
82
+ // Detect a PR base change BEFORE computing git stats so the new base
83
+ // is used in commitCount / behindCount / diffStats. Otherwise the
84
+ // user keeps seeing stale ahead/behind counts vs the OLD base until
85
+ // the next tick (30s later) — when the user re-targeted the PR via
86
+ // `gh pr edit --base …`, the lag was painful and confusing.
87
+ let baseTransitionedFrom = null;
88
+ if (pr?.state === 'OPEN' && pr.base) {
89
+ const prevBase = lastKnownPr.get(ws.id)?.base ?? ws.sourceBranch;
90
+ if (prevBase !== pr.base) {
91
+ try {
92
+ updateWorkspaceSourceBranch(ws.id, pr.base);
93
+ ws.sourceBranch = pr.base;
94
+ baseTransitionedFrom = prevBase;
95
+ console.log(`[pr-watcher] PR base changed for workspace '${ws.name}': ${prevBase} → ${pr.base}`);
96
+ }
97
+ catch (err) {
98
+ console.error(`[pr-watcher] updateWorkspaceSourceBranch failed for '${ws.name}':`, err instanceof Error ? err.message : err);
99
+ // Leave the cache untouched so the next tick retries — and skip
100
+ // stats too, since they'd be computed against the stale base.
101
+ continue;
102
+ }
103
+ }
104
+ }
82
105
  // Git stats — best-effort, cached independently of the PR-transition
83
106
  // logic below. Its own try/catch so a git failure neither skips PR
84
107
  // transitions nor poisons other workspaces.
@@ -155,46 +178,26 @@ export async function checkPrStatuses() {
155
178
  markUnread(ws.id);
156
179
  }
157
180
  }
158
- // Base-branch change detection. Only relevant for OPEN PRs closed/
159
- // merged PRs don't accept base changes. Skip if the GitHub response
160
- // didn't include a baseRefName (defensive against malformed data).
181
+ // Cache the snapshot for the next tick. For non-OPEN PRs (closed /
182
+ // merged) we preserve the previous `base` if the fresh snapshot is
183
+ // missing one keeps the OPEN→CLOSED/MERGED archiving logic stable.
161
184
  if (pr.state !== 'OPEN' || !pr.base) {
162
- // Still update the cache for the state — keeps the OPEN→CLOSED/MERGED
163
- // archiving logic working on the next tick. Preserve the previous
164
- // `base` if the fresh snapshot is missing one (defensive).
165
185
  const next = pr.base ? pr : { ...pr, base: prev?.base ?? pr.base };
166
186
  lastKnownPr.set(ws.id, next);
167
187
  continue;
168
188
  }
169
- // Comparison baseline:
170
- // - If we've seen this workspace before, use the previous `base`.
171
- // - Otherwise (first sight after boot/unarchive), compare with the
172
- // `sourceBranch` recorded in the database — that catches base changes
173
- // that happened while Kobo was offline.
174
- const previousBase = prev?.base ?? ws.sourceBranch;
175
- if (previousBase === pr.base) {
176
- // No-op path: still record the snapshot so subsequent ticks have a baseline.
177
- lastKnownPr.set(ws.id, pr);
178
- continue;
179
- }
180
- console.log(`[pr-watcher] PR base changed for workspace '${ws.name}': ${previousBase} → ${pr.base}`);
181
- try {
182
- updateWorkspaceSourceBranch(ws.id, pr.base);
183
- }
184
- catch (err) {
185
- console.error(`[pr-watcher] updateWorkspaceSourceBranch failed for '${ws.name}':`, err instanceof Error ? err.message : err);
186
- // Don't poison the cache: leave the previous entry (or absence) so
187
- // the next tick retries the detection.
188
- continue;
189
- }
190
- // Both the persistence and the emit are part of "we successfully
191
- // observed a base change" — only NOW commit the new state to the cache.
192
189
  lastKnownPr.set(ws.id, pr);
193
- emitEphemeral(ws.id, 'pr:base-changed', {
194
- oldBase: previousBase,
195
- newBase: pr.base,
196
- prUrl: pr.url,
197
- });
190
+ // Emit the base-change event AFTER the snapshot is committed so a
191
+ // sync:response replay on reconnect sees a consistent state. The
192
+ // DB update + ws.sourceBranch mutation already happened above
193
+ // (before computeGitStats).
194
+ if (baseTransitionedFrom !== null) {
195
+ emitEphemeral(ws.id, 'pr:base-changed', {
196
+ oldBase: baseTransitionedFrom,
197
+ newBase: pr.base,
198
+ prUrl: pr.url,
199
+ });
200
+ }
198
201
  }
199
202
  catch (err) {
200
203
  console.error(`[pr-watcher] Failed to check PR for workspace '${ws.name}':`, err instanceof Error ? err.message : err);
@@ -219,6 +222,24 @@ export async function refreshPrSnapshot(workspaceId) {
219
222
  lastKnownPr.delete(workspaceId);
220
223
  return null;
221
224
  }
225
+ // Mirror the watcher's base-change detection so a manual refresh fixes a
226
+ // stale `sourceBranch` (typical scenario: user ran `gh pr edit --base …`
227
+ // and clicks the GitPanel refresh button instead of waiting for the next
228
+ // 30s tick). Best-effort: a DB write failure here leaves the snapshot
229
+ // cached but the metadata stale — the watcher will retry on its own.
230
+ if (snap.state === 'OPEN' && snap.base && snap.base !== ws.sourceBranch) {
231
+ try {
232
+ updateWorkspaceSourceBranch(workspaceId, snap.base);
233
+ emitEphemeral(workspaceId, 'pr:base-changed', {
234
+ oldBase: ws.sourceBranch,
235
+ newBase: snap.base,
236
+ prUrl: snap.url,
237
+ });
238
+ }
239
+ catch (err) {
240
+ console.error(`[pr-watcher] updateWorkspaceSourceBranch (refresh) failed for '${ws.name}':`, err instanceof Error ? err.message : err);
241
+ }
242
+ }
222
243
  lastKnownPr.set(workspaceId, snap);
223
244
  return snap;
224
245
  }
@@ -587,6 +587,17 @@ const settingsMigrations = [
587
587
  }
588
588
  },
589
589
  },
590
+ {
591
+ version: 35,
592
+ name: 'add-file-manager-command',
593
+ migrate: ({ global }) => {
594
+ // Empty by default — the "Open in file manager" button only shows
595
+ // when the user explicitly fills it (`xdg-open`, `open`, `nautilus`…).
596
+ if (typeof global.fileManagerCommand !== 'string') {
597
+ global.fileManagerCommand = '';
598
+ }
599
+ },
600
+ },
590
601
  ];
591
602
  /** Current settings schema version — always equals the highest migration version. */
592
603
  export const SETTINGS_SCHEMA_VERSION = settingsMigrations.length > 0 ? settingsMigrations[settingsMigrations.length - 1].version : 0;
@@ -629,6 +640,7 @@ function defaultSettings() {
629
640
  archiveScript: '',
630
641
  changeSourceBranchScript: DEFAULT_CHANGE_SOURCE_BRANCH_SCRIPT,
631
642
  editorCommand: '',
643
+ fileManagerCommand: '',
632
644
  browserNotifications: true,
633
645
  audioNotifications: true,
634
646
  audioNotificationSound: 'hey.mp3',
@@ -966,6 +978,7 @@ export function updateGlobalSettings(data) {
966
978
  'archiveScript',
967
979
  'changeSourceBranchScript',
968
980
  'editorCommand',
981
+ 'fileManagerCommand',
969
982
  'browserNotifications',
970
983
  'audioNotifications',
971
984
  'audioNotificationSound',
@@ -57,6 +57,8 @@ function mapWorkspace(row) {
57
57
  description: row.description,
58
58
  agentDescription: row.agent_description,
59
59
  initialPrompt: row.initial_prompt,
60
+ prChangesDismissedAt: row.pr_changes_dismissed_at,
61
+ prCiFailureDismissedAt: row.pr_ci_failure_dismissed_at,
60
62
  engine: row.engine ?? 'claude-code',
61
63
  autoLoop: row.auto_loop === 1,
62
64
  autoLoopReady: row.auto_loop_ready === 1,
@@ -353,6 +355,16 @@ export function setInitialPrompt(id, prompt) {
353
355
  export function clearInitialPrompt(id) {
354
356
  setInitialPrompt(id, null);
355
357
  }
358
+ export function dismissPrAttention(id, kind, prUpdatedAt) {
359
+ const column = kind === 'changes-requested' ? 'pr_changes_dismissed_at' : 'pr_ci_failure_dismissed_at';
360
+ const db = getDb();
361
+ const result = db
362
+ .prepare(`UPDATE workspaces SET ${column} = ?, updated_at = ? WHERE id = ?`)
363
+ .run(prUpdatedAt, new Date().toISOString(), id);
364
+ if (result.changes === 0) {
365
+ throw new Error(`Workspace '${id}' not found`);
366
+ }
367
+ }
356
368
  /** Update the dev-server status column for a workspace. */
357
369
  export function updateDevServerStatus(id, status) {
358
370
  const db = getDb();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.7.19",
3
+ "version": "1.7.21",
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",
@@ -1,4 +1,4 @@
1
- import{D as e,G as t,I as n,N as r,P as i,R as a,St as o,W as s,_ as c,at as l,d as u,et as d,f,g as p,l as m,p as h,r as g,u as _,xt as v,y,yt as b}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{U as x,l as S,t as C}from"./QIcon-BmEX2rXO.js";import{c as w,s as T}from"./notifications-BmNlCl7A.js";import{t as E}from"./QBtn-CoU-UC_j.js";import{n as D}from"./vue-i18n-Cq-KgjJC.js";import{_ as O,c as k,m as A,u as j}from"./index-Dxua-s9Z.js";import{t as M}from"./QSpinnerDots-DspFKwCZ.js";import{t as N}from"./QTooltip-CayfN3AV.js";import{t as ee}from"./QExpansionItem-DEwaFJ-l.js";import{t as te}from"./QScrollArea-BRZX618r.js";import{i as ne,n as re,t as P}from"./render-chat-markdown-B3NEX5ju.js";import{t as F}from"./documents-CX2-4fhr.js";import{t as I}from"./_plugin-vue_export-helper-r4mAJOHR.js";function ie(e,t,n=!0){let r=[],i=new Map,a=new Map;for(let n=0;n<e.length;n++){let o=e[n],s=t?.[n];switch(o.kind){case`message:text`:{let e=i.get(o.messageId);if(e)e.text+=o.text,e.streaming=o.streaming;else{let e={type:`text`,messageId:o.messageId,text:o.text,streaming:o.streaming,ts:s};i.set(o.messageId,e),r.push(e)}break}case`message:end`:{let e=i.get(o.messageId);e&&(e.streaming=!1);break}case`message:thinking`:r.push({type:`thinking`,messageId:o.messageId,text:o.text,ts:s});break;case`tool:call`:{let e={type:`tool`,toolCallId:o.toolCallId,name:o.name,input:o.input,ts:s};a.set(o.toolCallId,e),r.push(e);break}case`tool:result`:{let e=a.get(o.toolCallId);e&&(e.result={output:o.output,isError:o.isError});break}case`session:started`:r.push({type:`session`,kind:`started`,detail:{engineSessionId:o.engineSessionId,model:o.model},ts:s});break;case`session:ended`:r.push({type:`session`,kind:`ended`,detail:{reason:o.reason,exitCode:o.exitCode},ts:s});break;case`session:compacted`:r.push({type:`session`,kind:`compacted`,ts:s});break;case`session:brainstorm-complete`:case`session:user-input-requested`:case`message:raw`:case`skills:discovered`:case`usage`:case`rate_limit`:case`subagent:progress`:case`error`:break;default:}}let o=null;for(let e of r)e.type===`text`&&e.streaming&&(o&&(o.streaming=!1),o=e);return o&&!n&&(o.streaming=!1),r}function ae(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts})),r=[...e,...n];r.sort((e,t)=>{let n=e.ts??``,r=t.ts??``;return n===r?0:n?r?n<r?-1:1:-1:1});let i;for(let e of r)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!i||e.ts>i)&&(i=e.ts);if(i)for(let e of r)e.type===`text`&&e.streaming&&(!e.ts||e.ts<i)&&(e.streaming=!1);return r}var L=new Set([`setup`,`cleanup`,`archive`]);function R(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:L.has(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function oe(e){let t=[],n=null,r=null;for(let i of e){let e=R(i),a=e===`session`||e===`system-prompt`,o=e===`script`&&i.type===`user`?`script:${i.sender}`:e;!n||r!==o||a?(n={speaker:e,ts:i.ts,items:[i]},r=o,t.push(n),a&&(n=null)):n.items.push(i)}return t}var z={class:`text-caption text-grey-6`},B=y({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,r=m(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(n(),h(`span`,z,o(e.$t(r.value)),1))}});function se(e,t){if(t.length===0||e.length===0)return e;let n=[...t].sort((e,t)=>t.length-e.length),r=new DOMParser().parseFromString(`<div>${e}</div>`,`text/html`),i=r.body.firstChild;if(!i)return e;function a(e){if(e.nodeType===Node.TEXT_NODE){V(e,n,r);return}if(e.nodeName===`A`)return;let t=Array.from(e.childNodes);for(let e of t)a(e)}return a(i),i.innerHTML}function V(e,t,n){let r=e.textContent??``;if(!t.some(e=>r.includes(e)))return;let i=n.createDocumentFragment(),a=0;for(;a<r.length;){let e=H(r,a,t);if(!e){i.appendChild(n.createTextNode(r.slice(a)));break}e.index>a&&i.appendChild(n.createTextNode(r.slice(a,e.index)));let o=n.createElement(`a`);o.className=`document-link`,o.setAttribute(`data-document-path`,e.path),o.setAttribute(`href`,`#`),o.textContent=e.path,i.appendChild(o),a=e.index+e.path.length}e.parentNode?.replaceChild(i,e)}function H(e,t,n){let r=null;for(let i of n){let n=e.indexOf(i,t);n<0||(!r||n<r.index||n===r.index&&i.length>r.path.length)&&(r={index:n,path:i})}return r}var U=[`innerHTML`],ce=I(y({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,r=F(),i=k(),a=m(()=>{let e=i.selectedWorkspaceId;return e?r.documentsFor(e).map(e=>e.path):[]}),o=m(()=>re(se(ne.parse(t.item.text,{async:!1,breaks:!0,gfm:!0}),a.value),{addAttr:[`data-document-path`]}));function s(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let n=t.getAttribute(`data-document-path`),a=i.selectedWorkspaceId;!n||!a||r.openDocumentByPath(a,n)}return(t,r)=>(n(),h(`div`,{class:`markdown-message`,onClick:s},[_(`div`,{innerHTML:o.value},null,8,U),e.item.streaming?(n(),u(S,{key:0,size:`xs`,class:`q-ml-xs`})):f(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]),W={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},G=[`innerHTML`],K={key:1,style:{"white-space":`pre-wrap`}},le=I(y({__name:`ThinkingItem`,props:{item:{}},setup(e){let r=e,i=m(()=>r.item.text.trim().slice(0,100)),a=m(()=>r.item.text.trim().length>0),s=m(()=>r.item.text.trim().length>100),c=m(()=>P(r.item.text));return(r,l)=>a.value?(n(),h(`div`,W,[s.value?(n(),u(ee,{key:0,dense:``,"dense-toggle":``,label:i.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:t(()=>[_(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:c.value},null,8,G)]),_:1},8,[`label`])):(n(),h(`span`,K,o(e.item.text),1))])):f(``,!0)}}),[[`__scopeId`,`data-v-7f45ed94`]]);function ue(e,t){let n=e.split(`
1
+ import{D as e,G as t,I as n,N as r,P as i,R as a,St as o,W as s,_ as c,at as l,d as u,et as d,f,g as p,l as m,p as h,r as g,u as _,xt as v,y,yt as b}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{U as x,l as S,t as C}from"./QIcon-BmEX2rXO.js";import{c as w,s as T}from"./notifications-Dq_CVZlr.js";import{t as E}from"./QBtn-CoU-UC_j.js";import{n as D}from"./vue-i18n-Cq-KgjJC.js";import{_ as O,c as k,m as A,u as j}from"./index-CSvMoCLw.js";import{t as M}from"./QSpinnerDots-DspFKwCZ.js";import{t as N}from"./QTooltip-CxkTFl9W.js";import{t as ee}from"./QExpansionItem-C3koMJhv.js";import{t as te}from"./QScrollArea-HmkWoNcD.js";import{i as ne,n as re,t as P}from"./render-chat-markdown-Cj_76hJe.js";import{t as F}from"./documents-CX2-4fhr.js";import{t as I}from"./_plugin-vue_export-helper-r4mAJOHR.js";function ie(e,t,n=!0){let r=[],i=new Map,a=new Map;for(let n=0;n<e.length;n++){let o=e[n],s=t?.[n];switch(o.kind){case`message:text`:{let e=i.get(o.messageId);if(e)e.text+=o.text,e.streaming=o.streaming;else{let e={type:`text`,messageId:o.messageId,text:o.text,streaming:o.streaming,ts:s};i.set(o.messageId,e),r.push(e)}break}case`message:end`:{let e=i.get(o.messageId);e&&(e.streaming=!1);break}case`message:thinking`:r.push({type:`thinking`,messageId:o.messageId,text:o.text,ts:s});break;case`tool:call`:{let e={type:`tool`,toolCallId:o.toolCallId,name:o.name,input:o.input,ts:s};a.set(o.toolCallId,e),r.push(e);break}case`tool:result`:{let e=a.get(o.toolCallId);e&&(e.result={output:o.output,isError:o.isError});break}case`session:started`:r.push({type:`session`,kind:`started`,detail:{engineSessionId:o.engineSessionId,model:o.model},ts:s});break;case`session:ended`:r.push({type:`session`,kind:`ended`,detail:{reason:o.reason,exitCode:o.exitCode},ts:s});break;case`session:compacted`:r.push({type:`session`,kind:`compacted`,ts:s});break;case`session:brainstorm-complete`:case`session:user-input-requested`:case`message:raw`:case`skills:discovered`:case`usage`:case`rate_limit`:case`subagent:progress`:case`error`:break;default:}}let o=null;for(let e of r)e.type===`text`&&e.streaming&&(o&&(o.streaming=!1),o=e);return o&&!n&&(o.streaming=!1),r}function ae(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts})),r=[...e,...n];r.sort((e,t)=>{let n=e.ts??``,r=t.ts??``;return n===r?0:n?r?n<r?-1:1:-1:1});let i;for(let e of r)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!i||e.ts>i)&&(i=e.ts);if(i)for(let e of r)e.type===`text`&&e.streaming&&(!e.ts||e.ts<i)&&(e.streaming=!1);return r}var L=new Set([`setup`,`cleanup`,`archive`]);function R(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:L.has(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function oe(e){let t=[],n=null,r=null;for(let i of e){let e=R(i),a=e===`session`||e===`system-prompt`,o=e===`script`&&i.type===`user`?`script:${i.sender}`:e;!n||r!==o||a?(n={speaker:e,ts:i.ts,items:[i]},r=o,t.push(n),a&&(n=null)):n.items.push(i)}return t}var z={class:`text-caption text-grey-6`},B=y({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,r=m(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(n(),h(`span`,z,o(e.$t(r.value)),1))}});function se(e,t){if(t.length===0||e.length===0)return e;let n=[...t].sort((e,t)=>t.length-e.length),r=new DOMParser().parseFromString(`<div>${e}</div>`,`text/html`),i=r.body.firstChild;if(!i)return e;function a(e){if(e.nodeType===Node.TEXT_NODE){V(e,n,r);return}if(e.nodeName===`A`)return;let t=Array.from(e.childNodes);for(let e of t)a(e)}return a(i),i.innerHTML}function V(e,t,n){let r=e.textContent??``;if(!t.some(e=>r.includes(e)))return;let i=n.createDocumentFragment(),a=0;for(;a<r.length;){let e=H(r,a,t);if(!e){i.appendChild(n.createTextNode(r.slice(a)));break}e.index>a&&i.appendChild(n.createTextNode(r.slice(a,e.index)));let o=n.createElement(`a`);o.className=`document-link`,o.setAttribute(`data-document-path`,e.path),o.setAttribute(`href`,`#`),o.textContent=e.path,i.appendChild(o),a=e.index+e.path.length}e.parentNode?.replaceChild(i,e)}function H(e,t,n){let r=null;for(let i of n){let n=e.indexOf(i,t);n<0||(!r||n<r.index||n===r.index&&i.length>r.path.length)&&(r={index:n,path:i})}return r}var U=[`innerHTML`],ce=I(y({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,r=F(),i=k(),a=m(()=>{let e=i.selectedWorkspaceId;return e?r.documentsFor(e).map(e=>e.path):[]}),o=m(()=>re(se(ne.parse(t.item.text,{async:!1,breaks:!0,gfm:!0}),a.value),{addAttr:[`data-document-path`]}));function s(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let n=t.getAttribute(`data-document-path`),a=i.selectedWorkspaceId;!n||!a||r.openDocumentByPath(a,n)}return(t,r)=>(n(),h(`div`,{class:`markdown-message`,onClick:s},[_(`div`,{innerHTML:o.value},null,8,U),e.item.streaming?(n(),u(S,{key:0,size:`xs`,class:`q-ml-xs`})):f(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]),W={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},G=[`innerHTML`],K={key:1,style:{"white-space":`pre-wrap`}},le=I(y({__name:`ThinkingItem`,props:{item:{}},setup(e){let r=e,i=m(()=>r.item.text.trim().slice(0,100)),a=m(()=>r.item.text.trim().length>0),s=m(()=>r.item.text.trim().length>100),c=m(()=>P(r.item.text));return(r,l)=>a.value?(n(),h(`div`,W,[s.value?(n(),u(ee,{key:0,dense:``,"dense-toggle":``,label:i.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:t(()=>[_(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:c.value},null,8,G)]),_:1},8,[`label`])):(n(),h(`span`,K,o(e.item.text),1))])):f(``,!0)}}),[[`__scopeId`,`data-v-7f45ed94`]]);function ue(e,t){let n=e.split(`
2
2
  `),r=t.split(`
3
3
  `),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}function de(e){let t=e.split(`
4
4
  `),n=[];for(let e of t)e.startsWith(`@@`)||e.startsWith(`+++`)||e.startsWith(`---`)||(e.startsWith(`+`)?n.push({type:`add`,content:e.slice(1)}):e.startsWith(`-`)?n.push({type:`del`,content:e.slice(1)}):e.startsWith(` `)?n.push({type:`context`,content:e.slice(1)}):e.length>0&&n.push({type:`context`,content:e}));return n}function fe(e,t){if(!t||typeof t!=`object`)return null;let n=t;if(e===`Edit`){let e=n.file_path;if(!e)return null;let t=n.old_string??``,r=n.new_string??``,i=typeof n.diff==`string`?n.diff:``;if(!t&&!r&&i.length>0){let t=de(i);return{toolName:`Edit`,filePath:e,additions:t.filter(e=>e.type===`add`).length,deletions:t.filter(e=>e.type===`del`).length,diffLines:t}}return{toolName:`Edit`,filePath:e,oldString:t,newString:r,replaceAll:n.replace_all??!1,additions:r?r.split(`
@@ -1 +1 @@
1
- import{G as e,I as t,N as n,R as r,St as i,_ as a,at as o,d as s,et as c,f as l,p as u,r as d,u as f,y as p}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{t as m}from"./QBtn-CoU-UC_j.js";import{b as h,i as g,x as _}from"./index-Dxua-s9Z.js";import{t as v}from"./render-chat-markdown-B3NEX5ju.js";import{t as y}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as b}from"./QSpace-Crcx82On.js";import{t as x}from"./QChip-D2TVel5I.js";import{t as S}from"./QPage-3-ah4oor.js";var C={class:`row items-center q-mb-md`},w={class:`text-h6 q-ml-sm`},T={key:0,class:`text-grey-6 text-center q-pa-lg`},E={key:1,class:`text-negative text-center q-pa-lg`},D={key:2,class:`text-grey-6 text-center q-pa-lg`},O={key:3,class:`column q-gutter-md`},k={key:0,class:`text-caption text-grey-6`},A={class:`row items-center q-mb-sm`},j={class:`text-subtitle1 text-indigo-3`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},M=[`innerHTML`],N=y(p({__name:`ChangelogPage`,setup(p){let y=g(),N=c([]),P=c(``),F=c(!1),I=c(null);function L(e){return v(e)}async function R(){F.value=!0,I.value=null;try{let e=await fetch(`/api/changelog`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();P.value=t.currentVersion??``,N.value=t.versions??[]}catch(e){I.value=e instanceof Error?e.message:String(e)}finally{F.value=!1}}return n(R),(n,c)=>(t(),s(S,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:e(()=>[f(`div`,C,[a(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:c[0]||=e=>o(y).back()}),f(`div`,w,i(n.$t(`changelog.title`)),1),a(b),a(m,{flat:``,dense:``,icon:`refresh`,loading:F.value,label:n.$t(`common.refresh`),onClick:R},null,8,[`loading`,`label`])]),F.value&&N.value.length===0?(t(),u(`div`,T,i(n.$t(`common.loading`)),1)):I.value?(t(),u(`div`,E,i(I.value),1)):N.value.length===0?(t(),u(`div`,D,i(n.$t(`changelog.empty`)),1)):(t(),u(`div`,O,[P.value?(t(),u(`div`,k,i(n.$t(`changelog.currentVersion`,{version:P.value})),1)):l(``,!0),(t(!0),u(d,null,r(N.value,r=>(t(),s(h,{key:r.version,dark:``,flat:``,bordered:``},{default:e(()=>[a(_,null,{default:e(()=>[f(`div`,A,[f(`div`,j,` v`+i(r.version),1),r.version===P.value?(t(),s(x,{key:0,dense:``,size:`sm`,color:`indigo-7`,"text-color":`grey-2`,label:n.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):l(``,!0)]),f(`div`,{class:`changelog-notes`,innerHTML:L(r.notes)},null,8,M)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-ed73d661`]]);export{N as default};
1
+ import{G as e,I as t,N as n,R as r,St as i,_ as a,at as o,d as s,et as c,f as l,p as u,r as d,u as f,y as p}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{t as m}from"./QBtn-CoU-UC_j.js";import{b as h,i as g,x as _}from"./index-CSvMoCLw.js";import{t as v}from"./render-chat-markdown-Cj_76hJe.js";import{t as y}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as b}from"./QSpace-Crcx82On.js";import{t as x}from"./QChip-D2TVel5I.js";import{t as S}from"./QPage-3-ah4oor.js";var C={class:`row items-center q-mb-md`},w={class:`text-h6 q-ml-sm`},T={key:0,class:`text-grey-6 text-center q-pa-lg`},E={key:1,class:`text-negative text-center q-pa-lg`},D={key:2,class:`text-grey-6 text-center q-pa-lg`},O={key:3,class:`column q-gutter-md`},k={key:0,class:`text-caption text-grey-6`},A={class:`row items-center q-mb-sm`},j={class:`text-subtitle1 text-indigo-3`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},M=[`innerHTML`],N=y(p({__name:`ChangelogPage`,setup(p){let y=g(),N=c([]),P=c(``),F=c(!1),I=c(null);function L(e){return v(e)}async function R(){F.value=!0,I.value=null;try{let e=await fetch(`/api/changelog`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();P.value=t.currentVersion??``,N.value=t.versions??[]}catch(e){I.value=e instanceof Error?e.message:String(e)}finally{F.value=!1}}return n(R),(n,c)=>(t(),s(S,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:e(()=>[f(`div`,C,[a(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:c[0]||=e=>o(y).back()}),f(`div`,w,i(n.$t(`changelog.title`)),1),a(b),a(m,{flat:``,dense:``,icon:`refresh`,loading:F.value,label:n.$t(`common.refresh`),onClick:R},null,8,[`loading`,`label`])]),F.value&&N.value.length===0?(t(),u(`div`,T,i(n.$t(`common.loading`)),1)):I.value?(t(),u(`div`,E,i(I.value),1)):N.value.length===0?(t(),u(`div`,D,i(n.$t(`changelog.empty`)),1)):(t(),u(`div`,O,[P.value?(t(),u(`div`,k,i(n.$t(`changelog.currentVersion`,{version:P.value})),1)):l(``,!0),(t(!0),u(d,null,r(N.value,r=>(t(),s(h,{key:r.version,dark:``,flat:``,bordered:``},{default:e(()=>[a(_,null,{default:e(()=>[f(`div`,A,[f(`div`,j,` v`+i(r.version),1),r.version===P.value?(t(),s(x,{key:0,dense:``,size:`sm`,color:`indigo-7`,"text-color":`grey-2`,label:n.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):l(``,!0)]),f(`div`,{class:`changelog-notes`,innerHTML:L(r.notes)},null,8,M)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-ed73d661`]]);export{N as default};
@@ -1 +1 @@
1
- import{F as e,b as t}from"./QIcon-BmEX2rXO.js";import{T as n,w as r}from"./notifications-BmNlCl7A.js";function i(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var a=e({name:`close-popup`,beforeMount(e,{value:a}){let o={depth:i(a),handler(t){o.depth!==0&&setTimeout(()=>{let i=n(e);i!==void 0&&r(i,t,o.depth)})},handlerKey(e){t(e,13)===!0&&o.handler(e)}};e.__qclosepopup=o,e.addEventListener(`click`,o.handler),e.addEventListener(`keyup`,o.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=i(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{a as t};
1
+ import{F as e,b as t}from"./QIcon-BmEX2rXO.js";import{T as n,w as r}from"./notifications-Dq_CVZlr.js";function i(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var a=e({name:`close-popup`,beforeMount(e,{value:a}){let o={depth:i(a),handler(t){o.depth!==0&&setTimeout(()=>{let i=n(e);i!==void 0&&r(i,t,o.depth)})},handlerKey(e){t(e,13)===!0&&o.handler(e)}};e.__qclosepopup=o,e.addEventListener(`click`,o.handler),e.addEventListener(`keyup`,o.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=i(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{a as t};
@@ -1,2 +1,2 @@
1
- import{D as e,E as t,G as n,I as r,N as i,P as ee,R as te,S as ne,St as a,W as o,_ as s,at as c,bt as re,d as l,et as u,f as d,g as f,l as p,p as m,r as ie,u as h,y as ae,yt as oe}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{H as se,R as ce,U as g,t as _}from"./QIcon-BmEX2rXO.js";import{r as v}from"./use-id-BCnfiBjU.js";import{s as le}from"./notifications-BmNlCl7A.js";import{t as y}from"./QBtn-CoU-UC_j.js";import{n as ue}from"./vue-i18n-Cq-KgjJC.js";import{t as b}from"./QInput-D0t39uK_.js";import{c as de,g as fe,i as pe,o as me}from"./index-Dxua-s9Z.js";import{t as he}from"./QSpinnerDots-DspFKwCZ.js";import{n as x,t as ge}from"./QItemSection-DRg-QuAD.js";import{t as S}from"./QItemLabel-Btqw0P7M.js";import{t as C}from"./QTooltip-CayfN3AV.js";import{t as _e}from"./QExpansionItem-DEwaFJ-l.js";import{t as ve}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as ye}from"./QSpace-Crcx82On.js";import{t as be}from"./use-quasar-q6dh7QVJ.js";import{t as xe}from"./QPage-3-ah4oor.js";import{a as w,i as Se,r as Ce,t as we}from"./permissionModes-B2nlp6IT.js";import{a as Te,i as Ee,n as De,r as Oe,t as ke}from"./expand-template-B3Mua3eb.js";var T=`kobo:create-page-prefs`;function Ae(){try{let e=localStorage.getItem(T);return e===null?void 0:JSON.parse(e)}catch{return}}function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function je(){let e=Ae();if(!E(e))return{};let t={};return typeof e.projectPath==`string`&&e.projectPath.length>0&&(t.projectPath=e.projectPath),typeof e.autoLoop==`boolean`&&(t.autoLoop=e.autoLoop),t}function Me(e){try{localStorage.setItem(T,JSON.stringify(e))}catch{}}var Ne={class:`create-inner`},Pe={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Fe={class:`create-card rounded-borders`},Ie={class:`card-top-bar row items-center q-px-md q-py-xs`},Le={class:`model-badge cursor-default row items-center q-gutter-xs`},Re={class:`text-indigo-3 text-weight-medium text-caption`},ze={key:0,class:`notion-url-wrap`},Be={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ve={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},He={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ue={class:`text-caption text-grey-4 q-mb-sm`},We={class:`row q-gutter-sm`},Ge={class:`peek-card-text`},Ke={class:`peek-card-title`},qe={class:`peek-card-desc`},Je={class:`peek-card-text`},Ye={class:`peek-card-title`},Xe={class:`peek-card-desc`},Ze={key:0,class:`sentry-url-wrap`},Qe={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},$e={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},et={class:`card-name-wrap`},tt={class:`card-textarea-wrap`},nt={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},rt={key:0,class:`row items-center text-caption text-amber-6`},it={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},at={class:`q-pa-sm manual-section-body`},ot={class:`row items-center q-gutter-sm q-mb-sm`},st={class:`col text-caption text-grey-4`},ct={class:`q-pa-sm manual-section-body`},lt={class:`row items-center q-gutter-sm q-mb-sm`},ut={class:`col text-caption text-grey-4`},dt={class:`card-bottom-bar`},ft={class:`row q-col-gutter-xs q-px-xs`},pt={key:0,class:`col-12 col-sm-6 col-md-3`},mt={class:`bottom-select-label row items-center no-wrap`},ht={class:`col-12 col-sm-6 col-md-3`},gt={class:`bottom-select-label row items-center no-wrap`},_t={class:`col-12 col-sm-6 col-md-3`},vt={class:`bottom-select-label row items-center no-wrap`},yt={class:`col-12 col-md-3`},bt={class:`bottom-select-label row items-center no-wrap`},xt={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},St={class:`col-12 col-md-auto`},Ct={class:`col-12 col-md-auto`},wt={class:`col-12 col-md-auto`},Tt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Et={class:`col-12 col-md-4`},Dt={key:0,class:`col-12 col-md-4`},Ot={class:`bottom-select-label row items-center no-wrap`},kt={key:1,class:`col-12 col-md-4`},At={class:`bottom-select-label row items-center no-wrap`},jt={class:`col-12 col-md-4`},Mt={class:`bottom-select-label row items-center no-wrap`},Nt={class:`row justify-center q-px-sm q-py-sm`},Pt={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Ft=6e4,D=ve(ae({__name:`CreatePage`,setup(ae){let ve=pe(),T=be(),Ae=de(),E=le(),{t:D}=ue(),It=u([]),Lt=u(``),O=u(``),Rt=u(null),zt=u(``),k=u(!1),A=u(!1),Bt=u(null),Vt=u(null),Ht=u([]),Ut=u(null),j=u(``),M=u(!1),N=u(`claude-opus-4-7`),P=u(`auto`),F=u(``),I=u(null),L=u(`feature`),R=u(!1),Wt=p(()=>E.global.voiceEnabled),Gt=u([]),z=u(`claude-code`),Kt=p(()=>Gt.value.find(e=>e.id===z.value)),qt=p(()=>Gt.value.map(e=>({value:e.id,label:e.displayName}))),Jt=p(()=>E.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),Yt=[`plan`,`bypass`,`strict`,`interactive`];function Xt(e,t){let n=e?E.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Yt.includes(r))return r;let i=E.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Yt.includes(i)?i:n?.dangerouslySkipPermissions??E.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let B=u(Xt(``,z.value)),Zt=p(()=>{switch(B.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),Qt=p(()=>(we[z.value]??Yt).map(e=>({value:e,label:D(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),V=u([]),$t=u([]),en=u(!1),tn=u(!1);function nn(e,t){t(()=>{$t.value=e?V.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):V.value})}let rn=fe();function an(){return Rt.value?.nativeEl??null}let{showSkills:on,selectedSkillIndex:H,groupedDropdown:sn,flatDropdown:U,fetchSkills:cn,detectSlashFragment:ln,replaceFragmentWith:un,closeDropdown:dn}=Ee(O,an,{excludeKoboCommands:!0});cn(),o(O,async()=>{await e(),await ln()});function fn(e){if(e.type===`template`){let t=rn.templates.find(t=>t.slug===e.name);if(!t)return;un(De(t.content,ke({workspace:null,gitStats:null,sessionName:null}))),dn();return}un(`/${e.name} `),dn()}function pn(e){!on.value||U.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),H.value=(H.value+1)%U.value.length):e.key===`ArrowUp`?(e.preventDefault(),H.value=(H.value-1+U.value.length)%U.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),fn(U.value[H.value])):e.key===`Escape`&&(e.preventDefault(),dn()))}async function mn(){if(!(!Wt.value||k.value||A.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){T.notify({type:`warning`,message:D(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Vt.value=e,Ht.value=[];let t=MediaRecorder.isTypeSupported(`audio/webm`)?`audio/webm`:``,n=t?new MediaRecorder(e,{mimeType:t}):new MediaRecorder(e);n.ondataavailable=e=>{e.data&&e.data.size>0&&Ht.value.push(e.data)},n.start(),Bt.value=n,k.value=!0,Ut.value=setTimeout(()=>{W(),T.notify({type:`info`,message:D(`voice.maxDurationReached`),position:`top`,timeout:3500})},Ft)}catch{T.notify({type:`negative`,message:D(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function W(){if(!k.value)return;let e=Bt.value;if(!e)return;k.value=!1,A.value=!0,Ut.value&&=(clearTimeout(Ut.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Ht.value,{type:`audio/webm`})),e.stop()});try{if(t.size===0)throw Error(`MIC_AUDIO_INVALID`);let e=new FormData;e.append(`audio`,t,`voice.webm`),e.append(`language`,E.global.voiceLanguage||`auto`);let n=await fetch(`/api/voice/transcribe`,{method:`POST`,body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(String(e.code??e.error??`HTTP_${n.status}`))}let r=await n.json();r.text?.trim()&&(O.value=O.value?`${O.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;T.notify({type:`negative`,message:D({VOICE_DISABLED:`voice.errorDisabled`,MODEL_NOT_CONFIGURED:`voice.errorModelMissing`,MODEL_NOT_INSTALLED:`voice.errorModelNotInstalled`,VOICE_RUNTIME_MISSING:`voice.errorRuntimeMissing`,MIC_AUDIO_INVALID:`voice.errorAudioInvalid`,LANGUAGE_INVALID:`voice.errorLanguageInvalid`,TRANSCRIPTION_TIMEOUT:`voice.errorTranscription`}[t]??`voice.errorTranscription`),position:`top`,timeout:5e3})}finally{Bt.value=null,Ht.value=[],Vt.value?.getTracks().forEach(e=>{e.stop()}),Vt.value=null,A.value=!1}}function hn(e){return Wt.value?E.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function gn(e){!hn(e)||e.repeat||(e.preventDefault(),mn())}function _n(e){hn(e)&&(e.preventDefault(),W())}function vn(){k.value&&W()}function yn(){document.visibilityState!==`visible`&&k.value&&W()}let bn=p(()=>(Se[z.value]??Ce).map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));o(z,()=>{let e=bn.value.map(e=>e.value);if(e.length>0){let t=E.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?N.value=t:e.includes(N.value)||(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=we[z.value]??[];t.length>0&&!t.includes(B.value)&&(B.value=Xt(F.value,z.value));let n=(Oe[z.value]??[]).map(e=>e.value);n.length>0&&!n.includes(P.value)&&(P.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function xn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Sn=p(()=>(Oe[z.value]??Oe[`claude-code`]).map(e=>({value:e.value,label:xn(D(e.i18nLabelKey)),description:D(e.i18nDescriptionKey)}))),G=p(()=>j.value.trim().startsWith(`https://www.notion.so/`)),Cn=p(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(j.value)),K=u(`panel`);function wn(){let e=j.value.trim();return K.value===`parent`&&Cn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let q=u([]),J=u([]),Tn=u(``),En=u(``),Dn=p(()=>!M.value||!G.value);function On(){let e=Tn.value.trim();e&&(q.value.push(e),Tn.value=``)}function kn(e){q.value.splice(e,1)}function An(){let e=En.value.trim();e&&(J.value.push(e),En.value=``)}function jn(e){J.value.splice(e,1)}function Mn(){M.value=!M.value,M.value||(j.value=``)}let Y=u(!1),X=u(!1);o(()=>X.value,e=>{e&&B.value!==`bypass`&&(B.value=`bypass`,T.notify({type:`info`,message:D(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let Z=u(``),Nn=p(()=>/\/issues\/\d+/.test(Z.value.trim()));function Pn(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=u(!1),$=u(null),Fn=u([]),In=u(!1);async function Ln(){if(!F.value.trim()){Fn.value=[];return}In.value=!0;try{Fn.value=await Ae.fetchOrphanWorktrees(F.value.trim())}catch{Fn.value=[]}finally{In.value=!1}}function Rn(){Q.value=!Q.value,Q.value?(M.value=!1,j.value=``,Y.value=!1,Z.value=``,R.value=!0,Ln()):$.value=null}o(F,()=>{$.value=null,Q.value&&Ln()}),o($,e=>{if(!e)return;let t=Fn.value.find(t=>t.path===e);t&&(I.value=t.suggestedSourceBranch),R.value=!0});async function zn(e){if(!e.trim()){V.value=[],I.value=null;return}en.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();V.value=n.local??n.branches??[],V.value.length>0&&!I.value&&(I.value=V.value[0]??null)}catch{V.value=[],I.value=null}finally{en.value=!1}}function Bn(e){let t=E.getProjectByPath(e);if(t){t.defaultSourceBranch&&(I.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(O.value===``||O.value===zt.value)&&(O.value=e,zt.value=e);let n=bn.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))N.value=t.defaultModel;else{let e=E.global.defaultModelByEngine?.[z.value];typeof e==`string`&&n.includes(e)&&(N.value=e)}}B.value=Xt(e,z.value)}let Vn=null;o(F,e=>{Vn&&clearTimeout(Vn),Vn=setTimeout(()=>{I.value=null,zn(e),Bn(e)},500)});function Hn(e,t){t(()=>{It.value=E.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}i(async()=>{await E.fetchSettings();let e=E.global.branchPrefixes;e.length>0&&!e.includes(L.value)&&(L.value=e[0]);let t=je();t.autoLoop===!0&&(X.value=!0),t.projectPath&&E.projectPaths.includes(t.projectPath)&&(F.value=t.projectPath),B.value=Xt(F.value,z.value);try{let e=await fetch(`/api/engines`);e.ok&&(Gt.value=await e.json())}catch{}{let e=bn.value.map(e=>e.value),t=E.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?N.value=t:e.length>0&&!e.includes(N.value)&&(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,gn),window.addEventListener(`keyup`,_n),window.addEventListener(`blur`,vn),document.addEventListener(`visibilitychange`,yn)}),ee(()=>{Vn&&clearTimeout(Vn),window.removeEventListener(`keydown`,gn),window.removeEventListener(`keyup`,_n),window.removeEventListener(`blur`,vn),document.removeEventListener(`visibilitychange`,yn),Ut.value&&=(clearTimeout(Ut.value),null),k.value&&W()});function Un(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 Wn(){return Lt.value.trim()?Lt.value.trim().substring(0,80):!M.value&&!Y.value&&O.value.trim()&&(O.value.trim().split(`
1
+ import{D as e,E as t,G as n,I as r,N as i,P as ee,R as te,S as ne,St as a,W as o,_ as s,at as c,bt as re,d as l,et as u,f as d,g as f,l as p,p as m,r as ie,u as h,y as ae,yt as oe}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{H as se,R as ce,U as g,t as _}from"./QIcon-BmEX2rXO.js";import{r as v}from"./use-id-BCnfiBjU.js";import{s as le}from"./notifications-Dq_CVZlr.js";import{t as y}from"./QBtn-CoU-UC_j.js";import{n as ue}from"./vue-i18n-Cq-KgjJC.js";import{t as b}from"./QInput-D0t39uK_.js";import{c as de,g as fe,i as pe,o as me}from"./index-CSvMoCLw.js";import{t as he}from"./QSpinnerDots-DspFKwCZ.js";import{n as x,t as ge}from"./QItemSection-DRg-QuAD.js";import{t as S}from"./QItemLabel-Btqw0P7M.js";import{t as C}from"./QTooltip-CxkTFl9W.js";import{t as _e}from"./QExpansionItem-C3koMJhv.js";import{t as ve}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as ye}from"./QSpace-Crcx82On.js";import{t as be}from"./use-quasar-q6dh7QVJ.js";import{t as xe}from"./QPage-3-ah4oor.js";import{a as w,i as Se,r as Ce,t as we}from"./permissionModes-CpgAOu0t.js";import{a as Te,i as Ee,n as De,r as Oe,t as ke}from"./expand-template-ct-WAfuX.js";var T=`kobo:create-page-prefs`;function Ae(){try{let e=localStorage.getItem(T);return e===null?void 0:JSON.parse(e)}catch{return}}function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function je(){let e=Ae();if(!E(e))return{};let t={};return typeof e.projectPath==`string`&&e.projectPath.length>0&&(t.projectPath=e.projectPath),typeof e.autoLoop==`boolean`&&(t.autoLoop=e.autoLoop),t}function Me(e){try{localStorage.setItem(T,JSON.stringify(e))}catch{}}var Ne={class:`create-inner`},Pe={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Fe={class:`create-card rounded-borders`},Ie={class:`card-top-bar row items-center q-px-md q-py-xs`},Le={class:`model-badge cursor-default row items-center q-gutter-xs`},Re={class:`text-indigo-3 text-weight-medium text-caption`},ze={key:0,class:`notion-url-wrap`},Be={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ve={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},He={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ue={class:`text-caption text-grey-4 q-mb-sm`},We={class:`row q-gutter-sm`},Ge={class:`peek-card-text`},Ke={class:`peek-card-title`},qe={class:`peek-card-desc`},Je={class:`peek-card-text`},Ye={class:`peek-card-title`},Xe={class:`peek-card-desc`},Ze={key:0,class:`sentry-url-wrap`},Qe={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},$e={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},et={class:`card-name-wrap`},tt={class:`card-textarea-wrap`},nt={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},rt={key:0,class:`row items-center text-caption text-amber-6`},it={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},at={class:`q-pa-sm manual-section-body`},ot={class:`row items-center q-gutter-sm q-mb-sm`},st={class:`col text-caption text-grey-4`},ct={class:`q-pa-sm manual-section-body`},lt={class:`row items-center q-gutter-sm q-mb-sm`},ut={class:`col text-caption text-grey-4`},dt={class:`card-bottom-bar`},ft={class:`row q-col-gutter-xs q-px-xs`},pt={key:0,class:`col-12 col-sm-6 col-md-3`},mt={class:`bottom-select-label row items-center no-wrap`},ht={class:`col-12 col-sm-6 col-md-3`},gt={class:`bottom-select-label row items-center no-wrap`},_t={class:`col-12 col-sm-6 col-md-3`},vt={class:`bottom-select-label row items-center no-wrap`},yt={class:`col-12 col-md-3`},bt={class:`bottom-select-label row items-center no-wrap`},xt={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},St={class:`col-12 col-md-auto`},Ct={class:`col-12 col-md-auto`},wt={class:`col-12 col-md-auto`},Tt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Et={class:`col-12 col-md-4`},Dt={key:0,class:`col-12 col-md-4`},Ot={class:`bottom-select-label row items-center no-wrap`},kt={key:1,class:`col-12 col-md-4`},At={class:`bottom-select-label row items-center no-wrap`},jt={class:`col-12 col-md-4`},Mt={class:`bottom-select-label row items-center no-wrap`},Nt={class:`row justify-center q-px-sm q-py-sm`},Pt={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Ft=6e4,D=ve(ae({__name:`CreatePage`,setup(ae){let ve=pe(),T=be(),Ae=de(),E=le(),{t:D}=ue(),It=u([]),Lt=u(``),O=u(``),Rt=u(null),zt=u(``),k=u(!1),A=u(!1),Bt=u(null),Vt=u(null),Ht=u([]),Ut=u(null),j=u(``),M=u(!1),N=u(`claude-opus-4-7`),P=u(`auto`),F=u(``),I=u(null),L=u(`feature`),R=u(!1),Wt=p(()=>E.global.voiceEnabled),Gt=u([]),z=u(`claude-code`),Kt=p(()=>Gt.value.find(e=>e.id===z.value)),qt=p(()=>Gt.value.map(e=>({value:e.id,label:e.displayName}))),Jt=p(()=>E.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),Yt=[`plan`,`bypass`,`strict`,`interactive`];function Xt(e,t){let n=e?E.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Yt.includes(r))return r;let i=E.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Yt.includes(i)?i:n?.dangerouslySkipPermissions??E.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let B=u(Xt(``,z.value)),Zt=p(()=>{switch(B.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),Qt=p(()=>(we[z.value]??Yt).map(e=>({value:e,label:D(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),V=u([]),$t=u([]),en=u(!1),tn=u(!1);function nn(e,t){t(()=>{$t.value=e?V.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):V.value})}let rn=fe();function an(){return Rt.value?.nativeEl??null}let{showSkills:on,selectedSkillIndex:H,groupedDropdown:sn,flatDropdown:U,fetchSkills:cn,detectSlashFragment:ln,replaceFragmentWith:un,closeDropdown:dn}=Ee(O,an,{excludeKoboCommands:!0});cn(),o(O,async()=>{await e(),await ln()});function fn(e){if(e.type===`template`){let t=rn.templates.find(t=>t.slug===e.name);if(!t)return;un(De(t.content,ke({workspace:null,gitStats:null,sessionName:null}))),dn();return}un(`/${e.name} `),dn()}function pn(e){!on.value||U.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),H.value=(H.value+1)%U.value.length):e.key===`ArrowUp`?(e.preventDefault(),H.value=(H.value-1+U.value.length)%U.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),fn(U.value[H.value])):e.key===`Escape`&&(e.preventDefault(),dn()))}async function mn(){if(!(!Wt.value||k.value||A.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){T.notify({type:`warning`,message:D(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Vt.value=e,Ht.value=[];let t=MediaRecorder.isTypeSupported(`audio/webm`)?`audio/webm`:``,n=t?new MediaRecorder(e,{mimeType:t}):new MediaRecorder(e);n.ondataavailable=e=>{e.data&&e.data.size>0&&Ht.value.push(e.data)},n.start(),Bt.value=n,k.value=!0,Ut.value=setTimeout(()=>{W(),T.notify({type:`info`,message:D(`voice.maxDurationReached`),position:`top`,timeout:3500})},Ft)}catch{T.notify({type:`negative`,message:D(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function W(){if(!k.value)return;let e=Bt.value;if(!e)return;k.value=!1,A.value=!0,Ut.value&&=(clearTimeout(Ut.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Ht.value,{type:`audio/webm`})),e.stop()});try{if(t.size===0)throw Error(`MIC_AUDIO_INVALID`);let e=new FormData;e.append(`audio`,t,`voice.webm`),e.append(`language`,E.global.voiceLanguage||`auto`);let n=await fetch(`/api/voice/transcribe`,{method:`POST`,body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(String(e.code??e.error??`HTTP_${n.status}`))}let r=await n.json();r.text?.trim()&&(O.value=O.value?`${O.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;T.notify({type:`negative`,message:D({VOICE_DISABLED:`voice.errorDisabled`,MODEL_NOT_CONFIGURED:`voice.errorModelMissing`,MODEL_NOT_INSTALLED:`voice.errorModelNotInstalled`,VOICE_RUNTIME_MISSING:`voice.errorRuntimeMissing`,MIC_AUDIO_INVALID:`voice.errorAudioInvalid`,LANGUAGE_INVALID:`voice.errorLanguageInvalid`,TRANSCRIPTION_TIMEOUT:`voice.errorTranscription`}[t]??`voice.errorTranscription`),position:`top`,timeout:5e3})}finally{Bt.value=null,Ht.value=[],Vt.value?.getTracks().forEach(e=>{e.stop()}),Vt.value=null,A.value=!1}}function hn(e){return Wt.value?E.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function gn(e){!hn(e)||e.repeat||(e.preventDefault(),mn())}function _n(e){hn(e)&&(e.preventDefault(),W())}function vn(){k.value&&W()}function yn(){document.visibilityState!==`visible`&&k.value&&W()}let bn=p(()=>(Se[z.value]??Ce).map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));o(z,()=>{let e=bn.value.map(e=>e.value);if(e.length>0){let t=E.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?N.value=t:e.includes(N.value)||(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=we[z.value]??[];t.length>0&&!t.includes(B.value)&&(B.value=Xt(F.value,z.value));let n=(Oe[z.value]??[]).map(e=>e.value);n.length>0&&!n.includes(P.value)&&(P.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function xn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Sn=p(()=>(Oe[z.value]??Oe[`claude-code`]).map(e=>({value:e.value,label:xn(D(e.i18nLabelKey)),description:D(e.i18nDescriptionKey)}))),G=p(()=>j.value.trim().startsWith(`https://www.notion.so/`)),Cn=p(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(j.value)),K=u(`panel`);function wn(){let e=j.value.trim();return K.value===`parent`&&Cn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let q=u([]),J=u([]),Tn=u(``),En=u(``),Dn=p(()=>!M.value||!G.value);function On(){let e=Tn.value.trim();e&&(q.value.push(e),Tn.value=``)}function kn(e){q.value.splice(e,1)}function An(){let e=En.value.trim();e&&(J.value.push(e),En.value=``)}function jn(e){J.value.splice(e,1)}function Mn(){M.value=!M.value,M.value||(j.value=``)}let Y=u(!1),X=u(!1);o(()=>X.value,e=>{e&&B.value!==`bypass`&&(B.value=`bypass`,T.notify({type:`info`,message:D(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let Z=u(``),Nn=p(()=>/\/issues\/\d+/.test(Z.value.trim()));function Pn(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=u(!1),$=u(null),Fn=u([]),In=u(!1);async function Ln(){if(!F.value.trim()){Fn.value=[];return}In.value=!0;try{Fn.value=await Ae.fetchOrphanWorktrees(F.value.trim())}catch{Fn.value=[]}finally{In.value=!1}}function Rn(){Q.value=!Q.value,Q.value?(M.value=!1,j.value=``,Y.value=!1,Z.value=``,R.value=!0,Ln()):$.value=null}o(F,()=>{$.value=null,Q.value&&Ln()}),o($,e=>{if(!e)return;let t=Fn.value.find(t=>t.path===e);t&&(I.value=t.suggestedSourceBranch),R.value=!0});async function zn(e){if(!e.trim()){V.value=[],I.value=null;return}en.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();V.value=n.local??n.branches??[],V.value.length>0&&!I.value&&(I.value=V.value[0]??null)}catch{V.value=[],I.value=null}finally{en.value=!1}}function Bn(e){let t=E.getProjectByPath(e);if(t){t.defaultSourceBranch&&(I.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(O.value===``||O.value===zt.value)&&(O.value=e,zt.value=e);let n=bn.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))N.value=t.defaultModel;else{let e=E.global.defaultModelByEngine?.[z.value];typeof e==`string`&&n.includes(e)&&(N.value=e)}}B.value=Xt(e,z.value)}let Vn=null;o(F,e=>{Vn&&clearTimeout(Vn),Vn=setTimeout(()=>{I.value=null,zn(e),Bn(e)},500)});function Hn(e,t){t(()=>{It.value=E.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}i(async()=>{await E.fetchSettings();let e=E.global.branchPrefixes;e.length>0&&!e.includes(L.value)&&(L.value=e[0]);let t=je();t.autoLoop===!0&&(X.value=!0),t.projectPath&&E.projectPaths.includes(t.projectPath)&&(F.value=t.projectPath),B.value=Xt(F.value,z.value);try{let e=await fetch(`/api/engines`);e.ok&&(Gt.value=await e.json())}catch{}{let e=bn.value.map(e=>e.value),t=E.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?N.value=t:e.length>0&&!e.includes(N.value)&&(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,gn),window.addEventListener(`keyup`,_n),window.addEventListener(`blur`,vn),document.addEventListener(`visibilitychange`,yn)}),ee(()=>{Vn&&clearTimeout(Vn),window.removeEventListener(`keydown`,gn),window.removeEventListener(`keyup`,_n),window.removeEventListener(`blur`,vn),document.removeEventListener(`visibilitychange`,yn),Ut.value&&=(clearTimeout(Ut.value),null),k.value&&W()});function Un(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 Wn(){return Lt.value.trim()?Lt.value.trim().substring(0,80):!M.value&&!Y.value&&O.value.trim()&&(O.value.trim().split(`
2
2
  `)[0]??``).substring(0,80)||`workspace`}function Gn(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 Kn(){return M.value&&!G.value?D(`createPage.validationNotionUrl`):Y.value&&!Nn.value?D(`createPage.sentryValidation`):!M.value&&!Y.value&&!O.value.trim()?D(`createPage.validationDescription`):!M.value&&!Y.value&&(!Wn()||Wn()===`workspace`)&&!Lt.value.trim()&&!O.value.trim()?D(`createPage.validationName`):F.value.trim()?I.value?null:D(`createPage.validationBranch`):D(`createPage.validationPath`)}async function qn(){let e=Kn();if(e){T.notify({type:`negative`,message:e,position:`top`});return}if(Q.value&&!$.value){T.notify({type:`negative`,message:D(`createPage.pickWorktreeRequired`),position:`top`});return}tn.value=!0;try{let e=Wn(),t;t=M.value&&G.value?Gn(wn()):e===`workspace`?`task-${Date.now()}`:Un(e);let n=`${L.value}/${t}`,r={name:e,projectPath:F.value.trim(),sourceBranch:I.value,...Q.value&&$.value?{worktreePath:$.value,skipSetupScript:!0}:{workingBranch:n},engine:z.value,model:N.value,reasoningEffort:P.value,...M.value&&G.value?{notionUrl:wn()}:{},...Y.value&&Nn.value?{sentryUrl:Z.value.trim()}:{},...Dn.value&&q.value.length>0?{tasks:q.value}:{},...Dn.value&&J.value.length>0?{acceptanceCriteria:J.value}:{},...R.value&&!Q.value?{skipSetupScript:!0}:{},...O.value.trim()?{description:O.value.trim()}:{},...X.value?{autoLoop:!0}:{},agentPermissionMode:X.value&&B.value===`plan`?`bypass`:B.value},i=await Ae.createWorkspace(r);i._branchAdjusted&&T.notify({type:`info`,message:D(`createPage.branchAdjusted`,{branch:i.workingBranch}),position:`top`,timeout:6e3}),Me({projectPath:F.value.trim(),autoLoop:X.value}),me().subscribe(i.id),Ae.selectWorkspace(i.id),ve.push({name:`workspace`,params:{id:i.id}})}catch{T.notify({type:`negative`,message:D(`createPage.errorCreating`),position:`top`})}finally{tn.value=!1}}return(e,i)=>(r(),l(xe,{class:`create-page flex flex-center column`},{default:n(()=>[h(`div`,Ne,[h(`div`,Pe,a(e.$t(`createPage.title`)),1),h(`div`,Fe,[h(`div`,Ie,[h(`span`,Le,[s(_,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),h(`span`,Re,a(Kt.value?.displayName??e.$t(`createPage.claudeCode`)),1)]),s(ye),s(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:M.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,disable:Q.value,onClick:Mn},{default:n(()=>[s(_,{name:`description`,size:`14px`,class:`q-mr-xs`}),f(` `+a(M.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`,`disable`]),s(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:Y.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,disable:Q.value,onClick:Pn},{default:n(()=>[s(_,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),f(` `+a(Y.value?e.$t(`createPage.sentryEnabled`):e.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`,`disable`])]),s(v,{color:`grey-9`}),s(ce,{name:`slide`},{default:n(()=>[M.value?(r(),m(`div`,ze,[s(b,{modelValue:j.value,"onUpdate:modelValue":i[0]||=e=>j.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:n(()=>[s(_,{name:`link`,size:`16px`,color:G.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),j.value.trim()&&!G.value?(r(),m(`div`,Be,a(e.$t(`createPage.notionValidation`)),1)):d(``,!0),G.value?(r(),m(`div`,Ve,a(e.$t(`createPage.notionAutoExtract`)),1)):d(``,!0),G.value&&Cn.value?(r(),m(`div`,He,[h(`div`,Ue,[s(_,{name:`info`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),f(` `+a(e.$t(`createPage.notionPanelChoiceLabel`)),1)]),h(`div`,We,[h(`button`,{type:`button`,class:oe([`peek-card col`,{"peek-card--active":K.value===`panel`}]),onClick:i[1]||=e=>K.value=`panel`},[s(_,{name:`article`,size:`22px`,class:`peek-card-icon`}),h(`div`,Ge,[h(`div`,Ke,a(e.$t(`createPage.notionPanelOption`)),1),h(`div`,qe,a(e.$t(`createPage.notionPanelOptionDesc`)),1)]),K.value===`panel`?(r(),l(_,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):d(``,!0)],2),h(`button`,{type:`button`,class:oe([`peek-card col`,{"peek-card--active":K.value===`parent`}]),onClick:i[2]||=e=>K.value=`parent`},[s(_,{name:`folder_open`,size:`22px`,class:`peek-card-icon`}),h(`div`,Je,[h(`div`,Ye,a(e.$t(`createPage.notionParentOption`)),1),h(`div`,Xe,a(e.$t(`createPage.notionParentOptionDesc`)),1)]),K.value===`parent`?(r(),l(_,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):d(``,!0)],2)])])):d(``,!0)])):d(``,!0)]),_:1}),M.value?(r(),l(v,{key:0,color:`grey-9`})):d(``,!0),s(ce,{name:`slide`},{default:n(()=>[Y.value?(r(),m(`div`,Ze,[s(b,{modelValue:Z.value,"onUpdate:modelValue":i[3]||=e=>Z.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:n(()=>[s(_,{name:`link`,size:`16px`,color:Nn.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Z.value.trim()&&!Nn.value?(r(),m(`div`,Qe,a(e.$t(`createPage.sentryValidation`)),1)):d(``,!0),Nn.value?(r(),m(`div`,$e,a(e.$t(`createPage.sentryAutoExtract`)),1)):d(``,!0)])):d(``,!0)]),_:1}),Y.value?(r(),l(v,{key:1,color:`grey-9`})):d(``,!0),h(`div`,et,[s(b,{modelValue:Lt.value,"onUpdate:modelValue":i[4]||=e=>Lt.value=e,borderless:``,dense:``,placeholder:M.value&&G.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),s(v,{color:`grey-9`}),h(`div`,tt,[s(b,{ref_key:`descriptionRef`,ref:Rt,modelValue:O.value,"onUpdate:modelValue":i[5]||=e=>O.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:[pn,se(g(qn,[`ctrl`]),[`enter`]),se(g(qn,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`]),h(`div`,nt,[A.value?(r(),m(`div`,rt,[s(he,{size:`14px`,color:`amber-6`,class:`q-mr-xs`}),h(`span`,null,a(e.$t(`voice.transcribing`)),1)])):d(``,!0),s(y,{flat:``,dense:``,size:`sm`,icon:A.value?`hourglass_top`:k.value?`mic`:`mic_none`,color:k.value?`red-5`:A.value?`amber-6`:`grey-6`,disable:!Wt.value||A.value,class:oe({"voice-btn--recording":k.value}),onMousedown:g(mn,[`prevent`]),onMouseup:g(W,[`prevent`]),onMouseleave:g(W,[`prevent`]),onTouchstart:g(mn,[`prevent`]),onTouchend:g(W,[`prevent`])},{default:n(()=>[s(C,null,{default:n(()=>[f(a(A.value?e.$t(`voice.transcribing`):k.value?e.$t(`voice.recording`):e.$t(`voice.holdToTalk`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`disable`,`class`])]),c(on)&&c(U).length>0?(r(),l(Te,{key:0,class:`create-slash-popup`,"grouped-dropdown":c(sn),"flat-dropdown":c(U),"selected-index":c(H),onSelect:fn},null,8,[`grouped-dropdown`,`flat-dropdown`,`selected-index`])):d(``,!0)]),s(v,{color:`grey-9`}),Dn.value?(r(),m(ie,{key:2},[h(`div`,it,a(e.$t(`createPage.manualHint`)),1),s(_e,{dark:``,dense:``,label:e.$t(`createPage.tasks`,{count:q.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:n(()=>[h(`div`,at,[h(`div`,ot,[s(b,{modelValue:Tn.value,"onUpdate:modelValue":i[6]||=e=>Tn.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:se(g(On,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),s(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Tn.value.trim(),onClick:On},{default:n(()=>[s(C,null,{default:n(()=>[f(a(e.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(r(!0),m(ie,null,te(q.value,(t,i)=>(r(),m(`div`,{key:`task-${i}`,class:`row items-center q-py-xs manual-item`},[h(`span`,st,a(t),1),s(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>kn(i)},{default:n(()=>[s(C,null,{default:n(()=>[f(a(e.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),s(_e,{dark:``,dense:``,label:e.$t(`createPage.acceptanceCriteria`,{count:J.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:n(()=>[h(`div`,ct,[h(`div`,lt,[s(b,{modelValue:En.value,"onUpdate:modelValue":i[7]||=e=>En.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:se(g(An,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),s(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!En.value.trim(),onClick:An},{default:n(()=>[s(C,null,{default:n(()=>[f(a(e.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(r(!0),m(ie,null,te(J.value,(t,i)=>(r(),m(`div`,{key:`crit-${i}`,class:`row items-center q-py-xs manual-item`},[h(`span`,ut,a(t),1),s(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>jn(i)},{default:n(()=>[s(C,null,{default:n(()=>[f(a(e.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),s(v,{color:`grey-9`})],64)):d(``,!0),h(`div`,dt,[h(`div`,ft,[qt.value.length>0?(r(),m(`div`,pt,[s(w,{modelValue:z.value,"onUpdate:modelValue":i[8]||=e=>z.value=e,options:qt.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:n(()=>[h(`span`,mt,[s(_,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),f(` `+a(qt.value.find(e=>e.value===z.value)?.label??z.value)+` `,1),s(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:n(()=>[s(C,null,{default:n(()=>[f(a(e.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])):d(``,!0),h(`div`,ht,[s(w,{modelValue:N.value,"onUpdate:modelValue":i[9]||=e=>N.value=e,options:bn.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:n(()=>[h(`span`,gt,[f(a(bn.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),s(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:n(({opt:e,itemProps:r})=>[s(x,t(r,{class:`model-option`}),{default:n(()=>[s(ge,null,{default:n(()=>[s(S,{class:`text-white`},{default:n(()=>[f(a(e.label),1)]),_:2},1024),s(S,{caption:``,class:`text-grey-5`},{default:n(()=>[f(a(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),h(`div`,_t,[s(w,{modelValue:P.value,"onUpdate:modelValue":i[10]||=e=>P.value=e,options:Sn.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:n(()=>[h(`span`,vt,[s(_,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),f(` `+a(Sn.value.find(e=>e.value===P.value)?.label??P.value)+` `,1),s(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:n(({opt:e,itemProps:t})=>[s(x,re(ne(t)),{default:n(()=>[s(ge,null,{default:n(()=>[s(S,{class:`text-white`},{default:n(()=>[f(a(e.label),1)]),_:2},1024),s(S,{caption:``,class:`text-grey-5`},{default:n(()=>[f(a(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),h(`div`,yt,[s(w,{modelValue:B.value,"onUpdate:modelValue":i[11]||=e=>B.value=e,options:Qt.value,disable:X.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,"option-disable":e=>e.disabled===!0},{selected:n(()=>[h(`span`,bt,[s(_,{name:Zt.value,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),f(` `+a(Qt.value.find(e=>e.value===B.value)?.label??B.value)+` `,1),X.value?d(``,!0):(r(),l(_,{key:0,name:`expand_more`,size:`12px`,color:`grey-5`}))])]),default:n(()=>[s(C,null,{default:n(()=>[f(a(X.value?e.$t(`agentPermissionMode.autoLoopLocked`):e.$t(`agentPermissionMode.tooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`,`disable`,`option-disable`])])]),h(`div`,xt,[h(`div`,St,[s(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:X.value?`autorenew`:`sync_disabled`,color:X.value?`amber-4`:`grey-5`,label:e.$t(`autoLoop.startInMode`),class:`skip-setup-btn`,onClick:i[12]||=e=>X.value=!X.value},{default:n(()=>[s(C,null,{default:n(()=>[f(a(e.$t(`autoLoop.startInMode`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),h(`div`,Ct,[s(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:R.value?`play_disabled`:`play_circle`,color:R.value?`orange-4`:`grey-5`,label:e.$t(`createPage.skipSetupScript`),class:`skip-setup-btn`,onClick:i[13]||=e=>R.value=!R.value},{default:n(()=>[s(C,null,{default:n(()=>[f(a(e.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),h(`div`,wt,[s(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:`folder_open`,color:Q.value?`cyan-4`:`grey-5`,label:Q.value?e.$t(`createPage.attachWorktreeEnabled`):e.$t(`createPage.attachWorktreeToggle`),class:`skip-setup-btn`,onClick:Rn},null,8,[`color`,`label`])])]),h(`div`,Tt,[h(`div`,Et,[s(w,{modelValue:F.value,"onUpdate:modelValue":i[14]||=e=>F.value=e,options:It.value,dense:``,borderless:``,"use-input":``,"fill-input":``,"hide-selected":``,"input-debounce":`0`,"new-value-mode":`add`,class:`bottom-select rounded-borders repo-select`,"hide-dropdown-icon":``,"input-class":F.value?``:`repo-input-empty`,placeholder:e.$t(`createPage.projectPath`),behavior:c(E).projectPaths.length>0?`menu`:`dialog`,onFilter:Hn,onInputValue:i[15]||=e=>{F.value=e}},{prepend:n(()=>[s(_,{name:`folder`,size:`14px`,color:`grey-5`})]),"no-option":n(()=>[s(x,null,{default:n(()=>[s(ge,{class:`text-grey-6 text-caption`},{default:n(()=>[f(a(e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`])]),Q.value?d(``,!0):(r(),m(`div`,Dt,[s(w,{modelValue:L.value,"onUpdate:modelValue":i[16]||=e=>L.value=e,options:Jt.value,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:n(()=>[h(`span`,Ot,[s(_,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),f(` `+a(L.value)+`/ `,1),s(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:n(()=>[s(C,null,{default:n(()=>[f(a(e.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])),Q.value?(r(),m(`div`,kt,[s(w,{modelValue:$.value,"onUpdate:modelValue":i[17]||=e=>$.value=e,options:Fn.value,"option-label":`branch`,"option-value":`path`,"emit-value":``,"map-options":``,"use-input":``,dense:``,borderless:``,class:`bottom-select rounded-borders worktree-select`,"hide-dropdown-icon":``,loading:In.value,disable:!F.value.trim()||In.value},{selected:n(()=>[h(`span`,At,[s(_,{name:`folder_open`,size:`12px`,color:`cyan-5`,class:`q-mr-xs`}),f(` `+a($.value?Fn.value.find(e=>e.path===$.value)?.branch??$.value:e.$t(`createPage.worktreePickerLabel`))+` `,1),s(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:n(e=>[s(x,re(ne(e.itemProps)),{default:n(()=>[s(ge,null,{default:n(()=>[s(S,null,{default:n(()=>[f(a(e.opt.branch),1)]),_:2},1024),s(S,{caption:``},{default:n(()=>[f(a(e.opt.path),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":n(()=>[s(x,null,{default:n(()=>[s(ge,{class:`text-grey-6 text-caption`},{default:n(()=>[f(a(F.value.trim()?e.$t(`createPage.noOrphanWorktrees`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])):d(``,!0),h(`div`,jt,[s(w,{modelValue:I.value,"onUpdate:modelValue":i[18]||=e=>I.value=e,options:$t.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,"use-input":``,"input-debounce":`0`,loading:en.value,disable:!F.value.trim()||en.value,onFilter:nn},{selected:n(()=>[h(`span`,Mt,[s(_,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),f(` `+a(I.value??e.$t(`createPage.branch`))+` `,1),s(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":n(()=>[s(x,null,{default:n(()=>[s(ge,{class:`text-grey-6 text-caption`},{default:n(()=>[f(a(F.value.trim()?e.$t(`createPage.noBranches`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])])]),h(`div`,Nt,[s(y,{label:e.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:tn.value,disable:tn.value||Q.value&&!$.value,onClick:qn},null,8,[`label`,`loading`,`disable`])])]),h(`div`,Pt,a(M.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-ec3635ca`]]);export{D as default};