@loicngr/kobo 1.6.9 → 1.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +1 -1
  2. package/dist/server/db/migrations.js +11 -0
  3. package/dist/server/db/schema.js +1 -0
  4. package/dist/server/routes/images.js +59 -0
  5. package/dist/server/routes/workspaces.js +58 -3
  6. package/dist/server/services/agent/engines/claude-code/args-builder.js +6 -0
  7. package/dist/server/services/agent/engines/claude-code/engine.js +1 -0
  8. package/dist/server/services/agent/orchestrator.js +4 -0
  9. package/dist/server/services/workspace-service.js +25 -0
  10. package/dist/server/utils/git-ops.js +13 -4
  11. package/package.json +1 -1
  12. package/src/client/dist/spa/assets/{ActivityFeed-D3Y4qOBg.css → ActivityFeed-DtM6pJvz.css} +1 -1
  13. package/src/client/dist/spa/assets/ActivityFeed-jxfDBgtk.js +7 -0
  14. package/src/client/dist/spa/assets/{ClosePopup-DTgXzcoa.js → ClosePopup-DkLittac.js} +1 -1
  15. package/src/client/dist/spa/assets/{CreatePage-Cr7gCb6F.js → CreatePage-uBHjVyx5.js} +1 -1
  16. package/src/client/dist/spa/assets/DiffViewer-B5spOKjh.js +2 -0
  17. package/src/client/dist/spa/assets/{HealthPage-BsiMW46f.js → HealthPage-DnUDXD7f.js} +1 -1
  18. package/src/client/dist/spa/assets/MainLayout-CDR4Le5c.css +1 -0
  19. package/src/client/dist/spa/assets/{MainLayout-dWdvXPUq.js → MainLayout-Cu2p6Yzp.js} +17 -17
  20. package/src/client/dist/spa/assets/QChip-bl3YRhax.js +1 -0
  21. package/src/client/dist/spa/assets/{QExpansionItem-HLBjHx-0.js → QExpansionItem-CWw6ZujM.js} +1 -1
  22. package/src/client/dist/spa/assets/{QItemSection-BzWLL-V-.js → QItemSection-CiY_LK5Y.js} +1 -1
  23. package/src/client/dist/spa/assets/{QScrollArea-CBW6shMb.js → QScrollArea-DpCqRRE0.js} +1 -1
  24. package/src/client/dist/spa/assets/QTabPanels-C4bZGqml.js +1 -0
  25. package/src/client/dist/spa/assets/{QTooltip-DbEBexRN.js → QTooltip-BIDjo2hJ.js} +1 -1
  26. package/src/client/dist/spa/assets/{SearchPage-Cb5p2C1s.js → SearchPage-BL03e4yO.js} +1 -1
  27. package/src/client/dist/spa/assets/SettingsPage-DODqugln.js +1 -0
  28. package/src/client/dist/spa/assets/{TouchPan-Y_Bxzun2.js → TouchPan-vsl78kxF.js} +1 -1
  29. package/src/client/dist/spa/assets/WorkspacePage-CvR1wkIu.js +4 -0
  30. package/src/client/dist/spa/assets/{build-path-tree-Cx4Gbg4-.js → build-path-tree-BOfvTwdg.js} +1 -1
  31. package/src/client/dist/spa/assets/{cssMode-C_KSkvTO.js → cssMode-CoOgcS9Q.js} +1 -1
  32. package/src/client/dist/spa/assets/{documents-CotyNumY.js → documents-Capxg1Is.js} +1 -1
  33. package/src/client/dist/spa/assets/{editor.api-C37o4gcc.js → editor.api-BXQZAhGS.js} +1 -1
  34. package/src/client/dist/spa/assets/{editor.main-B1LanICm.js → editor.main-DFavPtYi.js} +3 -3
  35. package/src/client/dist/spa/assets/{formatters-D7eTm7uK.js → formatters-CX2gvLFv.js} +1 -1
  36. package/src/client/dist/spa/assets/{freemarker2-DElE6rHa.js → freemarker2-CxnHsTrj.js} +1 -1
  37. package/src/client/dist/spa/assets/{handlebars-DgFLhirU.js → handlebars-MdkEOy37.js} +1 -1
  38. package/src/client/dist/spa/assets/{html-Co1lVBCW.js → html-BWqDGW4J.js} +1 -1
  39. package/src/client/dist/spa/assets/{htmlMode-Bou9uwBJ.js → htmlMode-CO3tFPX5.js} +1 -1
  40. package/src/client/dist/spa/assets/i18n-BshFP-3_.js +1 -0
  41. package/src/client/dist/spa/assets/index-ljurK0Xv.js +2 -0
  42. package/src/client/dist/spa/assets/is-DUKatk8N.js +1 -0
  43. package/src/client/dist/spa/assets/{javascript-BzHMqYPo.js → javascript-I8UtlP5w.js} +1 -1
  44. package/src/client/dist/spa/assets/{jsonMode-DQriwWfG.js → jsonMode-Z4_dv7Ex.js} +1 -1
  45. package/src/client/dist/spa/assets/{liquid-DfnWCF9s.js → liquid-MmYIYsxN.js} +1 -1
  46. package/src/client/dist/spa/assets/{mdx-C3N0ZOTO.js → mdx-05Yi5ibq.js} +1 -1
  47. package/src/client/dist/spa/assets/models-BWwzb9Qz.js +1 -0
  48. package/src/client/dist/spa/assets/{monaco.contribution-BWEoU0OQ.js → monaco.contribution-BcmbPJhi.js} +2 -2
  49. package/src/client/dist/spa/assets/{python-XRtT3KuX.js → python-DApFIC6r.js} +1 -1
  50. package/src/client/dist/spa/assets/{razor-K5_2jeu8.js → razor-IqeohLNL.js} +1 -1
  51. package/src/client/dist/spa/assets/{scroll-C-Vz5BD9.js → scroll-CYWyxBdv.js} +1 -1
  52. package/src/client/dist/spa/assets/settings-CAILUJXO.js +1 -0
  53. package/src/client/dist/spa/assets/{tsMode-T4aykrTz.js → tsMode-B6nLj3Ks.js} +1 -1
  54. package/src/client/dist/spa/assets/{typescript-CU2l4an1.js → typescript-DHsUK_D5.js} +1 -1
  55. package/src/client/dist/spa/assets/{use-checkbox-BduGd8xg.js → use-checkbox-B_o-iLG2.js} +1 -1
  56. package/src/client/dist/spa/assets/{xml-BXeGSs28.js → xml-B_o_LoiA.js} +1 -1
  57. package/src/client/dist/spa/assets/{yaml-DkchexIG.js → yaml-mPCNKMRE.js} +1 -1
  58. package/src/client/dist/spa/index.html +9 -8
  59. package/src/client/dist/spa/assets/ActivityFeed-ChWogUP-.js +0 -7
  60. package/src/client/dist/spa/assets/DiffViewer-DIwYNrvc.js +0 -2
  61. package/src/client/dist/spa/assets/MainLayout-DKDosaB2.css +0 -1
  62. package/src/client/dist/spa/assets/QChip-1nQ_KMFF.js +0 -1
  63. package/src/client/dist/spa/assets/QDialog-G448EJG4.js +0 -1
  64. package/src/client/dist/spa/assets/QTabPanels-Cw4nnIbR.js +0 -1
  65. package/src/client/dist/spa/assets/SettingsPage-n5CoKCHp.js +0 -1
  66. package/src/client/dist/spa/assets/WorkspacePage-D0I1dB_Y.js +0 -4
  67. package/src/client/dist/spa/assets/i18n-BY0mxocP.js +0 -1
  68. package/src/client/dist/spa/assets/index-CbTmiNhf.js +0 -2
  69. package/src/client/dist/spa/assets/models-CuoIuROK.js +0 -1
  70. /package/src/client/dist/spa/assets/{QBadge-Di02fu2H.js → QBadge-DqtcDv8D.js} +0 -0
  71. /package/src/client/dist/spa/assets/{QBtn-CyzfM9-_.js → QBtn-DHwAb18J.js} +0 -0
  72. /package/src/client/dist/spa/assets/{QItemLabel-Czw5g0px.js → QItemLabel-Codqjisk.js} +0 -0
  73. /package/src/client/dist/spa/assets/{QList-D2GuTeLl.js → QList-Bl9824vi.js} +0 -0
  74. /package/src/client/dist/spa/assets/{QPage-BTzNQlb1.js → QPage-Dn4E3GHB.js} +0 -0
  75. /package/src/client/dist/spa/assets/{QSlideTransition-s6ZkYsLs.js → QSlideTransition-BQxI8l5r.js} +0 -0
  76. /package/src/client/dist/spa/assets/{QSpace-0zdF1m5x.js → QSpace-BNr0AftG.js} +0 -0
  77. /package/src/client/dist/spa/assets/{QSpinnerDots-By20ptst.js → QSpinnerDots-DEiRooBD.js} +0 -0
  78. /package/src/client/dist/spa/assets/{_plugin-vue_export-helper-Cj6tcsj6.js → _plugin-vue_export-helper-r4mAJOHR.js} +0 -0
  79. /package/src/client/dist/spa/assets/{abap-DiwvWnMr.js → abap-Bgec7Keq.js} +0 -0
  80. /package/src/client/dist/spa/assets/{apex-CmtZjKlf.js → apex-VBlPwEoQ.js} +0 -0
  81. /package/src/client/dist/spa/assets/{azcli-DL2My_i-.js → azcli-DKqrEFBx.js} +0 -0
  82. /package/src/client/dist/spa/assets/{bat-B-nC98wG.js → bat-DdgQWy_0.js} +0 -0
  83. /package/src/client/dist/spa/assets/{bicep-Ju5MwOgh.js → bicep-CRMM43EB.js} +0 -0
  84. /package/src/client/dist/spa/assets/{cameligo-8Eu1TyBr.js → cameligo-UatALtML.js} +0 -0
  85. /package/src/client/dist/spa/assets/{clojure-u-RpMkH3.js → clojure-D8JU08RA.js} +0 -0
  86. /package/src/client/dist/spa/assets/{coffee-CdA7bbTe.js → coffee-C56wu358.js} +0 -0
  87. /package/src/client/dist/spa/assets/{cpp-CzNFP8ks.js → cpp-CyZLvhJG.js} +0 -0
  88. /package/src/client/dist/spa/assets/{csharp-j1LThmcE.js → csharp-BJl3ixva.js} +0 -0
  89. /package/src/client/dist/spa/assets/{csp-CLRC61y6.js → csp-CxEKxmO-.js} +0 -0
  90. /package/src/client/dist/spa/assets/{css-r6rC_7P2.js → css-B0t_muXd.js} +0 -0
  91. /package/src/client/dist/spa/assets/{cypher-CW08XVUh.js → cypher-D1hqiMFD.js} +0 -0
  92. /package/src/client/dist/spa/assets/{dart-Cs9aL5T_.js → dart-Bz550Pyv.js} +0 -0
  93. /package/src/client/dist/spa/assets/{dockerfile-BWM0M184.js → dockerfile-CIXgVAuA.js} +0 -0
  94. /package/src/client/dist/spa/assets/{ecl-MJJuer5P.js → ecl-D9qbvZoA.js} +0 -0
  95. /package/src/client/dist/spa/assets/{elixir-D2AIuXqn.js → elixir-b2M38fAy.js} +0 -0
  96. /package/src/client/dist/spa/assets/{flow9-B2H24giC.js → flow9-Dq1UYMkt.js} +0 -0
  97. /package/src/client/dist/spa/assets/{fsharp-CMk2OIJN.js → fsharp-CFNadkg7.js} +0 -0
  98. /package/src/client/dist/spa/assets/{go-BrMkuJg0.js → go-dSur1iB2.js} +0 -0
  99. /package/src/client/dist/spa/assets/{graphql-PSR1UKGv.js → graphql-qyhAo11d.js} +0 -0
  100. /package/src/client/dist/spa/assets/{hcl-DAQrbDOW.js → hcl-DFzjMyzm.js} +0 -0
  101. /package/src/client/dist/spa/assets/{ini-0TG5BxW0.js → ini-TdzA8TIl.js} +0 -0
  102. /package/src/client/dist/spa/assets/{java-rgorz17v.js → java-CSGA9pkE.js} +0 -0
  103. /package/src/client/dist/spa/assets/{julia-C8VMdHm8.js → julia-9izz5OsY.js} +0 -0
  104. /package/src/client/dist/spa/assets/{kotlin-CllWo3gX.js → kotlin-DuPK7AtF.js} +0 -0
  105. /package/src/client/dist/spa/assets/{less-Cgca25AP.js → less-B8d93iCg.js} +0 -0
  106. /package/src/client/dist/spa/assets/{lexon-D0GHdBaw.js → lexon-DWtEIyu7.js} +0 -0
  107. /package/src/client/dist/spa/assets/{lua-DmRsNG-P.js → lua-Ciq0OGgt.js} +0 -0
  108. /package/src/client/dist/spa/assets/{m3-BgL5dNKT.js → m3-Cki6JWj_.js} +0 -0
  109. /package/src/client/dist/spa/assets/{markdown-BuJfycGS.js → markdown-Cu47xwU0.js} +0 -0
  110. /package/src/client/dist/spa/assets/{mips-C9m_93PR.js → mips-BM8ui995.js} +0 -0
  111. /package/src/client/dist/spa/assets/{msdax-CpFHC9OI.js → msdax-DqLio0_c.js} +0 -0
  112. /package/src/client/dist/spa/assets/{mysql-qFvltsqN.js → mysql-v1wbjJOq.js} +0 -0
  113. /package/src/client/dist/spa/assets/{objective-c-Bnmr858J.js → objective-c-CQl3PGSB.js} +0 -0
  114. /package/src/client/dist/spa/assets/{pascal-WP0_D5AO.js → pascal-D4iW0ZtD.js} +0 -0
  115. /package/src/client/dist/spa/assets/{pascaligo-Blom4Rij.js → pascaligo-BdC9CZdj.js} +0 -0
  116. /package/src/client/dist/spa/assets/{perl-B-vk8g64.js → perl-BL10m4XD.js} +0 -0
  117. /package/src/client/dist/spa/assets/{pgsql-Cgvz6v67.js → pgsql-Be_oqVo3.js} +0 -0
  118. /package/src/client/dist/spa/assets/{php-8a3Lrw9m.js → php-BtvXSFRI.js} +0 -0
  119. /package/src/client/dist/spa/assets/{pla-DuFqEZ8V.js → pla-B2vUy15C.js} +0 -0
  120. /package/src/client/dist/spa/assets/{postiats-DkLtSgkp.js → postiats-CbmTTfXr.js} +0 -0
  121. /package/src/client/dist/spa/assets/{powerquery-BJ1aNepW.js → powerquery-DszLhJGx.js} +0 -0
  122. /package/src/client/dist/spa/assets/{powershell-rE98k687.js → powershell-B0dYktF6.js} +0 -0
  123. /package/src/client/dist/spa/assets/{private.use-form-C5G_3nU5.js → private.use-form-Dlb0iQZh.js} +0 -0
  124. /package/src/client/dist/spa/assets/{protobuf-CUheFacr.js → protobuf-CZvaj1VX.js} +0 -0
  125. /package/src/client/dist/spa/assets/{pug-LDcAMD8w.js → pug-CPDx1B3S.js} +0 -0
  126. /package/src/client/dist/spa/assets/{qsharp-DUKSQoR1.js → qsharp-CDP9TFLl.js} +0 -0
  127. /package/src/client/dist/spa/assets/{r-D-QApv87.js → r-8DbbFX2l.js} +0 -0
  128. /package/src/client/dist/spa/assets/{rate-limit-labels-EtqMmGAk.js → rate-limit-labels-BeAbIcPH.js} +0 -0
  129. /package/src/client/dist/spa/assets/{redis-SXdDyWR9.js → redis-DRWj9MtJ.js} +0 -0
  130. /package/src/client/dist/spa/assets/{redshift-Y6lsCryn.js → redshift-C6cElE_5.js} +0 -0
  131. /package/src/client/dist/spa/assets/{restructuredtext-edObr9a8.js → restructuredtext-W9pS9n3m.js} +0 -0
  132. /package/src/client/dist/spa/assets/{ruby-CNnUfF-8.js → ruby-BKnzWnk-.js} +0 -0
  133. /package/src/client/dist/spa/assets/{rust-IHUZWzBr.js → rust-YPCclWwe.js} +0 -0
  134. /package/src/client/dist/spa/assets/{sb-DrUvY44N.js → sb-BgM4DTFb.js} +0 -0
  135. /package/src/client/dist/spa/assets/{scala-B4hbXGLM.js → scala-fz1OPLMl.js} +0 -0
  136. /package/src/client/dist/spa/assets/{scheme-BGrd12j3.js → scheme-8Uz1RIbu.js} +0 -0
  137. /package/src/client/dist/spa/assets/{scss-x5G1ES4U.js → scss-Djo3IYXr.js} +0 -0
  138. /package/src/client/dist/spa/assets/{shell-DOehe2Y8.js → shell-CINF5Tx_.js} +0 -0
  139. /package/src/client/dist/spa/assets/{solidity-BeRvcwWV.js → solidity-GgiNEuUm.js} +0 -0
  140. /package/src/client/dist/spa/assets/{sophia-DZbkUNjy.js → sophia-Culj97P9.js} +0 -0
  141. /package/src/client/dist/spa/assets/{sparql-B7_oi5-h.js → sparql-C2ZlpxOY.js} +0 -0
  142. /package/src/client/dist/spa/assets/{sql-CTlsFWVE.js → sql-BEf5Pg7Y.js} +0 -0
  143. /package/src/client/dist/spa/assets/{st-DJVEJdPE.js → st-CT6UUoeH.js} +0 -0
  144. /package/src/client/dist/spa/assets/{swift-CwhT3fYa.js → swift-B5g0xTG3.js} +0 -0
  145. /package/src/client/dist/spa/assets/{systemverilog-BQN63pkN.js → systemverilog-CEgQz9DR.js} +0 -0
  146. /package/src/client/dist/spa/assets/{tcl-DqwfpskA.js → tcl-D0qL2L0I.js} +0 -0
  147. /package/src/client/dist/spa/assets/{touch-B2uuAH_y.js → touch-Bj_Fr4kC.js} +0 -0
  148. /package/src/client/dist/spa/assets/{twig-BiyenUgc.js → twig-BFUAVf1E.js} +0 -0
  149. /package/src/client/dist/spa/assets/{typespec-CWOJribt.js → typespec-CjVVcNKm.js} +0 -0
  150. /package/src/client/dist/spa/assets/{use-id-BmXMngYX.js → use-id-C93QQwrt.js} +0 -0
  151. /package/src/client/dist/spa/assets/{use-quasar-BBrzedjR.js → use-quasar-Cc4smfg5.js} +0 -0
  152. /package/src/client/dist/spa/assets/{vb-Cq5F87m3.js → vb-CZJr-DQz.js} +0 -0
  153. /package/src/client/dist/spa/assets/{vue-i18n-eUDnMrPl.js → vue-i18n-BJlZEYnA.js} +0 -0
  154. /package/src/client/dist/spa/assets/{wgsl-BAvW2lVr.js → wgsl-ivoXUo2e.js} +0 -0
