@loicngr/kobo 1.7.29 → 1.7.31

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 (66) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/server/routes/workspaces.js +73 -7
  3. package/dist/server/services/forge/github/provider.js +6 -2
  4. package/dist/server/services/forge/gitlab/provider.js +3 -0
  5. package/dist/server/services/forge/types.js +13 -0
  6. package/dist/server/services/pr-watcher-service.js +13 -1
  7. package/dist/server/services/settings-service.js +13 -0
  8. package/dist/server/utils/git-ops.js +36 -0
  9. package/dist/shared/models.js +12 -0
  10. package/package.json +2 -2
  11. package/src/client/dist/spa/assets/{ActivityFeed-rio_ru8s.js → ActivityFeed-DFMce5VW.js} +1 -1
  12. package/src/client/dist/spa/assets/{ChangelogPage-Dk8nKtM0.js → ChangelogPage-BZEr6iNh.js} +1 -1
  13. package/src/client/dist/spa/assets/{ClosePopup-BWYh08p9.js → ClosePopup-CY16K9Yi.js} +1 -1
  14. package/src/client/dist/spa/assets/CreatePage-CE-ljszo.css +1 -0
  15. package/src/client/dist/spa/assets/CreatePage-geIEPibR.js +2 -0
  16. package/src/client/dist/spa/assets/{DiffViewer-deM4uqPU.js → DiffViewer-C8yPZaCf.js} +3 -3
  17. package/src/client/dist/spa/assets/{HealthPage-DAA51STa.js → HealthPage-DAk5EKO_.js} +1 -1
  18. package/src/client/dist/spa/assets/{MainLayout-DrY2_qyP.js → MainLayout-CNNcKilU.js} +3 -3
  19. package/src/client/dist/spa/assets/{MainLayout-4vhZRrU2.css → MainLayout-DTW0ySzA.css} +1 -1
  20. package/src/client/dist/spa/assets/{QExpansionItem-CiBP4NiY.js → QExpansionItem-_8j8FyQg.js} +1 -1
  21. package/src/client/dist/spa/assets/{QMenu-CoPEAblj.js → QMenu-BXssnk-g.js} +1 -1
  22. package/src/client/dist/spa/assets/{QScrollArea-CZVgBUBp.js → QScrollArea-_Mvx2t8o.js} +1 -1
  23. package/src/client/dist/spa/assets/{QScrollObserver-CAlbLisQ.js → QScrollObserver-C6P7wS4h.js} +1 -1
  24. package/src/client/dist/spa/assets/{QSelect-Dm7qaLfk.js → QSelect-4UzZxoyw.js} +1 -1
  25. package/src/client/dist/spa/assets/{QTooltip-CwBZU_bs.js → QTooltip-DyIRS1GH.js} +1 -1
  26. package/src/client/dist/spa/assets/{SearchPage-CMH0AoRw.js → SearchPage-K04ns4hU.js} +1 -1
  27. package/src/client/dist/spa/assets/SettingsPage-D0WcKagG.js +9 -0
  28. package/src/client/dist/spa/assets/SettingsPage-D1Ap5wB7.css +1 -0
  29. package/src/client/dist/spa/assets/{TouchPan-DXGxNMLq.js → TouchPan-DZZEI8eo.js} +1 -1
  30. package/src/client/dist/spa/assets/{WorkspacePage-CH3k_9_s.js → WorkspacePage-DNO_bRMJ.js} +3 -3
  31. package/src/client/dist/spa/assets/{build-path-tree-B9aeh1tv.js → build-path-tree-BUfhgOSH.js} +1 -1
  32. package/src/client/dist/spa/assets/{cssMode-DmArionU.js → cssMode-0MvCYrRV.js} +1 -1
  33. package/src/client/dist/spa/assets/{editor.api-CseR9xvC.js → editor.api-DYWJPPWs.js} +1 -1
  34. package/src/client/dist/spa/assets/{editor.main-Yih57bDS.js → editor.main-B8in8NwN.js} +3 -3
  35. package/src/client/dist/spa/assets/{engineFeatures-d1kZ8NXB.js → engineFeatures-BdTa0rX6.js} +1 -1
  36. package/src/client/dist/spa/assets/{expand-template-D_3H5Och.js → expand-template-CP-8YIJC.js} +1 -1
  37. package/src/client/dist/spa/assets/{freemarker2-Cd59aTHU.js → freemarker2-Dx4cVLM0.js} +1 -1
  38. package/src/client/dist/spa/assets/{handlebars-CeswicPh.js → handlebars-CwM3UEBZ.js} +1 -1
  39. package/src/client/dist/spa/assets/{html-C3-kLMMe.js → html-2JtDgifC.js} +1 -1
  40. package/src/client/dist/spa/assets/{htmlMode-DQxZ0n2e.js → htmlMode-B8N8GxKE.js} +1 -1
  41. package/src/client/dist/spa/assets/i18n-C80g9cfR.js +1 -0
  42. package/src/client/dist/spa/assets/index-BTVVGg4f.js +82 -0
  43. package/src/client/dist/spa/assets/{javascript-0NpnFHx9.js → javascript-CTXs71Pa.js} +1 -1
  44. package/src/client/dist/spa/assets/{jsonMode-Byj6sx5w.js → jsonMode-Cnw0tYit.js} +1 -1
  45. package/src/client/dist/spa/assets/{kobo-commands-B_DBKQxq.js → kobo-commands-DLc7j2_p.js} +1 -1
  46. package/src/client/dist/spa/assets/{liquid-CzcaXBnO.js → liquid-B1BeK8RP.js} +1 -1
  47. package/src/client/dist/spa/assets/{mdx-Dl6UUR_U.js → mdx-DLwxZ3wR.js} +1 -1
  48. package/src/client/dist/spa/assets/{monaco.contribution-mzaMwnEg.js → monaco.contribution-B3kpNNij.js} +2 -2
  49. package/src/client/dist/spa/assets/{notifications-l1Pxijve.js → notifications-BtVr85fZ.js} +1 -1
  50. package/src/client/dist/spa/assets/permissionModes-r9UZvpVs.js +1 -0
  51. package/src/client/dist/spa/assets/{python-BFAu7VF2.js → python-C5L3E7X0.js} +1 -1
  52. package/src/client/dist/spa/assets/{razor-BET2CB_3.js → razor-DCXiAjxH.js} +1 -1
  53. package/src/client/dist/spa/assets/{render-chat-markdown-DsbgZODM.js → render-chat-markdown-DDQr5Zs5.js} +1 -1
  54. package/src/client/dist/spa/assets/{tsMode-ORpv-QPD.js → tsMode-Bu5FUVgw.js} +1 -1
  55. package/src/client/dist/spa/assets/{typescript-DGcONjjW.js → typescript-B-pS9HtR.js} +1 -1
  56. package/src/client/dist/spa/assets/{use-onboarding-B9TeTfkj.js → use-onboarding-CzGgvyS9.js} +1 -1
  57. package/src/client/dist/spa/assets/{xml-Cs4DTg3L.js → xml-Dgpxgles.js} +1 -1
  58. package/src/client/dist/spa/assets/{yaml-HxNN05si.js → yaml-D219wUJe.js} +1 -1
  59. package/src/client/dist/spa/index.html +2 -2
  60. package/src/client/dist/spa/assets/CreatePage-BmGIFI8W.js +0 -2
  61. package/src/client/dist/spa/assets/CreatePage-DDuStqsB.css +0 -1
  62. package/src/client/dist/spa/assets/SettingsPage-B7dDhXCS.css +0 -1
  63. package/src/client/dist/spa/assets/SettingsPage-DH-KTis9.js +0 -9
  64. package/src/client/dist/spa/assets/i18n-IlYZHxVd.js +0 -1
  65. package/src/client/dist/spa/assets/index-C0H1sHuD.js +0 -82
  66. package/src/client/dist/spa/assets/permissionModes-BUhr5Wdx.js +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@ 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.31
8
+
9
+ - feat: ready-to-merge status, open-pr fix, new models, dep audit
10
+
11
+ ## 1.7.30
12
+
13
+ - feat: open-in-terminal button + git creation/purge fixes
14
+
7
15
  ## 1.7.29
