@loicngr/kobo 1.8.4 → 1.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/README.md +24 -60
- package/dist/shared/codex-models.js +27 -3
- package/package.json +1 -1
- package/src/client/dist/spa/assets/{ActivityFeed-B-N-w5Rb.js → ActivityFeed-NeOuB4hK.js} +1 -1
- package/src/client/dist/spa/assets/{ChangelogPage-zx7lCp-x.js → ChangelogPage-DYhK35Uj.js} +1 -1
- package/src/client/dist/spa/assets/{ClosePopup-BRpX_Dln.js → ClosePopup-SUgOzeRa.js} +1 -1
- package/src/client/dist/spa/assets/{CreatePage-CtdVnG5s.js → CreatePage-0WIKLSHx.js} +1 -1
- package/src/client/dist/spa/assets/{DiffViewer-CpJwmcJ9.js → DiffViewer-JFUB2IjX.js} +3 -3
- package/src/client/dist/spa/assets/{HealthPage-CPrkYvOa.js → HealthPage-CcYmw0qz.js} +1 -1
- package/src/client/dist/spa/assets/{MainLayout-kiLQknmc.js → MainLayout-E8V_3jtB.js} +2 -2
- package/src/client/dist/spa/assets/{QChip-FwfgX3I-.js → QChip-C_hQ8zDG.js} +1 -1
- package/src/client/dist/spa/assets/{QExpansionItem-p5lig24k.js → QExpansionItem-CDMqMrBW.js} +1 -1
- package/src/client/dist/spa/assets/{QScrollArea-BrHNtdCG.js → QScrollArea-5SknWwXm.js} +1 -1
- package/src/client/dist/spa/assets/{QSelect-BUGbllmy.js → QSelect-DdFxTwDW.js} +1 -1
- package/src/client/dist/spa/assets/{QTooltip-BD9D1HVa.js → QTooltip-wdRYvb7_.js} +1 -1
- package/src/client/dist/spa/assets/{SearchPage-Dwi-Xlgl.js → SearchPage-CHcHBahe.js} +1 -1
- package/src/client/dist/spa/assets/{SettingsPage-2jpbUouh.js → SettingsPage-D4WRKgef.js} +1 -1
- package/src/client/dist/spa/assets/{TouchPan-DupH8iiT.js → TouchPan-CGfbFZ29.js} +1 -1
- package/src/client/dist/spa/assets/{WorkspacePage-RQM3Id33.js → WorkspacePage-ZMocf3BW.js} +3 -3
- package/src/client/dist/spa/assets/{build-path-tree-Gmn_Ljbw.js → build-path-tree-B2W0g5KD.js} +1 -1
- package/src/client/dist/spa/assets/{cssMode-B7C4cbyr.js → cssMode-DtrJq-En.js} +1 -1
- package/src/client/dist/spa/assets/{documents-B4fS1AKZ.js → documents-BbpzccXz.js} +1 -1
- package/src/client/dist/spa/assets/{editor.api2-BEDcOHdz.js → editor.api2-CinEgB5d.js} +1 -1
- package/src/client/dist/spa/assets/{editor.main-ds11Fcak.js → editor.main-BRcMV3rU.js} +2 -2
- package/src/client/dist/spa/assets/{expand-template-CVyd1bxK.js → expand-template-BT_OMXXZ.js} +1 -1
- package/src/client/dist/spa/assets/{formatters-CJbAt2Mu.js → formatters-D24DKtIv.js} +1 -1
- package/src/client/dist/spa/assets/{freemarker2-CsVyqCrh.js → freemarker2-CjI8M1Pj.js} +1 -1
- package/src/client/dist/spa/assets/{handlebars-9TD9qTMp.js → handlebars-BrrbROQJ.js} +1 -1
- package/src/client/dist/spa/assets/{html-B0pzvK6l.js → html-Dt61THwD.js} +1 -1
- package/src/client/dist/spa/assets/{htmlMode-BNHxBP74.js → htmlMode-tb4PrwZE.js} +1 -1
- package/src/client/dist/spa/assets/i18n-D5hQoijX.js +1 -0
- package/src/client/dist/spa/assets/{index-DRkpEFKl.js → index-DY-0-pzs.js} +7 -7
- package/src/client/dist/spa/assets/{javascript-BnNLP9qT.js → javascript-CbNLIl6K.js} +1 -1
- package/src/client/dist/spa/assets/{jsonMode-B296XtvX.js → jsonMode-9OB1NWBc.js} +1 -1
- package/src/client/dist/spa/assets/{kobo-commands-BW_aGHfH.js → kobo-commands-BAFoc4XT.js} +1 -1
- package/src/client/dist/spa/assets/{layout-DaXKrWc-.js → layout-C_Qy9YRS.js} +1 -1
- package/src/client/dist/spa/assets/{liquid-Ct1nP3ps.js → liquid-2Xnhq08h.js} +1 -1
- package/src/client/dist/spa/assets/{lspLanguageFeatures-BVnfMLUC.js → lspLanguageFeatures-Cd0LZuqI.js} +1 -1
- package/src/client/dist/spa/assets/{mdx-BYShqwXi.js → mdx-BcFCQf8z.js} +1 -1
- package/src/client/dist/spa/assets/{monaco.contribution-BqpwqnRw.js → monaco.contribution-BFELAVjU.js} +2 -2
- package/src/client/dist/spa/assets/{network-auth-BaLDs74-.js → network-auth-HNTN0Fqx.js} +1 -1
- package/src/client/dist/spa/assets/permissionModes-DKmBv8m2.js +1 -0
- package/src/client/dist/spa/assets/{project-color-C1cADhCz.js → project-color-CnA7qsFT.js} +1 -1
- package/src/client/dist/spa/assets/{python-DOG2VwjV.js → python-mxDs2yew.js} +1 -1
- package/src/client/dist/spa/assets/{razor-CWtKYbeq.js → razor-Dwp1v9Mw.js} +1 -1
- package/src/client/dist/spa/assets/{render-chat-markdown-Bxde8duq.js → render-chat-markdown-C66I22rl.js} +1 -1
- package/src/client/dist/spa/assets/{tsMode-JdYs8yvB.js → tsMode-DmV0n4aC.js} +1 -1
- package/src/client/dist/spa/assets/{typescript-Pry6QqCJ.js → typescript-CPU1RgLJ.js} +1 -1
- package/src/client/dist/spa/assets/{use-onboarding-CR5TvnD3.js → use-onboarding-ockQMKKz.js} +1 -1
- package/src/client/dist/spa/assets/{use-quasar-Bs5QmJMV.js → use-quasar-CCWojS5V.js} +1 -1
- package/src/client/dist/spa/assets/{workers-C8y4UFZ9.js → workers-BUpbuYJJ.js} +1 -1
- package/src/client/dist/spa/assets/{xml-B1O2QccM.js → xml-BCZKO1fH.js} +1 -1
- package/src/client/dist/spa/assets/{yaml-BiayGfV2.js → yaml-DT8wC8CS.js} +1 -1
- package/src/client/dist/spa/index.html +1 -1
- package/src/client/dist/spa/assets/i18n-CMH5j9Af.js +0 -1
- package/src/client/dist/spa/assets/permissionModes-CoMkeI-P.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,11 @@ 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.5
|
|
8
|
+
|
|
9
|
+
- feat: add gpt-5.6 codex model family and gpt-5.2 to catalogue
|
|
10
|
+
- docs: overhaul README and split contributor guide into CONTRIBUTING.md
|
|
11
|
+
|
|
7
12
|
## 1.8.4
|
|
8
13
|
|
|
9
14
|
- feat: add Claude Sonnet 5 to the model catalogue
|
package/README.md
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
Kōbō runs multiple coding agents in parallel, each isolated in its own git worktree, branch, and dev server. A single Vue dashboard streams output, tasks, git state, and quota usage across every workspace.
|
|
10
10
|
|
|
11
|
+

|
|
12
|
+
|
|
11
13
|
> [!NOTE]
|
|
12
14
|
> Active development on `develop`. Forward-only migrations and timestamped pre-migration backups keep upgrades safe.
|
|
13
15
|
|
|
@@ -15,16 +17,24 @@ Kōbō runs multiple coding agents in parallel, each isolated in its own git wor
|
|
|
15
17
|
|
|
16
18
|
- **Isolated worktrees**: each workspace is a dedicated git worktree on its own branch, so parallel sessions never collide.
|
|
17
19
|
- **Two agent engines**: Claude Code (via `@anthropic-ai/claude-agent-sdk`) and OpenAI Codex (via `codex app-server`), chosen per workspace.
|
|
18
|
-
- **Live chat**: streaming text, reasoning blocks, inline Edit/Write diffs, per-turn cards, infinite scrollback. `/` autocompletes skills and commands, `@` fuzzy-autocompletes worktree file paths, and you can export any workspace's session events to CSV.
|
|
19
|
-
- **
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
- **
|
|
20
|
+
- **Live chat**: streaming text, reasoning blocks, inline Edit/Write diffs, per-turn cards, a compaction-in-progress indicator, infinite scrollback. `/` autocompletes skills and commands, `@` fuzzy-autocompletes worktree file paths, and you can export any workspace's session events to CSV.
|
|
21
|
+
- **Full MCP toolset (`kobo-tasks`)**: a per-workspace MCP server the agent uses for far more than tasks — task/acceptance-criteria CRUD, starting/stopping the dev server and reading its logs, a unified `get_ticket` (Notion or Sentry), searching past conversations across every workspace, per-session token/cost usage, and a `.ai/thoughts` decision log. Native Claude Code Task tools complement it for lightweight sub-agent coordination. See [`AGENTS.md`](./AGENTS.md) for the full tool list.
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
- **Git panel**: a Monaco-based diff viewer with **inline file editing** (edit the right-hand panel directly, save with `Ctrl/Cmd+S`, conflict-guarded via sha precondition), inline conflict resolution, and `Sync` / `Push` / `Open PR` / `Change PR base` / `Change source branch`. Multi-forge: GitHub (`gh`), GitLab (`glab`), or no forge, auto-detected from the remote and overridable per project.
|
|
25
|
+
|
|
26
|
+

