@loicngr/kobo 1.7.32 → 1.8.0

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/CHANGELOG.md +14 -0
  2. package/dist/mcp-server/kobo-tasks-server.js +4 -0
  3. package/dist/server/routes/workspaces.js +11 -9
  4. package/dist/server/services/agent/engines/claude-code/engine.js +37 -4
  5. package/dist/server/services/agent/engines/claude-code/stop-hook.js +56 -0
  6. package/dist/server/services/cron-service.js +12 -6
  7. package/dist/server/services/wakeup-service.js +9 -0
  8. package/package.json +2 -2
  9. package/src/client/dist/spa/assets/{ActivityFeed-COdkQaiZ.js → ActivityFeed-Y1RkIPW1.js} +1 -1
  10. package/src/client/dist/spa/assets/{ChangelogPage-BXD8H3j-.js → ChangelogPage-DcPmypaS.js} +1 -1
  11. package/src/client/dist/spa/assets/{CreatePage-DX4TjLqr.js → CreatePage-DO_pMGS3.js} +1 -1
  12. package/src/client/dist/spa/assets/{DiffViewer-BUjVXGyZ.js → DiffViewer-DRvbmHwK.js} +3 -3
  13. package/src/client/dist/spa/assets/{HealthPage-DM7fvP4v.js → HealthPage-BvOR0B7B.js} +1 -1
  14. package/src/client/dist/spa/assets/{MainLayout-DtTxmFXf.css → MainLayout-KmjhECRT.css} +1 -1
  15. package/src/client/dist/spa/assets/MainLayout-M5TW3GL1.js +37 -0
  16. package/src/client/dist/spa/assets/{QSelect-DERXhq6x.js → QSelect-DgGpVy88.js} +1 -1
  17. package/src/client/dist/spa/assets/{SearchPage-OaTRqd2Q.js → SearchPage-Qc2SXUjf.js} +1 -1
  18. package/src/client/dist/spa/assets/{SettingsPage-BBk3MB8w.js → SettingsPage-G4xXwNwc.js} +1 -1
  19. package/src/client/dist/spa/assets/{WorkspacePage-k_qzLoLC.js → WorkspacePage-DeGm-XQp.js} +3 -3
  20. package/src/client/dist/spa/assets/{cssMode-CdNIff6x.js → cssMode-DfDzxSXu.js} +1 -1
  21. package/src/client/dist/spa/assets/{editor.api2-CEAFHkwY.js → editor.api2-Byu6kw7p.js} +1 -1
  22. package/src/client/dist/spa/assets/{editor.main-DuQa2C4S.js → editor.main-VujCgCtA.js} +2 -2
  23. package/src/client/dist/spa/assets/{engineFeatures-DChekJQO.js → engineFeatures-6A3KLQRO.js} +1 -1
  24. package/src/client/dist/spa/assets/{expand-template-BXNt_oWH.js → expand-template-CRHCd-I8.js} +1 -1
  25. package/src/client/dist/spa/assets/{freemarker2-DXz2Sr_a.js → freemarker2-Ce85qzU_.js} +1 -1
  26. package/src/client/dist/spa/assets/{handlebars-B6DHJ8jd.js → handlebars-BLTKFzzh.js} +1 -1
  27. package/src/client/dist/spa/assets/{html-_UvZHIUo.js → html-Brx-Keq8.js} +1 -1
  28. package/src/client/dist/spa/assets/{htmlMode-DZ0ixGc6.js → htmlMode-Cn-qtgzd.js} +1 -1
  29. package/src/client/dist/spa/assets/i18n-Cl6Gt8Eh.js +1 -0
  30. package/src/client/dist/spa/assets/{index-CNin8jPU.js → index-CyseQlfR.js} +6 -6
  31. package/src/client/dist/spa/assets/{javascript-C6Gf4Ys2.js → javascript-ywvG3uUF.js} +1 -1
  32. package/src/client/dist/spa/assets/{jsonMode-aE8EPidy.js → jsonMode-DjYQF9SH.js} +1 -1
  33. package/src/client/dist/spa/assets/{kobo-commands-Ip0ObeCE.js → kobo-commands-BSkMs22T.js} +1 -1
  34. package/src/client/dist/spa/assets/{liquid-CSp27lUC.js → liquid-CZjmNn4a.js} +1 -1
  35. package/src/client/dist/spa/assets/{lspLanguageFeatures-UxO-LpRp.js → lspLanguageFeatures-DJiFF8Wc.js} +1 -1
  36. package/src/client/dist/spa/assets/{mdx-BSCEgQSy.js → mdx-DPvLr_Xj.js} +1 -1
  37. package/src/client/dist/spa/assets/{monaco.contribution-DqqsS1kc.js → monaco.contribution-rZ1avSXN.js} +2 -2
  38. package/src/client/dist/spa/assets/{python-CA5lSk1U.js → python-agZmzvad.js} +1 -1
  39. package/src/client/dist/spa/assets/{razor-BznM4hXD.js → razor-D-6K3O2-.js} +1 -1
  40. package/src/client/dist/spa/assets/{render-chat-markdown-BJsZCnSw.js → render-chat-markdown-8LO2n7Of.js} +1 -1
  41. package/src/client/dist/spa/assets/{tsMode-NbGeOvoN.js → tsMode-BxYiDnB8.js} +1 -1
  42. package/src/client/dist/spa/assets/{typescript-kHDph5jb.js → typescript-Cv7_rzaO.js} +1 -1
  43. package/src/client/dist/spa/assets/{use-onboarding-C4tGLHsr.js → use-onboarding-Dy-3eSVP.js} +1 -1
  44. package/src/client/dist/spa/assets/{workers-DFjmWZva.js → workers-JYdpxrSy.js} +1 -1
  45. package/src/client/dist/spa/assets/{xml-BXzZhhmL.js → xml-CshFLvoE.js} +1 -1
  46. package/src/client/dist/spa/assets/{yaml-DQNlz7_W.js → yaml-DL8TzVD_.js} +1 -1
  47. package/src/client/dist/spa/index.html +1 -1
  48. package/src/mcp-server/kobo-tasks-server.ts +4 -0
  49. package/src/client/dist/spa/assets/MainLayout-CbUZOTwz.js +0 -37
  50. package/src/client/dist/spa/assets/i18n-DXMuiAyu.js +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@ All notable changes to Kōbō are documented here. The format is based on
4
4
  [Keep a Changelog](https://keepachangelog.com/). Each release is an `## <version>`
5
5
  section — the in-app "What's new" dialog reads this file.
6
6
 
7
+ ## 1.8.0
8
+
9
+ - feat(schedule): manual wakeup & cron management per workspace
10
+ - feat(agent): enforce wakeup at turn-end + keep background work alive
11
+ - feat(workspace): warn when viewing a non-latest session outside auto-loop
12
+
13
+ ## 1.7.34/35
14
+
15
+ - chore(npm): update claude sdk
16
+
17
+ ## 1.7.33
18
+
19
+ - chore(npm): update claude sdk
20
+
7
21
  ## 1.7.32
8
22
 
9
23
  - feat: CI recap card, compaction indicator, Claude Task tools, deps upgrade, npm audit fix
@@ -676,6 +676,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
676
676
  delaySeconds,
677
677
  prompt,
678
678
  reason,
679
+ // Pin the calling session so the wakeup resumes THIS conversation (keeps
680
+ // context). The route now defaults to 'fresh' for manual UI scheduling;
681
+ // the agent must opt into 'resume' explicitly.
682
+ mode: 'resume',
679
683
  });
680
684
  return ok(result);
681
685
  }
@@ -1124,8 +1124,9 @@ app.delete('/:id/quota-backoff', (c) => {
1124
1124
  return c.json({ error: message }, 500);
1125
1125
  }
1126
1126
  });