8
16
 
9
17
  - feat: git working-tree tooling, template reset, diff label
@@ -222,7 +222,10 @@ app.post('/', migrationGuard, async (c) => {
222
222
  // which is what Sentry auto-close recognises in commit messages.
223
223
  const detectedTicketId = notionContent?.ticketId || sentryContent?.issueId || body.name.match(/[A-Z]+-\d+/i)?.[0];
224
224
  if (detectedTicketId && !workingBranch.toLowerCase().includes(detectedTicketId.toLowerCase())) {
225
- const ticketPrefix = detectedTicketId.toUpperCase();
225
+ // Sanitize + length-cap the ticket id: a Sentry issue id / title can carry
226
+ // odd characters (PHP namespace `Foo\Bar\Baz`) or be long, which would
227
+ // otherwise yield an invalid or too-long branch that fails `git worktree add`.
228
+ const ticketPrefix = gitOps.slugifyBranchSegment(detectedTicketId, 40).toUpperCase();
226
229
  const slashIdx = workingBranch.indexOf('/');
227
230
  const typePrefix = slashIdx >= 0 ? workingBranch.slice(0, slashIdx + 1) : 'feature/';
228
231
  // Use Notion/Sentry title or body name for the slug — all have proper accented
@@ -235,7 +238,8 @@ app.post('/', migrationGuard, async (c) => {
235
238
  .replace(/[^a-z0-9]+/g, '-')
236
239
  .replace(/^-|-$/g, '')
237
240
  .substring(0, 50);
238
- workingBranch = `${typePrefix}${ticketPrefix}--${titleSlug}`;
241
+ const safeSlug = titleSlug || 'task';
242
+ workingBranch = ticketPrefix ? `${typePrefix}${ticketPrefix}--${safeSlug}` : `${typePrefix}${safeSlug}`;
239
243
  }
240
244
  }
241
245
  // Compute the project slug once and reuse it for both the prospective
@@ -383,7 +387,21 @@ app.post('/', migrationGuard, async (c) => {
383
387
  }
384
388
  catch (err) {
385
389
  const message = err instanceof Error ? err.message : String(err);
386
- workspaceService.updateWorkspaceStatus(workspace.id, 'error');
390
+ // Roll back the half-created workspace: a failed worktree creation must NOT
391
+ // leave an orphan record behind. Best-effort cleanup of any partial worktree
392
+ // dir git may have produced, then delete the just-inserted workspace row.
393
+ try {
394
+ worktreeService.removeWorktree(body.projectPath, prospectiveWorktreePath);
395
+ }
396
+ catch {
397
+ // worktree may never have been registered — ignore
398
+ }
399
+ try {
400
+ workspaceService.deleteWorkspace(workspace.id);
401
+ }
402
+ catch (delErr) {
403
+ console.error('[workspaces] rollback deleteWorkspace failed:', delErr);
404
+ }
387
405
  return c.json({ error: `Failed to create worktree: ${message}` }, 500);
388
406
  }
389
407
  }
@@ -1783,6 +1801,46 @@ app.post('/:id/open-editor', (c) => {
1783
1801
  return c.json({ error: message }, 500);
1784
1802
  }
1785
1803
  });
1804
+ /** Open the workspace worktree in the user's configured terminal emulator. */
1805
+ app.post('/:id/open-terminal', async (c) => {
1806
+ try {
1807
+ const id = c.req.param('id');
1808
+ const workspace = workspaceService.getWorkspace(id);
1809
+ if (!workspace)
1810
+ return c.json({ error: `Workspace '${id}' not found` }, 404);
1811
+ const globalSettings = settingsService.getGlobalSettings();
1812
+ if (!globalSettings.terminalCommand.trim()) {
1813
+ return c.json({ error: 'No terminal command configured' }, 400);
1814
+ }
1815
+ const worktreePath = workspace.worktreePath;
1816
+ if (!fs.existsSync(worktreePath)) {
1817
+ return c.json({ error: `Worktree path does not exist: ${worktreePath}` }, 400);
1818
+ }
1819
+ // Split on whitespace, then substitute the optional {path} placeholder. The
1820
+ // terminal also gets cwd = worktree, so emulators that inherit the cwd
1821
+ // (kitty, alacritty, wezterm) work with no placeholder, while those that
1822
+ // need an explicit flag use {path} (gnome-terminal --working-directory={path}).
1823
+ const tokens = globalSettings.terminalCommand
1824
+ .trim()
1825
+ .split(/\s+/)
1826
+ .map((t) => t.replace(/\{path\}/g, worktreePath));
1827
+ const [cmd, ...args] = tokens;
1828
+ // Await the spawn so a bad command (ENOENT) surfaces as a clear 400 instead of
1829
+ // a fire-and-forget "success" — same pattern as open-file-manager.
1830
+ try {
1831
+ await waitForSpawn(cmd, args, { cwd: worktreePath });
1832
+ }
1833
+ catch (err) {
1834
+ const msg = err instanceof Error ? err.message : String(err);
1835
+ return c.json({ error: `Failed to launch terminal '${globalSettings.terminalCommand}': ${msg}` }, 400);
1836
+ }
1837
+ return c.json({ success: true });
1838
+ }
1839
+ catch (err) {
1840
+ const message = err instanceof Error ? err.message : String(err);
1841
+ return c.json({ error: message }, 500);
1842
+ }
1843
+ });
1786
1844
  /** Open the workspace worktree in the user's configured file manager. */
1787
1845
  app.post('/:id/open-file-manager', async (c) => {
1788
1846
  try {
@@ -1818,9 +1876,9 @@ app.post('/:id/open-file-manager', async (c) => {
1818
1876
  });
1819
1877
  /** Spawn a detached process and resolve as soon as it has started (or reject
1820
1878
  * on launch failure). Caller doesn't await process completion. */
1821
- function waitForSpawn(command, args) {
1879
+ function waitForSpawn(command, args, options = {}) {
1822
1880
  return new Promise((resolve, reject) => {
1823
- const child = spawn(command, args, { detached: true, stdio: 'ignore' });
1881
+ const child = spawn(command, args, { detached: true, stdio: 'ignore', ...options });
1824
1882
  let settled = false;
1825
1883
  child.once('spawn', () => {
1826
1884
  if (settled)
@@ -2931,9 +2989,17 @@ app.post('/:id/open-pr', async (c) => {
2931
2989
  if (!lsRemoteOut.trim()) {
2932
2990
  return c.json({ error: 'Branch is not on remote', code: 'branch_not_pushed' }, 409);
2933
2991
  }
2934
- // Ensure all local commits are pushed
2992
+ // Ensure all local commits are pushed. Compare against origin/<workingBranch>
2993
+ // explicitly — NOT `@{u}`: the worktree is created from origin/<sourceBranch>
2994
+ // (worktree-service.createWorktree), so the branch's upstream tracks the BASE.
2995
+ // `@{u}..HEAD` would then count the branch's own commits and falsely report
2996
+ // "unpushed" for any branch pushed without -u (e.g. by the agent). This mirrors
2997
+ // getUnpushedCountAsync, the ref the GitPanel's "pushed" label already uses.
2935
2998
  try {
2936
- const { stdout } = await execFileAsync('git', ['rev-list', '@{u}..HEAD', '--count'], { cwd: worktreePath });
2999
+ const remoteRef = `origin/${workspace.workingBranch}`;
3000
+ const { stdout } = await execFileAsync('git', ['rev-list', `${remoteRef}..HEAD`, '--count'], {
3001
+ cwd: worktreePath,
3002
+ });
2937
3003
  const countStr = stdout.trim();
2938
3004
  const count = parseInt(countStr, 10) || 0;
2939
3005
  if (count > 0) {
@@ -1,6 +1,7 @@
1
1
  // src/server/services/forge/github/provider.ts
2
2
  import { execFile } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
+ import { deriveReadyToMerge } from '../types.js';
4
5
  const execFileAsync = promisify(execFile);
5
6
  // NOTE: `reviewThreads` is intentionally NOT in this list.
6
7
  // `gh pr view --json reviewThreads` is rejected with `Unknown JSON field`
@@ -54,13 +55,15 @@ function mapGhPrToSnapshot(raw) {
54
55
  rollup = 'SUCCESS';
55
56
  }
56
57
  const unresolvedReviewThreadsCount = (raw.reviewThreads ?? []).reduce((a, t) => a + (t.isResolved ? 0 : 1), 0);
58
+ const state = raw.state;
59
+ const reviewDecision = raw.reviewDecision ?? null;
57
60
  return {
58
61
  number: raw.number,
59
62
  title: raw.title,
60
63
  url: raw.url,
61
- state: raw.state,
64
+ state,
62
65
  base: raw.baseRefName ?? '',
63
- reviewDecision: raw.reviewDecision ?? null,
66
+ reviewDecision,
64
67
  author: { login: raw.author?.login ?? '' },
65
68
  assignees: (raw.assignees ?? []).map((a) => ({ login: a.login })),
66
69
  reviewers,
@@ -68,6 +71,7 @@ function mapGhPrToSnapshot(raw) {
68
71
  ci: { rollup, checks },
69
72
  updatedAt: raw.updatedAt ?? '',
70
73
  unresolvedReviewThreadsCount,
74
+ readyToMerge: deriveReadyToMerge({ state, ci: { rollup, checks }, reviewDecision, reviewers }),
71
75
  };
72
76
  }
73
77
  /** Map an execFile rejection to a ForgeAvailability reason. */
@@ -1,6 +1,7 @@
1
1
  // src/server/services/forge/gitlab/provider.ts
2
2
  import { execFile } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
+ import { deriveReadyToMerge } from '../types.js';
4
5
  const execFileAsync = promisify(execFile);
5
6
  /** Map GitLab MR state to the normalised PrSnapshot state. */
6
7
  function mapState(state) {
@@ -29,6 +30,7 @@ function mapGlabMrToSnapshot(raw) {
29
30
  ci: { rollup: null, checks: [] },
30
31
  updatedAt: raw.updated_at ?? '',
31
32
  unresolvedReviewThreadsCount: 0,
33
+ readyToMerge: false,
32
34
  };
33
35
  }
34
36
  /** Map a GitLab pipeline status string to the normalised CI rollup. */
@@ -147,6 +149,7 @@ export const gitlabProvider = {
147
149
  return null;
148
150
  const snapshot = mapGlabMrToSnapshot(JSON.parse(raw));
149
151
  snapshot.ci = await fetchGlabCi(repoPath, branch);
152
+ snapshot.readyToMerge = deriveReadyToMerge(snapshot);
150
153
  return snapshot;
151
154
  }
152
155
  catch {
@@ -1,4 +1,17 @@
1
1
  // src/server/services/forge/types.ts
2
+ /**
3
+ * True when nothing blocks merging the PR: it is open, CI is not failing or
4
+ * in-flight (green `SUCCESS` or absent `null` — matching GitHub's "Ready to
5
+ * merge"), and no reviewer is actively requesting changes. `null` covers repos
6
+ * or PRs with no CI configured. Pending/failure/cancelled/neutral are NOT ready.
7
+ * Mirrors the front-end blocking rule — trust a reviewer still in
8
+ * CHANGES_REQUESTED, not the sticky `reviewDecision` alone.
9
+ */
10
+ export function deriveReadyToMerge(s) {
11
+ const blocked = s.reviewDecision === 'CHANGES_REQUESTED' && s.reviewers.some((r) => r.state === 'CHANGES_REQUESTED');
12
+ const ciOk = s.ci.rollup === 'SUCCESS' || s.ci.rollup === null;
13
+ return s.state === 'OPEN' && ciOk && !blocked;
14
+ }
2
15
  /** Thrown by write operations when the forge cannot service them. */
3
16
  export class ForgeUnavailableError extends Error {
4
17
  code = 'forge_unavailable';
@@ -1,5 +1,5 @@
1
1
  import fs from 'node:fs';
2
- import { fetchSourceBranchAsync } from '../utils/git-ops.js';
2
+ import { fetchSourceBranchAsync, isGitWorktree } from '../utils/git-ops.js';
3
3
  import { stopDevServer } from './dev-server-service.js';
4
4
  import { getForgeProvider } from './forge/registry.js';
5
5
  import { resolveForge } from './forge/resolve.js';
@@ -72,6 +72,13 @@ function autoRestoreManuallyRecreatedWorktrees() {
72
72
  continue;
73
73
  if (!fs.existsSync(ws.worktreePath))
74
74
  continue;
75
+ // Only a genuinely recreated worktree (gh pr checkout / git worktree add)
76
+ // should trigger restore. A purge that failed to fully remove the folder
77
+ // (e.g. root-owned Docker files) leaves a residual non-git directory that
78
+ // satisfies existsSync but is NOT a valid worktree — restoring it would
79
+ // wrongly un-archive the workspace and flood git fetches with "(null)".
80
+ if (!isGitWorktree(ws.worktreePath))
81
+ continue;
75
82
  try {
76
83
  const restored = restoreWorktreeFromDisk(ws.id);
77
84
  emitEphemeral(ws.id, 'workspace:worktree-restored', { workspace: restored });
@@ -216,6 +223,11 @@ export async function checkPrStatuses() {
216
223
  if (prev.ci.rollup !== 'FAILURE' && pr.ci.rollup === 'FAILURE') {
217
224
  markUnread(ws.id);
218
225
  }
226
+ const notBusy = !['extracting', 'brainstorming', 'executing'].includes(ws.status);
227
+ if (notBusy && !prev.readyToMerge && pr.readyToMerge) {
228
+ emitEphemeral(ws.id, 'pr:ready-to-merge', { prNumber: pr.number, prUrl: pr.url });
229
+ markUnread(ws.id);
230
+ }
219
231
  }
220
232
  // Cache the snapshot for the next tick. For non-OPEN PRs (closed /
221
233
  // merged) we preserve the previous `base` if the fresh snapshot is
@@ -607,6 +607,17 @@ const settingsMigrations = [
607
607
  }
608
608
  },
609
609
  },
610
+ {
611
+ version: 37,
612
+ name: 'add-terminal-command',
613
+ migrate: ({ global }) => {
614
+ // Empty by default — the "Open in terminal" button only shows
615
+ // when the user explicitly fills it (`xterm`, `gnome-terminal`, `wt`…).
616
+ if (typeof global.terminalCommand !== 'string') {
617
+ global.terminalCommand = '';
618
+ }
619
+ },
620
+ },
610
621
  ];
611
622
  /** Current settings schema version — always equals the highest migration version. */
612
623
  export const SETTINGS_SCHEMA_VERSION = settingsMigrations.length > 0 ? settingsMigrations[settingsMigrations.length - 1].version : 0;
@@ -650,6 +661,7 @@ function defaultSettings() {
650
661
  changeSourceBranchScript: DEFAULT_CHANGE_SOURCE_BRANCH_SCRIPT,
651
662
  editorCommand: '',
652
663
  fileManagerCommand: '',
664
+ terminalCommand: '',
653
665
  autoPurgeOnPrMerged: false,
654
666
  browserNotifications: true,
655
667
  audioNotifications: true,
@@ -989,6 +1001,7 @@ export function updateGlobalSettings(data) {
989
1001
  'changeSourceBranchScript',
990
1002
  'editorCommand',
991
1003
  'fileManagerCommand',
1004
+ 'terminalCommand',
992
1005
  'autoPurgeOnPrMerged',
993
1006
  'browserNotifications',
994
1007
  'audioNotifications',
@@ -928,6 +928,42 @@ export function getWorkingTreeFiles(repoPath) {
928
928
  return [];
929
929
  }
930
930
  }
931
+ /**
932
+ * True if `repoPath` is the root of a valid git work tree — a real repo (`.git`
933
+ * directory) or a linked worktree (`.git` file). A purge leftover (no `.git`, or
934
+ * a dead `.git` link pointing at a pruned gitdir) returns false, so it is never
935
+ * mistaken for a manually recreated worktree. Requires a LOCAL `.git` entry so a
936
+ * residual directory nested inside a parent repo doesn't resolve to that parent.
937
+ * Best-effort: false on any error.
938
+ */
939
+ export function isGitWorktree(repoPath) {
940
+ try {
941
+ if (!existsSync(join(repoPath, '.git')))
942
+ return false;
943
+ return git(repoPath, ['rev-parse', '--is-inside-work-tree']).trim() === 'true';
944
+ }
945
+ catch {
946
+ return false;
947
+ }
948
+ }
949
+ /**
950
+ * Turn an arbitrary string into a git-ref-safe segment, capped to `maxLen`.
951
+ * Strips accents (é→e), collapses every run of non-alphanumeric characters
952
+ * (backslashes, colons, spaces, dots… — all unsafe or awkward in a ref/path)
953
+ * into a single hyphen, and trims leading/trailing hyphens (including one the
954
+ * length cap may leave). Preserves case — the caller upper/lower-cases as needed.
955
+ * Used to build the working branch from Notion/Sentry titles + issue IDs so an
956
+ * over-long or odd-charactered source can never produce an invalid worktree.
957
+ */
958
+ export function slugifyBranchSegment(input, maxLen = 50) {
959
+ return input
960
+ .normalize('NFD')
961
+ .replace(/[\u0300-\u036f]/g, '')
962
+ .replace(/[^A-Za-z0-9]+/g, '-')
963
+ .replace(/^-+|-+$/g, '')
964
+ .slice(0, maxLen)
965
+ .replace(/-+$/g, '');
966
+ }
931
967
  /**
932
968
  * Count commits ahead of `origin/<workingBranch>`. Returns `-1` when the remote
933
969
  * ref does not exist (i.e. the branch has never been pushed).
@@ -5,6 +5,18 @@ export const CLAUDE_MODELS = [
5
5
  i18nLabelKey: 'model.auto',
6
6
  i18nDescriptionKey: 'model.autoDescription',
7
7
  },
8
+ {
9
+ id: 'claude-fable-5',
10
+ label: 'Fable 5',
11
+ i18nLabelKey: 'model.fable5',
12
+ i18nDescriptionKey: 'model.fable5Description',
13
+ },
14
+ {
15
+ id: 'claude-mythos-5',
16
+ label: 'Mythos 5 (Glasswing)',
17
+ i18nLabelKey: 'model.mythos5',
18
+ i18nDescriptionKey: 'model.mythos5Description',
19
+ },
8
20
  {
9
21
  id: 'claude-opus-4-8',
10
22
  label: 'Opus 4.8',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.7.29",
3
+ "version": "1.7.31",
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",
@@ -86,7 +86,7 @@
86
86
  "@types/node": "^25.6.2",
87
87
  "@types/ws": "^8.18.1",
88
88
  "@vitest/runner": "^4.1.5",
89
- "concurrently": "^9.2.1",
89
+ "concurrently": "^10.0.3",
90
90
  "tsx": "^4.21.0",
91
91
  "typescript": "^6.0.3",
92
92
  "vitest": "^4.1.5"
@@ -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-l1Pxijve.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-C0H1sHuD.js";import{t as M}from"./QSpinnerDots-DspFKwCZ.js";import{t as N}from"./QTooltip-CwBZU_bs.js";import{t as ee}from"./QExpansionItem-CiBP4NiY.js";import{t as te}from"./QScrollArea-CZVgBUBp.js";import{i as ne,n as re,t as P}from"./render-chat-markdown-DsbgZODM.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-BtVr85fZ.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-BTVVGg4f.js";import{t as M}from"./QSpinnerDots-DspFKwCZ.js";import{t as N}from"./QTooltip-DyIRS1GH.js";import{t as ee}from"./QExpansionItem-_8j8FyQg.js";import{t as te}from"./QScrollArea-_Mvx2t8o.js";import{i as ne,n as re,t as P}from"./render-chat-markdown-DDQr5Zs5.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-C0H1sHuD.js";import{t as v}from"./render-chat-markdown-DsbgZODM.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-5bnjPnRz.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-BTVVGg4f.js";import{t as v}from"./render-chat-markdown-DDQr5Zs5.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-5bnjPnRz.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-l1Pxijve.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-BtVr85fZ.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};
@@ -0,0 +1 @@
1
+ .create-page[data-v-4c087441]{background-color:#1a1a2e;min-height:100%;padding:48px 24px}.create-inner[data-v-4c087441]{width:100%;max-width:700px}.create-title[data-v-4c087441]{font-size:24px;line-height:1.3}.create-card[data-v-4c087441]{background:#224;border:1px solid #444;overflow:hidden}.card-top-bar[data-v-4c087441]{background:#1e1e3a;min-height:36px}.card-name-wrap[data-v-4c087441]{background:#224;padding:8px 16px 4px}.card-name-wrap[data-v-4c087441] .q-field__control{height:32px;min-height:32px;padding:0}.card-name-wrap[data-v-4c087441] input{color:#e0e0e0;font-size:15px;font-weight:500}.card-name-wrap[data-v-4c087441] input::placeholder{color:#555}.card-textarea-wrap[data-v-4c087441]{background:#224;position:relative}.create-slash-popup[data-v-4c087441]{z-index:9999;position:absolute;top:calc(100% + 4px);left:12px;right:12px}.repo-select[data-v-4c087441]{min-width:160px;max-width:260px}.repo-select[data-v-4c087441] .q-field__prepend{align-items:center;height:auto;padding-top:0}.create-textarea[data-v-4c087441]{color:#d0d0d0;width:100%;padding:12px 16px 4px}.create-textarea[data-v-4c087441] .q-field__control{padding:0}.create-textarea[data-v-4c087441] textarea{color:#d0d0d0;resize:none;min-height:100px;font-size:14px;line-height:1.6}.create-textarea[data-v-4c087441] textarea::placeholder{color:#666}.voice-btn--recording[data-v-4c087441]{animation:1.1s ease-in-out infinite voice-pulse-4c087441}@keyframes voice-pulse-4c087441{0%{opacity:1;transform:scale(1)}50%{opacity:.86;transform:scale(1.06)}to{opacity:1;transform:scale(1)}}.notion-toggle-btn[data-v-4c087441]{background:#333;padding:2px 10px}.notion-url-wrap[data-v-4c087441]{background:#1e1e3a;padding:8px 0 0}.notion-url-input[data-v-4c087441]{padding:0 12px}.notion-url-input[data-v-4c087441] .q-field__control{height:36px;min-height:36px;padding:0}.notion-url-input[data-v-4c087441] input{color:#d0d0d0;font-size:13px}.notion-url-input[data-v-4c087441] input::placeholder{color:#555;font-size:12px}.notion-error[data-v-4c087441],.notion-valid[data-v-4c087441]{padding-bottom:6px}.notion-peek-choice[data-v-4c087441]{padding-top:4px}.peek-card[data-v-4c087441]{cursor:pointer;text-align:left;color:#e0e0e0;font-family:inherit;font-size:inherit;background:#ffffff08;border:1px solid #ffffff14;border-radius:8px;align-items:center;gap:10px;padding:10px 12px;transition:background .15s,border-color .15s,transform .1s;display:flex;position:relative}.peek-card[data-v-4c087441]:hover{background:#ffffff0f;border-color:#6c63ff66}.peek-card[data-v-4c087441]:active{transform:scale(.99)}.peek-card--active[data-v-4c087441]{background:#6c63ff1f;border-color:#6c63ffd9;box-shadow:0 0 0 1px #6c63ff66}.peek-card--active .peek-card-icon[data-v-4c087441]{color:#8a82ff}.peek-card--active .peek-card-title[data-v-4c087441]{color:#fff}.peek-card-icon[data-v-4c087441]{color:#999;flex-shrink:0}.peek-card-text[data-v-4c087441]{flex:1;min-width:0;line-height:1.25}.peek-card-title[data-v-4c087441]{color:#d0d0d0;font-size:12px;font-weight:600}.peek-card-desc[data-v-4c087441]{color:#888;margin-top:2px;font-size:10.5px}.peek-card-check[data-v-4c087441]{flex-shrink:0}.sentry-toggle-btn[data-v-4c087441]{background:#333;padding:2px 10px}.sentry-url-wrap[data-v-4c087441]{background:#1e1e3a;padding:8px 0 0}.sentry-url-input[data-v-4c087441]{padding:0 12px}.sentry-url-input[data-v-4c087441] .q-field__control{height:36px;min-height:36px;padding:0}.sentry-url-input[data-v-4c087441] input{color:#d0d0d0;font-size:13px}.sentry-url-input[data-v-4c087441] input::placeholder{color:#555;font-size:12px}.sentry-error[data-v-4c087441],.sentry-valid[data-v-4c087441]{padding-bottom:6px}.slide-enter-active[data-v-4c087441],.slide-leave-active[data-v-4c087441]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-4c087441],.slide-leave-to[data-v-4c087441]{opacity:0;max-height:0}.slide-enter-to[data-v-4c087441],.slide-leave-from[data-v-4c087441]{opacity:1;max-height:120px}.card-bottom-bar[data-v-4c087441]{background:#1e1e3a}.skip-setup-btn[data-v-4c087441]{min-height:28px;padding:2px 10px;font-size:11px}.skip-setup-btn[data-v-4c087441] .q-btn__content{gap:4px}.skip-setup-btn[data-v-4c087441] .q-icon{font-size:14px}.bottom-row-git .bottom-select-label[data-v-4c087441]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bottom-row-git .bottom-select.repo-select[data-v-4c087441] input{color:#bbb;padding:0 4px;font-size:11px}.bottom-row-git .bottom-select.repo-select[data-v-4c087441] input::placeholder{color:#666;font-style:italic}.bottom-select[data-v-4c087441]{background:#333;height:28px;padding:0 6px}.bottom-select[data-v-4c087441] .q-field__control{height:28px;min-height:28px;padding:0}.bottom-select[data-v-4c087441] .q-field__native{min-height:unset;padding:0}.bottom-select-label[data-v-4c087441]{color:#bbb;gap:2px;font-size:11px}.bottom-sep[data-v-4c087441]{color:#555;padding:0 2px;font-size:12px;line-height:1}.repo-path-wrap[data-v-4c087441]{background:#333;border-radius:6px;height:28px;padding:0 8px}.repo-input[data-v-4c087441]{min-width:140px}.repo-input[data-v-4c087441] .q-field__control{height:28px;min-height:28px;padding:0}.repo-input[data-v-4c087441] input{color:#bbb;font-size:11px}.repo-input[data-v-4c087441] input::placeholder{color:#666;font-size:11px}.branch-select[data-v-4c087441]{min-width:80px}.create-btn[data-v-4c087441]{color:#fff;background:#4f46e5;min-width:220px;height:32px;padding:0 32px;font-size:13px}.create-btn[data-v-4c087441] .q-btn__content{height:32px}.create-hint[data-v-4c087441]{line-height:1.5}.fade-enter-active[data-v-4c087441],.fade-leave-active[data-v-4c087441]{transition:opacity .2s}.fade-enter-from[data-v-4c087441],.fade-leave-to[data-v-4c087441]{opacity:0}.manual-hint[data-v-4c087441]{background:#1e1e3a;line-height:1.4}.manual-expansion[data-v-4c087441]{background:#1e1e3a;border:1px solid #333;border-radius:4px;margin-top:6px;overflow:hidden}.manual-expansion[data-v-4c087441] .manual-expansion-header{min-height:32px;padding:4px 10px;font-size:12px}.manual-expansion[data-v-4c087441] .q-expansion-item__content,.manual-section-body[data-v-4c087441]{background:#1a1a2e}.manual-input[data-v-4c087441] .q-field__control{height:26px;min-height:26px;padding:0}.manual-input[data-v-4c087441] input{color:#e0e0e0;font-size:12px}.manual-input[data-v-4c087441] input::placeholder{color:#555}.manual-item[data-v-4c087441]{border-top:1px solid #ffffff0a}.manual-item[data-v-4c087441]:first-child{border-top:none}
@@ -0,0 +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 re,bt as ie,d as c,et as l,f as u,g as d,l as f,p,r as ae,u as m,y as oe,yt as se}from"./runtime-core.esm-bundler-D_RRiKBh.js";import{H as ce,R as le,U as h,t as g}from"./QIcon-BmEX2rXO.js";import{r as _}from"./use-id-BCnfiBjU.js";import{s as ue}from"./notifications-BtVr85fZ.js";import{t as v}from"./QBtn-CoU-UC_j.js";import{n as de}from"./vue-i18n-Cq-KgjJC.js";import{t as y}from"./QInput-D0t39uK_.js";import{c as fe,g as pe,i as me,o as he}from"./index-BTVVGg4f.js";import{t as ge}from"./QSpinnerDots-DspFKwCZ.js";import{n as b,t as _e}from"./QItemSection-DRg-QuAD.js";import{t as x}from"./QItemLabel-Btqw0P7M.js";import{t as S}from"./QTooltip-DyIRS1GH.js";import{t as ve}from"./QExpansionItem-_8j8FyQg.js";import{t as ye}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as be}from"./QSpace-Crcx82On.js";import{t as xe}from"./use-quasar-sypIWZgU.js";import{t as C}from"./QSelect-4UzZxoyw.js";import{t as Se}from"./QPage-3-ah4oor.js";import{a as Ce,i as we,n as Te,r as Ee,t as De}from"./expand-template-CP-8YIJC.js";import{i as Oe,r as ke,t as Ae}from"./permissionModes-r9UZvpVs.js";var je=`kobo:create-page-prefs`;function w(){try{let e=localStorage.getItem(je);return e===null?void 0:JSON.parse(e)}catch{return}}function Me(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ne(){let e=w();if(!Me(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 Pe(e){try{localStorage.setItem(je,JSON.stringify(e))}catch{}}var Fe={class:`create-inner`},Ie={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Le={class:`create-card rounded-borders`},Re={class:`card-top-bar row items-center q-px-md q-py-xs`},ze={class:`model-badge cursor-default row items-center q-gutter-xs`},Be={class:`text-indigo-3 text-weight-medium text-caption`},Ve={key:0,class:`notion-url-wrap`},He={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ue={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},We={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ge={class:`text-caption text-grey-4 q-mb-sm`},Ke={class:`row q-gutter-sm`},qe={class:`peek-card-text`},Je={class:`peek-card-title`},Ye={class:`peek-card-desc`},Xe={class:`peek-card-text`},Ze={class:`peek-card-title`},Qe={class:`peek-card-desc`},$e={key:0,class:`sentry-url-wrap`},et={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},tt={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},nt={class:`card-name-wrap`},rt={class:`card-textarea-wrap`},it={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},at={key:0,class:`row items-center text-caption text-amber-6`},ot={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},st={class:`q-pa-sm manual-section-body`},ct={class:`row items-center q-gutter-sm q-mb-sm`},lt={class:`col text-caption text-grey-4`},ut={class:`q-pa-sm manual-section-body`},dt={class:`row items-center q-gutter-sm q-mb-sm`},ft={class:`col text-caption text-grey-4`},pt={class:`card-bottom-bar`},mt={class:`row q-col-gutter-xs q-px-xs`},ht={key:0,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-sm-6 col-md-3`},bt={class:`bottom-select-label row items-center no-wrap`},xt={class:`col-12 col-md-3`},St={class:`bottom-select-label row items-center no-wrap`},Ct={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},wt={class:`col-12 col-md-auto`},Tt={class:`col-12 col-md-auto`},Et={class:`col-12 col-md-auto`},Dt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Ot={class:`col-12 col-md-4`},kt={key:0,class:`col-12 col-md-4`},At={class:`bottom-select-label row items-center no-wrap`},jt={key:1,class:`col-12 col-md-4`},Mt={class:`bottom-select-label row items-center no-wrap`},Nt={class:`col-12 col-md-4`},Pt={class:`bottom-select-label row items-center no-wrap`},Ft={class:`row justify-center q-px-sm q-py-sm`},It={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Lt=6e4,T=ye(oe({__name:`CreatePage`,setup(oe){function ye(e){return e.disabled===!0}let je=me(),w=xe(),Me=fe(),T=ue(),{t:E}=de(),Rt=l([]),zt=l(``),D=l(``),Bt=l(null),Vt=l(``),O=l(!1),k=l(!1),Ht=l(null),Ut=l(null),Wt=l([]),Gt=l(null),A=l(``),j=l(!1),M=l(`claude-opus-4-8`),N=l(`auto`),P=l(``),F=l(null),I=l(`feature`),L=l(!1),Kt=f(()=>T.global.voiceEnabled),qt=l([]),R=l(`claude-code`),Jt=f(()=>qt.value.find(e=>e.id===R.value)),Yt=f(()=>qt.value.map(e=>({value:e.id,label:e.displayName}))),Xt=f(()=>T.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),Zt=[`plan`,`bypass`,`strict`,`interactive`];function Qt(e,t){let n=e?T.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Zt.includes(r))return r;let i=T.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Zt.includes(i)?i:n?.dangerouslySkipPermissions??T.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let z=l(Qt(``,R.value)),$t=f(()=>{switch(z.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),en=f(()=>(Ae[R.value]??Zt).map(e=>({value:e,label:E(`agentPermissionMode.${e}`),disabled:e===`plan`&&Y.value}))),B=l([]),tn=l([]),nn=l(!1),rn=l(!1);function an(e,t){t(()=>{tn.value=e?B.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):B.value})}let on=pe();function sn(){return Bt.value?.nativeEl??null}let{showSkills:cn,selectedSkillIndex:V,groupedDropdown:ln,flatDropdown:H,fetchSkills:un,detectSlashFragment:dn,replaceFragmentWith:fn,closeDropdown:pn}=we(D,sn,{excludeKoboCommands:!0});un(),o(D,async()=>{await e(),await dn()});function mn(e){if(e.type===`template`){let t=on.templates.find(t=>t.slug===e.name);if(!t)return;fn(Te(t.content,De({workspace:null,gitStats:null,sessionName:null}))),pn();return}fn(`/${e.name} `),pn()}function hn(e){!cn.value||H.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),V.value=(V.value+1)%H.value.length):e.key===`ArrowUp`?(e.preventDefault(),V.value=(V.value-1+H.value.length)%H.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),mn(H.value[V.value])):e.key===`Escape`&&(e.preventDefault(),pn()))}async function gn(){if(!(!Kt.value||O.value||k.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){w.notify({type:`warning`,message:E(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Ut.value=e,Wt.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&&Wt.value.push(e.data)},n.start(),Ht.value=n,O.value=!0,Gt.value=setTimeout(()=>{U(),w.notify({type:`info`,message:E(`voice.maxDurationReached`),position:`top`,timeout:3500})},Lt)}catch{w.notify({type:`negative`,message:E(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function U(){if(!O.value)return;let e=Ht.value;if(!e)return;O.value=!1,k.value=!0,Gt.value&&=(clearTimeout(Gt.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Wt.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`,T.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()&&(D.value=D.value?`${D.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;w.notify({type:`negative`,message:E({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{Ht.value=null,Wt.value=[],Ut.value?.getTracks().forEach(e=>{e.stop()}),Ut.value=null,k.value=!1}}function _n(e){return Kt.value?T.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function vn(e){!_n(e)||e.repeat||(e.preventDefault(),gn())}function yn(e){_n(e)&&(e.preventDefault(),U())}function bn(){O.value&&U()}function xn(){document.visibilityState!==`visible`&&O.value&&U()}let Sn=f(()=>(Oe[R.value]??ke).map(e=>({label:E(e.i18nLabelKey),value:e.value,description:E(e.i18nDescriptionKey)})));o(R,()=>{let e=Sn.value.map(e=>e.value);if(e.length>0){let t=T.global.defaultModelByEngine?.[R.value];typeof t==`string`&&e.includes(t)?M.value=t:e.includes(M.value)||(M.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=Ae[R.value]??[];t.length>0&&!t.includes(z.value)&&(z.value=Qt(P.value,R.value));let n=(Ee[R.value]??[]).map(e=>e.value);n.length>0&&!n.includes(N.value)&&(N.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function Cn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let wn=f(()=>(Ee[R.value]??Ee[`claude-code`]).map(e=>({value:e.value,label:Cn(E(e.i18nLabelKey)),description:E(e.i18nDescriptionKey)}))),W=f(()=>{let e=A.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),Tn=f(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(A.value)),G=l(`panel`);function En(){let e=A.value.trim();return G.value===`parent`&&Tn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let K=l([]),q=l([]),Dn=l(``),On=l(``),kn=f(()=>!j.value||!W.value);function An(){let e=Dn.value.trim();e&&(K.value.push(e),Dn.value=``)}function jn(e){K.value.splice(e,1)}function Mn(){let e=On.value.trim();e&&(q.value.push(e),On.value=``)}function Nn(e){q.value.splice(e,1)}function Pn(){j.value=!j.value,j.value||(A.value=``)}let J=l(!1),Y=l(!1);o(()=>Y.value,e=>{e&&z.value!==`bypass`&&(z.value=`bypass`,w.notify({type:`info`,message:E(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let X=l(``),Fn=f(()=>/\/issues\/\d+/.test(X.value.trim()));function In(){J.value=!J.value,J.value||(X.value=``)}let Z=l(!1),Q=l(null),$=l([]),Ln=l(!1);async function Rn(){if(!P.value.trim()){$.value=[];return}Ln.value=!0;try{$.value=await Me.fetchOrphanWorktrees(P.value.trim())}catch{$.value=[]}finally{Ln.value=!1}}function zn(){Z.value=!Z.value,Z.value?(j.value=!1,A.value=``,J.value=!1,X.value=``,L.value=!0,Rn()):Q.value=null}o(P,()=>{Q.value=null,Z.value&&Rn()}),o(Q,e=>{if(!e)return;let t=$.value.find(t=>t.path===e);t&&(F.value=t.suggestedSourceBranch),L.value=!0});async function Bn(e){if(!e.trim()){B.value=[],F.value=null;return}nn.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&&!F.value&&(F.value=B.value[0]??null)}catch{B.value=[],F.value=null}finally{nn.value=!1}}function Vn(e){let t=T.getProjectByPath(e);if(t){t.defaultSourceBranch&&(F.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(D.value===``||D.value===Vt.value)&&(D.value=e,Vt.value=e);let n=Sn.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))M.value=t.defaultModel;else{let e=T.global.defaultModelByEngine?.[R.value];typeof e==`string`&&n.includes(e)&&(M.value=e)}}z.value=Qt(e,R.value)}let Hn=null;o(P,e=>{Hn&&clearTimeout(Hn),Hn=setTimeout(()=>{F.value=null,Bn(e),Vn(e)},500)});function Un(e,t){t(()=>{Rt.value=T.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}i(async()=>{await T.fetchSettings();let e=T.global.branchPrefixes;e.length>0&&!e.includes(I.value)&&(I.value=e[0]);let t=Ne();t.autoLoop===!0&&(Y.value=!0),t.projectPath&&T.projectPaths.includes(t.projectPath)&&(P.value=t.projectPath),z.value=Qt(P.value,R.value);try{let e=await fetch(`/api/engines`);e.ok&&(qt.value=await e.json())}catch{}{let e=Sn.value.map(e=>e.value),t=T.global.defaultModelByEngine?.[R.value];typeof t==`string`&&e.includes(t)?M.value=t:e.length>0&&!e.includes(M.value)&&(M.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,vn),window.addEventListener(`keyup`,yn),window.addEventListener(`blur`,bn),document.addEventListener(`visibilitychange`,xn)}),ee(()=>{Hn&&clearTimeout(Hn),window.removeEventListener(`keydown`,vn),window.removeEventListener(`keyup`,yn),window.removeEventListener(`blur`,bn),document.removeEventListener(`visibilitychange`,xn),Gt.value&&=(clearTimeout(Gt.value),null),O.value&&U()});function Wn(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 Gn(){return zt.value.trim()?zt.value.trim().substring(0,80):!j.value&&!J.value&&D.value.trim()&&(D.value.trim().split(`
2
+ `)[0]??``).substring(0,80)||`workspace`}function Kn(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 qn(){return j.value&&!W.value?E(`createPage.validationNotionUrl`):J.value&&!Fn.value?E(`createPage.sentryValidation`):!j.value&&!J.value&&!D.value.trim()?E(`createPage.validationDescription`):!j.value&&!J.value&&(!Gn()||Gn()===`workspace`)&&!zt.value.trim()&&!D.value.trim()?E(`createPage.validationName`):P.value.trim()?F.value?null:E(`createPage.validationBranch`):E(`createPage.validationPath`)}async function Jn(){let e=qn();if(e){w.notify({type:`negative`,message:e,position:`top`});return}if(Z.value&&!Q.value){w.notify({type:`negative`,message:E(`createPage.pickWorktreeRequired`),position:`top`});return}rn.value=!0;try{let e=Gn(),t;t=j.value&&W.value?Kn(En()):e===`workspace`?`task-${Date.now()}`:Wn(e);let n=`${I.value}/${t}`,r={name:e,projectPath:P.value.trim(),sourceBranch:F.value,...Z.value&&Q.value?{worktreePath:Q.value,skipSetupScript:!0}:{workingBranch:n},engine:R.value,model:M.value,reasoningEffort:N.value,...j.value&&W.value?{notionUrl:En()}:{},...J.value&&Fn.value?{sentryUrl:X.value.trim()}:{},...kn.value&&K.value.length>0?{tasks:K.value}:{},...kn.value&&q.value.length>0?{acceptanceCriteria:q.value}:{},...L.value&&!Z.value?{skipSetupScript:!0}:{},...D.value.trim()?{description:D.value.trim()}:{},...Y.value?{autoLoop:!0}:{},agentPermissionMode:Y.value&&z.value===`plan`?`bypass`:z.value},i=await Me.createWorkspace(r);i._branchAdjusted&&w.notify({type:`info`,message:E(`createPage.branchAdjusted`,{branch:i.workingBranch}),position:`top`,timeout:6e3}),Pe({projectPath:P.value.trim(),autoLoop:Y.value}),he().subscribe(i.id),Me.selectWorkspace(i.id),je.push({name:`workspace`,params:{id:i.id}})}catch{w.notify({type:`negative`,message:E(`createPage.errorCreating`),position:`top`})}finally{rn.value=!1}}return(e,i)=>(r(),c(Se,{class:`create-page flex flex-center column`},{default:n(()=>[m(`div`,Fe,[m(`div`,Ie,a(e.$t(`createPage.title`)),1),m(`div`,Le,[m(`div`,Re,[m(`span`,ze,[s(g,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),m(`span`,Be,a(Jt.value?.displayName??e.$t(`createPage.claudeCode`)),1)]),s(be),s(v,{flat:``,dense:``,"no-caps":``,size:`sm`,color:j.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,disable:Z.value,onClick:Pn},{default:n(()=>[s(g,{name:`description`,size:`14px`,class:`q-mr-xs`}),d(` `+a(j.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`,`disable`]),s(v,{flat:``,dense:``,"no-caps":``,size:`sm`,color:J.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,disable:Z.value,onClick:In},{default:n(()=>[s(g,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),d(` `+a(J.value?e.$t(`createPage.sentryEnabled`):e.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`,`disable`])]),s(_,{color:`grey-9`}),s(le,{name:`slide`},{default:n(()=>[j.value?(r(),p(`div`,Ve,[s(y,{modelValue:A.value,"onUpdate:modelValue":i[0]||=e=>A.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:n(()=>[s(g,{name:`link`,size:`16px`,color:W.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),A.value.trim()&&!W.value?(r(),p(`div`,He,a(e.$t(`createPage.notionValidation`)),1)):u(``,!0),W.value?(r(),p(`div`,Ue,a(e.$t(`createPage.notionAutoExtract`)),1)):u(``,!0),W.value&&Tn.value?(r(),p(`div`,We,[m(`div`,Ge,[s(g,{name:`info`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),d(` `+a(e.$t(`createPage.notionPanelChoiceLabel`)),1)]),m(`div`,Ke,[m(`button`,{type:`button`,class:se([`peek-card col`,{"peek-card--active":G.value===`panel`}]),onClick:i[1]||=e=>G.value=`panel`},[s(g,{name:`article`,size:`22px`,class:`peek-card-icon`}),m(`div`,qe,[m(`div`,Je,a(e.$t(`createPage.notionPanelOption`)),1),m(`div`,Ye,a(e.$t(`createPage.notionPanelOptionDesc`)),1)]),G.value===`panel`?(r(),c(g,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):u(``,!0)],2),m(`button`,{type:`button`,class:se([`peek-card col`,{"peek-card--active":G.value===`parent`}]),onClick:i[2]||=e=>G.value=`parent`},[s(g,{name:`folder_open`,size:`22px`,class:`peek-card-icon`}),m(`div`,Xe,[m(`div`,Ze,a(e.$t(`createPage.notionParentOption`)),1),m(`div`,Qe,a(e.$t(`createPage.notionParentOptionDesc`)),1)]),G.value===`parent`?(r(),c(g,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):u(``,!0)],2)])])):u(``,!0)])):u(``,!0)]),_:1}),j.value?(r(),c(_,{key:0,color:`grey-9`})):u(``,!0),s(le,{name:`slide`},{default:n(()=>[J.value?(r(),p(`div`,$e,[s(y,{modelValue:X.value,"onUpdate:modelValue":i[3]||=e=>X.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:n(()=>[s(g,{name:`link`,size:`16px`,color:Fn.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),X.value.trim()&&!Fn.value?(r(),p(`div`,et,a(e.$t(`createPage.sentryValidation`)),1)):u(``,!0),Fn.value?(r(),p(`div`,tt,a(e.$t(`createPage.sentryAutoExtract`)),1)):u(``,!0)])):u(``,!0)]),_:1}),J.value?(r(),c(_,{key:1,color:`grey-9`})):u(``,!0),m(`div`,nt,[s(y,{modelValue:zt.value,"onUpdate:modelValue":i[4]||=e=>zt.value=e,borderless:``,dense:``,placeholder:j.value&&W.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),s(_,{color:`grey-9`}),m(`div`,rt,[s(y,{ref_key:`descriptionRef`,ref:Bt,modelValue:D.value,"onUpdate:modelValue":i[5]||=e=>D.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:j.value?e.$t(`createPage.instructions`):e.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[hn,ce(h(Jn,[`ctrl`]),[`enter`]),ce(h(Jn,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`]),m(`div`,it,[k.value?(r(),p(`div`,at,[s(ge,{size:`14px`,color:`amber-6`,class:`q-mr-xs`}),m(`span`,null,a(e.$t(`voice.transcribing`)),1)])):u(``,!0),s(v,{flat:``,dense:``,size:`sm`,icon:k.value?`hourglass_top`:O.value?`mic`:`mic_none`,color:O.value?`red-5`:k.value?`amber-6`:`grey-6`,disable:!Kt.value||k.value,class:se({"voice-btn--recording":O.value}),onMousedown:h(gn,[`prevent`]),onMouseup:h(U,[`prevent`]),onMouseleave:h(U,[`prevent`]),onTouchstart:h(gn,[`prevent`]),onTouchend:h(U,[`prevent`])},{default:n(()=>[s(S,null,{default:n(()=>[d(a(k.value?e.$t(`voice.transcribing`):O.value?e.$t(`voice.recording`):e.$t(`voice.holdToTalk`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`disable`,`class`])]),re(cn)&&re(H).length>0?(r(),c(Ce,{key:0,class:`create-slash-popup`,"grouped-dropdown":re(ln),"flat-dropdown":re(H),"selected-index":re(V),onSelect:mn},null,8,[`grouped-dropdown`,`flat-dropdown`,`selected-index`])):u(``,!0)]),s(_,{color:`grey-9`}),kn.value?(r(),p(ae,{key:2},[m(`div`,ot,a(e.$t(`createPage.manualHint`)),1),s(ve,{dark:``,dense:``,label:e.$t(`createPage.tasks`,{count:K.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:n(()=>[m(`div`,st,[m(`div`,ct,[s(y,{modelValue:Dn.value,"onUpdate:modelValue":i[6]||=e=>Dn.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:ce(h(An,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),s(v,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Dn.value.trim(),onClick:An},{default:n(()=>[s(S,null,{default:n(()=>[d(a(e.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(r(!0),p(ae,null,te(K.value,(t,i)=>(r(),p(`div`,{key:`task-${i}`,class:`row items-center q-py-xs manual-item`},[m(`span`,lt,a(t),1),s(v,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>jn(i)},{default:n(()=>[s(S,null,{default:n(()=>[d(a(e.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),s(ve,{dark:``,dense:``,label:e.$t(`createPage.acceptanceCriteria`,{count:q.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:n(()=>[m(`div`,ut,[m(`div`,dt,[s(y,{modelValue:On.value,"onUpdate:modelValue":i[7]||=e=>On.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:ce(h(Mn,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),s(v,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!On.value.trim(),onClick:Mn},{default:n(()=>[s(S,null,{default:n(()=>[d(a(e.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(r(!0),p(ae,null,te(q.value,(t,i)=>(r(),p(`div`,{key:`crit-${i}`,class:`row items-center q-py-xs manual-item`},[m(`span`,ft,a(t),1),s(v,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>Nn(i)},{default:n(()=>[s(S,null,{default:n(()=>[d(a(e.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),s(_,{color:`grey-9`})],64)):u(``,!0),m(`div`,pt,[m(`div`,mt,[Yt.value.length>0?(r(),p(`div`,ht,[s(C,{modelValue:R.value,"onUpdate:modelValue":i[8]||=e=>R.value=e,options:Yt.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:n(()=>[m(`span`,gt,[s(g,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+a(Yt.value.find(e=>e.value===R.value)?.label??R.value)+` `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:n(()=>[s(S,null,{default:n(()=>[d(a(e.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])):u(``,!0),m(`div`,_t,[s(C,{modelValue:M.value,"onUpdate:modelValue":i[9]||=e=>M.value=e,options:Sn.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(()=>[m(`span`,vt,[d(a(Sn.value.find(e=>e.value===M.value)?.label??M.value)+` `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:n(({opt:e,itemProps:r})=>[s(b,t(r,{class:`model-option`}),{default:n(()=>[s(_e,null,{default:n(()=>[s(x,{class:`text-white`},{default:n(()=>[d(a(e.label),1)]),_:2},1024),s(x,{caption:``,class:`text-grey-5`},{default:n(()=>[d(a(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),m(`div`,yt,[s(C,{modelValue:N.value,"onUpdate:modelValue":i[10]||=e=>N.value=e,options:wn.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:n(()=>[m(`span`,bt,[s(g,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+a(wn.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:n(({opt:e,itemProps:t})=>[s(b,ie(ne(t)),{default:n(()=>[s(_e,null,{default:n(()=>[s(x,{class:`text-white`},{default:n(()=>[d(a(e.label),1)]),_:2},1024),s(x,{caption:``,class:`text-grey-5`},{default:n(()=>[d(a(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),m(`div`,xt,[s(C,{modelValue:z.value,"onUpdate:modelValue":i[11]||=e=>z.value=e,options:en.value,disable:Y.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,"option-disable":ye},{selected:n(()=>[m(`span`,St,[s(g,{name:$t.value,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),d(` `+a(en.value.find(e=>e.value===z.value)?.label??z.value)+` `,1),Y.value?u(``,!0):(r(),c(g,{key:0,name:`expand_more`,size:`12px`,color:`grey-5`}))])]),default:n(()=>[s(S,null,{default:n(()=>[d(a(Y.value?e.$t(`agentPermissionMode.autoLoopLocked`):e.$t(`agentPermissionMode.tooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`,`disable`])])]),m(`div`,Ct,[m(`div`,wt,[s(v,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:Y.value?`autorenew`:`sync_disabled`,color:Y.value?`amber-4`:`grey-5`,label:e.$t(`autoLoop.startInMode`),class:`skip-setup-btn`,onClick:i[12]||=e=>Y.value=!Y.value},{default:n(()=>[s(S,null,{default:n(()=>[d(a(e.$t(`autoLoop.startInMode`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),m(`div`,Tt,[s(v,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:L.value?`play_disabled`:`play_circle`,color:L.value?`orange-4`:`grey-5`,label:e.$t(`createPage.skipSetupScript`),class:`skip-setup-btn`,onClick:i[13]||=e=>L.value=!L.value},{default:n(()=>[s(S,null,{default:n(()=>[d(a(e.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),m(`div`,Et,[s(v,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:`folder_open`,color:Z.value?`cyan-4`:`grey-5`,label:Z.value?e.$t(`createPage.attachWorktreeEnabled`):e.$t(`createPage.attachWorktreeToggle`),class:`skip-setup-btn`,onClick:zn},null,8,[`color`,`label`])])]),m(`div`,Dt,[m(`div`,Ot,[s(C,{modelValue:P.value,"onUpdate:modelValue":i[14]||=e=>P.value=e,options:Rt.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":P.value?``:`repo-input-empty`,placeholder:e.$t(`createPage.projectPath`),behavior:re(T).projectPaths.length>0?`menu`:`dialog`,onFilter:Un,onInputValue:i[15]||=e=>{P.value=e}},{prepend:n(()=>[s(g,{name:`folder`,size:`14px`,color:`grey-5`})]),"no-option":n(()=>[s(b,null,{default:n(()=>[s(_e,{class:`text-grey-6 text-caption`},{default:n(()=>[d(a(e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`])]),Z.value?u(``,!0):(r(),p(`div`,kt,[s(C,{modelValue:I.value,"onUpdate:modelValue":i[16]||=e=>I.value=e,options:Xt.value,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:n(()=>[m(`span`,At,[s(g,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+a(I.value)+`/ `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:n(()=>[s(S,null,{default:n(()=>[d(a(e.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])),Z.value?(r(),p(`div`,jt,[s(C,{modelValue:Q.value,"onUpdate:modelValue":i[17]||=e=>Q.value=e,options:$.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:Ln.value,disable:!P.value.trim()||Ln.value},{selected:n(()=>[m(`span`,Mt,[s(g,{name:`folder_open`,size:`12px`,color:`cyan-5`,class:`q-mr-xs`}),d(` `+a(Q.value?$.value.find(e=>e.path===Q.value)?.branch??Q.value:e.$t(`createPage.worktreePickerLabel`))+` `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:n(e=>[s(b,ie(ne(e.itemProps)),{default:n(()=>[s(_e,null,{default:n(()=>[s(x,null,{default:n(()=>[d(a(e.opt.branch),1)]),_:2},1024),s(x,{caption:``},{default:n(()=>[d(a(e.opt.path),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":n(()=>[s(b,null,{default:n(()=>[s(_e,{class:`text-grey-6 text-caption`},{default:n(()=>[d(a(P.value.trim()?e.$t(`createPage.noOrphanWorktrees`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])):u(``,!0),m(`div`,Nt,[s(C,{modelValue:F.value,"onUpdate:modelValue":i[18]||=e=>F.value=e,options:tn.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,"use-input":``,"input-debounce":`0`,loading:nn.value,disable:!P.value.trim()||nn.value,onFilter:an},{selected:n(()=>[m(`span`,Pt,[s(g,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+a(F.value??e.$t(`createPage.branch`))+` `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":n(()=>[s(b,null,{default:n(()=>[s(_e,{class:`text-grey-6 text-caption`},{default:n(()=>[d(a(P.value.trim()?e.$t(`createPage.noBranches`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])])]),m(`div`,Ft,[s(v,{label:e.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:rn.value,disable:rn.value||Z.value&&!Q.value,onClick:Jn},null,8,[`label`,`loading`,`disable`])])]),m(`div`,It,a(j.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-4c087441`]]);export{T as default};