@loicngr/kobo 1.6.1 → 1.6.2
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/README.md +17 -16
- package/dist/server/index.js +2 -2
- package/dist/server/routes/documents.js +113 -0
- package/package.json +1 -1
- package/src/client/dist/spa/assets/ActivityFeed-CFuT6H5u.js +7 -0
- package/src/client/dist/spa/assets/ActivityFeed-DXYafbn4.css +1 -0
- package/src/client/dist/spa/assets/{ClosePopup-DqhgFbQo.js → ClosePopup-DhM1C4Zw.js} +1 -1
- package/src/client/dist/spa/assets/{CreatePage-DENfwzPL.js → CreatePage-sGrkfyOm.js} +1 -1
- package/src/client/dist/spa/assets/DiffViewer-BVU58ujc.css +1 -0
- package/src/client/dist/spa/assets/DiffViewer-BwSRtVRI.js +2 -0
- package/src/client/dist/spa/assets/{HealthPage-Cjc79NaA.js → HealthPage-BO-bMpEu.js} +1 -1
- package/src/client/dist/spa/assets/MainLayout-BiBJtDTk.css +1 -0
- package/src/client/dist/spa/assets/{MainLayout-CFbMw65L.js → MainLayout-BpqOChIX.js} +17 -17
- package/src/client/dist/spa/assets/QBtn-CyzfM9-_.js +1 -0
- package/src/client/dist/spa/assets/QChip-KJoHYE6F.js +1 -0
- package/src/client/dist/spa/assets/{QDialog-D42GLa1i.js → QDialog-DQeAxY3-.js} +1 -1
- package/src/client/dist/spa/assets/QExpansionItem-DCRks-Ra.js +1 -0
- package/src/client/dist/spa/assets/{QItemSection-GlMrLmz3.js → QItemSection-CGpX7GcL.js} +1 -1
- package/src/client/dist/spa/assets/{QScrollArea-L6wUiA20.js → QScrollArea-e5qTqwcb.js} +1 -1
- package/src/client/dist/spa/assets/QSlideTransition-BQxI8l5r.js +1 -0
- package/src/client/dist/spa/assets/{QTabPanels-Crs-ujNO.js → QTabPanels--6cYe2US.js} +1 -1
- package/src/client/dist/spa/assets/{QTooltip-Cg9E3Dvw.js → QTooltip-C4CPesBX.js} +1 -1
- package/src/client/dist/spa/assets/{SearchPage-Bf-iZnyE.js → SearchPage-BrUbbtgI.js} +1 -1
- package/src/client/dist/spa/assets/{SettingsPage-BdcH3BSs.js → SettingsPage-B3elO1PX.js} +1 -1
- package/src/client/dist/spa/assets/{TouchPan-DFx22dM3.js → TouchPan-BT6phK1f.js} +1 -1
- package/src/client/dist/spa/assets/{WorkspacePage-UUE0pPCR.js → WorkspacePage-BHl17_tY.js} +3 -3
- package/src/client/dist/spa/assets/build-path-tree-Bgl2q74t.js +1 -0
- package/src/client/dist/spa/assets/{cssMode-BYtqFZtm.js → cssMode-B1wQ-79R.js} +1 -1
- package/src/client/dist/spa/assets/documents-CHc8t22V.js +60 -0
- package/src/client/dist/spa/assets/{editor.api-D6ZaO4A_.js → editor.api-CRb_5Zw6.js} +1 -1
- package/src/client/dist/spa/assets/{editor.main-Cc_RDKsq.js → editor.main-C5sdCvGW.js} +3 -3
- package/src/client/dist/spa/assets/{freemarker2-CBm--bBd.js → freemarker2-CVSnsZk-.js} +1 -1
- package/src/client/dist/spa/assets/{handlebars-whX2mkV5.js → handlebars-uL_pucGI.js} +1 -1
- package/src/client/dist/spa/assets/{html-D7ga_o6c.js → html-CatZVwWp.js} +1 -1
- package/src/client/dist/spa/assets/{htmlMode-BXImjcsv.js → htmlMode-DTDzEngo.js} +1 -1
- package/src/client/dist/spa/assets/i18n-D-VdPLEh.js +1 -0
- package/src/client/dist/spa/assets/index-CUI-zN26.js +2 -0
- package/src/client/dist/spa/assets/{javascript-BwmzNMn5.js → javascript-DeHBpolA.js} +1 -1
- package/src/client/dist/spa/assets/{jsonMode-CN5Z5bK_.js → jsonMode-Bma_YGGm.js} +1 -1
- package/src/client/dist/spa/assets/{liquid-CzMNAPor.js → liquid-CW7xQEG_.js} +1 -1
- package/src/client/dist/spa/assets/{mdx-DC_P05Da.js → mdx-BsYUhMzF.js} +1 -1
- package/src/client/dist/spa/assets/{models-DMQoi09X.js → models-BbSRHL9b.js} +1 -1
- package/src/client/dist/spa/assets/{monaco.contribution-BsBaFOOD.js → monaco.contribution-Du0atePv.js} +2 -2
- package/src/client/dist/spa/assets/{python-9DTZ8C3K.js → python-D7DQWXZm.js} +1 -1
- package/src/client/dist/spa/assets/{razor-B1LfM20o.js → razor-B2ZxF301.js} +1 -1
- package/src/client/dist/spa/assets/{scroll-Dh2g7BwR.js → scroll-JVVkg2Ng.js} +1 -1
- package/src/client/dist/spa/assets/{tsMode-DI2bWo8r.js → tsMode-B4Xul5xA.js} +1 -1
- package/src/client/dist/spa/assets/{typescript-BZ9QJ2_N.js → typescript-CdsKQuLT.js} +1 -1
- package/src/client/dist/spa/assets/use-checkbox-DYiZQsbF.js +1 -0
- package/src/client/dist/spa/assets/{use-portal-mhLq4Rqk.js → use-portal-DBe4lcC2.js} +1 -1
- package/src/client/dist/spa/assets/{xml-D6qm6rp0.js → xml-Wap00dMv.js} +1 -1
- package/src/client/dist/spa/assets/{yaml-D2dUr_wY.js → yaml-BxRDHC24.js} +1 -1
- package/src/client/dist/spa/index.html +6 -5
- package/dist/server/routes/plans.js +0 -89
- package/src/client/dist/spa/assets/ActivityFeed-DYtAK49y.js +0 -7
- package/src/client/dist/spa/assets/ActivityFeed-DiwnrdKX.css +0 -1
- package/src/client/dist/spa/assets/DiffViewer-C6q11kmw.js +0 -2
- package/src/client/dist/spa/assets/DiffViewer-DiHFLSk4.css +0 -1
- package/src/client/dist/spa/assets/MainLayout-B5poKEy_.css +0 -1
- package/src/client/dist/spa/assets/QBtn-p1aZtrJH.js +0 -1
- package/src/client/dist/spa/assets/QExpansionItem-5ekmpO-2.js +0 -1
- package/src/client/dist/spa/assets/QMenu-Q69oVX7b.js +0 -1
- package/src/client/dist/spa/assets/i18n-BxLBrD1J.js +0 -1
- package/src/client/dist/spa/assets/index-D997aY4Y.js +0 -2
- package/src/client/dist/spa/assets/marked.esm-DW0ulF0a.js +0 -60
- /package/src/client/dist/spa/assets/{QBadge-BUkmTO0P.js → QBadge-DqtcDv8D.js} +0 -0
- /package/src/client/dist/spa/assets/{QItemLabel-Czw5g0px.js → QItemLabel-Codqjisk.js} +0 -0
- /package/src/client/dist/spa/assets/{QList-DNzlynsS.js → QList-B-MkPF7n.js} +0 -0
- /package/src/client/dist/spa/assets/{QPage-B09NY4Nf.js → QPage-yqdKDG7-.js} +0 -0
- /package/src/client/dist/spa/assets/{QSpace-PlDK6Fg3.js → QSpace-BNr0AftG.js} +0 -0
- /package/src/client/dist/spa/assets/{QSpinnerDots-By20ptst.js → QSpinnerDots-DEiRooBD.js} +0 -0
- /package/src/client/dist/spa/assets/{_plugin-vue_export-helper-CEhRWsKN.js → _plugin-vue_export-helper-r4mAJOHR.js} +0 -0
- /package/src/client/dist/spa/assets/{abap-DiwvWnMr.js → abap-Bgec7Keq.js} +0 -0
- /package/src/client/dist/spa/assets/{apex-CmtZjKlf.js → apex-VBlPwEoQ.js} +0 -0
- /package/src/client/dist/spa/assets/{azcli-DL2My_i-.js → azcli-DKqrEFBx.js} +0 -0
- /package/src/client/dist/spa/assets/{bat-B-nC98wG.js → bat-DdgQWy_0.js} +0 -0
- /package/src/client/dist/spa/assets/{bicep-Ju5MwOgh.js → bicep-CRMM43EB.js} +0 -0
- /package/src/client/dist/spa/assets/{cameligo-8Eu1TyBr.js → cameligo-UatALtML.js} +0 -0
- /package/src/client/dist/spa/assets/{clojure-u-RpMkH3.js → clojure-D8JU08RA.js} +0 -0
- /package/src/client/dist/spa/assets/{coffee-CdA7bbTe.js → coffee-C56wu358.js} +0 -0
- /package/src/client/dist/spa/assets/{cpp-CzNFP8ks.js → cpp-CyZLvhJG.js} +0 -0
- /package/src/client/dist/spa/assets/{csharp-j1LThmcE.js → csharp-BJl3ixva.js} +0 -0
- /package/src/client/dist/spa/assets/{csp-CLRC61y6.js → csp-CxEKxmO-.js} +0 -0
- /package/src/client/dist/spa/assets/{css-r6rC_7P2.js → css-B0t_muXd.js} +0 -0
- /package/src/client/dist/spa/assets/{cypher-CW08XVUh.js → cypher-D1hqiMFD.js} +0 -0
- /package/src/client/dist/spa/assets/{dart-Cs9aL5T_.js → dart-Bz550Pyv.js} +0 -0
- /package/src/client/dist/spa/assets/{dockerfile-BWM0M184.js → dockerfile-CIXgVAuA.js} +0 -0
- /package/src/client/dist/spa/assets/{ecl-MJJuer5P.js → ecl-D9qbvZoA.js} +0 -0
- /package/src/client/dist/spa/assets/{elixir-D2AIuXqn.js → elixir-b2M38fAy.js} +0 -0
- /package/src/client/dist/spa/assets/{flow9-B2H24giC.js → flow9-Dq1UYMkt.js} +0 -0
- /package/src/client/dist/spa/assets/{format-uvONOeL4.js → format-Bttc9ToS.js} +0 -0
- /package/src/client/dist/spa/assets/{formatters-DiJ12fKd.js → formatters-BDadphwz.js} +0 -0
- /package/src/client/dist/spa/assets/{fsharp-CMk2OIJN.js → fsharp-CFNadkg7.js} +0 -0
- /package/src/client/dist/spa/assets/{go-BrMkuJg0.js → go-dSur1iB2.js} +0 -0
- /package/src/client/dist/spa/assets/{graphql-PSR1UKGv.js → graphql-qyhAo11d.js} +0 -0
- /package/src/client/dist/spa/assets/{hcl-DAQrbDOW.js → hcl-DFzjMyzm.js} +0 -0
- /package/src/client/dist/spa/assets/{ini-0TG5BxW0.js → ini-TdzA8TIl.js} +0 -0
- /package/src/client/dist/spa/assets/{java-rgorz17v.js → java-CSGA9pkE.js} +0 -0
- /package/src/client/dist/spa/assets/{julia-C8VMdHm8.js → julia-9izz5OsY.js} +0 -0
- /package/src/client/dist/spa/assets/{kotlin-CllWo3gX.js → kotlin-DuPK7AtF.js} +0 -0
- /package/src/client/dist/spa/assets/{less-Cgca25AP.js → less-B8d93iCg.js} +0 -0
- /package/src/client/dist/spa/assets/{lexon-D0GHdBaw.js → lexon-DWtEIyu7.js} +0 -0
- /package/src/client/dist/spa/assets/{lua-DmRsNG-P.js → lua-Ciq0OGgt.js} +0 -0
- /package/src/client/dist/spa/assets/{m3-BgL5dNKT.js → m3-Cki6JWj_.js} +0 -0
- /package/src/client/dist/spa/assets/{markdown-BuJfycGS.js → markdown-Cu47xwU0.js} +0 -0
- /package/src/client/dist/spa/assets/{mips-C9m_93PR.js → mips-BM8ui995.js} +0 -0
- /package/src/client/dist/spa/assets/{msdax-CpFHC9OI.js → msdax-DqLio0_c.js} +0 -0
- /package/src/client/dist/spa/assets/{mysql-qFvltsqN.js → mysql-v1wbjJOq.js} +0 -0
- /package/src/client/dist/spa/assets/{objective-c-Bnmr858J.js → objective-c-CQl3PGSB.js} +0 -0
- /package/src/client/dist/spa/assets/{pascal-WP0_D5AO.js → pascal-D4iW0ZtD.js} +0 -0
- /package/src/client/dist/spa/assets/{pascaligo-Blom4Rij.js → pascaligo-BdC9CZdj.js} +0 -0
- /package/src/client/dist/spa/assets/{perl-B-vk8g64.js → perl-BL10m4XD.js} +0 -0
- /package/src/client/dist/spa/assets/{pgsql-Cgvz6v67.js → pgsql-Be_oqVo3.js} +0 -0
- /package/src/client/dist/spa/assets/{php-8a3Lrw9m.js → php-BtvXSFRI.js} +0 -0
- /package/src/client/dist/spa/assets/{pla-DuFqEZ8V.js → pla-B2vUy15C.js} +0 -0
- /package/src/client/dist/spa/assets/{postiats-DkLtSgkp.js → postiats-CbmTTfXr.js} +0 -0
- /package/src/client/dist/spa/assets/{powerquery-BJ1aNepW.js → powerquery-DszLhJGx.js} +0 -0
- /package/src/client/dist/spa/assets/{powershell-rE98k687.js → powershell-B0dYktF6.js} +0 -0
- /package/src/client/dist/spa/assets/{protobuf-CUheFacr.js → protobuf-CZvaj1VX.js} +0 -0
- /package/src/client/dist/spa/assets/{pug-LDcAMD8w.js → pug-CPDx1B3S.js} +0 -0
- /package/src/client/dist/spa/assets/{qsharp-DUKSQoR1.js → qsharp-CDP9TFLl.js} +0 -0
- /package/src/client/dist/spa/assets/{r-D-QApv87.js → r-8DbbFX2l.js} +0 -0
- /package/src/client/dist/spa/assets/{rate-limit-labels-BvYERsho.js → rate-limit-labels-BoDORKFj.js} +0 -0
- /package/src/client/dist/spa/assets/{redis-SXdDyWR9.js → redis-DRWj9MtJ.js} +0 -0
- /package/src/client/dist/spa/assets/{redshift-Y6lsCryn.js → redshift-C6cElE_5.js} +0 -0
- /package/src/client/dist/spa/assets/{restructuredtext-edObr9a8.js → restructuredtext-W9pS9n3m.js} +0 -0
- /package/src/client/dist/spa/assets/{ruby-CNnUfF-8.js → ruby-BKnzWnk-.js} +0 -0
- /package/src/client/dist/spa/assets/{rust-IHUZWzBr.js → rust-YPCclWwe.js} +0 -0
- /package/src/client/dist/spa/assets/{sb-DrUvY44N.js → sb-BgM4DTFb.js} +0 -0
- /package/src/client/dist/spa/assets/{scala-B4hbXGLM.js → scala-fz1OPLMl.js} +0 -0
- /package/src/client/dist/spa/assets/{scheme-BGrd12j3.js → scheme-8Uz1RIbu.js} +0 -0
- /package/src/client/dist/spa/assets/{scss-x5G1ES4U.js → scss-Djo3IYXr.js} +0 -0
- /package/src/client/dist/spa/assets/{shell-DOehe2Y8.js → shell-CINF5Tx_.js} +0 -0
- /package/src/client/dist/spa/assets/{solidity-BeRvcwWV.js → solidity-GgiNEuUm.js} +0 -0
- /package/src/client/dist/spa/assets/{sophia-DZbkUNjy.js → sophia-Culj97P9.js} +0 -0
- /package/src/client/dist/spa/assets/{sparql-B7_oi5-h.js → sparql-C2ZlpxOY.js} +0 -0
- /package/src/client/dist/spa/assets/{sql-CTlsFWVE.js → sql-BEf5Pg7Y.js} +0 -0
- /package/src/client/dist/spa/assets/{st-DJVEJdPE.js → st-CT6UUoeH.js} +0 -0
- /package/src/client/dist/spa/assets/{swift-CwhT3fYa.js → swift-B5g0xTG3.js} +0 -0
- /package/src/client/dist/spa/assets/{systemverilog-BQN63pkN.js → systemverilog-CEgQz9DR.js} +0 -0
- /package/src/client/dist/spa/assets/{tcl-DqwfpskA.js → tcl-D0qL2L0I.js} +0 -0
- /package/src/client/dist/spa/assets/{touch-D_A29lik.js → touch-CBLrR6_z.js} +0 -0
- /package/src/client/dist/spa/assets/{twig-BiyenUgc.js → twig-BFUAVf1E.js} +0 -0
- /package/src/client/dist/spa/assets/{typespec-CWOJribt.js → typespec-CjVVcNKm.js} +0 -0
- /package/src/client/dist/spa/assets/{use-quasar-BBrzedjR.js → use-quasar-Ch82z8H5.js} +0 -0
- /package/src/client/dist/spa/assets/{vb-Cq5F87m3.js → vb-CZJr-DQz.js} +0 -0
- /package/src/client/dist/spa/assets/{wgsl-BAvW2lVr.js → wgsl-ivoXUo2e.js} +0 -0
package/README.md
CHANGED
|
@@ -2,12 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> **Kōbō** (工房) — Japanese for *workshop*. A multi-workspace agent manager for [Claude Code](https://claude.com/claude-code).
|
|
4
4
|
|
|
5
|
-
> [!
|
|
6
|
-
> 🚧 **
|
|
7
|
-
> ⚠️ **Planned refactor with potential data loss** — A major refactor is planned and may require database/schema changes that can cause data loss.
|
|
8
|
-
> ❌ **Do not use in production** until this refactor is complete and a stable migration path is documented.
|
|
9
|
-
>
|
|
10
|
-
> **Engine refactor in progress.** The legacy `agent-manager.ts` has been split into an agent engine abstraction (`src/server/services/agent/`) with a pluggable `AgentEngine` contract, a shared `Orchestrator`, and a normalised `AgentEvent` stream. The Claude Code CLI is now one engine among potentially several (`src/server/services/agent/engines/claude-code/`). A runtime migration (`content-migration-service.ts`) converts legacy `ws_events` into the new normalised form on first boot after upgrade; **a timestamped copy of `kobo.db` is written alongside it before the migration runs**, so you can roll back by restoring the backup if anything goes sideways. Expect continued churn until the WebSocket event surface and UI stream reducers stabilise.
|
|
5
|
+
> [!NOTE]
|
|
6
|
+
> 🚧 **Active development** — breaking changes may still land on `develop`. The database layer ships with forward-only migrations and a timestamped pre-migration backup of `kobo.db` before any schema change, so upgrades preserve your data even across invasive refactors.
|
|
11
7
|
|
|
12
8
|
Kōbō lets you delegate multiple coding missions to Claude Code agents in parallel. Each workspace lives in its own isolated git worktree with its own branch, its own Claude session, optionally its own dev server, and a custom MCP tools server the agent uses to track progress. A Vue 3 dashboard shows live agent output, tasks, acceptance criteria, and git state across every workspace.
|
|
13
9
|
|
|
@@ -16,25 +12,31 @@ Think of it as an apprentice's hall: you hand out missions, each apprentice sets
|
|
|
16
12
|
## Features
|
|
17
13
|
|
|
18
14
|
- **Isolated git worktrees** — every workspace runs on its own branch in its own directory, so concurrent Claude sessions never step on each other
|
|
19
|
-
- **
|
|
15
|
+
- **Pluggable agent engine** — Kōbō talks to agents through an `AgentEngine` contract with a normalised `AgentEvent` stream (`src/server/services/agent/engines/`). Claude Code is the first engine; dropping in another runtime (e.g. the Claude Agent SDK) only requires a new adapter, not a rewrite of the UI or orchestration layer
|
|
16
|
+
- **Rich chat feed** — live streaming text, thinking blocks, inline tool calls with expandable diffs for Edit/Write, per-turn session cards, markdown rendering, jump-to-previous-user-message button, and infinite scroll-up over persisted history
|
|
20
17
|
- **Task & acceptance criteria tracking** — the agent reports progress through a dedicated MCP server (`kobo-tasks`) that reads and updates tasks directly from the SQLite database
|
|
18
|
+
- **Documents panel** — tree view in the right drawer that surfaces every AI-generated markdown file under `docs/plans/`, `docs/superpowers/`, and `.ai/thoughts/`. Paths mentioned in chat messages are auto-detected against the catalogue and become one-click deep-links into the panel
|
|
19
|
+
- **Git panel with inline diff viewer** — Monaco-powered side-by-side / inline diff of the working branch against its source, with file tree (same q-tree as Documents), inline rebase/merge conflict resolution, and a clean action bar: `Sync` split-button (pull / rebase / merge), `Push`, `Diff`, `Create PR`
|
|
21
20
|
- **Notion integration** — pull workspace missions straight from Notion pages, extract markdown, and use it as the source of truth for acceptance criteria
|
|
22
21
|
- **Sentry integration** — paste a Sentry issue URL to spin up a dedicated "fix workspace" with the stacktrace, tags, and offending spans written to `.ai/thoughts/SENTRY-<id>.md`; the agent is primed with a TDD fix workflow and has access to the Sentry MCP tools for deeper digging
|
|
23
22
|
- **Per-workspace dev servers** — start/stop Docker or Node dev servers scoped to each branch, with log streaming
|
|
24
23
|
- **Conventional-commit enforcement** — project-level git conventions are written to `.ai/.git-conventions.md` inside every workspace so Claude follows them during commits
|
|
25
|
-
- **Pull request automation** — one-click `push`, `pull`,
|
|
24
|
+
- **Pull request automation** — one-click `push`, `pull`, `open-pr`, and "change PR base" endpoints integrate with the GitHub CLI, using a configurable prompt template
|
|
26
25
|
- **Multi-session support** — create multiple Claude agent sessions per workspace, each with its own chat history; resume completed sessions via `--resume`; sessions are named and persisted in localStorage
|
|
27
26
|
- **Prompt templates** — personal library of reusable prompts with variable substitution (`{working_branch}`, `{commit_count}`, etc.), insertable from the chat input via `/` autocomplete; editable in Settings > Templates
|
|
28
|
-
- **
|
|
27
|
+
- **Favorites and tags** — pin workspaces to the top via right-click favourite, organise with per-workspace tags filterable from the sidebar; a global tag catalogue keeps colours consistent across workspaces
|
|
28
|
+
- **Health panel + config export/import** — inspect backend health (agent sessions, migration state, dev servers, DB size) and roundtrip your Kōbō config (settings, templates, skills) between machines via JSON
|
|
29
|
+
- **Usage tracking** — rolling input/output token counts and cost estimates per workspace, aggregated across sessions and live-updated from `usage` events
|
|
30
|
+
- **Resizable right drawer** — drag-to-resize horizontally and vertically, with tab state and split ratio persisted to localStorage
|
|
29
31
|
- **Soft interrupt** — pause an agent mid-execution (SIGINT, like pressing Escape in Claude Code) without killing the process; the agent stops the current tool and waits for the next message
|
|
30
32
|
- **Archive instead of delete** — soft-remove workspaces without losing the worktree, branches, or history; unarchive restores the exact pre-archive state
|
|
31
33
|
|
|
32
34
|
## Tech stack
|
|
33
35
|
|
|
34
36
|
- **Backend** — Node.js ≥ 20, [Hono](https://hono.dev/), [better-sqlite3](https://github.com/WiseLibs/better-sqlite3), [ws](https://github.com/websockets/ws), [`@modelcontextprotocol/sdk`](https://github.com/modelcontextprotocol/typescript-sdk)
|
|
35
|
-
- **Frontend** — [Vue 3](https://vuejs.org/), [Quasar 2](https://quasar.dev/), [Pinia](https://pinia.vuejs.org/), `vue-router`
|
|
37
|
+
- **Frontend** — [Vue 3](https://vuejs.org/), [Quasar 2](https://quasar.dev/), [Pinia](https://pinia.vuejs.org/), `vue-router`, [Monaco Editor](https://microsoft.github.io/monaco-editor/) (git diff viewer), `marked` + `dompurify` (markdown rendering)
|
|
36
38
|
- **Tooling** — TypeScript, [Vitest](https://vitest.dev/), [Biome](https://biomejs.dev/) (lint + format), `tsx` for dev
|
|
37
|
-
- **Storage** — single SQLite file (`~/.config/kobo/kobo.db` by default, overridable via `KOBO_HOME`) with WAL mode
|
|
39
|
+
- **Storage** — single SQLite file (`~/.config/kobo/kobo.db` by default, overridable via `KOBO_HOME`) with WAL mode and forward-only migrations
|
|
38
40
|
|
|
39
41
|
## Quick start
|
|
40
42
|
|
|
@@ -51,7 +53,7 @@ Think of it as an apprentice's hall: you hand out missions, each apprentice sets
|
|
|
51
53
|
### Run via `npx` (recommended)
|
|
52
54
|
|
|
53
55
|
```bash
|
|
54
|
-
PORT=9999 npx @loicngr/kobo@latest
|
|
56
|
+
SERVER_PORT=9998 PORT=9999 npx @loicngr/kobo@latest
|
|
55
57
|
```
|
|
56
58
|
|
|
57
59
|
That's it. npm downloads the package, installs dependencies, starts the Kōbō server on the port you specified, and serves the web UI at `http://localhost:9999`. Data is persisted to `~/.config/kobo/` (overridable via `KOBO_HOME`).
|
|
@@ -244,10 +246,10 @@ See [`AGENTS.md`](./AGENTS.md) for a deeper dive into conventions, data model, W
|
|
|
244
246
|
|
|
245
247
|
| Table | Purpose |
|
|
246
248
|
|---|---|
|
|
247
|
-
| `workspaces` | the unit of work — branch, status,
|
|
249
|
+
| `workspaces` | the unit of work — branch, status, model, engine, `archived_at`, `favorited_at`, `tags`, Notion link, … |
|
|
248
250
|
| `tasks` | workspace sub-items — tasks and acceptance criteria |
|
|
249
|
-
| `agent_sessions` |
|
|
250
|
-
| `ws_events` | persisted WebSocket events for replay on reconnect |
|
|
251
|
+
| `agent_sessions` | agent runs — pid, `engine_session_id`, lifecycle |
|
|
252
|
+
| `ws_events` | persisted WebSocket events (chat history, `agent:event` stream, user messages) for replay on reconnect |
|
|
251
253
|
|
|
252
254
|
## MCP server
|
|
253
255
|
|
|
@@ -274,7 +276,6 @@ This is a personal tool, but PRs and issues are welcome. Before submitting:
|
|
|
274
276
|
1. Read [`AGENTS.md`](./AGENTS.md) — it covers the commit rules, branching model, and code conventions
|
|
275
277
|
2. Run `npm run lint`, `npx tsc --noEmit`, and `npm test` locally
|
|
276
278
|
3. Base your branch on `develop` (not `main`); PRs target `develop`
|
|
277
|
-
4. **Do not add `Co-Authored-By` trailers** in commits, even for AI-assisted work
|
|
278
279
|
|
|
279
280
|
CI runs lint + type check + tests on every PR to `develop`.
|
|
280
281
|
|
package/dist/server/index.js
CHANGED
|
@@ -8,13 +8,13 @@ import WebSocket, { WebSocketServer } from 'ws';
|
|
|
8
8
|
import { closeDb, getDb } from './db/index.js';
|
|
9
9
|
import { runMigrations } from './db/migrations.js';
|
|
10
10
|
import devServerRouter from './routes/dev-server.js';
|
|
11
|
+
import documentsRouter from './routes/documents.js';
|
|
11
12
|
import { enginesRouter } from './routes/engines.js';
|
|
12
13
|
import gitRouter from './routes/git.js';
|
|
13
14
|
import healthRouter from './routes/health.js';
|
|
14
15
|
import imagesRouter from './routes/images.js';
|
|
15
16
|
import { migrationRouter } from './routes/migration.js';
|
|
16
17
|
import notionRouter from './routes/notion.js';
|
|
17
|
-
import plansRouter from './routes/plans.js';
|
|
18
18
|
import searchRouter from './routes/search.js';
|
|
19
19
|
import sentryRouter from './routes/sentry.js';
|
|
20
20
|
import settingsRouter from './routes/settings.js';
|
|
@@ -71,7 +71,7 @@ app.route('/api/git', gitRouter);
|
|
|
71
71
|
app.route('/api/settings', settingsRouter);
|
|
72
72
|
app.route('/api/dev-server', devServerRouter);
|
|
73
73
|
app.route('/api/templates', templatesRouter);
|
|
74
|
-
app.route('/api/workspaces',
|
|
74
|
+
app.route('/api/workspaces', documentsRouter);
|
|
75
75
|
app.route('/api/search', searchRouter);
|
|
76
76
|
app.route('/api/health', healthRouter);
|
|
77
77
|
app.route('/api/engines', enginesRouter);
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { Hono } from 'hono';
|
|
4
|
+
import * as workspaceService from '../services/workspace-service.js';
|
|
5
|
+
/** Hono sub-router for workspace document browsing (read-only). */
|
|
6
|
+
const app = new Hono();
|
|
7
|
+
/**
|
|
8
|
+
* Directories (relative to the worktree root) where AI-generated documents
|
|
9
|
+
* may live. Scanned recursively — any `.md` file found below one of these
|
|
10
|
+
* roots is surfaced in the documents panel.
|
|
11
|
+
*
|
|
12
|
+
* Kept intentionally narrow to avoid leaking unrelated project docs
|
|
13
|
+
* (README, product specs, …) into the panel.
|
|
14
|
+
*/
|
|
15
|
+
const DOCUMENT_DIRS = ['docs/plans', 'docs/superpowers', '.ai/thoughts'];
|
|
16
|
+
/** Only .md files are listed. */
|
|
17
|
+
const MD_EXT = '.md';
|
|
18
|
+
/** Depth cap to keep recursion bounded even on pathological symlink loops. */
|
|
19
|
+
const MAX_DEPTH = 8;
|
|
20
|
+
function walkMarkdownFiles(rootAbs, rootRel, out, depth = 0) {
|
|
21
|
+
if (depth > MAX_DEPTH)
|
|
22
|
+
return;
|
|
23
|
+
let entries;
|
|
24
|
+
try {
|
|
25
|
+
entries = readdirSync(rootAbs);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
if (entry.startsWith('.') && entry !== '.ai')
|
|
32
|
+
continue; // skip hidden except `.ai`
|
|
33
|
+
const absEntry = path.join(rootAbs, entry);
|
|
34
|
+
const relEntry = `${rootRel}/${entry}`;
|
|
35
|
+
let stat;
|
|
36
|
+
try {
|
|
37
|
+
stat = statSync(absEntry);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (stat.isDirectory()) {
|
|
43
|
+
walkMarkdownFiles(absEntry, relEntry, out, depth + 1);
|
|
44
|
+
}
|
|
45
|
+
else if (stat.isFile() && entry.endsWith(MD_EXT)) {
|
|
46
|
+
out.push({
|
|
47
|
+
path: relEntry,
|
|
48
|
+
name: entry,
|
|
49
|
+
modifiedAt: stat.mtime.toISOString(),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// GET /:id/documents — list every .md file under DOCUMENT_DIRS in the workspace worktree
|
|
55
|
+
app.get('/:id/documents', (c) => {
|
|
56
|
+
try {
|
|
57
|
+
const id = c.req.param('id');
|
|
58
|
+
const workspace = workspaceService.getWorkspace(id);
|
|
59
|
+
if (!workspace) {
|
|
60
|
+
return c.json({ error: `Workspace '${id}' not found` }, 404);
|
|
61
|
+
}
|
|
62
|
+
const worktreePath = path.join(workspace.projectPath, '.worktrees', workspace.workingBranch);
|
|
63
|
+
const documents = [];
|
|
64
|
+
for (const dir of DOCUMENT_DIRS) {
|
|
65
|
+
const absDir = path.join(worktreePath, dir);
|
|
66
|
+
if (!existsSync(absDir))
|
|
67
|
+
continue;
|
|
68
|
+
walkMarkdownFiles(absDir, dir, documents);
|
|
69
|
+
}
|
|
70
|
+
// Sort by modifiedAt descending (most recent first)
|
|
71
|
+
documents.sort((a, b) => new Date(b.modifiedAt).getTime() - new Date(a.modifiedAt).getTime());
|
|
72
|
+
return c.json({ documents });
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
76
|
+
return c.json({ error: message }, 500);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// GET /:id/document?path=<relative> — read a single document
|
|
80
|
+
app.get('/:id/document', (c) => {
|
|
81
|
+
try {
|
|
82
|
+
const id = c.req.param('id');
|
|
83
|
+
const filePath = c.req.query('path');
|
|
84
|
+
if (!filePath) {
|
|
85
|
+
return c.json({ error: 'Missing path query parameter' }, 400);
|
|
86
|
+
}
|
|
87
|
+
const workspace = workspaceService.getWorkspace(id);
|
|
88
|
+
if (!workspace) {
|
|
89
|
+
return c.json({ error: `Workspace '${id}' not found` }, 404);
|
|
90
|
+
}
|
|
91
|
+
// Security: normalize the path and verify it stays within allowed roots.
|
|
92
|
+
const normalized = path.normalize(filePath);
|
|
93
|
+
if (normalized.includes('..') ||
|
|
94
|
+
!DOCUMENT_DIRS.some((dir) => normalized.startsWith(`${dir}/`) || normalized === dir)) {
|
|
95
|
+
return c.json({ error: `Invalid path: must be under ${DOCUMENT_DIRS.map((d) => `${d}/`).join(', ')}` }, 400);
|
|
96
|
+
}
|
|
97
|
+
if (!normalized.endsWith(MD_EXT)) {
|
|
98
|
+
return c.json({ error: 'Only .md files can be read' }, 400);
|
|
99
|
+
}
|
|
100
|
+
const worktreePath = path.join(workspace.projectPath, '.worktrees', workspace.workingBranch);
|
|
101
|
+
const absPath = path.join(worktreePath, normalized);
|
|
102
|
+
if (!existsSync(absPath)) {
|
|
103
|
+
return c.json({ error: `Document not found: ${normalized}` }, 404);
|
|
104
|
+
}
|
|
105
|
+
const content = readFileSync(absPath, 'utf-8');
|
|
106
|
+
return c.json({ content, path: normalized });
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
110
|
+
return c.json({ error: message }, 500);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
export default app;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loicngr/kobo",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
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",
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{E as e,F as t,H as n,L as r,M as i,Q as a,U as o,_t as s,bt as c,d as l,f as u,g as d,h as f,l as p,p as m,r as h,rt as g,u as _,v,yt as y}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{L as b,l as x,t as S}from"./QIcon-B0-pH3Qs.js";import{t as C}from"./QBtn-CyzfM9-_.js";import{n as w}from"./vue-i18n-CeG0hR0Z.js";import{S as T,v as E,x as D}from"./index-CUI-zN26.js";import{t as O}from"./QSpinnerDots-DEiRooBD.js";import{t as k}from"./QExpansionItem-DCRks-Ra.js";import{t as ee}from"./QScrollArea-e5qTqwcb.js";import{n as A,r as j,t as M}from"./documents-CHc8t22V.js";import{t as N}from"./_plugin-vue_export-helper-r4mAJOHR.js";function te(e,t,n=!0){let r=[],i=new Map,a=new Map;for(let n=0;n<e.length;n++){let o=e[n],s=t?.[n];switch(o.kind){case`message:text`:{let e=i.get(o.messageId);if(e)e.text+=o.text,e.streaming=o.streaming;else{let e={type:`text`,messageId:o.messageId,text:o.text,streaming:o.streaming,ts:s};i.set(o.messageId,e),r.push(e)}break}case`message:end`:{let e=i.get(o.messageId);e&&(e.streaming=!1);break}case`message:thinking`:r.push({type:`thinking`,messageId:o.messageId,text:o.text,ts:s});break;case`tool:call`:{let e={type:`tool`,toolCallId:o.toolCallId,name:o.name,input:o.input,ts:s};a.set(o.toolCallId,e),r.push(e);break}case`tool:result`:{let e=a.get(o.toolCallId);e&&(e.result={output:o.output,isError:o.isError});break}case`session:started`:r.push({type:`session`,kind:`started`,detail:{engineSessionId:o.engineSessionId,model:o.model},ts:s});break;case`session:ended`:r.push({type:`session`,kind:`ended`,detail:{reason:o.reason,exitCode:o.exitCode},ts:s});break;case`session:compacted`:r.push({type:`session`,kind:`compacted`,ts:s});break;case`session:brainstorm-complete`:case`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 ne(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts})),r=[...e,...n];r.sort((e,t)=>{let n=e.ts??``,r=t.ts??``;return n===r?0:n?r?n<r?-1:1:-1:1});let i;for(let e of r)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!i||e.ts>i)&&(i=e.ts);if(i)for(let e of r)e.type===`text`&&e.streaming&&(!e.ts||e.ts<i)&&(e.streaming=!1);return r}function P(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:`user`;case`session`:return`session`;default:return`agent`}}function F(e){let t=[],n=null;for(let r of e){let e=P(r),i=e===`session`||e===`system-prompt`;!n||n.speaker!==e||i?(n={speaker:e,ts:r.ts,items:[r]},t.push(n),i&&(n=null)):n.items.push(r)}return t}var I={class:`text-caption text-grey-6`},L=v({__name:`SessionEventItem`,props:{item:{}},setup(e){let n=e,r=p(()=>{switch(n.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,n)=>(t(),m(`span`,I,c(e.$t(r.value)),1))}});function R(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){z(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 z(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=N(v({__name:`TextMessageItem`,props:{item:{}},setup(e){let n=e,r=M(),i=E(),a=p(()=>{let e=i.selectedWorkspaceId;return e?r.documentsFor(e).map(e=>e.path):[]}),o=p(()=>{let e=R(A.parse(n.item.text,{async:!1,breaks:!0,gfm:!0}),a.value);return j.sanitize(e,{ADD_ATTR:[`data-document-path`]})});function s(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let n=t.getAttribute(`data-document-path`),a=i.selectedWorkspaceId;!n||!a||r.openDocumentByPath(a,n)}return(n,r)=>(t(),m(`div`,{class:`markdown-message`,onClick:s},[_(`div`,{innerHTML:o.value},null,8,V),e.item.streaming?(t(),l(x,{key:0,size:`xs`,class:`q-ml-xs`})):u(``,!0)]))}}),[[`__scopeId`,`data-v-0ac5a3e4`]]),U={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},W=[`innerHTML`],G={key:1,style:{"white-space":`pre-wrap`}},K=N(v({__name:`ThinkingItem`,props:{item:{}},setup(e){let n=e,r=p(()=>n.item.text.trim().slice(0,100)),i=p(()=>n.item.text.trim().length>0),a=p(()=>n.item.text.trim().length>100),s=p(()=>{let e=A.parse(n.item.text,{async:!1,breaks:!0,gfm:!0});return j.sanitize(e)});return(n,d)=>i.value?(t(),m(`div`,U,[a.value?(t(),l(k,{key:0,dense:``,"dense-toggle":``,label:r.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:o(()=>[_(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:s.value},null,8,W)]),_:1},8,[`label`])):(t(),m(`span`,G,c(e.item.text),1))])):u(``,!0)}}),[[`__scopeId`,`data-v-e9fb9f90`]]);function q(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
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 J(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??``;return{toolName:`Edit`,filePath:e,oldString:t,newString:r,replaceAll:n.replace_all??!1,additions:r?r.split(`
|
|
4
|
+
`).length:0,deletions:t?t.split(`
|
|
5
|
+
`).length:0}}if(e===`Write`){let e=n.file_path;if(!e)return null;let t=n.content??``;return{toolName:`Write`,filePath:e,content:t,additions:t?t.split(`
|
|
6
|
+
`).length:0,deletions:0}}if(e===`Bash`){let e=(n.command??``).match(/^\s*rm\s+(?:-[a-zA-Z]*\s+)*(.+)/);if(e)return{toolName:`Bash:rm`,filePath:e[1].trim().replace(/["']/g,``),additions:0,deletions:1}}return null}function Y(e,t){if(!e||!t?.projectPath)return e;let n=X(e,`${t.projectPath}/.worktrees/${t.workingBranch}`);return n===e&&(n=X(e,t.projectPath)),n}function X(e,t){if(!t)return e;let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return e.replace(RegExp(`${n}/`,`g`),``).replace(RegExp(`${n}(?=\\s|$|["'\`])`,`g`),`.`)}var re={class:`tool-name`},ie=[`title`],ae={key:0,class:`tool-stat-add`},oe={key:1,class:`tool-stat-del`},se={class:`diff-sign`},ce={key:1,class:`tool-row tool-row-generic`},le={class:`tool-header`},ue={class:`tool-name`},de=[`title`],fe={key:0,class:`tool-output`},pe=N(v({__name:`ToolCallItem`,props:{item:{}},setup(e){let n=e,i=a(!1),o=E(),g=p(()=>J(n.item.name,n.item.input)),v=p(()=>g.value?Y(g.value.filePath,o.selectedWorkspace):``),y={Bash:`terminal`,Read:`description`,Edit:`edit`,Write:`edit_note`,MultiEdit:`edit`,Glob:`folder_open`,Grep:`manage_search`,LS:`list`,Skill:`auto_awesome`,Task:`hub`,Agent:`hub`,TodoWrite:`checklist`,TodoRead:`checklist`,ToolSearch:`search`,WebFetch:`public`,WebSearch:`travel_explore`,NotebookRead:`book`,NotebookEdit:`edit_note`,SendMessage:`send`,ExitPlanMode:`check_circle_outline`,KillShell:`stop_circle`,BashOutput:`terminal`},x=p(()=>y[n.item.name]??`build`),C=p(()=>{if(g.value)return``;let e=n.item.input,t=w(e);return t?Y(t,o.selectedWorkspace):``});function w(e){if(!e||typeof e!=`object`)return typeof e==`string`?e:``;let t=e;for(let e of[`file_path`,`path`,`command`,`pattern`,`query`,`url`,`skill`,`description`,`subject`,`prompt`]){let n=t[e];if(typeof n==`string`&&n.length>0)return n}for(let e of Object.values(t))if(typeof e==`string`&&e.length>0)return e;return``}let T=p(()=>{let e=g.value;return e?e.toolName===`Edit`&&e.oldString!==void 0&&e.newString!==void 0?q(e.oldString,e.newString):e.toolName===`Write`&&e.content!==void 0?e.content.split(`
|
|
7
|
+
`).map(e=>({type:`add`,content:e})):e.toolName===`Bash:rm`?[{type:`del`,content:`File deleted`}]:null:null}),D=p(()=>{let e=n.item.result;if(!e)return``;if(typeof e.output==`string`)return e.output;try{return JSON.stringify(e.output)}catch{return String(e.output)}});function O(){i.value=!i.value}return(n,a)=>g.value?(t(),m(`div`,{key:0,class:s([`tool-row`,{"tool-row-expanded":i.value}])},[_(`div`,{class:`tool-header`,onClick:O},[d(S,{name:x.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),_(`span`,re,c(g.value.toolName===`Bash:rm`?`Bash`:g.value.toolName),1),_(`span`,{class:`tool-path`,title:g.value.filePath},c(v.value),9,ie),g.value.additions>0?(t(),m(`span`,ae,`+`+c(g.value.additions),1)):u(``,!0),g.value.deletions>0?(t(),m(`span`,oe,`-`+c(g.value.deletions),1)):u(``,!0),e.item.result?.isError?(t(),l(S,{key:2,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-xs`})):e.item.result?(t(),l(S,{key:3,name:`check`,color:`positive`,size:`xs`,class:`q-ml-xs`})):u(``,!0),d(S,{name:i.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-auto text-grey-6`},null,8,[`name`])]),i.value&&T.value?(t(),m(`div`,{key:0,class:`tool-diff`,onClick:a[0]||=b(()=>{},[`stop`])},[(t(!0),m(h,null,r(T.value,(e,n)=>(t(),m(`div`,{key:n,class:s([`diff-line`,{"diff-del":e.type===`del`,"diff-add":e.type===`add`,"diff-context":e.type===`context`}])},[_(`span`,se,c(e.type===`del`?`-`:e.type===`add`?`+`:` `),1),f(c(e.content),1)],2))),128))])):u(``,!0)],2)):(t(),m(`div`,ce,[_(`div`,le,[d(S,{name:x.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),_(`span`,ue,c(e.item.name),1),C.value?(t(),m(`span`,{key:0,class:`tool-arg`,title:w(e.item.input)||C.value},c(C.value),9,de)):u(``,!0),e.item.result?.isError?(t(),l(S,{key:1,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-auto`})):e.item.result?(t(),l(S,{key:2,name:`check`,color:`positive`,size:`xs`,class:`q-ml-auto`})):u(``,!0)]),e.item.result&&D.value?(t(),m(`div`,fe,c(D.value),1)):u(``,!0)]))}}),[[`__scopeId`,`data-v-440d2c83`]]),me=[`innerHTML`],he={key:1,class:`markdown-message`},ge=[`innerHTML`],_e=N(v({__name:`UserMessageItem`,props:{item:{}},setup(e){let n=e,r=p(()=>n.item.sender===`system-prompt`),i=p(()=>{let e=A.parse(n.item.content,{async:!1,breaks:!0,gfm:!0});return j.sanitize(e)});return(e,n)=>r.value?(t(),l(k,{key:0,dense:``,"dense-toggle":``,label:e.$t(`chat.systemPrompt`),"header-class":`text-grey-5 text-caption`},{default:o(()=>[_(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:i.value},null,8,me)]),_:1},8,[`label`])):(t(),m(`div`,he,[_(`div`,{innerHTML:i.value},null,8,ge)]))}}),[[`__scopeId`,`data-v-cb8cec0f`]]),ve={class:`turn-header`},ye={key:0,class:`turn-time`},be={key:1,class:`turn-actions`},xe={class:`turn-body`},Se=N(v({__name:`TurnCard`,props:{turn:{}},setup(e){let n=e,{t:i}=w(),a=p(()=>{switch(n.turn.speaker){case`user`:return{label:i(`chat.you`),accent:`#ce93d8`,badgeClass:`turn-badge-user`};case`agent`:return{label:i(`chat.agent`),accent:`#7986cb`,badgeClass:`turn-badge-agent`};case`system-prompt`:return{label:i(`chat.systemPrompt`),accent:`#757575`,badgeClass:`turn-badge-system`};case`session`:return{label:i(`chat.session`),accent:`#616161`,badgeClass:`turn-badge-session`}}}),o=p(()=>{if(!n.turn.ts)return``;let e=new Date(n.turn.ts);return Number.isNaN(e.getTime())?``:e.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})}),d=p(()=>n.turn.items.filter(e=>e.type===`tool`).length);return(n,f)=>(t(),m(`div`,{class:s([`turn-card`,{"turn-card--user":e.turn.speaker===`user`}]),style:y({"--turn-accent":a.value.accent})},[_(`div`,ve,[_(`span`,{class:s([`turn-badge`,a.value.badgeClass])},c(a.value.label),3),o.value?(t(),m(`span`,ye,c(o.value),1)):u(``,!0),d.value>0?(t(),m(`span`,be,` · `+c(g(i)(`chat.nActions`,{n:d.value})),1)):u(``,!0)]),_(`div`,xe,[(t(!0),m(h,null,r(e.turn.items,(e,n)=>(t(),m(h,{key:n},[e.type===`text`?(t(),l(H,{key:0,item:e},null,8,[`item`])):e.type===`thinking`?(t(),l(K,{key:1,item:e},null,8,[`item`])):e.type===`tool`?(t(),l(pe,{key:2,item:e},null,8,[`item`])):e.type===`user`?(t(),l(_e,{key:3,item:e},null,8,[`item`])):e.type===`session`?(t(),l(L,{key:4,item:e},null,8,[`item`])):u(``,!0)],64))),128))])],6))}}),[[`__scopeId`,`data-v-8a9ce6dd`]]),Ce={key:0,class:`activity-feed-switching`},we={key:1,class:`activity-feed-wrap`},Te={key:0,class:`text-center q-py-sm text-caption text-grey-6`},Ee={class:`q-pa-md`},De={key:1,class:`q-px-md q-pb-md`},Z=60,Q=200,$=200,Oe=400,ke=200,Ae=N(v({__name:`ActivityFeed`,props:{workspaceId:{}},setup(s){let g=s,v=T(),y=D(),b=E(),S=p(()=>(b.activityFeeds[g.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`).map(e=>({content:e.content,sender:e.meta?.sender??`user`,ts:e.timestamp,sessionId:e.sessionId}))),w=p(()=>{let e=b.workspaces.find(e=>e.id===g.workspaceId);return e?e.status===`extracting`||e.status===`brainstorming`||e.status===`executing`:!1}),A=p(()=>{let e=ne(te(v.eventsFor(g.workspaceId),v.timestampsFor(g.workspaceId),w.value),S.value);return F(y.showVerboseSystemMessages?e:e.filter(e=>e.type!==`session`))}),j=p(()=>y.showVerboseSystemMessages?v.eventsFor(g.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),M=a(null),N=!0,P=a(!1),I=!1,L=a(!0);function R(e){N=e.verticalSize-e.verticalPosition-e.verticalContainerSize<=Z,I&&e.verticalPosition<=Q&&!P.value&&v.hasMoreOlderFor(g.workspaceId)&&z()}async function z(){let t=g.workspaceId,n=v.oldestIdFor(t);if(!n)return;P.value=!0;let r=Date.now();try{let r=M.value,i=r?.getScroll().verticalSize??0,a=r?.getScroll().verticalPosition??0,o=fetch(`/api/workspaces/${t}/events?before=${encodeURIComponent(n)}&limit=200`),s=new Promise(e=>setTimeout(e,$)),[c]=await Promise.all([o,s]);if(!c.ok){v.prepend(t,[],[],{oldestId:n,hasMoreOlder:!1});return}let l=await c.json(),u=l.events??[],d=u.filter(e=>e.type===`agent:event`&&e.workspaceId===t),f=u.filter(e=>e.type===`user:message`&&e.workspaceId===t),p=d.map(e=>e.payload),m=d.map(e=>e.createdAt),h=d.map(e=>e.sessionId??null),g=u.length>0?u[0].id:n;v.prepend(t,p,m,{oldestId:g,hasMoreOlder:l.hasMore,sessionIds:h});for(let e of f){let n=e.payload;typeof n.content==`string`&&b.addActivityItem(t,{id:e.id,type:`text`,content:n.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:n.sender??`user`}})}if(await e(),r){let e=r.getScroll().verticalSize-i,t=Math.max(a+e,Q+50);r.setScrollPosition(`vertical`,t,0)}}catch(e){console.error(`[ActivityFeed] failed to load older events:`,e)}finally{let e=Date.now()-r,t=Math.max(0,$-e);await new Promise(e=>setTimeout(e,t+Oe)),P.value=!1}}async function B(t=0){await e();let n=M.value;if(!n)return;let r=n.getScroll();n.setScrollPosition(`vertical`,r.verticalSize,t)}let V=a([]),H=a(null);function U(){let e=A.value,t=V.value,n=[];if(t.length===e.length){for(let r=0;r<e.length;r++){if(e[r].speaker!==`user`)continue;let i=t[r]?.$el;i&&n.push(i)}if(n.length>0)return n}let r=H.value?.parentElement;if(r){let e=r.querySelectorAll(`.turn-card--user`);for(let t of e)n.push(t)}return n}function W(){let e=M.value;if(!e)return null;let t=H.value;if(!t)return null;let n=e.getScroll().verticalPosition,r=t.getBoundingClientRect().top,i=null;for(let e of U()){let t=e.getBoundingClientRect().top-r;if(t<n-40)i=t;else break}return i}async function G(){let t=M.value;if(!t)return;let n=W();if(n===null)for(let t=0;t<15&&v.hasMoreOlderFor(g.workspaceId);t++){for(;P.value;)await new Promise(e=>setTimeout(e,50));if(await z(),await e(),n=W(),n!==null)break}n!==null&&t.setScrollPosition(`vertical`,Math.max(0,n-12),250)}async function K(){I=!1,await e(),await B(0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{I=!0})})}let q=p(()=>v.eventsFor(g.workspaceId).length);async function J(){L.value=!0;let e=Date.now();await new Promise(e=>setTimeout(e,ke));let t=e+5e3;for(;q.value===0&&Date.now()<t;)await new Promise(e=>setTimeout(e,50));L.value=!1}n(L,async e=>{!e&&q.value>0&&await K()}),i(()=>{J(),q.value>0&&K()});let Y=!1;return n(q,async(e,t)=>{if(!Y&&e>0){Y=!0,await K();return}e>t&&N&&!P.value&&await B(180)}),n(()=>g.workspaceId,()=>{N=!0,Y=!1,I=!1,J(),q.value>0&&K()}),n(()=>b.selectedSessionId,async()=>{N=!0,I=!1,await K()}),n(p(()=>S.value.filter(e=>e.sender!==`system-prompt`).length),async(e,t)=>{e>t&&(N=!0,await B(180))}),(e,n)=>L.value?(t(),m(`div`,Ce,[d(O,{size:`40px`,color:`indigo-4`})])):(t(),m(`div`,we,[d(ee,{ref_key:`scrollRef`,ref:M,class:`activity-feed-scroll`,onScroll:R},{default:o(()=>[_(`div`,{ref_key:`contentOriginRef`,ref:H,class:`content-origin-marker`},null,512),P.value?(t(),m(`div`,Te,[d(x,{size:`sm`}),f(` `+c(e.$t(`activity.loading_older`)),1)])):u(``,!0),_(`div`,Ee,[(t(!0),m(h,null,r(A.value,(e,n)=>(t(),l(Se,{key:n,ref_for:!0,ref_key:`turnRefs`,ref:V,turn:e},null,8,[`turn`]))),128))]),j.value.length?(t(),m(`div`,De,[d(k,{label:e.$t(`activity.raw_lines`,{n:j.value.length}),dense:``},{default:o(()=>[(t(!0),m(h,null,r(j.value,(e,n)=>(t(),m(`div`,{key:n,class:`text-caption text-grey q-pa-xs`},c(e),1))),128))]),_:1},8,[`label`])])):u(``,!0)]),_:1},512),d(C,{round:``,dense:``,unelevated:``,color:`grey-9`,"text-color":`grey-3`,icon:`arrow_upward`,size:`sm`,class:`activity-feed-prev-btn`,title:e.$t(`activity.prev_user_message`),onClick:G},null,8,[`title`])]))}}),[[`__scopeId`,`data-v-51e2c6eb`]]);export{Ae as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.markdown-message[data-v-0ac5a3e4]{color:#e0e0e0;word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-0ac5a3e4] *{max-width:100%}.markdown-message[data-v-0ac5a3e4] p{margin:0 0 .5em}.markdown-message[data-v-0ac5a3e4] p:last-child{margin-bottom:0}.markdown-message[data-v-0ac5a3e4] pre{background:#00000059;border-radius:4px;margin:.5em 0;padding:.5em .75em;overflow-x:auto}.markdown-message[data-v-0ac5a3e4] code{word-break:break-all;background:#0000004d;border-radius:3px;padding:.1em .3em;font-size:.9em}.markdown-message[data-v-0ac5a3e4] pre code{background:0 0;padding:0}.markdown-message[data-v-0ac5a3e4] ul,.markdown-message[data-v-0ac5a3e4] ol{margin:.25em 0 .5em;padding-left:1.5em}.markdown-message[data-v-0ac5a3e4] li{margin:.15em 0}.markdown-message[data-v-0ac5a3e4] a{color:#7986cb;text-decoration:underline}.markdown-message[data-v-0ac5a3e4] .document-link{color:#9fa8da;cursor:pointer;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-message[data-v-0ac5a3e4] .document-link:hover{color:#c5cae9;-webkit-text-decoration:underline;text-decoration:underline}.markdown-message[data-v-0ac5a3e4] h1,.markdown-message[data-v-0ac5a3e4] h2,.markdown-message[data-v-0ac5a3e4] h3,.markdown-message[data-v-0ac5a3e4] h4,.markdown-message[data-v-0ac5a3e4] h5,.markdown-message[data-v-0ac5a3e4] h6{margin:.5em 0 .3em;font-weight:600;line-height:1.3}.markdown-message[data-v-0ac5a3e4] h1{font-size:1.25em}.markdown-message[data-v-0ac5a3e4] h2{font-size:1.15em}.markdown-message[data-v-0ac5a3e4] h3{font-size:1.08em}.markdown-message[data-v-0ac5a3e4] h4,.markdown-message[data-v-0ac5a3e4] h5,.markdown-message[data-v-0ac5a3e4] h6{font-size:1em}.markdown-message[data-v-0ac5a3e4] blockquote{color:#ffffffb3;border-left:3px solid #fff3;margin:.5em 0;padding-left:.75em}.markdown-message[data-v-0ac5a3e4] table{border-collapse:collapse;margin:.5em 0}.markdown-message[data-v-0ac5a3e4] th,.markdown-message[data-v-0ac5a3e4] td{border:1px solid #ffffff26;padding:.25em .5em}.markdown-thinking[data-v-e9fb9f90] p{margin:0 0 .4em}.markdown-thinking[data-v-e9fb9f90] p:last-child{margin-bottom:0}.markdown-thinking[data-v-e9fb9f90] code{background:#ffffff14;border-radius:3px;padding:.1em .3em}.tool-row[data-v-440d2c83]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-440d2c83]{color:#bbb;cursor:default;align-items:center;gap:10px;min-width:0;padding:5px 10px;display:flex}.tool-row:not(.tool-row-generic) .tool-header[data-v-440d2c83]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-440d2c83]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-440d2c83]:hover{background:#ffffff08}.tool-icon[data-v-440d2c83]{color:#9fbce0;flex-shrink:0}.tool-name[data-v-440d2c83]{color:#d0d0d0;flex-shrink:0;font-weight:600}.tool-arg[data-v-440d2c83],.tool-path[data-v-440d2c83]{color:#999;text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11.5px;overflow:hidden}.tool-path[data-v-440d2c83],.tool-arg[data-v-440d2c83]{flex:1}.tool-stat-add[data-v-440d2c83]{color:#66bb6a;flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-440d2c83]{color:#ef5350;flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-440d2c83]{background:#0003;border-radius:4px;max-height:400px;margin-top:4px;padding:8px 0;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px;line-height:1.5;overflow:auto}.diff-line[data-v-440d2c83]{white-space:pre;color:#bbb;padding:0 12px}.diff-sign[data-v-440d2c83]{color:#555;-webkit-user-select:none;user-select:none;width:14px;display:inline-block}.diff-add[data-v-440d2c83]{color:#c8e6c9;background:#66bb6a1a}.diff-add .diff-sign[data-v-440d2c83]{color:#66bb6a}.diff-del[data-v-440d2c83]{color:#ffcdd2;background:#ef53501a}.diff-del .diff-sign[data-v-440d2c83]{color:#ef5350}.tool-output[data-v-440d2c83]{color:#aaa;white-space:pre-wrap;background:#00000026;border-radius:4px;max-height:8em;margin-top:4px;padding:6px 10px;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px;overflow:auto}.markdown-message[data-v-cb8cec0f]{color:#e0e0e0;word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-cb8cec0f] *{max-width:100%}.markdown-message[data-v-cb8cec0f] code{word-break:break-all}.markdown-message[data-v-cb8cec0f] p{margin:0 0 .4em}.markdown-message[data-v-cb8cec0f] p:last-child{margin-bottom:0}.markdown-message[data-v-cb8cec0f] code{background:#00000040;border-radius:3px;padding:.1em .3em}.markdown-message[data-v-cb8cec0f] h1,.markdown-message[data-v-cb8cec0f] h2,.markdown-message[data-v-cb8cec0f] h3,.markdown-message[data-v-cb8cec0f] h4,.markdown-message[data-v-cb8cec0f] h5,.markdown-message[data-v-cb8cec0f] h6{margin:.4em 0 .25em;font-weight:600;line-height:1.3}.markdown-message[data-v-cb8cec0f] h1{font-size:1.25em}.markdown-message[data-v-cb8cec0f] h2{font-size:1.15em}.markdown-message[data-v-cb8cec0f] h3{font-size:1.08em}.markdown-message[data-v-cb8cec0f] h4,.markdown-message[data-v-cb8cec0f] h5,.markdown-message[data-v-cb8cec0f] h6{font-size:1em}.markdown-user-prompt[data-v-cb8cec0f]{color:#aaa;font-size:12px;font-style:italic}.markdown-user-prompt[data-v-cb8cec0f] p{margin:0 0 .4em}.markdown-user-prompt[data-v-cb8cec0f] code{background:#ffffff14;border-radius:3px;padding:.1em .3em;font-style:normal}.turn-card[data-v-8a9ce6dd]{border:1px solid #ffffff14;border-left:3px solid var(--turn-accent);background:#ffffff05;border-radius:6px;min-width:0;max-width:100%;margin:14px 0;overflow:hidden}.turn-header[data-v-8a9ce6dd]{color:#888;background:#ffffff08;border-bottom:1px solid #ffffff0d;align-items:center;gap:8px;padding:8px 14px;font-size:11px;display:flex}.turn-badge[data-v-8a9ce6dd]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-8a9ce6dd]{color:#ce93d8;background:#ce93d826}.turn-badge-agent[data-v-8a9ce6dd]{color:#7986cb;background:#7986cb26}.turn-badge-system[data-v-8a9ce6dd]{color:#bdbdbd;background:#75757533;font-style:italic}.turn-badge-session[data-v-8a9ce6dd]{color:#9e9e9e;background:#61616133}.turn-time[data-v-8a9ce6dd]{color:#666;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px}.turn-actions[data-v-8a9ce6dd]{color:#777;font-size:11px}.turn-body[data-v-8a9ce6dd]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-8a9ce6dd]>*{min-width:0;max-width:100%}.turn-body[data-v-8a9ce6dd] .tool-row+.tool-row{margin-top:-8px}.activity-feed-wrap[data-v-51e2c6eb]{width:100%;height:100%;position:relative}.activity-feed-scroll[data-v-51e2c6eb]{width:100%;height:100%}.activity-feed-prev-btn[data-v-51e2c6eb]{z-index:2;opacity:.8;transition:opacity .12s;position:absolute;bottom:14px;right:14px}.activity-feed-prev-btn[data-v-51e2c6eb]:hover{opacity:1}.content-origin-marker[data-v-51e2c6eb]{pointer-events:none;width:0;height:0;margin:0;padding:0}.activity-feed-scroll[data-v-51e2c6eb] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-51e2c6eb]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{k as e,m as t}from"./QIcon-B0-pH3Qs.js";import{i as n,r}from"./use-portal-
|
|
1
|
+
import{k as e,m as t}from"./QIcon-B0-pH3Qs.js";import{i as n,r}from"./use-portal-DBe4lcC2.js";function i(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var a=e({name:`close-popup`,beforeMount(e,{value:a}){let o={depth:i(a),handler(t){o.depth!==0&&setTimeout(()=>{let i=n(e);i!==void 0&&r(i,t,o.depth)})},handlerKey(e){t(e,13)===!0&&o.handler(e)}};e.__qclosepopup=o,e.addEventListener(`click`,o.handler),e.addEventListener(`keyup`,o.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=i(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{a as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{F as e,H as t,L as n,M as r,N as i,Q as a,T as ee,U as o,bt as s,d as c,f as l,g as u,h as d,l as f,p,r as m,rt as te,u as h,v as ne,vt as re,x as ie}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{I as g,L as _,M as ae,t as v}from"./QIcon-B0-pH3Qs.js";import{t as y}from"./QSeparator-rkjCbX2M.js";import{t as b}from"./QBtn-
|
|
1
|
+
import{F as e,H as t,L as n,M as r,N as i,Q as a,T as ee,U as o,bt as s,d as c,f as l,g as u,h as d,l as f,p,r as m,rt as te,u as h,v as ne,vt as re,x as ie}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{I as g,L as _,M as ae,t as v}from"./QIcon-B0-pH3Qs.js";import{t as y}from"./QSeparator-rkjCbX2M.js";import{t as b}from"./QBtn-CyzfM9-_.js";import{n as oe}from"./vue-i18n-CeG0hR0Z.js";import{g as se,i as x,m as ce,v as le,x as ue}from"./index-CUI-zN26.js";import{n as S,t as C}from"./QItemSection-CGpX7GcL.js";import{t as w}from"./QItemLabel-Codqjisk.js";import{t as de}from"./QExpansionItem-DCRks-Ra.js";import{t as fe}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as pe}from"./QSpace-BNr0AftG.js";import{t as T}from"./QTooltip-C4CPesBX.js";import{t as me}from"./use-quasar-Ch82z8H5.js";import{n as E,t as he}from"./models-BbSRHL9b.js";import{t as ge}from"./QPage-yqdKDG7-.js";var _e={class:`create-inner`},ve={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},ye={class:`create-card rounded-borders`},be={class:`card-top-bar row items-center q-px-md q-py-xs`},xe={class:`model-badge cursor-default row items-center q-gutter-xs`},Se={class:`text-indigo-3 text-weight-medium text-caption`},Ce={key:0,class:`notion-url-wrap`},we={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Te={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},Ee={key:0,class:`sentry-url-wrap`},De={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},Oe={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},ke={class:`card-name-wrap`},Ae={class:`card-textarea-wrap`},je={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},Me={class:`q-pa-sm manual-section-body`},Ne={class:`row items-center q-gutter-sm q-mb-sm`},Pe={class:`col text-caption text-grey-4`},Fe={class:`q-pa-sm manual-section-body`},Ie={class:`row items-center q-gutter-sm q-mb-sm`},Le={class:`col text-caption text-grey-4`},Re={class:`card-bottom-bar`},ze={class:`bottom-row bottom-row-agent row items-center q-gutter-xs q-px-sm q-py-xs`},Be={class:`bottom-select-label row items-center no-wrap`},Ve={class:`bottom-select-label row items-center no-wrap`},He={class:`bottom-select-label row items-center no-wrap`},Ue={class:`bottom-select-label row items-center no-wrap`},We={class:`bottom-row bottom-row-git row items-center q-gutter-xs q-px-sm q-py-xs`},Ge={class:`bottom-select-label row items-center no-wrap`},Ke={class:`bottom-select-label row items-center no-wrap`},qe={class:`row justify-center q-px-sm q-py-sm`},Je={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Ye=fe(ne({__name:`CreatePage`,setup(ne){let fe=ce(),Ye=me(),Xe=le(),D=ue(),{t:O}=oe(),Ze=a([]),k=a(``),A=a(``),j=a(``),M=a(!1),N=a(`claude-opus-4-7`),P=a(`auto`),F=a(``),I=a(null),L=a(`feature`),R=a(!1),Qe=a([]),z=a(`claude-code`),$e=f(()=>Qe.value.find(e=>e.id===z.value)),et=f(()=>Qe.value.map(e=>({value:e.id,label:e.displayName}))),tt=f(()=>($e.value?.capabilities.permissionModes??[`auto-accept`,`plan`]).map(e=>({value:e,label:O(`engine.permission.${e}`)}))),nt=[{label:`feature/`,value:`feature`},{label:`fix/`,value:`fix`},{label:`hotfix/`,value:`hotfix`},{label:`chore/`,value:`chore`},{label:`refactor/`,value:`refactor`},{label:`docs/`,value:`docs`},{label:`test/`,value:`test`}],B=a(D.global.defaultPermissionMode||`plan`),V=a([]),H=a(!1),U=a(!1),rt=f(()=>he.map(e=>({label:O(e.i18nLabelKey),value:e.value,description:O(e.i18nDescriptionKey)})));function W(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let it=f(()=>[{label:W(O(`reasoning.auto`)),value:`auto`,description:O(`reasoning.autoDescription`)},{label:W(O(`reasoning.low`)),value:`low`,description:O(`reasoning.lowDescription`)},{label:W(O(`reasoning.medium`)),value:`medium`,description:O(`reasoning.mediumDescription`)},{label:W(O(`reasoning.high`)),value:`high`,description:O(`reasoning.highDescription`)},{label:W(O(`reasoning.xhigh`)),value:`xhigh`,description:O(`reasoning.xhighDescription`)},{label:W(O(`reasoning.max`)),value:`max`,description:O(`reasoning.maxDescription`)}]),G=f(()=>j.value.trim().startsWith(`https://www.notion.so/`)),K=a([]),q=a([]),J=a(``),Y=a(``),at=f(()=>!M.value||!G.value);function ot(){let e=J.value.trim();e&&(K.value.push(e),J.value=``)}function st(e){K.value.splice(e,1)}function ct(){let e=Y.value.trim();e&&(q.value.push(e),Y.value=``)}function lt(e){q.value.splice(e,1)}function ut(){M.value=!M.value,M.value||(j.value=``)}let X=a(!1),Z=a(``),Q=f(()=>/\/issues\/\d+/.test(Z.value.trim()));function dt(){X.value=!X.value,X.value||(Z.value=``)}async function ft(e){if(!e.trim()){V.value=[],I.value=null;return}H.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{H.value=!1}}function pt(e){let t=D.getProjectByPath(e);t&&(t.defaultSourceBranch&&(I.value=t.defaultSourceBranch),t.defaultModel?N.value=t.defaultModel:D.global.defaultModel&&(N.value=D.global.defaultModel))}let $=null;t(F,e=>{$&&clearTimeout($),$=setTimeout(()=>{I.value=null,ft(e),pt(e)},500)});function mt(e,t){t(()=>{Ze.value=D.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}r(async()=>{D.fetchSettings();try{let e=await fetch(`/api/engines`);e.ok&&(Qe.value=await e.json())}catch{}}),i(()=>{$&&clearTimeout($)});function ht(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 gt(){return k.value.trim()?k.value.trim().substring(0,80):!M.value&&A.value.trim()&&(A.value.trim().split(`
|
|
2
2
|
`)[0]??``).substring(0,80)||`workspace`}function _t(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 vt(){return M.value&&!G.value?O(`createPage.validationNotionUrl`):X.value&&!Q.value?O(`createPage.sentryValidation`):!M.value&&!X.value&&!A.value.trim()?O(`createPage.validationDescription`):!M.value&&!X.value&&(!gt()||gt()===`workspace`)&&!k.value.trim()&&!A.value.trim()?O(`createPage.validationName`):F.value.trim()?I.value?null:O(`createPage.validationBranch`):O(`createPage.validationPath`)}async function yt(){let e=vt();if(e){Ye.notify({type:`negative`,message:e,position:`top`});return}U.value=!0;try{let e=gt(),t;t=M.value&&G.value?_t(j.value.trim()):e===`workspace`?`task-${Date.now()}`:ht(e);let n=`${L.value}/${t}`,r={name:e,projectPath:F.value.trim(),sourceBranch:I.value,workingBranch:n,engine:z.value,model:N.value,reasoningEffort:P.value,...M.value&&G.value?{notionUrl:j.value.trim()}:{},...X.value&&Q.value?{sentryUrl:Z.value.trim()}:{},...at.value&&K.value.length>0?{tasks:K.value}:{},...at.value&&q.value.length>0?{acceptanceCriteria:q.value}:{},...R.value?{skipSetupScript:!0}:{},...A.value.trim()?{description:A.value.trim()}:{},permissionMode:B.value},i=await Xe.createWorkspace(r);se().subscribe(i.id),Xe.selectWorkspace(i.id),fe.push({name:`workspace`,params:{id:i.id}})}catch{Ye.notify({type:`negative`,message:O(`createPage.errorCreating`),position:`top`})}finally{U.value=!1}}return(t,r)=>(e(),c(ge,{class:`create-page flex flex-center column`},{default:o(()=>[h(`div`,_e,[h(`div`,ve,s(t.$t(`createPage.title`)),1),h(`div`,ye,[h(`div`,be,[h(`span`,xe,[u(v,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),h(`span`,Se,s($e.value?.displayName??t.$t(`createPage.claudeCode`)),1)]),u(pe),u(b,{flat:``,dense:``,"no-caps":``,size:`sm`,color:M.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,onClick:ut},{default:o(()=>[u(v,{name:`description`,size:`14px`,class:`q-mr-xs`}),d(` `+s(M.value?t.$t(`createPage.notionEnabled`):t.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`]),u(b,{flat:``,dense:``,"no-caps":``,size:`sm`,color:X.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,onClick:dt},{default:o(()=>[u(v,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),d(` `+s(X.value?t.$t(`createPage.sentryEnabled`):t.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`])]),u(y,{color:`grey-9`}),u(ae,{name:`slide`},{default:o(()=>[M.value?(e(),p(`div`,Ce,[u(x,{modelValue:j.value,"onUpdate:modelValue":r[0]||=e=>j.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:o(()=>[u(v,{name:`link`,size:`16px`,color:G.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),j.value.trim()&&!G.value?(e(),p(`div`,we,s(t.$t(`createPage.notionValidation`)),1)):l(``,!0),G.value?(e(),p(`div`,Te,s(t.$t(`createPage.notionAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),M.value?(e(),c(y,{key:0,color:`grey-9`})):l(``,!0),u(ae,{name:`slide`},{default:o(()=>[X.value?(e(),p(`div`,Ee,[u(x,{modelValue:Z.value,"onUpdate:modelValue":r[1]||=e=>Z.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.sentryPlaceholder`),class:`sentry-url-input`,"input-class":`sentry-url-input-inner`},{prepend:o(()=>[u(v,{name:`link`,size:`16px`,color:Q.value?`red-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),Z.value.trim()&&!Q.value?(e(),p(`div`,De,s(t.$t(`createPage.sentryValidation`)),1)):l(``,!0),Q.value?(e(),p(`div`,Oe,s(t.$t(`createPage.sentryAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),X.value?(e(),c(y,{key:1,color:`grey-9`})):l(``,!0),h(`div`,ke,[u(x,{modelValue:k.value,"onUpdate:modelValue":r[2]||=e=>k.value=e,borderless:``,dense:``,placeholder:M.value&&G.value?t.$t(`createPage.workspaceName`):t.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),u(y,{color:`grey-9`}),h(`div`,Ae,[u(x,{modelValue:A.value,"onUpdate:modelValue":r[3]||=e=>A.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:M.value?t.$t(`createPage.instructions`):t.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[g(_(yt,[`ctrl`]),[`enter`]),g(_(yt,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`])]),u(y,{color:`grey-9`}),at.value?(e(),p(m,{key:2},[h(`div`,je,s(t.$t(`createPage.manualHint`)),1),u(de,{dark:``,dense:``,label:t.$t(`createPage.tasks`,{count:K.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:o(()=>[h(`div`,Me,[h(`div`,Ne,[u(x,{modelValue:J.value,"onUpdate:modelValue":r[4]||=e=>J.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:g(_(ot,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(b,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!J.value.trim(),onClick:ot},{default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),p(m,null,n(K.value,(n,r)=>(e(),p(`div`,{key:`task-${r}`,class:`row items-center q-py-xs manual-item`},[h(`span`,Pe,s(n),1),u(b,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>st(r)},{default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(de,{dark:``,dense:``,label:t.$t(`createPage.acceptanceCriteria`,{count:q.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:o(()=>[h(`div`,Fe,[h(`div`,Ie,[u(x,{modelValue:Y.value,"onUpdate:modelValue":r[5]||=e=>Y.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:g(_(ct,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(b,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!Y.value.trim(),onClick:ct},{default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),p(m,null,n(q.value,(n,r)=>(e(),p(`div`,{key:`crit-${r}`,class:`row items-center q-py-xs manual-item`},[h(`span`,Le,s(n),1),u(b,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>lt(r)},{default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(y,{color:`grey-9`})],64)):l(``,!0),h(`div`,Re,[h(`div`,ze,[et.value.length>0?(e(),c(E,{key:0,modelValue:z.value,"onUpdate:modelValue":r[6]||=e=>z.value=e,options:et.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,Be,[u(v,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(et.value.find(e=>e.value===z.value)?.label??z.value)+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])):l(``,!0),u(E,{modelValue:N.value,"onUpdate:modelValue":r[7]||=e=>N.value=e,options:rt.value,dense:``,borderless:``,class:`bottom-select rounded-borders model-select`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,Ve,[d(s(rt.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(S,ee(t,{class:`model-option`}),{default:o(()=>[u(C,null,{default:o(()=>[u(w,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(w,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),u(E,{modelValue:P.value,"onUpdate:modelValue":r[8]||=e=>P.value=e,options:it.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,He,[u(v,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(it.value.find(e=>e.value===P.value)?.label??P.value)+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(S,re(ie(t)),{default:o(()=>[u(C,null,{default:o(()=>[u(w,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(w,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),u(E,{modelValue:B.value,"onUpdate:modelValue":r[9]||=e=>B.value=e,options:tt.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[h(`span`,Ue,[u(v,{name:B.value===`plan`?`visibility`:`flash_on`,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),d(` `+s(tt.value.find(e=>e.value===B.value)?.label??B.value)+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`engine.permission`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`]),u(pe),u(b,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:R.value?`play_disabled`:`play_circle`,color:R.value?`orange-4`:`grey-5`,label:t.$t(`createPage.skipSetupScript`),class:`skip-setup-btn`,onClick:r[10]||=e=>R.value=!R.value},{default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])]),h(`div`,We,[u(E,{modelValue:F.value,"onUpdate:modelValue":r[11]||=e=>F.value=e,options:Ze.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:t.$t(`createPage.projectPath`),behavior:te(D).projectPaths.length>0?`menu`:`dialog`,onFilter:mt,onInputValue:r[12]||=e=>{F.value=e}},{prepend:o(()=>[u(v,{name:`folder`,size:`14px`,color:`grey-5`})]),"no-option":o(()=>[u(S,null,{default:o(()=>[u(C,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`]),u(E,{modelValue:L.value,"onUpdate:modelValue":r[13]||=e=>L.value=e,options:nt,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:o(()=>[h(`span`,Ge,[u(v,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(L.value)+`/ `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`]),u(E,{modelValue:I.value,"onUpdate:modelValue":r[14]||=e=>I.value=e,options:V.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,loading:H.value,disable:!F.value.trim()||H.value},{selected:o(()=>[h(`span`,Ke,[u(v,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(I.value??t.$t(`createPage.branch`))+` `,1),u(v,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":o(()=>[u(S,null,{default:o(()=>[u(C,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(F.value.trim()?t.$t(`createPage.noBranches`):t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])]),h(`div`,qe,[u(b,{label:t.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:U.value,onClick:yt},null,8,[`label`,`loading`])])]),h(`div`,Je,s(M.value?t.$t(`createPage.notionExtractHint`):t.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-4f4da343`]]);export{Ye as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.diff-viewer[data-v-0976f177]{background-color:#1a1a2e}.diff-header[data-v-0976f177]{background-color:#16162a;border-bottom:1px solid #2a2a4a;min-height:48px}.diff-file-list[data-v-0976f177]{background-color:#16162a;border-color:#2a2a4a}.diff-tree[data-v-0976f177] .q-tree__node-header{align-items:center;min-height:22px;padding:2px 4px}.diff-tree[data-v-0976f177] .q-tree__node--selected>.q-tree__node-header{background-color:#2a2a4a;border-left:2px solid #6c63ff;outline:1px solid #6c63ff66}.diff-tree[data-v-0976f177] .q-tree__node-header:hover{background-color:#ffffff08}.send-to-chat-btn[data-v-0976f177]{z-index:10;padding:2px 10px;font-size:11px;position:absolute;bottom:16px;right:16px}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-C5sdCvGW.js","assets/index-CUI-zN26.js","assets/vue-i18n-CeG0hR0Z.js","assets/runtime-core.esm-bundler-C3IgBgY5.js","assets/QIcon-B0-pH3Qs.js","assets/use-id-CeduaJbU.js","assets/QSeparator-rkjCbX2M.js","assets/QBtn-CyzfM9-_.js","assets/use-checkbox-DYiZQsbF.js","assets/private.use-form-D1RuEt2P.js","assets/QDialog-DQeAxY3-.js","assets/scroll-JVVkg2Ng.js","assets/use-portal-DBe4lcC2.js","assets/symbols-DCYodwb2.js","assets/index-eX_lKHSg.css","assets/editor.api-CRb_5Zw6.js","assets/editor-COGk2gAX.css","assets/monaco.contribution-Du0atePv.js","assets/editor-CS3NEPi9.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{F as e,H as t,M as n,N as r,Q as i,S as a,U as o,bt as s,d as c,f as l,g as u,h as d,l as f,p,r as m,rt as h,u as g,v as _,yt as ee}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{O as v,a as y,t as b}from"./QIcon-B0-pH3Qs.js";import{t as x}from"./QSeparator-rkjCbX2M.js";import{n as te,t as S}from"./QBtn-CyzfM9-_.js";import{r as C,t as w}from"./private.use-form-D1RuEt2P.js";import{n as ne}from"./vue-i18n-CeG0hR0Z.js";import{f as T}from"./index-CUI-zN26.js";import{t as E}from"./QSpinnerDots-DEiRooBD.js";import{t as re}from"./QScrollArea-e5qTqwcb.js";import{t as D}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as O}from"./QBadge-DqtcDv8D.js";import{t as ie}from"./QSpace-BNr0AftG.js";import{i as k,n as ae,r as oe,t as se}from"./build-path-tree-Bgl2q74t.js";import{t as A}from"./QTooltip-C4CPesBX.js";var j=v({name:`QBtnToggle`,props:{...C,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=f(()=>e.options.find(t=>t.value===e.modelValue)!==void 0),i=w(f(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),o=f(()=>te(e)),s=f(()=>({rounded:e.rounded,dense:e.dense,...o.value})),c=f(()=>e.options.map((t,n)=>{let{attrs:r,value:i,slot:a,...o}=t;return{slot:a,props:{key:n,"aria-pressed":i===e.modelValue?`true`:`false`,...r,...o,...s.value,disable:e.disable===!0||o.disable===!0,color:i===e.modelValue?u(o,`toggleColor`):u(o,`color`),textColor:i===e.modelValue?u(o,`toggleTextColor`):u(o,`textColor`),noCaps:u(o,`noCaps`)===!0,noWrap:u(o,`noWrap`)===!0,size:u(o,`size`),padding:u(o,`padding`),ripple:u(o,`ripple`),stack:u(o,`stack`)===!0,stretch:u(o,`stretch`)===!0,onClick(e){l(i,t,e)}}}}));function l(t,r,i){e.readonly!==!0&&(e.modelValue===t?e.clearable===!0&&(n(`update:modelValue`,null,null),n(`clear`)):n(`update:modelValue`,t,r),n(`click`,i))}function u(t,n){return t[n]===void 0?e[n]:t[n]}function d(){let n=c.value.map(e=>a(S,e.props,e.slot===void 0?void 0:t[e.slot]));return e.name!==void 0&&e.disable!==!0&&r.value===!0&&i(n,`push`),y(t.default,n)}return()=>a(k,{class:`q-btn-toggle`,...o.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}}),M={class:`diff-viewer column full-height`},N={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},P={class:`text-body1 text-weight-medium text-grey-3`},F={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},I={class:`text-grey-7`},L={class:`text-green-4`},R={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},z={class:`row col no-wrap`,style:{"min-height":`0`}},B={key:1,class:`text-caption text-grey-8 q-pa-sm`},V={class:`text-grey-4`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},H={class:`text-grey-3 ellipsis`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},U={class:`col column`,style:{"min-width":`0`,position:`relative`}},W={key:0,class:`col column items-center justify-center`},G={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},K=D(_({__name:`DiffViewer`,props:{workspaceId:{}},emits:[`close`,`sendToChat`],setup(a,{emit:_}){let v=a,y=_,{t:te}=ne(),C=i([]),w=i(``),D=i(``),k=i(null),K=i(!1),q=i(!1),J=i(null),Y=i(`side`),X=null,Z=null,Q=[],ce=f(()=>se(C.value)),le=f(()=>k.value?`file:${k.value}`:``);async function ue(){K.value=!0;try{let e=await fetch(`/api/workspaces/${v.workspaceId}/diff`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();C.value=t.files,w.value=t.sourceBranch??``,D.value=t.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{K.value=!1}}async function de(e){if(J.value){q.value=!0;try{X||(self.MonacoEnvironment={getWorker(e,t){return t===`json`?new Worker(new URL(`/assets/json.worker-C9p7xCYk.js`,``+import.meta.url),{type:`module`}):t===`css`||t===`scss`||t===`less`?new Worker(new URL(`/assets/css.worker-D1piIYC4.js`,``+import.meta.url),{type:`module`}):t===`html`||t===`handlebars`||t===`razor`?new Worker(new URL(`/assets/html.worker-C4q4XMPn.js`,``+import.meta.url),{type:`module`}):t===`typescript`||t===`javascript`?new Worker(new URL(`/assets/ts.worker-Cj3zTgVE.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/editor.worker-CJ9iTmkr.js`,``+import.meta.url),{type:`module`})}},X=await T(()=>import(`./editor.main-C5sdCvGW.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])),X.editor.defineTheme(`kobo-dark`,{base:`vs-dark`,inherit:!0,rules:[],colors:{"editor.background":`#1a1a2e`,"diffEditor.insertedTextBackground":`#22c55e20`,"diffEditor.removedTextBackground":`#ef444420`}}));let t=await fetch(`/api/workspaces/${v.workspaceId}/diff-file?path=${encodeURIComponent(e)}`);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json(),r={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,vue:`html`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,sql:`sql`,py:`python`,rs:`rust`,go:`go`}[e.split(`.`).pop()??``]??`plaintext`;if(Z){for(let e of Q)e.dispose();Q=[];let e=Z.getModel();Z.dispose(),Z=null,e?.original?.dispose(),e?.modified?.dispose()}let i=X.editor.createModel(n.original??``,r),a=X.editor.createModel(n.modified??``,r);Z=X.editor.createDiffEditor(J.value,{theme:`kobo-dark`,readOnly:!0,renderSideBySide:Y.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18}),Z.setModel({original:i,modified:a}),fe()}catch(e){console.error(`Failed to load file diff:`,e)}finally{q.value=!1}}}let $=i(!1);function fe(){if(!Z)return;for(let e of Q)e.dispose();Q=[];let e=Z.getModifiedEditor(),t=Z.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();$.value=!!(e&&!e.isEmpty())});Q.push(e)}}function pe(){if(!(!Z||!k.value))for(let e of[Z.getModifiedEditor(),Z.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===Z.getModifiedEditor()?`modified`:`original`;y(`sendToChat`,`\`\`\`\n// ${k.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}t(k,e=>{e&&de(e)}),t(Y,()=>{Z&&Z.updateOptions({renderSideBySide:Y.value===`side`})});function me(e){switch(e){case`added`:return`#4ade80`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return n(ue),r(()=>{for(let e of Q)e.dispose();if(Q=[],Z){let e=Z.getModel();Z.dispose(),Z=null,e?.original?.dispose(),e?.modified?.dispose()}}),(t,n)=>(e(),p(`div`,M,[g(`div`,N,[u(b,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),g(`span`,P,s(t.$t(`diff.title`)),1),u(O,{label:`${C.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),w.value?(e(),p(`span`,F,[g(`span`,I,s(w.value),1),u(b,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),g(`span`,L,s(D.value),1)])):l(``,!0),k.value?(e(),p(`span`,R,s(k.value),1)):l(``,!0),u(ie),u(j,{modelValue:Y.value,"onUpdate:modelValue":n[0]||=e=>Y.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:t.$t(`diff.side`),value:`side`},{label:t.$t(`diff.inline`),value:`inline`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),u(S,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,onClick:n[1]||=e=>y(`close`)},{default:o(()=>[u(A,null,{default:o(()=>[d(s(t.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1})]),u(x,{dark:``}),g(`div`,z,[u(re,{class:`diff-file-list q-pa-xs`,style:{width:`280px`,"min-width":`200px`,height:`100%`,"border-right":`1px solid #2a2a4a`}},{default:o(()=>[K.value?(e(),c(E,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):C.value.length===0?(e(),p(`div`,B,s(t.$t(`diff.noChanges`)),1)):(e(),c(oe,{key:2,nodes:ce.value,"node-key":`nodeKey`,"label-key":`label`,"children-key":`children`,dark:``,dense:``,"default-expand-all":``,"no-selection-unset":``,selected:le.value,class:`diff-tree`,"onUpdate:selected":n[2]||=e=>{typeof e!=`string`||!e.startsWith(`file:`)||(k.value=e.slice(5))}},{"default-header":o(({node:t})=>[t.isFolder?(e(),p(m,{key:0},[u(b,{name:`folder`,size:`14px`,color:`indigo-4`,class:`q-mr-xs`}),g(`span`,V,s(t.label),1),u(O,{label:t.children?h(ae)(t.children):0,color:`grey-9`,"text-color":`grey-5`,class:`q-ml-xs`,style:{"font-size":`9px`}},null,8,[`label`])],64)):(e(),p(m,{key:1},[u(b,{name:`description`,size:`14px`,style:ee({color:me(t.file.status)}),class:`q-mr-xs`},{default:o(()=>[u(A,null,{default:o(()=>[d(s(t.file.status),1)]),_:2},1024)]),_:2},1032,[`style`]),g(`span`,H,s(t.label),1)],64))]),_:1},8,[`nodes`,`selected`]))]),_:1}),g(`div`,U,[q.value?(e(),p(`div`,W,[u(E,{size:`32px`,color:`indigo-4`})])):k.value?l(``,!0):(e(),p(`div`,G,s(t.$t(`diff.selectFile`)),1)),g(`div`,{ref_key:`editorContainer`,ref:J,class:`col`,style:{"min-height":`0`}},null,512),$.value?(e(),c(S,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:t.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:pe},null,8,[`label`])):l(``,!0)])])]))}}),[[`__scopeId`,`data-v-0976f177`]]);export{K as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as e,L as t,M as n,Q as r,U as i,_t as ee,bt as a,d as o,f as s,g as c,l,p as u,r as te,rt as d,u as f,v as ne}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{t as p}from"./QIcon-B0-pH3Qs.js";import{t as m}from"./QBtn-
|
|
1
|
+
import{F as e,L as t,M as n,Q as r,U as i,_t as ee,bt as a,d as o,f as s,g as c,l,p as u,r as te,rt as d,u as f,v as ne}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{t as p}from"./QIcon-B0-pH3Qs.js";import{t as m}from"./QBtn-CyzfM9-_.js";import{D as h,T as g,m as re}from"./index-CUI-zN26.js";import{n as ie,t as ae}from"./QItemSection-CGpX7GcL.js";import{t as _}from"./QSpace-BNr0AftG.js";import{t as oe}from"./use-quasar-Ch82z8H5.js";import{t as v}from"./QList-B-MkPF7n.js";import{t as y}from"./QPage-yqdKDG7-.js";var b={class:`row items-center q-mb-md`},x={class:`text-h6 q-ml-sm`},S={key:0,class:`text-grey-6 text-center q-pa-lg`},C={key:1,class:`column q-gutter-md`},w={class:`text-subtitle2 q-mb-sm`},T={class:`text-caption text-grey-6`},E={class:`text-body2`},D={class:`row items-center`},O={class:`text-subtitle2`},k={class:`row q-col-gutter-md q-mt-xs`},A={class:`col`},j={class:`text-caption text-grey-6`},M={class:`text-body2`},N={class:`col-auto`},P={class:`text-caption text-grey-6`},F={class:`text-body2`},I={class:`col-auto`},L={class:`text-caption text-grey-6`},R={class:`text-body2`},z={class:`row items-center`},B={class:`text-subtitle2`},V={key:0,class:`text-caption text-grey-5 q-mt-xs`},se={key:1,class:`text-caption text-negative q-mt-xs`},H={class:`row items-center`},U={class:`text-subtitle2`},W={class:`text-caption text-grey-6 q-mt-xs`},G={key:0,class:`q-mt-sm`},K={class:`text-caption text-negative q-mb-xs`},ce={class:`text-body2`},le={class:`text-caption text-grey-6`},ue={class:`row items-center`},de={class:`text-subtitle2`},fe={class:`text-subtitle2 q-mb-sm`},pe={class:`column q-gutter-xs`},me={class:`row items-center`},he={class:`q-ml-sm text-caption text-grey-6`},ge={class:`row items-center`},_e={class:`q-ml-sm text-caption text-grey-6`},ve={class:`row items-center`},ye={class:`q-ml-sm text-caption text-grey-6`},q=ne({__name:`HealthPage`,setup(ne){let q=oe(),be=re(),J=r(null),Y=r(!1);async function X(){Y.value=!0;try{let e=await fetch(`/api/health/report`);if(!e.ok)throw Error(`HTTP ${e.status}`);J.value=await e.json()}catch(e){q.notify({type:`negative`,message:String(e),position:`top`,timeout:4e3})}finally{Y.value=!1}}n(X);let xe=l(()=>{let e=J.value?.db.sizeBytes;return e==null?`—`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}),Z=l(()=>{let e=J.value;return e?e.db.schemaVersion===e.db.currentSchemaVersion:!1});function Q(e){return e?`check_circle`:`error`}function $(e){return e?`positive`:`negative`}return(n,r)=>(e(),o(y,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:i(()=>[f(`div`,b,[c(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:r[0]||=e=>d(be).back()}),f(`div`,x,a(n.$t(`health.title`)),1),c(_),c(m,{flat:``,dense:``,icon:`refresh`,loading:Y.value,label:n.$t(`common.refresh`),onClick:X},null,8,[`loading`,`label`])]),!J.value&&Y.value?(e(),u(`div`,S,a(n.$t(`common.loading`)),1)):J.value?(e(),u(`div`,C,[c(g,{dark:``,flat:``,bordered:``},{default:i(()=>[c(h,null,{default:i(()=>[f(`div`,w,a(n.$t(`health.envTitle`)),1),f(`div`,T,a(n.$t(`health.koboHome`)),1),f(`div`,E,a(J.value.koboHome),1)]),_:1})]),_:1}),c(g,{dark:``,flat:``,bordered:``},{default:i(()=>[c(h,null,{default:i(()=>[f(`div`,D,[f(`div`,O,a(n.$t(`health.dbTitle`)),1),c(_),c(p,{name:Q(Z.value),color:$(Z.value)},null,8,[`name`,`color`])]),f(`div`,k,[f(`div`,A,[f(`div`,j,a(n.$t(`health.dbPath`)),1),f(`div`,M,a(J.value.db.path),1)]),f(`div`,N,[f(`div`,P,a(n.$t(`health.dbSize`)),1),f(`div`,F,a(xe.value),1)]),f(`div`,I,[f(`div`,L,a(n.$t(`health.schemaVersion`)),1),f(`div`,R,a(J.value.db.schemaVersion)+` / `+a(J.value.db.currentSchemaVersion),1)])])]),_:1})]),_:1}),c(g,{dark:``,flat:``,bordered:``},{default:i(()=>[c(h,null,{default:i(()=>[f(`div`,z,[f(`div`,B,a(n.$t(`health.cliTitle`)),1),c(_),c(p,{name:Q(J.value.claudeCli.available),color:$(J.value.claudeCli.available)},null,8,[`name`,`color`])]),J.value.claudeCli.available?(e(),u(`div`,V,a(J.value.claudeCli.version),1)):(e(),u(`div`,se,a(n.$t(`health.cliMissing`)),1))]),_:1})]),_:1}),c(g,{dark:``,flat:``,bordered:``},{default:i(()=>[c(h,null,{default:i(()=>[f(`div`,H,[f(`div`,U,a(n.$t(`health.workspacesTitle`)),1),c(_),c(p,{name:Q(J.value.workspaces.worktreesMissing.length===0),color:$(J.value.workspaces.worktreesMissing.length===0)},null,8,[`name`,`color`])]),f(`div`,W,a(n.$t(`health.workspacesCount`,{total:J.value.workspaces.total,archived:J.value.workspaces.archived})),1),J.value.workspaces.worktreesMissing.length>0?(e(),u(`div`,G,[f(`div`,K,a(n.$t(`health.worktreesMissing`,{count:J.value.workspaces.worktreesMissing.length})),1),c(v,{dense:``,dark:``},{default:i(()=>[(e(!0),u(te,null,t(J.value.workspaces.worktreesMissing,t=>(e(),o(ie,{key:t.workspaceId},{default:i(()=>[c(ae,null,{default:i(()=>[f(`div`,ce,a(t.name),1),f(`div`,le,a(t.path),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})])):s(``,!0)]),_:1})]),_:1}),c(g,{dark:``,flat:``,bordered:``},{default:i(()=>[c(h,null,{default:i(()=>[f(`div`,ue,[f(`div`,de,a(n.$t(`health.sessionsTitle`)),1),c(_),c(p,{name:Q(J.value.agentSessions.orphaned===0),color:$(J.value.agentSessions.orphaned===0)},null,8,[`name`,`color`])]),f(`div`,{class:ee([`text-caption q-mt-xs`,J.value.agentSessions.orphaned>0?`text-negative`:`text-grey-6`])},a(n.$t(`health.sessionsOrphaned`,{n:J.value.agentSessions.orphaned})),3)]),_:1})]),_:1}),c(g,{dark:``,flat:``,bordered:``},{default:i(()=>[c(h,null,{default:i(()=>[f(`div`,fe,a(n.$t(`health.integrationsTitle`)),1),f(`div`,pe,[f(`div`,me,[c(p,{name:Q(J.value.integrations.notion.configured),color:$(J.value.integrations.notion.configured),size:`sm`},null,8,[`name`,`color`]),r[1]||=f(`span`,{class:`q-ml-sm text-body2`},`Notion`,-1),f(`span`,he,a(J.value.integrations.notion.configured?n.$t(`health.integrationConfigured`):n.$t(`health.integrationMissing`)),1)]),f(`div`,ge,[c(p,{name:Q(J.value.integrations.sentry.configured),color:$(J.value.integrations.sentry.configured),size:`sm`},null,8,[`name`,`color`]),r[2]||=f(`span`,{class:`q-ml-sm text-body2`},`Sentry`,-1),f(`span`,_e,a(J.value.integrations.sentry.configured?n.$t(`health.integrationConfigured`):n.$t(`health.integrationMissing`)),1)]),f(`div`,ve,[c(p,{name:Q(J.value.integrations.editor.configured),color:$(J.value.integrations.editor.configured),size:`sm`},null,8,[`name`,`color`]),r[3]||=f(`span`,{class:`q-ml-sm text-body2`},`Editor`,-1),f(`span`,ye,a(J.value.integrations.editor.configured?n.$t(`health.integrationConfigured`):n.$t(`health.integrationMissing`)),1)])])]),_:1})]),_:1})])):s(``,!0)]),_:1}))}});export{q as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.acceptance-item[data-v-63b144ad]{padding:2px 0}.acceptance-item[data-v-63b144ad]:hover{background-color:#ffffff08}.acceptance-item:hover .criterion-delete-btn[data-v-63b144ad]{opacity:1}.criterion-delete-btn[data-v-63b144ad]{opacity:0;transition:opacity .15s}.acceptance-title[data-v-63b144ad]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-63b144ad]{opacity:.7;text-decoration:line-through}.criterion-input[data-v-63b144ad] .q-field__control{height:22px;min-height:22px;padding:0}.criterion-input[data-v-63b144ad] input{color:#e0e0e0;font-size:12px}.criterion-input[data-v-63b144ad] input::placeholder{color:#555}.criterion-add-row[data-v-63b144ad],.todo-item[data-v-4eddf754]{padding:2px 0}.todo-title[data-v-4eddf754]{word-break:break-word;line-height:1.4}.text-strike[data-v-4eddf754]{opacity:.7;text-decoration:line-through}.documents-tree[data-v-445c589c] .q-tree__node--selected>.q-tree__node-header{background:#7986cb26}.documents-tree[data-v-445c589c] .q-tree__node-header{padding:2px 4px}.document-content[data-v-445c589c]{color:#d0d0d0;overflow-wrap:break-word;font-size:12px;line-height:1.6}.document-content[data-v-445c589c] h1{color:#e0e0e0;margin:16px 0 8px;font-size:16px}.document-content[data-v-445c589c] h2{color:#e0e0e0;margin:14px 0 6px;font-size:14px}.document-content[data-v-445c589c] h3{color:#e0e0e0;margin:12px 0 4px;font-size:13px}.document-content[data-v-445c589c] code{background:#1a1a2e;border-radius:3px;padding:1px 4px;font-family:Roboto Mono,monospace;font-size:11px}.document-content[data-v-445c589c] pre{background:#1a1a2e;border-radius:6px;padding:8px 12px;font-size:11px;overflow-x:auto}.document-content[data-v-445c589c] pre code{background:0 0;padding:0}.document-content[data-v-445c589c] ul,.document-content[data-v-445c589c] ol{padding-left:20px}.document-content[data-v-445c589c] li{margin-bottom:2px}.document-content[data-v-445c589c] input[type=checkbox]{pointer-events:none;margin-right:6px}.document-content[data-v-445c589c] table{border-collapse:collapse;width:100%;margin:8px 0;font-size:11px}.document-content[data-v-445c589c] th,.document-content[data-v-445c589c] td{text-align:left;border:1px solid #2a2a4a;padding:4px 8px}.document-content[data-v-445c589c] th{color:#e0e0e0;background:#1a1a2e}.document-content[data-v-445c589c] blockquote{color:#a0a0b0;border-left:3px solid #4a4a6a;margin:8px 0;padding:4px 12px}.document-content[data-v-445c589c] a{color:#818cf8}.document-content[data-v-445c589c] hr{border:none;border-top:1px solid #2a2a4a;margin:12px 0}.git-btn[data-v-41b9e33a]{padding:2px 8px;font-size:11px}.git-sync-btn[data-v-41b9e33a]{padding:2px 0}.git-sync-btn[data-v-41b9e33a] .q-btn__content{padding:0 8px}.git-sync-btn[data-v-41b9e33a] .q-btn-dropdown__arrow-container{border-left:1px solid #ffffff1f;padding:0 4px}.git-sync-btn[data-v-41b9e33a] .q-btn-dropdown--split{gap:0}.notion-link[data-v-99e38dbd]{text-decoration:none;display:inline-flex}.notion-link[data-v-99e38dbd]:hover{text-decoration:underline}.task-item[data-v-99e38dbd]{padding:2px 0}.task-item[data-v-99e38dbd]:hover{background-color:#ffffff08}.task-item:hover .task-delete-btn[data-v-99e38dbd]{opacity:1}.task-delete-btn[data-v-99e38dbd]{opacity:0;transition:opacity .15s}.task-title[data-v-99e38dbd]{word-break:break-word;cursor:text;line-height:1.4}.text-strike[data-v-99e38dbd]{opacity:.7;text-decoration:line-through}.task-input[data-v-99e38dbd] .q-field__control{height:22px;min-height:22px;padding:0}.task-input[data-v-99e38dbd] input{color:#e0e0e0;font-size:12px}.task-input[data-v-99e38dbd] input::placeholder{color:#555}.task-add-row[data-v-99e38dbd]{padding:2px 0}.stat-group-label[data-v-61fd94e7]{text-transform:uppercase;letter-spacing:.05em;color:#888;font-size:10px;font-weight:600}.stat-row[data-v-61fd94e7]{justify-content:space-between;align-items:center;padding:2px 0;display:flex}.stat-label[data-v-61fd94e7]{color:#999;font-size:12px}.stat-value[data-v-61fd94e7]{color:#ddd;font-family:Roboto Mono,monospace;font-size:12px;font-weight:500}.stat-value-muted[data-v-61fd94e7]{color:#999;margin-left:4px;font-size:11px}.stat-subtext[data-v-61fd94e7]{color:#8a8aa8;font-size:11px}.usage-breakdown[data-v-61fd94e7]{background:#2a2a4f;border:1px solid #3b3b61;border-radius:999px;width:100%;height:8px;display:flex;overflow:hidden}.usage-breakdown-input[data-v-61fd94e7]{background:linear-gradient(90deg,#6d76ff 0%,#8f96ff 100%);height:100%}.usage-breakdown-output[data-v-61fd94e7]{background:linear-gradient(90deg,#7f6bff 0%,#a598ff 100%);height:100%}.stat-value-ellipsis[data-v-61fd94e7]{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.stat-section[data-v-61fd94e7]{justify-content:space-between;align-items:center;display:flex}.subagents-panel[data-v-81ad2481]{overflow-y:auto}.subagent-item[data-v-81ad2481]{background:#1e1e3a;border:1px solid #2a2a4a}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility-tree:not(.debug) ::-moz-selection{color:#0000}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:-moz-fit-content;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.log-content[data-v-9e03d2b2]{max-height:60vh;overflow-y:auto}.log-text[data-v-9e03d2b2]{color:#ccc;white-space:pre-wrap;word-break:break-all;background:#0d0d1a;margin:0;font-family:JetBrains Mono,Fira Code,monospace;font-size:11px}.dd-panel[data-v-20c5f4bd],.tools-panel[data-v-e0d46842]{min-height:48px}.workspace-list[data-v-d338c975]{background-color:#16162a;overflow-x:hidden}.wl-search[data-v-d338c975]{background-color:#224;padding:0 8px}.wl-search[data-v-d338c975] .q-field__control{height:32px}.wl-search[data-v-d338c975] input{color:#ccc;font-size:12px}.wl-group-header[data-v-d338c975]:hover{background-color:#ffffff08}.wl-project-group+.wl-project-group[data-v-d338c975]{margin-top:6px}.wl-project-label[data-v-d338c975]{align-items:center;padding-bottom:2px;font-size:11px;display:flex}.wl-item[data-v-d338c975]{background-color:#224;margin-bottom:4px;transition:background-color .15s;position:relative}.wl-item[data-v-d338c975]:last-child{margin-bottom:0}.wl-item[data-v-d338c975]:hover{background-color:#2a2a4a}.wl-item--selected[data-v-d338c975]{background-color:#2a2a4a;outline:1px solid #6c63ff66}.wl-item-action[data-v-d338c975]{position:absolute;top:4px;right:4px}.wl-item--archived .wl-item-action[data-v-d338c975]{opacity:0;transition:opacity .15s}.wl-item--archived:hover .wl-item-action[data-v-d338c975]{opacity:1}.wl-item-unarchive[data-v-d338c975]{right:28px}.wl-item-delete[data-v-d338c975]{right:4px}.wl-item--archived[data-v-d338c975]{opacity:.6;background-color:#1a1a30}.wl-item--archived[data-v-d338c975]:hover{opacity:.85}.wl-item--archived.wl-item--selected[data-v-d338c975]{opacity:1}.dd-dot[data-v-d338c975]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.dd-dot--running[data-v-d338c975]{background-color:#22c55e;box-shadow:0 0 4px #22c55e80}.bg-dark[data-v-8439d8a0]{background-color:#16162a!important;border-color:#2a2a4a!important}.resize-handle[data-v-8439d8a0]{cursor:col-resize;z-index:10;width:4px;height:100%;transition:background-color .15s;position:absolute;top:0;right:-2px}.resize-handle[data-v-8439d8a0]:hover,.resize-handle[data-v-8439d8a0]:active{background-color:#6c63ff80}.resize-handle--right[data-v-8439d8a0]{left:-2px;right:auto}.vertical-resize-handle[data-v-8439d8a0]{cursor:row-resize;background-color:#2a2a4a;height:4px;transition:background-color .15s}.vertical-resize-handle[data-v-8439d8a0]:hover,.vertical-resize-handle[data-v-8439d8a0]:active{background-color:#6c63ff80}
|