@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.
- package/CHANGELOG.md +8 -0
- package/dist/server/routes/workspaces.js +73 -7
- package/dist/server/services/forge/github/provider.js +6 -2
- package/dist/server/services/forge/gitlab/provider.js +3 -0
- package/dist/server/services/forge/types.js +13 -0
- package/dist/server/services/pr-watcher-service.js +13 -1
- package/dist/server/services/settings-service.js +13 -0
- package/dist/server/utils/git-ops.js +36 -0
- package/dist/shared/models.js +12 -0
- package/package.json +2 -2
- package/src/client/dist/spa/assets/{ActivityFeed-rio_ru8s.js → ActivityFeed-DFMce5VW.js} +1 -1
- package/src/client/dist/spa/assets/{ChangelogPage-Dk8nKtM0.js → ChangelogPage-BZEr6iNh.js} +1 -1
- package/src/client/dist/spa/assets/{ClosePopup-BWYh08p9.js → ClosePopup-CY16K9Yi.js} +1 -1
- package/src/client/dist/spa/assets/CreatePage-CE-ljszo.css +1 -0
- package/src/client/dist/spa/assets/CreatePage-geIEPibR.js +2 -0
- package/src/client/dist/spa/assets/{DiffViewer-deM4uqPU.js → DiffViewer-C8yPZaCf.js} +3 -3
- package/src/client/dist/spa/assets/{HealthPage-DAA51STa.js → HealthPage-DAk5EKO_.js} +1 -1
- package/src/client/dist/spa/assets/{MainLayout-DrY2_qyP.js → MainLayout-CNNcKilU.js} +3 -3
- package/src/client/dist/spa/assets/{MainLayout-4vhZRrU2.css → MainLayout-DTW0ySzA.css} +1 -1
- package/src/client/dist/spa/assets/{QExpansionItem-CiBP4NiY.js → QExpansionItem-_8j8FyQg.js} +1 -1
- package/src/client/dist/spa/assets/{QMenu-CoPEAblj.js → QMenu-BXssnk-g.js} +1 -1
- package/src/client/dist/spa/assets/{QScrollArea-CZVgBUBp.js → QScrollArea-_Mvx2t8o.js} +1 -1
- package/src/client/dist/spa/assets/{QScrollObserver-CAlbLisQ.js → QScrollObserver-C6P7wS4h.js} +1 -1
- package/src/client/dist/spa/assets/{QSelect-Dm7qaLfk.js → QSelect-4UzZxoyw.js} +1 -1
- package/src/client/dist/spa/assets/{QTooltip-CwBZU_bs.js → QTooltip-DyIRS1GH.js} +1 -1
- package/src/client/dist/spa/assets/{SearchPage-CMH0AoRw.js → SearchPage-K04ns4hU.js} +1 -1
- package/src/client/dist/spa/assets/SettingsPage-D0WcKagG.js +9 -0
- package/src/client/dist/spa/assets/SettingsPage-D1Ap5wB7.css +1 -0
- package/src/client/dist/spa/assets/{TouchPan-DXGxNMLq.js → TouchPan-DZZEI8eo.js} +1 -1
- package/src/client/dist/spa/assets/{WorkspacePage-CH3k_9_s.js → WorkspacePage-DNO_bRMJ.js} +3 -3
- package/src/client/dist/spa/assets/{build-path-tree-B9aeh1tv.js → build-path-tree-BUfhgOSH.js} +1 -1
- package/src/client/dist/spa/assets/{cssMode-DmArionU.js → cssMode-0MvCYrRV.js} +1 -1
- package/src/client/dist/spa/assets/{editor.api-CseR9xvC.js → editor.api-DYWJPPWs.js} +1 -1
- package/src/client/dist/spa/assets/{editor.main-Yih57bDS.js → editor.main-B8in8NwN.js} +3 -3
- package/src/client/dist/spa/assets/{engineFeatures-d1kZ8NXB.js → engineFeatures-BdTa0rX6.js} +1 -1
- package/src/client/dist/spa/assets/{expand-template-D_3H5Och.js → expand-template-CP-8YIJC.js} +1 -1
- package/src/client/dist/spa/assets/{freemarker2-Cd59aTHU.js → freemarker2-Dx4cVLM0.js} +1 -1
- package/src/client/dist/spa/assets/{handlebars-CeswicPh.js → handlebars-CwM3UEBZ.js} +1 -1
- package/src/client/dist/spa/assets/{html-C3-kLMMe.js → html-2JtDgifC.js} +1 -1
- package/src/client/dist/spa/assets/{htmlMode-DQxZ0n2e.js → htmlMode-B8N8GxKE.js} +1 -1
- package/src/client/dist/spa/assets/i18n-C80g9cfR.js +1 -0
- package/src/client/dist/spa/assets/index-BTVVGg4f.js +82 -0
- package/src/client/dist/spa/assets/{javascript-0NpnFHx9.js → javascript-CTXs71Pa.js} +1 -1
- package/src/client/dist/spa/assets/{jsonMode-Byj6sx5w.js → jsonMode-Cnw0tYit.js} +1 -1
- package/src/client/dist/spa/assets/{kobo-commands-B_DBKQxq.js → kobo-commands-DLc7j2_p.js} +1 -1
- package/src/client/dist/spa/assets/{liquid-CzcaXBnO.js → liquid-B1BeK8RP.js} +1 -1
- package/src/client/dist/spa/assets/{mdx-Dl6UUR_U.js → mdx-DLwxZ3wR.js} +1 -1
- package/src/client/dist/spa/assets/{monaco.contribution-mzaMwnEg.js → monaco.contribution-B3kpNNij.js} +2 -2
- package/src/client/dist/spa/assets/{notifications-l1Pxijve.js → notifications-BtVr85fZ.js} +1 -1
- package/src/client/dist/spa/assets/permissionModes-r9UZvpVs.js +1 -0
- package/src/client/dist/spa/assets/{python-BFAu7VF2.js → python-C5L3E7X0.js} +1 -1
- package/src/client/dist/spa/assets/{razor-BET2CB_3.js → razor-DCXiAjxH.js} +1 -1
- package/src/client/dist/spa/assets/{render-chat-markdown-DsbgZODM.js → render-chat-markdown-DDQr5Zs5.js} +1 -1
- package/src/client/dist/spa/assets/{tsMode-ORpv-QPD.js → tsMode-Bu5FUVgw.js} +1 -1
- package/src/client/dist/spa/assets/{typescript-DGcONjjW.js → typescript-B-pS9HtR.js} +1 -1
- package/src/client/dist/spa/assets/{use-onboarding-B9TeTfkj.js → use-onboarding-CzGgvyS9.js} +1 -1
- package/src/client/dist/spa/assets/{xml-Cs4DTg3L.js → xml-Dgpxgles.js} +1 -1
- package/src/client/dist/spa/assets/{yaml-HxNN05si.js → yaml-D219wUJe.js} +1 -1
- package/src/client/dist/spa/index.html +2 -2
- package/src/client/dist/spa/assets/CreatePage-BmGIFI8W.js +0 -2
- package/src/client/dist/spa/assets/CreatePage-DDuStqsB.css +0 -1
- package/src/client/dist/spa/assets/SettingsPage-B7dDhXCS.css +0 -1
- package/src/client/dist/spa/assets/SettingsPage-DH-KTis9.js +0 -9
- package/src/client/dist/spa/assets/i18n-IlYZHxVd.js +0 -1
- package/src/client/dist/spa/assets/index-C0H1sHuD.js +0 -82
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
64
|
+
state,
|
|
62
65
|
base: raw.baseRefName ?? '',
|
|
63
|
-
reviewDecision
|
|
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).
|
package/dist/shared/models.js
CHANGED
|
@@ -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.
|
|
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": "^
|
|
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-
|
|
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-
|
|
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-
|
|
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};
|