1127
- // POST /api/workspaces/:id/pending-wakeup — agent-initiated schedule via the
1128
- // `kobo__schedule_wakeup` MCP tool. Replaces any existing pending wakeup.
1127
+ // POST /api/workspaces/:id/pending-wakeup — schedule a wakeup, either from
1128
+ // the `kobo__schedule_wakeup` MCP tool (agent, mode='resume') or from the UI
1129
+ // (manual, mode='fresh', default). Replaces any existing pending wakeup.
1129
1130
  app.post('/:id/pending-wakeup', async (c) => {
1130
1131
  try {
1131
1132
  const id = c.req.param('id');
@@ -1133,6 +1134,7 @@ app.post('/:id/pending-wakeup', async (c) => {
1133
1134
  const delaySeconds = body.delaySeconds;
1134
1135
  const prompt = body.prompt;
1135
1136
  const reason = body.reason;
1137
+ const rawMode = typeof body.mode === 'string' ? body.mode : 'fresh';
1136
1138
  if (typeof delaySeconds !== 'number' || !Number.isFinite(delaySeconds) || delaySeconds <= 0) {
1137
1139
  return c.json({ error: 'delaySeconds must be a positive number' }, 400);
1138
1140
  }
@@ -1142,14 +1144,14 @@ app.post('/:id/pending-wakeup', async (c) => {
1142
1144
  if (reason !== undefined && typeof reason !== 'string') {
1143
1145
  return c.json({ error: 'reason must be a string when provided' }, 400);
1144
1146
  }
1145
- // Pin the wakeup to the session that scheduled it, so the resume targets
1146
- // that conversation instead of whichever session happens to be the latest
1147
- // at fire time. The MCP tool is invoked from inside an active session, so
1148
- // a missing controller signals misuse — reject explicitly.
1149
- const agentSessionId = agentManager.getActiveSessionId(id);
1150
- if (!agentSessionId) {
1151
- return c.json({ error: 'no active agent session for this workspace' }, 409);
1147
+ if (rawMode !== 'fresh' && rawMode !== 'resume') {
1148
+ return c.json({ error: "mode must be 'fresh' or 'resume'" }, 400);
1152
1149
  }
1150
+ // 'resume' pins the active session so the wakeup resumes that conversation;
1151
+ // 'fresh' (default) — or 'resume' with no active session — leaves it unpinned
1152
+ // so the wakeup fires a brand-new session running `prompt`. This is what makes
1153
+ // manual scheduling on an idle workspace possible (no more hard 409).
1154
+ const agentSessionId = rawMode === 'resume' ? (agentManager.getActiveSessionId(id) ?? undefined) : undefined;
1153
1155
  wakeupService.schedule(id, delaySeconds, prompt, reason, agentSessionId);
1154
1156
  const pending = wakeupService.getPending(id);
1155
1157
  return c.json({ ok: true, pending });
@@ -5,6 +5,7 @@ import { createMapperState, mapSdkMessage, QUOTA_PATTERN, tryEmitQuota } from '.
5
5
  import { buildClaudeOptions } from './options-builder.js';
6
6
  import { buildCompactionSessionStartOutput } from './precompact-hook.js';
7
7
  import { resolveClaudeBinaryPath } from './resolve-binary.js';
8
+ import { buildStopHookOutput } from './stop-hook.js';
8
9
  /**
9
10
  * Grace window between the SDK's terminal `result` message and the generator
10
11
  * reaching `done`. A healthy run closes within milliseconds; if the generator
@@ -89,6 +90,19 @@ export function createClaudeCodeEngine() {
89
90
  ],
90
91
  },
91
92
  ],
93
+ // Decision-point enforcement of the "schedule a wakeup or the session
94
+ // stalls" invariant: when the agent tries to end its turn with
95
+ // background work still in flight and nothing scheduled to resume the
96
+ // session, inject a reminder so it calls `kobo__schedule_wakeup` instead
97
+ // of going idle. A passive system-prompt rule isn't enough — see
98
+ // stop-hook.ts. `additionalContext` continues the turn so the model acts.
99
+ Stop: [
100
+ {
101
+ hooks: [
102
+ async (input) => buildStopHookOutput(options.workspaceId, input),
103
+ ],
104
+ },
105
+ ],
92
106
  };
93
107
  const { options: sdkOptions, effectivePrompt } = buildClaudeOptions({
94
108
  prompt: options.prompt,
@@ -167,10 +181,29 @@ export function createClaudeCodeEngine() {
167
181
  console.warn(`[claude-engine] SDK generator still open ${RESULT_DRAIN_TIMEOUT_MS}ms after 'result' — forcing session:ended`);
168
182
  const reason = userInterrupted ? 'killed' : mapperState.sawErrorResult ? 'error' : 'completed';
169
183
  emitSessionEnded(reason, reason === 'completed' ? 0 : null);
170
- // Best-effort: unstick the SDK so its subprocesses / MCP children
171
- // tear down. The session is reported ended regardless of whether
172
- // the abort actually propagates through the parked generator.
173
- abortController.abort();
184
+ // Normally we abort here to unstick the SDK so its subprocesses / MCP
185
+ // children tear down. BUT if a wakeup is scheduled for this workspace,
186
+ // the agent intentionally left background work running for the wakeup
187
+ // to resume and check — aborting would kill that work. Skip the abort
188
+ // in that case so the background tasks survive. `session:ended` was
189
+ // already emitted (so the orchestrator/auto-loop proceed and the
190
+ // controller is removed, letting the wakeup fire later); the parked
191
+ // generator drains on its own once the background work finishes.
192
+ //
193
+ // The wakeup check is a dynamic import: a static `import` of
194
+ // wakeup-service here would form an engine → wakeup-service →
195
+ // orchestrator → engine cycle that breaks module init under the test
196
+ // SSR transform. Resolving it at call-time (once, 15s after result)
197
+ // sidesteps the cycle with no hot-path cost.
198
+ void (async () => {
199
+ const { isWakeupScheduled } = await import('../../../wakeup-service.js');
200
+ if (isWakeupScheduled(options.workspaceId)) {
201
+ console.warn(`[claude-engine] generator still open ${RESULT_DRAIN_TIMEOUT_MS}ms after 'result' but a wakeup is scheduled for ${options.workspaceId} — leaving background work alive (no abort)`);
202
+ }
203
+ else {
204
+ abortController.abort();
205
+ }
206
+ })();
174
207
  }, RESULT_DRAIN_TIMEOUT_MS);
175
208
  resultDrainTimer.unref?.();
176
209
  };
@@ -0,0 +1,56 @@
1
+ import { isWakeupScheduled } from '../../../wakeup-service.js';
2
+ /**
3
+ * Decide whether to nudge the agent to schedule a wakeup before it ends its
4
+ * turn. The agent should be reminded ONLY when it leaves background work
5
+ * in-flight with nothing scheduled to resume the session — otherwise the Kōbō
6
+ * session goes idle and the work stalls.
7
+ *
8
+ * Returns false (clean stop, no nudge) when:
9
+ * - the stop hook is already active (anti-loop — we nudged on the prior stop);
10
+ * - there is no in-flight background work (a genuine end of turn);
11
+ * - an SDK-level cron/wakeup is scheduled (`session_crons`); or
12
+ * - a Kōbō-level wakeup is scheduled (`pending_wakeups`).
13
+ */
14
+ export function shouldNudgeWakeup(input) {
15
+ if (input.stopHookActive)
16
+ return false;
17
+ if (input.backgroundTaskCount <= 0)
18
+ return false;
19
+ if (input.sdkScheduledWakeupCount > 0)
20
+ return false;
21
+ if (input.koboWakeupScheduled)
22
+ return false;
23
+ return true;
24
+ }
25
+ /** The decision-point reminder injected when {@link shouldNudgeWakeup} is true. */
26
+ export function buildNudgeText(backgroundTaskCount) {
27
+ return [
28
+ `⚠️ [Kōbō] You are about to end your turn with ${backgroundTaskCount} background task(s) still running, but NO wakeup is scheduled.`,
29
+ 'This Kōbō session will go idle and will NOT resume itself — the background work will stall and never be checked.',
30
+ '',
31
+ 'Before ending your turn, do ONE of:',
32
+ '• If you need that work to finish: call `kobo__schedule_wakeup` now with `delaySeconds` ≈ the expected remaining duration and a `prompt` telling future-you exactly what to check (log path + next step). Then end the turn.',
33
+ '• If the background work is no longer needed: stop it (kill the process), then end the turn.',
34
+ '',
35
+ 'Do not end the turn passively waiting — nothing will wake the session.',
36
+ ].join('\n');
37
+ }
38
+ /**
39
+ * Build the Stop hook output for a workspace: cross-checks the SDK signals with
40
+ * Kōbō's own `pending_wakeups` table (since `kobo__schedule_wakeup` is an MCP
41
+ * tool that never appears in the SDK's `session_crons`) and returns the wakeup
42
+ * nudge only when the agent is genuinely about to stall.
43
+ */
44
+ export function buildStopHookOutput(workspaceId, input) {
45
+ const backgroundTaskCount = input.background_tasks?.length ?? 0;
46
+ const koboWakeupScheduled = isWakeupScheduled(workspaceId);
47
+ const nudge = shouldNudgeWakeup({
48
+ stopHookActive: input.stop_hook_active ?? false,
49
+ backgroundTaskCount,
50
+ sdkScheduledWakeupCount: input.session_crons?.length ?? 0,
51
+ koboWakeupScheduled,
52
+ });
53
+ if (!nudge)
54
+ return {};
55
+ return { hookSpecificOutput: { hookEventName: 'Stop', additionalContext: buildNudgeText(backgroundTaskCount) } };
56
+ }
@@ -72,15 +72,21 @@ function nextAfter(expression, from) {
72
72
  }
73
73
  /**
74
74
  * Validate the expression, persist the row, arm a setTimeout for the next
75
- * fire, emit `cron:created`. Throws on invalid expression OR when the next
76
- * fire is < MIN_DELAY_BETWEEN_FIRES_SECONDS seconds in the future.
75
+ * fire, emit `cron:created`. Throws on an invalid expression. If the first
76
+ * occurrence falls within MIN_DELAY_BETWEEN_FIRES_SECONDS of now, that imminent
77
+ * fire is SKIPPED (scheduled to the following occurrence) rather than rejected
78
+ * — so a valid recurring cron created near a boundary (e.g. a 15-min cron made
79
+ * 30s before the tick, or a daily cron made shortly before its time) still
80
+ * arms, and never fires within a minute of creation.
77
81
  */
78
82
  export function arm(workspaceId, args) {
79
83
  const now = new Date();
80
- const next = nextAfter(args.expression, now);
81
- const deltaMs = next.getTime() - now.getTime();
82
- if (deltaMs < MIN_DELAY_BETWEEN_FIRES_SECONDS * 1000) {
83
- throw new Error(`Cron expression resolves too close to now (minimum ${MIN_DELAY_BETWEEN_FIRES_SECONDS}s); use a longer interval`);
84
+ let next = nextAfter(args.expression, now);
85
+ if (next.getTime() - now.getTime() < MIN_DELAY_BETWEEN_FIRES_SECONDS * 1000) {
86
+ // Skip the imminent occurrence. The one after is guaranteed ≥60s out for
87
+ // any standard 5-field cron (min granularity is 1 minute), so a single skip
88
+ // always suffices.
89
+ next = nextAfter(args.expression, next);
84
90
  }
85
91
  const id = nanoid();
86
92
  const db = getDb();
@@ -71,6 +71,15 @@ export function getPending(workspaceId) {
71
71
  return null;
72
72
  }
73
73
  }
74
+ /**
75
+ * Whether a wakeup is currently scheduled for the workspace. Used to decide
76
+ * that background work the agent left running is intentional (the wakeup will
77
+ * resume the session to check it) and must NOT be torn down — e.g. the engine's
78
+ * result-drain watchdog skips its abort when this is true.
79
+ */
80
+ export function isWakeupScheduled(workspaceId) {
81
+ return getPending(workspaceId) !== null;
82
+ }
74
83
  /** Re-register timers for rows persisted across restart. Skips stale entries. */
75
84
  export function rehydrate() {
76
85
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.7.32",
3
+ "version": "1.8.0",
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",
@@ -67,7 +67,7 @@
67
67
  "prepublishOnly": "npm run build"
68
68
  },
69
69
  "dependencies": {
70
- "@anthropic-ai/claude-agent-sdk": "^0.3.173",
70
+ "@anthropic-ai/claude-agent-sdk": "^0.3.175",
71
71
  "@emnapi/core": "^1.11.0",
72
72
  "@emnapi/runtime": "^1.11.0",
73
73
  "@hono/node-server": "^2.0.4",
@@ -1,4 +1,4 @@
1
- import{$ as e,B as t,F as n,I as r,R as i,S as a,U as o,W as s,_ as c,at as l,b as u,c as d,ct as f,g as p,h as m,it as h,k as g,m as _,n as v,p as y,s as b,st as x,y as S}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{l as C,t as w}from"./QIcon-C6C3QeM4.js";import{c as T,s as E}from"./notifications-C4MxuXC7.js";import{t as D}from"./QBtn-DwemGTZv.js";import{n as O}from"./vue-i18n-C5Tx4bGk.js";import{_ as k,c as A,m as j,u as ee}from"./index-CNin8jPU.js";import{t as te}from"./QSpinnerDots-atHe_AUn.js";import{t as M}from"./QTooltip-CyRLTG6i.js";import{t as ne}from"./QExpansionItem-C9vmJqEO.js";import{t as re}from"./QScrollArea-B5jf9S4y.js";import{i as ie,n as ae,t as N}from"./render-chat-markdown-BJsZCnSw.js";import{t as P}from"./documents-N8PwB_Gh.js";import{t as F}from"./_plugin-vue_export-helper-BzmG9fMN.js";function oe(e,t,n=!0){let r=[],i=new Map,a=new Map;for(let n=0;n<e.length;n++){let o=e[n],s=t?.[n];switch(o.kind){case`message:text`:{let e=i.get(o.messageId);if(e)e.text+=o.text,e.streaming=o.streaming;else{let e={type:`text`,messageId:o.messageId,text:o.text,streaming:o.streaming,ts:s};i.set(o.messageId,e),r.push(e)}break}case`message:end`:{let e=i.get(o.messageId);e&&(e.streaming=!1);break}case`message:thinking`:r.push({type:`thinking`,messageId:o.messageId,text:o.text,ts:s});break;case`tool:call`:{let e={type:`tool`,toolCallId:o.toolCallId,name:o.name,input:o.input,ts:s};a.set(o.toolCallId,e),r.push(e);break}case`tool:result`:{let e=a.get(o.toolCallId);e&&(e.result={output:o.output,isError:o.isError});break}case`session:started`:r.push({type:`session`,kind:`started`,detail:{engineSessionId:o.engineSessionId,model:o.model},ts:s});break;case`session:ended`:r.push({type:`session`,kind:`ended`,detail:{reason:o.reason,exitCode:o.exitCode},ts:s});break;case`session:compacted`:r.push({type:`session`,kind:`compacted`,ts:s});break;case`session:compacting`:case`session:brainstorm-complete`:case`session:user-input-requested`:case`message:raw`:case`skills:discovered`:case`usage`:case`rate_limit`:case`subagent:progress`:case`error`:break;default:}}let o=null;for(let e of r)e.type===`text`&&e.streaming&&(o&&(o.streaming=!1),o=e);return o&&!n&&(o.streaming=!1),r}function se(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts})),r=[...e,...n];r.sort((e,t)=>{let n=e.ts??``,r=t.ts??``;return n===r?0:n?r?n<r?-1:1:-1:1});let i;for(let e of r)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!i||e.ts>i)&&(i=e.ts);if(i)for(let e of r)e.type===`text`&&e.streaming&&(!e.ts||e.ts<i)&&(e.streaming=!1);return r}var I=new Set([`setup`,`cleanup`,`archive`]);function L(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:I.has(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function ce(e){let t=[],n=null,r=null;for(let i of e){let e=L(i),a=e===`session`||e===`system-prompt`,o=e===`script`&&i.type===`user`?`script:${i.sender}`:e;!n||r!==o||a?(n={speaker:e,ts:i.ts,items:[i]},r=o,t.push(n),a&&(n=null)):n.items.push(i)}return t}var R={class:`text-caption text-grey-6`},z=a({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,n=y(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(i(),c(`span`,R,f(e.$t(n.value)),1))}});function le(e,t){if(t.length===0||e.length===0)return e;let n=[...t].sort((e,t)=>t.length-e.length),r=new DOMParser().parseFromString(`<div>${e}</div>`,`text/html`),i=r.body.firstChild;if(!i)return e;function a(e){if(e.nodeType===Node.TEXT_NODE){ue(e,n,r);return}if(e.nodeName===`A`)return;let t=Array.from(e.childNodes);for(let e of t)a(e)}return a(i),i.innerHTML}function ue(e,t,n){let r=e.textContent??``;if(!t.some(e=>r.includes(e)))return;let i=n.createDocumentFragment(),a=0;for(;a<r.length;){let e=B(r,a,t);if(!e){i.appendChild(n.createTextNode(r.slice(a)));break}e.index>a&&i.appendChild(n.createTextNode(r.slice(a,e.index)));let o=n.createElement(`a`);o.className=`document-link`,o.setAttribute(`data-document-path`,e.path),o.setAttribute(`href`,`#`),o.textContent=e.path,i.appendChild(o),a=e.index+e.path.length}e.parentNode?.replaceChild(i,e)}function B(e,t,n){let r=null;for(let i of n){let n=e.indexOf(i,t);n<0||(!r||n<r.index||n===r.index&&i.length>r.path.length)&&(r={index:n,path:i})}return r}var V=[`innerHTML`],H=F(a({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,n=P(),r=A(),a=y(()=>{let e=r.selectedWorkspaceId;return e?n.documentsFor(e).map(e=>e.path):[]}),o=y(()=>ae(le(ie.parse(t.item.text,{async:!1,breaks:!0,gfm:!0}),a.value),{addAttr:[`data-document-path`]}));function s(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let i=t.getAttribute(`data-document-path`),a=r.selectedWorkspaceId;!i||!a||n.openDocumentByPath(a,i)}return(t,n)=>(i(),c(`div`,{class:`markdown-message`,onClick:s},[_(`div`,{innerHTML:o.value},null,8,V),e.item.streaming?(i(),m(C,{key:0,size:`xs`,class:`q-ml-xs`})):p(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]),de={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},U=[`innerHTML`],W={key:1,style:{"white-space":`pre-wrap`}},G=F(a({__name:`ThinkingItem`,props:{item:{}},setup(e){let t=e,n=y(()=>t.item.text.trim().slice(0,100)),r=y(()=>t.item.text.trim().length>0),a=y(()=>t.item.text.trim().length>100),o=y(()=>N(t.item.text));return(t,l)=>r.value?(i(),c(`div`,de,[a.value?(i(),m(ne,{key:0,dense:``,"dense-toggle":``,label:n.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:s(()=>[_(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:o.value},null,8,U)]),_:1},8,[`label`])):(i(),c(`span`,W,f(e.item.text),1))])):p(``,!0)}}),[[`__scopeId`,`data-v-7f45ed94`]]);function K(e,t){let n=e.split(`
1
+ import{$ as e,B as t,F as n,I as r,R as i,S as a,U as o,W as s,_ as c,at as l,b as u,c as d,ct as f,g as p,h as m,it as h,k as g,m as _,n as v,p as y,s as b,st as x,y as S}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{l as C,t as w}from"./QIcon-C6C3QeM4.js";import{c as T,s as E}from"./notifications-C4MxuXC7.js";import{t as D}from"./QBtn-DwemGTZv.js";import{n as O}from"./vue-i18n-C5Tx4bGk.js";import{_ as k,c as A,m as j,u as ee}from"./index-CyseQlfR.js";import{t as te}from"./QSpinnerDots-atHe_AUn.js";import{t as M}from"./QTooltip-CyRLTG6i.js";import{t as ne}from"./QExpansionItem-C9vmJqEO.js";import{t as re}from"./QScrollArea-B5jf9S4y.js";import{i as ie,n as ae,t as N}from"./render-chat-markdown-8LO2n7Of.js";import{t as P}from"./documents-N8PwB_Gh.js";import{t as F}from"./_plugin-vue_export-helper-BzmG9fMN.js";function oe(e,t,n=!0){let r=[],i=new Map,a=new Map;for(let n=0;n<e.length;n++){let o=e[n],s=t?.[n];switch(o.kind){case`message:text`:{let e=i.get(o.messageId);if(e)e.text+=o.text,e.streaming=o.streaming;else{let e={type:`text`,messageId:o.messageId,text:o.text,streaming:o.streaming,ts:s};i.set(o.messageId,e),r.push(e)}break}case`message:end`:{let e=i.get(o.messageId);e&&(e.streaming=!1);break}case`message:thinking`:r.push({type:`thinking`,messageId:o.messageId,text:o.text,ts:s});break;case`tool:call`:{let e={type:`tool`,toolCallId:o.toolCallId,name:o.name,input:o.input,ts:s};a.set(o.toolCallId,e),r.push(e);break}case`tool:result`:{let e=a.get(o.toolCallId);e&&(e.result={output:o.output,isError:o.isError});break}case`session:started`:r.push({type:`session`,kind:`started`,detail:{engineSessionId:o.engineSessionId,model:o.model},ts:s});break;case`session:ended`:r.push({type:`session`,kind:`ended`,detail:{reason:o.reason,exitCode:o.exitCode},ts:s});break;case`session:compacted`:r.push({type:`session`,kind:`compacted`,ts:s});break;case`session:compacting`:case`session:brainstorm-complete`:case`session:user-input-requested`:case`message:raw`:case`skills:discovered`:case`usage`:case`rate_limit`:case`subagent:progress`:case`error`:break;default:}}let o=null;for(let e of r)e.type===`text`&&e.streaming&&(o&&(o.streaming=!1),o=e);return o&&!n&&(o.streaming=!1),r}function se(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts})),r=[...e,...n];r.sort((e,t)=>{let n=e.ts??``,r=t.ts??``;return n===r?0:n?r?n<r?-1:1:-1:1});let i;for(let e of r)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!i||e.ts>i)&&(i=e.ts);if(i)for(let e of r)e.type===`text`&&e.streaming&&(!e.ts||e.ts<i)&&(e.streaming=!1);return r}var I=new Set([`setup`,`cleanup`,`archive`]);function L(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:I.has(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function ce(e){let t=[],n=null,r=null;for(let i of e){let e=L(i),a=e===`session`||e===`system-prompt`,o=e===`script`&&i.type===`user`?`script:${i.sender}`:e;!n||r!==o||a?(n={speaker:e,ts:i.ts,items:[i]},r=o,t.push(n),a&&(n=null)):n.items.push(i)}return t}var R={class:`text-caption text-grey-6`},z=a({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,n=y(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(i(),c(`span`,R,f(e.$t(n.value)),1))}});function le(e,t){if(t.length===0||e.length===0)return e;let n=[...t].sort((e,t)=>t.length-e.length),r=new DOMParser().parseFromString(`<div>${e}</div>`,`text/html`),i=r.body.firstChild;if(!i)return e;function a(e){if(e.nodeType===Node.TEXT_NODE){ue(e,n,r);return}if(e.nodeName===`A`)return;let t=Array.from(e.childNodes);for(let e of t)a(e)}return a(i),i.innerHTML}function ue(e,t,n){let r=e.textContent??``;if(!t.some(e=>r.includes(e)))return;let i=n.createDocumentFragment(),a=0;for(;a<r.length;){let e=B(r,a,t);if(!e){i.appendChild(n.createTextNode(r.slice(a)));break}e.index>a&&i.appendChild(n.createTextNode(r.slice(a,e.index)));let o=n.createElement(`a`);o.className=`document-link`,o.setAttribute(`data-document-path`,e.path),o.setAttribute(`href`,`#`),o.textContent=e.path,i.appendChild(o),a=e.index+e.path.length}e.parentNode?.replaceChild(i,e)}function B(e,t,n){let r=null;for(let i of n){let n=e.indexOf(i,t);n<0||(!r||n<r.index||n===r.index&&i.length>r.path.length)&&(r={index:n,path:i})}return r}var V=[`innerHTML`],H=F(a({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,n=P(),r=A(),a=y(()=>{let e=r.selectedWorkspaceId;return e?n.documentsFor(e).map(e=>e.path):[]}),o=y(()=>ae(le(ie.parse(t.item.text,{async:!1,breaks:!0,gfm:!0}),a.value),{addAttr:[`data-document-path`]}));function s(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let i=t.getAttribute(`data-document-path`),a=r.selectedWorkspaceId;!i||!a||n.openDocumentByPath(a,i)}return(t,n)=>(i(),c(`div`,{class:`markdown-message`,onClick:s},[_(`div`,{innerHTML:o.value},null,8,V),e.item.streaming?(i(),m(C,{key:0,size:`xs`,class:`q-ml-xs`})):p(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]),de={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},U=[`innerHTML`],W={key:1,style:{"white-space":`pre-wrap`}},G=F(a({__name:`ThinkingItem`,props:{item:{}},setup(e){let t=e,n=y(()=>t.item.text.trim().slice(0,100)),r=y(()=>t.item.text.trim().length>0),a=y(()=>t.item.text.trim().length>100),o=y(()=>N(t.item.text));return(t,l)=>r.value?(i(),c(`div`,de,[a.value?(i(),m(ne,{key:0,dense:``,"dense-toggle":``,label:n.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:s(()=>[_(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:o.value},null,8,U)]),_:1},8,[`label`])):(i(),c(`span`,W,f(e.item.text),1))])):p(``,!0)}}),[[`__scopeId`,`data-v-7f45ed94`]]);function K(e,t){let n=e.split(`
2
2
  `),r=t.split(`
3
3
  `),i=n.length,a=r.length,o=Array.from({length:i+1},()=>Array(a+1).fill(0));for(let e=i-1;e>=0;e--)for(let t=a-1;t>=0;t--)n[e]===r[t]?o[e][t]=o[e+1][t+1]+1:o[e][t]=Math.max(o[e+1][t],o[e][t+1]);let s=[],c=0,l=0;for(;c<i&&l<a;)n[c]===r[l]?(s.push({type:`context`,content:n[c]}),c++,l++):o[c+1][l]>=o[c][l+1]?(s.push({type:`del`,content:n[c]}),c++):(s.push({type:`add`,content:r[l]}),l++);for(;c<i;)s.push({type:`del`,content:n[c++]});for(;l<a;)s.push({type:`add`,content:r[l++]});return s}function fe(e){let t=e.split(`
4
4
  `),n=[];for(let e of t)e.startsWith(`@@`)||e.startsWith(`+++`)||e.startsWith(`---`)||(e.startsWith(`+`)?n.push({type:`add`,content:e.slice(1)}):e.startsWith(`-`)?n.push({type:`del`,content:e.slice(1)}):e.startsWith(` `)?n.push({type:`context`,content:e.slice(1)}):e.length>0&&n.push({type:`context`,content:e}));return n}function pe(e,t){if(!t||typeof t!=`object`)return null;let n=t;if(e===`Edit`){let e=n.file_path;if(!e)return null;let t=n.old_string??``,r=n.new_string??``,i=typeof n.diff==`string`?n.diff:``;if(!t&&!r&&i.length>0){let t=fe(i);return{toolName:`Edit`,filePath:e,additions:t.filter(e=>e.type===`add`).length,deletions:t.filter(e=>e.type===`del`).length,diffLines:t}}return{toolName:`Edit`,filePath:e,oldString:t,newString:r,replaceAll:n.replace_all??!1,additions:r?r.split(`
@@ -1 +1 @@
1
- import{$ as e,B as t,F as n,R as r,S as i,W as a,_ as o,b as s,c,ct as l,g as u,h as d,it as f,m as p}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{t as m}from"./QBtn-DwemGTZv.js";import{b as h,i as g,x as _}from"./index-CNin8jPU.js";import{t as v}from"./render-chat-markdown-BJsZCnSw.js";import{t as y}from"./_plugin-vue_export-helper-BzmG9fMN.js";import{t as b}from"./QSpace-CrVsndpV.js";import{t as x}from"./QChip-BpS8c1sW.js";import{t as S}from"./QPage-C6xc9fOe.js";var C={class:`row items-center q-mb-md`},w={class:`text-h6 q-ml-sm`},T={key:0,class:`text-grey-6 text-center q-pa-lg`},E={key:1,class:`text-negative text-center q-pa-lg`},D={key:2,class:`text-grey-6 text-center q-pa-lg`},O={key:3,class:`column q-gutter-md`},k={key:0,class:`text-caption text-grey-6`},A={class:`row items-center q-mb-sm`},j={class:`text-subtitle1 text-indigo-3`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},M=[`innerHTML`],N=y(i({__name:`ChangelogPage`,setup(i){let y=g(),N=e([]),P=e(``),F=e(!1),I=e(null);function L(e){return v(e)}async function R(){F.value=!0,I.value=null;try{let e=await fetch(`/api/changelog`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();P.value=t.currentVersion??``,N.value=t.versions??[]}catch(e){I.value=e instanceof Error?e.message:String(e)}finally{F.value=!1}}return n(R),(e,n)=>(r(),d(S,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:a(()=>[p(`div`,C,[s(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:n[0]||=e=>f(y).back()}),p(`div`,w,l(e.$t(`changelog.title`)),1),s(b),s(m,{flat:``,dense:``,icon:`refresh`,loading:F.value,label:e.$t(`common.refresh`),onClick:R},null,8,[`loading`,`label`])]),F.value&&N.value.length===0?(r(),o(`div`,T,l(e.$t(`common.loading`)),1)):I.value?(r(),o(`div`,E,l(I.value),1)):N.value.length===0?(r(),o(`div`,D,l(e.$t(`changelog.empty`)),1)):(r(),o(`div`,O,[P.value?(r(),o(`div`,k,l(e.$t(`changelog.currentVersion`,{version:P.value})),1)):u(``,!0),(r(!0),o(c,null,t(N.value,t=>(r(),d(h,{key:t.version,dark:``,flat:``,bordered:``},{default:a(()=>[s(_,null,{default:a(()=>[p(`div`,A,[p(`div`,j,` v`+l(t.version),1),t.version===P.value?(r(),d(x,{key:0,dense:``,size:`sm`,color:`indigo-7`,"text-color":`grey-2`,label:e.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):u(``,!0)]),p(`div`,{class:`changelog-notes`,innerHTML:L(t.notes)},null,8,M)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-ed73d661`]]);export{N as default};
1
+ import{$ as e,B as t,F as n,R as r,S as i,W as a,_ as o,b as s,c,ct as l,g as u,h as d,it as f,m as p}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{t as m}from"./QBtn-DwemGTZv.js";import{b as h,i as g,x as _}from"./index-CyseQlfR.js";import{t as v}from"./render-chat-markdown-8LO2n7Of.js";import{t as y}from"./_plugin-vue_export-helper-BzmG9fMN.js";import{t as b}from"./QSpace-CrVsndpV.js";import{t as x}from"./QChip-BpS8c1sW.js";import{t as S}from"./QPage-C6xc9fOe.js";var C={class:`row items-center q-mb-md`},w={class:`text-h6 q-ml-sm`},T={key:0,class:`text-grey-6 text-center q-pa-lg`},E={key:1,class:`text-negative text-center q-pa-lg`},D={key:2,class:`text-grey-6 text-center q-pa-lg`},O={key:3,class:`column q-gutter-md`},k={key:0,class:`text-caption text-grey-6`},A={class:`row items-center q-mb-sm`},j={class:`text-subtitle1 text-indigo-3`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},M=[`innerHTML`],N=y(i({__name:`ChangelogPage`,setup(i){let y=g(),N=e([]),P=e(``),F=e(!1),I=e(null);function L(e){return v(e)}async function R(){F.value=!0,I.value=null;try{let e=await fetch(`/api/changelog`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();P.value=t.currentVersion??``,N.value=t.versions??[]}catch(e){I.value=e instanceof Error?e.message:String(e)}finally{F.value=!1}}return n(R),(e,n)=>(r(),d(S,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:a(()=>[p(`div`,C,[s(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:n[0]||=e=>f(y).back()}),p(`div`,w,l(e.$t(`changelog.title`)),1),s(b),s(m,{flat:``,dense:``,icon:`refresh`,loading:F.value,label:e.$t(`common.refresh`),onClick:R},null,8,[`loading`,`label`])]),F.value&&N.value.length===0?(r(),o(`div`,T,l(e.$t(`common.loading`)),1)):I.value?(r(),o(`div`,E,l(I.value),1)):N.value.length===0?(r(),o(`div`,D,l(e.$t(`changelog.empty`)),1)):(r(),o(`div`,O,[P.value?(r(),o(`div`,k,l(e.$t(`changelog.currentVersion`,{version:P.value})),1)):u(``,!0),(r(!0),o(c,null,t(N.value,t=>(r(),d(h,{key:t.version,dark:``,flat:``,bordered:``},{default:a(()=>[s(_,null,{default:a(()=>[p(`div`,A,[p(`div`,j,` v`+l(t.version),1),t.version===P.value?(r(),d(x,{key:0,dense:``,size:`sm`,color:`indigo-7`,"text-color":`grey-2`,label:e.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):u(``,!0)]),p(`div`,{class:`changelog-notes`,innerHTML:L(t.notes)},null,8,M)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-ed73d661`]]);export{N as default};
@@ -1,2 +1,2 @@
1
- import{$ as e,B as t,F as n,I as r,O as i,R as a,S as ee,U as te,W as o,_ as s,at as ne,b as c,c as re,ct as l,g as u,h as d,it as f,k as ie,m as p,n as ae,o as oe,ot as se,p as m,s as h,w as ce,y as g}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{t as _}from"./QIcon-C6C3QeM4.js";import{r as v}from"./use-id-By86THzm.js";import{s as le}from"./notifications-C4MxuXC7.js";import{t as y}from"./QBtn-DwemGTZv.js";import{n as ue}from"./vue-i18n-C5Tx4bGk.js";import{t as b}from"./QInput-CLZtb8E0.js";import{c as de,g as fe,i as pe,o as me}from"./index-CNin8jPU.js";import{t as he}from"./QSpinnerDots-atHe_AUn.js";import{n as x,t as S}from"./QItemSection-O9WBXftL.js";import{t as C}from"./QItemLabel-BYSjzk-t.js";import{t as w}from"./QTooltip-CyRLTG6i.js";import{t as ge}from"./QExpansionItem-C9vmJqEO.js";import{t as _e}from"./_plugin-vue_export-helper-BzmG9fMN.js";import{t as ve}from"./QSpace-CrVsndpV.js";import{t as ye}from"./use-quasar-DcJRs0ay.js";import{t as T}from"./QSelect-DERXhq6x.js";import{t as be}from"./QPage-C6xc9fOe.js";import{a as xe,i as Se,n as Ce,r as we,t as Te}from"./expand-template-BXNt_oWH.js";import{i as Ee,r as De,t as Oe}from"./permissionModes-CJN6Olox.js";var ke=`kobo:create-page-prefs`;function E(){try{let e=localStorage.getItem(ke);return e===null?void 0:JSON.parse(e)}catch{return}}function Ae(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function je(){let e=E();if(!Ae(e))return{};let t={};return typeof e.projectPath==`string`&&e.projectPath.length>0&&(t.projectPath=e.projectPath),typeof e.autoLoop==`boolean`&&(t.autoLoop=e.autoLoop),t}function Me(e){try{localStorage.setItem(ke,JSON.stringify(e))}catch{}}var Ne={class:`create-inner`},Pe={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Fe={class:`create-card rounded-borders`},Ie={class:`card-top-bar row items-center q-px-md q-py-xs`},Le={class:`model-badge cursor-default row items-center q-gutter-xs`},Re={class:`text-indigo-3 text-weight-medium text-caption`},ze={key:0,class:`notion-url-wrap`},Be={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ve={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},He={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ue={class:`text-caption text-grey-4 q-mb-sm`},We={class:`row q-gutter-sm`},Ge={class:`peek-card-text`},Ke={class:`peek-card-title`},qe={class:`peek-card-desc`},Je={class:`peek-card-text`},Ye={class:`peek-card-title`},Xe={class:`peek-card-desc`},Ze={key:0,class:`sentry-url-wrap`},Qe={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},$e={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},et={class:`card-name-wrap`},tt={class:`card-textarea-wrap`},nt={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},rt={key:0,class:`row items-center text-caption text-amber-6`},it={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},at={class:`q-pa-sm manual-section-body`},ot={class:`row items-center q-gutter-sm q-mb-sm`},st={class:`col text-caption text-grey-4`},ct={class:`q-pa-sm manual-section-body`},lt={class:`row items-center q-gutter-sm q-mb-sm`},ut={class:`col text-caption text-grey-4`},dt={class:`card-bottom-bar`},ft={class:`row q-col-gutter-xs q-px-xs`},pt={key:0,class:`col-12 col-sm-6 col-md-3`},mt={class:`bottom-select-label row items-center no-wrap`},ht={class:`col-12 col-sm-6 col-md-3`},gt={class:`bottom-select-label row items-center no-wrap`},_t={class:`col-12 col-sm-6 col-md-3`},vt={class:`bottom-select-label row items-center no-wrap`},yt={class:`col-12 col-md-3`},bt={class:`bottom-select-label row items-center no-wrap`},xt={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},St={class:`col-12 col-md-auto`},Ct={class:`col-12 col-md-auto`},wt={class:`col-12 col-md-auto`},Tt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Et={class:`col-12 col-md-4`},Dt={key:0,class:`col-12 col-md-4`},Ot={class:`bottom-select-label row items-center no-wrap`},kt={key:1,class:`col-12 col-md-4`},At={class:`bottom-select-label row items-center no-wrap`},jt={class:`col-12 col-md-4`},Mt={class:`bottom-select-label row items-center no-wrap`},Nt={class:`row justify-center q-px-sm q-py-sm`},Pt={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Ft=6e4,D=_e(ee({__name:`CreatePage`,setup(ee){function _e(e){return e.disabled===!0}let ke=pe(),E=ye(),Ae=de(),D=le(),{t:O}=ue(),It=e([]),Lt=e(``),k=e(``),Rt=e(null),zt=e(``),A=e(!1),j=e(!1),Bt=e(null),Vt=e(null),Ht=e([]),Ut=e(null),M=e(``),N=e(!1),P=e(`claude-opus-4-8`),F=e(`auto`),I=e(``),L=e(null),R=e(`feature`),z=e(!1),Wt=m(()=>D.global.voiceEnabled),Gt=e([]),B=e(`claude-code`),Kt=m(()=>Gt.value.find(e=>e.id===B.value)),qt=m(()=>Gt.value.map(e=>({value:e.id,label:e.displayName}))),Jt=m(()=>D.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),Yt=[`plan`,`bypass`,`strict`,`interactive`];function Xt(e,t){let n=e?D.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Yt.includes(r))return r;let i=D.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Yt.includes(i)?i:n?.dangerouslySkipPermissions??D.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let V=e(Xt(``,B.value)),Zt=m(()=>{switch(V.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),Qt=m(()=>(Oe[B.value]??Yt).map(e=>({value:e,label:O(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),H=e([]),$t=e([]),en=e(!1),tn=e(!1);function nn(e,t){t(()=>{$t.value=e?H.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):H.value})}let rn=fe();function an(){return Rt.value?.nativeEl??null}let{showSkills:on,selectedSkillIndex:U,groupedDropdown:sn,flatDropdown:W,fetchSkills:cn,detectSlashFragment:ln,replaceFragmentWith:un,closeDropdown:dn}=Se(k,an,{excludeKoboCommands:!0});cn(),te(k,async()=>{await ie(),await ln()});function fn(e){if(e.type===`template`){let t=rn.templates.find(t=>t.slug===e.name);if(!t)return;un(Ce(t.content,Te({workspace:null,gitStats:null,sessionName:null}))),dn();return}un(`/${e.name} `),dn()}function pn(e){!on.value||W.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),U.value=(U.value+1)%W.value.length):e.key===`ArrowUp`?(e.preventDefault(),U.value=(U.value-1+W.value.length)%W.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),fn(W.value[U.value])):e.key===`Escape`&&(e.preventDefault(),dn()))}async function mn(){if(!(!Wt.value||A.value||j.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){E.notify({type:`warning`,message:O(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Vt.value=e,Ht.value=[];let t=MediaRecorder.isTypeSupported(`audio/webm`)?`audio/webm`:``,n=t?new MediaRecorder(e,{mimeType:t}):new MediaRecorder(e);n.ondataavailable=e=>{e.data&&e.data.size>0&&Ht.value.push(e.data)},n.start(),Bt.value=n,A.value=!0,Ut.value=setTimeout(()=>{G(),E.notify({type:`info`,message:O(`voice.maxDurationReached`),position:`top`,timeout:3500})},Ft)}catch{E.notify({type:`negative`,message:O(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function G(){if(!A.value)return;let e=Bt.value;if(!e)return;A.value=!1,j.value=!0,Ut.value&&=(clearTimeout(Ut.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Ht.value,{type:`audio/webm`})),e.stop()});try{if(t.size===0)throw Error(`MIC_AUDIO_INVALID`);let e=new FormData;e.append(`audio`,t,`voice.webm`),e.append(`language`,D.global.voiceLanguage||`auto`);let n=await fetch(`/api/voice/transcribe`,{method:`POST`,body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(String(e.code??e.error??`HTTP_${n.status}`))}let r=await n.json();r.text?.trim()&&(k.value=k.value?`${k.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;E.notify({type:`negative`,message:O({VOICE_DISABLED:`voice.errorDisabled`,MODEL_NOT_CONFIGURED:`voice.errorModelMissing`,MODEL_NOT_INSTALLED:`voice.errorModelNotInstalled`,VOICE_RUNTIME_MISSING:`voice.errorRuntimeMissing`,MIC_AUDIO_INVALID:`voice.errorAudioInvalid`,LANGUAGE_INVALID:`voice.errorLanguageInvalid`,TRANSCRIPTION_TIMEOUT:`voice.errorTranscription`}[t]??`voice.errorTranscription`),position:`top`,timeout:5e3})}finally{Bt.value=null,Ht.value=[],Vt.value?.getTracks().forEach(e=>{e.stop()}),Vt.value=null,j.value=!1}}function hn(e){return Wt.value?D.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function gn(e){!hn(e)||e.repeat||(e.preventDefault(),mn())}function _n(e){hn(e)&&(e.preventDefault(),G())}function vn(){A.value&&G()}function yn(){document.visibilityState!==`visible`&&A.value&&G()}let bn=m(()=>(Ee[B.value]??De).map(e=>({label:O(e.i18nLabelKey),value:e.value,description:O(e.i18nDescriptionKey)})));te(B,()=>{let e=bn.value.map(e=>e.value);if(e.length>0){let t=D.global.defaultModelByEngine?.[B.value];typeof t==`string`&&e.includes(t)?P.value=t:e.includes(P.value)||(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=Oe[B.value]??[];t.length>0&&!t.includes(V.value)&&(V.value=Xt(I.value,B.value));let n=(we[B.value]??[]).map(e=>e.value);n.length>0&&!n.includes(F.value)&&(F.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function xn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Sn=m(()=>(we[B.value]??we[`claude-code`]).map(e=>({value:e.value,label:xn(O(e.i18nLabelKey)),description:O(e.i18nDescriptionKey)}))),K=m(()=>{let e=M.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),Cn=m(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(M.value)),q=e(`panel`);function wn(){let e=M.value.trim();return q.value===`parent`&&Cn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let J=e([]),Tn=e([]),En=e(``),Dn=e(``),On=m(()=>!N.value||!K.value);function kn(){let e=En.value.trim();e&&(J.value.push(e),En.value=``)}function An(e){J.value.splice(e,1)}function jn(){let e=Dn.value.trim();e&&(Tn.value.push(e),Dn.value=``)}function Mn(e){Tn.value.splice(e,1)}function Nn(){N.value=!N.value,N.value||(M.value=``)}let Y=e(!1),X=e(!1);te(()=>X.value,e=>{e&&V.value!==`bypass`&&(V.value=`bypass`,E.notify({type:`info`,message:O(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let Z=e(``),Pn=m(()=>/\/issues\/\d+/.test(Z.value.trim()));function Fn(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=e(!1),$=e(null),In=e([]),Ln=e(!1);async function Rn(){if(!I.value.trim()){In.value=[];return}Ln.value=!0;try{In.value=await Ae.fetchOrphanWorktrees(I.value.trim())}catch{In.value=[]}finally{Ln.value=!1}}function zn(){Q.value=!Q.value,Q.value?(N.value=!1,M.value=``,Y.value=!1,Z.value=``,z.value=!0,Rn()):$.value=null}te(I,()=>{$.value=null,Q.value&&Rn()}),te($,e=>{if(!e)return;let t=In.value.find(t=>t.path===e);t&&(L.value=t.suggestedSourceBranch),z.value=!0});async function Bn(e){if(!e.trim()){H.value=[],L.value=null;return}en.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();H.value=n.local??n.branches??[],H.value.length>0&&!L.value&&(L.value=H.value[0]??null)}catch{H.value=[],L.value=null}finally{en.value=!1}}function Vn(e){let t=D.getProjectByPath(e);if(t){t.defaultSourceBranch&&(L.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(k.value===``||k.value===zt.value)&&(k.value=e,zt.value=e);let n=bn.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))P.value=t.defaultModel;else{let e=D.global.defaultModelByEngine?.[B.value];typeof e==`string`&&n.includes(e)&&(P.value=e)}}V.value=Xt(e,B.value)}let Hn=null;te(I,e=>{Hn&&clearTimeout(Hn),Hn=setTimeout(()=>{L.value=null,Bn(e),Vn(e)},500)});function Un(e,t){t(()=>{It.value=D.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}n(async()=>{await D.fetchSettings();let e=D.global.branchPrefixes;e.length>0&&!e.includes(R.value)&&(R.value=e[0]);let t=je();t.autoLoop===!0&&(X.value=!0),t.projectPath&&D.projectPaths.includes(t.projectPath)&&(I.value=t.projectPath),V.value=Xt(I.value,B.value);try{let e=await fetch(`/api/engines`);e.ok&&(Gt.value=await e.json())}catch{}{let e=bn.value.map(e=>e.value),t=D.global.defaultModelByEngine?.[B.value];typeof t==`string`&&e.includes(t)?P.value=t:e.length>0&&!e.includes(P.value)&&(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,gn),window.addEventListener(`keyup`,_n),window.addEventListener(`blur`,vn),document.addEventListener(`visibilitychange`,yn)}),r(()=>{Hn&&clearTimeout(Hn),window.removeEventListener(`keydown`,gn),window.removeEventListener(`keyup`,_n),window.removeEventListener(`blur`,vn),document.removeEventListener(`visibilitychange`,yn),Ut.value&&=(clearTimeout(Ut.value),null),A.value&&G()});function Wn(e){return e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`).substring(0,50)}function Gn(){return Lt.value.trim()?Lt.value.trim().substring(0,80):!N.value&&!Y.value&&k.value.trim()&&(k.value.trim().split(`
1
+ import{$ as e,B as t,F as n,I as r,O as i,R as a,S as ee,U as te,W as o,_ as s,at as ne,b as c,c as re,ct as l,g as u,h as d,it as f,k as ie,m as p,n as ae,o as oe,ot as se,p as m,s as h,w as ce,y as g}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{t as _}from"./QIcon-C6C3QeM4.js";import{r as v}from"./use-id-By86THzm.js";import{s as le}from"./notifications-C4MxuXC7.js";import{t as y}from"./QBtn-DwemGTZv.js";import{n as ue}from"./vue-i18n-C5Tx4bGk.js";import{t as b}from"./QInput-CLZtb8E0.js";import{c as de,g as fe,i as pe,o as me}from"./index-CyseQlfR.js";import{t as he}from"./QSpinnerDots-atHe_AUn.js";import{n as x,t as S}from"./QItemSection-O9WBXftL.js";import{t as C}from"./QItemLabel-BYSjzk-t.js";import{t as w}from"./QTooltip-CyRLTG6i.js";import{t as ge}from"./QExpansionItem-C9vmJqEO.js";import{t as _e}from"./_plugin-vue_export-helper-BzmG9fMN.js";import{t as ve}from"./QSpace-CrVsndpV.js";import{t as ye}from"./use-quasar-DcJRs0ay.js";import{t as T}from"./QSelect-DgGpVy88.js";import{t as be}from"./QPage-C6xc9fOe.js";import{a as xe,i as Se,n as Ce,r as we,t as Te}from"./expand-template-CRHCd-I8.js";import{i as Ee,r as De,t as Oe}from"./permissionModes-CJN6Olox.js";var ke=`kobo:create-page-prefs`;function E(){try{let e=localStorage.getItem(ke);return e===null?void 0:JSON.parse(e)}catch{return}}function Ae(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function je(){let e=E();if(!Ae(e))return{};let t={};return typeof e.projectPath==`string`&&e.projectPath.length>0&&(t.projectPath=e.projectPath),typeof e.autoLoop==`boolean`&&(t.autoLoop=e.autoLoop),t}function Me(e){try{localStorage.setItem(ke,JSON.stringify(e))}catch{}}var Ne={class:`create-inner`},Pe={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Fe={class:`create-card rounded-borders`},Ie={class:`card-top-bar row items-center q-px-md q-py-xs`},Le={class:`model-badge cursor-default row items-center q-gutter-xs`},Re={class:`text-indigo-3 text-weight-medium text-caption`},ze={key:0,class:`notion-url-wrap`},Be={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ve={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},He={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ue={class:`text-caption text-grey-4 q-mb-sm`},We={class:`row q-gutter-sm`},Ge={class:`peek-card-text`},Ke={class:`peek-card-title`},qe={class:`peek-card-desc`},Je={class:`peek-card-text`},Ye={class:`peek-card-title`},Xe={class:`peek-card-desc`},Ze={key:0,class:`sentry-url-wrap`},Qe={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},$e={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},et={class:`card-name-wrap`},tt={class:`card-textarea-wrap`},nt={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},rt={key:0,class:`row items-center text-caption text-amber-6`},it={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},at={class:`q-pa-sm manual-section-body`},ot={class:`row items-center q-gutter-sm q-mb-sm`},st={class:`col text-caption text-grey-4`},ct={class:`q-pa-sm manual-section-body`},lt={class:`row items-center q-gutter-sm q-mb-sm`},ut={class:`col text-caption text-grey-4`},dt={class:`card-bottom-bar`},ft={class:`row q-col-gutter-xs q-px-xs`},pt={key:0,class:`col-12 col-sm-6 col-md-3`},mt={class:`bottom-select-label row items-center no-wrap`},ht={class:`col-12 col-sm-6 col-md-3`},gt={class:`bottom-select-label row items-center no-wrap`},_t={class:`col-12 col-sm-6 col-md-3`},vt={class:`bottom-select-label row items-center no-wrap`},yt={class:`col-12 col-md-3`},bt={class:`bottom-select-label row items-center no-wrap`},xt={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},St={class:`col-12 col-md-auto`},Ct={class:`col-12 col-md-auto`},wt={class:`col-12 col-md-auto`},Tt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Et={class:`col-12 col-md-4`},Dt={key:0,class:`col-12 col-md-4`},Ot={class:`bottom-select-label row items-center no-wrap`},kt={key:1,class:`col-12 col-md-4`},At={class:`bottom-select-label row items-center no-wrap`},jt={class:`col-12 col-md-4`},Mt={class:`bottom-select-label row items-center no-wrap`},Nt={class:`row justify-center q-px-sm q-py-sm`},Pt={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Ft=6e4,D=_e(ee({__name:`CreatePage`,setup(ee){function _e(e){return e.disabled===!0}let ke=pe(),E=ye(),Ae=de(),D=le(),{t:O}=ue(),It=e([]),Lt=e(``),k=e(``),Rt=e(null),zt=e(``),A=e(!1),j=e(!1),Bt=e(null),Vt=e(null),Ht=e([]),Ut=e(null),M=e(``),N=e(!1),P=e(`claude-opus-4-8`),F=e(`auto`),I=e(``),L=e(null),R=e(`feature`),z=e(!1),Wt=m(()=>D.global.voiceEnabled),Gt=e([]),B=e(`claude-code`),Kt=m(()=>Gt.value.find(e=>e.id===B.value)),qt=m(()=>Gt.value.map(e=>({value:e.id,label:e.displayName}))),Jt=m(()=>D.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),Yt=[`plan`,`bypass`,`strict`,`interactive`];function Xt(e,t){let n=e?D.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Yt.includes(r))return r;let i=D.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Yt.includes(i)?i:n?.dangerouslySkipPermissions??D.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let V=e(Xt(``,B.value)),Zt=m(()=>{switch(V.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),Qt=m(()=>(Oe[B.value]??Yt).map(e=>({value:e,label:O(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),H=e([]),$t=e([]),en=e(!1),tn=e(!1);function nn(e,t){t(()=>{$t.value=e?H.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):H.value})}let rn=fe();function an(){return Rt.value?.nativeEl??null}let{showSkills:on,selectedSkillIndex:U,groupedDropdown:sn,flatDropdown:W,fetchSkills:cn,detectSlashFragment:ln,replaceFragmentWith:un,closeDropdown:dn}=Se(k,an,{excludeKoboCommands:!0});cn(),te(k,async()=>{await ie(),await ln()});function fn(e){if(e.type===`template`){let t=rn.templates.find(t=>t.slug===e.name);if(!t)return;un(Ce(t.content,Te({workspace:null,gitStats:null,sessionName:null}))),dn();return}un(`/${e.name} `),dn()}function pn(e){!on.value||W.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),U.value=(U.value+1)%W.value.length):e.key===`ArrowUp`?(e.preventDefault(),U.value=(U.value-1+W.value.length)%W.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),fn(W.value[U.value])):e.key===`Escape`&&(e.preventDefault(),dn()))}async function mn(){if(!(!Wt.value||A.value||j.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){E.notify({type:`warning`,message:O(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Vt.value=e,Ht.value=[];let t=MediaRecorder.isTypeSupported(`audio/webm`)?`audio/webm`:``,n=t?new MediaRecorder(e,{mimeType:t}):new MediaRecorder(e);n.ondataavailable=e=>{e.data&&e.data.size>0&&Ht.value.push(e.data)},n.start(),Bt.value=n,A.value=!0,Ut.value=setTimeout(()=>{G(),E.notify({type:`info`,message:O(`voice.maxDurationReached`),position:`top`,timeout:3500})},Ft)}catch{E.notify({type:`negative`,message:O(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function G(){if(!A.value)return;let e=Bt.value;if(!e)return;A.value=!1,j.value=!0,Ut.value&&=(clearTimeout(Ut.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Ht.value,{type:`audio/webm`})),e.stop()});try{if(t.size===0)throw Error(`MIC_AUDIO_INVALID`);let e=new FormData;e.append(`audio`,t,`voice.webm`),e.append(`language`,D.global.voiceLanguage||`auto`);let n=await fetch(`/api/voice/transcribe`,{method:`POST`,body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(String(e.code??e.error??`HTTP_${n.status}`))}let r=await n.json();r.text?.trim()&&(k.value=k.value?`${k.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;E.notify({type:`negative`,message:O({VOICE_DISABLED:`voice.errorDisabled`,MODEL_NOT_CONFIGURED:`voice.errorModelMissing`,MODEL_NOT_INSTALLED:`voice.errorModelNotInstalled`,VOICE_RUNTIME_MISSING:`voice.errorRuntimeMissing`,MIC_AUDIO_INVALID:`voice.errorAudioInvalid`,LANGUAGE_INVALID:`voice.errorLanguageInvalid`,TRANSCRIPTION_TIMEOUT:`voice.errorTranscription`}[t]??`voice.errorTranscription`),position:`top`,timeout:5e3})}finally{Bt.value=null,Ht.value=[],Vt.value?.getTracks().forEach(e=>{e.stop()}),Vt.value=null,j.value=!1}}function hn(e){return Wt.value?D.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function gn(e){!hn(e)||e.repeat||(e.preventDefault(),mn())}function _n(e){hn(e)&&(e.preventDefault(),G())}function vn(){A.value&&G()}function yn(){document.visibilityState!==`visible`&&A.value&&G()}let bn=m(()=>(Ee[B.value]??De).map(e=>({label:O(e.i18nLabelKey),value:e.value,description:O(e.i18nDescriptionKey)})));te(B,()=>{let e=bn.value.map(e=>e.value);if(e.length>0){let t=D.global.defaultModelByEngine?.[B.value];typeof t==`string`&&e.includes(t)?P.value=t:e.includes(P.value)||(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=Oe[B.value]??[];t.length>0&&!t.includes(V.value)&&(V.value=Xt(I.value,B.value));let n=(we[B.value]??[]).map(e=>e.value);n.length>0&&!n.includes(F.value)&&(F.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function xn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let Sn=m(()=>(we[B.value]??we[`claude-code`]).map(e=>({value:e.value,label:xn(O(e.i18nLabelKey)),description:O(e.i18nDescriptionKey)}))),K=m(()=>{let e=M.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),Cn=m(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(M.value)),q=e(`panel`);function wn(){let e=M.value.trim();return q.value===`parent`&&Cn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let J=e([]),Tn=e([]),En=e(``),Dn=e(``),On=m(()=>!N.value||!K.value);function kn(){let e=En.value.trim();e&&(J.value.push(e),En.value=``)}function An(e){J.value.splice(e,1)}function jn(){let e=Dn.value.trim();e&&(Tn.value.push(e),Dn.value=``)}function Mn(e){Tn.value.splice(e,1)}function Nn(){N.value=!N.value,N.value||(M.value=``)}let Y=e(!1),X=e(!1);te(()=>X.value,e=>{e&&V.value!==`bypass`&&(V.value=`bypass`,E.notify({type:`info`,message:O(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let Z=e(``),Pn=m(()=>/\/issues\/\d+/.test(Z.value.trim()));function Fn(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=e(!1),$=e(null),In=e([]),Ln=e(!1);async function Rn(){if(!I.value.trim()){In.value=[];return}Ln.value=!0;try{In.value=await Ae.fetchOrphanWorktrees(I.value.trim())}catch{In.value=[]}finally{Ln.value=!1}}function zn(){Q.value=!Q.value,Q.value?(N.value=!1,M.value=``,Y.value=!1,Z.value=``,z.value=!0,Rn()):$.value=null}te(I,()=>{$.value=null,Q.value&&Rn()}),te($,e=>{if(!e)return;let t=In.value.find(t=>t.path===e);t&&(L.value=t.suggestedSourceBranch),z.value=!0});async function Bn(e){if(!e.trim()){H.value=[],L.value=null;return}en.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();H.value=n.local??n.branches??[],H.value.length>0&&!L.value&&(L.value=H.value[0]??null)}catch{H.value=[],L.value=null}finally{en.value=!1}}function Vn(e){let t=D.getProjectByPath(e);if(t){t.defaultSourceBranch&&(L.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(k.value===``||k.value===zt.value)&&(k.value=e,zt.value=e);let n=bn.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))P.value=t.defaultModel;else{let e=D.global.defaultModelByEngine?.[B.value];typeof e==`string`&&n.includes(e)&&(P.value=e)}}V.value=Xt(e,B.value)}let Hn=null;te(I,e=>{Hn&&clearTimeout(Hn),Hn=setTimeout(()=>{L.value=null,Bn(e),Vn(e)},500)});function Un(e,t){t(()=>{It.value=D.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}n(async()=>{await D.fetchSettings();let e=D.global.branchPrefixes;e.length>0&&!e.includes(R.value)&&(R.value=e[0]);let t=je();t.autoLoop===!0&&(X.value=!0),t.projectPath&&D.projectPaths.includes(t.projectPath)&&(I.value=t.projectPath),V.value=Xt(I.value,B.value);try{let e=await fetch(`/api/engines`);e.ok&&(Gt.value=await e.json())}catch{}{let e=bn.value.map(e=>e.value),t=D.global.defaultModelByEngine?.[B.value];typeof t==`string`&&e.includes(t)?P.value=t:e.length>0&&!e.includes(P.value)&&(P.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,gn),window.addEventListener(`keyup`,_n),window.addEventListener(`blur`,vn),document.addEventListener(`visibilitychange`,yn)}),r(()=>{Hn&&clearTimeout(Hn),window.removeEventListener(`keydown`,gn),window.removeEventListener(`keyup`,_n),window.removeEventListener(`blur`,vn),document.removeEventListener(`visibilitychange`,yn),Ut.value&&=(clearTimeout(Ut.value),null),A.value&&G()});function Wn(e){return e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`).substring(0,50)}function Gn(){return Lt.value.trim()?Lt.value.trim().substring(0,80):!N.value&&!Y.value&&k.value.trim()&&(k.value.trim().split(`
2
2
  `)[0]??``).substring(0,80)||`workspace`}function Kn(e){let t=(e.split(`/`).pop()??``).split(`-`);t.length>1&&/^[0-9a-f]{12,}$/i.test(t[t.length-1])&&t.pop();let n=t.join(`-`).toLowerCase(),r=n.match(/tk-(\d+)/);if(r){let e=`TK-${r[1]}`,t=n.replace(/tk-\d+/i,``).replace(/-+/g,`-`).replace(/^-|-$/g,``).substring(0,40);return t?`${e}--${t}`:e}return n.substring(0,50)||`task-${Date.now()}`}function qn(){return N.value&&!K.value?O(`createPage.validationNotionUrl`):Y.value&&!Pn.value?O(`createPage.sentryValidation`):!N.value&&!Y.value&&!k.value.trim()?O(`createPage.validationDescription`):!N.value&&!Y.value&&(!Gn()||Gn()===`workspace`)&&!Lt.value.trim()&&!k.value.trim()?O(`createPage.validationName`):I.value.trim()?L.value?null:O(`createPage.validationBranch`):O(`createPage.validationPath`)}async function Jn(){let e=qn();if(e){E.notify({type:`negative`,message:e,position:`top`});return}if(Q.value&&!$.value){E.notify({type:`negative`,message:O(`createPage.pickWorktreeRequired`),position:`top`});return}tn.value=!0;try{let e=Gn(),t;t=N.value&&K.value?Kn(wn()):e===`workspace`?`task-${Date.now()}`:Wn(e);let n=`${R.value}/${t}`,r={name:e,projectPath:I.value.trim(),sourceBranch:L.value,...Q.value&&$.value?{worktreePath:$.value,skipSetupScript:!0}:{workingBranch:n},engine:B.value,model:P.value,reasoningEffort:F.value,...N.value&&K.value?{notionUrl:wn()}:{},...Y.value&&Pn.value?{sentryUrl:Z.value.trim()}:{},...On.value&&J.value.length>0?{tasks:J.value}:{},...On.value&&Tn.value.length>0?{acceptanceCriteria:Tn.value}:{},...z.value&&!Q.value?{skipSetupScript:!0}:{},...k.value.trim()?{description:k.value.trim()}:{},...X.value?{autoLoop:!0}:{},agentPermissionMode:X.value&&V.value===`plan`?`bypass`:V.value},i=await Ae.createWorkspace(r);i._branchAdjusted&&E.notify({type:`info`,message:O(`createPage.branchAdjusted`,{branch:i.workingBranch}),position:`top`,timeout:6e3}),Me({projectPath:I.value.trim(),autoLoop:X.value}),me().subscribe(i.id),Ae.selectWorkspace(i.id),ke.push({name:`workspace`,params:{id:i.id}})}catch{E.notify({type:`negative`,message:O(`createPage.errorCreating`),position:`top`})}finally{tn.value=!1}}return(e,n)=>(a(),d(be,{class:`create-page flex flex-center column`},{default:o(()=>[p(`div`,Ne,[p(`div`,Pe,l(e.$t(`createPage.title`)),1),p(`div`,Fe,[p(`div`,Ie,[p(`span`,Le,[c(_,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),p(`span`,Re,l(Kt.value?.displayName??e.$t(`createPage.claudeCode`)),1)]),c(ve),c(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:N.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,disable:Q.value,onClick:Nn},{default:o(()=>[c(_,{name:`description`,size:`14px`,class:`q-mr-xs`}),g(` `+l(N.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`,`disable`]),c(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:Y.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,disable:Q.value,onClick:Fn},{default:o(()=>[c(_,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),g(` `+l(Y.value?e.$t(`createPage.sentryEnabled`):e.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`,`disable`])]),c(v,{color:`grey-9`}),c(ae,{name:`slide`},{default:o(()=>[N.value?(a(),s(`div`,ze,[c(b,{modelValue:M.value,"onUpdate:modelValue":n[0]||=e=>M.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:o(()=>[c(_,{name:`link`,size:`16px`,color:K.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),M.value.trim()&&!K.value?(a(),s(`div`,Be,l(e.$t(`createPage.notionValidation`)),1)):u(``,!0),K.value?(a(),s(`div`,Ve,l(e.$t(`createPage.notionAutoExtract`)),1)):u(``,!0),K.value&&Cn.value?(a(),s(`div`,He,[p(`div`,Ue,[c(_,{name:`info`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),g(` `+l(e.$t(`createPage.notionPanelChoiceLabel`)),1)]),p(`div`,We,[p(`button`,{type:`button`,class:ne([`peek-card col`,{"peek-card--active":q.value===`panel`}]),onClick:n[1]||=e=>q.value=`panel`},[c(_,{name:`article`,size:`22px`,class:`peek-card-icon`}),p(`div`,Ge,[p(`div`,Ke,l(e.$t(`createPage.notionPanelOption`)),1),p(`div`,qe,l(e.$t(`createPage.notionPanelOptionDesc`)),1)]),q.value===`panel`?(a(),d(_,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):u(``,!0)],2),p(`button`,{type:`button`,class:ne([`peek-card col`,{"peek-card--active":q.value===`parent`}]),onClick:n[2]||=e=>q.value=`parent`},[c(_,{name:`folder_open`,size:`22px`,class:`peek-card-icon`}),p(`div`,Je,[p(`div`,Ye,l(e.$t(`createPage.notionParentOption`)),1),p(`div`,Xe,l(e.$t(`createPage.notionParentOptionDesc`)),1)]),q.value===`parent`?(a(),d(_,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):u(``,!0)],2)])])):u(``,!0)])):u(``,!0)]),_:1}),N.value?(a(),d(v,{key:0,color:`grey-9`})):u(``,!0),c(ae,{name:`slide`},{default:o(()=>[Y.value?(a(),s(`div`,Ze,[c(b,{modelValue:Z.value,"onUpdate:modelValue":n[3]||=e=>Z.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:o(()=>[c(_,{name:`link`,size:`16px`,color:Pn.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Z.value.trim()&&!Pn.value?(a(),s(`div`,Qe,l(e.$t(`createPage.sentryValidation`)),1)):u(``,!0),Pn.value?(a(),s(`div`,$e,l(e.$t(`createPage.sentryAutoExtract`)),1)):u(``,!0)])):u(``,!0)]),_:1}),Y.value?(a(),d(v,{key:1,color:`grey-9`})):u(``,!0),p(`div`,et,[c(b,{modelValue:Lt.value,"onUpdate:modelValue":n[4]||=e=>Lt.value=e,borderless:``,dense:``,placeholder:N.value&&K.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),c(v,{color:`grey-9`}),p(`div`,tt,[c(b,{ref_key:`descriptionRef`,ref:Rt,modelValue:k.value,"onUpdate:modelValue":n[5]||=e=>k.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:N.value?e.$t(`createPage.instructions`):e.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[pn,oe(h(Jn,[`ctrl`]),[`enter`]),oe(h(Jn,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`]),p(`div`,nt,[j.value?(a(),s(`div`,rt,[c(he,{size:`14px`,color:`amber-6`,class:`q-mr-xs`}),p(`span`,null,l(e.$t(`voice.transcribing`)),1)])):u(``,!0),c(y,{flat:``,dense:``,size:`sm`,icon:j.value?`hourglass_top`:A.value?`mic`:`mic_none`,color:A.value?`red-5`:j.value?`amber-6`:`grey-6`,disable:!Wt.value||j.value,class:ne({"voice-btn--recording":A.value}),onMousedown:h(mn,[`prevent`]),onMouseup:h(G,[`prevent`]),onMouseleave:h(G,[`prevent`]),onTouchstart:h(mn,[`prevent`]),onTouchend:h(G,[`prevent`])},{default:o(()=>[c(w,null,{default:o(()=>[g(l(j.value?e.$t(`voice.transcribing`):A.value?e.$t(`voice.recording`):e.$t(`voice.holdToTalk`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`disable`,`class`])]),f(on)&&f(W).length>0?(a(),d(xe,{key:0,class:`create-slash-popup`,"grouped-dropdown":f(sn),"flat-dropdown":f(W),"selected-index":f(U),onSelect:fn},null,8,[`grouped-dropdown`,`flat-dropdown`,`selected-index`])):u(``,!0)]),c(v,{color:`grey-9`}),On.value?(a(),s(re,{key:2},[p(`div`,it,l(e.$t(`createPage.manualHint`)),1),c(ge,{dark:``,dense:``,label:e.$t(`createPage.tasks`,{count:J.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:o(()=>[p(`div`,at,[p(`div`,ot,[c(b,{modelValue:En.value,"onUpdate:modelValue":n[6]||=e=>En.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:oe(h(kn,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),c(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!En.value.trim(),onClick:kn},{default:o(()=>[c(w,null,{default:o(()=>[g(l(e.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(a(!0),s(re,null,t(J.value,(t,n)=>(a(),s(`div`,{key:`task-${n}`,class:`row items-center q-py-xs manual-item`},[p(`span`,st,l(t),1),c(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>An(n)},{default:o(()=>[c(w,null,{default:o(()=>[g(l(e.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),c(ge,{dark:``,dense:``,label:e.$t(`createPage.acceptanceCriteria`,{count:Tn.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:o(()=>[p(`div`,ct,[p(`div`,lt,[c(b,{modelValue:Dn.value,"onUpdate:modelValue":n[7]||=e=>Dn.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:oe(h(jn,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),c(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Dn.value.trim(),onClick:jn},{default:o(()=>[c(w,null,{default:o(()=>[g(l(e.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(a(!0),s(re,null,t(Tn.value,(t,n)=>(a(),s(`div`,{key:`crit-${n}`,class:`row items-center q-py-xs manual-item`},[p(`span`,ut,l(t),1),c(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>Mn(n)},{default:o(()=>[c(w,null,{default:o(()=>[g(l(e.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),c(v,{color:`grey-9`})],64)):u(``,!0),p(`div`,dt,[p(`div`,ft,[qt.value.length>0?(a(),s(`div`,pt,[c(T,{modelValue:B.value,"onUpdate:modelValue":n[8]||=e=>B.value=e,options:qt.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[p(`span`,mt,[c(_,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),g(` `+l(qt.value.find(e=>e.value===B.value)?.label??B.value)+` `,1),c(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[c(w,null,{default:o(()=>[g(l(e.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])):u(``,!0),p(`div`,ht,[c(T,{modelValue:P.value,"onUpdate:modelValue":n[9]||=e=>P.value=e,options:bn.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[p(`span`,gt,[g(l(bn.value.find(e=>e.value===P.value)?.label??P.value)+` `,1),c(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[c(x,i(t,{class:`model-option`}),{default:o(()=>[c(S,null,{default:o(()=>[c(C,{class:`text-white`},{default:o(()=>[g(l(e.label),1)]),_:2},1024),c(C,{caption:``,class:`text-grey-5`},{default:o(()=>[g(l(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),p(`div`,_t,[c(T,{modelValue:F.value,"onUpdate:modelValue":n[10]||=e=>F.value=e,options:Sn.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[p(`span`,vt,[c(_,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),g(` `+l(Sn.value.find(e=>e.value===F.value)?.label??F.value)+` `,1),c(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[c(x,se(ce(t)),{default:o(()=>[c(S,null,{default:o(()=>[c(C,{class:`text-white`},{default:o(()=>[g(l(e.label),1)]),_:2},1024),c(C,{caption:``,class:`text-grey-5`},{default:o(()=>[g(l(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),p(`div`,yt,[c(T,{modelValue:V.value,"onUpdate:modelValue":n[11]||=e=>V.value=e,options:Qt.value,disable:X.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`,"option-disable":_e},{selected:o(()=>[p(`span`,bt,[c(_,{name:Zt.value,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),g(` `+l(Qt.value.find(e=>e.value===V.value)?.label??V.value)+` `,1),X.value?u(``,!0):(a(),d(_,{key:0,name:`expand_more`,size:`12px`,color:`grey-5`}))])]),default:o(()=>[c(w,null,{default:o(()=>[g(l(X.value?e.$t(`agentPermissionMode.autoLoopLocked`):e.$t(`agentPermissionMode.tooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`,`disable`])])]),p(`div`,xt,[p(`div`,St,[c(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:X.value?`autorenew`:`sync_disabled`,color:X.value?`amber-4`:`grey-5`,label:e.$t(`autoLoop.startInMode`),class:`skip-setup-btn`,onClick:n[12]||=e=>X.value=!X.value},{default:o(()=>[c(w,null,{default:o(()=>[g(l(e.$t(`autoLoop.startInMode`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),p(`div`,Ct,[c(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:z.value?`play_disabled`:`play_circle`,color:z.value?`orange-4`:`grey-5`,label:e.$t(`createPage.skipSetupScript`),class:`skip-setup-btn`,onClick:n[13]||=e=>z.value=!z.value},{default:o(()=>[c(w,null,{default:o(()=>[g(l(e.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),p(`div`,wt,[c(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:`folder_open`,color:Q.value?`cyan-4`:`grey-5`,label:Q.value?e.$t(`createPage.attachWorktreeEnabled`):e.$t(`createPage.attachWorktreeToggle`),class:`skip-setup-btn`,onClick:zn},null,8,[`color`,`label`])])]),p(`div`,Tt,[p(`div`,Et,[c(T,{modelValue:I.value,"onUpdate:modelValue":n[14]||=e=>I.value=e,options:It.value,dense:``,borderless:``,"use-input":``,"fill-input":``,"hide-selected":``,"input-debounce":`0`,"new-value-mode":`add`,class:`bottom-select rounded-borders repo-select`,"hide-dropdown-icon":``,"input-class":I.value?``:`repo-input-empty`,placeholder:e.$t(`createPage.projectPath`),behavior:f(D).projectPaths.length>0?`menu`:`dialog`,onFilter:Un,onInputValue:n[15]||=e=>{I.value=e}},{prepend:o(()=>[c(_,{name:`folder`,size:`14px`,color:`grey-5`})]),"no-option":o(()=>[c(x,null,{default:o(()=>[c(S,{class:`text-grey-6 text-caption`},{default:o(()=>[g(l(e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`])]),Q.value?u(``,!0):(a(),s(`div`,Dt,[c(T,{modelValue:R.value,"onUpdate:modelValue":n[16]||=e=>R.value=e,options:Jt.value,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:o(()=>[p(`span`,Ot,[c(_,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),g(` `+l(R.value)+`/ `,1),c(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[c(w,null,{default:o(()=>[g(l(e.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])),Q.value?(a(),s(`div`,kt,[c(T,{modelValue:$.value,"onUpdate:modelValue":n[17]||=e=>$.value=e,options:In.value,"option-label":`branch`,"option-value":`path`,"emit-value":``,"map-options":``,"use-input":``,dense:``,borderless:``,class:`bottom-select rounded-borders worktree-select`,"hide-dropdown-icon":``,loading:Ln.value,disable:!I.value.trim()||Ln.value},{selected:o(()=>[p(`span`,At,[c(_,{name:`folder_open`,size:`12px`,color:`cyan-5`,class:`q-mr-xs`}),g(` `+l($.value?In.value.find(e=>e.path===$.value)?.branch??$.value:e.$t(`createPage.worktreePickerLabel`))+` `,1),c(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(e=>[c(x,se(ce(e.itemProps)),{default:o(()=>[c(S,null,{default:o(()=>[c(C,null,{default:o(()=>[g(l(e.opt.branch),1)]),_:2},1024),c(C,{caption:``},{default:o(()=>[g(l(e.opt.path),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":o(()=>[c(x,null,{default:o(()=>[c(S,{class:`text-grey-6 text-caption`},{default:o(()=>[g(l(I.value.trim()?e.$t(`createPage.noOrphanWorktrees`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])):u(``,!0),p(`div`,jt,[c(T,{modelValue:L.value,"onUpdate:modelValue":n[18]||=e=>L.value=e,options:$t.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,"use-input":``,"input-debounce":`0`,loading:en.value,disable:!I.value.trim()||en.value,onFilter:nn},{selected:o(()=>[p(`span`,Mt,[c(_,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),g(` `+l(L.value??e.$t(`createPage.branch`))+` `,1),c(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":o(()=>[c(x,null,{default:o(()=>[c(S,{class:`text-grey-6 text-caption`},{default:o(()=>[g(l(I.value.trim()?e.$t(`createPage.noBranches`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])])]),p(`div`,Nt,[c(y,{label:e.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:tn.value,disable:tn.value||Q.value&&!$.value,onClick:Jn},null,8,[`label`,`loading`,`disable`])])]),p(`div`,Pt,l(N.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-4c087441`]]);export{D as default};
@@ -1,8 +1,8 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-DuQa2C4S.js","assets/index-CNin8jPU.js","assets/vue-i18n-C5Tx4bGk.js","assets/vue.runtime.esm-bundler-BAtKyT0Y.js","assets/chunk-DtRyYLXJ.js","assets/use-id-By86THzm.js","assets/QIcon-C6C3QeM4.js","assets/notifications-C4MxuXC7.js","assets/QBtn-DwemGTZv.js","assets/QRadio-B_TurTzx.js","assets/use-checkbox-BnkSQgTJ.js","assets/QInput-CLZtb8E0.js","assets/QCheckbox-o3UHW596.js","assets/QToggle-Dwr3hSLw.js","assets/index-C3dgH7TE.css","assets/editor.api2-CEAFHkwY.js","assets/editor-BFebQ78e.css","assets/workers-DFjmWZva.js","assets/monaco.contribution-DqqsS1kc.js"])))=>i.map(i=>d[i]);
2
- import{$ as e,B as t,F as n,G as r,I as i,R as a,S as o,T as s,U as c,W as l,_ as u,at as d,b as f,c as p,ct as m,g as h,h as g,it as _,m as v,p as y,st as b,y as x}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{P as S,a as C,t as w}from"./QIcon-C6C3QeM4.js";import{r as ee}from"./use-id-By86THzm.js";import{n as T,t as E}from"./QBtn-DwemGTZv.js";import{n as te}from"./vue-i18n-C5Tx4bGk.js";import{i as D,o as ne,t as O}from"./QInput-CLZtb8E0.js";import{c as re,n as ie,o as ae,u as oe}from"./index-CNin8jPU.js";import{t as se}from"./QSpinnerDots-atHe_AUn.js";import{n as ce,t as le}from"./QItemSection-O9WBXftL.js";import{t as k}from"./QTooltip-CyRLTG6i.js";import{t as ue}from"./QScrollArea-B5jf9S4y.js";import{t as A}from"./render-chat-markdown-BJsZCnSw.js";import{t as j}from"./_plugin-vue_export-helper-BzmG9fMN.js";import{t as M}from"./QBadge-CIC5n8w7.js";import{t as de}from"./QSpace-CrVsndpV.js";import{t as fe}from"./QChip-BpS8c1sW.js";import{i as N,n as pe,r as me,t as he}from"./build-path-tree-D4_LR3mz.js";import{t as ge}from"./QList-DRW_oyZ4.js";import{t as _e}from"./QMenu-D_9kEp2i.js";import{t as ve}from"./ClosePopup-DD10nToj.js";import{t as ye}from"./use-quasar-DcJRs0ay.js";var be=S({name:`QBtnToggle`,props:{...ne,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=y(()=>e.options.find(t=>t.value===e.modelValue)!==void 0),i=D(y(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),a=y(()=>T(e)),o=y(()=>({rounded:e.rounded,dense:e.dense,...a.value})),c=y(()=>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||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||(e.modelValue===t?e.clearable&&(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(E,e.props,e.slot===void 0?void 0:t[e.slot]));return e.name!==void 0&&!e.disable&&r.value&&i(n,`push`),C(t.default,n)}return()=>s(N,{class:`q-btn-toggle`,...a.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}});function P(e){if(!e.filePath||e.filePath.startsWith(`/`))throw Error(`Invalid filePath: must be non-empty POSIX path relative to workspace root`);return{id:crypto.randomUUID(),filePath:e.filePath,line:e.line,content:e.content,createdAt:new Date().toISOString()}}function F(e){let t=e.split(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-VujCgCtA.js","assets/index-CyseQlfR.js","assets/vue-i18n-C5Tx4bGk.js","assets/vue.runtime.esm-bundler-BAtKyT0Y.js","assets/chunk-DtRyYLXJ.js","assets/use-id-By86THzm.js","assets/QIcon-C6C3QeM4.js","assets/notifications-C4MxuXC7.js","assets/QBtn-DwemGTZv.js","assets/QRadio-B_TurTzx.js","assets/use-checkbox-BnkSQgTJ.js","assets/QInput-CLZtb8E0.js","assets/QCheckbox-o3UHW596.js","assets/QToggle-Dwr3hSLw.js","assets/index-C3dgH7TE.css","assets/editor.api2-Byu6kw7p.js","assets/editor-BFebQ78e.css","assets/workers-JYdpxrSy.js","assets/monaco.contribution-rZ1avSXN.js"])))=>i.map(i=>d[i]);
2
+ import{$ as e,B as t,F as n,G as r,I as i,R as a,S as o,T as s,U as c,W as l,_ as u,at as d,b as f,c as p,ct as m,g as h,h as g,it as _,m as v,p as y,st as b,y as x}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{P as S,a as C,t as w}from"./QIcon-C6C3QeM4.js";import{r as ee}from"./use-id-By86THzm.js";import{n as T,t as E}from"./QBtn-DwemGTZv.js";import{n as te}from"./vue-i18n-C5Tx4bGk.js";import{i as D,o as ne,t as O}from"./QInput-CLZtb8E0.js";import{c as re,n as ie,o as ae,u as oe}from"./index-CyseQlfR.js";import{t as se}from"./QSpinnerDots-atHe_AUn.js";import{n as ce,t as le}from"./QItemSection-O9WBXftL.js";import{t as k}from"./QTooltip-CyRLTG6i.js";import{t as ue}from"./QScrollArea-B5jf9S4y.js";import{t as A}from"./render-chat-markdown-8LO2n7Of.js";import{t as j}from"./_plugin-vue_export-helper-BzmG9fMN.js";import{t as M}from"./QBadge-CIC5n8w7.js";import{t as de}from"./QSpace-CrVsndpV.js";import{t as fe}from"./QChip-BpS8c1sW.js";import{i as N,n as pe,r as me,t as he}from"./build-path-tree-D4_LR3mz.js";import{t as ge}from"./QList-DRW_oyZ4.js";import{t as _e}from"./QMenu-D_9kEp2i.js";import{t as ve}from"./ClosePopup-DD10nToj.js";import{t as ye}from"./use-quasar-DcJRs0ay.js";var be=S({name:`QBtnToggle`,props:{...ne,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=y(()=>e.options.find(t=>t.value===e.modelValue)!==void 0),i=D(y(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),a=y(()=>T(e)),o=y(()=>({rounded:e.rounded,dense:e.dense,...a.value})),c=y(()=>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||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||(e.modelValue===t?e.clearable&&(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(E,e.props,e.slot===void 0?void 0:t[e.slot]));return e.name!==void 0&&!e.disable&&r.value&&i(n,`push`),C(t.default,n)}return()=>s(N,{class:`q-btn-toggle`,...a.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}});function P(e){if(!e.filePath||e.filePath.startsWith(`/`))throw Error(`Invalid filePath: must be non-empty POSIX path relative to workspace root`);return{id:crypto.randomUUID(),filePath:e.filePath,line:e.line,content:e.content,createdAt:new Date().toISOString()}}function F(e){let t=e.split(`
3
3
  `);return t.length===1?e:t.map((e,t)=>t===0?e:` ${e}`).join(`
4
4
  `)}function I(e){let{comments:t,globalMessage:n}=e;if(t.length===0)return`## Code review\n\n${n}`;let r=new Map;for(let e of t){let t=r.get(e.filePath)??[];t.push(e),r.set(e.filePath,t)}for(let e of r.values())e.sort((e,t)=>e.line-t.line||e.createdAt.localeCompare(t.createdAt));let i=Array.from(r.keys()).sort(),a=i.map(e=>`### \`${e}\`\n\n${r.get(e).map(e=>`- **L${e.line}** : ${F(e.content)}`).join(`
5
5
  `)}`),o=i.length,s=`_${t.length} comment${t.length===1?``:`s`} across ${o} file${o===1?``:`s`}. Address them and ping me back when done._`;return`## Code review — please address the following${n?`\n\n${n}`:``}\n\n${a.join(`
6
6
 
7
- `)}\n\n---\n${s}`}var L=300;function R(e){return`kobo:review-draft:${e}`}function z(e){let t=localStorage.getItem(R(e));if(!t)return{comments:[],globalMessage:``};try{let e=JSON.parse(t);return{comments:Array.isArray(e.comments)?e.comments:[],globalMessage:typeof e.globalMessage==`string`?e.globalMessage:``}}catch{return{comments:[],globalMessage:``}}}function xe(t,n){let r=e(z(t)),i=null;function a(){i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null;try{localStorage.setItem(R(t),JSON.stringify(r.value))}catch(e){console.warn(`[review-draft] persist failed:`,e)}},L)}function o(){if(i!==null){clearTimeout(i),i=null;try{localStorage.setItem(R(t),JSON.stringify(r.value))}catch(e){console.warn(`[review-draft] flush failed:`,e)}}}function s(e){let t=P(e);return r.value.comments.push(t),a(),t}function c(e,t){let n=r.value.comments.find(t=>t.id===e);n&&(n.content=t,a())}function l(e){r.value.comments=r.value.comments.filter(t=>t.id!==e),a()}function u(e){r.value.globalMessage=e,a()}function d(){r.value={comments:[],globalMessage:``},i!==null&&(clearTimeout(i),i=null),localStorage.removeItem(R(t))}async function f(e){if(r.value.comments.length===0&&r.value.globalMessage.trim()===``)return{ok:!1,error:`Draft is empty`};o();let i=I(r.value);try{await n.sendChatMessage(t,i,e)}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}return d(),{ok:!0}}return{draft:r,addComment:s,updateComment:c,deleteComment:l,setGlobalMessage:u,clearDraft:d,flush:o,submit:f}}var B={class:`review-comment-block`},V={class:`comment-actions q-mt-xs`},H=[`innerHTML`],Se={class:`comment-footer`},Ce={class:`comment-time text-caption text-grey-7`},we={class:`comment-actions q-mt-xs`},Te=j(o({__name:`ReviewCommentBlock`,props:{comments:{},startInAddMode:{type:Boolean}},emits:[`add`,`update`,`delete`,`dismissEmpty`],setup(n,{emit:r}){let i=n,o=r,{t:s}=te(),c=ye(),_=e(null),y=e(``),b=e(i.startInAddMode===!0),S=e(``);function C(e){return A(e)}function w(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return s(`common.justNow`);if(n<60)return s(`common.minutesAgo`,{count:n});let r=Math.floor(n/60);return r<24?s(`common.hoursAgo`,{count:r}):s(`common.daysAgo`,{count:Math.floor(r/24)})}function ee(e){_.value=e.id,y.value=e.content}function T(){_.value=null,y.value=``}function D(e){let t=y.value.trim();t&&(o(`update`,e,t),_.value=null,y.value=``)}function ne(e){c.dialog({title:s(`diff.deleteComment`),message:s(`diff.deleteCommentConfirm`),cancel:!0,persistent:!0,ok:{label:s(`diff.deleteComment`),color:`negative`,flat:!1,unelevated:!0}}).onOk(()=>{o(`delete`,e)})}function re(){b.value=!1,S.value=``,i.comments.length===0&&o(`dismissEmpty`)}function ie(){let e=S.value.trim();e&&(o(`add`,e),b.value=!1,S.value=``)}return(e,r)=>(a(),u(`div`,B,[(a(!0),u(p,null,t(n.comments,(t,n)=>(a(),u(`div`,{key:t.id,class:d([`comment-thread-item`,{"with-separator":n>0}])},[_.value===t.id?(a(),u(p,{key:0},[f(O,{modelValue:y.value,"onUpdate:modelValue":r[0]||=e=>y.value=e,type:`textarea`,autogrow:``,dense:``,dark:``,outlined:``,autofocus:``,class:`comment-textarea`,placeholder:e.$t(`diff.commentPlaceholder`)},null,8,[`modelValue`,`placeholder`]),v(`div`,V,[f(E,{flat:``,dense:``,size:`sm`,label:e.$t(`common.cancel`),onClick:T},null,8,[`label`]),f(E,{unelevated:``,dense:``,size:`sm`,color:`primary`,label:e.$t(`common.save`),onClick:e=>D(t.id)},null,8,[`label`,`onClick`])])],64)):(a(),u(p,{key:1},[v(`div`,{class:`comment-content`,innerHTML:C(t.content)},null,8,H),v(`div`,Se,[v(`span`,Ce,m(w(t.createdAt)),1),f(E,{flat:``,dense:``,round:``,size:`xs`,icon:`edit`,color:`grey-5`,onClick:e=>ee(t)},{default:l(()=>[f(k,null,{default:l(()=>[x(m(e.$t(`diff.editComment`)),1)]),_:1})]),_:1},8,[`onClick`]),f(E,{flat:``,dense:``,round:``,size:`xs`,icon:`delete`,color:`grey-5`,onClick:e=>ne(t.id)},{default:l(()=>[f(k,null,{default:l(()=>[x(m(e.$t(`diff.deleteComment`)),1)]),_:1})]),_:1},8,[`onClick`])])],64))],2))),128)),b.value?(a(),u(p,{key:0},[f(O,{modelValue:S.value,"onUpdate:modelValue":r[1]||=e=>S.value=e,type:`textarea`,autogrow:``,dense:``,dark:``,outlined:``,autofocus:``,class:`comment-textarea q-mt-sm`,placeholder:e.$t(`diff.commentPlaceholder`)},null,8,[`modelValue`,`placeholder`]),v(`div`,we,[f(E,{flat:``,dense:``,size:`sm`,label:e.$t(`common.cancel`),onClick:re},null,8,[`label`]),f(E,{unelevated:``,dense:``,size:`sm`,color:`primary`,disable:!S.value.trim(),label:e.$t(`diff.addComment`),onClick:ie},null,8,[`disable`,`label`])])],64)):n.comments.length>0?(a(),g(E,{key:1,flat:``,dense:``,size:`sm`,icon:`reply`,label:e.$t(`diff.replyComment`),class:`reply-btn q-mt-xs`,onClick:r[2]||=e=>b.value=!0},null,8,[`label`])):h(``,!0)]))}}),[[`__scopeId`,`data-v-9abff76f`]]),Ee={class:`review-draft-panel q-pa-sm`},U={class:`text-caption text-uppercase text-weight-bold text-grey-6 q-mb-sm`,style:{"letter-spacing":`0.05em`}},De={key:0,class:`text-caption text-grey-7 q-pa-sm`},Oe=[`onClick`],W={style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},ke=[`onClick`],Ae={class:`text-grey-6 q-mr-xs`,style:{"font-family":`monospace`}},je={class:`text-grey-3 ellipsis`},Me={class:`global-message-box q-mt-sm`},Ne=j(o({__name:`ReviewDraftPanel`,props:{comments:{},globalMessage:{},submitting:{type:Boolean}},emits:[`updateGlobal`,`jumpToFile`,`jumpToComment`,`submit`],setup(e,{emit:n}){let r=e,i=n,o=y(()=>r.comments.length),s=y(()=>{let e=new Map;for(let t of r.comments){let n=e.get(t.filePath)??[];n.push(t),e.set(t.filePath,n)}for(let t of e.values())t.sort((e,t)=>e.line-t.line||e.createdAt.localeCompare(t.createdAt));return Array.from(e.entries()).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({filePath:e,comments:t}))});function c(e){let t=e.replace(/\n+/g,` `).trim();return t.length>80?`${t.slice(0,77)}…`:t}return(n,r)=>(a(),u(`div`,Ee,[v(`div`,U,m(n.$t(`diff.reviewDraft`)),1),f(ue,{class:`comments-scroll`},{default:l(()=>[s.value.length===0?(a(),u(`div`,De,m(n.$t(`diff.reviewEmpty`)),1)):h(``,!0),(a(!0),u(p,null,t(s.value,e=>(a(),u(`div`,{key:e.filePath,class:`file-group q-mb-sm`},[v(`div`,{class:`file-group-header text-grey-3 cursor-pointer ellipsis`,onClick:t=>i(`jumpToFile`,e.filePath)},[f(w,{name:`description`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),v(`span`,W,m(e.filePath),1),f(M,{label:String(e.comments.length),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`},null,8,[`label`])],8,Oe),(a(!0),u(p,null,t(e.comments,e=>(a(),u(`div`,{key:e.id,class:`draft-line cursor-pointer`,onClick:t=>i(`jumpToComment`,e.filePath,e.line)},[v(`span`,Ae,`L`+m(e.line),1),v(`span`,je,m(c(e.content)),1)],8,ke))),128))]))),128))]),_:1}),v(`div`,Me,[f(O,{"model-value":e.globalMessage,type:`textarea`,autogrow:``,rows:`3`,dense:``,dark:``,outlined:``,placeholder:n.$t(`diff.reviewGlobalPlaceholder`),class:`global-textarea`,"onUpdate:modelValue":r[0]||=e=>i(`updateGlobal`,String(e))},null,8,[`model-value`,`placeholder`]),f(E,{unelevated:``,"no-caps":``,color:`primary`,class:`full-width q-mt-sm`,disable:o.value===0&&!e.globalMessage.trim(),loading:e.submitting,onClick:r[1]||=e=>i(`submit`)},{default:l(()=>[x(m(n.$t(`diff.submitReview`,{n:o.value})),1)]),_:1},8,[`disable`,`loading`])])]))}}),[[`__scopeId`,`data-v-fd6b00c0`]]),Pe={class:`diff-viewer column full-height`},Fe={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},Ie={class:`text-body1 text-weight-medium text-grey-3`},Le={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},Re={class:`text-grey-7`},ze={class:`text-green-4`},Be={class:`text-grey-7`},Ve={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},He={class:`row col no-wrap`,style:{"min-height":`0`}},Ue={key:0,class:`review-draft-panel-wrapper`,style:{width:`300px`,minWidth:`240px`,flexShrink:0,borderRight:`1px solid #2a2a4a`}},We={key:1,class:`text-caption text-grey-8 q-pa-sm`},Ge={key:2,class:`text-caption text-grey-8 q-pa-sm`},Ke={class:`text-grey-4`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},qe={class:`text-grey-3 ellipsis`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Je={key:0,class:`dirty-dot`},Ye={class:`col column`,style:{"min-width":`0`,position:`relative`}},Xe={key:0,class:`col column items-center justify-center`},Ze={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},Qe=`kobo:diff:hideUnchanged`,$e=`kobo:diff:includeUntracked`,et=`kobo:diff:mode`,tt=`kobo:diffViewerFileListWidth`,nt=180,rt=600,it=j(o({__name:`DiffViewer`,props:{workspaceId:{},initialReviewMode:{type:Boolean},compareFrom:{},compareTo:{}},emits:[`close`,`sendToChat`],setup(o,{emit:s}){let d=o,S=s,{t:C}=te(),T=ye(),D=y(()=>!!d.compareFrom&&!!d.compareTo),ne=y(()=>D.value?`${(d.compareFrom??``).slice(0,7)} ↔ ${(d.compareTo??``).slice(0,7)}`:``),A=e([]),j=e(``),N=e(``),P=e(null),F=e(!1),I=e(!1),L=e(null),R=e(`side`),z=e(localStorage.getItem(Qe)!==`0`),B=e(localStorage.getItem($e)===`1`),V=e(`branch`),H=e(d.initialReviewMode||localStorage.getItem(et)===`review`?`review`:`inspect`);c(H,e=>{localStorage.setItem(et,e),e===`review`?Ce():Se()});function Se(){ft();for(let e of J)e.dispose();J=[],K&&K.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`)}function Ce(){K&&(bt(),P.value&&gt(P.value))}let we=ae(),Ee=re(),U=xe(d.workspaceId,{sendChatMessage:async(e,t,n)=>{if(!we.isConnected())throw Error(`WebSocket not connected — cannot send the review`);we.sendChatMessage(e,t,n)}}),De=y(()=>U.draft.value.comments),Oe=y(()=>U.draft.value.globalMessage),W=e(!1);async function ke(){W.value=!0;try{let e=await U.submit(Ee.selectedSessionId??void 0);e.ok?(T.notify({type:`positive`,message:C(`diff.reviewSubmitted`),position:`top`}),S(`close`)):T.notify({type:`negative`,message:C(`diff.reviewSubmitFailed`,{error:e.error??``}),position:`top`})}finally{W.value=!1}}let Ae=y(()=>{let e=new Map;if(H.value!==`review`)return e;for(let t of U.draft.value.comments)e.set(t.filePath,(e.get(t.filePath)??0)+1);return e});function je(e){if(H.value!==`review`||!e)return 0;let t=0;for(let n of U.draft.value.comments)n.filePath.startsWith(`${e}/`)&&t++;return t}function Me(e){return e.nodeKey.startsWith(`dir:`)?e.nodeKey.slice(4):``}function it(e){P.value=e}async function at(e=3e3){let t=Date.now();for(;I.value;){if(Date.now()-t>e)return;await new Promise(e=>setTimeout(e,30))}}async function ot(e,t){P.value!==e&&(P.value=e,await at()),K?.getModifiedEditor().revealLineInCenter(t)}let st=parseInt(localStorage.getItem(tt)??`280`,10),ct=e(Math.min(rt,Math.max(nt,st)));function lt(e){e.preventDefault();let t=e.target.closest(`.diff-viewer`);if(!t)return;let n=t.getBoundingClientRect().left,r=e=>{ct.value=Math.min(rt,Math.max(nt,e.clientX-n))},i=()=>{localStorage.setItem(tt,String(ct.value)),document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}let G=null,K=null,q=[],J=[],Y=e([]),ut=e(null);function dt(){if(!K)return;let e=K.getModifiedEditor();for(let t of Y.value)t.topPx=e.getTopForLineNumber(t.line+1)-e.getScrollTop()-t.heightPx}function ft(){if(!K){Y.value=[];return}K.getModifiedEditor().changeViewZones(e=>{for(let t of Y.value)try{e.removeZone(t.zoneId)}catch{}}),Y.value=[]}function pt(e,t,n){if(!K)return;let r=K.getModifiedEditor(),i=r.getModel()?.getLineCount()??0;if(e<1||e>i)return;let a=document.createElement(`div`);a.style.pointerEvents=`none`;let o=t.length>0?t.length*4+1:0,s=Math.max(6,o+(n?6:0)),c=``;r.changeViewZones(t=>{c=t.addZone({afterLineNumber:e,heightInLines:s,domNode:a})});let l=s*18,u=r.getTopForLineNumber(e+1)-r.getScrollTop()-l;Y.value.push({zoneId:c,placeholderNode:a,line:e,comments:t,transient:n,topPx:u,heightPx:l})}function mt(e){if(!K)return;let t=K.getModifiedEditor(),n=Y.value.filter(t=>t.line===e);n.length!==0&&(t.changeViewZones(e=>{for(let t of n)try{e.removeZone(t.zoneId)}catch{}}),Y.value=Y.value.filter(t=>t.line!==e))}function ht(e,t){mt(t);let n=U.draft.value.comments.filter(n=>n.filePath===e&&n.line===t);n.length!==0&&(n.sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),pt(t,n,!1))}function gt(e){if(!K||H.value!==`review`)return;let t=U.draft.value.comments.filter(t=>t.filePath===e),n=new Map;for(let e of t){let t=n.get(e.line)??[];t.push(e),n.set(e.line,t)}for(let e of n.values())e.sort((e,t)=>e.createdAt.localeCompare(t.createdAt));for(let[e,t]of n)pt(e,t,!1)}function _t(e,t,n){U.addComment({filePath:e,line:t,content:n}),ht(e,t)}function vt(e,t,n,r){U.updateComment(n,r),ht(e,t)}function yt(e,t,n){U.deleteComment(n),ht(e,t)}function bt(){if(!K||H.value!==`review`||!G)return;let e=K.getModifiedEditor(),t=e.getDomNode();t&&t.classList.add(`review-mode-active`),J.push(e.onMouseDown(e=>{if(e.target.type!==3)return;let t=e.target.position?.lineNumber??0;t<1||!P.value||xt(P.value,t)}),e.onDidScrollChange(()=>dt()),e.onDidLayoutChange(()=>dt()))}function xt(e,t){mt(t),pt(t,U.draft.value.comments.filter(n=>n.filePath===e&&n.line===t).sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),!0)}let St=e(``),X=e(``),Z=e(!1),Q=e(!1),Ct=null,$=y(()=>{if(D.value||H.value!==`inspect`)return!1;let e=Ee.workspaces.find(e=>e.id===d.workspaceId);if(!e||e.archivedAt||oe(e.status))return!1;let t=P.value;return(t?A.value.find(e=>e.path===t):null)?.status!==`deleted`});c($,e=>{K?.updateOptions({readOnly:!e})});function wt(){Ct?.(),Ct=null,ft();for(let e of J)e.dispose();if(J=[],!K)return;K.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`);for(let e of q)e.dispose();q=[];let e=K.getModel();K.dispose(),K=null,e?.original?.dispose(),e?.modified?.dispose()}let Tt=y(()=>he(A.value)),Et=y(()=>P.value?`file:${P.value}`:``),Dt=e(``);function Ot(e,t){return e.file?e.file.path.toLowerCase().includes(t.toLowerCase()):!1}let kt=y(()=>{let e=Dt.value.trim().toLowerCase();return e===``?!1:!A.value.some(t=>t.path.toLowerCase().includes(e))});async function At(){F.value=!0;try{let e=D.value?new URLSearchParams({mode:`commits`,from:d.compareFrom,to:d.compareTo}):new URLSearchParams({mode:V.value});!D.value&&V.value===`branch`&&B.value&&e.set(`includeUntracked`,`1`);let t=await fetch(`/api/workspaces/${d.workspaceId}/diff?${e}`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();A.value=n.files,j.value=n.sourceBranch??``,N.value=n.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{F.value=!1}}async function jt(e){if(L.value){I.value=!0;try{G||(self.MonacoEnvironment={getWorker(e,t){return t===`json`?new Worker(new URL(`/assets/json.worker-CCzEOxDx.js`,``+import.meta.url),{type:`module`}):t===`css`||t===`scss`||t===`less`?new Worker(new URL(`/assets/css.worker-BtW9exzf.js`,``+import.meta.url),{type:`module`}):t===`html`||t===`handlebars`||t===`razor`?new Worker(new URL(`/assets/html.worker-Dg1SpGQ4.js`,``+import.meta.url),{type:`module`}):t===`typescript`||t===`javascript`?new Worker(new URL(`/assets/ts.worker-DI5g4t5j.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/editor.worker-DWlYVeeX.js`,``+import.meta.url),{type:`module`})}},G=await ie(()=>import(`./editor.main-DuQa2C4S.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])),G.editor.defineTheme(`kobo-dark`,{base:`vs-dark`,inherit:!0,rules:[],colors:{"editor.background":`#1a1a2e`,"diffEditor.insertedTextBackground":`#22c55e20`,"diffEditor.removedTextBackground":`#ef444420`}}));let t=D.value?`path=${encodeURIComponent(e)}&mode=commits&from=${encodeURIComponent(d.compareFrom)}&to=${encodeURIComponent(d.compareTo)}`:`path=${encodeURIComponent(e)}&mode=${V.value}`,n=await fetch(`/api/workspaces/${d.workspaceId}/diff-file?${t}`,{cache:`no-store`});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i={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`;wt();let a=G.editor.createModel(r.original??``,i),o=G.editor.createModel(r.modified??``,i);K=G.editor.createDiffEditor(L.value,{theme:`kobo-dark`,readOnly:!$.value,originalEditable:!1,renderSideBySide:R.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18,hideUnchangedRegions:{enabled:z.value,contextLineCount:3,minimumLineCount:3,revealLineCount:20}}),K.addCommand(G.KeyMod.CtrlCmd|G.KeyCode.KeyS,()=>{$.value&&Z.value&&!Q.value&&Nt()}),K.setModel({original:a,modified:o}),St.value=r.modifiedSha??``,X.value=r.modified??``,Z.value=!1,G&&(r.modified??``).includes(`\r
7
+ `)}\n\n---\n${s}`}var L=300;function R(e){return`kobo:review-draft:${e}`}function z(e){let t=localStorage.getItem(R(e));if(!t)return{comments:[],globalMessage:``};try{let e=JSON.parse(t);return{comments:Array.isArray(e.comments)?e.comments:[],globalMessage:typeof e.globalMessage==`string`?e.globalMessage:``}}catch{return{comments:[],globalMessage:``}}}function xe(t,n){let r=e(z(t)),i=null;function a(){i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null;try{localStorage.setItem(R(t),JSON.stringify(r.value))}catch(e){console.warn(`[review-draft] persist failed:`,e)}},L)}function o(){if(i!==null){clearTimeout(i),i=null;try{localStorage.setItem(R(t),JSON.stringify(r.value))}catch(e){console.warn(`[review-draft] flush failed:`,e)}}}function s(e){let t=P(e);return r.value.comments.push(t),a(),t}function c(e,t){let n=r.value.comments.find(t=>t.id===e);n&&(n.content=t,a())}function l(e){r.value.comments=r.value.comments.filter(t=>t.id!==e),a()}function u(e){r.value.globalMessage=e,a()}function d(){r.value={comments:[],globalMessage:``},i!==null&&(clearTimeout(i),i=null),localStorage.removeItem(R(t))}async function f(e){if(r.value.comments.length===0&&r.value.globalMessage.trim()===``)return{ok:!1,error:`Draft is empty`};o();let i=I(r.value);try{await n.sendChatMessage(t,i,e)}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}return d(),{ok:!0}}return{draft:r,addComment:s,updateComment:c,deleteComment:l,setGlobalMessage:u,clearDraft:d,flush:o,submit:f}}var B={class:`review-comment-block`},V={class:`comment-actions q-mt-xs`},H=[`innerHTML`],Se={class:`comment-footer`},Ce={class:`comment-time text-caption text-grey-7`},we={class:`comment-actions q-mt-xs`},Te=j(o({__name:`ReviewCommentBlock`,props:{comments:{},startInAddMode:{type:Boolean}},emits:[`add`,`update`,`delete`,`dismissEmpty`],setup(n,{emit:r}){let i=n,o=r,{t:s}=te(),c=ye(),_=e(null),y=e(``),b=e(i.startInAddMode===!0),S=e(``);function C(e){return A(e)}function w(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return s(`common.justNow`);if(n<60)return s(`common.minutesAgo`,{count:n});let r=Math.floor(n/60);return r<24?s(`common.hoursAgo`,{count:r}):s(`common.daysAgo`,{count:Math.floor(r/24)})}function ee(e){_.value=e.id,y.value=e.content}function T(){_.value=null,y.value=``}function D(e){let t=y.value.trim();t&&(o(`update`,e,t),_.value=null,y.value=``)}function ne(e){c.dialog({title:s(`diff.deleteComment`),message:s(`diff.deleteCommentConfirm`),cancel:!0,persistent:!0,ok:{label:s(`diff.deleteComment`),color:`negative`,flat:!1,unelevated:!0}}).onOk(()=>{o(`delete`,e)})}function re(){b.value=!1,S.value=``,i.comments.length===0&&o(`dismissEmpty`)}function ie(){let e=S.value.trim();e&&(o(`add`,e),b.value=!1,S.value=``)}return(e,r)=>(a(),u(`div`,B,[(a(!0),u(p,null,t(n.comments,(t,n)=>(a(),u(`div`,{key:t.id,class:d([`comment-thread-item`,{"with-separator":n>0}])},[_.value===t.id?(a(),u(p,{key:0},[f(O,{modelValue:y.value,"onUpdate:modelValue":r[0]||=e=>y.value=e,type:`textarea`,autogrow:``,dense:``,dark:``,outlined:``,autofocus:``,class:`comment-textarea`,placeholder:e.$t(`diff.commentPlaceholder`)},null,8,[`modelValue`,`placeholder`]),v(`div`,V,[f(E,{flat:``,dense:``,size:`sm`,label:e.$t(`common.cancel`),onClick:T},null,8,[`label`]),f(E,{unelevated:``,dense:``,size:`sm`,color:`primary`,label:e.$t(`common.save`),onClick:e=>D(t.id)},null,8,[`label`,`onClick`])])],64)):(a(),u(p,{key:1},[v(`div`,{class:`comment-content`,innerHTML:C(t.content)},null,8,H),v(`div`,Se,[v(`span`,Ce,m(w(t.createdAt)),1),f(E,{flat:``,dense:``,round:``,size:`xs`,icon:`edit`,color:`grey-5`,onClick:e=>ee(t)},{default:l(()=>[f(k,null,{default:l(()=>[x(m(e.$t(`diff.editComment`)),1)]),_:1})]),_:1},8,[`onClick`]),f(E,{flat:``,dense:``,round:``,size:`xs`,icon:`delete`,color:`grey-5`,onClick:e=>ne(t.id)},{default:l(()=>[f(k,null,{default:l(()=>[x(m(e.$t(`diff.deleteComment`)),1)]),_:1})]),_:1},8,[`onClick`])])],64))],2))),128)),b.value?(a(),u(p,{key:0},[f(O,{modelValue:S.value,"onUpdate:modelValue":r[1]||=e=>S.value=e,type:`textarea`,autogrow:``,dense:``,dark:``,outlined:``,autofocus:``,class:`comment-textarea q-mt-sm`,placeholder:e.$t(`diff.commentPlaceholder`)},null,8,[`modelValue`,`placeholder`]),v(`div`,we,[f(E,{flat:``,dense:``,size:`sm`,label:e.$t(`common.cancel`),onClick:re},null,8,[`label`]),f(E,{unelevated:``,dense:``,size:`sm`,color:`primary`,disable:!S.value.trim(),label:e.$t(`diff.addComment`),onClick:ie},null,8,[`disable`,`label`])])],64)):n.comments.length>0?(a(),g(E,{key:1,flat:``,dense:``,size:`sm`,icon:`reply`,label:e.$t(`diff.replyComment`),class:`reply-btn q-mt-xs`,onClick:r[2]||=e=>b.value=!0},null,8,[`label`])):h(``,!0)]))}}),[[`__scopeId`,`data-v-9abff76f`]]),Ee={class:`review-draft-panel q-pa-sm`},U={class:`text-caption text-uppercase text-weight-bold text-grey-6 q-mb-sm`,style:{"letter-spacing":`0.05em`}},De={key:0,class:`text-caption text-grey-7 q-pa-sm`},Oe=[`onClick`],W={style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},ke=[`onClick`],Ae={class:`text-grey-6 q-mr-xs`,style:{"font-family":`monospace`}},je={class:`text-grey-3 ellipsis`},Me={class:`global-message-box q-mt-sm`},Ne=j(o({__name:`ReviewDraftPanel`,props:{comments:{},globalMessage:{},submitting:{type:Boolean}},emits:[`updateGlobal`,`jumpToFile`,`jumpToComment`,`submit`],setup(e,{emit:n}){let r=e,i=n,o=y(()=>r.comments.length),s=y(()=>{let e=new Map;for(let t of r.comments){let n=e.get(t.filePath)??[];n.push(t),e.set(t.filePath,n)}for(let t of e.values())t.sort((e,t)=>e.line-t.line||e.createdAt.localeCompare(t.createdAt));return Array.from(e.entries()).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({filePath:e,comments:t}))});function c(e){let t=e.replace(/\n+/g,` `).trim();return t.length>80?`${t.slice(0,77)}…`:t}return(n,r)=>(a(),u(`div`,Ee,[v(`div`,U,m(n.$t(`diff.reviewDraft`)),1),f(ue,{class:`comments-scroll`},{default:l(()=>[s.value.length===0?(a(),u(`div`,De,m(n.$t(`diff.reviewEmpty`)),1)):h(``,!0),(a(!0),u(p,null,t(s.value,e=>(a(),u(`div`,{key:e.filePath,class:`file-group q-mb-sm`},[v(`div`,{class:`file-group-header text-grey-3 cursor-pointer ellipsis`,onClick:t=>i(`jumpToFile`,e.filePath)},[f(w,{name:`description`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),v(`span`,W,m(e.filePath),1),f(M,{label:String(e.comments.length),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`},null,8,[`label`])],8,Oe),(a(!0),u(p,null,t(e.comments,e=>(a(),u(`div`,{key:e.id,class:`draft-line cursor-pointer`,onClick:t=>i(`jumpToComment`,e.filePath,e.line)},[v(`span`,Ae,`L`+m(e.line),1),v(`span`,je,m(c(e.content)),1)],8,ke))),128))]))),128))]),_:1}),v(`div`,Me,[f(O,{"model-value":e.globalMessage,type:`textarea`,autogrow:``,rows:`3`,dense:``,dark:``,outlined:``,placeholder:n.$t(`diff.reviewGlobalPlaceholder`),class:`global-textarea`,"onUpdate:modelValue":r[0]||=e=>i(`updateGlobal`,String(e))},null,8,[`model-value`,`placeholder`]),f(E,{unelevated:``,"no-caps":``,color:`primary`,class:`full-width q-mt-sm`,disable:o.value===0&&!e.globalMessage.trim(),loading:e.submitting,onClick:r[1]||=e=>i(`submit`)},{default:l(()=>[x(m(n.$t(`diff.submitReview`,{n:o.value})),1)]),_:1},8,[`disable`,`loading`])])]))}}),[[`__scopeId`,`data-v-fd6b00c0`]]),Pe={class:`diff-viewer column full-height`},Fe={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},Ie={class:`text-body1 text-weight-medium text-grey-3`},Le={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},Re={class:`text-grey-7`},ze={class:`text-green-4`},Be={class:`text-grey-7`},Ve={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},He={class:`row col no-wrap`,style:{"min-height":`0`}},Ue={key:0,class:`review-draft-panel-wrapper`,style:{width:`300px`,minWidth:`240px`,flexShrink:0,borderRight:`1px solid #2a2a4a`}},We={key:1,class:`text-caption text-grey-8 q-pa-sm`},Ge={key:2,class:`text-caption text-grey-8 q-pa-sm`},Ke={class:`text-grey-4`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},qe={class:`text-grey-3 ellipsis`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Je={key:0,class:`dirty-dot`},Ye={class:`col column`,style:{"min-width":`0`,position:`relative`}},Xe={key:0,class:`col column items-center justify-center`},Ze={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},Qe=`kobo:diff:hideUnchanged`,$e=`kobo:diff:includeUntracked`,et=`kobo:diff:mode`,tt=`kobo:diffViewerFileListWidth`,nt=180,rt=600,it=j(o({__name:`DiffViewer`,props:{workspaceId:{},initialReviewMode:{type:Boolean},compareFrom:{},compareTo:{}},emits:[`close`,`sendToChat`],setup(o,{emit:s}){let d=o,S=s,{t:C}=te(),T=ye(),D=y(()=>!!d.compareFrom&&!!d.compareTo),ne=y(()=>D.value?`${(d.compareFrom??``).slice(0,7)} ↔ ${(d.compareTo??``).slice(0,7)}`:``),A=e([]),j=e(``),N=e(``),P=e(null),F=e(!1),I=e(!1),L=e(null),R=e(`side`),z=e(localStorage.getItem(Qe)!==`0`),B=e(localStorage.getItem($e)===`1`),V=e(`branch`),H=e(d.initialReviewMode||localStorage.getItem(et)===`review`?`review`:`inspect`);c(H,e=>{localStorage.setItem(et,e),e===`review`?Ce():Se()});function Se(){ft();for(let e of J)e.dispose();J=[],K&&K.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`)}function Ce(){K&&(bt(),P.value&&gt(P.value))}let we=ae(),Ee=re(),U=xe(d.workspaceId,{sendChatMessage:async(e,t,n)=>{if(!we.isConnected())throw Error(`WebSocket not connected — cannot send the review`);we.sendChatMessage(e,t,n)}}),De=y(()=>U.draft.value.comments),Oe=y(()=>U.draft.value.globalMessage),W=e(!1);async function ke(){W.value=!0;try{let e=await U.submit(Ee.selectedSessionId??void 0);e.ok?(T.notify({type:`positive`,message:C(`diff.reviewSubmitted`),position:`top`}),S(`close`)):T.notify({type:`negative`,message:C(`diff.reviewSubmitFailed`,{error:e.error??``}),position:`top`})}finally{W.value=!1}}let Ae=y(()=>{let e=new Map;if(H.value!==`review`)return e;for(let t of U.draft.value.comments)e.set(t.filePath,(e.get(t.filePath)??0)+1);return e});function je(e){if(H.value!==`review`||!e)return 0;let t=0;for(let n of U.draft.value.comments)n.filePath.startsWith(`${e}/`)&&t++;return t}function Me(e){return e.nodeKey.startsWith(`dir:`)?e.nodeKey.slice(4):``}function it(e){P.value=e}async function at(e=3e3){let t=Date.now();for(;I.value;){if(Date.now()-t>e)return;await new Promise(e=>setTimeout(e,30))}}async function ot(e,t){P.value!==e&&(P.value=e,await at()),K?.getModifiedEditor().revealLineInCenter(t)}let st=parseInt(localStorage.getItem(tt)??`280`,10),ct=e(Math.min(rt,Math.max(nt,st)));function lt(e){e.preventDefault();let t=e.target.closest(`.diff-viewer`);if(!t)return;let n=t.getBoundingClientRect().left,r=e=>{ct.value=Math.min(rt,Math.max(nt,e.clientX-n))},i=()=>{localStorage.setItem(tt,String(ct.value)),document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}let G=null,K=null,q=[],J=[],Y=e([]),ut=e(null);function dt(){if(!K)return;let e=K.getModifiedEditor();for(let t of Y.value)t.topPx=e.getTopForLineNumber(t.line+1)-e.getScrollTop()-t.heightPx}function ft(){if(!K){Y.value=[];return}K.getModifiedEditor().changeViewZones(e=>{for(let t of Y.value)try{e.removeZone(t.zoneId)}catch{}}),Y.value=[]}function pt(e,t,n){if(!K)return;let r=K.getModifiedEditor(),i=r.getModel()?.getLineCount()??0;if(e<1||e>i)return;let a=document.createElement(`div`);a.style.pointerEvents=`none`;let o=t.length>0?t.length*4+1:0,s=Math.max(6,o+(n?6:0)),c=``;r.changeViewZones(t=>{c=t.addZone({afterLineNumber:e,heightInLines:s,domNode:a})});let l=s*18,u=r.getTopForLineNumber(e+1)-r.getScrollTop()-l;Y.value.push({zoneId:c,placeholderNode:a,line:e,comments:t,transient:n,topPx:u,heightPx:l})}function mt(e){if(!K)return;let t=K.getModifiedEditor(),n=Y.value.filter(t=>t.line===e);n.length!==0&&(t.changeViewZones(e=>{for(let t of n)try{e.removeZone(t.zoneId)}catch{}}),Y.value=Y.value.filter(t=>t.line!==e))}function ht(e,t){mt(t);let n=U.draft.value.comments.filter(n=>n.filePath===e&&n.line===t);n.length!==0&&(n.sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),pt(t,n,!1))}function gt(e){if(!K||H.value!==`review`)return;let t=U.draft.value.comments.filter(t=>t.filePath===e),n=new Map;for(let e of t){let t=n.get(e.line)??[];t.push(e),n.set(e.line,t)}for(let e of n.values())e.sort((e,t)=>e.createdAt.localeCompare(t.createdAt));for(let[e,t]of n)pt(e,t,!1)}function _t(e,t,n){U.addComment({filePath:e,line:t,content:n}),ht(e,t)}function vt(e,t,n,r){U.updateComment(n,r),ht(e,t)}function yt(e,t,n){U.deleteComment(n),ht(e,t)}function bt(){if(!K||H.value!==`review`||!G)return;let e=K.getModifiedEditor(),t=e.getDomNode();t&&t.classList.add(`review-mode-active`),J.push(e.onMouseDown(e=>{if(e.target.type!==3)return;let t=e.target.position?.lineNumber??0;t<1||!P.value||xt(P.value,t)}),e.onDidScrollChange(()=>dt()),e.onDidLayoutChange(()=>dt()))}function xt(e,t){mt(t),pt(t,U.draft.value.comments.filter(n=>n.filePath===e&&n.line===t).sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),!0)}let St=e(``),X=e(``),Z=e(!1),Q=e(!1),Ct=null,$=y(()=>{if(D.value||H.value!==`inspect`)return!1;let e=Ee.workspaces.find(e=>e.id===d.workspaceId);if(!e||e.archivedAt||oe(e.status))return!1;let t=P.value;return(t?A.value.find(e=>e.path===t):null)?.status!==`deleted`});c($,e=>{K?.updateOptions({readOnly:!e})});function wt(){Ct?.(),Ct=null,ft();for(let e of J)e.dispose();if(J=[],!K)return;K.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`);for(let e of q)e.dispose();q=[];let e=K.getModel();K.dispose(),K=null,e?.original?.dispose(),e?.modified?.dispose()}let Tt=y(()=>he(A.value)),Et=y(()=>P.value?`file:${P.value}`:``),Dt=e(``);function Ot(e,t){return e.file?e.file.path.toLowerCase().includes(t.toLowerCase()):!1}let kt=y(()=>{let e=Dt.value.trim().toLowerCase();return e===``?!1:!A.value.some(t=>t.path.toLowerCase().includes(e))});async function At(){F.value=!0;try{let e=D.value?new URLSearchParams({mode:`commits`,from:d.compareFrom,to:d.compareTo}):new URLSearchParams({mode:V.value});!D.value&&V.value===`branch`&&B.value&&e.set(`includeUntracked`,`1`);let t=await fetch(`/api/workspaces/${d.workspaceId}/diff?${e}`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();A.value=n.files,j.value=n.sourceBranch??``,N.value=n.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{F.value=!1}}async function jt(e){if(L.value){I.value=!0;try{G||(self.MonacoEnvironment={getWorker(e,t){return t===`json`?new Worker(new URL(`/assets/json.worker-CCzEOxDx.js`,``+import.meta.url),{type:`module`}):t===`css`||t===`scss`||t===`less`?new Worker(new URL(`/assets/css.worker-BtW9exzf.js`,``+import.meta.url),{type:`module`}):t===`html`||t===`handlebars`||t===`razor`?new Worker(new URL(`/assets/html.worker-Dg1SpGQ4.js`,``+import.meta.url),{type:`module`}):t===`typescript`||t===`javascript`?new Worker(new URL(`/assets/ts.worker-DI5g4t5j.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/editor.worker-DWlYVeeX.js`,``+import.meta.url),{type:`module`})}},G=await ie(()=>import(`./editor.main-VujCgCtA.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])),G.editor.defineTheme(`kobo-dark`,{base:`vs-dark`,inherit:!0,rules:[],colors:{"editor.background":`#1a1a2e`,"diffEditor.insertedTextBackground":`#22c55e20`,"diffEditor.removedTextBackground":`#ef444420`}}));let t=D.value?`path=${encodeURIComponent(e)}&mode=commits&from=${encodeURIComponent(d.compareFrom)}&to=${encodeURIComponent(d.compareTo)}`:`path=${encodeURIComponent(e)}&mode=${V.value}`,n=await fetch(`/api/workspaces/${d.workspaceId}/diff-file?${t}`,{cache:`no-store`});if(!n.ok)throw Error(`HTTP ${n.status}`);let r=await n.json(),i={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`;wt();let a=G.editor.createModel(r.original??``,i),o=G.editor.createModel(r.modified??``,i);K=G.editor.createDiffEditor(L.value,{theme:`kobo-dark`,readOnly:!$.value,originalEditable:!1,renderSideBySide:R.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18,hideUnchangedRegions:{enabled:z.value,contextLineCount:3,minimumLineCount:3,revealLineCount:20}}),K.addCommand(G.KeyMod.CtrlCmd|G.KeyCode.KeyS,()=>{$.value&&Z.value&&!Q.value&&Nt()}),K.setModel({original:a,modified:o}),St.value=r.modifiedSha??``,X.value=r.modified??``,Z.value=!1,G&&(r.modified??``).includes(`\r
8
8
  `)&&o.setEOL(G.editor.EndOfLineSequence.CRLF),Ct?.();let s=o.onDidChangeContent(()=>{Z.value=o.getValue()!==X.value});Ct=()=>s.dispose(),Rt(),H.value===`review`&&(bt(),gt(e))}catch(e){console.error(`Failed to load file diff:`,e)}finally{I.value=!1}}}async function Mt(){if(D.value||!K)return{ok:!1,status:0};let e=K.getModel()?.modified;if(!e||!P.value)return{ok:!1,status:0};let t=e.getValue(),n=d.workspaceId,r=P.value,i=St.value;Q.value=!0;try{let a=await fetch(`/api/workspaces/${n}/save-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:r,content:t,baseSha:i})});if(a.status===204){let t=await fetch(`/api/workspaces/${n}/diff-file?path=${encodeURIComponent(r)}&mode=${V.value}`,{cache:`no-store`});if(t.ok){let n=await t.json();St.value=n.modifiedSha??``,X.value=n.modified??``,Z.value=e.getValue()!==X.value}return T.notify({type:`positive`,message:C(`diffViewer.savedAt`),position:`top`,timeout:1200}),{ok:!0}}return a.status===412?{ok:!1,status:412,currentSha:(await a.json().catch(()=>({}))).currentSha}:{ok:!1,status:a.status}}catch(e){return console.error(`[DiffViewer] save failed:`,e),{ok:!1,status:0}}finally{Q.value=!1}}async function Nt(){let e=await Mt();if(!e.ok){if(e.status===412){Pt();return}T.notify({type:`negative`,message:e.status===409?C(`diffViewer.agentRunning`):C(`diffViewer.saveFailed`),position:`top`})}}function Pt(){T.dialog({title:C(`diffViewer.conflict.title`),message:C(`diffViewer.conflict.message`),dark:!0,persistent:!0,ok:{flat:!0,label:C(`diffViewer.conflict.reload`),color:`indigo-4`},cancel:{flat:!0,label:C(`diffViewer.conflict.keep`),color:`grey-5`}}).onOk(async()=>{P.value&&await jt(P.value)})}function Ft(e,t){let n=t===`untracked`;T.dialog({title:C(n?`diff.deleteUntracked`:`diff.rollbackToRemote`),message:C(n?`diff.deleteUntrackedConfirm`:`diff.rollbackConfirm`,{path:e}),cancel:!0,persistent:!0,color:n?`red`:`orange`,ok:{label:C(n?`diff.deleteUntrackedConfirmOk`:`diff.rollbackConfirmOk`),color:n?`red-7`:`orange-7`,flat:!1,unelevated:!0}}).onOk(()=>{It(e)})}async function It(e){try{let t=await fetch(`/api/workspaces/${d.workspaceId}/rollback-file`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})});if(!t.ok){let e=await t.json().catch(()=>({}));T.notify({type:`negative`,message:e.error||C(`diff.rollbackFailed`),position:`top`});return}let n=await t.json().catch(()=>({})),r=C(`diff.rollbackDoneRemote`);n.target===`head`?r=C(`diff.rollbackDoneHead`):n.target===`deleted`&&(r=C(`diff.rollbackDoneDeleted`)),T.notify({type:`positive`,message:r,position:`top`}),await At(),P.value===e&&(A.value.some(t=>t.path===e)?await jt(e):P.value=null)}catch(e){console.error(`rollbackFile failed:`,e),T.notify({type:`negative`,message:C(`diff.rollbackFailed`),position:`top`})}}let Lt=e(!1);function Rt(){if(!K)return;for(let e of q)e.dispose();q=[];let e=K.getModifiedEditor(),t=K.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();Lt.value=!!(e&&!e.isEmpty())});q.push(e)}}function zt(){if(!(!K||!P.value))for(let e of[K.getModifiedEditor(),K.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===K.getModifiedEditor()?`modified`:`original`;S(`sendToChat`,`\`\`\`\n// ${P.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}c(P,async(e,t)=>{if(Z.value&&t){let e=await new Promise(e=>{T.dialog({title:C(`diffViewer.unsavedChanges.title`),message:C(`diffViewer.unsavedChanges.message`),dark:!0,persistent:!0,ok:{flat:!0,label:C(`diffViewer.unsavedChanges.save`),color:`indigo-4`},cancel:{flat:!0,label:C(`diffViewer.unsavedChanges.cancel`),color:`grey-5`}}).onOk(()=>e(`save`)).onCancel(()=>e(`cancel`))});if(e===`save`){let e=await Mt();if(!e.ok){P.value=t,e.status===412?Pt():T.notify({type:`negative`,message:C(`diffViewer.saveFailed`),position:`top`});return}}else if(e===`cancel`){P.value=t;return}}e?jt(e):wt()}),c(R,()=>{K&&K.updateOptions({renderSideBySide:R.value===`side`})}),c(z,e=>{localStorage.setItem(Qe,e?`1`:`0`),K&&K.updateOptions({hideUnchangedRegions:{enabled:e,contextLineCount:3,minimumLineCount:3,revealLineCount:20}})}),c(V,async()=>{let e=P.value;await At(),e&&A.value.some(t=>t.path===e)?jt(e):P.value=null}),c(B,async e=>{localStorage.setItem($e,e?`1`:`0`),await At(),P.value&&!A.value.some(e=>e.path===P.value)&&(P.value=null)});function Bt(e){switch(e){case`added`:return`#4ade80`;case`untracked`:return`#86efac`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return n(At),i(()=>{U.flush(),wt()}),(e,n)=>(a(),u(`div`,Pe,[v(`div`,Fe,[f(w,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),v(`span`,Ie,m(e.$t(`diff.title`)),1),f(M,{label:`${A.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),j.value?(a(),u(`span`,Le,[V.value===`branch`?(a(),u(p,{key:0},[v(`span`,Re,m(j.value),1),f(w,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),v(`span`,ze,m(N.value),1)],64)):(a(),u(p,{key:1},[v(`span`,Be,`origin/`+m(N.value),1),f(w,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),n[8]||=v(`span`,{class:`text-green-4`},`HEAD`,-1)],64))])):h(``,!0),P.value?(a(),u(`span`,Ve,m(P.value),1)):h(``,!0),$.value&&Z.value?(a(),g(E,{key:2,dense:``,flat:``,size:`sm`,"no-caps":``,icon:`save`,label:e.$t(`diffViewer.save`),color:`indigo-4`,loading:Q.value,class:`q-ml-sm`,onClick:Nt},null,8,[`label`,`loading`])):h(``,!0),f(de),D.value?(a(),g(fe,{key:3,dense:``,square:``,color:`grey-9`,"text-color":`grey-4`,icon:`difference`,class:`q-mr-sm`},{default:l(()=>[x(m(ne.value)+` · `+m(e.$t(`diff.commitsReadOnly`)),1)]),_:1})):(a(),g(be,{key:4,modelValue:V.value,"onUpdate:modelValue":n[0]||=e=>V.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:e.$t(`diff.scopeBranch`),value:`branch`},{label:e.$t(`diff.scopeUnpushed`),value:`unpushed`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`])),f(be,{modelValue:H.value,"onUpdate:modelValue":n[1]||=e=>H.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:e.$t(`diff.modeInspect`),value:`inspect`},{label:e.$t(`diff.modeReview`),value:`review`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),f(be,{modelValue:R.value,"onUpdate:modelValue":n[2]||=e=>R.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`]),f(E,{icon:z.value?`unfold_less`:`unfold_more`,dense:``,flat:``,size:`sm`,color:z.value?`indigo-4`:`grey-5`,class:`q-mr-sm`,onClick:n[3]||=e=>z.value=!z.value},{default:l(()=>[f(k,{anchor:`bottom middle`,self:`top middle`,delay:400},{default:l(()=>[x(m(z.value?e.$t(`diff.showUnchanged`):e.$t(`diff.hideUnchanged`)),1)]),_:1})]),_:1},8,[`icon`,`color`]),V.value===`branch`?(a(),g(E,{key:5,icon:`visibility`,dense:``,flat:``,size:`sm`,color:B.value?`indigo-4`:`grey-5`,class:`q-mr-sm`,onClick:n[4]||=e=>B.value=!B.value},{default:l(()=>[f(k,{anchor:`bottom middle`,self:`top middle`,delay:400},{default:l(()=>[x(m(B.value?e.$t(`diff.hideUntracked`):e.$t(`diff.showUntracked`)),1)]),_:1})]),_:1},8,[`color`])):h(``,!0),f(E,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,disable:W.value,onClick:n[5]||=e=>S(`close`)},{default:l(()=>[f(k,null,{default:l(()=>[x(m(e.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1},8,[`disable`])]),f(ee,{dark:``}),v(`div`,He,[H.value===`review`?(a(),u(`div`,Ue,[f(Ne,{comments:De.value,"global-message":Oe.value,submitting:W.value,onUpdateGlobal:_(U).setGlobalMessage,onJumpToFile:it,onJumpToComment:ot,onSubmit:ke},null,8,[`comments`,`global-message`,`submitting`,`onUpdateGlobal`])])):h(``,!0),v(`div`,{class:`diff-file-list-wrapper`,style:b({width:`${ct.value}px`,minWidth:`${nt}px`})},[!F.value&&A.value.length>0?(a(),g(O,{key:0,modelValue:Dt.value,"onUpdate:modelValue":n[6]||=e=>Dt.value=e,dense:``,dark:``,outlined:``,clearable:``,debounce:150,placeholder:e.$t(`diff.searchFiles`),class:`diff-file-search q-ma-xs`},{prepend:l(()=>[f(w,{name:`search`,size:`16px`})]),_:1},8,[`modelValue`,`placeholder`])):h(``,!0),f(ue,{class:`diff-file-list q-pa-xs`,style:{width:`100%`,"border-right":`1px solid #2a2a4a`}},{default:l(()=>[F.value?(a(),g(se,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):A.value.length===0?(a(),u(`div`,We,m(e.$t(`diff.noChanges`)),1)):kt.value?(a(),u(`div`,Ge,m(e.$t(`diff.noFileMatch`)),1)):(a(),g(me,{key:3,nodes:Tt.value,"node-key":`nodeKey`,"label-key":`label`,"children-key":`children`,dark:``,dense:``,"default-expand-all":``,"no-selection-unset":``,selected:Et.value,filter:Dt.value,"filter-method":Ot,class:`diff-tree`,"onUpdate:selected":n[7]||=e=>{typeof e!=`string`||!e.startsWith(`file:`)||(P.value=e.slice(5))}},{"default-header":l(({node:t})=>[t.isFolder?(a(),u(p,{key:0},[f(w,{name:`folder`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),v(`span`,Ke,m(t.label),1),f(M,{label:t.children?_(pe)(t.children):0,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`]),H.value===`review`&&je(Me(t))>0?(a(),g(M,{key:0,label:String(je(Me(t))),color:`grey-7`,"text-color":`grey-3`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])):h(``,!0)],64)):(a(),u(p,{key:1},[f(w,{name:`description`,size:`14px`,style:b({color:Bt(t.file.status)}),class:`q-mr-xs`},{default:l(()=>[f(k,null,{default:l(()=>[x(m(t.file.status),1)]),_:2},1024)]),_:2},1032,[`style`]),v(`span`,qe,m(t.label),1),Z.value&&t.file.path===P.value?(a(),u(`span`,Je,`●`)):h(``,!0),H.value===`review`&&(Ae.value.get(t.file.path)??0)>0?(a(),g(M,{key:1,label:String(Ae.value.get(t.file.path)),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])):h(``,!0),$.value?(a(),g(_e,{key:2,"touch-position":``,"context-menu":``},{default:l(()=>[f(ge,{dense:``,dark:``,style:{"min-width":`220px`}},{default:l(()=>[r((a(),g(ce,{clickable:``,onClick:e=>Ft(t.file.path,t.file.status)},{default:l(()=>[f(le,{avatar:``},{default:l(()=>[f(w,{name:t.file.status===`untracked`?`delete`:`restore`,size:`16px`,color:t.file.status===`untracked`?`red-5`:`orange-5`},null,8,[`name`,`color`])]),_:2},1024),f(le,null,{default:l(()=>[x(m(t.file.status===`untracked`?e.$t(`diff.deleteUntracked`):e.$t(`diff.rollbackToRemote`)),1)]),_:2},1024)]),_:2},1032,[`onClick`])),[[ve]])]),_:2},1024)]),_:2},1024)):h(``,!0)],64))]),_:1},8,[`nodes`,`selected`,`filter`]))]),_:1}),v(`div`,{class:`diff-file-list-resize-handle`,onMousedown:lt},null,32)],4),v(`div`,Ye,[I.value?(a(),u(`div`,Xe,[f(se,{size:`32px`,color:`indigo-4`})])):P.value?h(``,!0):(a(),u(`div`,Ze,m(e.$t(`diff.selectFile`)),1)),v(`div`,{ref_key:`editorWrapperRef`,ref:ut,class:`col`,style:{"min-height":`0`,position:`relative`,overflow:`hidden`}},[v(`div`,{ref_key:`editorContainer`,ref:L,style:{position:`absolute`,inset:`0`}},null,512),(a(!0),u(p,null,t(Y.value,e=>(a(),u(`div`,{key:e.zoneId,class:`review-zone-overlay`,style:b({top:`${e.topPx}px`,height:`${e.heightPx}px`})},[f(Te,{comments:e.comments,"start-in-add-mode":e.transient,onAdd:t=>_t(P.value??``,e.line,t),onUpdate:(t,n)=>vt(P.value??``,e.line,t,n),onDelete:t=>yt(P.value??``,e.line,t),onDismissEmpty:t=>mt(e.line)},null,8,[`comments`,`start-in-add-mode`,`onAdd`,`onUpdate`,`onDelete`,`onDismissEmpty`])],4))),128))],512),Lt.value?(a(),g(E,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:e.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:zt},null,8,[`label`])):h(``,!0)])])]))}}),[[`__scopeId`,`data-v-2318c345`]]);export{it as default};