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