@loicngr/kobo 1.5.1 → 1.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +64 -0
  2. package/dist/server/index.js +2 -0
  3. package/dist/server/routes/plans.js +3 -3
  4. package/dist/server/routes/sentry.js +20 -0
  5. package/dist/server/routes/workspaces.js +99 -3
  6. package/dist/server/services/notion-service.js +59 -188
  7. package/dist/server/services/pr-watcher-service.js +16 -0
  8. package/dist/server/services/sentry-service.js +130 -0
  9. package/dist/server/utils/mcp-client.js +191 -0
  10. package/package.json +1 -1
  11. package/src/client/dist/spa/assets/{ActivityFeed-CMlUg42q.js → ActivityFeed-C7knqOOL.js} +1 -1
  12. package/src/client/dist/spa/assets/CreatePage-Owxm6Tpi.js +2 -0
  13. package/src/client/dist/spa/assets/CreatePage-y7wOGccu.css +1 -0
  14. package/src/client/dist/spa/assets/{DiffViewer-BiGsv9dO.js → DiffViewer-mLBk-G-D.js} +2 -2
  15. package/src/client/dist/spa/assets/{MainLayout-TNUcP5Yq.css → MainLayout-DH5FgF9v.css} +1 -1
  16. package/src/client/dist/spa/assets/{MainLayout-B9a2mmgw.js → MainLayout-z-GTmsNk.js} +17 -17
  17. package/src/client/dist/spa/assets/{QExpansionItem-K1q9P_EC.js → QExpansionItem-BoxRv2sW.js} +1 -1
  18. package/src/client/dist/spa/assets/{QList-jw9RuMIz.js → QList-C0MyMgKh.js} +1 -1
  19. package/src/client/dist/spa/assets/{QMenu-_Z0TxAxE.js → QMenu-DayfIdY0.js} +1 -1
  20. package/src/client/dist/spa/assets/{QPage-rbGaJ2cR.js → QPage-D7SSe7S1.js} +1 -1
  21. package/src/client/dist/spa/assets/{SettingsPage-BJN15q-J.js → SettingsPage-BzJ9LphQ.js} +1 -1
  22. package/src/client/dist/spa/assets/{WorkspacePage-fFHT1mz2.js → WorkspacePage-Dv_vuDsw.js} +3 -3
  23. package/src/client/dist/spa/assets/{cssMode-D7f5NOFi.js → cssMode-4TH_2zaD.js} +1 -1
  24. package/src/client/dist/spa/assets/{editor.api-BEvyDmPD.js → editor.api-CyJb27tS.js} +1 -1
  25. package/src/client/dist/spa/assets/{editor.main-C3fYYKpq.js → editor.main-oZnnOWQQ.js} +3 -3
  26. package/src/client/dist/spa/assets/{freemarker2-BTPOfUHU.js → freemarker2-QspagBXp.js} +1 -1
  27. package/src/client/dist/spa/assets/{handlebars-C-E8T8yz.js → handlebars-DNK4bfk9.js} +1 -1
  28. package/src/client/dist/spa/assets/{html-BQVT0h1N.js → html-DoAFaOJE.js} +1 -1
  29. package/src/client/dist/spa/assets/{htmlMode-rlGPBuXx.js → htmlMode-Dd2XBcML.js} +1 -1
  30. package/src/client/dist/spa/assets/i18n-NIfrKJms.js +1 -0
  31. package/src/client/dist/spa/assets/i18n-ckoKODmn.js +1 -0
  32. package/src/client/dist/spa/assets/index-B4-QwpHI.js +5 -0
  33. package/src/client/dist/spa/assets/{javascript-ixmyyZe4.js → javascript-C8gxtWJG.js} +1 -1
  34. package/src/client/dist/spa/assets/{jsonMode-iSqte9q7.js → jsonMode-BW-w1oEn.js} +1 -1
  35. package/src/client/dist/spa/assets/{liquid-BtIa2lKm.js → liquid-CQDlB55c.js} +1 -1
  36. package/src/client/dist/spa/assets/{marked.esm-Cid1-PgZ.js → marked.esm-CGMwQXW0.js} +1 -1
  37. package/src/client/dist/spa/assets/{mdx-F0U_AQKl.js → mdx-DUS2o1l2.js} +1 -1
  38. package/src/client/dist/spa/assets/{monaco.contribution-CffkEucM.js → monaco.contribution-BSsdGujG.js} +2 -2
  39. package/src/client/dist/spa/assets/{python-DULmhOm4.js → python-DVWLF-An.js} +1 -1
  40. package/src/client/dist/spa/assets/{razor-B383fmQ6.js → razor-bodgahcD.js} +1 -1
  41. package/src/client/dist/spa/assets/{tsMode-CRCGK1Fk.js → tsMode-C7oNyY1g.js} +1 -1
  42. package/src/client/dist/spa/assets/{typescript-GvsL7ngZ.js → typescript-C_X20eQu.js} +1 -1
  43. package/src/client/dist/spa/assets/{xml-Chm6YPh1.js → xml-BVbLd8T0.js} +1 -1
  44. package/src/client/dist/spa/assets/{yaml-D_yl_W0w.js → yaml-D5WOobuH.js} +1 -1
  45. package/src/client/dist/spa/index.html +2 -2
  46. package/src/client/dist/spa/assets/CreatePage-BTFc1WXO.css +0 -1
  47. package/src/client/dist/spa/assets/CreatePage-CmoZpcGV.js +0 -2
  48. package/src/client/dist/spa/assets/i18n-BMjw8DJ5.js +0 -1
  49. package/src/client/dist/spa/assets/i18n-D5LoHj4O.js +0 -1
  50. package/src/client/dist/spa/assets/index-wen3XwaX.js +0 -5