|
|
27
|
+
- **Dev server panel**: start, stop, and tail logs for a workspace's dev server (Docker or npm) straight from the Tools panel — no need to leave the UI.
|
|
28
|
+
- **Attention indicators**: workspace cards surface CI failures, review-requested changes, and a conflict-aware **ready-to-merge** badge, plus a one-click **Fix CI** button that spawns a fix workspace automatically.
|
|
29
|
+
- **Interactive Q&A**: an agent can pause mid-session to ask a clarifying question through the UI; the workspace surfaces under "Needs Attention" until you answer.
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
- **Auto-loop**: an opt-in mode that walks the task list, spawning a fresh session per task and stopping once there's nothing left to do, progress stalls, an error occurs, or the agent needs input from you.
|
|
23
33
|
- **Quota-aware**: 5-hour / 7-day Claude usage and Codex rate-limit buckets sit in the footer, and sessions auto-resume after a rate-limit reset.
|
|
24
|
-
- **Scheduled wakeups**: the agent schedules a one-shot wake-up via the `
|
|
34
|
+
- **Scheduled wakeups**: the agent schedules a one-shot wake-up via the `schedule_wakeup` MCP tool. Kōbō persists it across restarts, shows a live countdown, and re-invokes the agent with the stored prompt at the chosen time.
|
|
25
35
|
- **Cron schedules**: recurring per-workspace triggers the agent registers through MCP tools (`cron_create` / `cron_delete` / `cron_list`). Each tick resumes the workspace session (skipped if already active), and schedules are re-armed at boot with skip-missed semantics.
|
|
26
|
-
- **Lifecycle scripts**: shell scripts run automatically at key moments
|
|
27
|
-
- **Disk-space purge**: free a merged workspace's disk space without losing its chat history
|
|
36
|
+
- **Lifecycle scripts**: shell scripts run automatically at key moments — **setup** (worktree created), **cleanup** (session ended), **archive** (workspace archived). Configure them globally or per project, with their output streamed into the chat.
|
|
37
|
+
- **Disk-space purge**: free a merged workspace's disk space without losing its chat history — see [below](#disk-space-purge).
|
|
28
38
|
- **Optional integrations**: Notion (import missions), Sentry (fix from issue URL), local voice transcription (whisper.cpp).
|
|
29
39
|
|
|
30
40
|
## Quick start
|
|
@@ -43,17 +53,7 @@ SERVER_PORT=9997 PORT=9998 npx @loicngr/kobo@latest
|
|
|
43
53
|
|
|
44
54
|
Open <http://localhost:3000> (or whichever port you picked). Data is persisted under `~/.config/kobo/` (override via `KOBO_HOME`).
|
|
45
55
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
git clone https://github.com/loicngr/Kobo.git
|
|
50
|
-
cd Kobo
|
|
51
|
-
npm install
|
|
52
|
-
(cd src/client && npm install)
|
|
53
|
-
npm run dev:all # backend :3300 + client :8080
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
A production-installed Kōbō (`npx @loicngr/kobo`) and a dev server can run side by side, since they use separate data directories.
|
|
56
|
+
Want to run from source or contribute? See [`CONTRIBUTING.md`](./CONTRIBUTING.md).
|
|
57
57
|
|
|
58
58
|
## Configuration
|
|
59
59
|
|
|
@@ -65,6 +65,7 @@ The most common knobs:
|
|
|
65
65
|
| `SERVER_PORT` | none | Preferred override for the server port; takes precedence over `PORT` |
|
|
66
66
|
| `KOBO_HOME` | `~/.config/kobo` | Data directory (SQLite, settings, voice models) |
|
|
67
67
|
| `NOTION_API_TOKEN` | none | Notion integration token |
|
|
68
|
+
| `ANTHROPIC_API_KEY` | none | Claude Code engine credential (alternative to `claude /login`) |
|
|
68
69
|
| `OPENAI_API_KEY` | none | Codex engine credential (alternative to `codex login`) |
|
|
69
70
|
|
|
70
71
|
Global and per-project settings (worktree path, dev server commands, E2E framework, prompt templates, git conventions, branch prefixes, lifecycle scripts, task prompt) are edited in **Settings** at runtime. Per-project values inherit from the global ones when left empty.
|
|
@@ -84,29 +85,8 @@ A merged workspace is automatically archived, but its worktree folder usually ca
|
|
|
84
85
|
|
|
85
86
|
- **Manual**: workspace context menu → *Free disk space (delete worktree)*. The worktree is removed; the chat history and PR metadata stay in the database.
|
|
86
87
|
- **Automatic**: **Settings → Worktrees → Auto-purge worktree on PR merged**. When the pr-watcher sees the OPEN → MERGED transition, it archives **and** purges.
|
|
87
|
-
- **Restore**: recreate the folder yourself (`gh pr checkout <pr>` or `git worktree add <path> <branch>`). The pr-watcher detects the directory reappearing within 30 seconds and re-activates the workspace automatically
|
|
88
|
-
|
|
89
|
-
### Avoiding permission errors during purge
|
|
90
|
-
|
|
91
|
-
Docker containers usually write as `root`, so files in `node_modules` / `vendor` end up root-owned on the host. Plain `rm -rf` (which Kōbō uses under the hood) then fails with `EACCES` / `EPERM`. Pick one of these strategies depending on your setup:
|
|
92
|
-
|
|
93
|
-
1. **Best: run your container as the host user.** Add a `USER` directive in your `Dockerfile`, or set `user: "${UID}:${GID}"` in `docker-compose.yml` with `UID`/`GID` exported in your shell. No more root-owned files, and nothing extra to do.
|
|
94
|
-
2. **Preventive ACL on the worktrees root.** On ext4 / btrfs / xfs with a regular Docker bind mount, a default ACL grants your user access to every file created later:
|
|
95
|
-
```bash
|
|
96
|
-
setfacl -d -m u:$(whoami):rwX <worktrees-root> # e.g. ~/.worktrees
|
|
97
|
-
```
|
|
98
|
-
Caveats: does **not** work on named Docker volumes (use a bind mount), filesystems without ACL support (NTFS, exFAT, tmpfs), strict SELinux with `:Z`, or with Docker `userns-remap`.
|
|
99
|
-
3. **Unblock an already-broken worktree** (existing root-owned files):
|
|
100
|
-
```bash
|
|
101
|
-
# Option A — recursive ACL (keeps ownership intact, just adds your user)
|
|
102
|
-
sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .
|
|
103
|
-
|
|
104
|
-
# Option B — take ownership outright (simpler, loses the "root-from-container" trace)
|
|
105
|
-
sudo chown -R $(whoami):$(whoami) .
|
|
106
|
-
```
|
|
107
|
-
Run from inside the worktree folder, or directly on your worktrees root (e.g. `~/.worktrees/`) to cover all existing and future workspaces at once.
|
|
108
|
-
|
|
109
|
-
When a purge does fail, Kōbō surfaces a toast with a copy-pasteable recovery command and a `git worktree prune` follow-up. The same guide is wired into **Settings → Worktrees → How purge works** for in-app reference.
|
|
88
|
+
- **Restore**: recreate the folder yourself (`gh pr checkout <pr>` or `git worktree add <path> <branch>`). The pr-watcher detects the directory reappearing within 30 seconds and re-activates the workspace automatically. No UI action needed.
|
|
89
|
+
- **Permission errors**: if removal hits `EACCES`/`EPERM` (common with Docker containers writing as `root`), Kōbō first tries to auto-recover by `chown`-ing the worktree from a throwaway Docker container. If that isn't possible, it shows a toast with a copy-pasteable manual recovery command. Full troubleshooting (ACL setup, Docker `USER` directive, manual `chown`) is in [`CONFIGURATION.md`](./CONFIGURATION.md#permission-errors-during-purge).
|
|
110
90
|
|
|
111
91
|
## Optional integrations
|
|
112
92
|
|
|
@@ -165,30 +145,14 @@ src/
|
|
|
165
145
|
├── client/ # Vue 3 + Quasar SPA
|
|
166
146
|
├── mcp-server/ # kobo-tasks MCP server, spawned per workspace
|
|
167
147
|
├── shared/ # types shared backend ↔ frontend
|
|
168
|
-
└── __tests__/ # Vitest suite
|
|
148
|
+
└── __tests__/ # Vitest suite, backend + client, thousands of tests
|
|
169
149
|
```
|
|
170
150
|
|
|
171
151
|
[`AGENTS.md`](./AGENTS.md) covers the data model, WebSocket protocol, engine contracts, MCP tool surface, migration discipline, i18n rules, and contribution guidelines.
|
|
172
152
|
|
|
173
|
-
## Scripts
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
npm run dev:all # backend (:3300) + client (:8080)
|
|
177
|
-
npm run build # production build (client + server)
|
|
178
|
-
npm start # run the compiled server
|
|
179
|
-
npm test # backend vitest suite
|
|
180
|
-
npm run test:client # client vitest suite
|
|
181
|
-
npm run lint # biome check (lint + format)
|
|
182
|
-
make ci # full CI pipeline (audit + lint + tsc + tests)
|
|
183
|
-
```
|
|
184
|
-
|
|
185
153
|
## Contributing
|
|
186
154
|
|
|
187
|
-
PRs welcome.
|
|
188
|
-
|
|
189
|
-
## Release
|
|
190
|
-
|
|
191
|
-
Releases are cut from `main`. Bump `package.json` on `develop`, merge into `main`, push. The release workflow builds, tests, publishes to npm, tags `v<version>`, and creates the GitHub Release. It fails early if the version or tag already exists.
|
|
155
|
+
PRs welcome. See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for the from-source setup, scripts, and release process, and [`AGENTS.md`](./AGENTS.md) for code conventions and the database-migration discipline.
|
|
192
156
|
|
|
193
157
|
## License
|
|
194
158
|
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* editing the workspace `model` field directly. This list reflects the
|
|
6
6
|
* recommended set surfaced in the create-workspace selector.
|
|
7
7
|
*
|
|
8
|
-
* Auth caveat: `gpt-5.5`
|
|
9
|
-
* ChatGPT (Plus/Pro/Team/Enterprise).
|
|
10
|
-
* and below.
|
|
8
|
+
* Auth caveat: the `gpt-5.6-*` family and `gpt-5.5` are currently only
|
|
9
|
+
* reachable when authenticated via ChatGPT (Plus/Pro/Team/Enterprise).
|
|
10
|
+
* API-key auth is limited to `gpt-5.4` and below.
|
|
11
11
|
*/
|
|
12
12
|
export const CODEX_MODELS = [
|
|
13
13
|
{
|
|
@@ -16,6 +16,24 @@ export const CODEX_MODELS = [
|
|
|
16
16
|
i18nLabelKey: 'model.auto',
|
|
17
17
|
i18nDescriptionKey: 'model.autoDescription',
|
|
18
18
|
},
|
|
19
|
+
{
|
|
20
|
+
id: 'gpt-5.6-sol',
|
|
21
|
+
label: 'GPT-5.6 Sol',
|
|
22
|
+
i18nLabelKey: 'model.gpt56sol',
|
|
23
|
+
i18nDescriptionKey: 'model.gpt56solDescription',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: 'gpt-5.6-terra',
|
|
27
|
+
label: 'GPT-5.6 Terra',
|
|
28
|
+
i18nLabelKey: 'model.gpt56terra',
|
|
29
|
+
i18nDescriptionKey: 'model.gpt56terraDescription',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'gpt-5.6-luna',
|
|
33
|
+
label: 'GPT-5.6 Luna',
|
|
34
|
+
i18nLabelKey: 'model.gpt56luna',
|
|
35
|
+
i18nDescriptionKey: 'model.gpt56lunaDescription',
|
|
36
|
+
},
|
|
19
37
|
{
|
|
20
38
|
id: 'gpt-5.5',
|
|
21
39
|
label: 'GPT-5.5',
|
|
@@ -34,6 +52,12 @@ export const CODEX_MODELS = [
|
|
|
34
52
|
i18nLabelKey: 'model.gpt54mini',
|
|
35
53
|
i18nDescriptionKey: 'model.gpt54miniDescription',
|
|
36
54
|
},
|
|
55
|
+
{
|
|
56
|
+
id: 'gpt-5.2',
|
|
57
|
+
label: 'GPT-5.2',
|
|
58
|
+
i18nLabelKey: 'model.gpt52',
|
|
59
|
+
i18nDescriptionKey: 'model.gpt52Description',
|
|
60
|
+
},
|
|
37
61
|
{
|
|
38
62
|
id: 'gpt-5.3-codex',
|
|
39
63
|
label: 'GPT-5.3 Codex',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.5",
|
|
4
4
|
"description": "Kōbō — multi-workspace agent manager for Claude Code. Orchestrates isolated git worktrees with dev servers, Notion integration, and MCP tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{$ 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-JZnIeD9D.js";import{l as C,t as w}from"./QIcon-CfOEsLsF.js";import{B as T,C as E,N as D,S as O,d as k,p as A,x as j,z as ee}from"./index-
|
|
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-JZnIeD9D.js";import{l as C,t as w}from"./QIcon-CfOEsLsF.js";import{B as T,C as E,N as D,S as O,d as k,p as A,x as j,z as ee}from"./index-DY-0-pzs.js";import{t as te}from"./QSpinnerDots-BOryc_9y.js";import{t as M}from"./QTooltip-wdRYvb7_.js";import{t as N}from"./QExpansionItem-CDMqMrBW.js";import{t as ne}from"./QScrollArea-5SknWwXm.js";import{t as re}from"./documents-BbpzccXz.js";import{i as ie,n as ae,t as P}from"./render-chat-markdown-C66I22rl.js";import{t as F}from"./_plugin-vue_export-helper-BDNMzG2s.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=re(),r=k(),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(()=>P(t.item.text));return(t,l)=>r.value?(i(),c(`div`,de,[a.value?(i(),m(N,{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-JZnIeD9D.js";import{N as m,gt as h,mt as g,s as _}from"./index-
|
|
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-JZnIeD9D.js";import{N as m,gt as h,mt as g,s as _}from"./index-DY-0-pzs.js";import{t as v}from"./render-chat-markdown-C66I22rl.js";import{t as y}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as b}from"./QSpace-e68xsYE1.js";import{t as x}from"./QChip-C_hQ8zDG.js";import{t as S}from"./QPage-B-ixPPKx.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=_(),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(g,{key:t.version,dark:``,flat:``,bordered:``},{default:a(()=>[s(h,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 +1 @@
|
|
|
1
|
-
import{F as e,b as t}from"./QIcon-CfOEsLsF.js";import{nt as n,rt as r}from"./index-
|
|
1
|
+
import{F as e,b as t}from"./QIcon-CfOEsLsF.js";import{nt as n,rt as r}from"./index-DY-0-pzs.js";var i={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},a=Object.keys(i);i.all=!0;function o(e){let t={};for(let n of a)e[n]&&(t[n]=!0);return Object.keys(t).length===0?i:(t.horizontal?t.left=t.right=!0:t.left&&t.right&&(t.horizontal=!0),t.vertical?t.up=t.down=!0:t.up&&t.down&&(t.vertical=!0),t.horizontal&&t.vertical&&(t.all=!0),t)}var s=[`INPUT`,`TEXTAREA`];function c(e,t){return t.event===void 0&&e.target!==void 0&&!e.target.draggable&&typeof t.handler==`function`&&!s.includes(e.target.nodeName.toUpperCase())&&(e.qClonedBy===void 0||!e.qClonedBy.includes(t.uid))}function l(e){return e===!1?0:e===!0||e===void 0?1:Number.parseInt(e,10)||0}var u=e({name:`close-popup`,beforeMount(e,{value:i}){let a={depth:l(i),handler(t){a.depth!==0&&setTimeout(()=>{let i=r(e);i!==void 0&&n(i,t,a.depth)})},handlerKey(e){t(e,13)&&a.handler(e)}};e.__qclosepopup=a,e.addEventListener(`click`,a.handler),e.addEventListener(`keyup`,a.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=l(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{o as n,c as r,u as t};
|
|
@@ -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 o,W as s,_ as c,at as te,b as l,c as ne,ct as u,g as d,h as f,it as p,k as re,m,n as ie,o as ae,ot as oe,p as h,s as g,w as se,y as _}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{t as v}from"./QIcon-CfOEsLsF.js";import{t as ce}from"./QSeparator-BR7sWTf2.js";import{t as le}from"./QInput-DtrweK8o.js";import{E as ue,N as y,d as de,l as fe,s as pe,x as me,z as he}from"./index-DRkpEFKl.js";import{t as ge}from"./QSpinnerDots-BOryc_9y.js";import{n as b,r as x,t as _e}from"./use-quasar-Bs5QmJMV.js";import{t as S,u as C}from"./QSelect-BUGbllmy.js";import{t as w}from"./QTooltip-BD9D1HVa.js";import{t as ve}from"./QExpansionItem-p5lig24k.js";import{t as ye}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as be}from"./QSpace-e68xsYE1.js";import{i as xe}from"./project-color-C1cADhCz.js";import{t as Se}from"./QPage-B-ixPPKx.js";import{a as Ce,i as we,n as Te,r as Ee,t as De}from"./expand-template-CVyd1bxK.js";import{i as Oe,r as ke,t as Ae}from"./permissionModes-CoMkeI-P.js";var je=`kobo:create-page-prefs`;function T(){try{let e=localStorage.getItem(je);return e===null?void 0:JSON.parse(e)}catch{return}}function Me(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ne(){let e=T();if(!Me(e))return{};let t={};return typeof e.projectPath==`string`&&e.projectPath.length>0&&(t.projectPath=e.projectPath),typeof e.autoLoop==`boolean`&&(t.autoLoop=e.autoLoop),t}function Pe(e){try{localStorage.setItem(je,JSON.stringify(e))}catch{}}var Fe={class:`create-inner`},Ie={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Le={class:`create-card rounded-borders`},Re={class:`card-top-bar row items-center q-px-md q-py-xs`},ze={class:`model-badge cursor-default row items-center q-gutter-xs`},Be={class:`text-indigo-3 text-weight-medium text-caption`},Ve={key:0,class:`notion-url-wrap`},He={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ue={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},We={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ge={class:`text-caption text-grey-4 q-mb-sm`},Ke={class:`row q-gutter-sm`},qe={class:`peek-card-text`},Je={class:`peek-card-title`},Ye={class:`peek-card-desc`},Xe={class:`peek-card-text`},Ze={class:`peek-card-title`},Qe={class:`peek-card-desc`},$e={key:0,class:`sentry-url-wrap`},et={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},tt={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},nt={class:`card-name-wrap`},rt={class:`card-textarea-wrap`},it={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},at={key:0,class:`row items-center text-caption text-amber-6`},ot={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},st={class:`q-pa-sm manual-section-body`},ct={class:`row items-center q-gutter-sm q-mb-sm`},lt={class:`col text-caption text-grey-4`},ut={class:`q-pa-sm manual-section-body`},dt={class:`row items-center q-gutter-sm q-mb-sm`},ft={class:`col text-caption text-grey-4`},pt={class:`card-bottom-bar`},mt={class:`row q-col-gutter-xs q-px-xs`},ht={key:0,class:`col-12 col-sm-6 col-md-3`},gt={class:`bottom-select-label row items-center no-wrap`},_t={class:`col-12 col-sm-6 col-md-3`},vt={class:`bottom-select-label row items-center no-wrap`},yt={class:`col-12 col-sm-6 col-md-3`},bt={class:`bottom-select-label row items-center no-wrap`},xt={class:`col-12 col-md-3`},St={class:`bottom-select-label row items-center no-wrap`},Ct={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},wt={class:`col-12 col-md-auto`},Tt={class:`col-12 col-md-auto`},Et={class:`col-12 col-md-auto`},Dt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Ot={class:`col-12 col-md-4`},kt={key:0,class:`col-12 col-md-4`},At={class:`bottom-select-label row items-center no-wrap`},jt={key:1,class:`col-12 col-md-4`},Mt={class:`bottom-select-label row items-center no-wrap`},Nt={class:`col-12 col-md-4`},Pt={class:`bottom-select-label row items-center no-wrap`},Ft={class:`row justify-center q-px-sm q-py-sm`},It={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Lt=6e4,E=ye(ee({__name:`CreatePage`,setup(ee){function ye(e){return e.disabled===!0}let je=pe(),T=_e(),Me=de(),E=me(),{t:D}=he(),Rt=e([]),zt=e(``),O=e(``),Bt=e(null),Vt=e(``),k=e(!1),A=e(!1),Ht=e(null),Ut=e(null),Wt=e([]),Gt=e(null),j=e(``),M=e(!1),N=e(`claude-opus-4-8`),P=e(`auto`),F=e(``),I=e(null),L=e(`feature`),R=e(!1),Kt=h(()=>E.global.voiceEnabled),qt=e([]),z=e(`claude-code`),Jt=h(()=>qt.value.find(e=>e.id===z.value)),Yt=h(()=>qt.value.map(e=>({value:e.id,label:e.displayName}))),Xt=h(()=>E.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),Zt=[`plan`,`bypass`,`strict`,`interactive`];function Qt(e,t){let n=e?E.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Zt.includes(r))return r;let i=E.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Zt.includes(i)?i:n?.dangerouslySkipPermissions??E.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let B=e(Qt(``,z.value)),$t=h(()=>{switch(B.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),en=h(()=>(Ae[z.value]??Zt).map(e=>({value:e,label:D(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),V=e([]),tn=e([]),nn=e(!1),rn=e(!1);function an(e,t){t(()=>{tn.value=e?V.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):V.value})}let on=ue();function sn(){return Bt.value?.nativeEl??null}let{showSkills:cn,selectedSkillIndex:H,groupedDropdown:ln,flatDropdown:U,fetchSkills:un,detectSlashFragment:dn,replaceFragmentWith:fn,closeDropdown:pn}=we(O,sn,{excludeKoboCommands:!0});un(),o(O,async()=>{await re(),await dn()});function mn(e){if(e.type===`template`){let t=on.templates.find(t=>t.slug===e.name);if(!t)return;fn(Te(t.content,De({workspace:null,gitStats:null,sessionName:null}))),pn();return}fn(`/${e.name} `),pn()}function hn(e){!cn.value||U.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),H.value=(H.value+1)%U.value.length):e.key===`ArrowUp`?(e.preventDefault(),H.value=(H.value-1+U.value.length)%U.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),mn(U.value[H.value])):e.key===`Escape`&&(e.preventDefault(),pn()))}async function gn(){if(!(!Kt.value||k.value||A.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){T.notify({type:`warning`,message:D(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Ut.value=e,Wt.value=[];let t=MediaRecorder.isTypeSupported(`audio/webm`)?`audio/webm`:``,n=t?new MediaRecorder(e,{mimeType:t}):new MediaRecorder(e);n.ondataavailable=e=>{e.data&&e.data.size>0&&Wt.value.push(e.data)},n.start(),Ht.value=n,k.value=!0,Gt.value=setTimeout(()=>{W(),T.notify({type:`info`,message:D(`voice.maxDurationReached`),position:`top`,timeout:3500})},Lt)}catch{T.notify({type:`negative`,message:D(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function W(){if(!k.value)return;let e=Ht.value;if(!e)return;k.value=!1,A.value=!0,Gt.value&&=(clearTimeout(Gt.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Wt.value,{type:`audio/webm`})),e.stop()});try{if(t.size===0)throw Error(`MIC_AUDIO_INVALID`);let e=new FormData;e.append(`audio`,t,`voice.webm`),e.append(`language`,E.global.voiceLanguage||`auto`);let n=await fetch(`/api/voice/transcribe`,{method:`POST`,body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(String(e.code??e.error??`HTTP_${n.status}`))}let r=await n.json();r.text?.trim()&&(O.value=O.value?`${O.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;T.notify({type:`negative`,message:D({VOICE_DISABLED:`voice.errorDisabled`,MODEL_NOT_CONFIGURED:`voice.errorModelMissing`,MODEL_NOT_INSTALLED:`voice.errorModelNotInstalled`,VOICE_RUNTIME_MISSING:`voice.errorRuntimeMissing`,MIC_AUDIO_INVALID:`voice.errorAudioInvalid`,LANGUAGE_INVALID:`voice.errorLanguageInvalid`,TRANSCRIPTION_TIMEOUT:`voice.errorTranscription`}[t]??`voice.errorTranscription`),position:`top`,timeout:5e3})}finally{Ht.value=null,Wt.value=[],Ut.value?.getTracks().forEach(e=>{e.stop()}),Ut.value=null,A.value=!1}}function _n(e){return Kt.value?E.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function vn(e){!_n(e)||e.repeat||(e.preventDefault(),gn())}function yn(e){_n(e)&&(e.preventDefault(),W())}function bn(){k.value&&W()}function xn(){document.visibilityState!==`visible`&&k.value&&W()}let Sn=h(()=>(Oe[z.value]??ke).map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));o(z,()=>{let e=Sn.value.map(e=>e.value);if(e.length>0){let t=E.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?N.value=t:e.includes(N.value)||(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=Ae[z.value]??[];t.length>0&&!t.includes(B.value)&&(B.value=Qt(F.value,z.value));let n=(Ee[z.value]??[]).map(e=>e.value);n.length>0&&!n.includes(P.value)&&(P.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function Cn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let wn=h(()=>(Ee[z.value]??Ee[`claude-code`]).map(e=>({value:e.value,label:Cn(D(e.i18nLabelKey)),description:D(e.i18nDescriptionKey)}))),G=h(()=>{let e=j.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),Tn=h(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(j.value)),K=e(`panel`);function En(){let e=j.value.trim();return K.value===`parent`&&Tn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let q=e([]),J=e([]),Dn=e(``),On=e(``),kn=h(()=>!M.value||!G.value);function An(){let e=Dn.value.trim();e&&(q.value.push(e),Dn.value=``)}function jn(e){q.value.splice(e,1)}function Mn(){let e=On.value.trim();e&&(J.value.push(e),On.value=``)}function Nn(e){J.value.splice(e,1)}function Pn(){M.value=!M.value,M.value||(j.value=``)}let Y=e(!1),X=e(!1);o(()=>X.value,e=>{e&&B.value!==`bypass`&&(B.value=`bypass`,T.notify({type:`info`,message:D(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let Z=e(``),Fn=h(()=>/\/issues\/\d+/.test(Z.value.trim()));function In(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=e(!1),$=e(null),Ln=e([]),Rn=e(!1);async function zn(){if(!F.value.trim()){Ln.value=[];return}Rn.value=!0;try{Ln.value=await Me.fetchOrphanWorktrees(F.value.trim())}catch{Ln.value=[]}finally{Rn.value=!1}}function Bn(){Q.value=!Q.value,Q.value?(M.value=!1,j.value=``,Y.value=!1,Z.value=``,R.value=!0,zn()):$.value=null}o(F,()=>{$.value=null,Q.value&&zn()}),o($,e=>{if(!e)return;let t=Ln.value.find(t=>t.path===e);t&&(I.value=t.suggestedSourceBranch),R.value=!0});async function Vn(e){if(!e.trim()){V.value=[],I.value=null;return}nn.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();V.value=n.local??n.branches??[],V.value.length>0&&!I.value&&(I.value=V.value[0]??null)}catch{V.value=[],I.value=null}finally{nn.value=!1}}function Hn(e){let t=E.getProjectByPath(e);if(t){t.defaultSourceBranch&&(I.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(O.value===``||O.value===Vt.value)&&(O.value=e,Vt.value=e);let n=Sn.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))N.value=t.defaultModel;else{let e=E.global.defaultModelByEngine?.[z.value];typeof e==`string`&&n.includes(e)&&(N.value=e)}}B.value=Qt(e,z.value)}let Un=null;o(F,e=>{Un&&clearTimeout(Un),Un=setTimeout(()=>{I.value=null,Vn(e),Hn(e)},500)});function Wn(e,t){let n=e.toLowerCase();t(()=>{Rt.value=E.projectPaths.filter(e=>e.toLowerCase().includes(n)||xe(e).toLowerCase().includes(n))})}function Gn(e){F.value=E.projectPaths.find(t=>xe(t)===e)??e}n(async()=>{await E.fetchSettings();let e=E.global.branchPrefixes;e.length>0&&!e.includes(L.value)&&(L.value=e[0]);let t=Ne();t.autoLoop===!0&&(X.value=!0),t.projectPath&&E.projectPaths.includes(t.projectPath)&&(F.value=t.projectPath),B.value=Qt(F.value,z.value);try{let e=await fetch(`/api/engines`);e.ok&&(qt.value=await e.json())}catch{}{let e=Sn.value.map(e=>e.value),t=E.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?N.value=t:e.length>0&&!e.includes(N.value)&&(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,vn),window.addEventListener(`keyup`,yn),window.addEventListener(`blur`,bn),document.addEventListener(`visibilitychange`,xn)}),r(()=>{Un&&clearTimeout(Un),window.removeEventListener(`keydown`,vn),window.removeEventListener(`keyup`,yn),window.removeEventListener(`blur`,bn),document.removeEventListener(`visibilitychange`,xn),Gt.value&&=(clearTimeout(Gt.value),null),k.value&&W()});function Kn(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 qn(){return zt.value.trim()?zt.value.trim().substring(0,80):!M.value&&!Y.value&&O.value.trim()&&(O.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 o,W as s,_ as c,at as te,b as l,c as ne,ct as u,g as d,h as f,it as p,k as re,m,n as ie,o as ae,ot as oe,p as h,s as g,w as se,y as _}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{t as v}from"./QIcon-CfOEsLsF.js";import{t as ce}from"./QSeparator-BR7sWTf2.js";import{t as le}from"./QInput-DtrweK8o.js";import{E as ue,N as y,d as de,l as fe,s as pe,x as me,z as he}from"./index-DY-0-pzs.js";import{t as ge}from"./QSpinnerDots-BOryc_9y.js";import{n as b,r as x,t as _e}from"./use-quasar-CCWojS5V.js";import{t as S,u as C}from"./QSelect-DdFxTwDW.js";import{t as w}from"./QTooltip-wdRYvb7_.js";import{t as ve}from"./QExpansionItem-CDMqMrBW.js";import{t as ye}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as be}from"./QSpace-e68xsYE1.js";import{i as xe}from"./project-color-CnA7qsFT.js";import{t as Se}from"./QPage-B-ixPPKx.js";import{a as Ce,i as we,n as Te,r as Ee,t as De}from"./expand-template-BT_OMXXZ.js";import{i as Oe,r as ke,t as Ae}from"./permissionModes-DKmBv8m2.js";var je=`kobo:create-page-prefs`;function T(){try{let e=localStorage.getItem(je);return e===null?void 0:JSON.parse(e)}catch{return}}function Me(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ne(){let e=T();if(!Me(e))return{};let t={};return typeof e.projectPath==`string`&&e.projectPath.length>0&&(t.projectPath=e.projectPath),typeof e.autoLoop==`boolean`&&(t.autoLoop=e.autoLoop),t}function Pe(e){try{localStorage.setItem(je,JSON.stringify(e))}catch{}}var Fe={class:`create-inner`},Ie={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},Le={class:`create-card rounded-borders`},Re={class:`card-top-bar row items-center q-px-md q-py-xs`},ze={class:`model-badge cursor-default row items-center q-gutter-xs`},Be={class:`text-indigo-3 text-weight-medium text-caption`},Ve={key:0,class:`notion-url-wrap`},He={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ue={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},We={key:2,class:`notion-peek-choice q-px-md q-pb-sm`},Ge={class:`text-caption text-grey-4 q-mb-sm`},Ke={class:`row q-gutter-sm`},qe={class:`peek-card-text`},Je={class:`peek-card-title`},Ye={class:`peek-card-desc`},Xe={class:`peek-card-text`},Ze={class:`peek-card-title`},Qe={class:`peek-card-desc`},$e={key:0,class:`sentry-url-wrap`},et={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},tt={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},nt={class:`card-name-wrap`},rt={class:`card-textarea-wrap`},it={class:`row items-center justify-end q-px-sm q-pb-xs q-gutter-sm`},at={key:0,class:`row items-center text-caption text-amber-6`},ot={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},st={class:`q-pa-sm manual-section-body`},ct={class:`row items-center q-gutter-sm q-mb-sm`},lt={class:`col text-caption text-grey-4`},ut={class:`q-pa-sm manual-section-body`},dt={class:`row items-center q-gutter-sm q-mb-sm`},ft={class:`col text-caption text-grey-4`},pt={class:`card-bottom-bar`},mt={class:`row q-col-gutter-xs q-px-xs`},ht={key:0,class:`col-12 col-sm-6 col-md-3`},gt={class:`bottom-select-label row items-center no-wrap`},_t={class:`col-12 col-sm-6 col-md-3`},vt={class:`bottom-select-label row items-center no-wrap`},yt={class:`col-12 col-sm-6 col-md-3`},bt={class:`bottom-select-label row items-center no-wrap`},xt={class:`col-12 col-md-3`},St={class:`bottom-select-label row items-center no-wrap`},Ct={class:`row q-col-gutter-xs q-pa-xs col-12 items-center justify-center`},wt={class:`col-12 col-md-auto`},Tt={class:`col-12 col-md-auto`},Et={class:`col-12 col-md-auto`},Dt={class:`row q-col-gutter-xs q-px-xs bottom-row-git`},Ot={class:`col-12 col-md-4`},kt={key:0,class:`col-12 col-md-4`},At={class:`bottom-select-label row items-center no-wrap`},jt={key:1,class:`col-12 col-md-4`},Mt={class:`bottom-select-label row items-center no-wrap`},Nt={class:`col-12 col-md-4`},Pt={class:`bottom-select-label row items-center no-wrap`},Ft={class:`row justify-center q-px-sm q-py-sm`},It={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Lt=6e4,E=ye(ee({__name:`CreatePage`,setup(ee){function ye(e){return e.disabled===!0}let je=pe(),T=_e(),Me=de(),E=me(),{t:D}=he(),Rt=e([]),zt=e(``),O=e(``),Bt=e(null),Vt=e(``),k=e(!1),A=e(!1),Ht=e(null),Ut=e(null),Wt=e([]),Gt=e(null),j=e(``),M=e(!1),N=e(`claude-opus-4-8`),P=e(`auto`),F=e(``),I=e(null),L=e(`feature`),R=e(!1),Kt=h(()=>E.global.voiceEnabled),qt=e([]),z=e(`claude-code`),Jt=h(()=>qt.value.find(e=>e.id===z.value)),Yt=h(()=>qt.value.map(e=>({value:e.id,label:e.displayName}))),Xt=h(()=>E.global.branchPrefixes.map(e=>({label:`${e}/`,value:e}))),Zt=[`plan`,`bypass`,`strict`,`interactive`];function Qt(e,t){let n=e?E.getProjectByPath(e):void 0,r=n?.agentPermissionMode;if(typeof r==`string`&&Zt.includes(r))return r;let i=E.global.defaultPermissionModeByEngine?.[t];return typeof i==`string`&&Zt.includes(i)?i:n?.dangerouslySkipPermissions??E.global.dangerouslySkipPermissions??!0?`bypass`:t===`codex`?`plan`:`interactive`}let B=e(Qt(``,z.value)),$t=h(()=>{switch(B.value){case`plan`:return`visibility`;case`bypass`:return`flash_on`;case`strict`:return`lock`;case`interactive`:return`security`}}),en=h(()=>(Ae[z.value]??Zt).map(e=>({value:e,label:D(`agentPermissionMode.${e}`),disabled:e===`plan`&&X.value}))),V=e([]),tn=e([]),nn=e(!1),rn=e(!1);function an(e,t){t(()=>{tn.value=e?V.value.filter(t=>t.toLowerCase().includes(e.toLowerCase())):V.value})}let on=ue();function sn(){return Bt.value?.nativeEl??null}let{showSkills:cn,selectedSkillIndex:H,groupedDropdown:ln,flatDropdown:U,fetchSkills:un,detectSlashFragment:dn,replaceFragmentWith:fn,closeDropdown:pn}=we(O,sn,{excludeKoboCommands:!0});un(),o(O,async()=>{await re(),await dn()});function mn(e){if(e.type===`template`){let t=on.templates.find(t=>t.slug===e.name);if(!t)return;fn(Te(t.content,De({workspace:null,gitStats:null,sessionName:null}))),pn();return}fn(`/${e.name} `),pn()}function hn(e){!cn.value||U.value.length===0||(e.key===`ArrowDown`?(e.preventDefault(),H.value=(H.value+1)%U.value.length):e.key===`ArrowUp`?(e.preventDefault(),H.value=(H.value-1+U.value.length)%U.value.length):e.key===`Enter`&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey?(e.preventDefault(),mn(U.value[H.value])):e.key===`Escape`&&(e.preventDefault(),pn()))}async function gn(){if(!(!Kt.value||k.value||A.value)){if(!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){T.notify({type:`warning`,message:D(`voice.notSupported`),position:`top`,timeout:4e3});return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0});Ut.value=e,Wt.value=[];let t=MediaRecorder.isTypeSupported(`audio/webm`)?`audio/webm`:``,n=t?new MediaRecorder(e,{mimeType:t}):new MediaRecorder(e);n.ondataavailable=e=>{e.data&&e.data.size>0&&Wt.value.push(e.data)},n.start(),Ht.value=n,k.value=!0,Gt.value=setTimeout(()=>{W(),T.notify({type:`info`,message:D(`voice.maxDurationReached`),position:`top`,timeout:3500})},Lt)}catch{T.notify({type:`negative`,message:D(`voice.errorMicPermission`),position:`top`,timeout:5e3})}}}async function W(){if(!k.value)return;let e=Ht.value;if(!e)return;k.value=!1,A.value=!0,Gt.value&&=(clearTimeout(Gt.value),null);let t=await new Promise(t=>{e.onstop=()=>t(new Blob(Wt.value,{type:`audio/webm`})),e.stop()});try{if(t.size===0)throw Error(`MIC_AUDIO_INVALID`);let e=new FormData;e.append(`audio`,t,`voice.webm`),e.append(`language`,E.global.voiceLanguage||`auto`);let n=await fetch(`/api/voice/transcribe`,{method:`POST`,body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(String(e.code??e.error??`HTTP_${n.status}`))}let r=await n.json();r.text?.trim()&&(O.value=O.value?`${O.value.trimEnd()} ${r.text.trim()}`:r.text.trim())}catch(e){let t=e instanceof Error?e.message:`TRANSCRIPTION_FAILED`;T.notify({type:`negative`,message:D({VOICE_DISABLED:`voice.errorDisabled`,MODEL_NOT_CONFIGURED:`voice.errorModelMissing`,MODEL_NOT_INSTALLED:`voice.errorModelNotInstalled`,VOICE_RUNTIME_MISSING:`voice.errorRuntimeMissing`,MIC_AUDIO_INVALID:`voice.errorAudioInvalid`,LANGUAGE_INVALID:`voice.errorLanguageInvalid`,TRANSCRIPTION_TIMEOUT:`voice.errorTranscription`}[t]??`voice.errorTranscription`),position:`top`,timeout:5e3})}finally{Ht.value=null,Wt.value=[],Ut.value?.getTracks().forEach(e=>{e.stop()}),Ut.value=null,A.value=!1}}function _n(e){return Kt.value?E.global.voicePttKey===`ctrl+space`?e.ctrlKey&&e.code===`Space`:e.key===`Alt`:!1}function vn(e){!_n(e)||e.repeat||(e.preventDefault(),gn())}function yn(e){_n(e)&&(e.preventDefault(),W())}function bn(){k.value&&W()}function xn(){document.visibilityState!==`visible`&&k.value&&W()}let Sn=h(()=>(Oe[z.value]??ke).map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));o(z,()=>{let e=Sn.value.map(e=>e.value);if(e.length>0){let t=E.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?N.value=t:e.includes(N.value)||(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}let t=Ae[z.value]??[];t.length>0&&!t.includes(B.value)&&(B.value=Qt(F.value,z.value));let n=(Ee[z.value]??[]).map(e=>e.value);n.length>0&&!n.includes(P.value)&&(P.value=n.includes(`auto`)?`auto`:n[0]??`auto`)});function Cn(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let wn=h(()=>(Ee[z.value]??Ee[`claude-code`]).map(e=>({value:e.value,label:Cn(D(e.i18nLabelKey)),description:D(e.i18nDescriptionKey)}))),G=h(()=>{let e=j.value.trim();return e.startsWith(`https://www.notion.so/`)||e.startsWith(`https://app.notion.com/`)}),Tn=h(()=>/[?&]p=[0-9a-f]{32}(?:[&#]|$)/i.test(j.value)),K=e(`panel`);function En(){let e=j.value.trim();return K.value===`parent`&&Tn.value?e.replace(/([?&])p=[0-9a-f]{32}(?=[&#]|$)/i,`$1`).replace(/([?&])pm=[a-z]+(?=[&#]|$)/i,`$1`).replace(/[?&]+$/,``).replace(/\?&/,`?`):e}let q=e([]),J=e([]),Dn=e(``),On=e(``),kn=h(()=>!M.value||!G.value);function An(){let e=Dn.value.trim();e&&(q.value.push(e),Dn.value=``)}function jn(e){q.value.splice(e,1)}function Mn(){let e=On.value.trim();e&&(J.value.push(e),On.value=``)}function Nn(e){J.value.splice(e,1)}function Pn(){M.value=!M.value,M.value||(j.value=``)}let Y=e(!1),X=e(!1);o(()=>X.value,e=>{e&&B.value!==`bypass`&&(B.value=`bypass`,T.notify({type:`info`,message:D(`agentPermissionMode.autoLoopLocked`),timeout:4e3}))});let Z=e(``),Fn=h(()=>/\/issues\/\d+/.test(Z.value.trim()));function In(){Y.value=!Y.value,Y.value||(Z.value=``)}let Q=e(!1),$=e(null),Ln=e([]),Rn=e(!1);async function zn(){if(!F.value.trim()){Ln.value=[];return}Rn.value=!0;try{Ln.value=await Me.fetchOrphanWorktrees(F.value.trim())}catch{Ln.value=[]}finally{Rn.value=!1}}function Bn(){Q.value=!Q.value,Q.value?(M.value=!1,j.value=``,Y.value=!1,Z.value=``,R.value=!0,zn()):$.value=null}o(F,()=>{$.value=null,Q.value&&zn()}),o($,e=>{if(!e)return;let t=Ln.value.find(t=>t.path===e);t&&(I.value=t.suggestedSourceBranch),R.value=!0});async function Vn(e){if(!e.trim()){V.value=[],I.value=null;return}nn.value=!0;try{let t=await fetch(`/api/git/branches?path=${encodeURIComponent(e.trim())}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();V.value=n.local??n.branches??[],V.value.length>0&&!I.value&&(I.value=V.value[0]??null)}catch{V.value=[],I.value=null}finally{nn.value=!1}}function Hn(e){let t=E.getProjectByPath(e);if(t){t.defaultSourceBranch&&(I.value=t.defaultSourceBranch);let e=t.taskPromptTemplate??``;(O.value===``||O.value===Vt.value)&&(O.value=e,Vt.value=e);let n=Sn.value.map(e=>e.value);if(t.defaultModel&&n.includes(t.defaultModel))N.value=t.defaultModel;else{let e=E.global.defaultModelByEngine?.[z.value];typeof e==`string`&&n.includes(e)&&(N.value=e)}}B.value=Qt(e,z.value)}let Un=null;o(F,e=>{Un&&clearTimeout(Un),Un=setTimeout(()=>{I.value=null,Vn(e),Hn(e)},500)});function Wn(e,t){let n=e.toLowerCase();t(()=>{Rt.value=E.projectPaths.filter(e=>e.toLowerCase().includes(n)||xe(e).toLowerCase().includes(n))})}function Gn(e){F.value=E.projectPaths.find(t=>xe(t)===e)??e}n(async()=>{await E.fetchSettings();let e=E.global.branchPrefixes;e.length>0&&!e.includes(L.value)&&(L.value=e[0]);let t=Ne();t.autoLoop===!0&&(X.value=!0),t.projectPath&&E.projectPaths.includes(t.projectPath)&&(F.value=t.projectPath),B.value=Qt(F.value,z.value);try{let e=await fetch(`/api/engines`);e.ok&&(qt.value=await e.json())}catch{}{let e=Sn.value.map(e=>e.value),t=E.global.defaultModelByEngine?.[z.value];typeof t==`string`&&e.includes(t)?N.value=t:e.length>0&&!e.includes(N.value)&&(N.value=e.includes(`auto`)?`auto`:e[0]??`auto`)}window.addEventListener(`keydown`,vn),window.addEventListener(`keyup`,yn),window.addEventListener(`blur`,bn),document.addEventListener(`visibilitychange`,xn)}),r(()=>{Un&&clearTimeout(Un),window.removeEventListener(`keydown`,vn),window.removeEventListener(`keyup`,yn),window.removeEventListener(`blur`,bn),document.removeEventListener(`visibilitychange`,xn),Gt.value&&=(clearTimeout(Gt.value),null),k.value&&W()});function Kn(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 qn(){return zt.value.trim()?zt.value.trim().substring(0,80):!M.value&&!Y.value&&O.value.trim()&&(O.value.trim().split(`
|
|
2
2
|
`)[0]??``).substring(0,80)||`workspace`}function Jn(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 Yn(){return M.value&&!G.value?D(`createPage.validationNotionUrl`):Y.value&&!Fn.value?D(`createPage.sentryValidation`):!M.value&&!Y.value&&!O.value.trim()?D(`createPage.validationDescription`):!M.value&&!Y.value&&(!qn()||qn()===`workspace`)&&!zt.value.trim()&&!O.value.trim()?D(`createPage.validationName`):F.value.trim()?I.value?null:D(`createPage.validationBranch`):D(`createPage.validationPath`)}async function Xn(){let e=Yn();if(e){T.notify({type:`negative`,message:e,position:`top`});return}if(Q.value&&!$.value){T.notify({type:`negative`,message:D(`createPage.pickWorktreeRequired`),position:`top`});return}rn.value=!0;try{let e=qn(),t;t=M.value&&G.value?Jn(En()):e===`workspace`?`task-${Date.now()}`:Kn(e);let n=`${L.value}/${t}`,r={name:e,projectPath:F.value.trim(),sourceBranch:I.value,...Q.value&&$.value?{worktreePath:$.value,skipSetupScript:!0}:{workingBranch:n},engine:z.value,model:N.value,reasoningEffort:P.value,...M.value&&G.value?{notionUrl:En()}:{},...Y.value&&Fn.value?{sentryUrl:Z.value.trim()}:{},...kn.value&&q.value.length>0?{tasks:q.value}:{},...kn.value&&J.value.length>0?{acceptanceCriteria:J.value}:{},...R.value&&!Q.value?{skipSetupScript:!0}:{},...O.value.trim()?{description:O.value.trim()}:{},...X.value?{autoLoop:!0}:{},agentPermissionMode:X.value&&B.value===`plan`?`bypass`:B.value},i=await Me.createWorkspace(r);i._branchAdjusted&&T.notify({type:`info`,message:D(`createPage.branchAdjusted`,{branch:i.workingBranch}),position:`top`,timeout:6e3}),Pe({projectPath:F.value.trim(),autoLoop:X.value}),fe().subscribe(i.id),Me.selectWorkspace(i.id),je.push({name:`workspace`,params:{id:i.id}})}catch{T.notify({type:`negative`,message:D(`createPage.errorCreating`),position:`top`})}finally{rn.value=!1}}return(e,n)=>(a(),f(Se,{class:`create-page flex flex-center column`},{default:s(()=>[m(`div`,Fe,[m(`div`,Ie,u(e.$t(`createPage.title`)),1),m(`div`,Le,[m(`div`,Re,[m(`span`,ze,[l(v,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),m(`span`,Be,u(Jt.value?.displayName??e.$t(`createPage.claudeCode`)),1)]),l(be),l(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:M.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,disable:Q.value,onClick:Pn},{default:s(()=>[l(v,{name:`description`,size:`14px`,class:`q-mr-xs`}),_(` `+u(M.value?e.$t(`createPage.notionEnabled`):e.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`,`disable`]),l(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:In},{default:s(()=>[l(v,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),_(` `+u(Y.value?e.$t(`createPage.sentryEnabled`):e.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`,`disable`])]),l(ce,{color:`grey-9`}),l(ie,{name:`slide`},{default:s(()=>[M.value?(a(),c(`div`,Ve,[l(le,{modelValue:j.value,"onUpdate:modelValue":n[0]||=e=>j.value=e,borderless:``,dense:``,placeholder:e.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:s(()=>[l(v,{name:`link`,size:`16px`,color:G.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),j.value.trim()&&!G.value?(a(),c(`div`,He,u(e.$t(`createPage.notionValidation`)),1)):d(``,!0),G.value?(a(),c(`div`,Ue,u(e.$t(`createPage.notionAutoExtract`)),1)):d(``,!0),G.value&&Tn.value?(a(),c(`div`,We,[m(`div`,Ge,[l(v,{name:`info`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),_(` `+u(e.$t(`createPage.notionPanelChoiceLabel`)),1)]),m(`div`,Ke,[m(`button`,{type:`button`,class:te([`peek-card col`,{"peek-card--active":K.value===`panel`}]),onClick:n[1]||=e=>K.value=`panel`},[l(v,{name:`article`,size:`22px`,class:`peek-card-icon`}),m(`div`,qe,[m(`div`,Je,u(e.$t(`createPage.notionPanelOption`)),1),m(`div`,Ye,u(e.$t(`createPage.notionPanelOptionDesc`)),1)]),K.value===`panel`?(a(),f(v,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):d(``,!0)],2),m(`button`,{type:`button`,class:te([`peek-card col`,{"peek-card--active":K.value===`parent`}]),onClick:n[2]||=e=>K.value=`parent`},[l(v,{name:`folder_open`,size:`22px`,class:`peek-card-icon`}),m(`div`,Xe,[m(`div`,Ze,u(e.$t(`createPage.notionParentOption`)),1),m(`div`,Qe,u(e.$t(`createPage.notionParentOptionDesc`)),1)]),K.value===`parent`?(a(),f(v,{key:0,name:`check_circle`,size:`18px`,color:`indigo-4`,class:`peek-card-check`})):d(``,!0)],2)])])):d(``,!0)])):d(``,!0)]),_:1}),M.value?(a(),f(ce,{key:0,color:`grey-9`})):d(``,!0),l(ie,{name:`slide`},{default:s(()=>[Y.value?(a(),c(`div`,$e,[l(le,{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:s(()=>[l(v,{name:`link`,size:`16px`,color:Fn.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Z.value.trim()&&!Fn.value?(a(),c(`div`,et,u(e.$t(`createPage.sentryValidation`)),1)):d(``,!0),Fn.value?(a(),c(`div`,tt,u(e.$t(`createPage.sentryAutoExtract`)),1)):d(``,!0)])):d(``,!0)]),_:1}),Y.value?(a(),f(ce,{key:1,color:`grey-9`})):d(``,!0),m(`div`,nt,[l(le,{modelValue:zt.value,"onUpdate:modelValue":n[4]||=e=>zt.value=e,borderless:``,dense:``,placeholder:M.value&&G.value?e.$t(`createPage.workspaceName`):e.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),l(ce,{color:`grey-9`}),m(`div`,rt,[l(le,{ref_key:`descriptionRef`,ref:Bt,modelValue:O.value,"onUpdate:modelValue":n[5]||=e=>O.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:M.value?e.$t(`createPage.instructions`):e.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[hn,ae(g(Xn,[`ctrl`]),[`enter`]),ae(g(Xn,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`]),m(`div`,it,[A.value?(a(),c(`div`,at,[l(ge,{size:`14px`,color:`amber-6`,class:`q-mr-xs`}),m(`span`,null,u(e.$t(`voice.transcribing`)),1)])):d(``,!0),l(y,{flat:``,dense:``,size:`sm`,icon:A.value?`hourglass_top`:k.value?`mic`:`mic_none`,color:k.value?`red-5`:A.value?`amber-6`:`grey-6`,disable:!Kt.value||A.value,class:te({"voice-btn--recording":k.value}),onMousedown:g(gn,[`prevent`]),onMouseup:g(W,[`prevent`]),onMouseleave:g(W,[`prevent`]),onTouchstart:g(gn,[`prevent`]),onTouchend:g(W,[`prevent`])},{default:s(()=>[l(w,null,{default:s(()=>[_(u(A.value?e.$t(`voice.transcribing`):k.value?e.$t(`voice.recording`):e.$t(`voice.holdToTalk`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`disable`,`class`])]),p(cn)&&p(U).length>0?(a(),f(Ce,{key:0,class:`create-slash-popup`,"grouped-dropdown":p(ln),"flat-dropdown":p(U),"selected-index":p(H),onSelect:mn},null,8,[`grouped-dropdown`,`flat-dropdown`,`selected-index`])):d(``,!0)]),l(ce,{color:`grey-9`}),kn.value?(a(),c(ne,{key:2},[m(`div`,ot,u(e.$t(`createPage.manualHint`)),1),l(ve,{dark:``,dense:``,label:e.$t(`createPage.tasks`,{count:q.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:s(()=>[m(`div`,st,[m(`div`,ct,[l(le,{modelValue:Dn.value,"onUpdate:modelValue":n[6]||=e=>Dn.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:ae(g(An,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),l(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Dn.value.trim(),onClick:An},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(a(!0),c(ne,null,t(q.value,(t,n)=>(a(),c(`div`,{key:`task-${n}`,class:`row items-center q-py-xs manual-item`},[m(`span`,lt,u(t),1),l(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>jn(n)},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),l(ve,{dark:``,dense:``,label:e.$t(`createPage.acceptanceCriteria`,{count:J.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:s(()=>[m(`div`,ut,[m(`div`,dt,[l(le,{modelValue:On.value,"onUpdate:modelValue":n[7]||=e=>On.value=e,dark:``,dense:``,borderless:``,placeholder:e.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:ae(g(Mn,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),l(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!On.value.trim(),onClick:Mn},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(a(!0),c(ne,null,t(J.value,(t,n)=>(a(),c(`div`,{key:`crit-${n}`,class:`row items-center q-py-xs manual-item`},[m(`span`,ft,u(t),1),l(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>Nn(n)},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),l(ce,{color:`grey-9`})],64)):d(``,!0),m(`div`,pt,[m(`div`,mt,[Yt.value.length>0?(a(),c(`div`,ht,[l(S,{modelValue:z.value,"onUpdate:modelValue":n[8]||=e=>z.value=e,options:Yt.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:s(()=>[m(`span`,gt,[l(v,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),_(` `+u(Yt.value.find(e=>e.value===z.value)?.label??z.value)+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])):d(``,!0),m(`div`,_t,[l(S,{modelValue:N.value,"onUpdate:modelValue":n[9]||=e=>N.value=e,options:Sn.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:s(()=>[m(`span`,vt,[_(u(Sn.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:s(({opt:e,itemProps:t})=>[l(x,i(t,{class:`model-option`}),{default:s(()=>[l(b,null,{default:s(()=>[l(C,{class:`text-white`},{default:s(()=>[_(u(e.label),1)]),_:2},1024),l(C,{caption:``,class:`text-grey-5`},{default:s(()=>[_(u(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),m(`div`,yt,[l(S,{modelValue:P.value,"onUpdate:modelValue":n[10]||=e=>P.value=e,options:wn.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:s(()=>[m(`span`,bt,[l(v,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),_(` `+u(wn.value.find(e=>e.value===P.value)?.label??P.value)+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:s(({opt:e,itemProps:t})=>[l(x,oe(se(t)),{default:s(()=>[l(b,null,{default:s(()=>[l(C,{class:`text-white`},{default:s(()=>[_(u(e.label),1)]),_:2},1024),l(C,{caption:``,class:`text-grey-5`},{default:s(()=>[_(u(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`])]),m(`div`,xt,[l(S,{modelValue:B.value,"onUpdate:modelValue":n[11]||=e=>B.value=e,options:en.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":ye},{selected:s(()=>[m(`span`,St,[l(v,{name:$t.value,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),_(` `+u(en.value.find(e=>e.value===B.value)?.label??B.value)+` `,1),X.value?d(``,!0):(a(),f(v,{key:0,name:`expand_more`,size:`12px`,color:`grey-5`}))])]),default:s(()=>[l(w,null,{default:s(()=>[_(u(X.value?e.$t(`agentPermissionMode.autoLoopLocked`):e.$t(`agentPermissionMode.tooltip`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`,`disable`])])]),m(`div`,Ct,[m(`div`,wt,[l(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:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`autoLoop.startInMode`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),m(`div`,Tt,[l(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:R.value?`play_disabled`:`play_circle`,color:R.value?`orange-4`:`grey-5`,label:e.$t(`createPage.skipSetupScript`),class:`skip-setup-btn`,onClick:n[13]||=e=>R.value=!R.value},{default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),m(`div`,Et,[l(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:Bn},null,8,[`color`,`label`])])]),m(`div`,Dt,[m(`div`,Ot,[l(S,{modelValue:F.value,"onUpdate:modelValue":n[14]||=e=>F.value=e,options:Rt.value,dense:``,borderless:``,"use-input":``,"fill-input":``,"hide-selected":``,"input-debounce":`0`,"new-value-mode":`add`,class:`bottom-select rounded-borders repo-select`,"hide-dropdown-icon":``,"input-class":F.value?``:`repo-input-empty`,placeholder:e.$t(`createPage.projectPath`),behavior:p(E).projectPaths.length>0?`menu`:`dialog`,"option-label":e=>e?p(xe)(e):``,onFilter:Wn,onInputValue:Gn},{prepend:s(()=>[l(v,{name:`folder`,size:`14px`,color:`grey-5`})]),option:s(({opt:e,itemProps:t})=>[l(x,oe(se(t)),{default:s(()=>[l(b,null,{default:s(()=>[l(C,null,{default:s(()=>[_(u(p(xe)(e)),1)]),_:2},1024),l(C,{caption:``},{default:s(()=>[_(u(e),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":s(()=>[l(x,null,{default:s(()=>[l(b,{class:`text-grey-6 text-caption`},{default:s(()=>[_(u(e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`,`option-label`])]),Q.value?d(``,!0):(a(),c(`div`,kt,[l(S,{modelValue:L.value,"onUpdate:modelValue":n[15]||=e=>L.value=e,options:Xt.value,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:s(()=>[m(`span`,At,[l(v,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),_(` `+u(L.value)+`/ `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:s(()=>[l(w,null,{default:s(()=>[_(u(e.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])])),Q.value?(a(),c(`div`,jt,[l(S,{modelValue:$.value,"onUpdate:modelValue":n[16]||=e=>$.value=e,options:Ln.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:Rn.value,disable:!F.value.trim()||Rn.value},{selected:s(()=>[m(`span`,Mt,[l(v,{name:`folder_open`,size:`12px`,color:`cyan-5`,class:`q-mr-xs`}),_(` `+u($.value?Ln.value.find(e=>e.path===$.value)?.branch??$.value:e.$t(`createPage.worktreePickerLabel`))+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:s(e=>[l(x,oe(se(e.itemProps)),{default:s(()=>[l(b,null,{default:s(()=>[l(C,null,{default:s(()=>[_(u(e.opt.branch),1)]),_:2},1024),l(C,{caption:``},{default:s(()=>[_(u(e.opt.path),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),"no-option":s(()=>[l(x,null,{default:s(()=>[l(b,{class:`text-grey-6 text-caption`},{default:s(()=>[_(u(F.value.trim()?e.$t(`createPage.noOrphanWorktrees`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])):d(``,!0),m(`div`,Nt,[l(S,{modelValue:I.value,"onUpdate:modelValue":n[17]||=e=>I.value=e,options:tn.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,"use-input":``,"input-debounce":`0`,loading:nn.value,disable:!F.value.trim()||nn.value,onFilter:an},{selected:s(()=>[m(`span`,Pt,[l(v,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),_(` `+u(I.value??e.$t(`createPage.branch`))+` `,1),l(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":s(()=>[l(x,null,{default:s(()=>[l(b,{class:`text-grey-6 text-caption`},{default:s(()=>[_(u(F.value.trim()?e.$t(`createPage.noBranches`):e.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])])]),m(`div`,Ft,[l(y,{label:e.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:rn.value,disable:rn.value||Q.value&&!$.value,onClick:Xn},null,8,[`label`,`loading`,`disable`])])]),m(`div`,It,u(M.value?e.$t(`createPage.notionExtractHint`):e.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-d0a9ab53`]]);export{E as default};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-
|
|
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-JZnIeD9D.js";import{P as S,a as C,t as w}from"./QIcon-CfOEsLsF.js";import{t as ee}from"./QSeparator-BR7sWTf2.js";import{i as T,o as E,t as te}from"./QInput-DtrweK8o.js";import{N as D,P as ne,a as re,d as ie,l as ae,p as oe,z as se}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-BRcMV3rU.js","assets/index-DY-0-pzs.js","assets/vue.runtime.esm-bundler-JZnIeD9D.js","assets/chunk-QTnfLwEv.js","assets/QSeparator-BR7sWTf2.js","assets/QIcon-CfOEsLsF.js","assets/use-checkbox-Dh_-xsu4.js","assets/QInput-DtrweK8o.js","assets/index-C3dgH7TE.css","assets/editor.api2-CinEgB5d.js","assets/editor-BFebQ78e.css","assets/workers-BUpbuYJJ.js","assets/monaco.contribution-BFELAVjU.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-JZnIeD9D.js";import{P as S,a as C,t as w}from"./QIcon-CfOEsLsF.js";import{t as ee}from"./QSeparator-BR7sWTf2.js";import{i as T,o as E,t as te}from"./QInput-DtrweK8o.js";import{N as D,P as ne,a as re,d as ie,l as ae,p as oe,z as se}from"./index-DY-0-pzs.js";import{t as ce}from"./QSpinnerDots-BOryc_9y.js";import{n as le,r as ue,t as de}from"./use-quasar-CCWojS5V.js";import{l as fe}from"./QSelect-DdFxTwDW.js";import{t as O}from"./QTooltip-wdRYvb7_.js";import{t as pe}from"./QScrollArea-5SknWwXm.js";import{t as me}from"./ClosePopup-SUgOzeRa.js";import{t as k}from"./render-chat-markdown-C66I22rl.js";import{t as A}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as j}from"./QBadge-DoPfOZ_x.js";import{t as he}from"./QSpace-e68xsYE1.js";import{t as ge}from"./QChip-C_hQ8zDG.js";import{i as M,n as _e,r as ve,t as ye}from"./build-path-tree-B2W0g5KD.js";import{t as be}from"./QList-kGlJAb-p.js";var xe=S({name:`QBtnToggle`,props:{...E,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=T(y(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),a=y(()=>ne(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(D,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(M,{class:`q-btn-toggle`,...a.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}});function N(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 P(e){let t=e.split(`
|
|
3
3
|
`);return t.length===1?e:t.map((e,t)=>t===0?e:` ${e}`).join(`
|
|
4
4
|
`)}function F(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}** : ${P(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 I=300;function L(e){return`kobo:review-draft:${e}`}function R(e){let t=localStorage.getItem(L(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 Se(t,n){let r=e(R(t)),i=null;function a(){i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null;try{localStorage.setItem(L(t),JSON.stringify(r.value))}catch(e){console.warn(`[review-draft] persist failed:`,e)}},I)}function o(){if(i!==null){clearTimeout(i),i=null;try{localStorage.setItem(L(t),JSON.stringify(r.value))}catch(e){console.warn(`[review-draft] flush failed:`,e)}}}function s(e){let t=N(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(L(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=F(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 z={class:`review-comment-block`},B={class:`comment-actions q-mt-xs`},V=[`innerHTML`],Ce={class:`comment-footer`},we={class:`comment-time text-caption text-grey-7`},Te={class:`comment-actions q-mt-xs`},Ee=A(o({__name:`ReviewCommentBlock`,props:{comments:{},startInAddMode:{type:Boolean}},emits:[`add`,`update`,`delete`,`dismissEmpty`],setup(n,{emit:r}){let i=n,o=r,{t:s}=se(),c=de(),_=e(null),y=e(``),b=e(i.startInAddMode===!0),S=e(``);function C(e){return k(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 E(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`,z,[(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(te,{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`,B,[f(D,{flat:``,dense:``,size:`sm`,label:e.$t(`common.cancel`),onClick:T},null,8,[`label`]),f(D,{unelevated:``,dense:``,size:`sm`,color:`primary`,label:e.$t(`common.save`),onClick:e=>E(t.id)},null,8,[`label`,`onClick`])])],64)):(a(),u(p,{key:1},[v(`div`,{class:`comment-content`,innerHTML:C(t.content)},null,8,V),v(`div`,Ce,[v(`span`,we,m(w(t.createdAt)),1),f(D,{flat:``,dense:``,round:``,size:`xs`,icon:`edit`,color:`grey-5`,onClick:e=>ee(t)},{default:l(()=>[f(O,null,{default:l(()=>[x(m(e.$t(`diff.editComment`)),1)]),_:1})]),_:1},8,[`onClick`]),f(D,{flat:``,dense:``,round:``,size:`xs`,icon:`delete`,color:`grey-5`,onClick:e=>ne(t.id)},{default:l(()=>[f(O,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(te,{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`,Te,[f(D,{flat:``,dense:``,size:`sm`,label:e.$t(`common.cancel`),onClick:re},null,8,[`label`]),f(D,{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(D,{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`]]),De={class:`review-draft-panel q-pa-sm`},H={class:`text-caption text-uppercase text-weight-bold text-grey-6 q-mb-sm`,style:{"letter-spacing":`0.05em`}},Oe={key:0,class:`text-caption text-grey-7 q-pa-sm`},ke=[`onClick`],U={style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Ae=[`onClick`],je={class:`text-grey-6 q-mr-xs`,style:{"font-family":`monospace`}},Me={class:`text-grey-3 ellipsis`},Ne={class:`global-message-box q-mt-sm`},Pe=A(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`,De,[v(`div`,H,m(n.$t(`diff.reviewDraft`)),1),f(pe,{class:`comments-scroll`},{default:l(()=>[s.value.length===0?(a(),u(`div`,Oe,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`,U,m(e.filePath),1),f(j,{label:String(e.comments.length),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`},null,8,[`label`])],8,ke),(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`,je,`L`+m(e.line),1),v(`span`,Me,m(c(e.content)),1)],8,Ae))),128))]))),128))]),_:1}),v(`div`,Ne,[f(te,{"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(D,{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`]]),Fe={class:`diff-viewer column full-height`},Ie={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},Le={class:`text-body1 text-weight-medium text-grey-3`},Re={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},ze={class:`text-grey-7`},Be={class:`text-green-4`},Ve={class:`text-grey-7`},He={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},Ue={class:`row col no-wrap`,style:{"min-height":`0`}},We={key:0,class:`review-draft-panel-wrapper`,style:{width:`300px`,minWidth:`240px`,flexShrink:0,borderRight:`1px solid #2a2a4a`}},Ge={key:1,class:`text-caption text-grey-8 q-pa-sm`},Ke={key:2,class:`text-caption text-grey-8 q-pa-sm`},qe={class:`text-grey-4`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Je={class:`text-grey-3 ellipsis`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Ye={key:0,class:`dirty-dot`},Xe={class:`col column`,style:{"min-width":`0`,position:`relative`}},Ze={key:0,class:`col column items-center justify-center`},Qe={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},$e=`kobo:diff:hideUnchanged`,et=`kobo:diff:includeUntracked`,tt=`kobo:diff:mode`,nt=`kobo:diffViewerFileListWidth`,rt=180,it=600,at=A(o({__name:`DiffViewer`,props:{workspaceId:{},initialReviewMode:{type:Boolean},compareFrom:{},compareTo:{}},emits:[`close`,`sendToChat`],setup(o,{emit:s}){let d=o,S=s,{t:C}=se(),T=de(),E=y(()=>!!d.compareFrom&&!!d.compareTo),ne=y(()=>E.value?`${(d.compareFrom??``).slice(0,7)} ↔ ${(d.compareTo??``).slice(0,7)}`:``),k=e([]),A=e(``),M=e(``),N=e(null),P=e(!1),F=e(!1),I=e(null),L=e(`side`),R=e(localStorage.getItem($e)!==`0`),z=e(localStorage.getItem(et)===`1`),B=e(`branch`),V=e(d.initialReviewMode||localStorage.getItem(tt)===`review`?`review`:`inspect`);c(V,e=>{localStorage.setItem(tt,e),e===`review`?we():Ce()});function Ce(){pt();for(let e of q)e.dispose();q=[],G&&G.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`)}function we(){G&&(xt(),N.value&&_t(N.value))}let Te=ae(),De=ie(),H=Se(d.workspaceId,{sendChatMessage:async(e,t,n)=>{if(!Te.isConnected())throw Error(`WebSocket not connected — cannot send the review`);Te.sendChatMessage(e,t,n)}}),Oe=y(()=>H.draft.value.comments),ke=y(()=>H.draft.value.globalMessage),U=e(!1);async function Ae(){U.value=!0;try{let e=await H.submit(De.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{U.value=!1}}let je=y(()=>{let e=new Map;if(V.value!==`review`)return e;for(let t of H.draft.value.comments)e.set(t.filePath,(e.get(t.filePath)??0)+1);return e});function Me(e){if(V.value!==`review`||!e)return 0;let t=0;for(let n of H.draft.value.comments)n.filePath.startsWith(`${e}/`)&&t++;return t}function Ne(e){return e.nodeKey.startsWith(`dir:`)?e.nodeKey.slice(4):``}function at(e){N.value=e}async function ot(e=3e3){let t=Date.now();for(;F.value;){if(Date.now()-t>e)return;await new Promise(e=>setTimeout(e,30))}}async function st(e,t){N.value!==e&&(N.value=e,await ot()),G?.getModifiedEditor().revealLineInCenter(t)}let ct=parseInt(localStorage.getItem(nt)??`280`,10),lt=e(Math.min(it,Math.max(rt,ct)));function ut(e){e.preventDefault();let t=e.target.closest(`.diff-viewer`);if(!t)return;let n=t.getBoundingClientRect().left,r=e=>{lt.value=Math.min(it,Math.max(rt,e.clientX-n))},i=()=>{localStorage.setItem(nt,String(lt.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 W=null,G=null,K=[],q=[],J=e([]),dt=e(null);function ft(){if(!G)return;let e=G.getModifiedEditor();for(let t of J.value)t.topPx=e.getTopForLineNumber(t.line+1)-e.getScrollTop()-t.heightPx}function pt(){if(!G){J.value=[];return}G.getModifiedEditor().changeViewZones(e=>{for(let t of J.value)try{e.removeZone(t.zoneId)}catch{}}),J.value=[]}function mt(e,t,n){if(!G)return;let r=G.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;J.value.push({zoneId:c,placeholderNode:a,line:e,comments:t,transient:n,topPx:u,heightPx:l})}function ht(e){if(!G)return;let t=G.getModifiedEditor(),n=J.value.filter(t=>t.line===e);n.length!==0&&(t.changeViewZones(e=>{for(let t of n)try{e.removeZone(t.zoneId)}catch{}}),J.value=J.value.filter(t=>t.line!==e))}function gt(e,t){ht(t);let n=H.draft.value.comments.filter(n=>n.filePath===e&&n.line===t);n.length!==0&&(n.sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),mt(t,n,!1))}function _t(e){if(!G||V.value!==`review`)return;let t=H.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)mt(e,t,!1)}function vt(e,t,n){H.addComment({filePath:e,line:t,content:n}),gt(e,t)}function yt(e,t,n,r){H.updateComment(n,r),gt(e,t)}function bt(e,t,n){H.deleteComment(n),gt(e,t)}function xt(){if(!G||V.value!==`review`||!W)return;let e=G.getModifiedEditor(),t=e.getDomNode();t&&t.classList.add(`review-mode-active`),q.push(e.onMouseDown(e=>{if(e.target.type!==3)return;let t=e.target.position?.lineNumber??0;t<1||!N.value||St(N.value,t)}),e.onDidScrollChange(()=>ft()),e.onDidLayoutChange(()=>ft()))}function St(e,t){ht(t),mt(t,H.draft.value.comments.filter(n=>n.filePath===e&&n.line===t).sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),!0)}let Ct=e(``),Y=e(``),X=e(!1),Z=e(!1),Q=null,$=y(()=>{if(E.value||V.value!==`inspect`)return!1;let e=De.workspaces.find(e=>e.id===d.workspaceId);if(!e||e.archivedAt||oe(e.status))return!1;let t=N.value;return(t?k.value.find(e=>e.path===t):null)?.status!==`deleted`});c($,e=>{G?.updateOptions({readOnly:!e})});function wt(){Q?.(),Q=null,pt();for(let e of q)e.dispose();if(q=[],!G)return;G.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`);for(let e of K)e.dispose();K=[];let e=G.getModel();G.dispose(),G=null,e?.original?.dispose(),e?.modified?.dispose()}let Tt=y(()=>ye(k.value)),Et=y(()=>N.value?`file:${N.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:!k.value.some(t=>t.path.toLowerCase().includes(e))});async function At(){P.value=!0;try{let e=E.value?new URLSearchParams({mode:`commits`,from:d.compareFrom,to:d.compareTo}):new URLSearchParams({mode:B.value});!E.value&&B.value===`branch`&&z.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();k.value=n.files,A.value=n.sourceBranch??``,M.value=n.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{P.value=!1}}async function jt(e){if(I.value){F.value=!0;try{W||(self.MonacoEnvironment={getWorker(e,t){return t===`json`?new Worker(new URL(`/assets/json.worker-BaLYt9Ss.js`,``+import.meta.url),{type:`module`}):t===`css`||t===`scss`||t===`less`?new Worker(new URL(`/assets/css.worker-CBlhdqTa.js`,``+import.meta.url),{type:`module`}):t===`html`||t===`handlebars`||t===`razor`?new Worker(new URL(`/assets/html.worker-BKBrNna1.js`,``+import.meta.url),{type:`module`}):t===`typescript`||t===`javascript`?new Worker(new URL(`/assets/ts.worker-PmaSgaZk.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/editor.worker-Cu3tR8iJ.js`,``+import.meta.url),{type:`module`})}},W=await re(()=>import(`./editor.main-ds11Fcak.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),W.editor.defineTheme(`kobo-dark`,{base:`vs-dark`,inherit:!0,rules:[],colors:{"editor.background":`#1a1a2e`,"diffEditor.insertedTextBackground":`#22c55e20`,"diffEditor.removedTextBackground":`#ef444420`}}));let t=E.value?`path=${encodeURIComponent(e)}&mode=commits&from=${encodeURIComponent(d.compareFrom)}&to=${encodeURIComponent(d.compareTo)}`:`path=${encodeURIComponent(e)}&mode=${B.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=W.editor.createModel(r.original??``,i),o=W.editor.createModel(r.modified??``,i);G=W.editor.createDiffEditor(I.value,{theme:`kobo-dark`,readOnly:!$.value,originalEditable:!1,renderSideBySide:L.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18,hideUnchangedRegions:{enabled:R.value,contextLineCount:3,minimumLineCount:3,revealLineCount:20}}),G.addCommand(W.KeyMod.CtrlCmd|W.KeyCode.KeyS,()=>{$.value&&X.value&&!Z.value&&Nt()}),G.setModel({original:a,modified:o}),Ct.value=r.modifiedSha??``,Y.value=r.modified??``,X.value=!1,W&&(r.modified??``).includes(`\r
|
|
7
|
+
`)}\n\n---\n${s}`}var I=300;function L(e){return`kobo:review-draft:${e}`}function R(e){let t=localStorage.getItem(L(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 Se(t,n){let r=e(R(t)),i=null;function a(){i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null;try{localStorage.setItem(L(t),JSON.stringify(r.value))}catch(e){console.warn(`[review-draft] persist failed:`,e)}},I)}function o(){if(i!==null){clearTimeout(i),i=null;try{localStorage.setItem(L(t),JSON.stringify(r.value))}catch(e){console.warn(`[review-draft] flush failed:`,e)}}}function s(e){let t=N(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(L(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=F(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 z={class:`review-comment-block`},B={class:`comment-actions q-mt-xs`},V=[`innerHTML`],Ce={class:`comment-footer`},we={class:`comment-time text-caption text-grey-7`},Te={class:`comment-actions q-mt-xs`},Ee=A(o({__name:`ReviewCommentBlock`,props:{comments:{},startInAddMode:{type:Boolean}},emits:[`add`,`update`,`delete`,`dismissEmpty`],setup(n,{emit:r}){let i=n,o=r,{t:s}=se(),c=de(),_=e(null),y=e(``),b=e(i.startInAddMode===!0),S=e(``);function C(e){return k(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 E(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`,z,[(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(te,{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`,B,[f(D,{flat:``,dense:``,size:`sm`,label:e.$t(`common.cancel`),onClick:T},null,8,[`label`]),f(D,{unelevated:``,dense:``,size:`sm`,color:`primary`,label:e.$t(`common.save`),onClick:e=>E(t.id)},null,8,[`label`,`onClick`])])],64)):(a(),u(p,{key:1},[v(`div`,{class:`comment-content`,innerHTML:C(t.content)},null,8,V),v(`div`,Ce,[v(`span`,we,m(w(t.createdAt)),1),f(D,{flat:``,dense:``,round:``,size:`xs`,icon:`edit`,color:`grey-5`,onClick:e=>ee(t)},{default:l(()=>[f(O,null,{default:l(()=>[x(m(e.$t(`diff.editComment`)),1)]),_:1})]),_:1},8,[`onClick`]),f(D,{flat:``,dense:``,round:``,size:`xs`,icon:`delete`,color:`grey-5`,onClick:e=>ne(t.id)},{default:l(()=>[f(O,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(te,{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`,Te,[f(D,{flat:``,dense:``,size:`sm`,label:e.$t(`common.cancel`),onClick:re},null,8,[`label`]),f(D,{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(D,{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`]]),De={class:`review-draft-panel q-pa-sm`},H={class:`text-caption text-uppercase text-weight-bold text-grey-6 q-mb-sm`,style:{"letter-spacing":`0.05em`}},Oe={key:0,class:`text-caption text-grey-7 q-pa-sm`},ke=[`onClick`],U={style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Ae=[`onClick`],je={class:`text-grey-6 q-mr-xs`,style:{"font-family":`monospace`}},Me={class:`text-grey-3 ellipsis`},Ne={class:`global-message-box q-mt-sm`},Pe=A(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`,De,[v(`div`,H,m(n.$t(`diff.reviewDraft`)),1),f(pe,{class:`comments-scroll`},{default:l(()=>[s.value.length===0?(a(),u(`div`,Oe,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`,U,m(e.filePath),1),f(j,{label:String(e.comments.length),color:`indigo-8`,"text-color":`white`,class:`q-ml-xs`},null,8,[`label`])],8,ke),(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`,je,`L`+m(e.line),1),v(`span`,Me,m(c(e.content)),1)],8,Ae))),128))]))),128))]),_:1}),v(`div`,Ne,[f(te,{"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(D,{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`]]),Fe={class:`diff-viewer column full-height`},Ie={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},Le={class:`text-body1 text-weight-medium text-grey-3`},Re={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},ze={class:`text-grey-7`},Be={class:`text-green-4`},Ve={class:`text-grey-7`},He={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},Ue={class:`row col no-wrap`,style:{"min-height":`0`}},We={key:0,class:`review-draft-panel-wrapper`,style:{width:`300px`,minWidth:`240px`,flexShrink:0,borderRight:`1px solid #2a2a4a`}},Ge={key:1,class:`text-caption text-grey-8 q-pa-sm`},Ke={key:2,class:`text-caption text-grey-8 q-pa-sm`},qe={class:`text-grey-4`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Je={class:`text-grey-3 ellipsis`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},Ye={key:0,class:`dirty-dot`},Xe={class:`col column`,style:{"min-width":`0`,position:`relative`}},Ze={key:0,class:`col column items-center justify-center`},Qe={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},$e=`kobo:diff:hideUnchanged`,et=`kobo:diff:includeUntracked`,tt=`kobo:diff:mode`,nt=`kobo:diffViewerFileListWidth`,rt=180,it=600,at=A(o({__name:`DiffViewer`,props:{workspaceId:{},initialReviewMode:{type:Boolean},compareFrom:{},compareTo:{}},emits:[`close`,`sendToChat`],setup(o,{emit:s}){let d=o,S=s,{t:C}=se(),T=de(),E=y(()=>!!d.compareFrom&&!!d.compareTo),ne=y(()=>E.value?`${(d.compareFrom??``).slice(0,7)} ↔ ${(d.compareTo??``).slice(0,7)}`:``),k=e([]),A=e(``),M=e(``),N=e(null),P=e(!1),F=e(!1),I=e(null),L=e(`side`),R=e(localStorage.getItem($e)!==`0`),z=e(localStorage.getItem(et)===`1`),B=e(`branch`),V=e(d.initialReviewMode||localStorage.getItem(tt)===`review`?`review`:`inspect`);c(V,e=>{localStorage.setItem(tt,e),e===`review`?we():Ce()});function Ce(){pt();for(let e of q)e.dispose();q=[],G&&G.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`)}function we(){G&&(xt(),N.value&&_t(N.value))}let Te=ae(),De=ie(),H=Se(d.workspaceId,{sendChatMessage:async(e,t,n)=>{if(!Te.isConnected())throw Error(`WebSocket not connected — cannot send the review`);Te.sendChatMessage(e,t,n)}}),Oe=y(()=>H.draft.value.comments),ke=y(()=>H.draft.value.globalMessage),U=e(!1);async function Ae(){U.value=!0;try{let e=await H.submit(De.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{U.value=!1}}let je=y(()=>{let e=new Map;if(V.value!==`review`)return e;for(let t of H.draft.value.comments)e.set(t.filePath,(e.get(t.filePath)??0)+1);return e});function Me(e){if(V.value!==`review`||!e)return 0;let t=0;for(let n of H.draft.value.comments)n.filePath.startsWith(`${e}/`)&&t++;return t}function Ne(e){return e.nodeKey.startsWith(`dir:`)?e.nodeKey.slice(4):``}function at(e){N.value=e}async function ot(e=3e3){let t=Date.now();for(;F.value;){if(Date.now()-t>e)return;await new Promise(e=>setTimeout(e,30))}}async function st(e,t){N.value!==e&&(N.value=e,await ot()),G?.getModifiedEditor().revealLineInCenter(t)}let ct=parseInt(localStorage.getItem(nt)??`280`,10),lt=e(Math.min(it,Math.max(rt,ct)));function ut(e){e.preventDefault();let t=e.target.closest(`.diff-viewer`);if(!t)return;let n=t.getBoundingClientRect().left,r=e=>{lt.value=Math.min(it,Math.max(rt,e.clientX-n))},i=()=>{localStorage.setItem(nt,String(lt.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 W=null,G=null,K=[],q=[],J=e([]),dt=e(null);function ft(){if(!G)return;let e=G.getModifiedEditor();for(let t of J.value)t.topPx=e.getTopForLineNumber(t.line+1)-e.getScrollTop()-t.heightPx}function pt(){if(!G){J.value=[];return}G.getModifiedEditor().changeViewZones(e=>{for(let t of J.value)try{e.removeZone(t.zoneId)}catch{}}),J.value=[]}function mt(e,t,n){if(!G)return;let r=G.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;J.value.push({zoneId:c,placeholderNode:a,line:e,comments:t,transient:n,topPx:u,heightPx:l})}function ht(e){if(!G)return;let t=G.getModifiedEditor(),n=J.value.filter(t=>t.line===e);n.length!==0&&(t.changeViewZones(e=>{for(let t of n)try{e.removeZone(t.zoneId)}catch{}}),J.value=J.value.filter(t=>t.line!==e))}function gt(e,t){ht(t);let n=H.draft.value.comments.filter(n=>n.filePath===e&&n.line===t);n.length!==0&&(n.sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),mt(t,n,!1))}function _t(e){if(!G||V.value!==`review`)return;let t=H.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)mt(e,t,!1)}function vt(e,t,n){H.addComment({filePath:e,line:t,content:n}),gt(e,t)}function yt(e,t,n,r){H.updateComment(n,r),gt(e,t)}function bt(e,t,n){H.deleteComment(n),gt(e,t)}function xt(){if(!G||V.value!==`review`||!W)return;let e=G.getModifiedEditor(),t=e.getDomNode();t&&t.classList.add(`review-mode-active`),q.push(e.onMouseDown(e=>{if(e.target.type!==3)return;let t=e.target.position?.lineNumber??0;t<1||!N.value||St(N.value,t)}),e.onDidScrollChange(()=>ft()),e.onDidLayoutChange(()=>ft()))}function St(e,t){ht(t),mt(t,H.draft.value.comments.filter(n=>n.filePath===e&&n.line===t).sort((e,t)=>e.createdAt.localeCompare(t.createdAt)),!0)}let Ct=e(``),Y=e(``),X=e(!1),Z=e(!1),Q=null,$=y(()=>{if(E.value||V.value!==`inspect`)return!1;let e=De.workspaces.find(e=>e.id===d.workspaceId);if(!e||e.archivedAt||oe(e.status))return!1;let t=N.value;return(t?k.value.find(e=>e.path===t):null)?.status!==`deleted`});c($,e=>{G?.updateOptions({readOnly:!e})});function wt(){Q?.(),Q=null,pt();for(let e of q)e.dispose();if(q=[],!G)return;G.getModifiedEditor().getDomNode()?.classList.remove(`review-mode-active`);for(let e of K)e.dispose();K=[];let e=G.getModel();G.dispose(),G=null,e?.original?.dispose(),e?.modified?.dispose()}let Tt=y(()=>ye(k.value)),Et=y(()=>N.value?`file:${N.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:!k.value.some(t=>t.path.toLowerCase().includes(e))});async function At(){P.value=!0;try{let e=E.value?new URLSearchParams({mode:`commits`,from:d.compareFrom,to:d.compareTo}):new URLSearchParams({mode:B.value});!E.value&&B.value===`branch`&&z.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();k.value=n.files,A.value=n.sourceBranch??``,M.value=n.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{P.value=!1}}async function jt(e){if(I.value){F.value=!0;try{W||(self.MonacoEnvironment={getWorker(e,t){return t===`json`?new Worker(new URL(`/assets/json.worker-BaLYt9Ss.js`,``+import.meta.url),{type:`module`}):t===`css`||t===`scss`||t===`less`?new Worker(new URL(`/assets/css.worker-CBlhdqTa.js`,``+import.meta.url),{type:`module`}):t===`html`||t===`handlebars`||t===`razor`?new Worker(new URL(`/assets/html.worker-BKBrNna1.js`,``+import.meta.url),{type:`module`}):t===`typescript`||t===`javascript`?new Worker(new URL(`/assets/ts.worker-PmaSgaZk.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/editor.worker-Cu3tR8iJ.js`,``+import.meta.url),{type:`module`})}},W=await re(()=>import(`./editor.main-BRcMV3rU.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),W.editor.defineTheme(`kobo-dark`,{base:`vs-dark`,inherit:!0,rules:[],colors:{"editor.background":`#1a1a2e`,"diffEditor.insertedTextBackground":`#22c55e20`,"diffEditor.removedTextBackground":`#ef444420`}}));let t=E.value?`path=${encodeURIComponent(e)}&mode=commits&from=${encodeURIComponent(d.compareFrom)}&to=${encodeURIComponent(d.compareTo)}`:`path=${encodeURIComponent(e)}&mode=${B.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=W.editor.createModel(r.original??``,i),o=W.editor.createModel(r.modified??``,i);G=W.editor.createDiffEditor(I.value,{theme:`kobo-dark`,readOnly:!$.value,originalEditable:!1,renderSideBySide:L.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18,hideUnchangedRegions:{enabled:R.value,contextLineCount:3,minimumLineCount:3,revealLineCount:20}}),G.addCommand(W.KeyMod.CtrlCmd|W.KeyCode.KeyS,()=>{$.value&&X.value&&!Z.value&&Nt()}),G.setModel({original:a,modified:o}),Ct.value=r.modifiedSha??``,Y.value=r.modified??``,X.value=!1,W&&(r.modified??``).includes(`\r
|
|
8
8
|
`)&&o.setEOL(W.editor.EndOfLineSequence.CRLF),Q?.();let s=o.onDidChangeContent(()=>{X.value=o.getValue()!==Y.value});Q=()=>s.dispose(),Rt(),V.value===`review`&&(xt(),_t(e))}catch(e){console.error(`Failed to load file diff:`,e)}finally{F.value=!1}}}async function Mt(){if(E.value||!G)return{ok:!1,status:0};let e=G.getModel()?.modified;if(!e||!N.value)return{ok:!1,status:0};let t=e.getValue(),n=d.workspaceId,r=N.value,i=Ct.value;Z.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=${B.value}`,{cache:`no-store`});if(t.ok){let n=await t.json();Ct.value=n.modifiedSha??``,Y.value=n.modified??``,X.value=e.getValue()!==Y.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{Z.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()=>{N.value&&await jt(N.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(),N.value===e&&(k.value.some(t=>t.path===e)?await jt(e):N.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(!G)return;for(let e of K)e.dispose();K=[];let e=G.getModifiedEditor(),t=G.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();Lt.value=!!(e&&!e.isEmpty())});K.push(e)}}function zt(){if(!(!G||!N.value))for(let e of[G.getModifiedEditor(),G.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===G.getModifiedEditor()?`modified`:`original`;S(`sendToChat`,`\`\`\`\n// ${N.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}c(N,async(e,t)=>{if(X.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){N.value=t,e.status===412?Pt():T.notify({type:`negative`,message:C(`diffViewer.saveFailed`),position:`top`});return}}else if(e===`cancel`){N.value=t;return}}e?jt(e):wt()}),c(L,()=>{G&&G.updateOptions({renderSideBySide:L.value===`side`})}),c(R,e=>{localStorage.setItem($e,e?`1`:`0`),G&&G.updateOptions({hideUnchangedRegions:{enabled:e,contextLineCount:3,minimumLineCount:3,revealLineCount:20}})}),c(B,async()=>{let e=N.value;await At(),e&&k.value.some(t=>t.path===e)?jt(e):N.value=null}),c(z,async e=>{localStorage.setItem(et,e?`1`:`0`),await At(),N.value&&!k.value.some(e=>e.path===N.value)&&(N.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(()=>{H.flush(),wt()}),(e,n)=>(a(),u(`div`,Fe,[v(`div`,Ie,[f(w,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),v(`span`,Le,m(e.$t(`diff.title`)),1),f(j,{label:`${k.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),A.value?(a(),u(`span`,Re,[B.value===`branch`?(a(),u(p,{key:0},[v(`span`,ze,m(A.value),1),f(w,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),v(`span`,Be,m(M.value),1)],64)):(a(),u(p,{key:1},[v(`span`,Ve,`origin/`+m(M.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),N.value?(a(),u(`span`,He,m(N.value),1)):h(``,!0),$.value&&X.value?(a(),g(D,{key:2,dense:``,flat:``,size:`sm`,"no-caps":``,icon:`save`,label:e.$t(`diffViewer.save`),color:`indigo-4`,loading:Z.value,class:`q-ml-sm`,onClick:Nt},null,8,[`label`,`loading`])):h(``,!0),f(he),E.value?(a(),g(ge,{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(xe,{key:4,modelValue:B.value,"onUpdate:modelValue":n[0]||=e=>B.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(xe,{modelValue:V.value,"onUpdate:modelValue":n[1]||=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.modeInspect`),value:`inspect`},{label:e.$t(`diff.modeReview`),value:`review`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),f(xe,{modelValue:L.value,"onUpdate:modelValue":n[2]||=e=>L.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(D,{icon:R.value?`unfold_less`:`unfold_more`,dense:``,flat:``,size:`sm`,color:R.value?`indigo-4`:`grey-5`,class:`q-mr-sm`,onClick:n[3]||=e=>R.value=!R.value},{default:l(()=>[f(O,{anchor:`bottom middle`,self:`top middle`,delay:400},{default:l(()=>[x(m(R.value?e.$t(`diff.showUnchanged`):e.$t(`diff.hideUnchanged`)),1)]),_:1})]),_:1},8,[`icon`,`color`]),B.value===`branch`?(a(),g(D,{key:5,icon:`visibility`,dense:``,flat:``,size:`sm`,color:z.value?`indigo-4`:`grey-5`,class:`q-mr-sm`,onClick:n[4]||=e=>z.value=!z.value},{default:l(()=>[f(O,{anchor:`bottom middle`,self:`top middle`,delay:400},{default:l(()=>[x(m(z.value?e.$t(`diff.hideUntracked`):e.$t(`diff.showUntracked`)),1)]),_:1})]),_:1},8,[`color`])):h(``,!0),f(D,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,disable:U.value,onClick:n[5]||=e=>S(`close`)},{default:l(()=>[f(O,null,{default:l(()=>[x(m(e.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1},8,[`disable`])]),f(ee,{dark:``}),v(`div`,Ue,[V.value===`review`?(a(),u(`div`,We,[f(Pe,{comments:Oe.value,"global-message":ke.value,submitting:U.value,onUpdateGlobal:_(H).setGlobalMessage,onJumpToFile:at,onJumpToComment:st,onSubmit:Ae},null,8,[`comments`,`global-message`,`submitting`,`onUpdateGlobal`])])):h(``,!0),v(`div`,{class:`diff-file-list-wrapper`,style:b({width:`${lt.value}px`,minWidth:`${rt}px`})},[!P.value&&k.value.length>0?(a(),g(te,{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(pe,{class:`diff-file-list q-pa-xs`,style:{width:`100%`,"border-right":`1px solid #2a2a4a`}},{default:l(()=>[P.value?(a(),g(ce,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):k.value.length===0?(a(),u(`div`,Ge,m(e.$t(`diff.noChanges`)),1)):kt.value?(a(),u(`div`,Ke,m(e.$t(`diff.noFileMatch`)),1)):(a(),g(ve,{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:`)||(N.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`,qe,m(t.label),1),f(j,{label:t.children?_(_e)(t.children):0,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`]),V.value===`review`&&Me(Ne(t))>0?(a(),g(j,{key:0,label:String(Me(Ne(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(O,null,{default:l(()=>[x(m(t.file.status),1)]),_:2},1024)]),_:2},1032,[`style`]),v(`span`,Je,m(t.label),1),X.value&&t.file.path===N.value?(a(),u(`span`,Ye,`●`)):h(``,!0),V.value===`review`&&(je.value.get(t.file.path)??0)>0?(a(),g(j,{key:1,label:String(je.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(fe,{key:2,"touch-position":``,"context-menu":``},{default:l(()=>[f(be,{dense:``,dark:``,style:{"min-width":`220px`}},{default:l(()=>[r((a(),g(ue,{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`])),[[me]])]),_:2},1024)]),_:2},1024)):h(``,!0)],64))]),_:1},8,[`nodes`,`selected`,`filter`]))]),_:1}),v(`div`,{class:`diff-file-list-resize-handle`,onMousedown:ut},null,32)],4),v(`div`,Xe,[F.value?(a(),u(`div`,Ze,[f(ce,{size:`32px`,color:`indigo-4`})])):N.value?h(``,!0):(a(),u(`div`,Qe,m(e.$t(`diff.selectFile`)),1)),v(`div`,{ref_key:`editorWrapperRef`,ref:dt,class:`col`,style:{"min-height":`0`,position:`relative`,overflow:`hidden`}},[v(`div`,{ref_key:`editorContainer`,ref:I,style:{position:`absolute`,inset:`0`}},null,512),(a(!0),u(p,null,t(J.value,e=>(a(),u(`div`,{key:e.zoneId,class:`review-zone-overlay`,style:b({top:`${e.topPx}px`,height:`${e.heightPx}px`})},[f(Ee,{comments:e.comments,"start-in-add-mode":e.transient,onAdd:t=>vt(N.value??``,e.line,t),onUpdate:(t,n)=>yt(N.value??``,e.line,t,n),onDelete:t=>bt(N.value??``,e.line,t),onDismissEmpty:t=>ht(e.line)},null,8,[`comments`,`start-in-add-mode`,`onAdd`,`onUpdate`,`onDelete`,`onDismissEmpty`])],4))),128))],512),Lt.value?(a(),g(D,{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{at as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,B as t,F as n,R as r,S as i,W as a,_ as o,at as ee,b as s,c,ct as l,g as u,h as d,it as te,m as f,p,y as ne}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{t as m}from"./QIcon-CfOEsLsF.js";import{N as h,gt as g,mt as _,s as re}from"./index-DRkpEFKl.js";import{n as v,r as y,t as ie}from"./use-quasar-Bs5QmJMV.js";import{t as b}from"./QBadge-DoPfOZ_x.js";import{t as x}from"./QSpace-e68xsYE1.js";import{t as S}from"./QList-kGlJAb-p.js";import{t as ae}from"./QPage-B-ixPPKx.js";var oe={class:`row items-center q-mb-md`},se={class:`text-h6 q-ml-sm`},ce={key:0,class:`text-grey-6 text-center q-pa-lg`},le={key:1,class:`column q-gutter-md`},ue={class:`text-subtitle2 q-mb-sm`},de={class:`row q-col-gutter-md`},C={class:`col-auto`},w={class:`text-caption text-grey-6`},T={class:`text-body2`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},E={class:`col-auto`},D={class:`text-caption text-grey-6`},O={class:`text-body2`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},k={class:`col`},A={class:`text-caption text-grey-6`},j={class:`text-body2`},M={class:`row items-center`},N={class:`text-subtitle2`},P={class:`row q-col-gutter-md q-mt-xs`},F={class:`col`},I={class:`text-caption text-grey-6`},L={class:`text-body2`},R={class:`col-auto`},z={class:`text-caption text-grey-6`},B={class:`text-body2`},V={class:`col-auto`},H={class:`text-caption text-grey-6`},fe={class:`text-body2`},pe={class:`text-subtitle2 q-mb-sm`},me={class:`column q-gutter-sm`},he={class:`row items-center`},ge={class:`q-ml-sm text-body2`},_e={key:0,class:`text-caption text-grey-5`},ve={key:1,class:`text-caption text-negative`},ye={class:`row items-center`},be={class:`q-ml-sm text-body2`},xe={key:0,class:`text-caption text-grey-5`},Se={key:1,class:`text-caption text-negative`},Ce={class:`row items-center`},we={class:`text-subtitle2`},Te={class:`text-caption text-grey-6 q-mt-xs`},Ee={key:0,class:`q-mt-sm`},De={class:`text-caption text-negative q-mb-xs`},Oe={class:`text-body2`},ke={class:`text-caption text-grey-6`},Ae={class:`row items-center`},je={class:`text-subtitle2`},U={class:`text-subtitle1 q-mt-md q-mb-xs text-grey-5`},Me={class:`row items-center`},Ne={class:`text-subtitle2`},Pe={key:0,class:`text-caption text-grey-7 q-mt-xs`},Fe={class:`text-body2`},Ie={class:`text-caption text-grey-6`},Le={class:`row items-center`},Re={class:`text-subtitle2`},ze={key:0,class:`text-caption text-grey-7 q-mt-xs`},Be={class:`text-body2`},Ve={class:`text-caption text-grey-6`},He={key:0},Ue={class:`row items-center`},We={class:`text-subtitle2`},Ge={key:0,class:`text-caption text-grey-7 q-mt-xs`},Ke={class:`text-body2`},qe={class:`text-caption text-grey-6`},Je={class:`row items-center`},Ye={class:`text-subtitle2`},Xe={key:0,class:`text-caption text-grey-7 q-mt-xs`},Ze={class:`text-body2`},Qe={class:`text-caption text-grey-6`},$e={class:`row items-center`},et={class:`text-subtitle2`},tt={key:0,class:`text-caption text-grey-7 q-mt-xs`},nt={class:`text-body2`},rt={class:`text-subtitle2 q-mb-sm`},it={class:`column q-gutter-xs`},at={class:`row items-center`},ot={class:`q-ml-sm text-caption text-grey-6`},st={class:`row items-center`},ct={class:`q-ml-sm text-caption text-grey-6`},lt={class:`row items-center`},ut={class:`q-ml-sm text-caption text-grey-6`},W=i({__name:`HealthPage`,setup(i){let W=ie(),G=re(),K=e(null),q=e(!1);async function J(){q.value=!0;try{let e=await fetch(`/api/health/report`);if(!e.ok)throw Error(`HTTP ${e.status}`);K.value=await e.json()}catch(e){W.notify({type:`negative`,message:String(e),position:`top`,timeout:4e3})}finally{q.value=!1}}n(J);let dt=p(()=>{let e=K.value?.db.sizeBytes;return e==null?`—`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}),Y=p(()=>{let e=K.value;return e?e.db.schemaVersion===e.db.currentSchemaVersion:!1});function X(e){return e?`check_circle`:`error`}function Z(e){return e?`positive`:`negative`}function Q(e){return new Date(e).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})}function ft(e){let t=Date.now()-new Date(e).getTime();if(Number.isNaN(t)||t<0)return`—`;let n=Math.floor(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);if(r<60)return`${r}m`;let i=Math.floor(r/60);return i<24?`${i}h${r%60?` ${r%60}m`:``}`:`${Math.floor(i/24)}d`}function $(e){G.push({name:`workspace`,params:{id:e}}).catch(()=>{})}return(e,n)=>(r(),d(ae,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:a(()=>[f(`div`,oe,[s(h,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:n[0]||=e=>te(G).back()}),f(`div`,se,l(e.$t(`health.title`)),1),s(x),s(h,{flat:``,dense:``,icon:`refresh`,loading:q.value,label:e.$t(`common.refresh`),onClick:J},null,8,[`loading`,`label`])]),!K.value&&q.value?(r(),o(`div`,ce,l(e.$t(`common.loading`)),1)):K.value?(r(),o(`div`,le,[s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,ue,l(e.$t(`health.envTitle`)),1),f(`div`,de,[f(`div`,C,[f(`div`,w,l(e.$t(`health.version`)),1),f(`div`,T,l(K.value.version),1)]),f(`div`,E,[f(`div`,D,l(e.$t(`health.settingsSchemaVersion`)),1),f(`div`,O,l(K.value.settings.schemaVersion),1)]),f(`div`,k,[f(`div`,A,l(e.$t(`health.koboHome`)),1),f(`div`,j,l(K.value.koboHome),1)])])]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,M,[f(`div`,N,l(e.$t(`health.dbTitle`)),1),s(x),s(m,{name:X(Y.value),color:Z(Y.value)},null,8,[`name`,`color`])]),f(`div`,P,[f(`div`,F,[f(`div`,I,l(e.$t(`health.dbPath`)),1),f(`div`,L,l(K.value.db.path),1)]),f(`div`,R,[f(`div`,z,l(e.$t(`health.dbSize`)),1),f(`div`,B,l(dt.value),1)]),f(`div`,V,[f(`div`,H,l(e.$t(`health.schemaVersion`)),1),f(`div`,fe,l(K.value.db.schemaVersion)+` / `+l(K.value.db.currentSchemaVersion),1)])])]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,pe,l(e.$t(`health.runtimesTitle`)),1),f(`div`,me,[f(`div`,he,[s(m,{name:X(K.value.claudeCli.available),color:Z(K.value.claudeCli.available),size:`sm`},null,8,[`name`,`color`]),f(`span`,ge,l(e.$t(`health.claudeCliTitle`)),1),s(x),K.value.claudeCli.available?(r(),o(`span`,_e,l(K.value.claudeCli.version),1)):(r(),o(`span`,ve,l(e.$t(`health.claudeCliMissing`)),1))]),f(`div`,ye,[s(m,{name:X(K.value.codexCli.available),color:Z(K.value.codexCli.available),size:`sm`},null,8,[`name`,`color`]),f(`span`,be,l(e.$t(`health.codexCliTitle`)),1),s(x),K.value.codexCli.available?(r(),o(`span`,xe,l(K.value.codexCli.version),1)):(r(),o(`span`,Se,l(e.$t(`health.codexCliMissing`)),1))])])]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Ce,[f(`div`,we,l(e.$t(`health.workspacesTitle`)),1),s(x),s(m,{name:X(K.value.workspaces.worktreesMissing.length===0),color:Z(K.value.workspaces.worktreesMissing.length===0)},null,8,[`name`,`color`])]),f(`div`,Te,l(e.$t(`health.workspacesCount`,{total:K.value.workspaces.total,archived:K.value.workspaces.archived})),1),K.value.workspaces.worktreesMissing.length>0?(r(),o(`div`,Ee,[f(`div`,De,l(e.$t(`health.worktreesMissing`,{count:K.value.workspaces.worktreesMissing.length})),1),s(S,{dense:``,dark:``},{default:a(()=>[(r(!0),o(c,null,t(K.value.workspaces.worktreesMissing,e=>(r(),d(y,{key:e.workspaceId},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Oe,l(e.name),1),f(`div`,ke,l(e.path),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):u(``,!0)]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Ae,[f(`div`,je,l(e.$t(`health.sessionsTitle`)),1),s(x),s(m,{name:X(K.value.agentSessions.orphaned===0),color:Z(K.value.agentSessions.orphaned===0)},null,8,[`name`,`color`])]),f(`div`,{class:ee([`text-caption q-mt-xs`,K.value.agentSessions.orphaned>0?`text-negative`:`text-grey-6`])},l(e.$t(`health.sessionsOrphaned`,{n:K.value.agentSessions.orphaned})),3)]),_:1})]),_:1}),f(`div`,U,l(e.$t(`health.activeTitle`)),1),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Me,[s(m,{name:`hourglass_top`,size:`sm`,color:`amber-6`,class:`q-mr-sm`}),f(`div`,Ne,l(e.$t(`health.activeQuotaBackoffs`)),1),s(x),s(b,{label:K.value.active.quotaBackoffs.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.quotaBackoffs.length===0?(r(),o(`div`,Pe,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.quotaBackoffs,t=>(r(),d(y,{key:t.workspaceId,clickable:``,onClick:e=>$(t.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Fe,l(t.name),1),f(`div`,Ie,l(e.$t(`health.quotaResumeAt`,{time:Q(t.targetAt)}))+` · `+l(t.source)+` · retry #`+l(t.retryCount),1)]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Le,[s(m,{name:`schedule`,size:`sm`,color:`indigo-4`,class:`q-mr-sm`}),f(`div`,Re,l(e.$t(`health.activeWakeups`)),1),s(x),s(b,{label:K.value.active.pendingWakeups.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.pendingWakeups.length===0?(r(),o(`div`,ze,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.pendingWakeups,t=>(r(),d(y,{key:t.workspaceId,clickable:``,onClick:e=>$(t.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Be,l(t.name),1),f(`div`,Ve,[ne(l(e.$t(`health.wakeupAt`,{time:Q(t.targetAt)}))+` `,1),t.reason?(r(),o(`span`,He,` · `+l(t.reason),1)):u(``,!0)])]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Ue,[s(m,{name:`autorenew`,size:`sm`,color:`amber-7`,class:`q-mr-sm`}),f(`div`,We,l(e.$t(`health.activeAutoLoop`)),1),s(x),s(b,{label:K.value.active.autoLoopActive.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.autoLoopActive.length===0?(r(),o(`div`,Ge,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.autoLoopActive,t=>(r(),d(y,{key:t.workspaceId,clickable:``,onClick:e=>$(t.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Ke,l(t.name),1),f(`div`,qe,l(t.ready?e.$t(`health.autoLoopReady`):e.$t(`health.autoLoopGrooming`)),1)]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Je,[s(m,{name:`play_arrow`,size:`sm`,color:`green-5`,class:`q-mr-sm`}),f(`div`,Ye,l(e.$t(`health.activeAgentSessions`)),1),s(x),s(b,{label:K.value.active.agentSessionsAlive.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.agentSessionsAlive.length===0?(r(),o(`div`,Xe,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.agentSessionsAlive,t=>(r(),d(y,{key:`${t.workspaceId}-${t.pid}`,clickable:``,onClick:e=>$(t.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Ze,l(t.workspaceName),1),f(`div`,Qe,` pid `+l(t.pid)+` · `+l(e.$t(`health.startedAgo`,{time:ft(t.startedAt)})),1)]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,$e,[s(m,{name:`dns`,size:`sm`,color:`cyan-5`,class:`q-mr-sm`}),f(`div`,et,l(e.$t(`health.activeDevServers`)),1),s(x),s(b,{label:K.value.active.devServersRunning.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.devServersRunning.length===0?(r(),o(`div`,tt,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.devServersRunning,e=>(r(),d(y,{key:e.workspaceId,clickable:``,onClick:t=>$(e.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,nt,l(e.name),1)]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,rt,l(e.$t(`health.integrationsTitle`)),1),f(`div`,it,[f(`div`,at,[s(m,{name:X(K.value.integrations.notion.configured),color:Z(K.value.integrations.notion.configured),size:`sm`},null,8,[`name`,`color`]),n[1]||=f(`span`,{class:`q-ml-sm text-body2`},`Notion`,-1),f(`span`,ot,l(K.value.integrations.notion.configured?e.$t(`health.integrationConfigured`):e.$t(`health.integrationMissing`)),1)]),f(`div`,st,[s(m,{name:X(K.value.integrations.sentry.configured),color:Z(K.value.integrations.sentry.configured),size:`sm`},null,8,[`name`,`color`]),n[2]||=f(`span`,{class:`q-ml-sm text-body2`},`Sentry`,-1),f(`span`,ct,l(K.value.integrations.sentry.configured?e.$t(`health.integrationConfigured`):e.$t(`health.integrationMissing`)),1)]),f(`div`,lt,[s(m,{name:X(K.value.integrations.editor.configured),color:Z(K.value.integrations.editor.configured),size:`sm`},null,8,[`name`,`color`]),n[3]||=f(`span`,{class:`q-ml-sm text-body2`},`Editor`,-1),f(`span`,ut,l(K.value.integrations.editor.configured?e.$t(`health.integrationConfigured`):e.$t(`health.integrationMissing`)),1)])])]),_:1})]),_:1})])):u(``,!0)]),_:1}))}});export{W as default};
|
|
1
|
+
import{$ as e,B as t,F as n,R as r,S as i,W as a,_ as o,at as ee,b as s,c,ct as l,g as u,h as d,it as te,m as f,p,y as ne}from"./vue.runtime.esm-bundler-JZnIeD9D.js";import{t as m}from"./QIcon-CfOEsLsF.js";import{N as h,gt as g,mt as _,s as re}from"./index-DY-0-pzs.js";import{n as v,r as y,t as ie}from"./use-quasar-CCWojS5V.js";import{t as b}from"./QBadge-DoPfOZ_x.js";import{t as x}from"./QSpace-e68xsYE1.js";import{t as S}from"./QList-kGlJAb-p.js";import{t as ae}from"./QPage-B-ixPPKx.js";var oe={class:`row items-center q-mb-md`},se={class:`text-h6 q-ml-sm`},ce={key:0,class:`text-grey-6 text-center q-pa-lg`},le={key:1,class:`column q-gutter-md`},ue={class:`text-subtitle2 q-mb-sm`},de={class:`row q-col-gutter-md`},C={class:`col-auto`},w={class:`text-caption text-grey-6`},T={class:`text-body2`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},E={class:`col-auto`},D={class:`text-caption text-grey-6`},O={class:`text-body2`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},k={class:`col`},A={class:`text-caption text-grey-6`},j={class:`text-body2`},M={class:`row items-center`},N={class:`text-subtitle2`},P={class:`row q-col-gutter-md q-mt-xs`},F={class:`col`},I={class:`text-caption text-grey-6`},L={class:`text-body2`},R={class:`col-auto`},z={class:`text-caption text-grey-6`},B={class:`text-body2`},V={class:`col-auto`},H={class:`text-caption text-grey-6`},fe={class:`text-body2`},pe={class:`text-subtitle2 q-mb-sm`},me={class:`column q-gutter-sm`},he={class:`row items-center`},ge={class:`q-ml-sm text-body2`},_e={key:0,class:`text-caption text-grey-5`},ve={key:1,class:`text-caption text-negative`},ye={class:`row items-center`},be={class:`q-ml-sm text-body2`},xe={key:0,class:`text-caption text-grey-5`},Se={key:1,class:`text-caption text-negative`},Ce={class:`row items-center`},we={class:`text-subtitle2`},Te={class:`text-caption text-grey-6 q-mt-xs`},Ee={key:0,class:`q-mt-sm`},De={class:`text-caption text-negative q-mb-xs`},Oe={class:`text-body2`},ke={class:`text-caption text-grey-6`},Ae={class:`row items-center`},je={class:`text-subtitle2`},U={class:`text-subtitle1 q-mt-md q-mb-xs text-grey-5`},Me={class:`row items-center`},Ne={class:`text-subtitle2`},Pe={key:0,class:`text-caption text-grey-7 q-mt-xs`},Fe={class:`text-body2`},Ie={class:`text-caption text-grey-6`},Le={class:`row items-center`},Re={class:`text-subtitle2`},ze={key:0,class:`text-caption text-grey-7 q-mt-xs`},Be={class:`text-body2`},Ve={class:`text-caption text-grey-6`},He={key:0},Ue={class:`row items-center`},We={class:`text-subtitle2`},Ge={key:0,class:`text-caption text-grey-7 q-mt-xs`},Ke={class:`text-body2`},qe={class:`text-caption text-grey-6`},Je={class:`row items-center`},Ye={class:`text-subtitle2`},Xe={key:0,class:`text-caption text-grey-7 q-mt-xs`},Ze={class:`text-body2`},Qe={class:`text-caption text-grey-6`},$e={class:`row items-center`},et={class:`text-subtitle2`},tt={key:0,class:`text-caption text-grey-7 q-mt-xs`},nt={class:`text-body2`},rt={class:`text-subtitle2 q-mb-sm`},it={class:`column q-gutter-xs`},at={class:`row items-center`},ot={class:`q-ml-sm text-caption text-grey-6`},st={class:`row items-center`},ct={class:`q-ml-sm text-caption text-grey-6`},lt={class:`row items-center`},ut={class:`q-ml-sm text-caption text-grey-6`},W=i({__name:`HealthPage`,setup(i){let W=ie(),G=re(),K=e(null),q=e(!1);async function J(){q.value=!0;try{let e=await fetch(`/api/health/report`);if(!e.ok)throw Error(`HTTP ${e.status}`);K.value=await e.json()}catch(e){W.notify({type:`negative`,message:String(e),position:`top`,timeout:4e3})}finally{q.value=!1}}n(J);let dt=p(()=>{let e=K.value?.db.sizeBytes;return e==null?`—`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}),Y=p(()=>{let e=K.value;return e?e.db.schemaVersion===e.db.currentSchemaVersion:!1});function X(e){return e?`check_circle`:`error`}function Z(e){return e?`positive`:`negative`}function Q(e){return new Date(e).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})}function ft(e){let t=Date.now()-new Date(e).getTime();if(Number.isNaN(t)||t<0)return`—`;let n=Math.floor(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);if(r<60)return`${r}m`;let i=Math.floor(r/60);return i<24?`${i}h${r%60?` ${r%60}m`:``}`:`${Math.floor(i/24)}d`}function $(e){G.push({name:`workspace`,params:{id:e}}).catch(()=>{})}return(e,n)=>(r(),d(ae,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:a(()=>[f(`div`,oe,[s(h,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:n[0]||=e=>te(G).back()}),f(`div`,se,l(e.$t(`health.title`)),1),s(x),s(h,{flat:``,dense:``,icon:`refresh`,loading:q.value,label:e.$t(`common.refresh`),onClick:J},null,8,[`loading`,`label`])]),!K.value&&q.value?(r(),o(`div`,ce,l(e.$t(`common.loading`)),1)):K.value?(r(),o(`div`,le,[s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,ue,l(e.$t(`health.envTitle`)),1),f(`div`,de,[f(`div`,C,[f(`div`,w,l(e.$t(`health.version`)),1),f(`div`,T,l(K.value.version),1)]),f(`div`,E,[f(`div`,D,l(e.$t(`health.settingsSchemaVersion`)),1),f(`div`,O,l(K.value.settings.schemaVersion),1)]),f(`div`,k,[f(`div`,A,l(e.$t(`health.koboHome`)),1),f(`div`,j,l(K.value.koboHome),1)])])]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,M,[f(`div`,N,l(e.$t(`health.dbTitle`)),1),s(x),s(m,{name:X(Y.value),color:Z(Y.value)},null,8,[`name`,`color`])]),f(`div`,P,[f(`div`,F,[f(`div`,I,l(e.$t(`health.dbPath`)),1),f(`div`,L,l(K.value.db.path),1)]),f(`div`,R,[f(`div`,z,l(e.$t(`health.dbSize`)),1),f(`div`,B,l(dt.value),1)]),f(`div`,V,[f(`div`,H,l(e.$t(`health.schemaVersion`)),1),f(`div`,fe,l(K.value.db.schemaVersion)+` / `+l(K.value.db.currentSchemaVersion),1)])])]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,pe,l(e.$t(`health.runtimesTitle`)),1),f(`div`,me,[f(`div`,he,[s(m,{name:X(K.value.claudeCli.available),color:Z(K.value.claudeCli.available),size:`sm`},null,8,[`name`,`color`]),f(`span`,ge,l(e.$t(`health.claudeCliTitle`)),1),s(x),K.value.claudeCli.available?(r(),o(`span`,_e,l(K.value.claudeCli.version),1)):(r(),o(`span`,ve,l(e.$t(`health.claudeCliMissing`)),1))]),f(`div`,ye,[s(m,{name:X(K.value.codexCli.available),color:Z(K.value.codexCli.available),size:`sm`},null,8,[`name`,`color`]),f(`span`,be,l(e.$t(`health.codexCliTitle`)),1),s(x),K.value.codexCli.available?(r(),o(`span`,xe,l(K.value.codexCli.version),1)):(r(),o(`span`,Se,l(e.$t(`health.codexCliMissing`)),1))])])]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Ce,[f(`div`,we,l(e.$t(`health.workspacesTitle`)),1),s(x),s(m,{name:X(K.value.workspaces.worktreesMissing.length===0),color:Z(K.value.workspaces.worktreesMissing.length===0)},null,8,[`name`,`color`])]),f(`div`,Te,l(e.$t(`health.workspacesCount`,{total:K.value.workspaces.total,archived:K.value.workspaces.archived})),1),K.value.workspaces.worktreesMissing.length>0?(r(),o(`div`,Ee,[f(`div`,De,l(e.$t(`health.worktreesMissing`,{count:K.value.workspaces.worktreesMissing.length})),1),s(S,{dense:``,dark:``},{default:a(()=>[(r(!0),o(c,null,t(K.value.workspaces.worktreesMissing,e=>(r(),d(y,{key:e.workspaceId},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Oe,l(e.name),1),f(`div`,ke,l(e.path),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):u(``,!0)]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Ae,[f(`div`,je,l(e.$t(`health.sessionsTitle`)),1),s(x),s(m,{name:X(K.value.agentSessions.orphaned===0),color:Z(K.value.agentSessions.orphaned===0)},null,8,[`name`,`color`])]),f(`div`,{class:ee([`text-caption q-mt-xs`,K.value.agentSessions.orphaned>0?`text-negative`:`text-grey-6`])},l(e.$t(`health.sessionsOrphaned`,{n:K.value.agentSessions.orphaned})),3)]),_:1})]),_:1}),f(`div`,U,l(e.$t(`health.activeTitle`)),1),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Me,[s(m,{name:`hourglass_top`,size:`sm`,color:`amber-6`,class:`q-mr-sm`}),f(`div`,Ne,l(e.$t(`health.activeQuotaBackoffs`)),1),s(x),s(b,{label:K.value.active.quotaBackoffs.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.quotaBackoffs.length===0?(r(),o(`div`,Pe,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.quotaBackoffs,t=>(r(),d(y,{key:t.workspaceId,clickable:``,onClick:e=>$(t.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Fe,l(t.name),1),f(`div`,Ie,l(e.$t(`health.quotaResumeAt`,{time:Q(t.targetAt)}))+` · `+l(t.source)+` · retry #`+l(t.retryCount),1)]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Le,[s(m,{name:`schedule`,size:`sm`,color:`indigo-4`,class:`q-mr-sm`}),f(`div`,Re,l(e.$t(`health.activeWakeups`)),1),s(x),s(b,{label:K.value.active.pendingWakeups.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.pendingWakeups.length===0?(r(),o(`div`,ze,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.pendingWakeups,t=>(r(),d(y,{key:t.workspaceId,clickable:``,onClick:e=>$(t.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Be,l(t.name),1),f(`div`,Ve,[ne(l(e.$t(`health.wakeupAt`,{time:Q(t.targetAt)}))+` `,1),t.reason?(r(),o(`span`,He,` · `+l(t.reason),1)):u(``,!0)])]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Ue,[s(m,{name:`autorenew`,size:`sm`,color:`amber-7`,class:`q-mr-sm`}),f(`div`,We,l(e.$t(`health.activeAutoLoop`)),1),s(x),s(b,{label:K.value.active.autoLoopActive.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.autoLoopActive.length===0?(r(),o(`div`,Ge,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.autoLoopActive,t=>(r(),d(y,{key:t.workspaceId,clickable:``,onClick:e=>$(t.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Ke,l(t.name),1),f(`div`,qe,l(t.ready?e.$t(`health.autoLoopReady`):e.$t(`health.autoLoopGrooming`)),1)]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,Je,[s(m,{name:`play_arrow`,size:`sm`,color:`green-5`,class:`q-mr-sm`}),f(`div`,Ye,l(e.$t(`health.activeAgentSessions`)),1),s(x),s(b,{label:K.value.active.agentSessionsAlive.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.agentSessionsAlive.length===0?(r(),o(`div`,Xe,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.agentSessionsAlive,t=>(r(),d(y,{key:`${t.workspaceId}-${t.pid}`,clickable:``,onClick:e=>$(t.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,Ze,l(t.workspaceName),1),f(`div`,Qe,` pid `+l(t.pid)+` · `+l(e.$t(`health.startedAgo`,{time:ft(t.startedAt)})),1)]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,$e,[s(m,{name:`dns`,size:`sm`,color:`cyan-5`,class:`q-mr-sm`}),f(`div`,et,l(e.$t(`health.activeDevServers`)),1),s(x),s(b,{label:K.value.active.devServersRunning.length,color:`grey-8`,"text-color":`grey-3`},null,8,[`label`])]),K.value.active.devServersRunning.length===0?(r(),o(`div`,tt,l(e.$t(`health.noneActive`)),1)):(r(),d(S,{key:1,dense:``,dark:``,class:`q-mt-xs`},{default:a(()=>[(r(!0),o(c,null,t(K.value.active.devServersRunning,e=>(r(),d(y,{key:e.workspaceId,clickable:``,onClick:t=>$(e.workspaceId)},{default:a(()=>[s(v,null,{default:a(()=>[f(`div`,nt,l(e.name),1)]),_:2},1024)]),_:2},1032,[`onClick`]))),128))]),_:1}))]),_:1})]),_:1}),s(_,{dark:``,flat:``,bordered:``},{default:a(()=>[s(g,null,{default:a(()=>[f(`div`,rt,l(e.$t(`health.integrationsTitle`)),1),f(`div`,it,[f(`div`,at,[s(m,{name:X(K.value.integrations.notion.configured),color:Z(K.value.integrations.notion.configured),size:`sm`},null,8,[`name`,`color`]),n[1]||=f(`span`,{class:`q-ml-sm text-body2`},`Notion`,-1),f(`span`,ot,l(K.value.integrations.notion.configured?e.$t(`health.integrationConfigured`):e.$t(`health.integrationMissing`)),1)]),f(`div`,st,[s(m,{name:X(K.value.integrations.sentry.configured),color:Z(K.value.integrations.sentry.configured),size:`sm`},null,8,[`name`,`color`]),n[2]||=f(`span`,{class:`q-ml-sm text-body2`},`Sentry`,-1),f(`span`,ct,l(K.value.integrations.sentry.configured?e.$t(`health.integrationConfigured`):e.$t(`health.integrationMissing`)),1)]),f(`div`,lt,[s(m,{name:X(K.value.integrations.editor.configured),color:Z(K.value.integrations.editor.configured),size:`sm`},null,8,[`name`,`color`]),n[3]||=f(`span`,{class:`q-ml-sm text-body2`},`Editor`,-1),f(`span`,ut,l(K.value.integrations.editor.configured?e.$t(`health.integrationConfigured`):e.$t(`health.integrationMissing`)),1)])])]),_:1})]),_:1})])):u(``,!0)]),_:1}))}});export{W as default};
|