package/README.md CHANGED
@@ -12,7 +12,7 @@ Think of it as an apprentice's hall: you hand out missions, each apprentice sets
12
12
  ## Features
13
13
 
14
14
  - **Isolated git worktrees** — every workspace runs on its own branch in its own directory, so concurrent Claude sessions never step on each other
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
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. Migration to the official Claude Agent SDK is tracked in [#9](https://github.com/loicngr/Kobo/issues/9)
16
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
17
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
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
@@ -112,6 +112,17 @@ export const migrations = [
112
112
  })();
113
113
  },
114
114
  },
115
+ {
116
+ version: 13,
117
+ name: 'add-permission-profile-column',
118
+ migrate: (db) => {
119
+ // 'bypass' (default, pre-existing behavior) or 'strict' (respects
120
+ // the project's .claude/settings.json allow/deny lists — needed when
121
+ // the user wants to authorize writes under .claude/** or .github/workflows/**
122
+ // which the CLI hard-denies under --dangerously-skip-permissions).
123
+ db.prepare("ALTER TABLE workspaces ADD COLUMN permission_profile TEXT NOT NULL DEFAULT 'bypass'").run();
124
+ },
125
+ },
115
126
  ];
116
127
  /** Current schema version — always equals the highest migration version. */
117
128
  export const SCHEMA_VERSION = migrations.length > 0 ? migrations[migrations.length - 1].version : 1;
@@ -22,6 +22,7 @@ export function initSchema(db) {
22
22
  auto_loop INTEGER NOT NULL DEFAULT 0,
23
23
  auto_loop_ready INTEGER NOT NULL DEFAULT 0,
24
24
  no_progress_streak INTEGER NOT NULL DEFAULT 0,
25
+ permission_profile TEXT NOT NULL DEFAULT 'bypass',
25
26
  created_at TEXT NOT NULL,
26
27
  updated_at TEXT NOT NULL
27
28
  );
@@ -1,3 +1,5 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
1
3
  import { Hono } from 'hono';
2
4
  import * as imageService from '../services/image-service.js';
3
5
  import * as workspaceService from '../services/workspace-service.js';
@@ -5,6 +7,14 @@ import * as workspaceService from '../services/workspace-service.js';
5
7
  const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
6
8
  /** MIME types accepted for image uploads. */
7
9
  const ALLOWED_MIME_TYPES = new Set(['image/png', 'image/jpeg', 'image/gif', 'image/webp']);
10
+ /** File extension → MIME type, used to serve uploaded images back to the frontend. */
11
+ const EXT_TO_MIME = {
12
+ '.png': 'image/png',
13
+ '.jpg': 'image/jpeg',
14
+ '.jpeg': 'image/jpeg',
15
+ '.gif': 'image/gif',
16
+ '.webp': 'image/webp',
17
+ };
8
18
  /** Hono sub-router for workspace image upload and deletion. */
9
19
  const app = new Hono();
10
20
  // POST /:id/images — upload an image
@@ -37,6 +47,55 @@ app.post('/:id/images', async (c) => {
37
47
  return c.json({ error: message }, 500);
38
48
  }
39
49
  });
50
+ // GET /:id/images/file?path=.ai/images/<file>
51
+ // Serve an uploaded image file from the worktree so the chat feed can show
52
+ // inline previews for `[image: <path>]` tokens the user pastes in messages.
53
+ //
54
+ // Security: only paths under `.ai/images/` are served, the resolved absolute
55
+ // path must stay inside the worktree's images directory (defense against
56
+ // `..` traversal and absolute paths). Anything outside → 400.
57
+ app.get('/:id/images/file', async (c) => {
58
+ try {
59
+ const { id } = c.req.param();
60
+ const workspace = workspaceService.getWorkspace(id);
61
+ if (!workspace) {
62
+ return c.json({ error: `Workspace '${id}' not found` }, 404);
63
+ }
64
+ const requested = c.req.query('path');
65
+ if (!requested || typeof requested !== 'string') {
66
+ return c.json({ error: 'Missing required query param: path' }, 400);
67
+ }
68
+ // Allowlist: only the upload storage layout is served. No symlink escape
69
+ // either — we resolve and check containment.
70
+ if (!/^(\.ai\/images\/|images\/)[^/]/.test(requested) || requested.includes('..')) {
71
+ return c.json({ error: 'Invalid or disallowed image path' }, 400);
72
+ }
73
+ const worktreePath = `${workspace.projectPath}/.worktrees/${workspace.workingBranch}`;
74
+ const imagesRoot = path.resolve(worktreePath, '.ai/images');
75
+ const fullPath = path.resolve(worktreePath, requested);
76
+ // Containment check: fullPath must be a descendant of imagesRoot. `+ path.sep`
77
+ // guards against prefix collisions (`.../images-evil`).
78
+ if (fullPath !== imagesRoot && !fullPath.startsWith(imagesRoot + path.sep)) {
79
+ return c.json({ error: 'Path escapes images root' }, 400);
80
+ }
81
+ let buffer;
82
+ try {
83
+ buffer = await fs.promises.readFile(fullPath);
84
+ }
85
+ catch {
86
+ return c.json({ error: 'Image not found' }, 404);
87
+ }
88
+ const mime = EXT_TO_MIME[path.extname(fullPath).toLowerCase()] ?? 'application/octet-stream';
89
+ c.header('Content-Type', mime);
90
+ // Uploads are immutable content-addressed (uid filename) — cache aggressively.
91
+ c.header('Cache-Control', 'private, max-age=3600, immutable');
92
+ return c.body(new Uint8Array(buffer));
93
+ }
94
+ catch (err) {
95
+ const message = err instanceof Error ? err.message : String(err);
96
+ return c.json({ error: message }, 500);
97
+ }
98
+ });
40
99
  // DELETE /:id/images/:uid — delete an uploaded image