@@ -0,0 +1,130 @@
1
+ import { callMcpTool, initializeMcp, readClaudeMcpEntry, spawnMcpProcess, unwrapMcpResult, } from '../utils/mcp-client.js';
2
+ // ─── parseSentryUrl ───────────────────────────────────────────────────────────
3
+ /**
4
+ * Parse a Sentry issue URL and extract the numeric issue ID.
5
+ * Accepts variations with trailing slash, query string, fragment, and
6
+ * self-hosted /organizations/<org>/issues/<id>/ paths.
7
+ */
8
+ export function parseSentryUrl(url) {
9
+ const match = url.match(/\/issues\/(\d+)/);
10
+ if (!match) {
11
+ throw new Error(`Could not extract issue ID from Sentry URL: ${url}`);
12
+ }
13
+ return match[1];
14
+ }
15
+ const SENTRY_CONFIG_ERROR = "Sentry MCP server not configured in ~/.claude.json — add an enabled 'sentry' entry under mcpServers";
16
+ /**
17
+ * Return the first enabled (`disabled !== true`) MCP server entry from
18
+ * `~/.claude.json` whose key contains "sentry" (case-insensitive). The full
19
+ * `entry.env` is merged onto `process.env` so the spawned process has every
20
+ * configured variable available (SENTRY_ACCESS_TOKEN, SENTRY_HOST, etc.).
21
+ *
22
+ * Throws with a clear setup message when no enabled Sentry entry exists.
23
+ */
24
+ export function readSentryMcpConfig() {
25
+ const match = readClaudeMcpEntry((k) => /sentry/i.test(k));
26
+ if (!match) {
27
+ throw new Error(SENTRY_CONFIG_ERROR);
28
+ }
29
+ const { entry } = match;
30
+ return {
31
+ command: entry.command ?? 'npx',
32
+ args: entry.args ?? [],
33
+ env: {
34
+ ...process.env,
35
+ ...(entry.env ?? {}),
36
+ },
37
+ };
38
+ }
39
+ function matchField(md, label) {
40
+ const re = new RegExp(`^\\*\\*${label}\\*\\*:\\s*(.+)$`, 'm');
41
+ const m = md.match(re);
42
+ return m ? m[1].trim() : '';
43
+ }
44
+ function matchSection(md, heading) {
45
+ // No 'm' flag: $ anchors to end of full string, not each line.
46
+ // Stops at the next heading of any level (#, ##, ### …) or end of string,
47
+ // so trailing top-level sections like "# Using this information" appended
48
+ // by the Sentry MCP response are NOT swallowed into a previous ### section.
49
+ const re = new RegExp(`###\\s+${heading}[\\r\\n]+((?:.|\\n)*?)(?=\\n#+\\s|$)`);
50
+ const m = md.match(re);
51
+ return m ? m[1].trim() : '';
52
+ }
53
+ function parseTagsBlock(block) {
54
+ const tags = {};
55
+ const lines = block.split('\n');
56
+ for (const line of lines) {
57
+ const m = line.match(/^\*\*([^*]+)\*\*:\s*(.+)$/);
58
+ if (m) {
59
+ tags[m[1].trim()] = m[2].trim();
60
+ }
61
+ }
62
+ return tags;
63
+ }
64
+ function parseOffendingSpans(md) {
65
+ const re = /\*\*Offending Spans:\*\*\s*\n([\s\S]*?)(?=\n\n|\n###|\n\*\*|$)/;
66
+ const m = md.match(re);
67
+ if (!m)
68
+ return [];
69
+ return m[1]
70
+ .split('\n')
71
+ .map((l) => l.trim())
72
+ .filter((l) => l.length > 0);
73
+ }
74
+ /** Parse the markdown response from `get_sentry_resource` into a structured object. */
75
+ export function parseSentryResponse(markdown, numericId) {
76
+ // Short-ID comes from the first heading: "# Issue ACME-API-3 in org"
77
+ const issueIdMatch = markdown.match(/^# Issue\s+(\S+)/m);
78
+ const issueId = issueIdMatch ? issueIdMatch[1] : '';
79
+ const occurrencesRaw = matchField(markdown, 'Occurrences');
80
+ const occurrences = occurrencesRaw ? parseInt(occurrencesRaw, 10) || 0 : 0;
81
+ const tagsBlock = matchSection(markdown, 'Tags');
82
+ const tags = tagsBlock ? parseTagsBlock(tagsBlock) : {};
83
+ const extraData = matchSection(markdown, 'Extra Data');
84
+ const additionalContext = matchSection(markdown, 'Additional Context');
85
+ const extraContext = [extraData, additionalContext].filter((s) => s.length > 0).join('\n\n');
86
+ return {
87
+ issueId,
88
+ issueNumericId: numericId,
89
+ title: matchField(markdown, 'Description'),
90
+ culprit: matchField(markdown, 'Location'),
91
+ url: matchField(markdown, 'URL'),
92
+ platform: matchField(markdown, 'Platform'),
93
+ firstSeen: matchField(markdown, 'First Seen'),
94
+ lastSeen: matchField(markdown, 'Last Seen'),
95
+ occurrences,
96
+ tags,
97
+ offendingSpans: parseOffendingSpans(markdown),
98
+ extraContext,
99
+ };
100
+ }
101
+ // ─── extractSentryIssue ───────────────────────────────────────────────────────
102
+ /**
103
+ * Extract a Sentry issue's full context via the user's configured Sentry MCP server.
104
+ */
105
+ export async function extractSentryIssue(url) {
106
+ const numericId = parseSentryUrl(url);
107
+ const config = readSentryMcpConfig();
108
+ const mcpProcess = spawnMcpProcess(config.command, config.args, config.env);
109
+ try {
110
+ // Give the process a moment to start; reject if it errors immediately.
111
+ await new Promise((resolve, reject) => {
112
+ const timeout = setTimeout(() => resolve(), 1000);
113
+ mcpProcess.on('error', (err) => {
114
+ clearTimeout(timeout);
115
+ reject(new Error(`Failed to start Sentry MCP server: ${err.message}`));
116
+ });
117
+ });
118
+ await initializeMcp(mcpProcess);
119
+ const raw = await callMcpTool(mcpProcess, 'get_sentry_resource', { url });
120
+ const markdown = unwrapMcpResult(raw);
121
+ if (typeof markdown !== 'string') {
122
+ throw new Error('Unexpected non-string response from get_sentry_resource');
123
+ }
124
+ return parseSentryResponse(markdown, numericId);
125
+ }
126
+ finally {
127
+ mcpProcess.stdin?.end();
128
+ mcpProcess.kill();
129
+ }
130
+ }
@@ -0,0 +1,191 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { getPackageVersion } from './paths.js';
4
+ /**
5
+ * Read `~/.claude.json` and return the first `mcpServers` entry whose key
6
+ * matches the predicate AND is not disabled (`disabled !== true`).
7
+ * Returns `null` when the file is unreadable or no enabled match is found.
8
+ *
9
+ * Shared helper so every Kōbō integration that reuses a user-configured MCP
10
+ * (Notion, Sentry, …) picks entries by the same rule.
11
+ */
12
+ export function readClaudeMcpEntry(match) {
13
+ const homedir = process.env.HOME ?? process.env.USERPROFILE ?? '';
14
+ const configPath = `${homedir}/.claude.json`;
15
+ try {
16
+ const raw = readFileSync(configPath, 'utf-8');
17
+ const config = JSON.parse(raw);
18
+ const servers = config.mcpServers ?? {};
19
+ const key = Object.keys(servers).find((k) => match(k) && servers[k].disabled !== true);
20
+ if (!key)
21
+ return null;
22
+ return { key, entry: servers[key] };
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ const nextRpcId = (() => {
29
+ let counter = 1;
30
+ return () => counter++;
31
+ })();
32
+ /**
33
+ * Spawn an MCP server process given explicit command, args, and env.
34
+ * The caller is responsible for constructing the full env (including auth headers).
35
+ * stderr is consumed silently; set DEBUG_MCP_STDERR=1 to print it.
36
+ */
37
+ export function spawnMcpProcess(command, args, env) {
38
+ const mcpProcess = spawn(command, args, {
39
+ stdio: ['pipe', 'pipe', 'pipe'],
40
+ env,
41
+ });
42
+ mcpProcess.stderr?.on('data', (data) => {
43
+ if (process.env.DEBUG_MCP_STDERR) {
44
+ console.error('[mcp stderr]', data.toString());
45
+ }
46
+ });
47
+ return mcpProcess;
48
+ }
49
+ /** Send MCP initialize handshake (30s timeout). Kills process on timeout.
50
+ * Generous to accommodate slow MCP servers (npx cold start, remote host
51
+ * validation, first-run package fetch). Override with KOBO_MCP_INIT_TIMEOUT_MS. */
52
+ export async function initializeMcp(mcpProcess) {
53
+ const id = nextRpcId();
54
+ const request = JSON.stringify({
55
+ jsonrpc: '2.0',
56
+ id,
57
+ method: 'initialize',
58
+ params: {
59
+ protocolVersion: '2024-11-05',
60
+ capabilities: {},
61
+ clientInfo: { name: 'kobo', version: getPackageVersion() },
62
+ },
63
+ });
64
+ await new Promise((resolve, reject) => {
65
+ if (!mcpProcess.stdin || !mcpProcess.stdout) {
66
+ reject(new Error('MCP process not ready'));
67
+ return;
68
+ }
69
+ let buffer = '';
70
+ const initTimeoutMs = Number(process.env.KOBO_MCP_INIT_TIMEOUT_MS) || 30_000;
71
+ const timeout = setTimeout(() => {
72
+ mcpProcess.stdout?.removeListener('data', onData);
73
+ mcpProcess.kill();
74
+ reject(new Error(`initializeMcp timed out after ${initTimeoutMs}ms`));
75
+ }, initTimeoutMs);
76
+ const onData = (chunk) => {
77
+ buffer += chunk.toString();
78
+ const lines = buffer.split('\n');
79
+ buffer = lines.pop() ?? '';
80
+ for (const line of lines) {
81
+ const trimmed = line.trim();
82
+ if (!trimmed)
83
+ continue;
84
+ try {
85
+ const parsed = JSON.parse(trimmed);
86
+ if (parsed.id === id) {
87
+ clearTimeout(timeout);
88
+ mcpProcess.stdout?.removeListener('data', onData);
89
+ const initialized = JSON.stringify({
90
+ jsonrpc: '2.0',
91
+ method: 'notifications/initialized',
92
+ });
93
+ mcpProcess.stdin?.write(`${initialized}\n`);
94
+ resolve();
95
+ }
96
+ }
97
+ catch {
98
+ // ignore
99
+ }
100
+ }
101
+ };
102
+ const onError = (err) => {
103
+ clearTimeout(timeout);
104
+ mcpProcess.stdout?.removeListener('data', onData);
105
+ reject(err);
106
+ };
107
+ mcpProcess.stdout.on('data', onData);
108
+ mcpProcess.stdout.once('error', onError);
109
+ mcpProcess.stdin.write(`${request}\n`);
110
+ });
111
+ }
112
+ /** Send a JSON-RPC tools/call request and return the raw result (30s timeout). */
113
+ export async function callMcpTool(mcpProcess, toolName, args) {
114
+ const id = nextRpcId();
115
+ const request = JSON.stringify({
116
+ jsonrpc: '2.0',
117
+ id,
118
+ method: 'tools/call',
119
+ params: { name: toolName, arguments: args },
120
+ });
121
+ return new Promise((resolve, reject) => {
122
+ if (!mcpProcess.stdin || !mcpProcess.stdout) {
123
+ reject(new Error('MCP process stdin/stdout not available'));
124
+ return;
125
+ }
126
+ let buffer = '';
127
+ const timeout = setTimeout(() => {
128
+ mcpProcess.stdout?.removeListener('data', onData);
129
+ mcpProcess.stdout?.removeListener('error', onError);
130
+ mcpProcess.kill();
131
+ reject(new Error(`callMcpTool('${toolName}') timed out after 30s`));
132
+ }, 30_000);
133
+ const onData = (chunk) => {
134
+ buffer += chunk.toString();
135
+ const lines = buffer.split('\n');
136
+ buffer = lines.pop() ?? '';
137
+ for (const line of lines) {
138
+ const trimmed = line.trim();
139
+ if (!trimmed)
140
+ continue;
141
+ try {
142
+ const parsed = JSON.parse(trimmed);
143
+ if (parsed.id === id) {
144
+ clearTimeout(timeout);
145
+ mcpProcess.stdout?.removeListener('data', onData);
146
+ mcpProcess.stdout?.removeListener('error', onError);
147
+ if (parsed.error) {
148
+ reject(new Error(`MCP tool '${toolName}' error: ${parsed.error.message} (code: ${parsed.error.code})`));
149
+ }
150
+ else {
151
+ resolve(parsed.result);
152
+ }
153
+ }
154
+ }
155
+ catch {
156
+ // Ignore JSON parse errors for partial lines
157
+ }
158
+ }
159
+ };
160
+ const onError = (err) => {
161
+ clearTimeout(timeout);
162
+ mcpProcess.stdout?.removeListener('data', onData);
163
+ reject(err);
164
+ };
165
+ mcpProcess.stdout.on('data', onData);
166
+ mcpProcess.stdout.once('error', onError);
167
+ mcpProcess.stdin.write(`${request}\n`);
168
+ });
169
+ }
170
+ /**
171
+ * Unwrap the MCP tool response envelope.
172
+ * MCP returns `{ content: [{ type: "text", text: "..." }] }` where `text`
173
+ * may be a JSON-stringified object or plain markdown/text.
174
+ */
175
+ export function unwrapMcpResult(result) {
176
+ if (result && typeof result === 'object') {
177
+ const obj = result;
178
+ if (Array.isArray(obj.content)) {
179
+ const first = obj.content[0];
180
+ if (first?.type === 'text' && first.text) {
181
+ try {
182
+ return JSON.parse(first.text);
183
+ }
184
+ catch {
185
+ return first.text;
186
+ }
187
+ }
188
+ }
189
+ }
190
+ return result;
191
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.5.1",
3
+ "version": "1.5.3",
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,_ as c,_t as l,a as u,d,f,g as p,m,n as ee,p as h,rt as te,u as g,y as ne,yt as _}from"./vue-i18n-nv59vAyH.js";import{L as v,T as y,bt as re}from"./scroll-CWjBCoBR.js";import{E as ie,O as ae}from"./index-wen3XwaX.js";import{t as b}from"./QSpinnerDots-FJCnAvfw.js";import{n as x,p as S,t as C}from"./_plugin-vue_export-helper-fkfRoKj2.js";import{n as oe,t as se}from"./marked.esm-Cid1-PgZ.js";var ce={key:0,class:`af-empty column items-center justify-center text-center q-pa-xl`},le={class:`text-grey-6 q-mt-md text-body2`},ue={class:`text-grey-8 text-caption q-mt-xs`},de={key:1,class:`row justify-center q-my-sm`},fe=[`data-item-id`],pe={class:`af-tool row items-center q-gutter-xs`},me={class:`af-tool-label text-indigo-4`},he={class:`af-time`},ge={key:0,class:`text-grey-4 q-mb-xs`},_e={class:`af-ask-options-list q-mb-sm`},ve={class:`text-weight-bold text-grey-3`},ye={key:0},be={key:1,class:`af-ask-buttons q-gutter-xs`},xe={key:0,class:`q-mt-sm row justify-end`},Se=[`onClick`],Ce={class:`af-file-header row items-center no-wrap q-gutter-xs`},we={class:`af-file-path text-grey-4 ellipsis`},Te={class:`af-diff-stats`},Ee={key:0,class:`text-green-5`},De={key:1,class:`text-red-5 q-ml-xs`},Oe={class:`af-time`},ke={class:`af-diff-sign`},Ae={key:1,class:`af-diff-line af-diff-del`},je={key:0,class:`af-diff-line text-grey-7 text-italic`},Me=[`onClick`],Ne={class:`af-tool-label text-grey-7`},Pe={key:0,class:`af-tool-desc text-grey-8`},Fe={class:`af-time`},Ie={key:0,class:`af-tool-args q-mt-xs rounded-borders`},Le={class:`af-args-pre`},Re={class:`af-text-header row items-center q-mb-xs`},ze={class:`af-time`},Be=[`innerHTML`],Ve=[`onClick`],He={class:`af-system-content text-caption text-amber-6`},Ue={class:`af-time`},We={key:0,class:`af-system-details q-mt-xs rounded-borders`},Ge={class:`af-args-pre`},Ke={key:5,class:`row items-center`},qe={class:`af-error-content text-red-5`},Je={class:`af-time`},Ye={key:6,class:`row items-center`},Xe={class:`af-raw-content text-grey-7`},Ze={class:`af-time`},Qe={class:`scroll-buttons`},w=50,$e=50,T=C(ne({__name:`ActivityFeed`,setup(ne){function C(e){let t=se.parse(e,{async:!1,breaks:!0,gfm:!0});return oe.sanitize(t)}let{t:T}=ee(),E=ae(),et=ie(),D=o(null),O=o(!1),k=o(new Set),A=new Map;function j(e,t){return A.has(e)||A.set(e,Y(t)),A.get(e)}let M=new Map;function tt(e,t){return M.has(e)||M.set(e,C(t)),M.get(e)}let N=g(()=>{let e=E.activityFeed;for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.meta?.sender===`user`)return null;if(n.type===`tool_use`&&n.content===`AskUserQuestion`)return n.id}return null}),P=o(new Map);function nt(e,t,n){P.value.has(e)||P.value.set(e,new Map);let r=P.value.get(e);r.get(t)===n?r.delete(t):r.set(t,n)}function F(e,t,n){return P.value.get(e)?.get(t)===n}function rt(e){let t=P.value.get(e);return!!t&&t.size>0}function it(e,t){let n=E.selectedWorkspaceId;if(!n)return;let r=P.value.get(e);if(!r||r.size===0)return;let i=[];for(let[e,n]of r.entries()){let r=t[e];if(!r)continue;let a=r.options[n];a&&i.push(`${r.question}: ${a.label}`)}i.length>0&&et.sendChatMessage(n,i.join(`
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,_ as c,_t as l,a as u,d,f,g as p,m,n as ee,p as h,rt as te,u as g,y as ne,yt as _}from"./vue-i18n-nv59vAyH.js";import{L as v,T as y,bt as re}from"./scroll-CWjBCoBR.js";import{E as ie,O as ae}from"./index-B4-QwpHI.js";import{t as b}from"./QSpinnerDots-FJCnAvfw.js";import{n as x,p as S,t as C}from"./_plugin-vue_export-helper-fkfRoKj2.js";import{n as oe,t as se}from"./marked.esm-CGMwQXW0.js";var ce={key:0,class:`af-empty column items-center justify-center text-center q-pa-xl`},le={class:`text-grey-6 q-mt-md text-body2`},ue={class:`text-grey-8 text-caption q-mt-xs`},de={key:1,class:`row justify-center q-my-sm`},fe=[`data-item-id`],pe={class:`af-tool row items-center q-gutter-xs`},me={class:`af-tool-label text-indigo-4`},he={class:`af-time`},ge={key:0,class:`text-grey-4 q-mb-xs`},_e={class:`af-ask-options-list q-mb-sm`},ve={class:`text-weight-bold text-grey-3`},ye={key:0},be={key:1,class:`af-ask-buttons q-gutter-xs`},xe={key:0,class:`q-mt-sm row justify-end`},Se=[`onClick`],Ce={class:`af-file-header row items-center no-wrap q-gutter-xs`},we={class:`af-file-path text-grey-4 ellipsis`},Te={class:`af-diff-stats`},Ee={key:0,class:`text-green-5`},De={key:1,class:`text-red-5 q-ml-xs`},Oe={class:`af-time`},ke={class:`af-diff-sign`},Ae={key:1,class:`af-diff-line af-diff-del`},je={key:0,class:`af-diff-line text-grey-7 text-italic`},Me=[`onClick`],Ne={class:`af-tool-label text-grey-7`},Pe={key:0,class:`af-tool-desc text-grey-8`},Fe={class:`af-time`},Ie={key:0,class:`af-tool-args q-mt-xs rounded-borders`},Le={class:`af-args-pre`},Re={class:`af-text-header row items-center q-mb-xs`},ze={class:`af-time`},Be=[`innerHTML`],Ve=[`onClick`],He={class:`af-system-content text-caption text-amber-6`},Ue={class:`af-time`},We={key:0,class:`af-system-details q-mt-xs rounded-borders`},Ge={class:`af-args-pre`},Ke={key:5,class:`row items-center`},qe={class:`af-error-content text-red-5`},Je={class:`af-time`},Ye={key:6,class:`row items-center`},Xe={class:`af-raw-content text-grey-7`},Ze={class:`af-time`},Qe={class:`scroll-buttons`},w=50,$e=50,T=C(ne({__name:`ActivityFeed`,setup(ne){function C(e){let t=se.parse(e,{async:!1,breaks:!0,gfm:!0});return oe.sanitize(t)}let{t:T}=ee(),E=ae(),et=ie(),D=o(null),O=o(!1),k=o(new Set),A=new Map;function j(e,t){return A.has(e)||A.set(e,Y(t)),A.get(e)}let M=new Map;function tt(e,t){return M.has(e)||M.set(e,C(t)),M.get(e)}let N=g(()=>{let e=E.activityFeed;for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.meta?.sender===`user`)return null;if(n.type===`tool_use`&&n.content===`AskUserQuestion`)return n.id}return null}),P=o(new Map);function nt(e,t,n){P.value.has(e)||P.value.set(e,new Map);let r=P.value.get(e);r.get(t)===n?r.delete(t):r.set(t,n)}function F(e,t,n){return P.value.get(e)?.get(t)===n}function rt(e){let t=P.value.get(e);return!!t&&t.size>0}function it(e,t){let n=E.selectedWorkspaceId;if(!n)return;let r=P.value.get(e);if(!r||r.size===0)return;let i=[];for(let[e,n]of r.entries()){let r=t[e];if(!r)continue;let a=r.options[n];a&&i.push(`${r.question}: ${a.label}`)}i.length>0&&et.sendChatMessage(n,i.join(`
2
2
  `))}let I=o(-1);function at(){let t=E.activityFeed,n=t.map((e,t)=>({item:e,idx:t})).filter(({item:e})=>e.meta?.sender===`user`);if(n.length===0)return;I.value<=0?I.value=n.length-1:I.value--;let r=n[I.value].idx,i=n[I.value].item.id,a=t.length-r;a>L.value&&(L.value=Math.min(a+10,t.length)),e(()=>{let e=D.value?.querySelector(`[data-item-id="${i}"]`);e&&e.scrollIntoView({behavior:`smooth`,block:`center`})})}n(()=>E.selectedWorkspaceId,()=>{I.value=-1,A.clear(),P.value.clear(),M.clear(),W.clear(),B=0,O.value=!1});let L=o(w),R=g(()=>{let e=E.activityFeed;return e.length<=L.value?e:e.slice(-L.value)});n(()=>E.selectedWorkspaceId,()=>{L.value=w}),n(R,e=>{let t=new Set(e.map(e=>e.id));for(let e of A.keys())t.has(e)||A.delete(e);for(let e of P.value.keys())t.has(e)||P.value.delete(e);for(let e of M.keys())t.has(e)||M.delete(e);for(let e of W.keys())t.has(e)||W.delete(e)},{flush:`post`});let z=o(!1),B=0;function V(){let t=D.value;if(t&&(t.scrollHeight-t.scrollTop-t.clientHeight<50?z.value=!1:t.scrollTop<B&&(z.value=!0),B=t.scrollTop,t.scrollTop<200&&!O.value)){let n=E.activityFeed.length;if(L.value<n){O.value=!0;let r=t.scrollHeight;L.value=Math.min(L.value+$e,n),e(()=>{D.value&&(D.value.scrollTop+=D.value.scrollHeight-r),O.value=!1})}else if(E.selectedWorkspaceId&&E.hasMoreEvents[E.selectedWorkspaceId]!==!1){O.value=!0;let n=t.scrollHeight;E.fetchOlderEvents(E.selectedWorkspaceId).then(t=>{t?(L.value=E.activityFeed.length,e(()=>{D.value&&(D.value.scrollTop+=D.value.scrollHeight-n),O.value=!1})):O.value=!1})}}}function H(){if(z.value)return;let e=D.value;e&&(e.scrollTop=e.scrollHeight)}function ot(){z.value=!1,L.value=w,e(()=>{let e=D.value;e&&(e.scrollTop=e.scrollHeight)})}n(()=>E.activityFeed.length,()=>{e(H)}),i(()=>{D.value?.addEventListener(`scroll`,V),e(H)}),a(()=>{D.value?.removeEventListener(`scroll`,V)});function U(e){return new Date(e).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}function st(e,t){let n=e.split(`
3
3
  `),r=t.split(`
4
4
  `),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}let W=new Map;function ct(e,t,n){return W.has(e)||W.set(e,st(t,n)),W.get(e)}function G(e){if(e.type!==`tool_use`)return null;let t=e.meta?.input;if(e.content===`Edit`){if(!t?.file_path)return null;let e=t.file_path,n=t.old_string??``,r=t.new_string??``,i=n.split(`
@@ -0,0 +1,2 @@
1
+ import{F as e,H as t,L as n,M as r,N as i,Q as a,T as ee,U as o,_ as s,a as c,d as l,f as u,g as d,m as f,n as te,p,rt as ne,u as m,y as re,yt as h}from"./vue-i18n-nv59vAyH.js";import{L as g,T as _,bt as v,ht as ie,yt as y}from"./scroll-CWjBCoBR.js";import{i as b}from"./private.use-form-1cZLVjGN.js";import{t as ae}from"./settings-CuK-S6HH.js";import{E as oe,O as se,r as x,w as ce}from"./index-B4-QwpHI.js";import{n as S,p as le,t as ue}from"./_plugin-vue_export-helper-fkfRoKj2.js";import{a as de,i as C,n as w,r as fe}from"./QMenu-DayfIdY0.js";import{t as pe}from"./QExpansionItem-BoxRv2sW.js";import{n as T,t as me}from"./QPage-D7SSe7S1.js";var he={class:`create-inner`},ge={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},_e={class:`create-card rounded-borders`},ve={class:`card-top-bar row items-center q-px-md q-py-xs`},ye={class:`model-badge cursor-default row items-center q-gutter-xs`},be={class:`text-indigo-3 text-weight-medium text-caption`},xe={key:0,class:`notion-url-wrap`},Se={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ce={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},we={key:0,class:`sentry-url-wrap`},Te={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},Ee={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},De={class:`card-name-wrap`},Oe={class:`card-textarea-wrap`},ke={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},Ae={class:`q-pa-sm manual-section-body`},je={class:`row items-center q-gutter-sm q-mb-sm`},Me={class:`col text-caption text-grey-4`},Ne={class:`q-pa-sm manual-section-body`},Pe={class:`row items-center q-gutter-sm q-mb-sm`},Fe={class:`col text-caption text-grey-4`},Ie={class:`card-bottom-bar row items-center wrap q-px-sm q-py-xs q-gutter-xs`},Le={class:`bottom-select-label row items-center no-wrap`},Re={class:`bottom-select-label row items-center no-wrap`},ze={class:`bottom-select-label row items-center no-wrap`},Be={class:`bottom-select-label row items-center no-wrap`},Ve={class:`bottom-select-label row items-center no-wrap`},He={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},E=ue(re({__name:`CreatePage`,setup(re){let ue=ce(),E=de(),Ue=se(),D=ae(),{t:O}=te(),We=a([]),k=a(``),A=a(``),j=a(``),M=a(!1),N=a(`auto`),P=a(``),F=a(null),I=a(`feature`),L=a(!1),Ge=[{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`}],R=a(D.global.defaultPermissionMode||`plan`),z=a([]),B=a(!1),V=a(!1),Ke=m(()=>[{label:O(`model.auto`),value:`auto`,description:`Claude picks the optimal model`},{label:O(`model.opus`),value:`claude-opus-4-6`,description:`Most powerful`},{label:O(`model.sonnet`),value:`claude-sonnet-4-6`,description:`Balanced`},{label:O(`model.haiku`),value:`claude-haiku-4-5-20251001`,description:`Fastest`}]),H=m(()=>j.value.trim().startsWith(`https://www.notion.so/`)),U=a([]),W=a([]),G=a(``),K=a(``),q=m(()=>!M.value||!H.value);function qe(){let e=G.value.trim();e&&(U.value.push(e),G.value=``)}function Je(e){U.value.splice(e,1)}function Ye(){let e=K.value.trim();e&&(W.value.push(e),K.value=``)}function Xe(e){W.value.splice(e,1)}function Ze(){M.value=!M.value,M.value||(j.value=``)}let J=a(!1),Y=a(``),X=m(()=>/\/issues\/\d+/.test(Y.value.trim()));function Qe(){J.value=!J.value,J.value||(Y.value=``)}async function $e(e){if(!e.trim()){z.value=[],F.value=null;return}B.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();z.value=n.local??n.branches??[],z.value.length>0&&!F.value&&(F.value=z.value[0]??null)}catch{z.value=[],F.value=null}finally{B.value=!1}}function et(e){let t=D.getProjectByPath(e);t&&(t.defaultSourceBranch&&(F.value=t.defaultSourceBranch),t.defaultModel?N.value=t.defaultModel:D.global.defaultModel&&(N.value=D.global.defaultModel))}let Z=null;t(P,e=>{Z&&clearTimeout(Z),Z=setTimeout(()=>{F.value=null,$e(e),et(e)},500)});function tt(e,t){t(()=>{We.value=D.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}r(()=>{D.fetchSettings()}),i(()=>{Z&&clearTimeout(Z)});function nt(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 Q(){return k.value.trim()?k.value.trim().substring(0,80):!M.value&&A.value.trim()&&(A.value.trim().split(`
2
+ `)[0]??``).substring(0,80)||`workspace`}function rt(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 it(){return M.value&&!H.value?O(`createPage.validationNotionUrl`):J.value&&!X.value?O(`createPage.sentryValidation`):!M.value&&!J.value&&!A.value.trim()?O(`createPage.validationDescription`):!M.value&&!J.value&&(!Q()||Q()===`workspace`)&&!k.value.trim()&&!A.value.trim()?O(`createPage.validationName`):P.value.trim()?F.value?null:O(`createPage.validationBranch`):O(`createPage.validationPath`)}async function $(){let e=it();if(e){E.notify({type:`negative`,message:e,position:`top`});return}V.value=!0;try{let e=Q(),t;t=M.value&&H.value?rt(j.value.trim()):e===`workspace`?`task-${Date.now()}`:nt(e);let n=`${I.value}/${t}`,r={name:e,projectPath:P.value.trim(),sourceBranch:F.value,workingBranch:n,model:N.value,...M.value&&H.value?{notionUrl:j.value.trim()}:{},...J.value&&X.value?{sentryUrl:Y.value.trim()}:{},...q.value&&U.value.length>0?{tasks:U.value}:{},...q.value&&W.value.length>0?{acceptanceCriteria:W.value}:{},...L.value?{skipSetupScript:!0}:{},...A.value.trim()?{description:A.value.trim()}:{},permissionMode:R.value},i=await Ue.createWorkspace(r);oe().subscribe(i.id),Ue.selectWorkspace(i.id),ue.push({name:`workspace`,params:{id:i.id}})}catch{E.notify({type:`negative`,message:O(`createPage.errorCreating`),position:`top`})}finally{V.value=!1}}return(t,r)=>(e(),u(me,{class:`create-page flex flex-center column`},{default:o(()=>[l(`div`,he,[l(`div`,ge,h(t.$t(`createPage.title`)),1),l(`div`,_e,[l(`div`,ve,[l(`span`,ye,[s(g,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),l(`span`,be,h(t.$t(`createPage.claudeCode`)),1)]),s(le),s(_,{flat:``,dense:``,"no-caps":``,size:`sm`,color:M.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,onClick:Ze},{default:o(()=>[s(g,{name:`description`,size:`14px`,class:`q-mr-xs`}),d(` `+h(M.value?t.$t(`createPage.notionEnabled`):t.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`]),s(_,{flat:``,dense:``,"no-caps":``,size:`sm`,color:J.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,onClick:Qe},{default:o(()=>[s(g,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),d(` `+h(J.value?t.$t(`createPage.sentryEnabled`):t.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`])]),s(b,{color:`grey-9`}),s(ie,{name:`slide`},{default:o(()=>[M.value?(e(),f(`div`,xe,[s(x,{modelValue:j.value,"onUpdate:modelValue":r[0]||=e=>j.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:o(()=>[s(g,{name:`link`,size:`16px`,color:H.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),j.value.trim()&&!H.value?(e(),f(`div`,Se,h(t.$t(`createPage.notionValidation`)),1)):p(``,!0),H.value?(e(),f(`div`,Ce,h(t.$t(`createPage.notionAutoExtract`)),1)):p(``,!0)])):p(``,!0)]),_:1}),M.value?(e(),u(b,{key:0,color:`grey-9`})):p(``,!0),s(ie,{name:`slide`},{default:o(()=>[J.value?(e(),f(`div`,we,[s(x,{modelValue:Y.value,"onUpdate:modelValue":r[1]||=e=>Y.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:o(()=>[s(g,{name:`link`,size:`16px`,color:X.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Y.value.trim()&&!X.value?(e(),f(`div`,Te,h(t.$t(`createPage.sentryValidation`)),1)):p(``,!0),X.value?(e(),f(`div`,Ee,h(t.$t(`createPage.sentryAutoExtract`)),1)):p(``,!0)])):p(``,!0)]),_:1}),J.value?(e(),u(b,{key:1,color:`grey-9`})):p(``,!0),l(`div`,De,[s(x,{modelValue:k.value,"onUpdate:modelValue":r[2]||=e=>k.value=e,borderless:``,dense:``,placeholder:M.value&&H.value?t.$t(`createPage.workspaceName`):t.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),s(b,{color:`grey-9`}),l(`div`,Oe,[s(x,{modelValue:A.value,"onUpdate:modelValue":r[3]||=e=>A.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:M.value?t.$t(`createPage.instructions`):t.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[y(v($,[`ctrl`]),[`enter`]),y(v($,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`])]),s(b,{color:`grey-9`}),q.value?(e(),f(c,{key:2},[l(`div`,ke,h(t.$t(`createPage.manualHint`)),1),s(pe,{dark:``,dense:``,label:t.$t(`createPage.tasks`,{count:U.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:o(()=>[l(`div`,Ae,[l(`div`,je,[s(x,{modelValue:G.value,"onUpdate:modelValue":r[4]||=e=>G.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:y(v(qe,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),s(_,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!G.value.trim(),onClick:qe},{default:o(()=>[s(S,null,{default:o(()=>[d(h(t.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),f(c,null,n(U.value,(n,r)=>(e(),f(`div`,{key:`task-${r}`,class:`row items-center q-py-xs manual-item`},[l(`span`,Me,h(n),1),s(_,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>Je(r)},{default:o(()=>[s(S,null,{default:o(()=>[d(h(t.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),s(pe,{dark:``,dense:``,label:t.$t(`createPage.acceptanceCriteria`,{count:W.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:o(()=>[l(`div`,Ne,[l(`div`,Pe,[s(x,{modelValue:K.value,"onUpdate:modelValue":r[5]||=e=>K.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:y(v(Ye,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),s(_,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!K.value.trim(),onClick:Ye},{default:o(()=>[s(S,null,{default:o(()=>[d(h(t.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),f(c,null,n(W.value,(n,r)=>(e(),f(`div`,{key:`crit-${r}`,class:`row items-center q-py-xs manual-item`},[l(`span`,Fe,h(n),1),s(_,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>Xe(r)},{default:o(()=>[s(S,null,{default:o(()=>[d(h(t.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),s(b,{color:`grey-9`})],64)):p(``,!0),l(`div`,Ie,[s(T,{modelValue:N.value,"onUpdate:modelValue":r[6]||=e=>N.value=e,options:Ke.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(()=>[l(`span`,Le,[d(h(Ke.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[s(w,ee(t,{class:`model-option`}),{default:o(()=>[s(C,null,{default:o(()=>[s(fe,{class:`text-white`},{default:o(()=>[d(h(e.label),1)]),_:2},1024),s(fe,{caption:``,class:`text-grey-5`},{default:o(()=>[d(h(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),s(T,{modelValue:R.value,"onUpdate:modelValue":r[7]||=e=>R.value=e,options:[{label:t.$t(`permissionMode.plan`),value:`plan`},{label:t.$t(`permissionMode.autoAccept`),value:`auto-accept`}],dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``},{selected:o(()=>[l(`span`,Re,[s(g,{name:R.value===`plan`?`visibility`:`flash_on`,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),d(` `+h(R.value===`plan`?t.$t(`permissionMode.plan`):t.$t(`permissionMode.autoAccept`))+` `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),_:1},8,[`modelValue`,`options`]),s(_,{flat:``,round:``,dense:``,size:`sm`,icon:L.value?`play_disabled`:`play_circle`,color:L.value?`orange-4`:`grey-6`,onClick:r[8]||=e=>L.value=!L.value},{default:o(()=>[s(S,null,{default:o(()=>[d(h(t.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`]),s(le),s(T,{modelValue:P.value,"onUpdate:modelValue":r[9]||=e=>P.value=e,options:We.value,dense:``,borderless:``,"use-input":``,"hide-selected":``,"fill-input":``,"input-debounce":`0`,"new-value-mode":`add`,class:`bottom-select rounded-borders repo-select`,"hide-dropdown-icon":``,behavior:ne(D).projectPaths.length>0?`menu`:`dialog`,onFilter:tt,onInputValue:r[10]||=e=>{P.value=e}},{prepend:o(()=>[s(g,{name:`attach_file`,size:`12px`,color:`grey-5`})]),selected:o(()=>[l(`span`,ze,h(P.value||t.$t(`createPage.projectPath`)),1)]),"no-option":o(()=>[s(w,null,{default:o(()=>[s(C,{class:`text-grey-6 text-caption`},{default:o(()=>[d(h(t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`behavior`]),s(T,{modelValue:I.value,"onUpdate:modelValue":r[11]||=e=>I.value=e,options:Ge,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:o(()=>[l(`span`,Be,[s(g,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+h(I.value)+`/ `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[s(S,null,{default:o(()=>[d(h(t.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`]),s(T,{modelValue:F.value,"onUpdate:modelValue":r[12]||=e=>F.value=e,options:z.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,loading:B.value,disable:!P.value.trim()||B.value},{selected:o(()=>[l(`span`,Ve,[s(g,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+h(F.value??t.$t(`createPage.branch`))+` `,1),s(g,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":o(()=>[s(w,null,{default:o(()=>[s(C,{class:`text-grey-6 text-caption`},{default:o(()=>[d(h(P.value.trim()?t.$t(`createPage.noBranches`):t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`]),s(_,{label:t.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:V.value,onClick:$},null,8,[`label`,`loading`])])]),l(`div`,He,h(M.value?t.$t(`createPage.notionExtractHint`):t.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-ae47afc5`]]);export{E as default};
@@ -0,0 +1 @@
1
+ .create-page[data-v-ae47afc5]{background-color:#1a1a2e;min-height:100%;padding:48px 24px}.create-inner[data-v-ae47afc5]{width:100%;max-width:700px}.create-title[data-v-ae47afc5]{font-size:24px;line-height:1.3}.create-card[data-v-ae47afc5]{background:#224;border:1px solid #444;overflow:hidden}.card-top-bar[data-v-ae47afc5]{background:#1e1e3a;min-height:36px}.card-name-wrap[data-v-ae47afc5]{background:#224;padding:8px 16px 4px}.card-name-wrap[data-v-ae47afc5] .q-field__control{height:32px;min-height:32px;padding:0}.card-name-wrap[data-v-ae47afc5] input{color:#e0e0e0;font-size:15px;font-weight:500}.card-name-wrap[data-v-ae47afc5] input::placeholder{color:#555}.card-textarea-wrap[data-v-ae47afc5]{background:#224}.repo-select[data-v-ae47afc5]{min-width:160px;max-width:260px}.repo-select[data-v-ae47afc5] .q-field__prepend{align-items:center;height:auto;padding-top:0}.create-textarea[data-v-ae47afc5]{color:#d0d0d0;width:100%;padding:12px 16px 4px}.create-textarea[data-v-ae47afc5] .q-field__control{padding:0}.create-textarea[data-v-ae47afc5] textarea{color:#d0d0d0;resize:none;min-height:100px;font-size:14px;line-height:1.6}.create-textarea[data-v-ae47afc5] textarea::placeholder{color:#666}.notion-toggle-btn[data-v-ae47afc5]{background:#333;padding:2px 10px}.notion-url-wrap[data-v-ae47afc5]{background:#1e1e3a;padding:8px 0 0}.notion-url-input[data-v-ae47afc5]{padding:0 12px}.notion-url-input[data-v-ae47afc5] .q-field__control{height:36px;min-height:36px;padding:0}.notion-url-input[data-v-ae47afc5] input{color:#d0d0d0;font-size:13px}.notion-url-input[data-v-ae47afc5] input::placeholder{color:#555;font-size:12px}.notion-error[data-v-ae47afc5],.notion-valid[data-v-ae47afc5]{padding-bottom:6px}.sentry-toggle-btn[data-v-ae47afc5]{background:#333;padding:2px 10px}.sentry-url-wrap[data-v-ae47afc5]{background:#1e1e3a;padding:8px 0 0}.sentry-url-input[data-v-ae47afc5]{padding:0 12px}.sentry-url-input[data-v-ae47afc5] .q-field__control{height:36px;min-height:36px;padding:0}.sentry-url-input[data-v-ae47afc5] input{color:#d0d0d0;font-size:13px}.sentry-url-input[data-v-ae47afc5] input::placeholder{color:#555;font-size:12px}.sentry-error[data-v-ae47afc5],.sentry-valid[data-v-ae47afc5]{padding-bottom:6px}.slide-enter-active[data-v-ae47afc5],.slide-leave-active[data-v-ae47afc5]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-ae47afc5],.slide-leave-to[data-v-ae47afc5]{opacity:0;max-height:0}.slide-enter-to[data-v-ae47afc5],.slide-leave-from[data-v-ae47afc5]{opacity:1;max-height:120px}.card-bottom-bar[data-v-ae47afc5]{background:#1e1e3a;min-height:40px}.bottom-select[data-v-ae47afc5]{background:#333;min-width:60px;height:28px;padding:0 6px}.bottom-select[data-v-ae47afc5] .q-field__control{height:28px;min-height:28px;padding:0}.bottom-select[data-v-ae47afc5] .q-field__native{min-height:unset;padding:0}.bottom-select-label[data-v-ae47afc5]{color:#bbb;gap:2px;font-size:11px}.bottom-sep[data-v-ae47afc5]{color:#555;padding:0 2px;font-size:12px;line-height:1}.repo-path-wrap[data-v-ae47afc5]{background:#333;border-radius:6px;height:28px;padding:0 8px}.repo-input[data-v-ae47afc5]{min-width:140px}.repo-input[data-v-ae47afc5] .q-field__control{height:28px;min-height:28px;padding:0}.repo-input[data-v-ae47afc5] input{color:#bbb;font-size:11px}.repo-input[data-v-ae47afc5] input::placeholder{color:#666;font-size:11px}.branch-select[data-v-ae47afc5]{min-width:80px}.create-btn[data-v-ae47afc5]{color:#fff;background:#4f46e5;height:28px;padding:0 14px;font-size:12px}.create-btn[data-v-ae47afc5] .q-btn__content{height:28px}.create-hint[data-v-ae47afc5]{line-height:1.5}.fade-enter-active[data-v-ae47afc5],.fade-leave-active[data-v-ae47afc5]{transition:opacity .2s}.fade-enter-from[data-v-ae47afc5],.fade-leave-to[data-v-ae47afc5]{opacity:0}.manual-hint[data-v-ae47afc5]{background:#1e1e3a;line-height:1.4}.manual-expansion[data-v-ae47afc5]{background:#1e1e3a;border:1px solid #333;border-radius:4px;margin-top:6px;overflow:hidden}.manual-expansion[data-v-ae47afc5] .manual-expansion-header{min-height:32px;padding:4px 10px;font-size:12px}.manual-expansion[data-v-ae47afc5] .q-expansion-item__content,.manual-section-body[data-v-ae47afc5]{background:#1a1a2e}.manual-input[data-v-ae47afc5] .q-field__control{height:26px;min-height:26px;padding:0}.manual-input[data-v-ae47afc5] input{color:#e0e0e0;font-size:12px}.manual-input[data-v-ae47afc5] input::placeholder{color:#555}.manual-item[data-v-ae47afc5]{border-top:1px solid #ffffff0a}.manual-item[data-v-ae47afc5]:first-child{border-top:none}
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-C3fYYKpq.js","assets/index-wen3XwaX.js","assets/vue-i18n-nv59vAyH.js","assets/scroll-CWjBCoBR.js","assets/settings-CuK-S6HH.js","assets/use-checkbox-DwkIkUAc.js","assets/private.use-form-1cZLVjGN.js","assets/i18n-D5LoHj4O.js","assets/index-eX_lKHSg.css","assets/editor.api-BEvyDmPD.js","assets/editor-COGk2gAX.css","assets/monaco.contribution-CffkEucM.js","assets/editor-CS3NEPi9.css"])))=>i.map(i=>d[i]);
2
- import{D as e,F as t,H as n,L as r,M as i,N as a,Q as o,S as s,U as c,W as l,_ as u,_t as d,a as f,b as p,d as m,f as h,g,j as ee,k as _,m as v,n as y,p as b,u as x,vt as S,y as C,yt as w}from"./vue-i18n-nv59vAyH.js";import{E as T,L as E,T as D,V as O,c as k,ct as A,s as j,z as M}from"./scroll-CWjBCoBR.js";import{a as N,i as P,o as F,r as I,s as L,t as R}from"./private.use-form-1cZLVjGN.js";import{S as z}from"./index-wen3XwaX.js";import{t as B}from"./QSpinnerDots-FJCnAvfw.js";import{n as V,p as te,t as H}from"./_plugin-vue_export-helper-fkfRoKj2.js";import{t as U}from"./QBadge-xNMZEqT-.js";import{r as W}from"./touch-Bojc73iM.js";import{n as G,t as K}from"./TouchPan-DuISf80E.js";import{t as q}from"./format-Ex4UmWdz.js";var J=A({name:`QBtnGroup`,props:{unelevated:Boolean,outline:Boolean,flat:Boolean,rounded:Boolean,square:Boolean,push:Boolean,stretch:Boolean,glossy:Boolean,spread:Boolean},setup(e,{slots:t}){let n=x(()=>{let t=[`unelevated`,`outline`,`flat`,`rounded`,`square`,`push`,`stretch`,`glossy`].filter(t=>e[t]===!0).map(e=>`q-btn-group--${e}`).join(` `);return`q-btn-group row no-wrap${t.length===0?``:` `+t}`+(e.spread===!0?` q-btn-group--spread`:` inline`)});return()=>s(`div`,{class:n.value},O(t.default))}}),ne=A({name:`QBtnToggle`,props:{...I,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=x(()=>e.options.find(t=>t.value===e.modelValue)!==void 0),i=R(x(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),a=x(()=>T(e)),o=x(()=>({rounded:e.rounded,dense:e.dense,...a.value})),c=x(()=>e.options.map((t,n)=>{let{attrs:r,value:i,slot:a,...s}=t;return{slot:a,props:{key:n,"aria-pressed":i===e.modelValue?`true`:`false`,...r,...s,...o.value,disable:e.disable===!0||s.disable===!0,color:i===e.modelValue?u(s,`toggleColor`):u(s,`color`),textColor:i===e.modelValue?u(s,`toggleTextColor`):u(s,`textColor`),noCaps:u(s,`noCaps`)===!0,noWrap:u(s,`noWrap`)===!0,size:u(s,`size`),padding:u(s,`padding`),ripple:u(s,`ripple`),stack:u(s,`stack`)===!0,stretch:u(s,`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=>s(D,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`),M(t.default,n)}return()=>s(J,{class:`q-btn-toggle`,...a.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}}),Y=A({props:[`store`,`barStyle`,`verticalBarStyle`,`horizontalBarStyle`],setup(e){return()=>[s(`div`,{class:e.store.scroll.vertical.barClass.value,style:[e.barStyle,e.verticalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onVerticalMousedown}),s(`div`,{class:e.store.scroll.horizontal.barClass.value,style:[e.barStyle,e.horizontalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onHorizontalMousedown}),l(s(`div`,{ref:e.store.scroll.vertical.ref,class:e.store.scroll.vertical.thumbClass.value,style:e.store.scroll.vertical.style.value,"aria-hidden":`true`}),e.store.thumbVertDir),l(s(`div`,{ref:e.store.scroll.horizontal.ref,class:e.store.scroll.horizontal.thumbClass.value,style:e.store.scroll.horizontal.style.value,"aria-hidden":`true`}),e.store.thumbHorizDir)]}}),X=[`vertical`,`horizontal`],Z={vertical:{offset:`offsetY`,scroll:`scrollTop`,dir:`down`,dist:`y`},horizontal:{offset:`offsetX`,scroll:`scrollLeft`,dir:`right`,dist:`x`}},Q={prevent:!0,mouse:!0,mouseAllDir:!0},$=e=>e>=250?50:Math.ceil(e/5),re=A({name:`QScrollArea`,props:{...F,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],verticalOffset:{type:Array,default:[0,0]},horizontalOffset:{type:Array,default:[0,0]},contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(t,{slots:r,emit:i}){let a=o(!1),c=o(!1),l=o(!1),u={vertical:o(0),horizontal:o(0)},d={vertical:{ref:o(null),position:o(0),size:o(0)},horizontal:{ref:o(null),position:o(0),size:o(0)}},{proxy:f}=p(),m=N(t,f.$q),h=null,g,v=o(null),y=x(()=>`q-scrollarea`+(m.value===!0?` q-scrollarea--dark`:``));Object.assign(u,{verticalInner:x(()=>u.vertical.value-t.verticalOffset[0]-t.verticalOffset[1]),horizontalInner:x(()=>u.horizontal.value-t.horizontalOffset[0]-t.horizontalOffset[1])}),d.vertical.percentage=x(()=>{let e=d.vertical.size.value-u.vertical.value;if(e<=0)return 0;let t=q(d.vertical.position.value/e,0,1);return Math.round(t*1e4)/1e4}),d.vertical.thumbHidden=x(()=>(t.visible===null?l.value:t.visible)!==!0&&a.value===!1&&c.value===!1||d.vertical.size.value<=u.vertical.value+1),d.vertical.thumbStart=x(()=>t.verticalOffset[0]+d.vertical.percentage.value*(u.verticalInner.value-d.vertical.thumbSize.value)),d.vertical.thumbSize=x(()=>Math.round(q(u.verticalInner.value*u.verticalInner.value/d.vertical.size.value,$(u.verticalInner.value),u.verticalInner.value))),d.vertical.style=x(()=>({...t.thumbStyle,...t.verticalThumbStyle,top:`${d.vertical.thumbStart.value}px`,height:`${d.vertical.thumbSize.value}px`,right:`${t.horizontalOffset[1]}px`})),d.vertical.thumbClass=x(()=>`q-scrollarea__thumb q-scrollarea__thumb--v absolute-right`+(d.vertical.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),d.vertical.barClass=x(()=>`q-scrollarea__bar q-scrollarea__bar--v absolute-right`+(d.vertical.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``)),d.horizontal.percentage=x(()=>{let e=d.horizontal.size.value-u.horizontal.value;if(e<=0)return 0;let t=q(Math.abs(d.horizontal.position.value)/e,0,1);return Math.round(t*1e4)/1e4}),d.horizontal.thumbHidden=x(()=>(t.visible===null?l.value:t.visible)!==!0&&a.value===!1&&c.value===!1||d.horizontal.size.value<=u.horizontal.value+1),d.horizontal.thumbStart=x(()=>t.horizontalOffset[0]+d.horizontal.percentage.value*(u.horizontalInner.value-d.horizontal.thumbSize.value)),d.horizontal.thumbSize=x(()=>Math.round(q(u.horizontalInner.value*u.horizontalInner.value/d.horizontal.size.value,$(u.horizontalInner.value),u.horizontalInner.value))),d.horizontal.style=x(()=>({...t.thumbStyle,...t.horizontalThumbStyle,[f.$q.lang.rtl===!0?`right`:`left`]:`${d.horizontal.thumbStart.value}px`,width:`${d.horizontal.thumbSize.value}px`,bottom:`${t.verticalOffset[1]}px`})),d.horizontal.thumbClass=x(()=>`q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom`+(d.horizontal.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),d.horizontal.barClass=x(()=>`q-scrollarea__bar q-scrollarea__bar--h absolute-bottom`+(d.horizontal.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``));let b=x(()=>d.vertical.thumbHidden.value===!0&&d.horizontal.thumbHidden.value===!0?t.contentStyle:t.contentActiveStyle);function S(){let e={};return X.forEach(t=>{let n=d[t];Object.assign(e,{[t+`Position`]:n.position.value,[t+`Percentage`]:n.percentage.value,[t+`Size`]:n.size.value,[t+`ContainerSize`]:u[t].value,[t+`ContainerInnerSize`]:u[t+`Inner`].value})}),e}let C=L(()=>{let e=S();e.ref=f,i(`scroll`,e)},0);function w(e,t,n){if(X.includes(e)===!1){console.error(`[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)`);return}(e===`vertical`?k:j)(v.value,t,n)}function T({height:e,width:t}){let n=!1;u.vertical.value!==e&&(u.vertical.value=e,n=!0),u.horizontal.value!==t&&(u.horizontal.value=t,n=!0),n===!0&&P()}function E({position:e}){let t=!1;d.vertical.position.value!==e.top&&(d.vertical.position.value=e.top,t=!0),d.horizontal.position.value!==e.left&&(d.horizontal.position.value=e.left,t=!0),t===!0&&P()}function D({height:e,width:t}){d.horizontal.size.value!==t&&(d.horizontal.size.value=t,P()),d.vertical.size.value!==e&&(d.vertical.size.value=e,P())}function O(e,t){let n=d[t];if(e.isFirst===!0){if(n.thumbHidden.value===!0)return;g=n.position.value,c.value=!0}else if(c.value!==!0)return;e.isFinal===!0&&(c.value=!1);let r=Z[t],i=(n.size.value-u[t].value)/(u[t+`Inner`].value-n.thumbSize.value),a=e.distance[r.dist];F(g+(e.direction===r.dir?1:-1)*a*i,t)}function A(e,n){let r=d[n];if(r.thumbHidden.value!==!0){let i=n===`vertical`?t.verticalOffset[0]:t.horizontalOffset[0],a=e[Z[n].offset]-i,o=r.thumbStart.value-i;(a<o||a>o+r.thumbSize.value)&&F(q((a-r.thumbSize.value/2)/(u[n+`Inner`].value-r.thumbSize.value),0,1)*Math.max(0,r.size.value-u[n].value),n),r.ref.value!==null&&r.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function P(){a.value=!0,h!==null&&clearTimeout(h),h=setTimeout(()=>{h=null,a.value=!1},t.delay),t.onScroll!==void 0&&C()}function F(e,t){v.value[Z[t].scroll]=e}let I=null;function R(){I!==null&&clearTimeout(I),I=setTimeout(()=>{I=null,l.value=!0},f.$q.platform.is.ios?50:0)}function z(){I!==null&&(clearTimeout(I),I=null),l.value=!1}let B=null;n(()=>f.$q.lang.rtl,e=>{v.value!==null&&j(v.value,Math.abs(d.horizontal.position.value)*(e===!0?-1:1))}),ee(()=>{B={top:d.vertical.position.value,left:d.horizontal.position.value}}),e(()=>{if(B===null)return;let e=v.value;e!==null&&(j(e,B.left),k(e,B.top))}),_(C.cancel),Object.assign(f,{getScrollTarget:()=>v.value,getScroll:S,getScrollPosition:()=>({top:d.vertical.position.value,left:d.horizontal.position.value}),getScrollPercentage:()=>({top:d.vertical.percentage.value,left:d.horizontal.percentage.value}),setScrollPosition:w,setScrollPercentage(e,t,n){w(e,t*(d[e].size.value-u[e].value)*(e===`horizontal`&&f.$q.lang.rtl===!0?-1:1),n)}});let V={scroll:d,thumbVertDir:[[K,e=>{O(e,`vertical`)},void 0,{vertical:!0,...Q}]],thumbHorizDir:[[K,e=>{O(e,`horizontal`)},void 0,{horizontal:!0,...Q}]],onVerticalMousedown(e){A(e,`vertical`)},onHorizontalMousedown(e){A(e,`horizontal`)}};return()=>s(`div`,{class:y.value,onMouseenter:R,onMouseleave:z},[s(`div`,{ref:v,class:`q-scrollarea__container scroll relative-position fit hide-scrollbar`,tabindex:t.tabindex===void 0?void 0:t.tabindex},[s(`div`,{class:`q-scrollarea__content absolute`,style:b.value},M(r.default,[s(W,{debounce:0,onResize:D})])),s(G,{axis:`both`,onScroll:E})]),s(W,{debounce:0,onResize:T}),s(Y,{store:V,barStyle:t.barStyle,verticalBarStyle:t.verticalBarStyle,horizontalBarStyle:t.horizontalBarStyle})])}}),ie={class:`diff-viewer column full-height`},ae={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},oe={class:`text-body1 text-weight-medium text-grey-3`},se={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},ce={class:`text-grey-7`},le={class:`text-green-4`},ue={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},de={class:`row col no-wrap`,style:{"min-height":`0`}},fe={key:1,class:`text-caption text-grey-8 q-pa-sm`},pe=[`onClick`],me={class:`text-caption text-grey-4`,style:{"font-size":`11px`}},he=[`onClick`],ge={class:`text-caption text-grey-3 ellipsis`,style:{"font-size":`11px`}},_e={class:`col column`,style:{"min-width":`0`,position:`relative`}},ve={key:0,class:`col column items-center justify-center`},ye={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},be=H(C({__name:`DiffViewer`,props:{workspaceId:{}},emits:[`close`,`sendToChat`],setup(e,{emit:s}){let l=e,p=s,{t:ee}=y(),_=o([]),C=o(``),T=o(``),O=o(null),k=o(!1),A=o(!1),j=o(null),M=o(`side`),N=o(new Set),F=null,I=null,L=[];function R(e){let t=0;for(let n of e)n.isDir?t+=R(n.children):t++;return t}let H=x(()=>{let e=[];for(let t of _.value){let n=t.path.split(`/`),r=e;for(let e=0;e<n.length;e++){let i=n[e],a=e===n.length-1,o=n.slice(0,e+1).join(`/`),s=r.find(e=>e.name===i&&e.isDir===!a);s||(s={name:i,path:a?t.path:o,isDir:!a,status:a?t.status:void 0,children:[]},r.push(s)),r=s.children}}function t(e){e.sort((e,t)=>e.isDir===t.isDir?e.name.localeCompare(t.name):e.isDir?-1:1);for(let n of e)n.children.length>0&&t(n.children)}return t(e),e}),W=x(()=>{let e=[];function t(n,r){for(let i of n)i.isDir?(e.push({name:i.name,path:i.path,isDir:!0,depth:r,fileCount:R(i.children)}),N.value.has(i.path)||t(i.children,r+1)):e.push({name:i.name,path:i.path,isDir:!1,depth:r,status:i.status})}return t(H.value,0),e});function G(e){N.value.has(e)?N.value.delete(e):N.value.add(e)}async function K(){k.value=!0;try{let e=await fetch(`/api/workspaces/${l.workspaceId}/diff`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();_.value=t.files,C.value=t.sourceBranch??``,T.value=t.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{k.value=!1}}async function q(e){if(j.value){A.value=!0;try{F||(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`})}},F=await z(()=>import(`./editor.main-C3fYYKpq.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),F.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/${l.workspaceId}/diff-file?path=${encodeURIComponent(e)}`);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`;if(I){for(let e of L)e.dispose();L=[];let e=I.getModel();I.dispose(),I=null,e?.original?.dispose(),e?.modified?.dispose()}let i=F.editor.createModel(n.original??``,r),a=F.editor.createModel(n.modified??``,r);I=F.editor.createDiffEditor(j.value,{theme:`kobo-dark`,readOnly:!0,renderSideBySide:M.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18}),I.setModel({original:i,modified:a}),Y()}catch(e){console.error(`Failed to load file diff:`,e)}finally{A.value=!1}}}let J=o(!1);function Y(){if(!I)return;for(let e of L)e.dispose();L=[];let e=I.getModifiedEditor(),t=I.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();J.value=!!(e&&!e.isEmpty())});L.push(e)}}function X(){if(!(!I||!O.value))for(let e of[I.getModifiedEditor(),I.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===I.getModifiedEditor()?`modified`:`original`;p(`sendToChat`,`\`\`\`\n// ${O.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}n(O,e=>{e&&q(e)}),n(M,()=>{I&&I.updateOptions({renderSideBySide:M.value===`side`})});function Z(e){switch(e){case`added`:return`add_circle`;case`deleted`:return`remove_circle`;case`renamed`:return`drive_file_rename_outline`;default:return`edit`}}function Q(e){switch(e){case`added`:return`#4ade80`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return i(K),a(()=>{for(let e of L)e.dispose();if(L=[],I){let e=I.getModel();I.dispose(),I=null,e?.original?.dispose(),e?.modified?.dispose()}}),(e,n)=>(t(),v(`div`,ie,[m(`div`,ae,[u(E,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),m(`span`,oe,w(e.$t(`diff.title`)),1),u(U,{label:`${_.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),C.value?(t(),v(`span`,se,[m(`span`,ce,w(C.value),1),u(E,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),m(`span`,le,w(T.value),1)])):b(``,!0),O.value?(t(),v(`span`,ue,w(O.value),1)):b(``,!0),u(te),u(ne,{modelValue:M.value,"onUpdate:modelValue":n[0]||=e=>M.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:e.$t(`diff.side`),value:`side`},{label:e.$t(`diff.inline`),value:`inline`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),u(D,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,onClick:n[1]||=e=>p(`close`)},{default:c(()=>[u(V,null,{default:c(()=>[g(w(e.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1})]),u(P,{dark:``}),m(`div`,de,[u(re,{class:`diff-file-list q-pa-xs`,style:{width:`280px`,"min-width":`200px`,height:`100%`,"border-right":`1px solid #2a2a4a`}},{default:c(()=>[k.value?(t(),h(B,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):_.value.length===0?(t(),v(`div`,fe,w(e.$t(`diff.noChanges`)),1)):(t(!0),v(f,{key:2},r(W.value,e=>(t(),v(f,{key:e.path},[e.isDir?(t(),v(`div`,{key:0,class:`diff-dir-item cursor-pointer`,style:S({paddingLeft:`${e.depth*12+4}px`}),onClick:t=>G(e.path)},[u(E,{name:N.value.has(e.path)?`chevron_right`:`expand_more`,size:`14px`,color:`grey-6`},null,8,[`name`]),u(E,{name:`folder`,size:`13px`,color:`amber-7`,class:`q-mx-xs`}),m(`span`,me,w(e.name),1),u(U,{label:e.fileCount,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])],12,pe)):(t(),v(`div`,{key:1,class:d([`diff-file-item cursor-pointer`,{"diff-file-item--active":O.value===e.path}]),style:S({paddingLeft:`${e.depth*12+20}px`}),onClick:t=>O.value=e.path},[u(E,{name:Z(e.status),size:`11px`,style:S({color:Q(e.status)}),class:`q-mr-xs`},null,8,[`name`,`style`]),m(`span`,ge,w(e.name),1)],14,he))],64))),128))]),_:1}),m(`div`,_e,[A.value?(t(),v(`div`,ve,[u(B,{size:`32px`,color:`indigo-4`})])):O.value?b(``,!0):(t(),v(`div`,ye,w(e.$t(`diff.selectFile`)),1)),m(`div`,{ref_key:`editorContainer`,ref:j,class:`col`,style:{"min-height":`0`}},null,512),J.value?(t(),h(D,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:e.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:X},null,8,[`label`])):b(``,!0)])])]))}}),[[`__scopeId`,`data-v-4ed3860e`]]);export{be as default};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-oZnnOWQQ.js","assets/index-B4-QwpHI.js","assets/vue-i18n-nv59vAyH.js","assets/scroll-CWjBCoBR.js","assets/settings-CuK-S6HH.js","assets/use-checkbox-DwkIkUAc.js","assets/private.use-form-1cZLVjGN.js","assets/i18n-ckoKODmn.js","assets/index-eX_lKHSg.css","assets/editor.api-CyJb27tS.js","assets/editor-COGk2gAX.css","assets/monaco.contribution-BSsdGujG.js","assets/editor-CS3NEPi9.css"])))=>i.map(i=>d[i]);
2
+ import{D as e,F as t,H as n,L as r,M as i,N as a,Q as o,S as s,U as c,W as l,_ as u,_t as d,a as f,b as p,d as m,f as h,g,j as ee,k as _,m as v,n as y,p as b,u as x,vt as S,y as C,yt as w}from"./vue-i18n-nv59vAyH.js";import{E as T,L as E,T as D,V as O,c as k,ct as A,s as j,z as M}from"./scroll-CWjBCoBR.js";import{a as N,i as P,o as F,r as I,s as L,t as R}from"./private.use-form-1cZLVjGN.js";import{S as z}from"./index-B4-QwpHI.js";import{t as B}from"./QSpinnerDots-FJCnAvfw.js";import{n as V,p as te,t as H}from"./_plugin-vue_export-helper-fkfRoKj2.js";import{t as U}from"./QBadge-xNMZEqT-.js";import{r as W}from"./touch-Bojc73iM.js";import{n as G,t as K}from"./TouchPan-DuISf80E.js";import{t as q}from"./format-Ex4UmWdz.js";var J=A({name:`QBtnGroup`,props:{unelevated:Boolean,outline:Boolean,flat:Boolean,rounded:Boolean,square:Boolean,push:Boolean,stretch:Boolean,glossy:Boolean,spread:Boolean},setup(e,{slots:t}){let n=x(()=>{let t=[`unelevated`,`outline`,`flat`,`rounded`,`square`,`push`,`stretch`,`glossy`].filter(t=>e[t]===!0).map(e=>`q-btn-group--${e}`).join(` `);return`q-btn-group row no-wrap${t.length===0?``:` `+t}`+(e.spread===!0?` q-btn-group--spread`:` inline`)});return()=>s(`div`,{class:n.value},O(t.default))}}),ne=A({name:`QBtnToggle`,props:{...I,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=x(()=>e.options.find(t=>t.value===e.modelValue)!==void 0),i=R(x(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),a=x(()=>T(e)),o=x(()=>({rounded:e.rounded,dense:e.dense,...a.value})),c=x(()=>e.options.map((t,n)=>{let{attrs:r,value:i,slot:a,...s}=t;return{slot:a,props:{key:n,"aria-pressed":i===e.modelValue?`true`:`false`,...r,...s,...o.value,disable:e.disable===!0||s.disable===!0,color:i===e.modelValue?u(s,`toggleColor`):u(s,`color`),textColor:i===e.modelValue?u(s,`toggleTextColor`):u(s,`textColor`),noCaps:u(s,`noCaps`)===!0,noWrap:u(s,`noWrap`)===!0,size:u(s,`size`),padding:u(s,`padding`),ripple:u(s,`ripple`),stack:u(s,`stack`)===!0,stretch:u(s,`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=>s(D,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`),M(t.default,n)}return()=>s(J,{class:`q-btn-toggle`,...a.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}}),Y=A({props:[`store`,`barStyle`,`verticalBarStyle`,`horizontalBarStyle`],setup(e){return()=>[s(`div`,{class:e.store.scroll.vertical.barClass.value,style:[e.barStyle,e.verticalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onVerticalMousedown}),s(`div`,{class:e.store.scroll.horizontal.barClass.value,style:[e.barStyle,e.horizontalBarStyle],"aria-hidden":`true`,onMousedown:e.store.onHorizontalMousedown}),l(s(`div`,{ref:e.store.scroll.vertical.ref,class:e.store.scroll.vertical.thumbClass.value,style:e.store.scroll.vertical.style.value,"aria-hidden":`true`}),e.store.thumbVertDir),l(s(`div`,{ref:e.store.scroll.horizontal.ref,class:e.store.scroll.horizontal.thumbClass.value,style:e.store.scroll.horizontal.style.value,"aria-hidden":`true`}),e.store.thumbHorizDir)]}}),X=[`vertical`,`horizontal`],Z={vertical:{offset:`offsetY`,scroll:`scrollTop`,dir:`down`,dist:`y`},horizontal:{offset:`offsetX`,scroll:`scrollLeft`,dir:`right`,dist:`x`}},Q={prevent:!0,mouse:!0,mouseAllDir:!0},$=e=>e>=250?50:Math.ceil(e/5),re=A({name:`QScrollArea`,props:{...F,thumbStyle:Object,verticalThumbStyle:Object,horizontalThumbStyle:Object,barStyle:[Array,String,Object],verticalBarStyle:[Array,String,Object],horizontalBarStyle:[Array,String,Object],verticalOffset:{type:Array,default:[0,0]},horizontalOffset:{type:Array,default:[0,0]},contentStyle:[Array,String,Object],contentActiveStyle:[Array,String,Object],delay:{type:[String,Number],default:1e3},visible:{type:Boolean,default:null},tabindex:[String,Number],onScroll:Function},setup(t,{slots:r,emit:i}){let a=o(!1),c=o(!1),l=o(!1),u={vertical:o(0),horizontal:o(0)},d={vertical:{ref:o(null),position:o(0),size:o(0)},horizontal:{ref:o(null),position:o(0),size:o(0)}},{proxy:f}=p(),m=N(t,f.$q),h=null,g,v=o(null),y=x(()=>`q-scrollarea`+(m.value===!0?` q-scrollarea--dark`:``));Object.assign(u,{verticalInner:x(()=>u.vertical.value-t.verticalOffset[0]-t.verticalOffset[1]),horizontalInner:x(()=>u.horizontal.value-t.horizontalOffset[0]-t.horizontalOffset[1])}),d.vertical.percentage=x(()=>{let e=d.vertical.size.value-u.vertical.value;if(e<=0)return 0;let t=q(d.vertical.position.value/e,0,1);return Math.round(t*1e4)/1e4}),d.vertical.thumbHidden=x(()=>(t.visible===null?l.value:t.visible)!==!0&&a.value===!1&&c.value===!1||d.vertical.size.value<=u.vertical.value+1),d.vertical.thumbStart=x(()=>t.verticalOffset[0]+d.vertical.percentage.value*(u.verticalInner.value-d.vertical.thumbSize.value)),d.vertical.thumbSize=x(()=>Math.round(q(u.verticalInner.value*u.verticalInner.value/d.vertical.size.value,$(u.verticalInner.value),u.verticalInner.value))),d.vertical.style=x(()=>({...t.thumbStyle,...t.verticalThumbStyle,top:`${d.vertical.thumbStart.value}px`,height:`${d.vertical.thumbSize.value}px`,right:`${t.horizontalOffset[1]}px`})),d.vertical.thumbClass=x(()=>`q-scrollarea__thumb q-scrollarea__thumb--v absolute-right`+(d.vertical.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),d.vertical.barClass=x(()=>`q-scrollarea__bar q-scrollarea__bar--v absolute-right`+(d.vertical.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``)),d.horizontal.percentage=x(()=>{let e=d.horizontal.size.value-u.horizontal.value;if(e<=0)return 0;let t=q(Math.abs(d.horizontal.position.value)/e,0,1);return Math.round(t*1e4)/1e4}),d.horizontal.thumbHidden=x(()=>(t.visible===null?l.value:t.visible)!==!0&&a.value===!1&&c.value===!1||d.horizontal.size.value<=u.horizontal.value+1),d.horizontal.thumbStart=x(()=>t.horizontalOffset[0]+d.horizontal.percentage.value*(u.horizontalInner.value-d.horizontal.thumbSize.value)),d.horizontal.thumbSize=x(()=>Math.round(q(u.horizontalInner.value*u.horizontalInner.value/d.horizontal.size.value,$(u.horizontalInner.value),u.horizontalInner.value))),d.horizontal.style=x(()=>({...t.thumbStyle,...t.horizontalThumbStyle,[f.$q.lang.rtl===!0?`right`:`left`]:`${d.horizontal.thumbStart.value}px`,width:`${d.horizontal.thumbSize.value}px`,bottom:`${t.verticalOffset[1]}px`})),d.horizontal.thumbClass=x(()=>`q-scrollarea__thumb q-scrollarea__thumb--h absolute-bottom`+(d.horizontal.thumbHidden.value===!0?` q-scrollarea__thumb--invisible`:``)),d.horizontal.barClass=x(()=>`q-scrollarea__bar q-scrollarea__bar--h absolute-bottom`+(d.horizontal.thumbHidden.value===!0?` q-scrollarea__bar--invisible`:``));let b=x(()=>d.vertical.thumbHidden.value===!0&&d.horizontal.thumbHidden.value===!0?t.contentStyle:t.contentActiveStyle);function S(){let e={};return X.forEach(t=>{let n=d[t];Object.assign(e,{[t+`Position`]:n.position.value,[t+`Percentage`]:n.percentage.value,[t+`Size`]:n.size.value,[t+`ContainerSize`]:u[t].value,[t+`ContainerInnerSize`]:u[t+`Inner`].value})}),e}let C=L(()=>{let e=S();e.ref=f,i(`scroll`,e)},0);function w(e,t,n){if(X.includes(e)===!1){console.error(`[QScrollArea]: wrong first param of setScrollPosition (vertical/horizontal)`);return}(e===`vertical`?k:j)(v.value,t,n)}function T({height:e,width:t}){let n=!1;u.vertical.value!==e&&(u.vertical.value=e,n=!0),u.horizontal.value!==t&&(u.horizontal.value=t,n=!0),n===!0&&P()}function E({position:e}){let t=!1;d.vertical.position.value!==e.top&&(d.vertical.position.value=e.top,t=!0),d.horizontal.position.value!==e.left&&(d.horizontal.position.value=e.left,t=!0),t===!0&&P()}function D({height:e,width:t}){d.horizontal.size.value!==t&&(d.horizontal.size.value=t,P()),d.vertical.size.value!==e&&(d.vertical.size.value=e,P())}function O(e,t){let n=d[t];if(e.isFirst===!0){if(n.thumbHidden.value===!0)return;g=n.position.value,c.value=!0}else if(c.value!==!0)return;e.isFinal===!0&&(c.value=!1);let r=Z[t],i=(n.size.value-u[t].value)/(u[t+`Inner`].value-n.thumbSize.value),a=e.distance[r.dist];F(g+(e.direction===r.dir?1:-1)*a*i,t)}function A(e,n){let r=d[n];if(r.thumbHidden.value!==!0){let i=n===`vertical`?t.verticalOffset[0]:t.horizontalOffset[0],a=e[Z[n].offset]-i,o=r.thumbStart.value-i;(a<o||a>o+r.thumbSize.value)&&F(q((a-r.thumbSize.value/2)/(u[n+`Inner`].value-r.thumbSize.value),0,1)*Math.max(0,r.size.value-u[n].value),n),r.ref.value!==null&&r.ref.value.dispatchEvent(new MouseEvent(e.type,e))}}function P(){a.value=!0,h!==null&&clearTimeout(h),h=setTimeout(()=>{h=null,a.value=!1},t.delay),t.onScroll!==void 0&&C()}function F(e,t){v.value[Z[t].scroll]=e}let I=null;function R(){I!==null&&clearTimeout(I),I=setTimeout(()=>{I=null,l.value=!0},f.$q.platform.is.ios?50:0)}function z(){I!==null&&(clearTimeout(I),I=null),l.value=!1}let B=null;n(()=>f.$q.lang.rtl,e=>{v.value!==null&&j(v.value,Math.abs(d.horizontal.position.value)*(e===!0?-1:1))}),ee(()=>{B={top:d.vertical.position.value,left:d.horizontal.position.value}}),e(()=>{if(B===null)return;let e=v.value;e!==null&&(j(e,B.left),k(e,B.top))}),_(C.cancel),Object.assign(f,{getScrollTarget:()=>v.value,getScroll:S,getScrollPosition:()=>({top:d.vertical.position.value,left:d.horizontal.position.value}),getScrollPercentage:()=>({top:d.vertical.percentage.value,left:d.horizontal.percentage.value}),setScrollPosition:w,setScrollPercentage(e,t,n){w(e,t*(d[e].size.value-u[e].value)*(e===`horizontal`&&f.$q.lang.rtl===!0?-1:1),n)}});let V={scroll:d,thumbVertDir:[[K,e=>{O(e,`vertical`)},void 0,{vertical:!0,...Q}]],thumbHorizDir:[[K,e=>{O(e,`horizontal`)},void 0,{horizontal:!0,...Q}]],onVerticalMousedown(e){A(e,`vertical`)},onHorizontalMousedown(e){A(e,`horizontal`)}};return()=>s(`div`,{class:y.value,onMouseenter:R,onMouseleave:z},[s(`div`,{ref:v,class:`q-scrollarea__container scroll relative-position fit hide-scrollbar`,tabindex:t.tabindex===void 0?void 0:t.tabindex},[s(`div`,{class:`q-scrollarea__content absolute`,style:b.value},M(r.default,[s(W,{debounce:0,onResize:D})])),s(G,{axis:`both`,onScroll:E})]),s(W,{debounce:0,onResize:T}),s(Y,{store:V,barStyle:t.barStyle,verticalBarStyle:t.verticalBarStyle,horizontalBarStyle:t.horizontalBarStyle})])}}),ie={class:`diff-viewer column full-height`},ae={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},oe={class:`text-body1 text-weight-medium text-grey-3`},se={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},ce={class:`text-grey-7`},le={class:`text-green-4`},ue={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},de={class:`row col no-wrap`,style:{"min-height":`0`}},fe={key:1,class:`text-caption text-grey-8 q-pa-sm`},pe=[`onClick`],me={class:`text-caption text-grey-4`,style:{"font-size":`11px`}},he=[`onClick`],ge={class:`text-caption text-grey-3 ellipsis`,style:{"font-size":`11px`}},_e={class:`col column`,style:{"min-width":`0`,position:`relative`}},ve={key:0,class:`col column items-center justify-center`},ye={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},be=H(C({__name:`DiffViewer`,props:{workspaceId:{}},emits:[`close`,`sendToChat`],setup(e,{emit:s}){let l=e,p=s,{t:ee}=y(),_=o([]),C=o(``),T=o(``),O=o(null),k=o(!1),A=o(!1),j=o(null),M=o(`side`),N=o(new Set),F=null,I=null,L=[];function R(e){let t=0;for(let n of e)n.isDir?t+=R(n.children):t++;return t}let H=x(()=>{let e=[];for(let t of _.value){let n=t.path.split(`/`),r=e;for(let e=0;e<n.length;e++){let i=n[e],a=e===n.length-1,o=n.slice(0,e+1).join(`/`),s=r.find(e=>e.name===i&&e.isDir===!a);s||(s={name:i,path:a?t.path:o,isDir:!a,status:a?t.status:void 0,children:[]},r.push(s)),r=s.children}}function t(e){e.sort((e,t)=>e.isDir===t.isDir?e.name.localeCompare(t.name):e.isDir?-1:1);for(let n of e)n.children.length>0&&t(n.children)}return t(e),e}),W=x(()=>{let e=[];function t(n,r){for(let i of n)i.isDir?(e.push({name:i.name,path:i.path,isDir:!0,depth:r,fileCount:R(i.children)}),N.value.has(i.path)||t(i.children,r+1)):e.push({name:i.name,path:i.path,isDir:!1,depth:r,status:i.status})}return t(H.value,0),e});function G(e){N.value.has(e)?N.value.delete(e):N.value.add(e)}async function K(){k.value=!0;try{let e=await fetch(`/api/workspaces/${l.workspaceId}/diff`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();_.value=t.files,C.value=t.sourceBranch??``,T.value=t.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{k.value=!1}}async function q(e){if(j.value){A.value=!0;try{F||(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`})}},F=await z(()=>import(`./editor.main-oZnnOWQQ.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),F.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/${l.workspaceId}/diff-file?path=${encodeURIComponent(e)}`);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`;if(I){for(let e of L)e.dispose();L=[];let e=I.getModel();I.dispose(),I=null,e?.original?.dispose(),e?.modified?.dispose()}let i=F.editor.createModel(n.original??``,r),a=F.editor.createModel(n.modified??``,r);I=F.editor.createDiffEditor(j.value,{theme:`kobo-dark`,readOnly:!0,renderSideBySide:M.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18}),I.setModel({original:i,modified:a}),Y()}catch(e){console.error(`Failed to load file diff:`,e)}finally{A.value=!1}}}let J=o(!1);function Y(){if(!I)return;for(let e of L)e.dispose();L=[];let e=I.getModifiedEditor(),t=I.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();J.value=!!(e&&!e.isEmpty())});L.push(e)}}function X(){if(!(!I||!O.value))for(let e of[I.getModifiedEditor(),I.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===I.getModifiedEditor()?`modified`:`original`;p(`sendToChat`,`\`\`\`\n// ${O.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}n(O,e=>{e&&q(e)}),n(M,()=>{I&&I.updateOptions({renderSideBySide:M.value===`side`})});function Z(e){switch(e){case`added`:return`add_circle`;case`deleted`:return`remove_circle`;case`renamed`:return`drive_file_rename_outline`;default:return`edit`}}function Q(e){switch(e){case`added`:return`#4ade80`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return i(K),a(()=>{for(let e of L)e.dispose();if(L=[],I){let e=I.getModel();I.dispose(),I=null,e?.original?.dispose(),e?.modified?.dispose()}}),(e,n)=>(t(),v(`div`,ie,[m(`div`,ae,[u(E,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),m(`span`,oe,w(e.$t(`diff.title`)),1),u(U,{label:`${_.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),C.value?(t(),v(`span`,se,[m(`span`,ce,w(C.value),1),u(E,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),m(`span`,le,w(T.value),1)])):b(``,!0),O.value?(t(),v(`span`,ue,w(O.value),1)):b(``,!0),u(te),u(ne,{modelValue:M.value,"onUpdate:modelValue":n[0]||=e=>M.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:e.$t(`diff.side`),value:`side`},{label:e.$t(`diff.inline`),value:`inline`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),u(D,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,onClick:n[1]||=e=>p(`close`)},{default:c(()=>[u(V,null,{default:c(()=>[g(w(e.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1})]),u(P,{dark:``}),m(`div`,de,[u(re,{class:`diff-file-list q-pa-xs`,style:{width:`280px`,"min-width":`200px`,height:`100%`,"border-right":`1px solid #2a2a4a`}},{default:c(()=>[k.value?(t(),h(B,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):_.value.length===0?(t(),v(`div`,fe,w(e.$t(`diff.noChanges`)),1)):(t(!0),v(f,{key:2},r(W.value,e=>(t(),v(f,{key:e.path},[e.isDir?(t(),v(`div`,{key:0,class:`diff-dir-item cursor-pointer`,style:S({paddingLeft:`${e.depth*12+4}px`}),onClick:t=>G(e.path)},[u(E,{name:N.value.has(e.path)?`chevron_right`:`expand_more`,size:`14px`,color:`grey-6`},null,8,[`name`]),u(E,{name:`folder`,size:`13px`,color:`amber-7`,class:`q-mx-xs`}),m(`span`,me,w(e.name),1),u(U,{label:e.fileCount,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])],12,pe)):(t(),v(`div`,{key:1,class:d([`diff-file-item cursor-pointer`,{"diff-file-item--active":O.value===e.path}]),style:S({paddingLeft:`${e.depth*12+20}px`}),onClick:t=>O.value=e.path},[u(E,{name:Z(e.status),size:`11px`,style:S({color:Q(e.status)}),class:`q-mr-xs`},null,8,[`name`,`style`]),m(`span`,ge,w(e.name),1)],14,he))],64))),128))]),_:1}),m(`div`,_e,[A.value?(t(),v(`div`,ve,[u(B,{size:`32px`,color:`indigo-4`})])):O.value?b(``,!0):(t(),v(`div`,ye,w(e.$t(`diff.selectFile`)),1)),m(`div`,{ref_key:`editorContainer`,ref:j,class:`col`,style:{"min-height":`0`}},null,512),J.value?(t(),h(D,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:e.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:X},null,8,[`label`])):b(``,!0)])])]))}}),[[`__scopeId`,`data-v-4ed3860e`]]);export{be as default};
@@ -1 +1 @@
1
- .acceptance-item[data-v-63b144ad]{padding:2px 0}.acceptance-item[data-v-63b144ad]:hover{background-color:#ffffff08}.acceptance-item:hover .criterion-delete-btn[data-v-63b144ad]{opacity:1}.criterion-delete-btn[data-v-63b144ad]{opacity:0;transition:opacity .15s}.acceptance-title[data-v-63b144ad]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-63b144ad]{opacity:.7;text-decoration:line-through}.criterion-input[data-v-63b144ad] .q-field__control{height:22px;min-height:22px;padding:0}.criterion-input[data-v-63b144ad] input{color:#e0e0e0;font-size:12px}.criterion-input[data-v-63b144ad] input::placeholder{color:#555}.criterion-add-row[data-v-63b144ad],.todo-item[data-v-4eddf754]{padding:2px 0}.todo-title[data-v-4eddf754]{word-break:break-word;line-height:1.4}.text-strike[data-v-4eddf754]{opacity:.7;text-decoration:line-through}.log-content[data-v-9e03d2b2]{max-height:60vh;overflow-y:auto}.log-text[data-v-9e03d2b2]{color:#ccc;white-space:pre-wrap;word-break:break-all;background:#0d0d1a;margin:0;font-family:JetBrains Mono,Fira Code,monospace;font-size:11px}.dd-panel[data-v-20c5f4bd]{min-height:48px}.git-btn[data-v-0e9ea4fb]{padding:2px 10px;font-size:11px}.notion-link[data-v-99e38dbd]{text-decoration:none;display:inline-flex}.notion-link[data-v-99e38dbd]:hover{text-decoration:underline}.task-item[data-v-99e38dbd]{padding:2px 0}.task-item[data-v-99e38dbd]:hover{background-color:#ffffff08}.task-item:hover .task-delete-btn[data-v-99e38dbd]{opacity:1}.task-delete-btn[data-v-99e38dbd]{opacity:0;transition:opacity .15s}.task-title[data-v-99e38dbd]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-99e38dbd]{opacity:.7;text-decoration:line-through}.task-input[data-v-99e38dbd] .q-field__control{height:22px;min-height:22px;padding:0}.task-input[data-v-99e38dbd] input{color:#e0e0e0;font-size:12px}.task-input[data-v-99e38dbd] input::placeholder{color:#555}.task-add-row[data-v-99e38dbd]{padding:2px 0}.plan-content[data-v-442c2eef]{color:#d0d0d0;overflow-wrap:break-word;font-size:12px;line-height:1.6}.plan-content[data-v-442c2eef] h1{color:#e0e0e0;margin:16px 0 8px;font-size:16px}.plan-content[data-v-442c2eef] h2{color:#e0e0e0;margin:14px 0 6px;font-size:14px}.plan-content[data-v-442c2eef] h3{color:#e0e0e0;margin:12px 0 4px;font-size:13px}.plan-content[data-v-442c2eef] code{background:#1a1a2e;border-radius:3px;padding:1px 4px;font-family:Roboto Mono,monospace;font-size:11px}.plan-content[data-v-442c2eef] pre{background:#1a1a2e;border-radius:6px;padding:8px 12px;font-size:11px;overflow-x:auto}.plan-content[data-v-442c2eef] pre code{background:0 0;padding:0}.plan-content[data-v-442c2eef] ul,.plan-content[data-v-442c2eef] ol{padding-left:20px}.plan-content[data-v-442c2eef] li{margin-bottom:2px}.plan-content[data-v-442c2eef] input[type=checkbox]{pointer-events:none;margin-right:6px}.plan-content[data-v-442c2eef] table{border-collapse:collapse;width:100%;margin:8px 0;font-size:11px}.plan-content[data-v-442c2eef] th,.plan-content[data-v-442c2eef] td{text-align:left;border:1px solid #2a2a4a;padding:4px 8px}.plan-content[data-v-442c2eef] th{color:#e0e0e0;background:#1a1a2e}.plan-content[data-v-442c2eef] blockquote{color:#a0a0b0;border-left:3px solid #4a4a6a;margin:8px 0;padding:4px 12px}.plan-content[data-v-442c2eef] a{color:#818cf8}.plan-content[data-v-442c2eef] hr{border:none;border-top:1px solid #2a2a4a;margin:12px 0}.stat-group-label[data-v-3d3e6cd8]{text-transform:uppercase;letter-spacing:.05em;color:#888;font-size:10px;font-weight:600}.stat-row[data-v-3d3e6cd8]{justify-content:space-between;align-items:center;padding:2px 0;display:flex}.stat-label[data-v-3d3e6cd8]{color:#999;font-size:12px}.stat-value[data-v-3d3e6cd8]{color:#ddd;font-family:Roboto Mono,monospace;font-size:12px;font-weight:500}.stat-value-ellipsis[data-v-3d3e6cd8]{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.stat-section[data-v-3d3e6cd8]{justify-content:space-between;align-items:center;display:flex}.subagents-panel[data-v-81ad2481]{overflow-y:auto}.subagent-item[data-v-81ad2481]{background:#1e1e3a;border:1px solid #2a2a4a}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility-tree:not(.debug) ::-moz-selection{color:#0000}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:-moz-fit-content;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.tools-panel[data-v-64fae402]{min-height:48px}.workspace-list[data-v-b4e561f2]{background-color:#16162a;overflow-x:hidden}.wl-search[data-v-b4e561f2]{background-color:#224;padding:0 8px}.wl-search[data-v-b4e561f2] .q-field__control{height:32px}.wl-search[data-v-b4e561f2] input{color:#ccc;font-size:12px}.wl-group-header[data-v-b4e561f2]:hover{background-color:#ffffff08}.wl-project-group+.wl-project-group[data-v-b4e561f2]{margin-top:6px}.wl-project-label[data-v-b4e561f2]{align-items:center;padding-bottom:2px;font-size:11px;display:flex}.wl-item[data-v-b4e561f2]{background-color:#224;margin-bottom:4px;transition:background-color .15s;position:relative}.wl-item[data-v-b4e561f2]:last-child{margin-bottom:0}.wl-item[data-v-b4e561f2]:hover{background-color:#2a2a4a}.wl-item--selected[data-v-b4e561f2]{background-color:#2a2a4a;outline:1px solid #6c63ff66}.wl-item-action[data-v-b4e561f2]{position:absolute;top:4px;right:4px}.wl-item--archived .wl-item-action[data-v-b4e561f2]{opacity:0;transition:opacity .15s}.wl-item--archived:hover .wl-item-action[data-v-b4e561f2]{opacity:1}.wl-item-unarchive[data-v-b4e561f2]{right:28px}.wl-item-delete[data-v-b4e561f2]{right:4px}.wl-item--archived[data-v-b4e561f2]{opacity:.6;background-color:#1a1a30}.wl-item--archived[data-v-b4e561f2]:hover{opacity:.85}.wl-item--archived.wl-item--selected[data-v-b4e561f2]{opacity:1}.dd-dot[data-v-b4e561f2]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.dd-dot--running[data-v-b4e561f2]{background-color:#22c55e;box-shadow:0 0 4px #22c55e80}.bg-dark[data-v-a47eb368]{background-color:#16162a!important;border-color:#2a2a4a!important}.resize-handle[data-v-a47eb368]{cursor:col-resize;z-index:10;width:4px;height:100%;transition:background-color .15s;position:absolute;top:0;right:-2px}.resize-handle[data-v-a47eb368]:hover,.resize-handle[data-v-a47eb368]:active{background-color:#6c63ff80}.vertical-resize-handle[data-v-a47eb368]{cursor:row-resize;background-color:#2a2a4a;height:4px;transition:background-color .15s}.vertical-resize-handle[data-v-a47eb368]:hover,.vertical-resize-handle[data-v-a47eb368]:active{background-color:#6c63ff80}
1
+ .acceptance-item[data-v-63b144ad]{padding:2px 0}.acceptance-item[data-v-63b144ad]:hover{background-color:#ffffff08}.acceptance-item:hover .criterion-delete-btn[data-v-63b144ad]{opacity:1}.criterion-delete-btn[data-v-63b144ad]{opacity:0;transition:opacity .15s}.acceptance-title[data-v-63b144ad]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-63b144ad]{opacity:.7;text-decoration:line-through}.criterion-input[data-v-63b144ad] .q-field__control{height:22px;min-height:22px;padding:0}.criterion-input[data-v-63b144ad] input{color:#e0e0e0;font-size:12px}.criterion-input[data-v-63b144ad] input::placeholder{color:#555}.criterion-add-row[data-v-63b144ad],.todo-item[data-v-4eddf754]{padding:2px 0}.todo-title[data-v-4eddf754]{word-break:break-word;line-height:1.4}.text-strike[data-v-4eddf754]{opacity:.7;text-decoration:line-through}.log-content[data-v-9e03d2b2]{max-height:60vh;overflow-y:auto}.log-text[data-v-9e03d2b2]{color:#ccc;white-space:pre-wrap;word-break:break-all;background:#0d0d1a;margin:0;font-family:JetBrains Mono,Fira Code,monospace;font-size:11px}.dd-panel[data-v-20c5f4bd]{min-height:48px}.git-btn[data-v-54c55a94]{padding:2px 10px;font-size:11px}.notion-link[data-v-99e38dbd]{text-decoration:none;display:inline-flex}.notion-link[data-v-99e38dbd]:hover{text-decoration:underline}.task-item[data-v-99e38dbd]{padding:2px 0}.task-item[data-v-99e38dbd]:hover{background-color:#ffffff08}.task-item:hover .task-delete-btn[data-v-99e38dbd]{opacity:1}.task-delete-btn[data-v-99e38dbd]{opacity:0;transition:opacity .15s}.task-title[data-v-99e38dbd]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-99e38dbd]{opacity:.7;text-decoration:line-through}.task-input[data-v-99e38dbd] .q-field__control{height:22px;min-height:22px;padding:0}.task-input[data-v-99e38dbd] input{color:#e0e0e0;font-size:12px}.task-input[data-v-99e38dbd] input::placeholder{color:#555}.task-add-row[data-v-99e38dbd]{padding:2px 0}.plan-content[data-v-442c2eef]{color:#d0d0d0;overflow-wrap:break-word;font-size:12px;line-height:1.6}.plan-content[data-v-442c2eef] h1{color:#e0e0e0;margin:16px 0 8px;font-size:16px}.plan-content[data-v-442c2eef] h2{color:#e0e0e0;margin:14px 0 6px;font-size:14px}.plan-content[data-v-442c2eef] h3{color:#e0e0e0;margin:12px 0 4px;font-size:13px}.plan-content[data-v-442c2eef] code{background:#1a1a2e;border-radius:3px;padding:1px 4px;font-family:Roboto Mono,monospace;font-size:11px}.plan-content[data-v-442c2eef] pre{background:#1a1a2e;border-radius:6px;padding:8px 12px;font-size:11px;overflow-x:auto}.plan-content[data-v-442c2eef] pre code{background:0 0;padding:0}.plan-content[data-v-442c2eef] ul,.plan-content[data-v-442c2eef] ol{padding-left:20px}.plan-content[data-v-442c2eef] li{margin-bottom:2px}.plan-content[data-v-442c2eef] input[type=checkbox]{pointer-events:none;margin-right:6px}.plan-content[data-v-442c2eef] table{border-collapse:collapse;width:100%;margin:8px 0;font-size:11px}.plan-content[data-v-442c2eef] th,.plan-content[data-v-442c2eef] td{text-align:left;border:1px solid #2a2a4a;padding:4px 8px}.plan-content[data-v-442c2eef] th{color:#e0e0e0;background:#1a1a2e}.plan-content[data-v-442c2eef] blockquote{color:#a0a0b0;border-left:3px solid #4a4a6a;margin:8px 0;padding:4px 12px}.plan-content[data-v-442c2eef] a{color:#818cf8}.plan-content[data-v-442c2eef] hr{border:none;border-top:1px solid #2a2a4a;margin:12px 0}.stat-group-label[data-v-3d3e6cd8]{text-transform:uppercase;letter-spacing:.05em;color:#888;font-size:10px;font-weight:600}.stat-row[data-v-3d3e6cd8]{justify-content:space-between;align-items:center;padding:2px 0;display:flex}.stat-label[data-v-3d3e6cd8]{color:#999;font-size:12px}.stat-value[data-v-3d3e6cd8]{color:#ddd;font-family:Roboto Mono,monospace;font-size:12px;font-weight:500}.stat-value-ellipsis[data-v-3d3e6cd8]{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.stat-section[data-v-3d3e6cd8]{justify-content:space-between;align-items:center;display:flex}.subagents-panel[data-v-81ad2481]{overflow-y:auto}.subagent-item[data-v-81ad2481]{background:#1e1e3a;border:1px solid #2a2a4a}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility-tree:not(.debug) ::-moz-selection{color:#0000}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:-moz-fit-content;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.tools-panel[data-v-b6669c42]{min-height:48px}.workspace-list[data-v-5d93447b]{background-color:#16162a;overflow-x:hidden}.wl-search[data-v-5d93447b]{background-color:#224;padding:0 8px}.wl-search[data-v-5d93447b] .q-field__control{height:32px}.wl-search[data-v-5d93447b] input{color:#ccc;font-size:12px}.wl-group-header[data-v-5d93447b]:hover{background-color:#ffffff08}.wl-project-group+.wl-project-group[data-v-5d93447b]{margin-top:6px}.wl-project-label[data-v-5d93447b]{align-items:center;padding-bottom:2px;font-size:11px;display:flex}.wl-item[data-v-5d93447b]{background-color:#224;margin-bottom:4px;transition:background-color .15s;position:relative}.wl-item[data-v-5d93447b]:last-child{margin-bottom:0}.wl-item[data-v-5d93447b]:hover{background-color:#2a2a4a}.wl-item--selected[data-v-5d93447b]{background-color:#2a2a4a;outline:1px solid #6c63ff66}.wl-item-action[data-v-5d93447b]{position:absolute;top:4px;right:4px}.wl-item--archived .wl-item-action[data-v-5d93447b]{opacity:0;transition:opacity .15s}.wl-item--archived:hover .wl-item-action[data-v-5d93447b]{opacity:1}.wl-item-unarchive[data-v-5d93447b]{right:28px}.wl-item-delete[data-v-5d93447b]{right:4px}.wl-item--archived[data-v-5d93447b]{opacity:.6;background-color:#1a1a30}.wl-item--archived[data-v-5d93447b]:hover{opacity:.85}.wl-item--archived.wl-item--selected[data-v-5d93447b]{opacity:1}.dd-dot[data-v-5d93447b]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.dd-dot--running[data-v-5d93447b]{background-color:#22c55e;box-shadow:0 0 4px #22c55e80}.bg-dark[data-v-a47eb368]{background-color:#16162a!important;border-color:#2a2a4a!important}.resize-handle[data-v-a47eb368]{cursor:col-resize;z-index:10;width:4px;height:100%;transition:background-color .15s;position:absolute;top:0;right:-2px}.resize-handle[data-v-a47eb368]:hover,.resize-handle[data-v-a47eb368]:active{background-color:#6c63ff80}.vertical-resize-handle[data-v-a47eb368]{cursor:row-resize;background-color:#2a2a4a;height:4px;transition:background-color .15s}.vertical-resize-handle[data-v-a47eb368]:hover,.vertical-resize-handle[data-v-a47eb368]:active{background-color:#6c63ff80}