@loicngr/kobo 1.7.9 → 1.7.11
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/dist/server/routes/workspaces.js +13 -2
- package/dist/server/services/settings-service.js +14 -0
- package/dist/server/services/skill-suite-prompts.js +78 -2
- package/dist/server/utils/git-ops.js +9 -1
- package/dist/shared/skill-suite-prompts.js +5 -1
- package/package.json +1 -1
- package/src/client/dist/spa/assets/{ActivityFeed-CKjFT9t6.js → ActivityFeed-BAASG3py.js} +1 -1
- package/src/client/dist/spa/assets/{ClosePopup-DMnQG6nw.js → ClosePopup-Bs-9Klyd.js} +1 -1
- package/src/client/dist/spa/assets/{CreatePage-BhFrUkEN.js → CreatePage-D9AbgeOT.js} +1 -1
- package/src/client/dist/spa/assets/{DiffViewer-BSnvba7W.js → DiffViewer-xnpaPL3h.js} +3 -3
- package/src/client/dist/spa/assets/{HealthPage-DZYZWGHp.js → HealthPage-DWNcejdz.js} +1 -1
- package/src/client/dist/spa/assets/{MainLayout-C45J7rSF.css → MainLayout-CQRtNn82.css} +1 -1
- package/src/client/dist/spa/assets/{MainLayout-CMuiNpet.js → MainLayout-DZCswY_D.js} +2 -2
- package/src/client/dist/spa/assets/QChip-CQZIeDHV.js +36 -0
- package/src/client/dist/spa/assets/{QExpansionItem-Fij7yBbG.js → QExpansionItem-DQ66zLAu.js} +1 -1
- package/src/client/dist/spa/assets/{QMenu-CMoolewZ.js → QMenu-pgVPfC7Y.js} +1 -1
- package/src/client/dist/spa/assets/{QTooltip-CbLXk2Bs.js → QTooltip-CTNw68oZ.js} +1 -1
- package/src/client/dist/spa/assets/{SearchPage-CBSgEvVF.js → SearchPage-B3emm2UD.js} +1 -1
- package/src/client/dist/spa/assets/SettingsPage-B3Kn6fwZ.css +1 -0
- package/src/client/dist/spa/assets/SettingsPage-j5vhq9YJ.js +9 -0
- package/src/client/dist/spa/assets/{TouchPan-DiBNjOPH.js → TouchPan-SGRB-xYE.js} +1 -1
- package/src/client/dist/spa/assets/{WorkspacePage-BTHvQga-.js → WorkspacePage-DmoPjAV6.js} +3 -3
- package/src/client/dist/spa/assets/{build-path-tree-BmBqRiCQ.js → build-path-tree-DGuSpWFG.js} +1 -1
- package/src/client/dist/spa/assets/{cssMode-ypFF7quM.js → cssMode-BSeHrn8-.js} +1 -1
- package/src/client/dist/spa/assets/{editor.api-DtpZuH_B.js → editor.api-Dgjer8XO.js} +1 -1
- package/src/client/dist/spa/assets/{editor.main-C7a7L2WP.js → editor.main-DbnmDA5w.js} +3 -3
- package/src/client/dist/spa/assets/{engineFeatures-BxAOQcPU.js → engineFeatures-BqiWw0xn.js} +1 -1
- package/src/client/dist/spa/assets/{expand-template-GaEux9_o.js → expand-template-_Y9C3CjP.js} +1 -1
- package/src/client/dist/spa/assets/{freemarker2-DUBmhe3W.js → freemarker2-C1QMrvUv.js} +1 -1
- package/src/client/dist/spa/assets/{handlebars-_XEXkADl.js → handlebars-DgiZwx-t.js} +1 -1
- package/src/client/dist/spa/assets/{html-D8gmyhgI.js → html-CiU03AFd.js} +1 -1
- package/src/client/dist/spa/assets/{htmlMode-B84S5YOM.js → htmlMode-lj6pNn2T.js} +1 -1
- package/src/client/dist/spa/assets/i18n-KyQESqOg.js +1 -0
- package/src/client/dist/spa/assets/index-ABhgwrBB.js +2 -0
- package/src/client/dist/spa/assets/{javascript-500DcdS9.js → javascript-Bf_RmvhA.js} +1 -1
- package/src/client/dist/spa/assets/{jsonMode-DmrWg6b7.js → jsonMode-DkzIh92L.js} +1 -1
- package/src/client/dist/spa/assets/{kobo-commands-DCoQW_NQ.js → kobo-commands-thKpumUN.js} +1 -1
- package/src/client/dist/spa/assets/{liquid-CfPJszlt.js → liquid-Cg7OHXeJ.js} +1 -1
- package/src/client/dist/spa/assets/{mdx-DtjLwENT.js → mdx-l_W5gHfE.js} +1 -1
- package/src/client/dist/spa/assets/{monaco.contribution-CxiO5UJd.js → monaco.contribution-DBBmYj6f.js} +2 -2
- package/src/client/dist/spa/assets/{notifications-CEyiPnmw.js → notifications-C4jB7A2f.js} +1 -1
- package/src/client/dist/spa/assets/{permissionModes-CPZlEHoF.js → permissionModes-CRue7srp.js} +1 -1
- package/src/client/dist/spa/assets/{project-color-C4vMEn4C.js → project-color-5UmDpA6C.js} +1 -1
- package/src/client/dist/spa/assets/{purify.es-C92_EGvT.js → purify.es-BYydQXtR.js} +1 -1
- package/src/client/dist/spa/assets/{python-BS46_AMt.js → python-BEqDMyrj.js} +1 -1
- package/src/client/dist/spa/assets/{razor-Ce9zcIFo.js → razor-CG3ZSgSC.js} +1 -1
- package/src/client/dist/spa/assets/{render-chat-markdown-BvJwlMiW.js → render-chat-markdown-C9L-kzlg.js} +1 -1
- package/src/client/dist/spa/assets/{tsMode-Cr9FJjYY.js → tsMode-CWoApSbW.js} +1 -1
- package/src/client/dist/spa/assets/{typescript-Ov3wChBg.js → typescript-CTk1WfV6.js} +1 -1
- package/src/client/dist/spa/assets/{use-panel-lBh91vcW.js → use-panel-CZnY7pfY.js} +1 -1
- package/src/client/dist/spa/assets/{xml-euA4jBI1.js → xml-CSZMdRGt.js} +1 -1
- package/src/client/dist/spa/assets/{yaml-BuPSq_BT.js → yaml-tWozZ5pP.js} +1 -1
- package/src/client/dist/spa/index.html +2 -2
- package/src/client/dist/spa/assets/QChip-BgzxI33B.js +0 -36
- package/src/client/dist/spa/assets/SettingsPage-C7TkcKXU.css +0 -1
- package/src/client/dist/spa/assets/SettingsPage-pY-zbPxn.js +0 -9
- package/src/client/dist/spa/assets/i18n-DLoe3l25.js +0 -1
- package/src/client/dist/spa/assets/index-Dx_W9yYo.js +0 -2
|
@@ -21,6 +21,7 @@ import { getActiveReviewTemplate, renderReviewTemplate } from '../services/revie
|
|
|
21
21
|
import * as sentryService from '../services/sentry-service.js';
|
|
22
22
|
import * as settingsService from '../services/settings-service.js';
|
|
23
23
|
import { runSetupScript } from '../services/setup-script-service.js';
|
|
24
|
+
import { getSuitePrompts } from '../services/skill-suite-prompts.js';
|
|
24
25
|
import * as terminalService from '../services/terminal-service.js';
|
|
25
26
|
import * as wakeupService from '../services/wakeup-service.js';
|
|
26
27
|
import * as wsService from '../services/websocket-service.js';
|
|
@@ -608,6 +609,14 @@ app.post('/', migrationGuard, async (c) => {
|
|
|
608
609
|
brainstormPrompt += `\n# Git conventions\nIMPORTANT: Before any git operation (commit, branch, rebase, merge, push), read and apply the conventions defined in \`.ai/.git-conventions.md\`. They are project-specific and override any default behavior. Re-read this file if you're unsure or if context was compacted.\n`;
|
|
609
610
|
}
|
|
610
611
|
brainstormPrompt += `\nIMPORTANT: Start by reading CLAUDE.md and/or AGENTS.md at the project root if they exist — they contain project conventions and instructions you must follow.`;
|
|
612
|
+
// Resolve the suite-specific brainstorming instruction (citing
|
|
613
|
+
// superpowers:brainstorming / writing-plans, or gstack /office-hours +
|
|
614
|
+
// /autoplan, etc.). The marker `[BRAINSTORM_COMPLETE]` stays universal —
|
|
615
|
+
// only the path to it changes per suite.
|
|
616
|
+
const globalSettings = settingsService.getGlobalSettings();
|
|
617
|
+
const suitePrompts = getSuitePrompts(globalSettings.skillSuite, {
|
|
618
|
+
brainstormingInstruction: globalSettings.customBrainstormingInstruction,
|
|
619
|
+
});
|
|
611
620
|
if (body.autoLoop === true) {
|
|
612
621
|
// Auto-loop is armed — brainstorm must end with task seeding + mark-ready,
|
|
613
622
|
// NOT with implementation. The auto-loop will drive implementation after.
|
|
@@ -621,7 +630,7 @@ app.post('/', migrationGuard, async (c) => {
|
|
|
621
630
|
const projectSettingsForE2e = settingsService.getProjectSettings(body.projectPath);
|
|
622
631
|
const e2eSettings = projectSettingsForE2e?.e2e ?? { framework: '', skill: '', prompt: '' };
|
|
623
632
|
const finalizationSettings = projectSettingsForE2e?.finalization ?? { prompt: '' };
|
|
624
|
-
brainstormPrompt += `\n\
|
|
633
|
+
brainstormPrompt += `\n\n${suitePrompts.brainstormingInstruction}
|
|
625
634
|
|
|
626
635
|
Auto-loop mode is active for this workspace. After the plan is ready, DO NOT implement anything. Instead:
|
|
627
636
|
|
|
@@ -632,7 +641,9 @@ When the steps above are complete, output [BRAINSTORM_COMPLETE] on its own line
|
|
|
632
641
|
${AUTO_LOOP_HARD_RULES}`;
|
|
633
642
|
}
|
|
634
643
|
else {
|
|
635
|
-
brainstormPrompt += `\n\
|
|
644
|
+
brainstormPrompt += `\n\n${suitePrompts.brainstormingInstruction}
|
|
645
|
+
|
|
646
|
+
Once the brainstorming + planning steps above are complete and you have a saved plan file, output [BRAINSTORM_COMPLETE] on its own line BEFORE starting implementation. Kōbō uses that marker to transition the workspace from \`brainstorming\` to \`executing\`. Then proceed with implementation.`;
|
|
636
647
|
}
|
|
637
648
|
try {
|
|
638
649
|
const agent = agentManager.startAgent(workspace.id, worktreePath, brainstormPrompt, workspace.model, false, workspace.agentPermissionMode, undefined, workspace.reasoningEffort);
|
|
@@ -397,6 +397,18 @@ const settingsMigrations = [
|
|
|
397
397
|
}
|
|
398
398
|
},
|
|
399
399
|
},
|
|
400
|
+
{
|
|
401
|
+
version: 23,
|
|
402
|
+
name: 'add-custom-brainstorming-instruction',
|
|
403
|
+
// Adds the 5th `custom*` field — the brainstorming-phase instruction
|
|
404
|
+
// injected into the workspace bootstrap prompt. Seeds with the agnostic
|
|
405
|
+
// baseline so users in `custom` mode can edit from a neutral start.
|
|
406
|
+
migrate: ({ global }) => {
|
|
407
|
+
if (typeof global.customBrainstormingInstruction !== 'string') {
|
|
408
|
+
global.customBrainstormingInstruction = AGNOSTIC_PROMPTS.brainstormingInstruction;
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
},
|
|
400
412
|
];
|
|
401
413
|
/** Current settings schema version — always equals the highest migration version. */
|
|
402
414
|
export const SETTINGS_SCHEMA_VERSION = settingsMigrations.length > 0 ? settingsMigrations[settingsMigrations.length - 1].version : 0;
|
|
@@ -460,6 +472,7 @@ function defaultSettings() {
|
|
|
460
472
|
customAutoLoopReviewGate: AGNOSTIC_PROMPTS.autoLoopReviewGate,
|
|
461
473
|
customAutoLoopGroomingIntro: AGNOSTIC_PROMPTS.autoLoopGroomingIntro,
|
|
462
474
|
customQaPromptTemplate: AGNOSTIC_PROMPTS.qaPromptTemplate,
|
|
475
|
+
customBrainstormingInstruction: AGNOSTIC_PROMPTS.brainstormingInstruction,
|
|
463
476
|
},
|
|
464
477
|
projects: [],
|
|
465
478
|
};
|
|
@@ -730,6 +743,7 @@ export function updateGlobalSettings(data) {
|
|
|
730
743
|
'customAutoLoopReviewGate',
|
|
731
744
|
'customAutoLoopGroomingIntro',
|
|
732
745
|
'customQaPromptTemplate',
|
|
746
|
+
'customBrainstormingInstruction',
|
|
733
747
|
];
|
|
734
748
|
const filtered = pickKnownKeys(data, allowedGlobalKeys);
|
|
735
749
|
if (filtered.tags !== undefined) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AGNOSTIC_AUTO_LOOP_GROOMING_INTRO, AGNOSTIC_AUTO_LOOP_REVIEW_GATE, AGNOSTIC_QA_PROMPT_TEMPLATE, AGNOSTIC_REVIEW_TEMPLATE, GROOMING_INTRO_GSTACK, GROOMING_INTRO_SUPERPOWERS, } from '../../shared/skill-suite-prompts.js';
|
|
1
|
+
import { AGNOSTIC_AUTO_LOOP_GROOMING_INTRO, AGNOSTIC_AUTO_LOOP_REVIEW_GATE, AGNOSTIC_BRAINSTORMING_INSTRUCTION, AGNOSTIC_QA_PROMPT_TEMPLATE, AGNOSTIC_REVIEW_TEMPLATE, GROOMING_INTRO_COMBINED, GROOMING_INTRO_GSTACK, GROOMING_INTRO_SUPERPOWERS, } from '../../shared/skill-suite-prompts.js';
|
|
2
2
|
// Headers and body shared with the agnostic baseline. We reconstruct them
|
|
3
3
|
// locally here so the suite-specific text can sit between header and body
|
|
4
4
|
// in the same shape across all 3 suites.
|
|
@@ -39,6 +39,11 @@ export const SUPERPOWERS_PROMPTS = {
|
|
|
39
39
|
autoLoopReviewGate: 'Code review gate — BEFORE marking the task done, dispatch an independent code-reviewer subagent via the Task tool with `subagent_type: "code-reviewer"` (or `"superpowers:code-reviewer"` / `"pr-review-toolkit:code-reviewer"` — use whichever exists in this environment; fall back to `superpowers:requesting-code-review` skill if none is available). Brief the reviewer with: what you just implemented, the task title, and the commit SHA (via `git rev-parse HEAD`). Ask specifically whether the change matches the task scope, whether edge cases are handled, and whether the commit is clean.',
|
|
40
40
|
autoLoopGroomingIntro: GROOMING_INTRO_SUPERPOWERS,
|
|
41
41
|
qaPromptTemplate: 'QA pass for workspace "{{workspace_name}}" in project {{project_name}}.\n\nBranch: {{branch_name}}\nStaging URL: {{staging_url}}\n\nIf a QA-style skill that drives a real browser is available in this environment (e.g. via the superpowers-chrome browsing skill), use it to navigate the staging URL and exercise the changes. Otherwise, fall back to manually scripting the smoke checks and recording your findings as a bug report.',
|
|
42
|
+
brainstormingInstruction: 'Brainstorm the implementation approach with discipline:\n' +
|
|
43
|
+
'1. Use the `superpowers:brainstorming` skill — it walks you through purpose, requirements, and design BEFORE any code. Ask clarifying questions and wait for explicit user approval on the design before moving on.\n' +
|
|
44
|
+
'2. Use `superpowers:writing-plans` to turn the approved design into a multi-step implementation plan, saved under `docs/superpowers/plans/`.\n' +
|
|
45
|
+
'3. If you encounter a bug or unexpected behaviour during exploration, use `superpowers:systematic-debugging` rather than guessing.\n' +
|
|
46
|
+
"Do NOT skip the skills or rationalise around them — that's how the rigour gets lost.",
|
|
42
47
|
};
|
|
43
48
|
export const GSTACK_PROMPTS = {
|
|
44
49
|
reviewTemplate: REVIEW_HEADER +
|
|
@@ -46,13 +51,81 @@ export const GSTACK_PROMPTS = {
|
|
|
46
51
|
REVIEW_BODY,
|
|
47
52
|
autoLoopReviewGate: 'Code review gate — BEFORE marking the task done, run /review (the gstack Staff Engineer skill). Brief it with: what you just implemented, the task title, and the commit SHA (via `git rev-parse HEAD`). Ask specifically whether the change matches the task scope, whether edge cases are handled, and whether the commit is clean. If /review auto-fixes minor issues, accept the fixes via an amend or fix-up commit, then re-run step 3 checks.',
|
|
48
53
|
autoLoopGroomingIntro: GROOMING_INTRO_GSTACK,
|
|
49
|
-
qaPromptTemplate:
|
|
54
|
+
qaPromptTemplate: `QA pass for workspace "{{workspace_name}}" in project {{project_name}}.
|
|
55
|
+
|
|
56
|
+
Branch: {{branch_name}}
|
|
57
|
+
Staging URL: {{staging_url}}
|
|
58
|
+
|
|
59
|
+
Pick the right gstack tool for the situation:
|
|
60
|
+
|
|
61
|
+
- \`/browse\` — Headless navigation: URL → interactions → screenshots. Use for quick dogfooding a flow or sanity-checking a PR.
|
|
62
|
+
- \`/qa {{staging_url}}\` — Systematic QA with automatic bug fixing. Three tiers (invoke as \`/qa Quick\`, \`/qa Standard\`, or \`/qa Exhaustive\`):
|
|
63
|
+
- **Quick** — critical and high-severity bugs only.
|
|
64
|
+
- **Standard** — adds medium-severity bugs.
|
|
65
|
+
- **Exhaustive** — adds cosmetic issues.
|
|
66
|
+
- \`/qa-only {{staging_url}}\` — Same methodology as \`/qa\` but report only, no code changes. Use when you only want a bug report.
|
|
67
|
+
- \`/design-review\` — Visual audit (consistency, spacing, hierarchy, AI slop). Commits atomic fixes with before/after screenshots.
|
|
68
|
+
|
|
69
|
+
For reproducible regression coverage that runs on every PR, prefer **Cypress** specs in \`test/cypress/\` instead of \`/qa\`. Reserve the gstack tools above for exploration, dogfooding, and one-shot visual debugging.`,
|
|
70
|
+
brainstormingInstruction: 'Brainstorm the implementation approach using the gstack sprint pipeline:\n' +
|
|
71
|
+
'1. Run `/office-hours` — six forcing questions that reframe the problem and write a design doc. This is where you challenge premises and surface alternatives before any code.\n' +
|
|
72
|
+
'2. Run `/autoplan` — it chains CEO → design → eng → DX reviews automatically (auto-detects which apply) and surfaces only the taste decisions you need to approve. Prefer this over manual orchestration.\n' +
|
|
73
|
+
'3. If you need fine control (e.g. skip a step, run one in isolation), invoke the individual skills instead: `/plan-ceo-review`, `/plan-eng-review`, `/plan-design-review`, `/plan-devex-review`.\n' +
|
|
74
|
+
'4. Wait for explicit user approval on the final plan before announcing brainstorming is done.',
|
|
50
75
|
};
|
|
51
76
|
export const AGNOSTIC_PROMPTS = {
|
|
52
77
|
reviewTemplate: AGNOSTIC_REVIEW_TEMPLATE,
|
|
53
78
|
autoLoopReviewGate: AGNOSTIC_AUTO_LOOP_REVIEW_GATE,
|
|
54
79
|
autoLoopGroomingIntro: AGNOSTIC_AUTO_LOOP_GROOMING_INTRO,
|
|
55
80
|
qaPromptTemplate: AGNOSTIC_QA_PROMPT_TEMPLATE,
|
|
81
|
+
brainstormingInstruction: AGNOSTIC_BRAINSTORMING_INSTRUCTION,
|
|
82
|
+
};
|
|
83
|
+
// ── Combined: superpowers + gstack ────────────────────────────────────────────
|
|
84
|
+
// For users who install BOTH suites and want prompts that surface each suite's
|
|
85
|
+
// strengths. Specialised by intent, not "use whichever is available":
|
|
86
|
+
// - /review (gstack) → tactical code-level bug-hunting + auto-fix
|
|
87
|
+
// - superpowers:requesting-code-review → principles-level critique (silent
|
|
88
|
+
// failures, surface-area discipline, test-design soundness)
|
|
89
|
+
// - /qa, /design-review, /browse → interactive QA (gstack only)
|
|
90
|
+
// - superpowers-chrome:browsing → low-level browser control fallback
|
|
91
|
+
export const COMBINED_PROMPTS = {
|
|
92
|
+
reviewTemplate: REVIEW_HEADER +
|
|
93
|
+
'Two complementary review skills are available — pick by intent:\n' +
|
|
94
|
+
'- `/review` (gstack Staff Engineer) for tactical bug-hunting that finds issues passing CI but blowing up in production. Auto-fixes the obvious ones.\n' +
|
|
95
|
+
'- `superpowers:requesting-code-review` for principles-level critique — silent failures, test-design soundness, surface-area discipline.\n' +
|
|
96
|
+
'You can run both on the same diff if the change is large. If neither is available, fall back to the manual checklist below.\n\n' +
|
|
97
|
+
REVIEW_BODY,
|
|
98
|
+
autoLoopReviewGate: 'Code review gate — BEFORE marking the task done, pick the appropriate review skill (two are installed):\n' +
|
|
99
|
+
'- Default to `/review` (gstack Staff Engineer) for tactical code-level bugs and auto-fixes.\n' +
|
|
100
|
+
'- Use `superpowers:requesting-code-review` instead when the task introduces tests, refactors, or design decisions worth a principles-level critique.\n\n' +
|
|
101
|
+
'Brief the chosen reviewer with: what you just implemented, the task title, and the commit SHA (via `git rev-parse HEAD`). Ask specifically whether the change matches the task scope, whether edge cases are handled, and whether the commit is clean. If the reviewer auto-fixes minor issues, accept the fixes via an amend or fix-up commit, then re-run step 3 checks.',
|
|
102
|
+
autoLoopGroomingIntro: GROOMING_INTRO_COMBINED,
|
|
103
|
+
qaPromptTemplate: `QA pass for workspace "{{workspace_name}}" in project {{project_name}}.
|
|
104
|
+
|
|
105
|
+
Branch: {{branch_name}}
|
|
106
|
+
Staging URL: {{staging_url}}
|
|
107
|
+
|
|
108
|
+
Pick the right tool for the situation. gstack covers interactive QA; superpowers covers low-level browser control as a fallback.
|
|
109
|
+
|
|
110
|
+
gstack QA toolkit (preferred for interactive QA):
|
|
111
|
+
- \`/browse\` — Headless navigation: URL → interactions → screenshots. Use for quick dogfooding a flow or sanity-checking a PR.
|
|
112
|
+
- \`/qa {{staging_url}}\` — Systematic QA with automatic bug fixing. Three tiers (invoke as \`/qa Quick\`, \`/qa Standard\`, or \`/qa Exhaustive\`):
|
|
113
|
+
- **Quick** — critical and high-severity bugs only.
|
|
114
|
+
- **Standard** — adds medium-severity bugs.
|
|
115
|
+
- **Exhaustive** — adds cosmetic issues.
|
|
116
|
+
- \`/qa-only {{staging_url}}\` — Same methodology as \`/qa\` but report only, no code changes.
|
|
117
|
+
- \`/design-review\` — Visual audit (consistency, spacing, hierarchy, AI slop). Commits atomic fixes with before/after screenshots.
|
|
118
|
+
|
|
119
|
+
Superpowers alternative (low-level browser control):
|
|
120
|
+
- \`superpowers-chrome:browsing\` — Direct Chrome DevTools Protocol control over an existing Chrome session: multi-tab management, form automation, content extraction. Use when you need fine-grained control beyond what \`/browse\` exposes.
|
|
121
|
+
|
|
122
|
+
For reproducible regression coverage that runs on every PR, prefer **Cypress** specs in \`test/cypress/\` instead of any interactive QA skill. Reserve the tools above for exploration, dogfooding, and one-shot visual debugging.`,
|
|
123
|
+
brainstormingInstruction: 'Brainstorm using both suites — each plays to its strength:\n' +
|
|
124
|
+
'1. Early product framing: prefer gstack `/office-hours` for product-shaped work (six forcing questions + design doc). Fall back to `superpowers:brainstorming` for purely infra/refactor work where the product lens does not apply.\n' +
|
|
125
|
+
'2. Plan construction: prefer gstack `/autoplan` for the chained CEO/design/eng/DX pipeline. Use `superpowers:writing-plans` instead when you need a TDD-shaped multi-step plan that maps cleanly onto subagent dispatch.\n' +
|
|
126
|
+
'3. If you need fine control on either side, invoke the individual skills explicitly (`/plan-ceo-review`, `/plan-eng-review`, …) or stay with the superpowers brainstorm flow.\n' +
|
|
127
|
+
'4. For debugging during exploration, prefer `/investigate` (gstack — root-cause methodology) or `superpowers:systematic-debugging`, whichever you reach for first.\n' +
|
|
128
|
+
'5. Wait for explicit user approval on the final plan before announcing brainstorming is done.',
|
|
56
129
|
};
|
|
57
130
|
/**
|
|
58
131
|
* Resolve the suite prompts to use right now, given the global `skillSuite`
|
|
@@ -64,6 +137,8 @@ export function getSuitePrompts(suite, overrides) {
|
|
|
64
137
|
return SUPERPOWERS_PROMPTS;
|
|
65
138
|
if (suite === 'gstack')
|
|
66
139
|
return GSTACK_PROMPTS;
|
|
140
|
+
if (suite === 'superpowers+gstack')
|
|
141
|
+
return COMBINED_PROMPTS;
|
|
67
142
|
// custom mode: per-field fallback to AGNOSTIC when the override is missing/blank
|
|
68
143
|
const pick = (k) => {
|
|
69
144
|
const value = overrides[k];
|
|
@@ -76,5 +151,6 @@ export function getSuitePrompts(suite, overrides) {
|
|
|
76
151
|
autoLoopReviewGate: pick('autoLoopReviewGate'),
|
|
77
152
|
autoLoopGroomingIntro: pick('autoLoopGroomingIntro'),
|
|
78
153
|
qaPromptTemplate: pick('qaPromptTemplate'),
|
|
154
|
+
brainstormingInstruction: pick('brainstormingInstruction'),
|
|
79
155
|
};
|
|
80
156
|
}
|
|
@@ -409,6 +409,15 @@ export function getPrUrl(repoPath, branchName) {
|
|
|
409
409
|
return null;
|
|
410
410
|
}
|
|
411
411
|
}
|
|
412
|
+
// NOTE: `reviewThreads` is intentionally NOT in this list.
|
|
413
|
+
// As of `gh` CLI 2.92 (latest at time of writing) the `--json reviewThreads`
|
|
414
|
+
// flag is rejected with `Unknown JSON field: "reviewThreads"` — there is no
|
|
415
|
+
// stable `gh` version that exposes it via `pr view --json`. Until upstream
|
|
416
|
+
// adds it, `unresolvedReviewThreadsCount` stays at 0 and the
|
|
417
|
+
// "hide changes-requested badge when all threads are resolved" feature
|
|
418
|
+
// degrades to "badge stays visible". To restore that feature later, either
|
|
419
|
+
// (a) re-add the field here once `gh` supports it, or (b) make a separate
|
|
420
|
+
// `gh api graphql` call for `pullRequest.reviewThreads.nodes`.
|
|
412
421
|
const GH_PR_FIELDS = [
|
|
413
422
|
'number',
|
|
414
423
|
'title',
|
|
@@ -421,7 +430,6 @@ const GH_PR_FIELDS = [
|
|
|
421
430
|
'labels',
|
|
422
431
|
'latestReviews',
|
|
423
432
|
'reviewRequests',
|
|
424
|
-
'reviewThreads',
|
|
425
433
|
'statusCheckRollup',
|
|
426
434
|
'updatedAt',
|
|
427
435
|
].join(',');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/shared/skill-suite-prompts.ts
|
|
2
2
|
export function isValidSkillSuite(value) {
|
|
3
|
-
return value === 'superpowers' || value === 'gstack' || value === 'custom';
|
|
3
|
+
return value === 'superpowers' || value === 'gstack' || value === 'superpowers+gstack' || value === 'custom';
|
|
4
4
|
}
|
|
5
5
|
// ── Agnostic prompt strings ───────────────────────────────────────────────────
|
|
6
6
|
// These are the neutral, suite-free versions used both:
|
|
@@ -45,12 +45,14 @@ export const AGNOSTIC_REVIEW_TEMPLATE = REVIEW_HEADER +
|
|
|
45
45
|
export const AGNOSTIC_AUTO_LOOP_REVIEW_GATE = 'Code review gate — BEFORE marking the task done, run whichever code-review skill is configured in this environment. Brief it with: what you just implemented, the task title, and the commit SHA (via `git rev-parse HEAD`). Ask specifically whether the change matches the task scope, whether edge cases are handled, and whether the commit is clean. If no review skill is available, do a manual self-review against the same criteria.';
|
|
46
46
|
export const AGNOSTIC_AUTO_LOOP_GROOMING_INTRO = 'You are preparing this workspace for Kōbō auto-loop mode. This is a GROOMING session only — DO NOT implement anything, DO NOT write or edit code, DO NOT run tests or builds, DO NOT invoke any implementation, planning, or release skill (your environment may have several). Your ONLY job is to curate the Kōbō task list via MCP tools.';
|
|
47
47
|
export const AGNOSTIC_QA_PROMPT_TEMPLATE = 'QA pass for workspace "{{workspace_name}}" in project {{project_name}}.\n\nBranch: {{branch_name}}\nStaging URL: {{staging_url}}\n\nIf a QA skill is configured in this environment, invoke it on {{staging_url}}. Otherwise, manually exercise the staging URL against the workspace\'s acceptance criteria and report findings.';
|
|
48
|
+
export const AGNOSTIC_BRAINSTORMING_INSTRUCTION = 'Brainstorm the implementation approach. Explore the codebase to understand the existing structure. Ask clarifying questions if needed. When you have a clear, user-approved plan, save it as a plan file in the project.';
|
|
48
49
|
// ── Grooming intro: superpowers + gstack variants ────────────────────────────
|
|
49
50
|
// Only the grooming intro is needed shared (both backend auto-loop-prompts and
|
|
50
51
|
// frontend kobo-commands use it). The review/review-gate/QA variants are
|
|
51
52
|
// backend-only — they live in src/server/services/skill-suite-prompts.ts.
|
|
52
53
|
export const GROOMING_INTRO_SUPERPOWERS = 'You are preparing this workspace for Kōbō auto-loop mode. This is a GROOMING session only — DO NOT implement anything, DO NOT write or edit code, DO NOT run tests or builds, DO NOT invoke `superpowers:executing-plans` or any implementation skill. Your ONLY job is to curate the Kōbō task list via MCP tools.';
|
|
53
54
|
export const GROOMING_INTRO_GSTACK = 'You are preparing this workspace for Kōbō auto-loop mode. This is a GROOMING session only — DO NOT implement anything, DO NOT write or edit code, DO NOT run tests or builds, DO NOT invoke `/ship`, `/autoplan`, `/land-and-deploy`, or any implementation skill. Your ONLY job is to curate the Kōbō task list via MCP tools.';
|
|
55
|
+
export const GROOMING_INTRO_COMBINED = 'You are preparing this workspace for Kōbō auto-loop mode. This is a GROOMING session only — DO NOT implement anything, DO NOT write or edit code, DO NOT run tests or builds, DO NOT invoke `superpowers:executing-plans`, `/ship`, `/autoplan`, `/land-and-deploy`, or any other implementation, planning, or release skill. Your ONLY job is to curate the Kōbō task list via MCP tools.';
|
|
54
56
|
/**
|
|
55
57
|
* Resolve the grooming intro for the given suite. In `custom` mode, the
|
|
56
58
|
* user-provided override is used (or AGNOSTIC if the override is empty/blank).
|
|
@@ -60,6 +62,8 @@ export function getGroomingIntro(suite, customOverride) {
|
|
|
60
62
|
const trimmed = (customOverride ?? '').trim();
|
|
61
63
|
return trimmed || AGNOSTIC_AUTO_LOOP_GROOMING_INTRO;
|
|
62
64
|
}
|
|
65
|
+
if (suite === 'superpowers+gstack')
|
|
66
|
+
return GROOMING_INTRO_COMBINED;
|
|
63
67
|
if (suite === 'gstack')
|
|
64
68
|
return GROOMING_INTRO_GSTACK;
|
|
65
69
|
return GROOMING_INTRO_SUPERPOWERS;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.11",
|
|
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{E as e,F as t,H as n,L as r,M as i,N as a,Q as o,U as s,_t as c,bt as l,d as u,f as d,g as f,h as p,l as m,p as h,r as g,rt as _,u as v,v as y,yt as b}from"./runtime-core.esm-bundler-9Z0QAO_7.js";import{U as x,l as S,t as C}from"./QIcon-qfJNZLIW.js";import{c as w,s as T}from"./notifications-
|
|
1
|
+
import{E as e,F as t,H as n,L as r,M as i,N as a,Q as o,U as s,_t as c,bt as l,d as u,f as d,g as f,h as p,l as m,p as h,r as g,rt as _,u as v,v as y,yt as b}from"./runtime-core.esm-bundler-9Z0QAO_7.js";import{U as x,l as S,t as C}from"./QIcon-qfJNZLIW.js";import{c as w,s as T}from"./notifications-C4jB7A2f.js";import{t as E}from"./QBtn-CaJSOyt8.js";import{n as D}from"./vue-i18n-CKCtKE87.js";import{c as O,f as ee,h as k,u as A}from"./index-ABhgwrBB.js";import{t as j}from"./QSpinnerDots-Bfl2RMy4.js";import{t as M}from"./QTooltip-CTNw68oZ.js";import{t as te}from"./QExpansionItem-DQ66zLAu.js";import{n as ne,r as re,t as N}from"./render-chat-markdown-C9L-kzlg.js";import{n as P}from"./purify.es-BYydQXtR.js";import{t as F}from"./documents-soWtna0O.js";import{t as I}from"./_plugin-vue_export-helper-Cj6tcsj6.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}function L(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:`user`;case`session`:return`session`;default:return`agent`}}function oe(e){let t=[],n=null;for(let r of e){let e=L(r),i=e===`session`||e===`system-prompt`;!n||n.speaker!==e||i?(n={speaker:e,ts:r.ts,items:[r]},t.push(n),i&&(n=null)):n.items.push(r)}return t}var R={class:`text-caption text-grey-6`},z=y({__name:`SessionEventItem`,props:{item:{}},setup(e){let n=e,r=m(()=>{switch(n.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,n)=>(t(),h(`span`,R,l(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){ce(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 ce(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=B(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 B(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 le=[`innerHTML`],V=I(y({__name:`TextMessageItem`,props:{item:{}},setup(e){let n=e,r=F(),i=O(),a=m(()=>{let e=i.selectedWorkspaceId;return e?r.documentsFor(e).map(e=>e.path):[]}),o=m(()=>ne(se(P.parse(n.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(n,r)=>(t(),h(`div`,{class:`markdown-message`,onClick:s},[v(`div`,{innerHTML:o.value},null,8,le),e.item.streaming?(t(),u(S,{key:0,size:`xs`,class:`q-ml-xs`})):d(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]),ue={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},H=[`innerHTML`],U={key:1,style:{"white-space":`pre-wrap`}},W=I(y({__name:`ThinkingItem`,props:{item:{}},setup(e){let n=e,r=m(()=>n.item.text.trim().slice(0,100)),i=m(()=>n.item.text.trim().length>0),a=m(()=>n.item.text.trim().length>100),o=m(()=>N(n.item.text));return(n,c)=>i.value?(t(),h(`div`,ue,[a.value?(t(),u(te,{key:0,dense:``,"dense-toggle":``,label:r.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:s(()=>[v(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:o.value},null,8,H)]),_:1},8,[`label`])):(t(),h(`span`,U,l(e.item.text),1))])):d(``,!0)}}),[[`__scopeId`,`data-v-7f45ed94`]]);function G(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{F as e,b as t}from"./QIcon-qfJNZLIW.js";import{C as n,w as r}from"./notifications-
|
|
1
|
+
import{F as e,b as t}from"./QIcon-qfJNZLIW.js";import{C as n,w as r}from"./notifications-C4jB7A2f.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=r(e);i!==void 0&&n(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{E as e,F as t,H as n,L as r,M as i,N as ee,Q as a,T as te,U as o,_t as ne,bt as s,d as c,f as l,g as u,h as d,l as f,p,r as re,rt as m,u as h,v as ie,vt as ae,x as oe}from"./runtime-core.esm-bundler-9Z0QAO_7.js";import{H as se,R as ce,U as g,t as _}from"./QIcon-qfJNZLIW.js";import{r as v}from"./use-id-_7wiRcgb.js";import{s as le}from"./notifications-CEyiPnmw.js";import{t as y}from"./QBtn-CaJSOyt8.js";import{n as ue}from"./vue-i18n-CKCtKE87.js";import{t as b}from"./QInput-DCJEwE8V.js";import{c as de,i as fe,m as pe,o as me}from"./index-Dx_W9yYo.js";import{t as he}from"./QSpinnerDots-Bfl2RMy4.js";import{n as x,t as S}from"./QItemSection-Bz1ZDJO5.js";import{t as C}from"./QItemLabel-CHkgkZVj.js";import{t as w}from"./QTooltip-CbLXk2Bs.js";import{t as ge}from"./QExpansionItem-Fij7yBbG.js";import{t as _e}from"./_plugin-vue_export-helper-Cj6tcsj6.js";import{t as ve}from"./QSpace-DKIph84L.js";import{t as ye}from"./use-quasar-DQYS47mh.js";import{a as T,i as be,r as xe,t as Se}from"./permissionModes-CPZlEHoF.js";import{t as Ce}from"./QPage-Co2h9wd_.js";import{a as we,i as Te,n as Ee,r as De,t as Oe}from"./expand-template-GaEux9_o.js";var E=`kobo:create-page-prefs`;function ke(){try{let e=localStorage.getItem(E);return e===null?void 0:JSON.parse(e)}catch{return}}function D(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ae(){let e=ke();if(!D(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 je(e){try{localStorage.setItem(E,JSON.stringify(e))}catch{}}var Me={class:`create-inner`},Ne={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Pe={class:`create-card rounded-borders`},Fe={class:`card-top-bar row items-center q-px-md q-py-xs`},Ie={class:`model-badge cursor-default row items-center q-gutter-xs`},Le={class:`text-indigo-3 text-weight-medium text-caption`},Re={key:0,class:`notion-url-wrap`},ze={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Be={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},Ve={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},He={class:`text-caption text-grey-4 q-mb-sm`},Ue={class:`row q-gutter-sm`},We={class:`peek-card-text`},Ge={class:`peek-card-title`},Ke={class:`peek-card-desc`},qe={class:`peek-card-text`},Je={class:`peek-card-title`},Ye={class:`peek-card-desc`},Xe={key:0,class:`sentry-url-wrap`},Ze={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},Qe={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},$e={class:`card-name-wrap`},et={class:`card-textarea-wrap`},tt={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},nt={key:0,class:`row items-center text-caption text-amber-6`},rt={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},it={class:`q-pa-sm manual-section-body`},at={class:`row items-center q-gutter-sm q-mb-sm`},ot={class:`col text-caption text-grey-4`},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:`card-bottom-bar`},dt={class:`row q-col-gutter-xs q-px-xs`},ft={key:0,class:`col-12 col-sm-6 col-md-3`},pt={class:`bottom-select-label row items-center no-wrap`},mt={class:`col-12 col-sm-6 col-md-3`},ht={class:`bottom-select-label row items-center no-wrap`},gt={class:`col-12 col-sm-6 col-md-3`},_t={class:`bottom-select-label row items-center no-wrap`},vt={class:`col-12 col-md-3`},yt={class:`bottom-select-label row items-center no-wrap`},bt={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},xt={class:`col-12 col-md-auto`},St={class:`col-12 col-md-auto`},Ct={class:`col-12 col-md-auto`},wt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Tt={class:`col-12 col-md-4`},Et={key:0,class:`col-12 col-md-4`},Dt={class:`bottom-select-label row items-center no-wrap`},Ot={key:1,class:`col-12 col-md-4`},kt={class:`bottom-select-label row items-center no-wrap`},At={class:`col-12 col-md-4`},jt={class:`bottom-select-label row items-center no-wrap`},Mt={class:`row justify-center q-px-sm q-py-sm`},Nt={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Pt=6e4,O=_e(ie({__name:`CreatePage`,setup(ie){let _e=fe(),E=ye(),ke=de(),D=le(),{t:O}=ue(),Ft=a([]),It=a(``),k=a(``),Lt=a(null),A=a(!1),j=a(!1),Rt=a(null),zt=a(null),Bt=a([]),Vt=a(null),M=a(``),N=a(!1),P=a(`claude-opus-4-7`),F=a(`auto`),I=a(``),L=a(null),Ht=a(`feature`),R=a(!1),Ut=f(()=>D.global.voiceEnabled),Wt=a([]),z=a(`claude-code`),Gt=f(()=>Wt.value.find(e=>e.id===z.value)),Kt=f(()=>Wt.value.map(e=>({value:e.id,label:e.displayName}))),qt=[{label:`feature/`,value:`feature`},{label:`fix/`,value:`fix`},{label:`hotfix/`,value:`hotfix`},{label:`chore/`,value:`chore`},{label:`refactor/`,value:`refactor`},{label:`docs/`,value:`docs`},{label:`test/`,value:`test`}],Jt=[`plan`,`bypass`,`strict`,`interactive`];function Yt(e,t){let n=e?D.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Jt.includes(r))return r;let i=D.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Jt.includes(i)?i:n?.dangerouslySkipPermissions??D.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let B=a(Yt(``,z.value)),Xt=f(()=>{switch(B.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),Zt=f(()=>(Se[z.value]??Jt).map(e=>({value:e,label:O(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),V=a([]),Qt=a([]),$t=a(!1),en=a(!1);function tn(e,t){t(()=>{Qt.value=e?V.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):V.value})}let nn=pe();function rn(){return Lt.value?.nativeEl??null}let{showSkills:an,selectedSkillIndex:H,groupedDropdown:on,flatDropdown:U,fetchSkills:sn,detectSlashFragment:cn,replaceFragmentWith:ln,closeDropdown:un}=Te(k,rn,{excludeKoboCommands:!0});sn(),n(k,async()=>{await e(),await cn()});function dn(e){if(e.type===`template`){let t=nn.templates.find(t=>t.slug===e.name);if(!t)return;ln(Ee(t.content,Oe({workspace:null,gitStats:null,sessionName:null}))),un();return}ln(`/${e.name} `),un()}function fn(e){!an.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(),dn(U.value[H.value])):e.key===`Escape`&&(e.preventDefault(),un()))}async function pn(){if(!(!Ut.value||A.value||j.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){E.notify({type:`warning`,message:O(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});zt.value=e,Bt.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&&Bt.value.push(e.data)},n.start(),Rt.value=n,A.value=!0,Vt.value=setTimeout(()=>{W(),E.notify({type:`info`,message:O(`voice.maxDurationReached`),position:`top`,timeout:3500})},Pt)}catch{E.notify({type:`negative`,message:O(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function W(){if(!A.value)return;let e=Rt.value;if(!e)return;A.value=!1,j.value=!0,Vt.value&&=(clearTimeout(Vt.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Bt.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`,D.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()&&(k.value=k.value?`${k.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;E.notify({type:`negative`,message:O({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{Rt.value=null,Bt.value=[],zt.value?.getTracks().forEach(e=>{e.stop()}),zt.value=null,j.value=!1}}function mn(e){return Ut.value?D.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function hn(e){!mn(e)||e.repeat||(e.preventDefault(),pn())}function gn(e){mn(e)&&(e.preventDefault(),W())}function _n(){A.value&&W()}function vn(){document.visibilityState!==`visible`&&A.value&&W()}let yn=f(()=>(be[z.value]??xe).map(e=>({label:O(e.i18nLabelKey),value:e.value,description:O(e.i18nDescriptionKey)})));n(z,()=>{let e=yn.value.map(e=>e.value);if(e.length>0){let t=D.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?P.value=t:e.includes(P.value)||(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=Se[z.value]??[];t.length>0&&!t.includes(B.value)&&(B.value=Yt(I.value,z.value));let n=(De[z.value]??[]).map(e=>e.value);n.length>0&&!n.includes(F.value)&&(F.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function bn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let xn=f(()=>(De[z.value]??De[`claude-code`]).map(e=>({value:e.value,label:bn(O(e.i18nLabelKey)),description:O(e.i18nDescriptionKey)}))),G=f(()=>M.value.trim().startsWith(`https://www.notion.so/`)),Sn=f(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(M.value)),K=a(`panel`);function Cn(){let e=M.value.trim();return K.value===`parent`&&Sn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let q=a([]),J=a([]),wn=a(``),Tn=a(``),En=f(()=>!N.value||!G.value);function Dn(){let e=wn.value.trim();e&&(q.value.push(e),wn.value=``)}function On(e){q.value.splice(e,1)}function kn(){let e=Tn.value.trim();e&&(J.value.push(e),Tn.value=``)}function An(e){J.value.splice(e,1)}function jn(){N.value=!N.value,N.value||(M.value=``)}let Y=a(!1),X=a(!1);n(()=>X.value,e=>{e&&B.value!==`bypass`&&(B.value=`bypass`,E.notify({type:`info`,message:O(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let Z=a(``),Mn=f(()=>/\/issues\/\d+/.test(Z.value.trim()));function Nn(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=a(!1),$=a(null),Pn=a([]),Fn=a(!1);async function In(){if(!I.value.trim()){Pn.value=[];return}Fn.value=!0;try{Pn.value=await ke.fetchOrphanWorktrees(I.value.trim())}catch{Pn.value=[]}finally{Fn.value=!1}}function Ln(){Q.value=!Q.value,Q.value?(N.value=!1,M.value=``,Y.value=!1,Z.value=``,R.value=!0,In()):$.value=null}n(I,()=>{$.value=null,Q.value&&In()}),n($,e=>{if(!e)return;let t=Pn.value.find(t=>t.path===e);t&&(L.value=t.suggestedSourceBranch),R.value=!0});async function Rn(e){if(!e.trim()){V.value=[],L.value=null;return}$t.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&&!L.value&&(L.value=V.value[0]??null)}catch{V.value=[],L.value=null}finally{$t.value=!1}}function zn(e){let t=D.getProjectByPath(e);if(t){t.defaultSourceBranch&&(L.value=t.defaultSourceBranch);let e=yn.value.map(e=>e.value);if(t.defaultModel&&e.includes(t.defaultModel))P.value=t.defaultModel;else{let t=D.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)&&(P.value=t)}}B.value=Yt(e,z.value)}let Bn=null;n(I,e=>{Bn&&clearTimeout(Bn),Bn=setTimeout(()=>{L.value=null,Rn(e),zn(e)},500)});function Vn(e,t){t(()=>{Ft.value=D.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}i(async()=>{await D.fetchSettings();let e=Ae();e.autoLoop===!0&&(X.value=!0),e.projectPath&&D.projectPaths.includes(e.projectPath)&&(I.value=e.projectPath),B.value=Yt(I.value,z.value);try{let e=await fetch(`/api/engines`);e.ok&&(Wt.value=await e.json())}catch{}{let e=yn.value.map(e=>e.value),t=D.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?P.value=t:e.length>0&&!e.includes(P.value)&&(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,hn),window.addEventListener(`keyup`,gn),window.addEventListener(`blur`,_n),document.addEventListener(`visibilitychange`,vn)}),ee(()=>{Bn&&clearTimeout(Bn),window.removeEventListener(`keydown`,hn),window.removeEventListener(`keyup`,gn),window.removeEventListener(`blur`,_n),document.removeEventListener(`visibilitychange`,vn),Vt.value&&=(clearTimeout(Vt.value),null),A.value&&W()});function Hn(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 Un(){return It.value.trim()?It.value.trim().substring(0,80):!N.value&&!Y.value&&k.value.trim()&&(k.value.trim().split(`
|
|
1
|
+
import{E as e,F as t,H as n,L as r,M as i,N as ee,Q as a,T as te,U as o,_t as ne,bt as s,d as c,f as l,g as u,h as d,l as f,p,r as re,rt as m,u as h,v as ie,vt as ae,x as oe}from"./runtime-core.esm-bundler-9Z0QAO_7.js";import{H as se,R as ce,U as g,t as _}from"./QIcon-qfJNZLIW.js";import{r as v}from"./use-id-_7wiRcgb.js";import{s as le}from"./notifications-C4jB7A2f.js";import{t as y}from"./QBtn-CaJSOyt8.js";import{n as ue}from"./vue-i18n-CKCtKE87.js";import{t as b}from"./QInput-DCJEwE8V.js";import{c as de,i as fe,m as pe,o as me}from"./index-ABhgwrBB.js";import{t as he}from"./QSpinnerDots-Bfl2RMy4.js";import{n as x,t as S}from"./QItemSection-Bz1ZDJO5.js";import{t as C}from"./QItemLabel-CHkgkZVj.js";import{t as w}from"./QTooltip-CTNw68oZ.js";import{t as ge}from"./QExpansionItem-DQ66zLAu.js";import{t as _e}from"./_plugin-vue_export-helper-Cj6tcsj6.js";import{t as ve}from"./QSpace-DKIph84L.js";import{t as ye}from"./use-quasar-DQYS47mh.js";import{a as T,i as be,r as xe,t as Se}from"./permissionModes-CRue7srp.js";import{t as Ce}from"./QPage-Co2h9wd_.js";import{a as we,i as Te,n as Ee,r as De,t as Oe}from"./expand-template-_Y9C3CjP.js";var E=`kobo:create-page-prefs`;function ke(){try{let e=localStorage.getItem(E);return e===null?void 0:JSON.parse(e)}catch{return}}function D(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ae(){let e=ke();if(!D(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 je(e){try{localStorage.setItem(E,JSON.stringify(e))}catch{}}var Me={class:`create-inner`},Ne={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Pe={class:`create-card rounded-borders`},Fe={class:`card-top-bar row items-center q-px-md q-py-xs`},Ie={class:`model-badge cursor-default row items-center q-gutter-xs`},Le={class:`text-indigo-3 text-weight-medium text-caption`},Re={key:0,class:`notion-url-wrap`},ze={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Be={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},Ve={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},He={class:`text-caption text-grey-4 q-mb-sm`},Ue={class:`row q-gutter-sm`},We={class:`peek-card-text`},Ge={class:`peek-card-title`},Ke={class:`peek-card-desc`},qe={class:`peek-card-text`},Je={class:`peek-card-title`},Ye={class:`peek-card-desc`},Xe={key:0,class:`sentry-url-wrap`},Ze={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},Qe={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},$e={class:`card-name-wrap`},et={class:`card-textarea-wrap`},tt={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},nt={key:0,class:`row items-center text-caption text-amber-6`},rt={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},it={class:`q-pa-sm manual-section-body`},at={class:`row items-center q-gutter-sm q-mb-sm`},ot={class:`col text-caption text-grey-4`},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:`card-bottom-bar`},dt={class:`row q-col-gutter-xs q-px-xs`},ft={key:0,class:`col-12 col-sm-6 col-md-3`},pt={class:`bottom-select-label row items-center no-wrap`},mt={class:`col-12 col-sm-6 col-md-3`},ht={class:`bottom-select-label row items-center no-wrap`},gt={class:`col-12 col-sm-6 col-md-3`},_t={class:`bottom-select-label row items-center no-wrap`},vt={class:`col-12 col-md-3`},yt={class:`bottom-select-label row items-center no-wrap`},bt={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},xt={class:`col-12 col-md-auto`},St={class:`col-12 col-md-auto`},Ct={class:`col-12 col-md-auto`},wt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Tt={class:`col-12 col-md-4`},Et={key:0,class:`col-12 col-md-4`},Dt={class:`bottom-select-label row items-center no-wrap`},Ot={key:1,class:`col-12 col-md-4`},kt={class:`bottom-select-label row items-center no-wrap`},At={class:`col-12 col-md-4`},jt={class:`bottom-select-label row items-center no-wrap`},Mt={class:`row justify-center q-px-sm q-py-sm`},Nt={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Pt=6e4,O=_e(ie({__name:`CreatePage`,setup(ie){let _e=fe(),E=ye(),ke=de(),D=le(),{t:O}=ue(),Ft=a([]),It=a(``),k=a(``),Lt=a(null),A=a(!1),j=a(!1),Rt=a(null),zt=a(null),Bt=a([]),Vt=a(null),M=a(``),N=a(!1),P=a(`claude-opus-4-7`),F=a(`auto`),I=a(``),L=a(null),Ht=a(`feature`),R=a(!1),Ut=f(()=>D.global.voiceEnabled),Wt=a([]),z=a(`claude-code`),Gt=f(()=>Wt.value.find(e=>e.id===z.value)),Kt=f(()=>Wt.value.map(e=>({value:e.id,label:e.displayName}))),qt=[{label:`feature/`,value:`feature`},{label:`fix/`,value:`fix`},{label:`hotfix/`,value:`hotfix`},{label:`chore/`,value:`chore`},{label:`refactor/`,value:`refactor`},{label:`docs/`,value:`docs`},{label:`test/`,value:`test`}],Jt=[`plan`,`bypass`,`strict`,`interactive`];function Yt(e,t){let n=e?D.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Jt.includes(r))return r;let i=D.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Jt.includes(i)?i:n?.dangerouslySkipPermissions??D.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let B=a(Yt(``,z.value)),Xt=f(()=>{switch(B.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),Zt=f(()=>(Se[z.value]??Jt).map(e=>({value:e,label:O(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),V=a([]),Qt=a([]),$t=a(!1),en=a(!1);function tn(e,t){t(()=>{Qt.value=e?V.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):V.value})}let nn=pe();function rn(){return Lt.value?.nativeEl??null}let{showSkills:an,selectedSkillIndex:H,groupedDropdown:on,flatDropdown:U,fetchSkills:sn,detectSlashFragment:cn,replaceFragmentWith:ln,closeDropdown:un}=Te(k,rn,{excludeKoboCommands:!0});sn(),n(k,async()=>{await e(),await cn()});function dn(e){if(e.type===`template`){let t=nn.templates.find(t=>t.slug===e.name);if(!t)return;ln(Ee(t.content,Oe({workspace:null,gitStats:null,sessionName:null}))),un();return}ln(`/${e.name} `),un()}function fn(e){!an.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(),dn(U.value[H.value])):e.key===`Escape`&&(e.preventDefault(),un()))}async function pn(){if(!(!Ut.value||A.value||j.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){E.notify({type:`warning`,message:O(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});zt.value=e,Bt.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&&Bt.value.push(e.data)},n.start(),Rt.value=n,A.value=!0,Vt.value=setTimeout(()=>{W(),E.notify({type:`info`,message:O(`voice.maxDurationReached`),position:`top`,timeout:3500})},Pt)}catch{E.notify({type:`negative`,message:O(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function W(){if(!A.value)return;let e=Rt.value;if(!e)return;A.value=!1,j.value=!0,Vt.value&&=(clearTimeout(Vt.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Bt.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`,D.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()&&(k.value=k.value?`${k.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;E.notify({type:`negative`,message:O({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{Rt.value=null,Bt.value=[],zt.value?.getTracks().forEach(e=>{e.stop()}),zt.value=null,j.value=!1}}function mn(e){return Ut.value?D.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function hn(e){!mn(e)||e.repeat||(e.preventDefault(),pn())}function gn(e){mn(e)&&(e.preventDefault(),W())}function _n(){A.value&&W()}function vn(){document.visibilityState!==`visible`&&A.value&&W()}let yn=f(()=>(be[z.value]??xe).map(e=>({label:O(e.i18nLabelKey),value:e.value,description:O(e.i18nDescriptionKey)})));n(z,()=>{let e=yn.value.map(e=>e.value);if(e.length>0){let t=D.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?P.value=t:e.includes(P.value)||(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=Se[z.value]??[];t.length>0&&!t.includes(B.value)&&(B.value=Yt(I.value,z.value));let n=(De[z.value]??[]).map(e=>e.value);n.length>0&&!n.includes(F.value)&&(F.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function bn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let xn=f(()=>(De[z.value]??De[`claude-code`]).map(e=>({value:e.value,label:bn(O(e.i18nLabelKey)),description:O(e.i18nDescriptionKey)}))),G=f(()=>M.value.trim().startsWith(`https://www.notion.so/`)),Sn=f(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(M.value)),K=a(`panel`);function Cn(){let e=M.value.trim();return K.value===`parent`&&Sn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let q=a([]),J=a([]),wn=a(``),Tn=a(``),En=f(()=>!N.value||!G.value);function Dn(){let e=wn.value.trim();e&&(q.value.push(e),wn.value=``)}function On(e){q.value.splice(e,1)}function kn(){let e=Tn.value.trim();e&&(J.value.push(e),Tn.value=``)}function An(e){J.value.splice(e,1)}function jn(){N.value=!N.value,N.value||(M.value=``)}let Y=a(!1),X=a(!1);n(()=>X.value,e=>{e&&B.value!==`bypass`&&(B.value=`bypass`,E.notify({type:`info`,message:O(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let Z=a(``),Mn=f(()=>/\/issues\/\d+/.test(Z.value.trim()));function Nn(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=a(!1),$=a(null),Pn=a([]),Fn=a(!1);async function In(){if(!I.value.trim()){Pn.value=[];return}Fn.value=!0;try{Pn.value=await ke.fetchOrphanWorktrees(I.value.trim())}catch{Pn.value=[]}finally{Fn.value=!1}}function Ln(){Q.value=!Q.value,Q.value?(N.value=!1,M.value=``,Y.value=!1,Z.value=``,R.value=!0,In()):$.value=null}n(I,()=>{$.value=null,Q.value&&In()}),n($,e=>{if(!e)return;let t=Pn.value.find(t=>t.path===e);t&&(L.value=t.suggestedSourceBranch),R.value=!0});async function Rn(e){if(!e.trim()){V.value=[],L.value=null;return}$t.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&&!L.value&&(L.value=V.value[0]??null)}catch{V.value=[],L.value=null}finally{$t.value=!1}}function zn(e){let t=D.getProjectByPath(e);if(t){t.defaultSourceBranch&&(L.value=t.defaultSourceBranch);let e=yn.value.map(e=>e.value);if(t.defaultModel&&e.includes(t.defaultModel))P.value=t.defaultModel;else{let t=D.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)&&(P.value=t)}}B.value=Yt(e,z.value)}let Bn=null;n(I,e=>{Bn&&clearTimeout(Bn),Bn=setTimeout(()=>{L.value=null,Rn(e),zn(e)},500)});function Vn(e,t){t(()=>{Ft.value=D.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}i(async()=>{await D.fetchSettings();let e=Ae();e.autoLoop===!0&&(X.value=!0),e.projectPath&&D.projectPaths.includes(e.projectPath)&&(I.value=e.projectPath),B.value=Yt(I.value,z.value);try{let e=await fetch(`/api/engines`);e.ok&&(Wt.value=await e.json())}catch{}{let e=yn.value.map(e=>e.value),t=D.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?P.value=t:e.length>0&&!e.includes(P.value)&&(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,hn),window.addEventListener(`keyup`,gn),window.addEventListener(`blur`,_n),document.addEventListener(`visibilitychange`,vn)}),ee(()=>{Bn&&clearTimeout(Bn),window.removeEventListener(`keydown`,hn),window.removeEventListener(`keyup`,gn),window.removeEventListener(`blur`,_n),document.removeEventListener(`visibilitychange`,vn),Vt.value&&=(clearTimeout(Vt.value),null),A.value&&W()});function Hn(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 Un(){return It.value.trim()?It.value.trim().substring(0,80):!N.value&&!Y.value&&k.value.trim()&&(k.value.trim().split(`
|
|
2
2
|
`)[0]??``).substring(0,80)||`workspace`}function Wn(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 Gn(){return N.value&&!G.value?O(`createPage.validationNotionUrl`):Y.value&&!Mn.value?O(`createPage.sentryValidation`):!N.value&&!Y.value&&!k.value.trim()?O(`createPage.validationDescription`):!N.value&&!Y.value&&(!Un()||Un()===`workspace`)&&!It.value.trim()&&!k.value.trim()?O(`createPage.validationName`):I.value.trim()?L.value?null:O(`createPage.validationBranch`):O(`createPage.validationPath`)}async function Kn(){let e=Gn();if(e){E.notify({type:`negative`,message:e,position:`top`});return}if(Q.value&&!$.value){E.notify({type:`negative`,message:O(`createPage.pickWorktreeRequired`),position:`top`});return}en.value=!0;try{let e=Un(),t;t=N.value&&G.value?Wn(Cn()):e===`workspace`?`task-${Date.now()}`:Hn(e);let n=`${Ht.value}/${t}`,r={name:e,projectPath:I.value.trim(),sourceBranch:L.value,...Q.value&&$.value?{worktreePath:$.value,skipSetupScript:!0}:{workingBranch:n},engine:z.value,model:P.value,reasoningEffort:F.value,...N.value&&G.value?{notionUrl:Cn()}:{},...Y.value&&Mn.value?{sentryUrl:Z.value.trim()}:{},...En.value&&q.value.length>0?{tasks:q.value}:{},...En.value&&J.value.length>0?{acceptanceCriteria:J.value}:{},...R.value&&!Q.value?{skipSetupScript:!0}:{},...k.value.trim()?{description:k.value.trim()}:{},...X.value?{autoLoop:!0}:{},agentPermissionMode:X.value&&B.value===`plan`?`bypass`:B.value},i=await ke.createWorkspace(r);je({projectPath:I.value.trim(),autoLoop:X.value}),me().subscribe(i.id),ke.selectWorkspace(i.id),_e.push({name:`workspace`,params:{id:i.id}})}catch{E.notify({type:`negative`,message:O(`createPage.errorCreating`),position:`top`})}finally{en.value=!1}}return(e,n)=>(t(),c(Ce,{class:`create-page flex flex-center column`},{default:o(()=>[h(`div`,Me,[h(`div`,Ne,s(e.$t(`createPage.title`)),1),h(`div`,Pe,[h(`div`,Fe,[h(`span`,Ie,[u(_,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),h(`span`,Le,s(Gt.value?.displayName??e.$t(`createPage.claudeCode`)),1)]),u(ve),u(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:N.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,disable:Q.value,onClick:jn},{default:o(()=>[u(_,{name:`description`,size:`14px`,class:`q-mr-xs`}),d(` `+s(N.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`,`disable`]),u(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:Nn},{default:o(()=>[u(_,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),d(` `+s(Y.value?e.$t(`createPage.sentryEnabled`):e.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`,`disable`])]),u(v,{color:`grey-9`}),u(ce,{name:`slide`},{default:o(()=>[N.value?(t(),p(`div`,Re,[u(b,{modelValue:M.value,"onUpdate:modelValue":n[0]||=e=>M.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:o(()=>[u(_,{name:`link`,size:`16px`,color:G.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),M.value.trim()&&!G.value?(t(),p(`div`,ze,s(e.$t(`createPage.notionValidation`)),1)):l(``,!0),G.value?(t(),p(`div`,Be,s(e.$t(`createPage.notionAutoExtract`)),1)):l(``,!0),G.value&&Sn.value?(t(),p(`div`,Ve,[h(`div`,He,[u(_,{name:`info`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),d(` `+s(e.$t(`createPage.notionPanelChoiceLabel`)),1)]),h(`div`,Ue,[h(`button`,{type:`button`,class:ne([`peek-card col`,{"peek-card--active":K.value===`panel`}]),onClick:n[1]||=e=>K.value=`panel`},[u(_,{name:`article`,size:`22px`,class:`peek-card-icon`}),h(`div`,We,[h(`div`,Ge,s(e.$t(`createPage.notionPanelOption`)),1),h(`div`,Ke,s(e.$t(`createPage.notionPanelOptionDesc`)),1)]),K.value===`panel`?(t(),c(_,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):l(``,!0)],2),h(`button`,{type:`button`,class:ne([`peek-card col`,{"peek-card--active":K.value===`parent`}]),onClick:n[2]||=e=>K.value=`parent`},[u(_,{name:`folder_open`,size:`22px`,class:`peek-card-icon`}),h(`div`,qe,[h(`div`,Je,s(e.$t(`createPage.notionParentOption`)),1),h(`div`,Ye,s(e.$t(`createPage.notionParentOptionDesc`)),1)]),K.value===`parent`?(t(),c(_,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):l(``,!0)],2)])])):l(``,!0)])):l(``,!0)]),_:1}),N.value?(t(),c(v,{key:0,color:`grey-9`})):l(``,!0),u(ce,{name:`slide`},{default:o(()=>[Y.value?(t(),p(`div`,Xe,[u(b,{modelValue:Z.value,"onUpdate:modelValue":n[3]||=e=>Z.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:o(()=>[u(_,{name:`link`,size:`16px`,color:Mn.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Z.value.trim()&&!Mn.value?(t(),p(`div`,Ze,s(e.$t(`createPage.sentryValidation`)),1)):l(``,!0),Mn.value?(t(),p(`div`,Qe,s(e.$t(`createPage.sentryAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),Y.value?(t(),c(v,{key:1,color:`grey-9`})):l(``,!0),h(`div`,$e,[u(b,{modelValue:It.value,"onUpdate:modelValue":n[4]||=e=>It.value=e,borderless:``,dense:``,placeholder:N.value&&G.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),u(v,{color:`grey-9`}),h(`div`,et,[u(b,{ref_key:`descriptionRef`,ref:Lt,modelValue:k.value,"onUpdate:modelValue":n[5]||=e=>k.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:N.value?e.$t(`createPage.instructions`):e.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[fn,se(g(Kn,[`ctrl`]),[`enter`]),se(g(Kn,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`]),h(`div`,tt,[j.value?(t(),p(`div`,nt,[u(he,{size:`14px`,color:`amber-6`,class:`q-mr-xs`}),h(`span`,null,s(e.$t(`voice.transcribing`)),1)])):l(``,!0),u(y,{flat:``,dense:``,size:`sm`,icon:j.value?`hourglass_top`:A.value?`mic`:`mic_none`,color:A.value?`red-5`:j.value?`amber-6`:`grey-6`,disable:!Ut.value||j.value,class:ne({"voice-btn--recording":A.value}),onMousedown:g(pn,[`prevent`]),onMouseup:g(W,[`prevent`]),onMouseleave:g(W,[`prevent`]),onTouchstart:g(pn,[`prevent`]),onTouchend:g(W,[`prevent`])},{default:o(()=>[u(w,null,{default:o(()=>[d(s(j.value?e.$t(`voice.transcribing`):A.value?e.$t(`voice.recording`):e.$t(`voice.holdToTalk`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`disable`,`class`])]),m(an)&&m(U).length>0?(t(),c(we,{key:0,class:`create-slash-popup`,"grouped-dropdown":m(on),"flat-dropdown":m(U),"selected-index":m(H),onSelect:dn},null,8,[`grouped-dropdown`,`flat-dropdown`,`selected-index`])):l(``,!0)]),u(v,{color:`grey-9`}),En.value?(t(),p(re,{key:2},[h(`div`,rt,s(e.$t(`createPage.manualHint`)),1),u(ge,{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:o(()=>[h(`div`,it,[h(`div`,at,[u(b,{modelValue:wn.value,"onUpdate:modelValue":n[6]||=e=>wn.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:se(g(Dn,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!wn.value.trim(),onClick:Dn},{default:o(()=>[u(w,null,{default:o(()=>[d(s(e.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(t(!0),p(re,null,r(q.value,(n,r)=>(t(),p(`div`,{key:`task-${r}`,class:`row items-center q-py-xs manual-item`},[h(`span`,ot,s(n),1),u(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>On(r)},{default:o(()=>[u(w,null,{default:o(()=>[d(s(e.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(ge,{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:o(()=>[h(`div`,st,[h(`div`,ct,[u(b,{modelValue:Tn.value,"onUpdate:modelValue":n[7]||=e=>Tn.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:se(g(kn,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Tn.value.trim(),onClick:kn},{default:o(()=>[u(w,null,{default:o(()=>[d(s(e.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(t(!0),p(re,null,r(J.value,(n,r)=>(t(),p(`div`,{key:`crit-${r}`,class:`row items-center q-py-xs manual-item`},[h(`span`,lt,s(n),1),u(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>An(r)},{default:o(()=>[u(w,null,{default:o(()=>[d(s(e.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(v,{color:`grey-9`})],64)):l(``,!0),h(`div`,ut,[h(`div`,dt,[Kt.value.length>0?(t(),p(`div`,ft,[u(T,{modelValue:z.value,"onUpdate:modelValue":n[8]||=e=>z.value=e,options:Kt.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,pt,[u(_,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(Kt.value.find(e=>e.value===z.value)?.label??z.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(e.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])):l(``,!0),h(`div`,mt,[u(T,{modelValue:P.value,"onUpdate:modelValue":n[9]||=e=>P.value=e,options:yn.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,ht,[d(s(yn.value.find(e=>e.value===P.value)?.label??P.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(x,te(t,{class:`model-option`}),{default:o(()=>[u(S,null,{default:o(()=>[u(C,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(C,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),h(`div`,gt,[u(T,{modelValue:F.value,"onUpdate:modelValue":n[10]||=e=>F.value=e,options:xn.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,_t,[u(_,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(xn.value.find(e=>e.value===F.value)?.label??F.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(x,ae(oe(t)),{default:o(()=>[u(S,null,{default:o(()=>[u(C,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(C,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),h(`div`,vt,[u(T,{modelValue:B.value,"onUpdate:modelValue":n[11]||=e=>B.value=e,options:Zt.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:o(()=>[h(`span`,yt,[u(_,{name:Xt.value,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),d(` `+s(Zt.value.find(e=>e.value===B.value)?.label??B.value)+` `,1),X.value?l(``,!0):(t(),c(_,{key:0,name:`expand_more`,size:`12px`,color:`grey-5`}))])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(X.value?e.$t(`agentPermissionMode.autoLoopLocked`):e.$t(`agentPermissionMode.tooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`,`disable`,`option-disable`])])]),h(`div`,bt,[h(`div`,xt,[u(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:n[12]||=e=>X.value=!X.value},{default:o(()=>[u(w,null,{default:o(()=>[d(s(e.$t(`autoLoop.startInMode`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),h(`div`,St,[u(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:n[13]||=e=>R.value=!R.value},{default:o(()=>[u(w,null,{default:o(()=>[d(s(e.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),h(`div`,Ct,[u(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:Ln},null,8,[`color`,`label`])])]),h(`div`,wt,[h(`div`,Tt,[u(T,{modelValue:I.value,"onUpdate:modelValue":n[14]||=e=>I.value=e,options:Ft.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":I.value?``:`repo-input-empty`,placeholder:e.$t(`createPage.projectPath`),behavior:m(D).projectPaths.length>0?`menu`:`dialog`,onFilter:Vn,onInputValue:n[15]||=e=>{I.value=e}},{prepend:o(()=>[u(_,{name:`folder`,size:`14px`,color:`grey-5`})]),"no-option":o(()=>[u(x,null,{default:o(()=>[u(S,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`])]),Q.value?l(``,!0):(t(),p(`div`,Et,[u(T,{modelValue:Ht.value,"onUpdate:modelValue":n[16]||=e=>Ht.value=e,options:qt,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:o(()=>[h(`span`,Dt,[u(_,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(Ht.value)+`/ `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(e.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`])])),Q.value?(t(),p(`div`,Ot,[u(T,{modelValue:$.value,"onUpdate:modelValue":n[17]||=e=>$.value=e,options:Pn.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:Fn.value,disable:!I.value.trim()||Fn.value},{selected:o(()=>[h(`span`,kt,[u(_,{name:`folder_open`,size:`12px`,color:`cyan-5`,class:`q-mr-xs`}),d(` `+s($.value?Pn.value.find(e=>e.path===$.value)?.branch??$.value:e.$t(`createPage.worktreePickerLabel`))+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(e=>[u(x,ae(oe(e.itemProps)),{default:o(()=>[u(S,null,{default:o(()=>[u(C,null,{default:o(()=>[d(s(e.opt.branch),1)]),_:2},1024),u(C,{caption:``},{default:o(()=>[d(s(e.opt.path),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":o(()=>[u(x,null,{default:o(()=>[u(S,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(I.value.trim()?e.$t(`createPage.noOrphanWorktrees`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])):l(``,!0),h(`div`,At,[u(T,{modelValue:L.value,"onUpdate:modelValue":n[18]||=e=>L.value=e,options:Qt.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,"use-input":``,"input-debounce":`0`,loading:$t.value,disable:!I.value.trim()||$t.value,onFilter:tn},{selected:o(()=>[h(`span`,jt,[u(_,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(L.value??e.$t(`createPage.branch`))+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":o(()=>[u(x,null,{default:o(()=>[u(S,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(I.value.trim()?e.$t(`createPage.noBranches`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])])]),h(`div`,Mt,[u(y,{label:e.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:en.value,disable:en.value||Q.value&&!$.value,onClick:Kn},null,8,[`label`,`loading`,`disable`])])]),h(`div`,Nt,s(N.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-623b7f8c`]]);export{O as default};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-
|
|
2
|
-
import{F as e,H as t,L as n,M as r,N as i,Q as a,S as o,U as s,W as c,_t as l,bt as u,d,f,g as p,h as m,l as h,p as g,r as _,rt as v,u as y,v as b,yt as x}from"./runtime-core.esm-bundler-9Z0QAO_7.js";import{P as S,a as C,t as w}from"./QIcon-qfJNZLIW.js";import{r as ee}from"./use-id-_7wiRcgb.js";import{n as T,t as E}from"./QBtn-CaJSOyt8.js";import{n as te}from"./vue-i18n-CKCtKE87.js";import{i as D,o as O,t as k}from"./QInput-DCJEwE8V.js";import{c as ne,n as re,o as ie}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-DbnmDA5w.js","assets/index-ABhgwrBB.js","assets/vue-i18n-CKCtKE87.js","assets/runtime-core.esm-bundler-9Z0QAO_7.js","assets/QIcon-qfJNZLIW.js","assets/use-id-_7wiRcgb.js","assets/QBtn-CaJSOyt8.js","assets/QRadio-4HnR_A-K.js","assets/use-checkbox-y_fOkYZN.js","assets/QInput-DCJEwE8V.js","assets/QCheckbox-BvHfXBFY.js","assets/QToggle-DNOTC_3a.js","assets/notifications-C4jB7A2f.js","assets/index-eX_lKHSg.css","assets/editor.api-Dgjer8XO.js","assets/editor-COGk2gAX.css","assets/monaco.contribution-DBBmYj6f.js","assets/editor-CS3NEPi9.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{F as e,H as t,L as n,M as r,N as i,Q as a,S as o,U as s,W as c,_t as l,bt as u,d,f,g as p,h as m,l as h,p as g,r as _,rt as v,u as y,v as b,yt as x}from"./runtime-core.esm-bundler-9Z0QAO_7.js";import{P as S,a as C,t as w}from"./QIcon-qfJNZLIW.js";import{r as ee}from"./use-id-_7wiRcgb.js";import{n as T,t as E}from"./QBtn-CaJSOyt8.js";import{n as te}from"./vue-i18n-CKCtKE87.js";import{i as D,o as O,t as k}from"./QInput-DCJEwE8V.js";import{c as ne,n as re,o as ie}from"./index-ABhgwrBB.js";import{t as ae}from"./QSpinnerDots-Bfl2RMy4.js";import{n as oe,t as se}from"./QItemSection-Bz1ZDJO5.js";import{t as A}from"./QTooltip-CTNw68oZ.js";import{r as ce,t as j}from"./render-chat-markdown-C9L-kzlg.js";import{t as M}from"./_plugin-vue_export-helper-Cj6tcsj6.js";import{t as N}from"./QBadge-C7r6oPSi.js";import{t as le}from"./QSpace-DKIph84L.js";import{i as P,n as ue,r as de,t as fe}from"./build-path-tree-DGuSpWFG.js";import{t as pe}from"./QList-BbnN_oNX.js";import{t as me}from"./QMenu-pgVPfC7Y.js";import{t as he}from"./ClosePopup-Bs-9Klyd.js";import{t as ge}from"./use-quasar-DQYS47mh.js";var F=S({name:`QBtnToggle`,props:{...O,modelValue:{required:!0},options:{type:Array,required:!0,validator:e=>e.every(e=>(`label`in e||`icon`in e||`slot`in e)&&`value`in e)},color:String,textColor:String,toggleColor:{type:String,default:`primary`},toggleTextColor:String,outline:Boolean,flat:Boolean,unelevated:Boolean,rounded:Boolean,push:Boolean,glossy:Boolean,size:String,padding:String,noCaps:Boolean,noWrap:Boolean,dense:Boolean,readonly:Boolean,disable:Boolean,stack:Boolean,stretch:Boolean,spread:Boolean,clearable:Boolean,ripple:{type:[Boolean,Object],default:!0}},emits:[`update:modelValue`,`clear`,`click`],setup(e,{slots:t,emit:n}){let r=h(()=>e.options.find(t=>t.value===e.modelValue)!==void 0),i=D(h(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),a=h(()=>T(e)),s=h(()=>({rounded:e.rounded,dense:e.dense,...a.value})),c=h(()=>e.options.map((t,n)=>{let{attrs:r,value:i,slot:a,...o}=t;return{slot:a,props:{key:n,"aria-pressed":i===e.modelValue?`true`:`false`,...r,...o,...s.value,disable:e.disable===!0||o.disable===!0,color:i===e.modelValue?u(o,`toggleColor`):u(o,`color`),textColor:i===e.modelValue?u(o,`toggleTextColor`):u(o,`textColor`),noCaps:u(o,`noCaps`)===!0,noWrap:u(o,`noWrap`)===!0,size:u(o,`size`),padding:u(o,`padding`),ripple:u(o,`ripple`),stack:u(o,`stack`)===!0,stretch:u(o,`stretch`)===!0,onClick(e){l(i,t,e)}}}}));function l(t,r,i){e.readonly!==!0&&(e.modelValue===t?e.clearable===!0&&(n(`update:modelValue`,null,null),n(`clear`)):n(`update:modelValue`,t,r),n(`click`,i))}function u(t,n){return t[n]===void 0?e[n]:t[n]}function d(){let n=c.value.map(e=>o(E,e.props,e.slot===void 0?void 0:t[e.slot]));return e.name!==void 0&&e.disable!==!0&&r.value===!0&&i(n,`push`),C(t.default,n)}return()=>o(P,{class:`q-btn-toggle`,...a.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}});function I(e){if(!e.filePath||e.filePath.startsWith(`/`))throw Error(`Invalid filePath: must be non-empty POSIX path relative to workspace root`);return{id:crypto.randomUUID(),filePath:e.filePath,line:e.line,content:e.content,createdAt:new Date().toISOString()}}function L(e){let t=e.split(`
|
|
3
3
|
`);return t.length===1?e:t.map((e,t)=>t===0?e:` ${e}`).join(`
|
|
4
4
|
`)}function R(e){let{comments:t,globalMessage:n}=e;if(t.length===0)return`## Code review\n\n${n}`;let r=new Map;for(let e of t){let t=r.get(e.filePath)??[];t.push(e),r.set(e.filePath,t)}for(let e of r.values())e.sort((e,t)=>e.line-t.line||e.createdAt.localeCompare(t.createdAt));let i=Array.from(r.keys()).sort(),a=i.map(e=>`### \`${e}\`\n\n${r.get(e).map(e=>`- **L${e.line}** : ${L(e.content)}`).join(`
|
|
5
5
|
`)}`),o=i.length,s=`_${t.length} comment${t.length===1?``:`s`} across ${o} file${o===1?``:`s`}. Address them and ping me back when done._`;return`## Code review — please address the following${n?`\n\n${n}`:``}\n\n${a.join(`
|
|
6
6
|
|
|
7
|
-
`)}\n\n---\n${s}`}var z=300;function B(e){return`kobo:review-draft:${e}`}function V(e){let t=localStorage.getItem(B(e));if(!t)return{comments:[],globalMessage:``};try{let e=JSON.parse(t);return{comments:Array.isArray(e.comments)?e.comments:[],globalMessage:typeof e.globalMessage==`string`?e.globalMessage:``}}catch{return{comments:[],globalMessage:``}}}function _e(e,t){let n=a(V(e)),r=null;function i(){r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null;try{localStorage.setItem(B(e),JSON.stringify(n.value))}catch(e){console.warn(`[review-draft] persist failed:`,e)}},z)}function o(){if(r!==null){clearTimeout(r),r=null;try{localStorage.setItem(B(e),JSON.stringify(n.value))}catch(e){console.warn(`[review-draft] flush failed:`,e)}}}function s(e){let t=I(e);return n.value.comments.push(t),i(),t}function c(e,t){let r=n.value.comments.find(t=>t.id===e);r&&(r.content=t,i())}function l(e){n.value.comments=n.value.comments.filter(t=>t.id!==e),i()}function u(e){n.value.globalMessage=e,i()}function d(){n.value={comments:[],globalMessage:``},r!==null&&(clearTimeout(r),r=null),localStorage.removeItem(B(e))}async function f(r){if(n.value.comments.length===0&&n.value.globalMessage.trim()===``)return{ok:!1,error:`Draft is empty`};o();let i=R(n.value);try{await t.sendChatMessage(e,i,r)}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}return d(),{ok:!0}}return{draft:n,addComment:s,updateComment:c,deleteComment:l,setGlobalMessage:u,clearDraft:d,flush:o,submit:f}}var ve={class:`review-comment-block`},ye={class:`comment-actions q-mt-xs`},H=[`innerHTML`],be={class:`comment-footer`},U={class:`comment-time text-caption text-grey-7`},xe={class:`comment-actions q-mt-xs`},Se=M(b({__name:`ReviewCommentBlock`,props:{comments:{},startInAddMode:{type:Boolean}},emits:[`add`,`update`,`delete`,`dismissEmpty`],setup(t,{emit:r}){let i=t,o=r,{t:c}=te(),h=ge(),v=a(null),b=a(``),x=a(i.startInAddMode===!0),S=a(``);function C(e){return j(e)}function w(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return c(`common.justNow`);if(n<60)return c(`common.minutesAgo`,{count:n});let r=Math.floor(n/60);return r<24?c(`common.hoursAgo`,{count:r}):c(`common.daysAgo`,{count:Math.floor(r/24)})}function ee(e){v.value=e.id,b.value=e.content}function T(){v.value=null,b.value=``}function D(e){let t=b.value.trim();t&&(o(`update`,e,t),v.value=null,b.value=``)}function O(e){h.dialog({title:c(`diff.deleteComment`),message:c(`diff.deleteCommentConfirm`),cancel:!0,persistent:!0,ok:{label:c(`diff.deleteComment`),color:`negative`,flat:!1,unelevated:!0}}).onOk(()=>{o(`delete`,e)})}function ne(){x.value=!1,S.value=``,i.comments.length===0&&o(`dismissEmpty`)}function re(){let e=S.value.trim();e&&(o(`add`,e),x.value=!1,S.value=``)}return(r,i)=>(e(),g(`div`,ve,[(e(!0),g(_,null,n(t.comments,(t,n)=>(e(),g(`div`,{key:t.id,class:l([`comment-thread-item`,{"with-separator":n>0}])},[v.value===t.id?(e(),g(_,{key:0},[p(k,{modelValue:b.value,"onUpdate:modelValue":i[0]||=e=>b.value=e,type:`textarea`,autogrow:``,dense:``,dark:``,outlined:``,autofocus:``,class:`comment-textarea`,placeholder:r.$t(`diff.commentPlaceholder`)},null,8,[`modelValue`,`placeholder`]),y(`div`,ye,[p(E,{flat:``,dense:``,size:`sm`,label:r.$t(`common.cancel`),onClick:T},null,8,[`label`]),p(E,{unelevated:``,dense:``,size:`sm`,color:`primary`,label:r.$t(`common.save`),onClick:e=>D(t.id)},null,8,[`label`,`onClick`])])],64)):(e(),g(_,{key:1},[y(`div`,{class:`comment-content`,innerHTML:C(t.content)},null,8,H),y(`div`,be,[y(`span`,U,u(w(t.createdAt)),1),p(E,{flat:``,dense:``,round:``,size:`xs`,icon:`edit`,color:`grey-5`,onClick:e=>ee(t)},{default:s(()=>[p(A,null,{default:s(()=>[m(u(r.$t(`diff.editComment`)),1)]),_:1})]),_:1},8,[`onClick`]),p(E,{flat:``,dense:``,round:``,size:`xs`,icon:`delete`,color:`grey-5`,onClick:e=>O(t.id)},{default:s(()=>[p(A,null,{default:s(()=>[m(u(r.$t(`diff.deleteComment`)),1)]),_:1})]),_:1},8,[`onClick`])])],64))],2))),128)),x.value?(e(),g(_,{key:0},[p(k,{modelValue:S.value,"onUpdate:modelValue":i[1]||=e=>S.value=e,type:`textarea`,autogrow:``,dense:``,dark:``,outlined:``,autofocus:``,class:`comment-textarea q-mt-sm`,placeholder:r.$t(`diff.commentPlaceholder`)},null,8,[`modelValue`,`placeholder`]),y(`div`,xe,[p(E,{flat:``,dense:``,size:`sm`,label:r.$t(`common.cancel`),onClick:ne},null,8,[`label`]),p(E,{unelevated:``,dense:``,size:`sm`,color:`primary`,disable:!S.value.trim(),label:r.$t(`diff.addComment`),onClick:re},null,8,[`disable`,`label`])])],64)):t.comments.length>0?(e(),d(E,{key:1,flat:``,dense:``,size:`sm`,icon:`reply`,label:r.$t(`diff.replyComment`),class:`reply-btn q-mt-xs`,onClick:i[2]||=e=>x.value=!0},null,8,[`label`])):f(``,!0)]))}}),[[`__scopeId`,`data-v-9abff76f`]]),Ce={class:`review-draft-panel q-pa-sm`},W={class:`text-caption text-uppercase text-weight-bold text-grey-6 q-mb-sm`,style:{"letter-spacing":`0.05em`}},we={key:0,class:`text-caption text-grey-7 q-pa-sm`},Te=[`onClick`],G={style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},K=[`onClick`],Ee={class:`text-grey-6 q-mr-xs`,style:{"font-family":`monospace`}},De={class:`text-grey-3 ellipsis`},Oe={class:`global-message-box q-mt-sm`},ke=M(b({__name:`ReviewDraftPanel`,props:{comments:{},globalMessage:{},submitting:{type:Boolean}},emits:[`updateGlobal`,`jumpToFile`,`jumpToComment`,`submit`],setup(t,{emit:r}){let i=t,a=r,o=h(()=>i.comments.length),c=h(()=>{let e=new Map;for(let t of i.comments){let n=e.get(t.filePath)??[];n.push(t),e.set(t.filePath,n)}for(let t of e.values())t.sort((e,t)=>e.line-t.line||e.createdAt.localeCompare(t.createdAt));return Array.from(e.entries()).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({filePath:e,comments:t}))});function l(e){let t=e.replace(/\n+/g,` `).trim();return t.length>80?`${t.slice(0,77)}…`:t}return(r,i)=>(e(),g(`div`,Ce,[y(`div`,W,u(r.$t(`diff.reviewDraft`)),1),p(ce,{class:`comments-scroll`,style:{height:`calc(100% - 220px)`}},{default:s(()=>[c.value.length===0?(e(),g(`div`,we,u(r.$t(`diff.reviewEmpty`)),1)):f(``,!0),(e(!0),g(_,null,n(c.value,t=>(e(),g(`div`,{key:t.filePath,class:`file-group q-mb-sm`},[y(`div`,{class:`file-group-header text-grey-3 cursor-pointer ellipsis`,onClick:e=>a(`jumpToFile`,t.filePath)},[p(w,{name:`description`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),y(`span`,G,u(t.filePath),1),p(N,{label:String(t.comments.length),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`},null,8,[`label`])],8,Te),(e(!0),g(_,null,n(t.comments,t=>(e(),g(`div`,{key:t.id,class:`draft-line cursor-pointer`,onClick:e=>a(`jumpToComment`,t.filePath,t.line)},[y(`span`,Ee,`L`+u(t.line),1),y(`span`,De,u(l(t.content)),1)],8,K))),128))]))),128))]),_:1}),y(`div`,Oe,[p(k,{"model-value":t.globalMessage,type:`textarea`,autogrow:``,rows:`3`,dense:``,dark:``,outlined:``,placeholder:r.$t(`diff.reviewGlobalPlaceholder`),class:`global-textarea`,"onUpdate:modelValue":i[0]||=e=>a(`updateGlobal`,String(e))},null,8,[`model-value`,`placeholder`]),p(E,{unelevated:``,"no-caps":``,color:`primary`,class:`full-width q-mt-sm`,disable:o.value===0&&!t.globalMessage.trim(),loading:t.submitting,onClick:i[1]||=e=>a(`submit`)},{default:s(()=>[m(u(r.$t(`diff.submitReview`,{n:o.value})),1)]),_:1},8,[`disable`,`loading`])])]))}}),[[`__scopeId`,`data-v-e21064fb`]]),Ae={class:`diff-viewer column full-height`},je={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},Me={class:`text-body1 text-weight-medium text-grey-3`},Ne={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},Pe={class:`text-grey-7`},Fe={class:`text-green-4`},Ie={class:`text-grey-7`},Le={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},Re={class:`row col no-wrap`,style:{"min-height":`0`}},ze={key:0,class:`review-draft-panel-wrapper`,style:{width:`300px`,minWidth:`240px`,flexShrink:0,borderRight:`1px solid #2a2a4a`}},Be={key:1,class:`text-caption text-grey-8 q-pa-sm`},Ve={class:`text-grey-4`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},He={class:`text-grey-3 ellipsis`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Ue={class:`col column`,style:{"min-width":`0`,position:`relative`}},We={key:0,class:`col column items-center justify-center`},Ge={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},Ke=`kobo:diff:hideUnchanged`,qe=`kobo:diff:includeUntracked`,Je=`kobo:diff:mode`,Ye=`kobo:diffViewerFileListWidth`,q=180,Xe=600,Ze=M(b({__name:`DiffViewer`,props:{workspaceId:{},initialReviewMode:{type:Boolean}},emits:[`close`,`sendToChat`],setup(o,{emit:l}){let b=o,S=l,{t:C}=te(),T=ge(),D=a([]),O=a(``),k=a(``),j=a(null),M=a(!1),P=a(!1),I=a(null),L=a(`side`),R=a(localStorage.getItem(Ke)!==`0`),z=a(localStorage.getItem(qe)===`1`),B=a(`branch`),V=a(b.initialReviewMode||localStorage.getItem(Je)===`review`?`review`:`inspect`);t(V,e=>{localStorage.setItem(Je,e),e===`review`?ye():ve()});function ve(){nt();for(let e of Z)e.dispose();Z=[],Y&&Y.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`)}function ye(){Y&&(ut(),j.value&&ot(j.value))}let H=ie(),be=ne(),U=_e(b.workspaceId,{sendChatMessage:async(e,t,n)=>{if(!H.isConnected())throw Error(`WebSocket not connected — cannot send the review`);H.sendChatMessage(e,t,n)}}),xe=h(()=>U.draft.value.comments),Ce=h(()=>U.draft.value.globalMessage),W=a(!1);async function we(){W.value=!0;try{let e=await U.submit(be.selectedSessionId??void 0);e.ok?(T.notify({type:`positive`,message:C(`diff.reviewSubmitted`),position:`top`}),S(`close`)):T.notify({type:`negative`,message:C(`diff.reviewSubmitFailed`,{error:e.error??``}),position:`top`})}finally{W.value=!1}}let Te=h(()=>{let e=new Map;if(V.value!==`review`)return e;for(let t of U.draft.value.comments)e.set(t.filePath,(e.get(t.filePath)??0)+1);return e});function G(e){if(V.value!==`review`||!e)return 0;let t=0;for(let n of U.draft.value.comments)n.filePath.startsWith(`${e}/`)&&t++;return t}function K(e){return e.nodeKey.startsWith(`dir:`)?e.nodeKey.slice(4):``}function Ee(e){j.value=e}async function De(e=3e3){let t=Date.now();for(;P.value;){if(Date.now()-t>e)return;await new Promise(e=>setTimeout(e,30))}}async function Oe(e,t){j.value!==e&&(j.value=e,await De()),Y?.getModifiedEditor().revealLineInCenter(t)}let Ze=parseInt(localStorage.getItem(Ye)??`280`,10),Qe=a(Math.min(Xe,Math.max(q,Ze)));function $e(e){e.preventDefault();let t=e.target.closest(`.diff-viewer`);if(!t)return;let n=t.getBoundingClientRect().left,r=e=>{Qe.value=Math.min(Xe,Math.max(q,e.clientX-n))},i=()=>{localStorage.setItem(Ye,String(Qe.value)),document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}let J=null,Y=null,X=[],Z=[],Q=a([]),et=a(null);function tt(){if(!Y)return;let e=Y.getModifiedEditor();for(let t of Q.value)t.topPx=e.getTopForLineNumber(t.line+1)-e.getScrollTop()-t.heightPx}function nt(){if(!Y){Q.value=[];return}Y.getModifiedEditor().changeViewZones(e=>{for(let t of Q.value)try{e.removeZone(t.zoneId)}catch{}}),Q.value=[]}function rt(e,t,n){if(!Y)return;let r=Y.getModifiedEditor(),i=r.getModel()?.getLineCount()??0;if(e<1||e>i)return;let a=document.createElement(`div`);a.style.pointerEvents=`none`;let o=t.length>0?t.length*4+1:0,s=Math.max(6,o+(n?6:0)),c=``;r.changeViewZones(t=>{c=t.addZone({afterLineNumber:e,heightInLines:s,domNode:a})});let l=s*18,u=r.getTopForLineNumber(e+1)-r.getScrollTop()-l;Q.value.push({zoneId:c,placeholderNode:a,line:e,comments:t,transient:n,topPx:u,heightPx:l})}function it(e){if(!Y)return;let t=Y.getModifiedEditor(),n=Q.value.filter(t=>t.line===e);n.length!==0&&(t.changeViewZones(e=>{for(let t of n)try{e.removeZone(t.zoneId)}catch{}}),Q.value=Q.value.filter(t=>t.line!==e))}function at(e,t){it(t);let n=U.draft.value.comments.filter(n=>n.filePath===e&&n.line===t);n.length!==0&&(n.sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),rt(t,n,!1))}function ot(e){if(!Y||V.value!==`review`)return;let t=U.draft.value.comments.filter(t=>t.filePath===e),n=new Map;for(let e of t){let t=n.get(e.line)??[];t.push(e),n.set(e.line,t)}for(let e of n.values())e.sort((e,t)=>e.createdAt.localeCompare(t.createdAt));for(let[e,t]of n)rt(e,t,!1)}function st(e,t,n){U.addComment({filePath:e,line:t,content:n}),at(e,t)}function ct(e,t,n,r){U.updateComment(n,r),at(e,t)}function lt(e,t,n){U.deleteComment(n),at(e,t)}function ut(){if(!Y||V.value!==`review`||!J)return;let e=Y.getModifiedEditor(),t=e.getDomNode();t&&t.classList.add(`review-mode-active`),Z.push(e.onMouseDown(e=>{if(e.target.type!==3)return;let t=e.target.position?.lineNumber??0;t<1||!j.value||dt(j.value,t)}),e.onDidScrollChange(()=>tt()),e.onDidLayoutChange(()=>tt()))}function dt(e,t){it(t),rt(t,U.draft.value.comments.filter(n=>n.filePath===e&&n.line===t).sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),!0)}function ft(){nt();for(let e of Z)e.dispose();if(Z=[],!Y)return;Y.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`);for(let e of X)e.dispose();X=[];let e=Y.getModel();Y.dispose(),Y=null,e?.original?.dispose(),e?.modified?.dispose()}let pt=h(()=>fe(D.value)),mt=h(()=>j.value?`file:${j.value}`:``);async function $(){M.value=!0;try{let e=new URLSearchParams({mode:B.value});B.value===`branch`&&z.value&&e.set(`includeUntracked`,`1`);let t=await fetch(`/api/workspaces/${b.workspaceId}/diff?${e}`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();D.value=n.files,O.value=n.sourceBranch??``,k.value=n.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{M.value=!1}}async function ht(e){if(I.value){P.value=!0;try{J||(self.MonacoEnvironment={getWorker(e,t){return t===`json`?new Worker(new URL(`/assets/json.worker-C9p7xCYk.js`,``+import.meta.url),{type:`module`}):t===`css`||t===`scss`||t===`less`?new Worker(new URL(`/assets/css.worker-D1piIYC4.js`,``+import.meta.url),{type:`module`}):t===`html`||t===`handlebars`||t===`razor`?new Worker(new URL(`/assets/html.worker-C4q4XMPn.js`,``+import.meta.url),{type:`module`}):t===`typescript`||t===`javascript`?new Worker(new URL(`/assets/ts.worker-Cj3zTgVE.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/editor.worker-CJ9iTmkr.js`,``+import.meta.url),{type:`module`})}},J=await re(()=>import(`./editor.main-C7a7L2WP.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17])),J.editor.defineTheme(`kobo-dark`,{base:`vs-dark`,inherit:!0,rules:[],colors:{"editor.background":`#1a1a2e`,"diffEditor.insertedTextBackground":`#22c55e20`,"diffEditor.removedTextBackground":`#ef444420`}}));let t=await fetch(`/api/workspaces/${b.workspaceId}/diff-file?path=${encodeURIComponent(e)}&mode=${B.value}`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json(),r={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,vue:`html`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,sql:`sql`,py:`python`,rs:`rust`,go:`go`}[e.split(`.`).pop()??``]??`plaintext`;ft();let i=J.editor.createModel(n.original??``,r),a=J.editor.createModel(n.modified??``,r);Y=J.editor.createDiffEditor(I.value,{theme:`kobo-dark`,readOnly:!0,renderSideBySide:L.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18,hideUnchangedRegions:{enabled:R.value,contextLineCount:3,minimumLineCount:3,revealLineCount:20}}),Y.setModel({original:i,modified:a}),yt(),V.value===`review`&&(ut(),ot(e))}catch(e){console.error(`Failed to load file diff:`,e)}finally{P.value=!1}}}function gt(e,t){let n=t===`untracked`;T.dialog({title:C(n?`diff.deleteUntracked`:`diff.rollbackToRemote`),message:C(n?`diff.deleteUntrackedConfirm`:`diff.rollbackConfirm`,{path:e}),cancel:!0,persistent:!0,color:n?`red`:`orange`,ok:{label:C(n?`diff.deleteUntrackedConfirmOk`:`diff.rollbackConfirmOk`),color:n?`red-7`:`orange-7`,flat:!1,unelevated:!0}}).onOk(()=>{_t(e)})}async function _t(e){try{let t=await fetch(`/api/workspaces/${b.workspaceId}/rollback-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})});if(!t.ok){let e=await t.json().catch(()=>({}));T.notify({type:`negative`,message:e.error||C(`diff.rollbackFailed`),position:`top`});return}let n=await t.json().catch(()=>({})),r=C(`diff.rollbackDoneRemote`);n.target===`head`?r=C(`diff.rollbackDoneHead`):n.target===`deleted`&&(r=C(`diff.rollbackDoneDeleted`)),T.notify({type:`positive`,message:r,position:`top`}),await $(),j.value===e&&(D.value.some(t=>t.path===e)?await ht(e):j.value=null)}catch(e){console.error(`rollbackFile failed:`,e),T.notify({type:`negative`,message:C(`diff.rollbackFailed`),position:`top`})}}let vt=a(!1);function yt(){if(!Y)return;for(let e of X)e.dispose();X=[];let e=Y.getModifiedEditor(),t=Y.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();vt.value=!!(e&&!e.isEmpty())});X.push(e)}}function bt(){if(!(!Y||!j.value))for(let e of[Y.getModifiedEditor(),Y.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===Y.getModifiedEditor()?`modified`:`original`;S(`sendToChat`,`\`\`\`\n// ${j.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}t(j,e=>{e?ht(e):ft()}),t(L,()=>{Y&&Y.updateOptions({renderSideBySide:L.value===`side`})}),t(R,e=>{localStorage.setItem(Ke,e?`1`:`0`),Y&&Y.updateOptions({hideUnchangedRegions:{enabled:e,contextLineCount:3,minimumLineCount:3,revealLineCount:20}})}),t(B,async()=>{let e=j.value;await $(),e&&D.value.some(t=>t.path===e)?ht(e):j.value=null}),t(z,async e=>{localStorage.setItem(qe,e?`1`:`0`),await $(),j.value&&!D.value.some(e=>e.path===j.value)&&(j.value=null)});function xt(e){switch(e){case`added`:return`#4ade80`;case`untracked`:return`#86efac`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return r($),i(()=>{U.flush(),ft()}),(t,r)=>(e(),g(`div`,Ae,[y(`div`,je,[p(w,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),y(`span`,Me,u(t.$t(`diff.title`)),1),p(N,{label:`${D.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),O.value?(e(),g(`span`,Ne,[B.value===`branch`?(e(),g(_,{key:0},[y(`span`,Pe,u(O.value),1),p(w,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),y(`span`,Fe,u(k.value),1)],64)):(e(),g(_,{key:1},[y(`span`,Ie,`origin/`+u(k.value),1),p(w,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),r[7]||=y(`span`,{class:`text-green-4`},`HEAD`,-1)],64))])):f(``,!0),j.value?(e(),g(`span`,Le,u(j.value),1)):f(``,!0),p(le),p(F,{modelValue:B.value,"onUpdate:modelValue":r[0]||=e=>B.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:t.$t(`diff.scopeBranch`),value:`branch`},{label:t.$t(`diff.scopeUnpushed`),value:`unpushed`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),p(F,{modelValue:V.value,"onUpdate:modelValue":r[1]||=e=>V.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:t.$t(`diff.modeInspect`),value:`inspect`},{label:t.$t(`diff.modeReview`),value:`review`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),p(F,{modelValue:L.value,"onUpdate:modelValue":r[2]||=e=>L.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:t.$t(`diff.side`),value:`side`},{label:t.$t(`diff.inline`),value:`inline`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),p(E,{icon:R.value?`unfold_less`:`unfold_more`,dense:``,flat:``,size:`sm`,color:R.value?`indigo-4`:`grey-5`,class:`q-mr-sm`,onClick:r[3]||=e=>R.value=!R.value},{default:s(()=>[p(A,{anchor:`bottom middle`,self:`top middle`,delay:400},{default:s(()=>[m(u(R.value?t.$t(`diff.showUnchanged`):t.$t(`diff.hideUnchanged`)),1)]),_:1})]),_:1},8,[`icon`,`color`]),B.value===`branch`?(e(),d(E,{key:2,icon:`visibility`,dense:``,flat:``,size:`sm`,color:z.value?`indigo-4`:`grey-5`,class:`q-mr-sm`,onClick:r[4]||=e=>z.value=!z.value},{default:s(()=>[p(A,{anchor:`bottom middle`,self:`top middle`,delay:400},{default:s(()=>[m(u(z.value?t.$t(`diff.hideUntracked`):t.$t(`diff.showUntracked`)),1)]),_:1})]),_:1},8,[`color`])):f(``,!0),p(E,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,disable:W.value,onClick:r[5]||=e=>S(`close`)},{default:s(()=>[p(A,null,{default:s(()=>[m(u(t.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1},8,[`disable`])]),p(ee,{dark:``}),y(`div`,Re,[V.value===`review`?(e(),g(`div`,ze,[p(ke,{comments:xe.value,"global-message":Ce.value,submitting:W.value,onUpdateGlobal:v(U).setGlobalMessage,onJumpToFile:Ee,onJumpToComment:Oe,onSubmit:we},null,8,[`comments`,`global-message`,`submitting`,`onUpdateGlobal`])])):f(``,!0),y(`div`,{class:`diff-file-list-wrapper`,style:x({width:`${Qe.value}px`,minWidth:`${q}px`})},[p(ce,{class:`diff-file-list q-pa-xs`,style:{width:`100%`,height:`100%`,"border-right":`1px solid #2a2a4a`}},{default:s(()=>[M.value?(e(),d(ae,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):D.value.length===0?(e(),g(`div`,Be,u(t.$t(`diff.noChanges`)),1)):(e(),d(de,{key:2,nodes:pt.value,"node-key":`nodeKey`,"label-key":`label`,"children-key":`children`,dark:``,dense:``,"default-expand-all":``,"no-selection-unset":``,selected:mt.value,class:`diff-tree`,"onUpdate:selected":r[6]||=e=>{typeof e!=`string`||!e.startsWith(`file:`)||(j.value=e.slice(5))}},{"default-header":s(({node:n})=>[n.isFolder?(e(),g(_,{key:0},[p(w,{name:`folder`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),y(`span`,Ve,u(n.label),1),p(N,{label:n.children?v(ue)(n.children):0,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`]),V.value===`review`&&G(K(n))>0?(e(),d(N,{key:0,label:String(G(K(n))),color:`grey-7`,"text-color":`grey-3`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])):f(``,!0)],64)):(e(),g(_,{key:1},[p(w,{name:`description`,size:`14px`,style:x({color:xt(n.file.status)}),class:`q-mr-xs`},{default:s(()=>[p(A,null,{default:s(()=>[m(u(n.file.status),1)]),_:2},1024)]),_:2},1032,[`style`]),y(`span`,He,u(n.label),1),V.value===`review`&&(Te.value.get(n.file.path)??0)>0?(e(),d(N,{key:0,label:String(Te.value.get(n.file.path)),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])):f(``,!0),p(me,{"touch-position":``,"context-menu":``},{default:s(()=>[p(pe,{dense:``,dark:``,style:{"min-width":`220px`}},{default:s(()=>[c((e(),d(oe,{clickable:``,onClick:e=>gt(n.file.path,n.file.status)},{default:s(()=>[p(se,{avatar:``},{default:s(()=>[p(w,{name:n.file.status===`untracked`?`delete`:`restore`,size:`16px`,color:n.file.status===`untracked`?`red-5`:`orange-5`},null,8,[`name`,`color`])]),_:2},1024),p(se,null,{default:s(()=>[m(u(n.file.status===`untracked`?t.$t(`diff.deleteUntracked`):t.$t(`diff.rollbackToRemote`)),1)]),_:2},1024)]),_:2},1032,[`onClick`])),[[he]])]),_:2},1024)]),_:2},1024)],64))]),_:1},8,[`nodes`,`selected`]))]),_:1}),y(`div`,{class:`diff-file-list-resize-handle`,onMousedown:$e},null,32)],4),y(`div`,Ue,[P.value?(e(),g(`div`,We,[p(ae,{size:`32px`,color:`indigo-4`})])):j.value?f(``,!0):(e(),g(`div`,Ge,u(t.$t(`diff.selectFile`)),1)),y(`div`,{ref_key:`editorWrapperRef`,ref:et,class:`col`,style:{"min-height":`0`,position:`relative`,overflow:`hidden`}},[y(`div`,{ref_key:`editorContainer`,ref:I,style:{position:`absolute`,inset:`0`}},null,512),(e(!0),g(_,null,n(Q.value,t=>(e(),g(`div`,{key:t.zoneId,class:`review-zone-overlay`,style:x({top:`${t.topPx}px`,height:`${t.heightPx}px`})},[p(Se,{comments:t.comments,"start-in-add-mode":t.transient,onAdd:e=>st(j.value??``,t.line,e),onUpdate:(e,n)=>ct(j.value??``,t.line,e,n),onDelete:e=>lt(j.value??``,t.line,e),onDismissEmpty:e=>it(t.line)},null,8,[`comments`,`start-in-add-mode`,`onAdd`,`onUpdate`,`onDelete`,`onDismissEmpty`])],4))),128))],512),vt.value?(e(),d(E,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:t.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:bt},null,8,[`label`])):f(``,!0)])])]))}}),[[`__scopeId`,`data-v-e60cf8ea`]]);export{Ze as default};
|
|
7
|
+
`)}\n\n---\n${s}`}var z=300;function B(e){return`kobo:review-draft:${e}`}function V(e){let t=localStorage.getItem(B(e));if(!t)return{comments:[],globalMessage:``};try{let e=JSON.parse(t);return{comments:Array.isArray(e.comments)?e.comments:[],globalMessage:typeof e.globalMessage==`string`?e.globalMessage:``}}catch{return{comments:[],globalMessage:``}}}function _e(e,t){let n=a(V(e)),r=null;function i(){r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null;try{localStorage.setItem(B(e),JSON.stringify(n.value))}catch(e){console.warn(`[review-draft] persist failed:`,e)}},z)}function o(){if(r!==null){clearTimeout(r),r=null;try{localStorage.setItem(B(e),JSON.stringify(n.value))}catch(e){console.warn(`[review-draft] flush failed:`,e)}}}function s(e){let t=I(e);return n.value.comments.push(t),i(),t}function c(e,t){let r=n.value.comments.find(t=>t.id===e);r&&(r.content=t,i())}function l(e){n.value.comments=n.value.comments.filter(t=>t.id!==e),i()}function u(e){n.value.globalMessage=e,i()}function d(){n.value={comments:[],globalMessage:``},r!==null&&(clearTimeout(r),r=null),localStorage.removeItem(B(e))}async function f(r){if(n.value.comments.length===0&&n.value.globalMessage.trim()===``)return{ok:!1,error:`Draft is empty`};o();let i=R(n.value);try{await t.sendChatMessage(e,i,r)}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}return d(),{ok:!0}}return{draft:n,addComment:s,updateComment:c,deleteComment:l,setGlobalMessage:u,clearDraft:d,flush:o,submit:f}}var ve={class:`review-comment-block`},ye={class:`comment-actions q-mt-xs`},H=[`innerHTML`],be={class:`comment-footer`},U={class:`comment-time text-caption text-grey-7`},xe={class:`comment-actions q-mt-xs`},Se=M(b({__name:`ReviewCommentBlock`,props:{comments:{},startInAddMode:{type:Boolean}},emits:[`add`,`update`,`delete`,`dismissEmpty`],setup(t,{emit:r}){let i=t,o=r,{t:c}=te(),h=ge(),v=a(null),b=a(``),x=a(i.startInAddMode===!0),S=a(``);function C(e){return j(e)}function w(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return c(`common.justNow`);if(n<60)return c(`common.minutesAgo`,{count:n});let r=Math.floor(n/60);return r<24?c(`common.hoursAgo`,{count:r}):c(`common.daysAgo`,{count:Math.floor(r/24)})}function ee(e){v.value=e.id,b.value=e.content}function T(){v.value=null,b.value=``}function D(e){let t=b.value.trim();t&&(o(`update`,e,t),v.value=null,b.value=``)}function O(e){h.dialog({title:c(`diff.deleteComment`),message:c(`diff.deleteCommentConfirm`),cancel:!0,persistent:!0,ok:{label:c(`diff.deleteComment`),color:`negative`,flat:!1,unelevated:!0}}).onOk(()=>{o(`delete`,e)})}function ne(){x.value=!1,S.value=``,i.comments.length===0&&o(`dismissEmpty`)}function re(){let e=S.value.trim();e&&(o(`add`,e),x.value=!1,S.value=``)}return(r,i)=>(e(),g(`div`,ve,[(e(!0),g(_,null,n(t.comments,(t,n)=>(e(),g(`div`,{key:t.id,class:l([`comment-thread-item`,{"with-separator":n>0}])},[v.value===t.id?(e(),g(_,{key:0},[p(k,{modelValue:b.value,"onUpdate:modelValue":i[0]||=e=>b.value=e,type:`textarea`,autogrow:``,dense:``,dark:``,outlined:``,autofocus:``,class:`comment-textarea`,placeholder:r.$t(`diff.commentPlaceholder`)},null,8,[`modelValue`,`placeholder`]),y(`div`,ye,[p(E,{flat:``,dense:``,size:`sm`,label:r.$t(`common.cancel`),onClick:T},null,8,[`label`]),p(E,{unelevated:``,dense:``,size:`sm`,color:`primary`,label:r.$t(`common.save`),onClick:e=>D(t.id)},null,8,[`label`,`onClick`])])],64)):(e(),g(_,{key:1},[y(`div`,{class:`comment-content`,innerHTML:C(t.content)},null,8,H),y(`div`,be,[y(`span`,U,u(w(t.createdAt)),1),p(E,{flat:``,dense:``,round:``,size:`xs`,icon:`edit`,color:`grey-5`,onClick:e=>ee(t)},{default:s(()=>[p(A,null,{default:s(()=>[m(u(r.$t(`diff.editComment`)),1)]),_:1})]),_:1},8,[`onClick`]),p(E,{flat:``,dense:``,round:``,size:`xs`,icon:`delete`,color:`grey-5`,onClick:e=>O(t.id)},{default:s(()=>[p(A,null,{default:s(()=>[m(u(r.$t(`diff.deleteComment`)),1)]),_:1})]),_:1},8,[`onClick`])])],64))],2))),128)),x.value?(e(),g(_,{key:0},[p(k,{modelValue:S.value,"onUpdate:modelValue":i[1]||=e=>S.value=e,type:`textarea`,autogrow:``,dense:``,dark:``,outlined:``,autofocus:``,class:`comment-textarea q-mt-sm`,placeholder:r.$t(`diff.commentPlaceholder`)},null,8,[`modelValue`,`placeholder`]),y(`div`,xe,[p(E,{flat:``,dense:``,size:`sm`,label:r.$t(`common.cancel`),onClick:ne},null,8,[`label`]),p(E,{unelevated:``,dense:``,size:`sm`,color:`primary`,disable:!S.value.trim(),label:r.$t(`diff.addComment`),onClick:re},null,8,[`disable`,`label`])])],64)):t.comments.length>0?(e(),d(E,{key:1,flat:``,dense:``,size:`sm`,icon:`reply`,label:r.$t(`diff.replyComment`),class:`reply-btn q-mt-xs`,onClick:i[2]||=e=>x.value=!0},null,8,[`label`])):f(``,!0)]))}}),[[`__scopeId`,`data-v-9abff76f`]]),Ce={class:`review-draft-panel q-pa-sm`},W={class:`text-caption text-uppercase text-weight-bold text-grey-6 q-mb-sm`,style:{"letter-spacing":`0.05em`}},we={key:0,class:`text-caption text-grey-7 q-pa-sm`},Te=[`onClick`],G={style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},K=[`onClick`],Ee={class:`text-grey-6 q-mr-xs`,style:{"font-family":`monospace`}},De={class:`text-grey-3 ellipsis`},Oe={class:`global-message-box q-mt-sm`},ke=M(b({__name:`ReviewDraftPanel`,props:{comments:{},globalMessage:{},submitting:{type:Boolean}},emits:[`updateGlobal`,`jumpToFile`,`jumpToComment`,`submit`],setup(t,{emit:r}){let i=t,a=r,o=h(()=>i.comments.length),c=h(()=>{let e=new Map;for(let t of i.comments){let n=e.get(t.filePath)??[];n.push(t),e.set(t.filePath,n)}for(let t of e.values())t.sort((e,t)=>e.line-t.line||e.createdAt.localeCompare(t.createdAt));return Array.from(e.entries()).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({filePath:e,comments:t}))});function l(e){let t=e.replace(/\n+/g,` `).trim();return t.length>80?`${t.slice(0,77)}…`:t}return(r,i)=>(e(),g(`div`,Ce,[y(`div`,W,u(r.$t(`diff.reviewDraft`)),1),p(ce,{class:`comments-scroll`,style:{height:`calc(100% - 220px)`}},{default:s(()=>[c.value.length===0?(e(),g(`div`,we,u(r.$t(`diff.reviewEmpty`)),1)):f(``,!0),(e(!0),g(_,null,n(c.value,t=>(e(),g(`div`,{key:t.filePath,class:`file-group q-mb-sm`},[y(`div`,{class:`file-group-header text-grey-3 cursor-pointer ellipsis`,onClick:e=>a(`jumpToFile`,t.filePath)},[p(w,{name:`description`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),y(`span`,G,u(t.filePath),1),p(N,{label:String(t.comments.length),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`},null,8,[`label`])],8,Te),(e(!0),g(_,null,n(t.comments,t=>(e(),g(`div`,{key:t.id,class:`draft-line cursor-pointer`,onClick:e=>a(`jumpToComment`,t.filePath,t.line)},[y(`span`,Ee,`L`+u(t.line),1),y(`span`,De,u(l(t.content)),1)],8,K))),128))]))),128))]),_:1}),y(`div`,Oe,[p(k,{"model-value":t.globalMessage,type:`textarea`,autogrow:``,rows:`3`,dense:``,dark:``,outlined:``,placeholder:r.$t(`diff.reviewGlobalPlaceholder`),class:`global-textarea`,"onUpdate:modelValue":i[0]||=e=>a(`updateGlobal`,String(e))},null,8,[`model-value`,`placeholder`]),p(E,{unelevated:``,"no-caps":``,color:`primary`,class:`full-width q-mt-sm`,disable:o.value===0&&!t.globalMessage.trim(),loading:t.submitting,onClick:i[1]||=e=>a(`submit`)},{default:s(()=>[m(u(r.$t(`diff.submitReview`,{n:o.value})),1)]),_:1},8,[`disable`,`loading`])])]))}}),[[`__scopeId`,`data-v-e21064fb`]]),Ae={class:`diff-viewer column full-height`},je={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},Me={class:`text-body1 text-weight-medium text-grey-3`},Ne={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},Pe={class:`text-grey-7`},Fe={class:`text-green-4`},Ie={class:`text-grey-7`},Le={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},Re={class:`row col no-wrap`,style:{"min-height":`0`}},ze={key:0,class:`review-draft-panel-wrapper`,style:{width:`300px`,minWidth:`240px`,flexShrink:0,borderRight:`1px solid #2a2a4a`}},Be={key:1,class:`text-caption text-grey-8 q-pa-sm`},Ve={class:`text-grey-4`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},He={class:`text-grey-3 ellipsis`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Ue={class:`col column`,style:{"min-width":`0`,position:`relative`}},We={key:0,class:`col column items-center justify-center`},Ge={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},Ke=`kobo:diff:hideUnchanged`,qe=`kobo:diff:includeUntracked`,Je=`kobo:diff:mode`,Ye=`kobo:diffViewerFileListWidth`,q=180,Xe=600,Ze=M(b({__name:`DiffViewer`,props:{workspaceId:{},initialReviewMode:{type:Boolean}},emits:[`close`,`sendToChat`],setup(o,{emit:l}){let b=o,S=l,{t:C}=te(),T=ge(),D=a([]),O=a(``),k=a(``),j=a(null),M=a(!1),P=a(!1),I=a(null),L=a(`side`),R=a(localStorage.getItem(Ke)!==`0`),z=a(localStorage.getItem(qe)===`1`),B=a(`branch`),V=a(b.initialReviewMode||localStorage.getItem(Je)===`review`?`review`:`inspect`);t(V,e=>{localStorage.setItem(Je,e),e===`review`?ye():ve()});function ve(){nt();for(let e of Z)e.dispose();Z=[],Y&&Y.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`)}function ye(){Y&&(ut(),j.value&&ot(j.value))}let H=ie(),be=ne(),U=_e(b.workspaceId,{sendChatMessage:async(e,t,n)=>{if(!H.isConnected())throw Error(`WebSocket not connected — cannot send the review`);H.sendChatMessage(e,t,n)}}),xe=h(()=>U.draft.value.comments),Ce=h(()=>U.draft.value.globalMessage),W=a(!1);async function we(){W.value=!0;try{let e=await U.submit(be.selectedSessionId??void 0);e.ok?(T.notify({type:`positive`,message:C(`diff.reviewSubmitted`),position:`top`}),S(`close`)):T.notify({type:`negative`,message:C(`diff.reviewSubmitFailed`,{error:e.error??``}),position:`top`})}finally{W.value=!1}}let Te=h(()=>{let e=new Map;if(V.value!==`review`)return e;for(let t of U.draft.value.comments)e.set(t.filePath,(e.get(t.filePath)??0)+1);return e});function G(e){if(V.value!==`review`||!e)return 0;let t=0;for(let n of U.draft.value.comments)n.filePath.startsWith(`${e}/`)&&t++;return t}function K(e){return e.nodeKey.startsWith(`dir:`)?e.nodeKey.slice(4):``}function Ee(e){j.value=e}async function De(e=3e3){let t=Date.now();for(;P.value;){if(Date.now()-t>e)return;await new Promise(e=>setTimeout(e,30))}}async function Oe(e,t){j.value!==e&&(j.value=e,await De()),Y?.getModifiedEditor().revealLineInCenter(t)}let Ze=parseInt(localStorage.getItem(Ye)??`280`,10),Qe=a(Math.min(Xe,Math.max(q,Ze)));function $e(e){e.preventDefault();let t=e.target.closest(`.diff-viewer`);if(!t)return;let n=t.getBoundingClientRect().left,r=e=>{Qe.value=Math.min(Xe,Math.max(q,e.clientX-n))},i=()=>{localStorage.setItem(Ye,String(Qe.value)),document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}let J=null,Y=null,X=[],Z=[],Q=a([]),et=a(null);function tt(){if(!Y)return;let e=Y.getModifiedEditor();for(let t of Q.value)t.topPx=e.getTopForLineNumber(t.line+1)-e.getScrollTop()-t.heightPx}function nt(){if(!Y){Q.value=[];return}Y.getModifiedEditor().changeViewZones(e=>{for(let t of Q.value)try{e.removeZone(t.zoneId)}catch{}}),Q.value=[]}function rt(e,t,n){if(!Y)return;let r=Y.getModifiedEditor(),i=r.getModel()?.getLineCount()??0;if(e<1||e>i)return;let a=document.createElement(`div`);a.style.pointerEvents=`none`;let o=t.length>0?t.length*4+1:0,s=Math.max(6,o+(n?6:0)),c=``;r.changeViewZones(t=>{c=t.addZone({afterLineNumber:e,heightInLines:s,domNode:a})});let l=s*18,u=r.getTopForLineNumber(e+1)-r.getScrollTop()-l;Q.value.push({zoneId:c,placeholderNode:a,line:e,comments:t,transient:n,topPx:u,heightPx:l})}function it(e){if(!Y)return;let t=Y.getModifiedEditor(),n=Q.value.filter(t=>t.line===e);n.length!==0&&(t.changeViewZones(e=>{for(let t of n)try{e.removeZone(t.zoneId)}catch{}}),Q.value=Q.value.filter(t=>t.line!==e))}function at(e,t){it(t);let n=U.draft.value.comments.filter(n=>n.filePath===e&&n.line===t);n.length!==0&&(n.sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),rt(t,n,!1))}function ot(e){if(!Y||V.value!==`review`)return;let t=U.draft.value.comments.filter(t=>t.filePath===e),n=new Map;for(let e of t){let t=n.get(e.line)??[];t.push(e),n.set(e.line,t)}for(let e of n.values())e.sort((e,t)=>e.createdAt.localeCompare(t.createdAt));for(let[e,t]of n)rt(e,t,!1)}function st(e,t,n){U.addComment({filePath:e,line:t,content:n}),at(e,t)}function ct(e,t,n,r){U.updateComment(n,r),at(e,t)}function lt(e,t,n){U.deleteComment(n),at(e,t)}function ut(){if(!Y||V.value!==`review`||!J)return;let e=Y.getModifiedEditor(),t=e.getDomNode();t&&t.classList.add(`review-mode-active`),Z.push(e.onMouseDown(e=>{if(e.target.type!==3)return;let t=e.target.position?.lineNumber??0;t<1||!j.value||dt(j.value,t)}),e.onDidScrollChange(()=>tt()),e.onDidLayoutChange(()=>tt()))}function dt(e,t){it(t),rt(t,U.draft.value.comments.filter(n=>n.filePath===e&&n.line===t).sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),!0)}function ft(){nt();for(let e of Z)e.dispose();if(Z=[],!Y)return;Y.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`);for(let e of X)e.dispose();X=[];let e=Y.getModel();Y.dispose(),Y=null,e?.original?.dispose(),e?.modified?.dispose()}let pt=h(()=>fe(D.value)),mt=h(()=>j.value?`file:${j.value}`:``);async function $(){M.value=!0;try{let e=new URLSearchParams({mode:B.value});B.value===`branch`&&z.value&&e.set(`includeUntracked`,`1`);let t=await fetch(`/api/workspaces/${b.workspaceId}/diff?${e}`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();D.value=n.files,O.value=n.sourceBranch??``,k.value=n.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{M.value=!1}}async function ht(e){if(I.value){P.value=!0;try{J||(self.MonacoEnvironment={getWorker(e,t){return t===`json`?new Worker(new URL(`/assets/json.worker-C9p7xCYk.js`,``+import.meta.url),{type:`module`}):t===`css`||t===`scss`||t===`less`?new Worker(new URL(`/assets/css.worker-D1piIYC4.js`,``+import.meta.url),{type:`module`}):t===`html`||t===`handlebars`||t===`razor`?new Worker(new URL(`/assets/html.worker-C4q4XMPn.js`,``+import.meta.url),{type:`module`}):t===`typescript`||t===`javascript`?new Worker(new URL(`/assets/ts.worker-Cj3zTgVE.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/editor.worker-CJ9iTmkr.js`,``+import.meta.url),{type:`module`})}},J=await re(()=>import(`./editor.main-DbnmDA5w.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17])),J.editor.defineTheme(`kobo-dark`,{base:`vs-dark`,inherit:!0,rules:[],colors:{"editor.background":`#1a1a2e`,"diffEditor.insertedTextBackground":`#22c55e20`,"diffEditor.removedTextBackground":`#ef444420`}}));let t=await fetch(`/api/workspaces/${b.workspaceId}/diff-file?path=${encodeURIComponent(e)}&mode=${B.value}`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json(),r={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,vue:`html`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,sql:`sql`,py:`python`,rs:`rust`,go:`go`}[e.split(`.`).pop()??``]??`plaintext`;ft();let i=J.editor.createModel(n.original??``,r),a=J.editor.createModel(n.modified??``,r);Y=J.editor.createDiffEditor(I.value,{theme:`kobo-dark`,readOnly:!0,renderSideBySide:L.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18,hideUnchangedRegions:{enabled:R.value,contextLineCount:3,minimumLineCount:3,revealLineCount:20}}),Y.setModel({original:i,modified:a}),yt(),V.value===`review`&&(ut(),ot(e))}catch(e){console.error(`Failed to load file diff:`,e)}finally{P.value=!1}}}function gt(e,t){let n=t===`untracked`;T.dialog({title:C(n?`diff.deleteUntracked`:`diff.rollbackToRemote`),message:C(n?`diff.deleteUntrackedConfirm`:`diff.rollbackConfirm`,{path:e}),cancel:!0,persistent:!0,color:n?`red`:`orange`,ok:{label:C(n?`diff.deleteUntrackedConfirmOk`:`diff.rollbackConfirmOk`),color:n?`red-7`:`orange-7`,flat:!1,unelevated:!0}}).onOk(()=>{_t(e)})}async function _t(e){try{let t=await fetch(`/api/workspaces/${b.workspaceId}/rollback-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})});if(!t.ok){let e=await t.json().catch(()=>({}));T.notify({type:`negative`,message:e.error||C(`diff.rollbackFailed`),position:`top`});return}let n=await t.json().catch(()=>({})),r=C(`diff.rollbackDoneRemote`);n.target===`head`?r=C(`diff.rollbackDoneHead`):n.target===`deleted`&&(r=C(`diff.rollbackDoneDeleted`)),T.notify({type:`positive`,message:r,position:`top`}),await $(),j.value===e&&(D.value.some(t=>t.path===e)?await ht(e):j.value=null)}catch(e){console.error(`rollbackFile failed:`,e),T.notify({type:`negative`,message:C(`diff.rollbackFailed`),position:`top`})}}let vt=a(!1);function yt(){if(!Y)return;for(let e of X)e.dispose();X=[];let e=Y.getModifiedEditor(),t=Y.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();vt.value=!!(e&&!e.isEmpty())});X.push(e)}}function bt(){if(!(!Y||!j.value))for(let e of[Y.getModifiedEditor(),Y.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===Y.getModifiedEditor()?`modified`:`original`;S(`sendToChat`,`\`\`\`\n// ${j.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}t(j,e=>{e?ht(e):ft()}),t(L,()=>{Y&&Y.updateOptions({renderSideBySide:L.value===`side`})}),t(R,e=>{localStorage.setItem(Ke,e?`1`:`0`),Y&&Y.updateOptions({hideUnchangedRegions:{enabled:e,contextLineCount:3,minimumLineCount:3,revealLineCount:20}})}),t(B,async()=>{let e=j.value;await $(),e&&D.value.some(t=>t.path===e)?ht(e):j.value=null}),t(z,async e=>{localStorage.setItem(qe,e?`1`:`0`),await $(),j.value&&!D.value.some(e=>e.path===j.value)&&(j.value=null)});function xt(e){switch(e){case`added`:return`#4ade80`;case`untracked`:return`#86efac`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return r($),i(()=>{U.flush(),ft()}),(t,r)=>(e(),g(`div`,Ae,[y(`div`,je,[p(w,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),y(`span`,Me,u(t.$t(`diff.title`)),1),p(N,{label:`${D.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),O.value?(e(),g(`span`,Ne,[B.value===`branch`?(e(),g(_,{key:0},[y(`span`,Pe,u(O.value),1),p(w,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),y(`span`,Fe,u(k.value),1)],64)):(e(),g(_,{key:1},[y(`span`,Ie,`origin/`+u(k.value),1),p(w,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),r[7]||=y(`span`,{class:`text-green-4`},`HEAD`,-1)],64))])):f(``,!0),j.value?(e(),g(`span`,Le,u(j.value),1)):f(``,!0),p(le),p(F,{modelValue:B.value,"onUpdate:modelValue":r[0]||=e=>B.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:t.$t(`diff.scopeBranch`),value:`branch`},{label:t.$t(`diff.scopeUnpushed`),value:`unpushed`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),p(F,{modelValue:V.value,"onUpdate:modelValue":r[1]||=e=>V.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:t.$t(`diff.modeInspect`),value:`inspect`},{label:t.$t(`diff.modeReview`),value:`review`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),p(F,{modelValue:L.value,"onUpdate:modelValue":r[2]||=e=>L.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:t.$t(`diff.side`),value:`side`},{label:t.$t(`diff.inline`),value:`inline`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),p(E,{icon:R.value?`unfold_less`:`unfold_more`,dense:``,flat:``,size:`sm`,color:R.value?`indigo-4`:`grey-5`,class:`q-mr-sm`,onClick:r[3]||=e=>R.value=!R.value},{default:s(()=>[p(A,{anchor:`bottom middle`,self:`top middle`,delay:400},{default:s(()=>[m(u(R.value?t.$t(`diff.showUnchanged`):t.$t(`diff.hideUnchanged`)),1)]),_:1})]),_:1},8,[`icon`,`color`]),B.value===`branch`?(e(),d(E,{key:2,icon:`visibility`,dense:``,flat:``,size:`sm`,color:z.value?`indigo-4`:`grey-5`,class:`q-mr-sm`,onClick:r[4]||=e=>z.value=!z.value},{default:s(()=>[p(A,{anchor:`bottom middle`,self:`top middle`,delay:400},{default:s(()=>[m(u(z.value?t.$t(`diff.hideUntracked`):t.$t(`diff.showUntracked`)),1)]),_:1})]),_:1},8,[`color`])):f(``,!0),p(E,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,disable:W.value,onClick:r[5]||=e=>S(`close`)},{default:s(()=>[p(A,null,{default:s(()=>[m(u(t.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1},8,[`disable`])]),p(ee,{dark:``}),y(`div`,Re,[V.value===`review`?(e(),g(`div`,ze,[p(ke,{comments:xe.value,"global-message":Ce.value,submitting:W.value,onUpdateGlobal:v(U).setGlobalMessage,onJumpToFile:Ee,onJumpToComment:Oe,onSubmit:we},null,8,[`comments`,`global-message`,`submitting`,`onUpdateGlobal`])])):f(``,!0),y(`div`,{class:`diff-file-list-wrapper`,style:x({width:`${Qe.value}px`,minWidth:`${q}px`})},[p(ce,{class:`diff-file-list q-pa-xs`,style:{width:`100%`,height:`100%`,"border-right":`1px solid #2a2a4a`}},{default:s(()=>[M.value?(e(),d(ae,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):D.value.length===0?(e(),g(`div`,Be,u(t.$t(`diff.noChanges`)),1)):(e(),d(de,{key:2,nodes:pt.value,"node-key":`nodeKey`,"label-key":`label`,"children-key":`children`,dark:``,dense:``,"default-expand-all":``,"no-selection-unset":``,selected:mt.value,class:`diff-tree`,"onUpdate:selected":r[6]||=e=>{typeof e!=`string`||!e.startsWith(`file:`)||(j.value=e.slice(5))}},{"default-header":s(({node:n})=>[n.isFolder?(e(),g(_,{key:0},[p(w,{name:`folder`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),y(`span`,Ve,u(n.label),1),p(N,{label:n.children?v(ue)(n.children):0,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`]),V.value===`review`&&G(K(n))>0?(e(),d(N,{key:0,label:String(G(K(n))),color:`grey-7`,"text-color":`grey-3`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])):f(``,!0)],64)):(e(),g(_,{key:1},[p(w,{name:`description`,size:`14px`,style:x({color:xt(n.file.status)}),class:`q-mr-xs`},{default:s(()=>[p(A,null,{default:s(()=>[m(u(n.file.status),1)]),_:2},1024)]),_:2},1032,[`style`]),y(`span`,He,u(n.label),1),V.value===`review`&&(Te.value.get(n.file.path)??0)>0?(e(),d(N,{key:0,label:String(Te.value.get(n.file.path)),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])):f(``,!0),p(me,{"touch-position":``,"context-menu":``},{default:s(()=>[p(pe,{dense:``,dark:``,style:{"min-width":`220px`}},{default:s(()=>[c((e(),d(oe,{clickable:``,onClick:e=>gt(n.file.path,n.file.status)},{default:s(()=>[p(se,{avatar:``},{default:s(()=>[p(w,{name:n.file.status===`untracked`?`delete`:`restore`,size:`16px`,color:n.file.status===`untracked`?`red-5`:`orange-5`},null,8,[`name`,`color`])]),_:2},1024),p(se,null,{default:s(()=>[m(u(n.file.status===`untracked`?t.$t(`diff.deleteUntracked`):t.$t(`diff.rollbackToRemote`)),1)]),_:2},1024)]),_:2},1032,[`onClick`])),[[he]])]),_:2},1024)]),_:2},1024)],64))]),_:1},8,[`nodes`,`selected`]))]),_:1}),y(`div`,{class:`diff-file-list-resize-handle`,onMousedown:$e},null,32)],4),y(`div`,Ue,[P.value?(e(),g(`div`,We,[p(ae,{size:`32px`,color:`indigo-4`})])):j.value?f(``,!0):(e(),g(`div`,Ge,u(t.$t(`diff.selectFile`)),1)),y(`div`,{ref_key:`editorWrapperRef`,ref:et,class:`col`,style:{"min-height":`0`,position:`relative`,overflow:`hidden`}},[y(`div`,{ref_key:`editorContainer`,ref:I,style:{position:`absolute`,inset:`0`}},null,512),(e(!0),g(_,null,n(Q.value,t=>(e(),g(`div`,{key:t.zoneId,class:`review-zone-overlay`,style:x({top:`${t.topPx}px`,height:`${t.heightPx}px`})},[p(Se,{comments:t.comments,"start-in-add-mode":t.transient,onAdd:e=>st(j.value??``,t.line,e),onUpdate:(e,n)=>ct(j.value??``,t.line,e,n),onDelete:e=>lt(j.value??``,t.line,e),onDismissEmpty:e=>it(t.line)},null,8,[`comments`,`start-in-add-mode`,`onAdd`,`onUpdate`,`onDelete`,`onDismissEmpty`])],4))),128))],512),vt.value?(e(),d(E,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:t.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:bt},null,8,[`label`])):f(``,!0)])])]))}}),[[`__scopeId`,`data-v-e60cf8ea`]]);export{Ze as default};
|