41
100
  app.delete('/:id/images/:uid', async (c) => {
42
101
  try {
@@ -1033,6 +1033,12 @@ app.patch('/:id', migrationGuard, async (c) => {
1033
1033
  }
1034
1034
  updated = workspaceService.updateWorkspacePermissionMode(id, body.permissionMode);
1035
1035
  }
1036
+ if (body.permissionProfile !== undefined) {
1037
+ if (body.permissionProfile !== 'bypass' && body.permissionProfile !== 'strict') {
1038
+ return c.json({ error: "Invalid permission profile. Must be 'bypass' or 'strict'." }, 400);
1039
+ }
1040
+ updated = workspaceService.setPermissionProfile(id, body.permissionProfile);
1041
+ }
1036
1042
  if (body.status) {
1037
1043
  updated = workspaceService.updateWorkspaceStatus(id, body.status);
1038
1044
  }
@@ -1043,8 +1049,9 @@ app.patch('/:id', migrationGuard, async (c) => {
1043
1049
  body.model === undefined &&
1044
1050
  body.reasoningEffort === undefined &&
1045
1051
  body.permissionMode === undefined &&
1052
+ body.permissionProfile === undefined &&
1046
1053
  body.name === undefined) {
1047
- return c.json({ error: 'Missing field: status, model, reasoningEffort, permissionMode, or name' }, 400);
1054
+ return c.json({ error: 'Missing field: status, model, reasoningEffort, permissionMode, permissionProfile, or name' }, 400);
1048
1055
  }
1049
1056
  return c.json(updated);
1050
1057
  }
@@ -1221,6 +1228,13 @@ app.delete('/:id', migrationGuard, async (c) => {
1221
1228
  catch {
1222
1229
  // Terminal may not exist — ignore
1223
1230
  }
1231
+ // Collected best-effort warnings: the DB deletion always proceeds, but
1232
+ // side-effects (worktree, local/remote branches) can fail independently.
1233
+ // We surface a user-friendly message per failure so the UI can show a
1234
+ // sticky toast with a copy-pasteable recovery command — common case:
1235
+ // Docker leaves root-owned files inside the worktree, git worktree
1236
+ // remove fails with EACCES.
1237
+ const warnings = [];
1224
1238
  // Remove worktree
1225
1239
  const worktreesDir = `${workspace.projectPath}/.worktrees`;
1226
1240
  const worktreePath = `${worktreesDir}/${workspace.workingBranch}`;
@@ -1230,6 +1244,11 @@ app.delete('/:id', migrationGuard, async (c) => {
1230
1244
  catch (err) {
1231
1245
  const message = err instanceof Error ? err.message : String(err);
1232
1246
  console.error(`[workspaces] Failed to remove worktree: ${message}`);
1247
+ warnings.push(`Failed to remove worktree directory '${worktreePath}'. The git entry may still reference it. ` +
1248
+ `Fix manually:\n` +
1249
+ ` sudo rm -rf '${worktreePath}'\n` +
1250
+ ` cd '${workspace.projectPath}' && git worktree prune\n` +
1251
+ `Reason: ${message}`);
1233
1252
  }
1234
1253
  // Delete local branch if requested
1235
1254
  if (body.deleteLocalBranch) {
@@ -1239,6 +1258,9 @@ app.delete('/:id', migrationGuard, async (c) => {
1239
1258
  catch (err) {
1240
1259
  const message = err instanceof Error ? err.message : String(err);
1241
1260
  console.error(`[workspaces] Failed to delete local branch: ${message}`);
1261
+ warnings.push(`Failed to delete local branch '${workspace.workingBranch}'. Fix manually:\n` +
1262
+ ` cd '${workspace.projectPath}' && git branch -D '${workspace.workingBranch}'\n` +
1263
+ `Reason: ${message}`);
1242
1264
  }
1243
1265
  }
1244
1266
  // Delete remote branch if requested
@@ -1249,11 +1271,20 @@ app.delete('/:id', migrationGuard, async (c) => {
1249
1271
  catch (err) {
1250
1272
  const message = err instanceof Error ? err.message : String(err);
1251
1273
  console.error(`[workspaces] Failed to delete remote branch: ${message}`);
1274
+ warnings.push(`Failed to delete remote branch '${workspace.workingBranch}'. Fix manually:\n` +
1275
+ ` cd '${workspace.projectPath}' && git push origin --delete '${workspace.workingBranch}'\n` +
1276
+ `Reason: ${message}`);
1252
1277
  }
1253
1278
  }
1254
1279
  // Delete workspace from DB (cascades to tasks, sessions, events)
1255
1280
  workspaceService.deleteWorkspace(id);
1256
- return new Response(null, { status: 204 });
1281
+ // When everything worked cleanly we keep the legacy 204 response so
1282
+ // existing clients aren't surprised by a JSON body. Warnings promote the
1283
+ // response to 200 so the body is readable.
1284
+ if (warnings.length === 0) {
1285
+ return new Response(null, { status: 204 });
1286
+ }
1287
+ return c.json({ ok: true, warnings }, 200);
1257
1288
  }
1258
1289
  catch (err) {
1259
1290
  const message = err instanceof Error ? err.message : String(err);
@@ -1499,6 +1530,20 @@ app.post('/:id/resync-branch', (c) => {
1499
1530
  if (!actual || actual === workspace.workingBranch) {
1500
1531
  return c.json({ ok: true, changed: false, workingBranch: workspace.workingBranch });
1501
1532
  }
1533
+ // Branch was renamed in-place by the agent (`git branch -m ...`). The
1534
+ // worktree directory is still at .worktrees/<old-name>; move it so it
1535
+ // matches the new ref, otherwise Kōbō's path resolver (projectPath +
1536
+ // .worktrees + workingBranch) breaks and subsequent session spawns fail
1537
+ // with ENOENT on .mcp.json. Best-effort: if the move fails (dir already
1538
+ // moved, lockfile, dirty tree), we still update the DB so git ops stay
1539
+ // aligned with the current ref name — the user can repair the dir manually.
1540
+ const newWorktreePath = path.join(workspace.projectPath, '.worktrees', actual);
1541
+ try {
1542
+ gitOps.moveWorktree(workspace.projectPath, worktreePath, newWorktreePath);
1543
+ }
1544
+ catch (err) {
1545
+ console.error('[workspaces] resync-branch: moveWorktree failed (DB update proceeds):', err);
1546
+ }
1502
1547
  const updated = workspaceService.updateWorkingBranch(id, actual);
1503
1548
  return c.json({ ok: true, changed: true, workingBranch: updated.workingBranch });
1504
1549
  }
@@ -1515,9 +1560,19 @@ app.post('/:id/push', async (c) => {
1515
1560
  if (!workspace) {
1516
1561
  return c.json({ error: `Workspace '${id}' not found` }, 404);
1517
1562
  }
1563
+ const body = await c.req.json().catch(() => ({}));
1564
+ const force = body?.force === true;
1518
1565
  const worktreePath = path.join(workspace.projectPath, '.worktrees', workspace.workingBranch);
1519
1566
  try {
1520
- gitOps.pushBranch(worktreePath, workspace.workingBranch);
1567
+ // Only pass an options arg when force is requested — keeps the
1568
+ // no-options call shape identical to before for callers/tests that
1569
+ // assert on argument count.
1570
+ if (force) {
1571
+ gitOps.pushBranch(worktreePath, workspace.workingBranch, { force: true });
1572
+ }
1573
+ else {
1574
+ gitOps.pushBranch(worktreePath, workspace.workingBranch);
1575
+ }
1521
1576
  }
1522
1577
  catch (err) {
1523
1578
  const message = err instanceof Error ? err.message : String(err);
@@ -24,6 +24,12 @@ export function buildClaudeArgs(input) {
24
24
  if (input.permissionMode === 'plan') {
25
25
  args.push('--permission-mode', 'plan');
26
26
  }
27
+ else if (input.permissionProfile === 'strict') {
28
+ // Strict profile: respect the project's settings.json allow/deny.
29
+ // `acceptEdits` auto-accepts Edit/Write but enforces the allow list,
30
+ // so `Edit(.claude/**)` and similar take effect (unlike in bypass mode).
31
+ args.push('--permission-mode', 'acceptEdits');
32
+ }
27
33
  else if (input.skipPermissions) {
28
34
  args.push('--dangerously-skip-permissions');
29
35
  }
@@ -21,6 +21,7 @@ export function createClaudeCodeEngine() {
21
21
  effort: options.effort,
22
22
  permissionMode: options.permissionMode ?? 'auto-accept',
23
23
  skipPermissions: options.settings.dangerouslySkipPermissions ?? true,
24
+ permissionProfile: options.permissionProfile,
24
25
  resumeFromEngineSessionId: options.resumeFromEngineSessionId,
25
26
  mcpConfigPath,
26
27
  });
@@ -480,6 +480,10 @@ export function startAgent(workspaceId, workingDir, prompt, model, resume = fals
480
480
  model,
481
481
  effort: reasoningEffort,
482
482
  permissionMode,
483
+ // Propagate the workspace's permission_profile to the engine (bypass vs
484
+ // strict). Defaults to 'bypass' — the pre-existing behavior — when the
485
+ // column is missing (fresh boot before migration landed) or unknown.
486
+ permissionProfile: ws?.permissionProfile === 'strict' ? 'strict' : 'bypass',
483
487
  resumeFromEngineSessionId,
484
488
  backendUrl: `http://127.0.0.1:${backendPort}`,
485
489
  koboHome: (() => {
@@ -41,6 +41,7 @@ function mapWorkspace(row) {
41
41
  autoLoop: row.auto_loop === 1,
42
42
  autoLoopReady: row.auto_loop_ready === 1,
43
43
  noProgressStreak: row.no_progress_streak ?? 0,
44
+ permissionProfile: (row.permission_profile ?? 'bypass'),
44
45
  createdAt: row.created_at,
45
46
  updatedAt: row.updated_at,
46
47
  };
@@ -346,6 +347,30 @@ export function setAutoLoopReady(id, ready) {
346
347
  db.prepare('UPDATE workspaces SET auto_loop_ready = ? WHERE id = ?').run(ready ? 1 : 0, id);
347
348
  return getWorkspace(id);
348
349
  }
350
+ /**
351
+ * Set the permission profile for a workspace.
352
+ *
353
+ * - `bypass` (default): Kōbō passes `--dangerously-skip-permissions` — no
354
+ * prompts, but the CLI hard-denies writes under `.claude/**` and
355
+ * `.github/workflows/**` regardless of the project's settings.json.
356
+ * - `strict`: Kōbō passes `--permission-mode acceptEdits` — the CLI respects
357
+ * the project's `.claude/settings.json` allow/deny lists. Enables writes
358
+ * under `.claude/**` / `.github/workflows/**` when the user has explicitly
359
+ * allowed them, at the cost of potential prompts on un-allow-listed Bash
360
+ * or MCP calls.
361
+ *
362
+ * Takes effect on the next session spawn — running sessions keep whichever
363
+ * flag they were started with.
364
+ */
365
+ export function setPermissionProfile(id, profile) {
366
+ const workspace = getWorkspace(id);
367
+ if (!workspace)
368
+ throw new Error(`Workspace '${id}' not found`);
369
+ const db = getDb();
370
+ const now = new Date().toISOString();
371
+ db.prepare('UPDATE workspaces SET permission_profile = ?, updated_at = ? WHERE id = ?').run(profile, now, id);
372
+ return getWorkspace(id);
373
+ }
349
374
  /** Remove a workspace from favorites. Idempotent: safe to call on a non-favorite, though `updated_at` still refreshes. */
350
375
  export function unsetFavorite(id) {
351
376
  const db = getDb();
@@ -99,10 +99,19 @@ export function deleteRemoteBranch(repoPath, branchName, remote = 'origin') {
99
99
  throw new Error(`Failed to delete remote branch '${remote}/${branchName}': ${message}`);
100
100
  }
101
101
  }
102
- /** Push a branch to the remote with upstream tracking (`git push -u`). */
103
- export function pushBranch(repoPath, branchName, remote = 'origin') {
104
- try {
105
- git(repoPath, ['push', '-u', remote, branchName]);
102
+ /**
103
+ * Push a branch to the remote with upstream tracking (`git push -u`).
104
+ * When `options.force` is true, adds `--force-with-lease` (safer than `--force`:
105
+ * the push is rejected if the remote has commits the local copy hasn't seen).
106
+ */
107
+ export function pushBranch(repoPath, branchName, options = {}) {
108
+ const remote = options.remote ?? 'origin';
109
+ const args = ['push', '-u'];
110
+ if (options.force)
111
+ args.push('--force-with-lease');
112
+ args.push(remote, branchName);
113
+ try {
114
+ git(repoPath, args);
106
115
  }
107
116
  catch (err) {
108
117
  const message = err instanceof Error ? err.message : String(err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.6.9",
3
+ "version": "1.6.10",
4
4
  "description": "Kōbō — multi-workspace agent manager for Claude Code. Orchestrates isolated git worktrees with dev servers, Notion integration, and MCP tools.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-or-later",
@@ -1 +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-b1ed78cb]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-b1ed78cb]{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-b1ed78cb],.tool-row--toggleable .tool-header[data-v-b1ed78cb]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-b1ed78cb]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-b1ed78cb]:hover,.tool-row--toggleable .tool-header[data-v-b1ed78cb]:hover{background:#ffffff08}.tool-icon[data-v-b1ed78cb]{color:#9fbce0;flex-shrink:0}.tool-name[data-v-b1ed78cb]{color:#d0d0d0;flex-shrink:0;font-weight:600}.tool-arg[data-v-b1ed78cb],.tool-path[data-v-b1ed78cb]{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-b1ed78cb],.tool-arg[data-v-b1ed78cb]{flex:1}.tool-stat-add[data-v-b1ed78cb]{color:#66bb6a;flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-b1ed78cb]{color:#ef5350;flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-b1ed78cb]{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-b1ed78cb]{white-space:pre;color:#bbb;padding:0 12px}.diff-sign[data-v-b1ed78cb]{color:#555;-webkit-user-select:none;user-select:none;width:14px;display:inline-block}.diff-add[data-v-b1ed78cb]{color:#c8e6c9;background:#66bb6a1a}.diff-add .diff-sign[data-v-b1ed78cb]{color:#66bb6a}.diff-del[data-v-b1ed78cb]{color:#ffcdd2;background:#ef53501a}.diff-del .diff-sign[data-v-b1ed78cb]{color:#ef5350}.tool-output[data-v-b1ed78cb]{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-50994916]{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-50994916]{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-50994916]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-50994916]{color:#ce93d8;background:#ce93d826}.turn-badge-agent[data-v-50994916]{color:#7986cb;background:#7986cb26}.turn-badge-system[data-v-50994916]{color:#bdbdbd;background:#75757533;font-style:italic}.turn-badge-session[data-v-50994916]{color:#9e9e9e;background:#61616133}.turn-time[data-v-50994916]{color:#666;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px}.turn-time-arrow[data-v-50994916]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-50994916]{color:#8891a3}.turn-actions[data-v-50994916]{color:#777;font-size:11px}.turn-body[data-v-50994916]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-50994916]>*{min-width:0;max-width:100%}.turn-body[data-v-50994916] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-50994916]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-50994916]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-50994916]:hover{opacity:1}.activity-feed-wrap[data-v-a9305543]{width:100%;height:100%;position:relative}.activity-feed-scroll[data-v-a9305543]{width:100%;height:100%}.activity-feed-nav-cluster[data-v-a9305543]{z-index:2;align-items:center;gap:8px;display:flex;position:absolute;bottom:14px;right:14px}.activity-feed-nav-btn[data-v-a9305543]{opacity:.8;transition:opacity .12s}.activity-feed-nav-btn[data-v-a9305543]:hover{opacity:1}.content-origin-marker[data-v-a9305543]{pointer-events:none;width:0;height:0;margin:0;padding:0}.activity-feed-scroll[data-v-a9305543] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-a9305543]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}
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-b1ed78cb]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-b1ed78cb]{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-b1ed78cb],.tool-row--toggleable .tool-header[data-v-b1ed78cb]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-b1ed78cb]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-b1ed78cb]:hover,.tool-row--toggleable .tool-header[data-v-b1ed78cb]:hover{background:#ffffff08}.tool-icon[data-v-b1ed78cb]{color:#9fbce0;flex-shrink:0}.tool-name[data-v-b1ed78cb]{color:#d0d0d0;flex-shrink:0;font-weight:600}.tool-arg[data-v-b1ed78cb],.tool-path[data-v-b1ed78cb]{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-b1ed78cb],.tool-arg[data-v-b1ed78cb]{flex:1}.tool-stat-add[data-v-b1ed78cb]{color:#66bb6a;flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-b1ed78cb]{color:#ef5350;flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-b1ed78cb]{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-b1ed78cb]{white-space:pre;color:#bbb;padding:0 12px}.diff-sign[data-v-b1ed78cb]{color:#555;-webkit-user-select:none;user-select:none;width:14px;display:inline-block}.diff-add[data-v-b1ed78cb]{color:#c8e6c9;background:#66bb6a1a}.diff-add .diff-sign[data-v-b1ed78cb]{color:#66bb6a}.diff-del[data-v-b1ed78cb]{color:#ffcdd2;background:#ef53501a}.diff-del .diff-sign[data-v-b1ed78cb]{color:#ef5350}.tool-output[data-v-b1ed78cb]{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-3a29c489]{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-3a29c489] *{max-width:100%}.markdown-message[data-v-3a29c489] img{-o-object-fit:contain;object-fit:contain;cursor:zoom-in;background:#0003;border-radius:4px;max-width:180px;max-height:100px;margin:.3em 0;display:block}.markdown-message[data-v-3a29c489] code{word-break:break-all}.markdown-message[data-v-3a29c489] p{margin:0 0 .4em}.markdown-message[data-v-3a29c489] p:last-child{margin-bottom:0}.markdown-message[data-v-3a29c489] code{background:#00000040;border-radius:3px;padding:.1em .3em}.markdown-message[data-v-3a29c489] h1,.markdown-message[data-v-3a29c489] h2,.markdown-message[data-v-3a29c489] h3,.markdown-message[data-v-3a29c489] h4,.markdown-message[data-v-3a29c489] h5,.markdown-message[data-v-3a29c489] h6{margin:.4em 0 .25em;font-weight:600;line-height:1.3}.markdown-message[data-v-3a29c489] h1{font-size:1.25em}.markdown-message[data-v-3a29c489] h2{font-size:1.15em}.markdown-message[data-v-3a29c489] h3{font-size:1.08em}.markdown-message[data-v-3a29c489] h4,.markdown-message[data-v-3a29c489] h5,.markdown-message[data-v-3a29c489] h6{font-size:1em}.markdown-user-prompt[data-v-3a29c489]{color:#aaa;font-size:12px;font-style:italic}.markdown-user-prompt[data-v-3a29c489] p{margin:0 0 .4em}.markdown-user-prompt[data-v-3a29c489] code{background:#ffffff14;border-radius:3px;padding:.1em .3em;font-style:normal}.image-lightbox-img{-o-object-fit:contain;object-fit:contain;cursor:zoom-out;background:#0000004d;border-radius:4px;max-width:92vw;max-height:92vh;display:block}.turn-card[data-v-50994916]{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-50994916]{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-50994916]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-50994916]{color:#ce93d8;background:#ce93d826}.turn-badge-agent[data-v-50994916]{color:#7986cb;background:#7986cb26}.turn-badge-system[data-v-50994916]{color:#bdbdbd;background:#75757533;font-style:italic}.turn-badge-session[data-v-50994916]{color:#9e9e9e;background:#61616133}.turn-time[data-v-50994916]{color:#666;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px}.turn-time-arrow[data-v-50994916]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-50994916]{color:#8891a3}.turn-actions[data-v-50994916]{color:#777;font-size:11px}.turn-body[data-v-50994916]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-50994916]>*{min-width:0;max-width:100%}.turn-body[data-v-50994916] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-50994916]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-50994916]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-50994916]:hover{opacity:1}.activity-feed-wrap[data-v-a9305543]{width:100%;height:100%;position:relative}.activity-feed-scroll[data-v-a9305543]{width:100%;height:100%}.activity-feed-nav-cluster[data-v-a9305543]{z-index:2;align-items:center;gap:8px;display:flex;position:absolute;bottom:14px;right:14px}.activity-feed-nav-btn[data-v-a9305543]{opacity:.8;transition:opacity .12s}.activity-feed-nav-btn[data-v-a9305543]:hover{opacity:1}.content-origin-marker[data-v-a9305543]{pointer-events:none;width:0;height:0;margin:0;padding:0}.activity-feed-scroll[data-v-a9305543] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-a9305543]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}
@@ -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{n as C,t as w}from"./settings-CAILUJXO.js";import{t as T}from"./QBtn-DHwAb18J.js";import{n as E}from"./vue-i18n-BJlZEYnA.js";import{S as D,b as O,v as k}from"./index-ljurK0Xv.js";import{t as A}from"./QSpinnerDots-DEiRooBD.js";import{t as j}from"./QExpansionItem-CWw6ZujM.js";import{t as M}from"./QScrollArea-DpCqRRE0.js";import{t as N}from"./QTooltip-BIDjo2hJ.js";import{n as P,r as F,t as I}from"./documents-Capxg1Is.js";import{t as L}from"./_plugin-vue_export-helper-r4mAJOHR.js";function ee(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 te(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 R(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:`user`;case`session`:return`session`;default:return`agent`}}function ne(e){let t=[],n=null;for(let r of e){let e=R(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 z={class:`text-caption text-grey-6`},B=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`,z,c(e.$t(r.value)),1))}});function V(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){H(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 H(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=re(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 re(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 U=[`innerHTML`],ie=L(v({__name:`TextMessageItem`,props:{item:{}},setup(e){let n=e,r=I(),i=k(),a=p(()=>{let e=i.selectedWorkspaceId;return e?r.documentsFor(e).map(e=>e.path):[]}),o=p(()=>{let e=V(P.parse(n.item.text,{async:!1,breaks:!0,gfm:!0}),a.value);return F.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,U),e.item.streaming?(t(),l(x,{key:0,size:`xs`,class:`q-ml-xs`})):u(``,!0)]))}}),[[`__scopeId`,`data-v-0ac5a3e4`]]),W={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},ae=[`innerHTML`],G={key:1,style:{"white-space":`pre-wrap`}},K=L(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=P.parse(n.item.text,{async:!1,breaks:!0,gfm:!0});return F.sanitize(e)});return(n,d)=>i.value?(t(),m(`div`,W,[a.value?(t(),l(j,{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,ae)]),_:1},8,[`label`])):(t(),m(`span`,G,c(e.item.text),1))])):u(``,!0)}}),[[`__scopeId`,`data-v-e9fb9f90`]]);function oe(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 q(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 J(e,t){if(!e||!t?.projectPath)return e;let n=se(e,`${t.projectPath}/.worktrees/${t.workingBranch}`);return n===e&&(n=se(e,t.projectPath)),n}function se(e,t){if(!t)return e;let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return e.replace(RegExp(`${n}/`,`g`),``).replace(RegExp(`${n}(?=\\s|$|["'\`])`,`g`),`.`)}var ce={class:`tool-name`},le=[`title`],Y={key:0,class:`tool-stat-add`},X={key:1,class:`tool-stat-del`},ue={class:`diff-sign`},de={class:`tool-name`},Z=[`title`],Q=L(v({__name:`ToolCallItem`,props:{item:{}},setup(e){let i=e,o=a(!1),g=k(),v=p(()=>q(i.item.name,i.item.input)),y=p(()=>v.value?J(v.value.filePath,g.selectedWorkspace):``),x={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`},C=p(()=>x[i.item.name]??`build`),w=p(()=>{if(v.value)return``;let e=i.item.input,t=T(e);return t?J(t,g.selectedWorkspace):``});function T(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 E=p(()=>{let e=v.value;return e?e.toolName===`Edit`&&e.oldString!==void 0&&e.newString!==void 0?oe(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=i.item.result;if(!e)return``;if(typeof e.output==`string`)return e.output;try{return JSON.stringify(e.output)}catch{return String(e.output)}}),O=new Set([`Read`]),A=p(()=>!!(i.item.result&&D.value)&&(!O.has(i.item.name)||i.item.result?.isError===!0));function j(){o.value=!o.value}return n(()=>i.item.result?.isError===!0,e=>{e&&(o.value=!0)},{immediate:!0}),(n,i)=>v.value?(t(),m(`div`,{key:0,class:s([`tool-row`,{"tool-row-expanded":o.value}])},[_(`div`,{class:`tool-header`,onClick:j},[d(S,{name:C.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),_(`span`,ce,c(v.value.toolName===`Bash:rm`?`Bash`:v.value.toolName),1),_(`span`,{class:`tool-path`,title:v.value.filePath},c(y.value),9,le),v.value.additions>0?(t(),m(`span`,Y,`+`+c(v.value.additions),1)):u(``,!0),v.value.deletions>0?(t(),m(`span`,X,`-`+c(v.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:o.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-auto text-grey-6`},null,8,[`name`])]),o.value&&E.value?(t(),m(`div`,{key:0,class:`tool-diff`,onClick:i[0]||=b(()=>{},[`stop`])},[(t(!0),m(h,null,r(E.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`,ue,c(e.type===`del`?`-`:e.type===`add`?`+`:` `),1),f(c(e.content),1)],2))),128))])):u(``,!0)],2)):(t(),m(`div`,{key:1,class:s([`tool-row tool-row-generic`,{"tool-row-expanded":o.value,"tool-row--toggleable":A.value}])},[_(`div`,{class:`tool-header`,onClick:i[1]||=e=>A.value&&j()},[d(S,{name:C.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),_(`span`,de,c(e.item.name),1),w.value?(t(),m(`span`,{key:0,class:`tool-arg`,title:T(e.item.input)||w.value},c(w.value),9,Z)):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),A.value?(t(),l(S,{key:3,name:o.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-xs text-grey-6`},null,8,[`name`])):u(``,!0)]),o.value&&A.value?(t(),m(`div`,{key:0,class:`tool-output`,onClick:i[2]||=b(()=>{},[`stop`])},c(D.value),1)):u(``,!0)],2))}}),[[`__scopeId`,`data-v-b1ed78cb`]]);function $(e,t){return t?e.replace(/\[image:\s+([^\]]+)\]/g,(e,n)=>{let r=String(n).trim();return/^(\.ai\/images\/|images\/)/.test(r)?`![${r}](${`/api/workspaces/${encodeURIComponent(t)}/images/file?path=${encodeURIComponent(r)}`})`:e}):e}var fe=[`innerHTML`],pe=[`innerHTML`],me=[`src`],he=L(v({__name:`UserMessageItem`,props:{item:{}},setup(e){let n=e,r=k(),i=p(()=>n.item.sender===`system-prompt`),s=p(()=>{let e=$(n.item.content,r.selectedWorkspaceId??``),t=P.parse(e,{async:!1,breaks:!0,gfm:!0});return F.sanitize(t)}),c=a(null),f=a(!1);function g(e){let t=e.target;if(t?.tagName!==`IMG`)return;let n=t;n.src&&(c.value=n.src,f.value=!0)}return(e,n)=>(t(),m(h,null,[i.value?(t(),l(j,{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:s.value},null,8,fe)]),_:1},8,[`label`])):(t(),m(`div`,{key:1,class:`markdown-message`,onClick:g},[_(`div`,{innerHTML:s.value},null,8,pe)])),d(C,{modelValue:f.value,"onUpdate:modelValue":n[1]||=e=>f.value=e},{default:o(()=>[c.value?(t(),m(`img`,{key:0,src:c.value,alt:``,class:`image-lightbox-img`,onClick:n[0]||=e=>f.value=!1},null,8,me)):u(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-3a29c489`]]),ge={class:`turn-header`},_e={key:0,class:`turn-time`},ve={class:`turn-time turn-time-updated`},ye={key:2,class:`turn-actions`},be={class:`turn-body`},xe={key:0,class:`turn-scroll-top`},Se=L(v({__name:`TurnCard`,props:{turn:{}},emits:[`scrollTo`],setup(e,{emit:n}){let i=e,v=n,{t:b}=E(),x=a(null);function C(){let e=x.value;if(!e)return;let t=e.closest(`.q-scrollarea`)?.querySelector(`.q-scrollarea__content`);if(!t){e.scrollIntoView({behavior:`smooth`,block:`start`});return}let n=e.getBoundingClientRect().top-t.getBoundingClientRect().top;v(`scrollTo`,Math.max(0,n-8))}let w=p(()=>{switch(i.turn.speaker){case`user`:return{label:b(`chat.you`),accent:`#ce93d8`,badgeClass:`turn-badge-user`};case`agent`:return{label:b(`chat.agent`),accent:`#7986cb`,badgeClass:`turn-badge-agent`};case`system-prompt`:return{label:b(`chat.systemPrompt`),accent:`#757575`,badgeClass:`turn-badge-system`};case`session`:return{label:b(`chat.session`),accent:`#616161`,badgeClass:`turn-badge-session`}}});function D(e,t=!1){if(!e)return``;let n=new Date(e);return Number.isNaN(n.getTime())?``:n.toLocaleTimeString(void 0,t?{hour:`2-digit`,minute:`2-digit`,second:`2-digit`}:{hour:`2-digit`,minute:`2-digit`})}let O=p(()=>D(i.turn.ts)),k=p(()=>{let e=i.turn.items;if(e.length===0)return null;for(let t=e.length-1;t>=0;t--){let n=e[t].ts;if(n)return n}return null}),A=p(()=>{let e=i.turn.ts,t=k.value;if(!t||!e||t===e)return``;let n=new Date(e).getTime(),r=new Date(t).getTime();return Number.isNaN(n)||Number.isNaN(r)||r<=n?``:D(t,r-n<6e4)}),j=p(()=>A.value!==``),M=p(()=>i.turn.items.filter(e=>e.type===`tool`).length);return(n,i)=>(t(),m(`div`,{ref_key:`cardEl`,ref:x,class:s([`turn-card`,{"turn-card--user":e.turn.speaker===`user`}]),style:y({"--turn-accent":w.value.accent})},[_(`div`,ge,[_(`span`,{class:s([`turn-badge`,w.value.badgeClass])},c(w.value.label),3),O.value?(t(),m(`span`,_e,c(O.value),1)):u(``,!0),j.value?(t(),m(h,{key:1},[d(S,{name:`arrow_forward`,size:`10px`,color:`grey-7`,class:`turn-time-arrow`}),_(`span`,ve,[f(c(A.value)+` `,1),d(N,null,{default:o(()=>[f(c(g(b)(`chat.lastUpdatedAt`,{time:A.value})),1)]),_:1})])],64)):u(``,!0),M.value>0?(t(),m(`span`,ye,` · `+c(g(b)(`chat.nActions`,{n:M.value})),1)):u(``,!0)]),_(`div`,be,[(t(!0),m(h,null,r(e.turn.items,(e,n)=>(t(),m(h,{key:n},[e.type===`text`?(t(),l(ie,{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(Q,{key:2,item:e},null,8,[`item`])):e.type===`user`?(t(),l(he,{key:3,item:e},null,8,[`item`])):e.type===`session`?(t(),l(B,{key:4,item:e},null,8,[`item`])):u(``,!0)],64))),128))]),e.turn.items.length>4?(t(),m(`div`,xe,[d(T,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`grey-6`,class:`turn-scroll-top-btn`,onClick:C},{default:o(()=>[d(N,null,{default:o(()=>[f(c(g(b)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):u(``,!0)],6))}}),[[`__scopeId`,`data-v-50994916`]]),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`},Oe={class:`activity-feed-nav-cluster`},ke=60,Ae=200,je=200,Me=400,Ne=200,Pe=L(v({__name:`ActivityFeed`,props:{workspaceId:{}},setup(s){let g=s,v=D(),y=w(),b=k(),S=p(()=>b.selectedSessionId),C=p(()=>b.sessions.find(e=>e.id===S.value)?.engineSessionId??null);function E(e){return!S.value||!e?!0:e===S.value||e===C.value}let N=p(()=>(b.activityFeeds[g.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&E(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,ts:e.timestamp,sessionId:e.sessionId}))),P=p(()=>O(b.workspaces.find(e=>e.id===g.workspaceId)?.status)),F=p(()=>{let e=v.eventsFor(g.workspaceId),t=v.timestampsFor(g.workspaceId),n=v.sessionIdsFor(g.workspaceId),r=[],i=[];for(let a=0;a<e.length;a++)E(n[a])&&(r.push(e[a]),i.push(t[a]));let a=te(ee(r,i,P.value),N.value);return ne(y.showVerboseSystemMessages?a:a.filter(e=>e.type!==`session`))}),I=p(()=>y.showVerboseSystemMessages?v.eventsFor(g.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),L=a(null),R=a(!0),z=a(!1),B=!1,V=a(!0),H=a(new Map);function re(e){R.value=e.verticalSize-e.verticalPosition-e.verticalContainerSize<=ke,B&&e.verticalPosition<=Ae&&!z.value&&ie()&&G()}function U(e,t){return`${e}:${t}`}function ie(){let e=S.value;return e?H.value.get(U(g.workspaceId,e))??!0:v.hasMoreOlderFor(g.workspaceId)}function W(e,t,n){H.value.set(U(e,t),n)}function ae(e){if(!S.value)return v.oldestIdFor(e);let t=v.eventIdsFor(e),n=v.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!E(n[e]))continue;let r=t[e];if(r)return r}}async function G(){let t=g.workspaceId,n=S.value,r=ae(t);if(!r)return;z.value=!0;let i=Date.now();try{let i=L.value,a=i?.getScroll().verticalSize??0,o=i?.getScroll().verticalPosition??0,s=new URLSearchParams({before:r,limit:`200`});n&&s.set(`session`,n);let c=fetch(`/api/workspaces/${t}/events?${s.toString()}`),l=new Promise(e=>setTimeout(e,je)),[u]=await Promise.all([c,l]);if(!u.ok){n?W(t,n,!1):v.prepend(t,[],[],{oldestId:r,hasMoreOlder:!1});return}let d=await u.json(),f=d.events??[],p=f.filter(e=>e.type===`agent:event`&&e.workspaceId===t),m=f.filter(e=>e.type===`user:message`&&e.workspaceId===t),h=p.map(e=>e.payload),g=p.map(e=>e.createdAt),_=p.map(e=>e.sessionId??null),y=p.map(e=>e.id),x=f.length>0?f[0].id:r;n&&W(t,n,d.hasMore),v.prepend(t,h,g,{oldestId:x,hasMoreOlder:n?v.hasMoreOlderFor(t):d.hasMore,sessionIds:_,eventIds:y});for(let e of m){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(),i){let e=i.getScroll().verticalSize-a,t=Math.max(o+e,Ae+50);i.setScrollPosition(`vertical`,t,0)}}catch(e){console.error(`[ActivityFeed] failed to load older events:`,e)}finally{let e=Date.now()-i,t=Math.max(0,je-e);await new Promise(e=>setTimeout(e,t+Me)),z.value=!1}}async function K(t=0){await e();let n=L.value;if(!n)return;let r=n.getScroll();n.setScrollPosition(`vertical`,r.verticalSize,t)}function oe(e){let t=L.value;t&&t.setScrollPosition(`vertical`,Math.max(0,e),250)}let q=a([]),J=a(null);function se(){let e=F.value,t=q.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=J.value?.parentElement;if(r){let e=r.querySelectorAll(`.turn-card--user`);for(let t of e)n.push(t)}return n}function ce(){let e=L.value;if(!e)return null;let t=J.value;if(!t)return null;let n=e.getScroll().verticalPosition,r=t.getBoundingClientRect().top,i=null;for(let e of se()){let t=e.getBoundingClientRect().top-r;if(t<n-40)i=t;else break}return i}async function le(){let t=L.value;if(!t)return;let n=ce();if(n===null)for(let t=0;t<15&&ie();t++){for(;z.value;)await new Promise(e=>setTimeout(e,50));if(await G(),await e(),n=ce(),n!==null)break}n!==null&&t.setScrollPosition(`vertical`,Math.max(0,n-12),250)}async function Y(){B=!1,await e(),await K(0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{B=!0})})}let X=p(()=>{let e=v.sessionIdsFor(g.workspaceId);if(!S.value)return e.length;let t=0;for(let n of e)E(n)&&t++;return t}),ue=p(()=>v.eventsFor(g.workspaceId).length);async function de(){V.value=!0;let e=Date.now();await new Promise(e=>setTimeout(e,Ne));let t=e+5e3;for(;ue.value===0&&Date.now()<t;)await new Promise(e=>setTimeout(e,50));V.value=!1}n(V,async e=>{!e&&X.value>0&&await Y(),!e&&X.value===0&&S.value&&$()}),i(()=>{de(),X.value>0&&Y(),S.value&&$()});let Z=!1;n(X,async(e,t)=>{if(!Z&&e>0){Z=!0,await Y();return}e>t&&R.value&&!z.value&&await K(180)}),n(()=>g.workspaceId,()=>{R.value=!0,Z=!1,B=!1,de(),X.value>0&&Y()}),n(()=>b.selectedSessionId,async()=>{R.value=!0,B=!1,await Y(),$()});let Q=new Set;async function $(){let t=S.value;if(!t||X.value>0)return;let n=U(g.workspaceId,t);if(!Q.has(n)){Q.add(n);try{let n=await fetch(`/api/workspaces/${g.workspaceId}/events?session=${encodeURIComponent(t)}&limit=500`);if(!n.ok)return;let r=await n.json(),i=r.events??[];if(i.length===0)return;let a=i.filter(e=>e.type===`agent:event`&&e.workspaceId===g.workspaceId),o=i.filter(e=>e.type===`user:message`&&e.workspaceId===g.workspaceId),s=a.map(e=>e.payload),c=a.map(e=>e.createdAt),l=a.map(e=>e.sessionId??null),u=a.map(e=>e.id);W(g.workspaceId,t,r.hasMore),s.length>0&&v.prepend(g.workspaceId,s,c,{oldestId:i[0].id,hasMoreOlder:v.hasMoreOlderFor(g.workspaceId),sessionIds:l,eventIds:u});for(let e of o){let t=e.payload;typeof t.content==`string`&&b.addActivityItem(g.workspaceId,{id:e.id,type:`text`,content:t.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:t.sender??`user`}})}await e(),await K(0)}catch(e){console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),Q.delete(n)}}}n(p(()=>N.value.filter(e=>e.sender!==`system-prompt`).length),async(e,t)=>{e>t&&(R.value=!0,await K(180))});async function fe(){R.value=!0,await K(250)}return(e,n)=>V.value?(t(),m(`div`,Ce,[d(A,{size:`40px`,color:`indigo-4`})])):(t(),m(`div`,we,[d(M,{ref_key:`scrollRef`,ref:L,class:`activity-feed-scroll`,onScroll:re},{default:o(()=>[_(`div`,{ref_key:`contentOriginRef`,ref:J,class:`content-origin-marker`},null,512),z.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(F.value,(e,n)=>(t(),l(Se,{key:n,ref_for:!0,ref_key:`turnRefs`,ref:q,turn:e,onScrollTo:oe},null,8,[`turn`]))),128))]),I.value.length?(t(),m(`div`,De,[d(j,{label:e.$t(`activity.raw_lines`,{n:I.value.length}),dense:``},{default:o(()=>[(t(!0),m(h,null,r(I.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),_(`div`,Oe,[R.value?u(``,!0):(t(),l(T,{key:0,round:``,dense:``,unelevated:``,color:`grey-9`,"text-color":`grey-3`,icon:`arrow_downward`,size:`sm`,class:`activity-feed-nav-btn`,title:e.$t(`activity.scroll_to_bottom`),onClick:fe},null,8,[`title`])),d(T,{round:``,dense:``,unelevated:``,color:`grey-9`,"text-color":`grey-3`,icon:`arrow_upward`,size:`sm`,class:`activity-feed-nav-btn`,title:e.$t(`activity.prev_user_message`),onClick:le},null,8,[`title`])])]))}}),[[`__scopeId`,`data-v-a9305543`]]);export{Pe as default};
@@ -1 +1 @@
1
- import{k as e,m as t}from"./QIcon-B0-pH3Qs.js";import{d as n,f as r}from"./scroll-C-Vz5BD9.js";function i(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var a=e({name:`close-popup`,beforeMount(e,{value:a}){let o={depth:i(a),handler(t){o.depth!==0&&setTimeout(()=>{let i=r(e);i!==void 0&&n(i,t,o.depth)})},handlerKey(e){t(e,13)===!0&&o.handler(e)}};e.__qclosepopup=o,e.addEventListener(`click`,o.handler),e.addEventListener(`keyup`,o.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=i(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{a as t};
1
+ import{k as e,m as t}from"./QIcon-B0-pH3Qs.js";import{d as n,f as r}from"./scroll-CYWyxBdv.js";function i(e){if(e===!1)return 0;if(e===!0||e===void 0)return 1;let t=parseInt(e,10);return isNaN(t)?0:t}var a=e({name:`close-popup`,beforeMount(e,{value:a}){let o={depth:i(a),handler(t){o.depth!==0&&setTimeout(()=>{let i=r(e);i!==void 0&&n(i,t,o.depth)})},handlerKey(e){t(e,13)===!0&&o.handler(e)}};e.__qclosepopup=o,e.addEventListener(`click`,o.handler),e.addEventListener(`keyup`,o.handlerKey)},updated(e,{value:t,oldValue:n}){t!==n&&(e.__qclosepopup.depth=i(t))},beforeUnmount(e){let t=e.__qclosepopup;e.removeEventListener(`click`,t.handler),e.removeEventListener(`keyup`,t.handlerKey),delete e.__qclosepopup}});export{a as t};
@@ -1,2 +1,2 @@
1
- import{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 te,rt as ne,u as m,v as re,vt as ie,x as ae}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{I as h,L as g,M as oe,t as _}from"./QIcon-B0-pH3Qs.js";import{t as v}from"./QSeparator-DNSiXYrN.js";import{t as y}from"./QBtn-CyzfM9-_.js";import{n as se}from"./vue-i18n-eUDnMrPl.js";import{S as ce,g as le,i as b,m as ue,v as de}from"./index-CbTmiNhf.js";import{n as x,t as S}from"./QItemSection-BzWLL-V-.js";import{t as C}from"./QItemLabel-Czw5g0px.js";import{t as fe}from"./QExpansionItem-HLBjHx-0.js";import{t as w}from"./QTooltip-DbEBexRN.js";import{t as pe}from"./_plugin-vue_export-helper-Cj6tcsj6.js";import{t as me}from"./QSpace-0zdF1m5x.js";import{t as he}from"./use-quasar-BBrzedjR.js";import{n as T,t as ge}from"./models-CuoIuROK.js";import{t as _e}from"./QPage-BTzNQlb1.js";var ve={class:`create-inner`},ye={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},be={class:`create-card rounded-borders`},xe={class:`card-top-bar row items-center q-px-md q-py-xs`},Se={class:`model-badge cursor-default row items-center q-gutter-xs`},Ce={class:`text-indigo-3 text-weight-medium text-caption`},we={key:0,class:`notion-url-wrap`},Te={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ee={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},De={key:0,class:`sentry-url-wrap`},Oe={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},ke={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},Ae={class:`card-name-wrap`},je={class:`card-textarea-wrap`},Me={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},Ne={class:`q-pa-sm manual-section-body`},Pe={class:`row items-center q-gutter-sm q-mb-sm`},Fe={class:`col text-caption text-grey-4`},Ie={class:`q-pa-sm manual-section-body`},Le={class:`row items-center q-gutter-sm q-mb-sm`},Re={class:`col text-caption text-grey-4`},ze={class:`card-bottom-bar`},Be={class:`bottom-row bottom-row-agent row items-center q-gutter-xs q-px-sm q-py-xs`},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-select-label row items-center no-wrap`},Ge={class:`row no-wrap items-center q-gutter-xs`},Ke={class:`bottom-row bottom-row-git row items-center q-gutter-xs q-px-sm q-py-xs`},qe={class:`bottom-select-label row items-center no-wrap`},Je={class:`bottom-select-label row items-center no-wrap`},Ye={class:`row justify-center q-px-sm q-py-sm`},Xe={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Ze=pe(re({__name:`CreatePage`,setup(re){let pe=ue(),Ze=he(),Qe=de(),E=ce(),{t:D}=se(),$e=a([]),O=a(``),k=a(``),A=a(``),j=a(!1),M=a(`claude-opus-4-7`),N=a(`auto`),P=a(``),F=a(null),I=a(`feature`),L=a(!1),R=a([]),z=a(`claude-code`),et=f(()=>R.value.find(e=>e.id===z.value)),tt=f(()=>R.value.map(e=>({value:e.id,label:e.displayName}))),nt=f(()=>(et.value?.capabilities.permissionModes??[`auto-accept`,`plan`]).map(e=>({value:e,label:D(`engine.permission.${e}`)}))),rt=[{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(E.global.defaultPermissionMode||`plan`),V=a([]),H=a(!1),it=a(!1),at=f(()=>ge.map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));function U(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let ot=f(()=>[{label:U(D(`reasoning.auto`)),value:`auto`,description:D(`reasoning.autoDescription`)},{label:U(D(`reasoning.low`)),value:`low`,description:D(`reasoning.lowDescription`)},{label:U(D(`reasoning.medium`)),value:`medium`,description:D(`reasoning.mediumDescription`)},{label:U(D(`reasoning.high`)),value:`high`,description:D(`reasoning.highDescription`)},{label:U(D(`reasoning.xhigh`)),value:`xhigh`,description:D(`reasoning.xhighDescription`)},{label:U(D(`reasoning.max`)),value:`max`,description:D(`reasoning.maxDescription`)}]),W=f(()=>A.value.trim().startsWith(`https://www.notion.so/`)),G=a([]),K=a([]),q=a(``),J=a(``),st=f(()=>!j.value||!W.value);function ct(){let e=q.value.trim();e&&(G.value.push(e),q.value=``)}function lt(e){G.value.splice(e,1)}function ut(){let e=J.value.trim();e&&(K.value.push(e),J.value=``)}function dt(e){K.value.splice(e,1)}function ft(){j.value=!j.value,j.value||(A.value=``)}let Y=a(!1),X=a(!1),Z=a(``),Q=f(()=>/\/issues\/\d+/.test(Z.value.trim()));function pt(){Y.value=!Y.value,Y.value||(Z.value=``)}async function mt(e){if(!e.trim()){V.value=[],F.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&&!F.value&&(F.value=V.value[0]??null)}catch{V.value=[],F.value=null}finally{H.value=!1}}function ht(e){let t=E.getProjectByPath(e);t&&(t.defaultSourceBranch&&(F.value=t.defaultSourceBranch),t.defaultModel?M.value=t.defaultModel:E.global.defaultModel&&(M.value=E.global.defaultModel))}let $=null;t(P,e=>{$&&clearTimeout($),$=setTimeout(()=>{F.value=null,mt(e),ht(e)},500)});function gt(e,t){t(()=>{$e.value=E.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}r(async()=>{E.fetchSettings();try{let e=await fetch(`/api/engines`);e.ok&&(R.value=await e.json())}catch{}}),i(()=>{$&&clearTimeout($)});function _t(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 vt(){return O.value.trim()?O.value.trim().substring(0,80):!j.value&&!Y.value&&k.value.trim()&&(k.value.trim().split(`
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 te,rt as ne,u as m,v as re,vt as ie,x as ae}from"./runtime-core.esm-bundler-C3IgBgY5.js";import{I as h,L as g,M as oe,t as _}from"./QIcon-B0-pH3Qs.js";import{t as v}from"./QSeparator-DNSiXYrN.js";import{t as se}from"./settings-CAILUJXO.js";import{t as y}from"./QBtn-DHwAb18J.js";import{n as ce}from"./vue-i18n-BJlZEYnA.js";import{g as le,i as b,m as ue,v as de}from"./index-ljurK0Xv.js";import{n as x,t as S}from"./QItemSection-CiY_LK5Y.js";import{t as C}from"./QItemLabel-Codqjisk.js";import{t as fe}from"./QExpansionItem-CWw6ZujM.js";import{t as w}from"./QTooltip-BIDjo2hJ.js";import{t as pe}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as me}from"./QSpace-BNr0AftG.js";import{t as he}from"./use-quasar-Cc4smfg5.js";import{n as T,t as ge}from"./models-BWwzb9Qz.js";import{t as _e}from"./QPage-Dn4E3GHB.js";var ve={class:`create-inner`},ye={class:`create-title text-center text-weight-bold q-mb-lg text-grey-3`},be={class:`create-card rounded-borders`},xe={class:`card-top-bar row items-center q-px-md q-py-xs`},Se={class:`model-badge cursor-default row items-center q-gutter-xs`},Ce={class:`text-indigo-3 text-weight-medium text-caption`},we={key:0,class:`notion-url-wrap`},Te={key:0,class:`notion-error text-caption q-px-md q-pb-xs text-red-5`},Ee={key:1,class:`notion-valid text-caption q-px-md q-pb-xs text-green-4`},De={key:0,class:`sentry-url-wrap`},Oe={key:0,class:`sentry-error text-caption q-px-md q-pb-xs text-red-5`},ke={key:1,class:`sentry-valid text-caption q-px-md q-pb-xs text-red-4`},Ae={class:`card-name-wrap`},je={class:`card-textarea-wrap`},Me={class:`manual-hint q-px-md q-py-sm text-caption text-grey-6`},Ne={class:`q-pa-sm manual-section-body`},Pe={class:`row items-center q-gutter-sm q-mb-sm`},Fe={class:`col text-caption text-grey-4`},Ie={class:`q-pa-sm manual-section-body`},Le={class:`row items-center q-gutter-sm q-mb-sm`},Re={class:`col text-caption text-grey-4`},ze={class:`card-bottom-bar`},Be={class:`bottom-row bottom-row-agent row items-center q-gutter-xs q-px-sm q-py-xs`},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-select-label row items-center no-wrap`},Ge={class:`row no-wrap items-center q-gutter-xs`},Ke={class:`bottom-row bottom-row-git row items-center q-gutter-xs q-px-sm q-py-xs`},qe={class:`bottom-select-label row items-center no-wrap`},Je={class:`bottom-select-label row items-center no-wrap`},Ye={class:`row justify-center q-px-sm q-py-sm`},Xe={class:`create-hint text-center text-body2 q-mt-md text-grey-8`},Ze=pe(re({__name:`CreatePage`,setup(re){let pe=ue(),Ze=he(),Qe=de(),E=se(),{t:D}=ce(),$e=a([]),O=a(``),k=a(``),A=a(``),j=a(!1),M=a(`claude-opus-4-7`),N=a(`auto`),P=a(``),F=a(null),I=a(`feature`),L=a(!1),R=a([]),z=a(`claude-code`),et=f(()=>R.value.find(e=>e.id===z.value)),tt=f(()=>R.value.map(e=>({value:e.id,label:e.displayName}))),nt=f(()=>(et.value?.capabilities.permissionModes??[`auto-accept`,`plan`]).map(e=>({value:e,label:D(`engine.permission.${e}`)}))),rt=[{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(E.global.defaultPermissionMode||`plan`),V=a([]),H=a(!1),it=a(!1),at=f(()=>ge.map(e=>({label:D(e.i18nLabelKey),value:e.value,description:D(e.i18nDescriptionKey)})));function U(e){let t=e.indexOf(`:`);return t>=0?e.slice(t+1).trim():e}let ot=f(()=>[{label:U(D(`reasoning.auto`)),value:`auto`,description:D(`reasoning.autoDescription`)},{label:U(D(`reasoning.low`)),value:`low`,description:D(`reasoning.lowDescription`)},{label:U(D(`reasoning.medium`)),value:`medium`,description:D(`reasoning.mediumDescription`)},{label:U(D(`reasoning.high`)),value:`high`,description:D(`reasoning.highDescription`)},{label:U(D(`reasoning.xhigh`)),value:`xhigh`,description:D(`reasoning.xhighDescription`)},{label:U(D(`reasoning.max`)),value:`max`,description:D(`reasoning.maxDescription`)}]),W=f(()=>A.value.trim().startsWith(`https://www.notion.so/`)),G=a([]),K=a([]),q=a(``),J=a(``),st=f(()=>!j.value||!W.value);function ct(){let e=q.value.trim();e&&(G.value.push(e),q.value=``)}function lt(e){G.value.splice(e,1)}function ut(){let e=J.value.trim();e&&(K.value.push(e),J.value=``)}function dt(e){K.value.splice(e,1)}function ft(){j.value=!j.value,j.value||(A.value=``)}let Y=a(!1),X=a(!1),Z=a(``),Q=f(()=>/\/issues\/\d+/.test(Z.value.trim()));function pt(){Y.value=!Y.value,Y.value||(Z.value=``)}async function mt(e){if(!e.trim()){V.value=[],F.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&&!F.value&&(F.value=V.value[0]??null)}catch{V.value=[],F.value=null}finally{H.value=!1}}function ht(e){let t=E.getProjectByPath(e);t&&(t.defaultSourceBranch&&(F.value=t.defaultSourceBranch),t.defaultModel?M.value=t.defaultModel:E.global.defaultModel&&(M.value=E.global.defaultModel))}let $=null;t(P,e=>{$&&clearTimeout($),$=setTimeout(()=>{F.value=null,mt(e),ht(e)},500)});function gt(e,t){t(()=>{$e.value=E.projectPaths.filter(t=>t.toLowerCase().includes(e.toLowerCase()))})}r(async()=>{E.fetchSettings();try{let e=await fetch(`/api/engines`);e.ok&&(R.value=await e.json())}catch{}}),i(()=>{$&&clearTimeout($)});function _t(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 vt(){return O.value.trim()?O.value.trim().substring(0,80):!j.value&&!Y.value&&k.value.trim()&&(k.value.trim().split(`
2
2
  `)[0]??``).substring(0,80)||`workspace`}function yt(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 bt(){return j.value&&!W.value?D(`createPage.validationNotionUrl`):Y.value&&!Q.value?D(`createPage.sentryValidation`):!j.value&&!Y.value&&!k.value.trim()?D(`createPage.validationDescription`):!j.value&&!Y.value&&(!vt()||vt()===`workspace`)&&!O.value.trim()&&!k.value.trim()?D(`createPage.validationName`):P.value.trim()?F.value?null:D(`createPage.validationBranch`):D(`createPage.validationPath`)}async function xt(){let e=bt();if(e){Ze.notify({type:`negative`,message:e,position:`top`});return}it.value=!0;try{let e=vt(),t;t=j.value&&W.value?yt(A.value.trim()):e===`workspace`?`task-${Date.now()}`:_t(e);let n=`${I.value}/${t}`,r={name:e,projectPath:P.value.trim(),sourceBranch:F.value,workingBranch:n,engine:z.value,model:M.value,reasoningEffort:N.value,...j.value&&W.value?{notionUrl:A.value.trim()}:{},...Y.value&&Q.value?{sentryUrl:Z.value.trim()}:{},...st.value&&G.value.length>0?{tasks:G.value}:{},...st.value&&K.value.length>0?{acceptanceCriteria:K.value}:{},...L.value?{skipSetupScript:!0}:{},...k.value.trim()?{description:k.value.trim()}:{},...X.value?{autoLoop:!0}:{},permissionMode:X.value?`auto-accept`:B.value},i=await Qe.createWorkspace(r);le().subscribe(i.id),Qe.selectWorkspace(i.id),pe.push({name:`workspace`,params:{id:i.id}})}catch{Ze.notify({type:`negative`,message:D(`createPage.errorCreating`),position:`top`})}finally{it.value=!1}}return(t,r)=>(e(),c(_e,{class:`create-page flex flex-center column`},{default:o(()=>[m(`div`,ve,[m(`div`,ye,s(t.$t(`createPage.title`)),1),m(`div`,be,[m(`div`,xe,[m(`span`,Se,[u(_,{name:`auto_awesome`,size:`14px`,color:`indigo-4`}),m(`span`,Ce,s(et.value?.displayName??t.$t(`createPage.claudeCode`)),1)]),u(me),u(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:j.value?`green-4`:`grey-5`,class:`notion-toggle-btn text-caption rounded-borders`,onClick:ft},{default:o(()=>[u(_,{name:`description`,size:`14px`,class:`q-mr-xs`}),d(` `+s(j.value?t.$t(`createPage.notionEnabled`):t.$t(`createPage.importNotion`)),1)]),_:1},8,[`color`]),u(y,{flat:``,dense:``,"no-caps":``,size:`sm`,color:Y.value?`red-4`:`grey-5`,class:`sentry-toggle-btn text-caption rounded-borders q-ml-sm`,onClick:pt},{default:o(()=>[u(_,{name:`bug_report`,size:`14px`,class:`q-mr-xs`}),d(` `+s(Y.value?t.$t(`createPage.sentryEnabled`):t.$t(`createPage.importSentry`)),1)]),_:1},8,[`color`])]),u(v,{color:`grey-9`}),u(oe,{name:`slide`},{default:o(()=>[j.value?(e(),p(`div`,we,[u(b,{modelValue:A.value,"onUpdate:modelValue":r[0]||=e=>A.value=e,borderless:``,dense:``,placeholder:t.$t(`createPage.notionPlaceholder`),class:`notion-url-input`,"input-class":`notion-url-input-inner`},{prepend:o(()=>[u(_,{name:`link`,size:`16px`,color:W.value?`green-4`:`grey-6`},null,8,[`color`])]),_:1},8,[`modelValue`,`placeholder`]),A.value.trim()&&!W.value?(e(),p(`div`,Te,s(t.$t(`createPage.notionValidation`)),1)):l(``,!0),W.value?(e(),p(`div`,Ee,s(t.$t(`createPage.notionAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),j.value?(e(),c(v,{key:0,color:`grey-9`})):l(``,!0),u(oe,{name:`slide`},{default:o(()=>[Y.value?(e(),p(`div`,De,[u(b,{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(_,{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`,Oe,s(t.$t(`createPage.sentryValidation`)),1)):l(``,!0),Q.value?(e(),p(`div`,ke,s(t.$t(`createPage.sentryAutoExtract`)),1)):l(``,!0)])):l(``,!0)]),_:1}),Y.value?(e(),c(v,{key:1,color:`grey-9`})):l(``,!0),m(`div`,Ae,[u(b,{modelValue:O.value,"onUpdate:modelValue":r[2]||=e=>O.value=e,borderless:``,dense:``,placeholder:j.value&&W.value?t.$t(`createPage.workspaceName`):t.$t(`createPage.workspaceNamePlaceholder`),class:`name-input`,"input-class":`name-input-inner`},null,8,[`modelValue`,`placeholder`])]),u(v,{color:`grey-9`}),m(`div`,je,[u(b,{modelValue:k.value,"onUpdate:modelValue":r[3]||=e=>k.value=e,type:`textarea`,borderless:``,autogrow:``,rows:3,placeholder:j.value?t.$t(`createPage.instructions`):t.$t(`createPage.instructionsPlaceholder`),class:`create-textarea`,"input-class":`create-textarea-input`,onKeydown:[h(g(xt,[`ctrl`]),[`enter`]),h(g(xt,[`meta`]),[`enter`])]},null,8,[`modelValue`,`placeholder`,`onKeydown`])]),u(v,{color:`grey-9`}),st.value?(e(),p(te,{key:2},[m(`div`,Me,s(t.$t(`createPage.manualHint`)),1),u(fe,{dark:``,dense:``,label:t.$t(`createPage.tasks`,{count:G.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm`},{default:o(()=>[m(`div`,Ne,[m(`div`,Pe,[u(b,{modelValue:q.value,"onUpdate:modelValue":r[4]||=e=>q.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addTask`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:h(g(ct,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!q.value.trim(),onClick:ct},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`tooltip.addTask`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),p(te,null,n(G.value,(n,r)=>(e(),p(`div`,{key:`task-${r}`,class:`row items-center q-py-xs manual-item`},[m(`span`,Fe,s(n),1),u(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>lt(r)},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`tooltip.removeTask`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(fe,{dark:``,dense:``,label:t.$t(`createPage.acceptanceCriteria`,{count:K.value.length}),"header-class":`text-grey-4 manual-expansion-header`,class:`manual-expansion q-mx-sm q-mb-sm`},{default:o(()=>[m(`div`,Ie,[m(`div`,Le,[u(b,{modelValue:J.value,"onUpdate:modelValue":r[5]||=e=>J.value=e,dark:``,dense:``,borderless:``,placeholder:t.$t(`createPage.addCriterion`),class:`col manual-input`,"input-class":`manual-input-inner`,onKeydown:h(g(ut,[`prevent`]),[`enter`])},null,8,[`modelValue`,`placeholder`,`onKeydown`]),u(y,{flat:``,dense:``,round:``,icon:`add`,color:`indigo-4`,disable:!J.value.trim(),onClick:ut},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`tooltip.addCriterion`)),1)]),_:1})]),_:1},8,[`disable`])]),(e(!0),p(te,null,n(K.value,(n,r)=>(e(),p(`div`,{key:`crit-${r}`,class:`row items-center q-py-xs manual-item`},[m(`span`,Re,s(n),1),u(y,{flat:``,dense:``,round:``,icon:`close`,size:`xs`,color:`grey-6`,onClick:e=>dt(r)},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`tooltip.removeCriterion`)),1)]),_:1})]),_:1},8,[`onClick`])]))),128))])]),_:1},8,[`label`]),u(v,{color:`grey-9`})],64)):l(``,!0),m(`div`,ze,[m(`div`,Be,[tt.value.length>0?(e(),c(T,{key:0,modelValue:z.value,"onUpdate:modelValue":r[6]||=e=>z.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(()=>[m(`span`,Ve,[u(_,{name:`hub`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(tt.value.find(e=>e.value===z.value)?.label??z.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`engine.select`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`])):l(``,!0),u(T,{modelValue:M.value,"onUpdate:modelValue":r[7]||=e=>M.value=e,options:at.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(()=>[m(`span`,He,[d(s(at.value.find(e=>e.value===M.value)?.label??M.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(x,ee(t,{class:`model-option`}),{default:o(()=>[u(S,null,{default:o(()=>[u(C,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(C,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),u(T,{modelValue:N.value,"onUpdate:modelValue":r[8]||=e=>N.value=e,options:ot.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[m(`span`,Ue,[u(_,{name:`psychology`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(ot.value.find(e=>e.value===N.value)?.label??N.value)+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),option:o(({opt:e,itemProps:t})=>[u(x,ie(ae(t)),{default:o(()=>[u(S,null,{default:o(()=>[u(C,{class:`text-white`},{default:o(()=>[d(s(e.label),1)]),_:2},1024),u(C,{caption:``,class:`text-grey-5`},{default:o(()=>[d(s(e.description),1)]),_:2},1024)]),_:2},1024)]),_:2},1040)]),_:1},8,[`modelValue`,`options`]),u(T,{modelValue:B.value,"onUpdate:modelValue":r[9]||=e=>B.value=e,options:nt.value,disable:X.value,dense:``,borderless:``,class:`bottom-select rounded-borders`,"hide-dropdown-icon":``,"emit-value":``,"map-options":``,"option-value":`value`,"option-label":`label`},{selected:o(()=>[m(`span`,We,[u(_,{name:X.value?`flash_on`:B.value===`plan`?`visibility`:`flash_on`,size:`12px`,color:`amber-6`,class:`q-mr-xs`},null,8,[`name`]),d(` `+s(X.value?nt.value.find(e=>e.value===`auto-accept`)?.label??`auto-accept`:nt.value.find(e=>e.value===B.value)?.label??B.value)+` `,1),X.value?l(``,!0):(e(),c(_,{key:0,name:`expand_more`,size:`12px`,color:`grey-5`}))])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(X.value?t.$t(`createPage.permissionLockedByAutoLoop`):t.$t(`engine.permission`)),1)]),_:1})]),_:1},8,[`modelValue`,`options`,`disable`]),u(me),m(`div`,Ge,[u(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:X.value?`autorenew`:`sync_disabled`,color:X.value?`amber-4`:`grey-5`,label:t.$t(`autoLoop.startInMode`),class:`skip-setup-btn`,onClick:r[10]||=e=>X.value=!X.value},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`autoLoop.startInMode`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`]),u(y,{flat:``,dense:``,size:`sm`,"no-caps":``,icon:L.value?`play_disabled`:`play_circle`,color:L.value?`orange-4`:`grey-5`,label:t.$t(`createPage.skipSetupScript`),class:`skip-setup-btn`,onClick:r[11]||=e=>L.value=!L.value},{default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`createPage.skipSetupScript`)),1)]),_:1})]),_:1},8,[`icon`,`color`,`label`])])]),m(`div`,Ke,[u(T,{modelValue:P.value,"onUpdate:modelValue":r[12]||=e=>P.value=e,options:$e.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":P.value?``:`repo-input-empty`,placeholder:t.$t(`createPage.projectPath`),behavior:ne(E).projectPaths.length>0?`menu`:`dialog`,onFilter:gt,onInputValue:r[13]||=e=>{P.value=e}},{prepend:o(()=>[u(_,{name:`folder`,size:`14px`,color:`grey-5`})]),"no-option":o(()=>[u(x,null,{default:o(()=>[u(S,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`input-class`,`placeholder`,`behavior`]),u(T,{modelValue:I.value,"onUpdate:modelValue":r[14]||=e=>I.value=e,options:rt,"emit-value":``,"map-options":``,dense:``,borderless:``,class:`bottom-select rounded-borders branch-type-select`,"hide-dropdown-icon":``},{selected:o(()=>[m(`span`,qe,[u(_,{name:`account_tree`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(I.value)+`/ `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),default:o(()=>[u(w,null,{default:o(()=>[d(s(t.$t(`createPage.branchType`)),1)]),_:1})]),_:1},8,[`modelValue`]),u(T,{modelValue:F.value,"onUpdate:modelValue":r[15]||=e=>F.value=e,options:V.value,dense:``,borderless:``,class:`bottom-select rounded-borders branch-select`,"hide-dropdown-icon":``,loading:H.value,disable:!P.value.trim()||H.value},{selected:o(()=>[m(`span`,Je,[u(_,{name:`call_split`,size:`12px`,color:`grey-5`,class:`q-mr-xs`}),d(` `+s(F.value??t.$t(`createPage.branch`))+` `,1),u(_,{name:`expand_more`,size:`12px`,color:`grey-5`})])]),"no-option":o(()=>[u(x,null,{default:o(()=>[u(S,{class:`text-grey-6 text-caption`},{default:o(()=>[d(s(P.value.trim()?t.$t(`createPage.noBranches`):t.$t(`createPage.enterPath`)),1)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`options`,`loading`,`disable`])])]),m(`div`,Ye,[u(y,{label:t.$t(`createPage.create`),"no-caps":``,unelevated:``,class:`create-btn text-weight-bold rounded-borders`,loading:it.value,onClick:xt},null,8,[`label`,`loading`])])]),m(`div`,Xe,s(j.value?t.$t(`createPage.notionExtractHint`):t.$t(`createPage.notionImportHint`)),1)])]),_:1}))}}),[[`__scopeId`,`data-v-81666389`]]);export{Ze as default};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/editor.main-DFavPtYi.js","assets/index-ljurK0Xv.js","assets/vue-i18n-BJlZEYnA.js","assets/runtime-core.esm-bundler-C3IgBgY5.js","assets/QIcon-B0-pH3Qs.js","assets/use-id-C93QQwrt.js","assets/QSeparator-DNSiXYrN.js","assets/QBtn-DHwAb18J.js","assets/use-checkbox-B_o-iLG2.js","assets/private.use-form-Dlb0iQZh.js","assets/settings-CAILUJXO.js","assets/scroll-CYWyxBdv.js","assets/is-DUKatk8N.js","assets/symbols-DCYodwb2.js","assets/index-eX_lKHSg.css","assets/editor.api-BXQZAhGS.js","assets/editor-COGk2gAX.css","assets/monaco.contribution-BcmbPJhi.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 ee,u as h,v as g,yt as _}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 te}from"./QSeparator-DNSiXYrN.js";import{n as ne,t as x}from"./QBtn-DHwAb18J.js";import{n as re}from"./vue-i18n-BJlZEYnA.js";import{r as S,t as C}from"./private.use-form-Dlb0iQZh.js";import{f as ie}from"./index-ljurK0Xv.js";import{t as w}from"./QSpinnerDots-DEiRooBD.js";import{t as ae}from"./QScrollArea-DpCqRRE0.js";import{t as T}from"./QTooltip-BIDjo2hJ.js";import{t as E}from"./_plugin-vue_export-helper-r4mAJOHR.js";import{t as D}from"./QBadge-DqtcDv8D.js";import{t as oe}from"./QSpace-BNr0AftG.js";import{i as O,n as se,r as ce,t as le}from"./build-path-tree-BOfvTwdg.js";var k=v({name:`QBtnToggle`,props:{...S,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=C(f(()=>({type:`hidden`,name:e.name,value:e.modelValue}))),o=f(()=>ne(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(x,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(O,{class:`q-btn-toggle`,...o.value,rounded:e.rounded,stretch:e.stretch,glossy:e.glossy,spread:e.spread},d)}}),ue={class:`diff-viewer column full-height`},de={class:`diff-header row items-center q-px-md q-py-sm no-wrap`},fe={class:`text-body1 text-weight-medium text-grey-3`},pe={key:0,class:`text-caption text-grey-6 q-ml-md`,style:{"font-size":`11px`}},me={class:`text-grey-7`},he={class:`text-green-4`},A={class:`text-grey-7`},j={key:1,class:`text-caption text-grey-5 q-ml-md ellipsis`,style:{"font-size":`11px`,"font-family":`'Roboto Mono', monospace`,"max-width":`400px`}},M={class:`row col no-wrap`,style:{"min-height":`0`}},N={key:1,class:`text-caption text-grey-8 q-pa-sm`},P={class:`text-grey-4`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},F={class:`text-grey-3 ellipsis`,style:{"font-family":`'Roboto Mono', monospace`,"font-size":`11px`}},I={class:`col column`,style:{"min-width":`0`,position:`relative`}},L={key:0,class:`col column items-center justify-center`},ge={key:1,class:`col column items-center justify-center text-grey-8 text-caption`},R=`kobo:diffViewerFileListWidth`,z=180,B=600,V=E(g({__name:`DiffViewer`,props:{workspaceId:{}},emits:[`close`,`sendToChat`],setup(a,{emit:g}){let v=a,y=g,{t:ne}=re(),S=i([]),C=i(``),E=i(``),O=i(null),V=i(!1),H=i(!1),U=i(null),W=i(`side`),G=i(`branch`),_e=parseInt(localStorage.getItem(R)??`280`,10),K=i(Math.min(B,Math.max(z,_e)));function ve(e){e.preventDefault();let t=e.target.closest(`.diff-viewer`);if(!t)return;let n=t.getBoundingClientRect().left,r=e=>{K.value=Math.min(B,Math.max(z,e.clientX-n))},i=()=>{localStorage.setItem(R,String(K.value)),document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i),document.body.style.cursor=``,document.body.style.userSelect=``};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}let q=null,J=null,Y=[],ye=f(()=>le(S.value)),X=f(()=>O.value?`file:${O.value}`:``);async function Z(){V.value=!0;try{let e=await fetch(`/api/workspaces/${v.workspaceId}/diff?mode=${G.value}`,{cache:`no-store`});if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();S.value=t.files,C.value=t.sourceBranch??``,E.value=t.workingBranch??``}catch(e){console.error(`Failed to load diff files:`,e)}finally{V.value=!1}}async function Q(e){if(U.value){H.value=!0;try{q||(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`})}},q=await ie(()=>import(`./editor.main-DFavPtYi.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])),q.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)}&mode=${G.value}`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json(),r={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,vue:`html`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,sql:`sql`,py:`python`,rs:`rust`,go:`go`}[e.split(`.`).pop()??``]??`plaintext`;if(J){for(let e of Y)e.dispose();Y=[];let e=J.getModel();J.dispose(),J=null,e?.original?.dispose(),e?.modified?.dispose()}let i=q.editor.createModel(n.original??``,r),a=q.editor.createModel(n.modified??``,r);J=q.editor.createDiffEditor(U.value,{theme:`kobo-dark`,readOnly:!0,renderSideBySide:W.value===`side`,automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:12,lineHeight:18}),J.setModel({original:i,modified:a}),be()}catch(e){console.error(`Failed to load file diff:`,e)}finally{H.value=!1}}}let $=i(!1);function be(){if(!J)return;for(let e of Y)e.dispose();Y=[];let e=J.getModifiedEditor(),t=J.getOriginalEditor();for(let n of[e,t]){let e=n.onDidChangeCursorSelection(()=>{let e=n.getSelection();$.value=!!(e&&!e.isEmpty())});Y.push(e)}}function xe(){if(!(!J||!O.value))for(let e of[J.getModifiedEditor(),J.getOriginalEditor()]){let t=e.getSelection();if(t&&!t.isEmpty()){let n=e.getModel();if(!n)continue;let r=n.getValueInRange(t),i=e===J.getModifiedEditor()?`modified`:`original`;y(`sendToChat`,`\`\`\`\n// ${O.value} (${i}) L${t.startLineNumber}-L${t.endLineNumber}\n${r}\n\`\`\``);return}}}t(O,e=>{e&&Q(e)}),t(W,()=>{J&&J.updateOptions({renderSideBySide:W.value===`side`})}),t(G,async()=>{let e=O.value;await Z(),e&&S.value.some(t=>t.path===e)?Q(e):O.value=null});function Se(e){switch(e){case`added`:return`#4ade80`;case`deleted`:return`#f87171`;case`renamed`:return`#60a5fa`;default:return`#f59e0b`}}return n(Z),r(()=>{for(let e of Y)e.dispose();if(Y=[],J){let e=J.getModel();J.dispose(),J=null,e?.original?.dispose(),e?.modified?.dispose()}}),(t,n)=>(e(),p(`div`,ue,[h(`div`,de,[u(b,{name:`difference`,size:`18px`,color:`indigo-4`,class:`q-mr-xs`}),h(`span`,fe,s(t.$t(`diff.title`)),1),u(D,{label:`${S.value.length}`,color:`grey-8`,"text-color":`grey-4`,class:`q-ml-sm`,style:{"font-size":`10px`}},null,8,[`label`]),C.value?(e(),p(`span`,pe,[G.value===`branch`?(e(),p(m,{key:0},[h(`span`,me,s(C.value),1),u(b,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),h(`span`,he,s(E.value),1)],64)):(e(),p(m,{key:1},[h(`span`,A,`origin/`+s(E.value),1),u(b,{name:`arrow_forward`,size:`11px`,color:`grey-8`,class:`q-mx-xs`}),n[4]||=h(`span`,{class:`text-green-4`},`HEAD`,-1)],64))])):l(``,!0),O.value?(e(),p(`span`,j,s(O.value),1)):l(``,!0),u(oe),u(k,{modelValue:G.value,"onUpdate:modelValue":n[0]||=e=>G.value=e,dense:``,"no-caps":``,size:`sm`,"toggle-color":`indigo-8`,color:`grey-9`,"text-color":`grey-5`,options:[{label:t.$t(`diff.scopeBranch`),value:`branch`},{label:t.$t(`diff.scopeUnpushed`),value:`unpushed`}],class:`q-mr-sm`},null,8,[`modelValue`,`options`]),u(k,{modelValue:W.value,"onUpdate:modelValue":n[1]||=e=>W.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(x,{flat:``,round:``,dense:``,icon:`close`,color:`grey-5`,size:`sm`,onClick:n[2]||=e=>y(`close`)},{default:o(()=>[u(T,null,{default:o(()=>[d(s(t.$t(`tooltip.closeDiffViewer`)),1)]),_:1})]),_:1})]),u(te,{dark:``}),h(`div`,M,[h(`div`,{class:`diff-file-list-wrapper`,style:_({width:`${K.value}px`,minWidth:`${z}px`})},[u(ae,{class:`diff-file-list q-pa-xs`,style:{width:`100%`,height:`100%`,"border-right":`1px solid #2a2a4a`}},{default:o(()=>[V.value?(e(),c(w,{key:0,size:`24px`,color:`grey-6`,class:`q-ma-md`})):S.value.length===0?(e(),p(`div`,N,s(t.$t(`diff.noChanges`)),1)):(e(),c(ce,{key:2,nodes:ye.value,"node-key":`nodeKey`,"label-key":`label`,"children-key":`children`,dark:``,dense:``,"default-expand-all":``,"no-selection-unset":``,selected:X.value,class:`diff-tree`,"onUpdate:selected":n[3]||=e=>{typeof e!=`string`||!e.startsWith(`file:`)||(O.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`}),h(`span`,P,s(t.label),1),u(D,{label:t.children?ee(se)(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:_({color:Se(t.file.status)}),class:`q-mr-xs`},{default:o(()=>[u(T,null,{default:o(()=>[d(s(t.file.status),1)]),_:2},1024)]),_:2},1032,[`style`]),h(`span`,F,s(t.label),1)],64))]),_:1},8,[`nodes`,`selected`]))]),_:1}),h(`div`,{class:`diff-file-list-resize-handle`,onMousedown:ve},null,32)],4),h(`div`,I,[H.value?(e(),p(`div`,L,[u(w,{size:`32px`,color:`indigo-4`})])):O.value?l(``,!0):(e(),p(`div`,ge,s(t.$t(`diff.selectFile`)),1)),h(`div`,{ref_key:`editorContainer`,ref:U,class:`col`,style:{"min-height":`0`}},null,512),$.value?(e(),c(x,{key:2,"no-caps":``,dense:``,size:`sm`,color:`primary`,icon:`chat`,label:t.$t(`diff.addToChat`),class:`send-to-chat-btn`,onClick:xe},null,8,[`label`])):l(``,!0)])])]))}}),[[`__scopeId`,`data-v-23217be2`]]);export{V 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-CyzfM9-_.js";import{E as h,O as g,m as re}from"./index-CbTmiNhf.js";import{n as ie,t as ae}from"./QItemSection-BzWLL-V-.js";import{t as _}from"./QSpace-0zdF1m5x.js";import{t as oe}from"./use-quasar-BBrzedjR.js";import{t as v}from"./QList-D2GuTeLl.js";import{t as y}from"./QPage-BTzNQlb1.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(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,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(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,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(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,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(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,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(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,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(h,{dark:``,flat:``,bordered:``},{default:i(()=>[c(g,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};
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-DHwAb18J.js";import{D as h,T as g,m as re}from"./index-ljurK0Xv.js";import{n as ie,t as ae}from"./QItemSection-CiY_LK5Y.js";import{t as _}from"./QSpace-BNr0AftG.js";import{t as oe}from"./use-quasar-Cc4smfg5.js";import{t as v}from"./QList-Bl9824vi.js";import{t as y}from"./QPage-Dn4E3GHB.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};