@loicngr/kobo 1.7.30 → 1.7.32

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 (241) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/mcp-server/kobo-tasks-server.js +1 -1
  3. package/dist/server/routes/settings.js +2 -1
  4. package/dist/server/routes/workspaces.js +40 -4
  5. package/dist/server/services/agent/engines/claude-code/event-mapper.js +8 -0
  6. package/dist/server/services/agent/engines/claude-code/options-builder.js +11 -1
  7. package/dist/server/services/agent/engines/types.js +1 -0
  8. package/dist/server/services/agent/event-router.js +7 -1
  9. package/dist/server/services/auto-loop-service.js +2 -1
  10. package/dist/server/services/forge/github/provider.js +6 -2
  11. package/dist/server/services/forge/gitlab/provider.js +3 -0
  12. package/dist/server/services/forge/types.js +13 -0
  13. package/dist/server/services/pr-watcher-service.js +5 -0
  14. package/dist/server/services/settings-service.js +28 -1
  15. package/dist/server/services/workspace-service.js +15 -0
  16. package/dist/shared/models.js +12 -0
  17. package/package.json +14 -14
  18. package/src/client/dist/spa/assets/ActivityFeed-COdkQaiZ.js +8 -0
  19. package/src/client/dist/spa/assets/{ActivityFeed-yUMQhnW4.css → ActivityFeed-HbMZOClq.css} +1 -1
  20. package/src/client/dist/spa/assets/ChangelogPage-BXD8H3j-.js +1 -0
  21. package/src/client/dist/spa/assets/ClosePopup-DD10nToj.js +1 -0
  22. package/src/client/dist/spa/assets/CreatePage-CE-ljszo.css +1 -0
  23. package/src/client/dist/spa/assets/CreatePage-DX4TjLqr.js +2 -0
  24. package/src/client/dist/spa/assets/DiffViewer-BUjVXGyZ.js +8 -0
  25. package/src/client/dist/spa/assets/HealthPage-DM7fvP4v.js +1 -0
  26. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiAw-BCOjigVR.woff +0 -0
  27. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtalmUiAw-Ocp2tNig.woff +0 -0
  28. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabVmUiAw-6jEn9xEl.woff +0 -0
  29. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bVmUiAw-CCs8I9zJ.woff +0 -0
  30. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbFmUiAw-BLaboPi0.woff +0 -0
  31. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAw-DHuK6FBl.woff +0 -0
  32. package/src/client/dist/spa/assets/MainLayout-CbUZOTwz.js +37 -0
  33. package/src/client/dist/spa/assets/{MainLayout-D2SRkiCN.css → MainLayout-DtTxmFXf.css} +1 -1
  34. package/src/client/dist/spa/assets/QBadge-CIC5n8w7.js +1 -0
  35. package/src/client/dist/spa/assets/QBanner-BxBEdhfp.js +1 -0
  36. package/src/client/dist/spa/assets/QBtn-DwemGTZv.js +1 -0
  37. package/src/client/dist/spa/assets/QCheckbox-o3UHW596.js +1 -0
  38. package/src/client/dist/spa/assets/QChip-BpS8c1sW.js +1 -0
  39. package/src/client/dist/spa/assets/QExpansionItem-C9vmJqEO.js +1 -0
  40. package/src/client/dist/spa/assets/QIcon-C6C3QeM4.js +1 -0
  41. package/src/client/dist/spa/assets/QInput-CLZtb8E0.js +1 -0
  42. package/src/client/dist/spa/assets/QItemLabel-BYSjzk-t.js +1 -0
  43. package/src/client/dist/spa/assets/QItemSection-O9WBXftL.js +1 -0
  44. package/src/client/dist/spa/assets/QList-DRW_oyZ4.js +1 -0
  45. package/src/client/dist/spa/assets/QMenu-D_9kEp2i.js +1 -0
  46. package/src/client/dist/spa/assets/QPage-C6xc9fOe.js +1 -0
  47. package/src/client/dist/spa/assets/QRadio-B_TurTzx.js +1 -0
  48. package/src/client/dist/spa/assets/QScrollArea-B5jf9S4y.js +1 -0
  49. package/src/client/dist/spa/assets/QScrollObserver-Cxj52Zfg.js +1 -0
  50. package/src/client/dist/spa/assets/QSelect-DERXhq6x.js +36 -0
  51. package/src/client/dist/spa/assets/QSpace-CrVsndpV.js +1 -0
  52. package/src/client/dist/spa/assets/QSpinnerDots-atHe_AUn.js +1 -0
  53. package/src/client/dist/spa/assets/QToggle-Dwr3hSLw.js +1 -0
  54. package/src/client/dist/spa/assets/QTooltip-CyRLTG6i.js +1 -0
  55. package/src/client/dist/spa/assets/SearchPage-OaTRqd2Q.js +1 -0
  56. package/src/client/dist/spa/assets/SettingsPage-B7H6sD7r.css +1 -0
  57. package/src/client/dist/spa/assets/SettingsPage-BBk3MB8w.js +9 -0
  58. package/src/client/dist/spa/assets/TouchPan-BmfIMD00.js +1 -0
  59. package/src/client/dist/spa/assets/WorkspacePage-k_qzLoLC.js +4 -0
  60. package/src/client/dist/spa/assets/build-path-tree-D4_LR3mz.js +1 -0
  61. package/src/client/dist/spa/assets/chunk-DtRyYLXJ.js +1 -0
  62. package/src/client/dist/spa/assets/codicon-ngg6Pgfi.ttf +0 -0
  63. package/src/client/dist/spa/assets/{css.worker-D1piIYC4.js → css.worker-BtW9exzf.js} +32 -45
  64. package/src/client/dist/spa/assets/cssMode-CdNIff6x.js +1 -0
  65. package/src/client/dist/spa/assets/documents-N8PwB_Gh.js +1 -0
  66. package/src/client/dist/spa/assets/editor-BFebQ78e.css +1 -0
  67. package/src/client/dist/spa/assets/editor.api2-CEAFHkwY.js +872 -0
  68. package/src/client/dist/spa/assets/editor.main-DuQa2C4S.js +6 -0
  69. package/src/client/dist/spa/assets/editor.worker-DWlYVeeX.js +26 -0
  70. package/src/client/dist/spa/assets/engineFeatures-DChekJQO.js +1 -0
  71. package/src/client/dist/spa/assets/expand-template-BXNt_oWH.js +1 -0
  72. package/src/client/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff +0 -0
  73. package/src/client/dist/spa/assets/{formatters-BKR66G3t.js → formatters-wq5wP2If.js} +1 -1
  74. package/src/client/dist/spa/assets/freemarker2-DXz2Sr_a.js +3 -0
  75. package/src/client/dist/spa/assets/handlebars-B6DHJ8jd.js +1 -0
  76. package/src/client/dist/spa/assets/html-_UvZHIUo.js +1 -0
  77. package/src/client/dist/spa/assets/{html.worker-C4q4XMPn.js → html.worker-Dg1SpGQ4.js} +22 -29
  78. package/src/client/dist/spa/assets/htmlMode-DZ0ixGc6.js +1 -0
  79. package/src/client/dist/spa/assets/i18n-DXMuiAyu.js +1 -0
  80. package/src/client/dist/spa/assets/{index-ClabzOPc.css → index-C3dgH7TE.css} +1 -1
  81. package/src/client/dist/spa/assets/index-CNin8jPU.js +82 -0
  82. package/src/client/dist/spa/assets/{javascript-B3eFu2aM.js → javascript-C6Gf4Ys2.js} +1 -1
  83. package/src/client/dist/spa/assets/json.worker-CCzEOxDx.js +58 -0
  84. package/src/client/dist/spa/assets/jsonMode-aE8EPidy.js +7 -0
  85. package/src/client/dist/spa/assets/{kobo-commands-Bty0N8JZ.js → kobo-commands-Ip0ObeCE.js} +1 -1
  86. package/src/client/dist/spa/assets/{kotlin-CllWo3gX.js → kotlin-DIUPrqKg.js} +1 -1
  87. package/src/client/dist/spa/assets/liquid-CSp27lUC.js +1 -0
  88. package/src/client/dist/spa/assets/lspLanguageFeatures-UxO-LpRp.js +4 -0
  89. package/src/client/dist/spa/assets/mdx-BSCEgQSy.js +1 -0
  90. package/src/client/dist/spa/assets/monaco.contribution-DqqsS1kc.js +2 -0
  91. package/src/client/dist/spa/assets/notifications-C4MxuXC7.js +1 -0
  92. package/src/client/dist/spa/assets/permissionModes-CJN6Olox.js +1 -0
  93. package/src/client/dist/spa/assets/python-CA5lSk1U.js +1 -0
  94. package/src/client/dist/spa/assets/razor-BznM4hXD.js +1 -0
  95. package/src/client/dist/spa/assets/render-chat-markdown-BJsZCnSw.js +66 -0
  96. package/src/client/dist/spa/assets/touch-yfnu5R3D.js +1 -0
  97. package/src/client/dist/spa/assets/ts.worker-DI5g4t5j.js +67719 -0
  98. package/src/client/dist/spa/assets/tsMode-NbGeOvoN.js +11 -0
  99. package/src/client/dist/spa/assets/typescript-kHDph5jb.js +1 -0
  100. package/src/client/dist/spa/assets/use-checkbox-BnkSQgTJ.js +1 -0
  101. package/src/client/dist/spa/assets/use-id-By86THzm.js +1 -0
  102. package/src/client/dist/spa/assets/{use-onboarding-BorG03FJ.js → use-onboarding-C4tGLHsr.js} +1 -1
  103. package/src/client/dist/spa/assets/use-quasar-DcJRs0ay.js +1 -0
  104. package/src/client/dist/spa/assets/vue-i18n-C5Tx4bGk.js +3 -0
  105. package/src/client/dist/spa/assets/vue.runtime.esm-bundler-BAtKyT0Y.js +3 -0
  106. package/src/client/dist/spa/assets/workers-DFjmWZva.js +1 -0
  107. package/src/client/dist/spa/assets/xml-BXzZhhmL.js +1 -0
  108. package/src/client/dist/spa/assets/yaml-DQNlz7_W.js +1 -0
  109. package/src/client/dist/spa/index.html +14 -13
  110. package/src/mcp-server/kobo-tasks-server.ts +1 -1
  111. package/src/client/dist/spa/assets/ActivityFeed-Dcp3KOD-.js +0 -8
  112. package/src/client/dist/spa/assets/ChangelogPage-CQuEm5ri.js +0 -1
  113. package/src/client/dist/spa/assets/ClosePopup-CY16K9Yi.js +0 -1
  114. package/src/client/dist/spa/assets/CreatePage-DDuStqsB.css +0 -1
  115. package/src/client/dist/spa/assets/CreatePage-DwPnA1bE.js +0 -2
  116. package/src/client/dist/spa/assets/DiffViewer-CdpddYBw.js +0 -8
  117. package/src/client/dist/spa/assets/HealthPage-czYUHzsb.js +0 -1
  118. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiAw-k1h7X_-h.woff +0 -0
  119. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtalmUiAw-B7du-70m.woff +0 -0
  120. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabVmUiAw-CoAZ_DKt.woff +0 -0
  121. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bVmUiAw-D0406B4n.woff +0 -0
  122. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbFmUiAw-CnAg2DeQ.woff +0 -0
  123. package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAw-BG9VWE5v.woff +0 -0
  124. package/src/client/dist/spa/assets/MainLayout-DsG5p1lc.js +0 -37
  125. package/src/client/dist/spa/assets/QBadge-DNQSqPg-.js +0 -1
  126. package/src/client/dist/spa/assets/QBanner-C_TvxtXi.js +0 -1
  127. package/src/client/dist/spa/assets/QBtn-CoU-UC_j.js +0 -1
  128. package/src/client/dist/spa/assets/QCheckbox-Cq2STfHp.js +0 -1
  129. package/src/client/dist/spa/assets/QChip-5bnjPnRz.js +0 -1
  130. package/src/client/dist/spa/assets/QExpansionItem-_8j8FyQg.js +0 -1
  131. package/src/client/dist/spa/assets/QIcon-BmEX2rXO.js +0 -1
  132. package/src/client/dist/spa/assets/QInput-D0t39uK_.js +0 -1
  133. package/src/client/dist/spa/assets/QItemLabel-Btqw0P7M.js +0 -1
  134. package/src/client/dist/spa/assets/QItemSection-DRg-QuAD.js +0 -1
  135. package/src/client/dist/spa/assets/QList-Ch5K5W7r.js +0 -1
  136. package/src/client/dist/spa/assets/QMenu-BXssnk-g.js +0 -1
  137. package/src/client/dist/spa/assets/QPage-3-ah4oor.js +0 -1
  138. package/src/client/dist/spa/assets/QRadio-M9mC5jZy.js +0 -1
  139. package/src/client/dist/spa/assets/QScrollArea-_Mvx2t8o.js +0 -1
  140. package/src/client/dist/spa/assets/QScrollObserver-C6P7wS4h.js +0 -1
  141. package/src/client/dist/spa/assets/QSelect-kWnJnHbT.js +0 -36
  142. package/src/client/dist/spa/assets/QSpace-Crcx82On.js +0 -1
  143. package/src/client/dist/spa/assets/QSpinnerDots-DspFKwCZ.js +0 -1
  144. package/src/client/dist/spa/assets/QToggle-DBzTAIbK.js +0 -1
  145. package/src/client/dist/spa/assets/QTooltip-DyIRS1GH.js +0 -1
  146. package/src/client/dist/spa/assets/SearchPage-CxqEGjQZ.js +0 -1
  147. package/src/client/dist/spa/assets/SettingsPage-CL9uI9wk.js +0 -9
  148. package/src/client/dist/spa/assets/SettingsPage-D1Ap5wB7.css +0 -1
  149. package/src/client/dist/spa/assets/TouchPan-DZZEI8eo.js +0 -1
  150. package/src/client/dist/spa/assets/WorkspacePage-DYOstvf6.js +0 -4
  151. package/src/client/dist/spa/assets/build-path-tree-BUfhgOSH.js +0 -1
  152. package/src/client/dist/spa/assets/codicon-CgENjH2v.ttf +0 -0
  153. package/src/client/dist/spa/assets/cssMode-DK7cw-vE.js +0 -4
  154. package/src/client/dist/spa/assets/documents-CX2-4fhr.js +0 -1
  155. package/src/client/dist/spa/assets/editor-COGk2gAX.css +0 -1
  156. package/src/client/dist/spa/assets/editor-CS3NEPi9.css +0 -1
  157. package/src/client/dist/spa/assets/editor.api-DvSpUXCz.js +0 -818
  158. package/src/client/dist/spa/assets/editor.main-DwPjO6GT.js +0 -53
  159. package/src/client/dist/spa/assets/editor.worker-CJ9iTmkr.js +0 -26
  160. package/src/client/dist/spa/assets/engineFeatures-Bt8kYOzE.js +0 -1
  161. package/src/client/dist/spa/assets/expand-template-CIu2odEp.js +0 -1
  162. package/src/client/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-OUIwM9U8.woff +0 -0
  163. package/src/client/dist/spa/assets/freemarker2-D7ge7blW.js +0 -3
  164. package/src/client/dist/spa/assets/handlebars-CUEC5MGt.js +0 -1
  165. package/src/client/dist/spa/assets/html-CxVVScDS.js +0 -1
  166. package/src/client/dist/spa/assets/htmlMode-B56eLBAd.js +0 -4
  167. package/src/client/dist/spa/assets/i18n-QWFh8Zwf.js +0 -1
  168. package/src/client/dist/spa/assets/index-B-lBV8Zz.js +0 -82
  169. package/src/client/dist/spa/assets/json.worker-C9p7xCYk.js +0 -65
  170. package/src/client/dist/spa/assets/jsonMode-D2R4UZpk.js +0 -10
  171. package/src/client/dist/spa/assets/liquid-96V_PNfN.js +0 -1
  172. package/src/client/dist/spa/assets/mdx-Dm6cvsMe.js +0 -1
  173. package/src/client/dist/spa/assets/monaco.contribution-CYHCoAZe.js +0 -2
  174. package/src/client/dist/spa/assets/notifications-BtVr85fZ.js +0 -1
  175. package/src/client/dist/spa/assets/permissionModes-BUhr5Wdx.js +0 -1
  176. package/src/client/dist/spa/assets/python-DswGzTX7.js +0 -1
  177. package/src/client/dist/spa/assets/razor-4HZKZMY8.js +0 -1
  178. package/src/client/dist/spa/assets/render-chat-markdown-BpWIaLW6.js +0 -60
  179. package/src/client/dist/spa/assets/runtime-core.esm-bundler-D_RRiKBh.js +0 -1
  180. package/src/client/dist/spa/assets/touch-2Qa-HSDZ.js +0 -1
  181. package/src/client/dist/spa/assets/ts.worker-Cj3zTgVE.js +0 -51353
  182. package/src/client/dist/spa/assets/tsMode-C83Lp_IK.js +0 -11
  183. package/src/client/dist/spa/assets/typescript-Dbm3rcf_.js +0 -1
  184. package/src/client/dist/spa/assets/use-checkbox-DnSuDqo2.js +0 -1
  185. package/src/client/dist/spa/assets/use-id-BCnfiBjU.js +0 -1
  186. package/src/client/dist/spa/assets/use-quasar-sypIWZgU.js +0 -1
  187. package/src/client/dist/spa/assets/vue-i18n-Cq-KgjJC.js +0 -3
  188. package/src/client/dist/spa/assets/xml-BDATADOG.js +0 -1
  189. package/src/client/dist/spa/assets/yaml-Fic7yQhp.js +0 -1
  190. /package/src/client/dist/spa/assets/{_plugin-vue_export-helper-r4mAJOHR.js → _plugin-vue_export-helper-BzmG9fMN.js} +0 -0
  191. /package/src/client/dist/spa/assets/{fsharp-CMk2OIJN.js → fsharp-CFNadkg7.js} +0 -0
  192. /package/src/client/dist/spa/assets/{go-BrMkuJg0.js → go-dSur1iB2.js} +0 -0
  193. /package/src/client/dist/spa/assets/{graphql-PSR1UKGv.js → graphql-qyhAo11d.js} +0 -0
  194. /package/src/client/dist/spa/assets/{hcl-DAQrbDOW.js → hcl-DFzjMyzm.js} +0 -0
  195. /package/src/client/dist/spa/assets/{ini-0TG5BxW0.js → ini-TdzA8TIl.js} +0 -0
  196. /package/src/client/dist/spa/assets/{java-rgorz17v.js → java-CSGA9pkE.js} +0 -0
  197. /package/src/client/dist/spa/assets/{julia-C8VMdHm8.js → julia-9izz5OsY.js} +0 -0
  198. /package/src/client/dist/spa/assets/{less-Cgca25AP.js → less-B8d93iCg.js} +0 -0
  199. /package/src/client/dist/spa/assets/{lexon-D0GHdBaw.js → lexon-DWtEIyu7.js} +0 -0
  200. /package/src/client/dist/spa/assets/{lua-DmRsNG-P.js → lua-Ciq0OGgt.js} +0 -0
  201. /package/src/client/dist/spa/assets/{m3-BgL5dNKT.js → m3-Cki6JWj_.js} +0 -0
  202. /package/src/client/dist/spa/assets/{markdown-BuJfycGS.js → markdown-Cu47xwU0.js} +0 -0
  203. /package/src/client/dist/spa/assets/{mips-C9m_93PR.js → mips-BM8ui995.js} +0 -0
  204. /package/src/client/dist/spa/assets/{msdax-CpFHC9OI.js → msdax-DqLio0_c.js} +0 -0
  205. /package/src/client/dist/spa/assets/{mysql-qFvltsqN.js → mysql-v1wbjJOq.js} +0 -0
  206. /package/src/client/dist/spa/assets/{objective-c-Bnmr858J.js → objective-c-CQl3PGSB.js} +0 -0
  207. /package/src/client/dist/spa/assets/{pascal-WP0_D5AO.js → pascal-D4iW0ZtD.js} +0 -0
  208. /package/src/client/dist/spa/assets/{pascaligo-Blom4Rij.js → pascaligo-BdC9CZdj.js} +0 -0
  209. /package/src/client/dist/spa/assets/{perl-B-vk8g64.js → perl-BL10m4XD.js} +0 -0
  210. /package/src/client/dist/spa/assets/{pgsql-Cgvz6v67.js → pgsql-Be_oqVo3.js} +0 -0
  211. /package/src/client/dist/spa/assets/{php-8a3Lrw9m.js → php-BtvXSFRI.js} +0 -0
  212. /package/src/client/dist/spa/assets/{pla-DuFqEZ8V.js → pla-B2vUy15C.js} +0 -0
  213. /package/src/client/dist/spa/assets/{postiats-DkLtSgkp.js → postiats-CbmTTfXr.js} +0 -0
  214. /package/src/client/dist/spa/assets/{powerquery-BJ1aNepW.js → powerquery-DszLhJGx.js} +0 -0
  215. /package/src/client/dist/spa/assets/{powershell-rE98k687.js → powershell-B0dYktF6.js} +0 -0
  216. /package/src/client/dist/spa/assets/{protobuf-CUheFacr.js → protobuf-CZvaj1VX.js} +0 -0
  217. /package/src/client/dist/spa/assets/{pug-LDcAMD8w.js → pug-CPDx1B3S.js} +0 -0
  218. /package/src/client/dist/spa/assets/{qsharp-DUKSQoR1.js → qsharp-CDP9TFLl.js} +0 -0
  219. /package/src/client/dist/spa/assets/{r-D-QApv87.js → r-8DbbFX2l.js} +0 -0
  220. /package/src/client/dist/spa/assets/{redis-SXdDyWR9.js → redis-DRWj9MtJ.js} +0 -0
  221. /package/src/client/dist/spa/assets/{redshift-Y6lsCryn.js → redshift-C6cElE_5.js} +0 -0
  222. /package/src/client/dist/spa/assets/{restructuredtext-edObr9a8.js → restructuredtext-W9pS9n3m.js} +0 -0
  223. /package/src/client/dist/spa/assets/{ruby-CNnUfF-8.js → ruby-BKnzWnk-.js} +0 -0
  224. /package/src/client/dist/spa/assets/{rust-IHUZWzBr.js → rust-YPCclWwe.js} +0 -0
  225. /package/src/client/dist/spa/assets/{sb-DrUvY44N.js → sb-BgM4DTFb.js} +0 -0
  226. /package/src/client/dist/spa/assets/{scala-B4hbXGLM.js → scala-fz1OPLMl.js} +0 -0
  227. /package/src/client/dist/spa/assets/{scheme-BGrd12j3.js → scheme-8Uz1RIbu.js} +0 -0
  228. /package/src/client/dist/spa/assets/{scss-x5G1ES4U.js → scss-Djo3IYXr.js} +0 -0
  229. /package/src/client/dist/spa/assets/{shell-DOehe2Y8.js → shell-CINF5Tx_.js} +0 -0
  230. /package/src/client/dist/spa/assets/{solidity-BeRvcwWV.js → solidity-GgiNEuUm.js} +0 -0
  231. /package/src/client/dist/spa/assets/{sophia-DZbkUNjy.js → sophia-Culj97P9.js} +0 -0
  232. /package/src/client/dist/spa/assets/{sparql-B7_oi5-h.js → sparql-C2ZlpxOY.js} +0 -0
  233. /package/src/client/dist/spa/assets/{sql-CTlsFWVE.js → sql-BEf5Pg7Y.js} +0 -0
  234. /package/src/client/dist/spa/assets/{st-DJVEJdPE.js → st-CT6UUoeH.js} +0 -0
  235. /package/src/client/dist/spa/assets/{swift-CwhT3fYa.js → swift-B5g0xTG3.js} +0 -0
  236. /package/src/client/dist/spa/assets/{systemverilog-BQN63pkN.js → systemverilog-CEgQz9DR.js} +0 -0
  237. /package/src/client/dist/spa/assets/{tcl-DqwfpskA.js → tcl-D0qL2L0I.js} +0 -0
  238. /package/src/client/dist/spa/assets/{twig-BiyenUgc.js → twig-BFUAVf1E.js} +0 -0
  239. /package/src/client/dist/spa/assets/{typespec-CWOJribt.js → typespec-CjVVcNKm.js} +0 -0
  240. /package/src/client/dist/spa/assets/{vb-Cq5F87m3.js → vb-CZJr-DQz.js} +0 -0
  241. /package/src/client/dist/spa/assets/{wgsl-BAvW2lVr.js → wgsl-ivoXUo2e.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@ All notable changes to Kōbō are documented here. The format is based on
4
4
  [Keep a Changelog](https://keepachangelog.com/). Each release is an `## <version>`
5
5
  section — the in-app "What's new" dialog reads this file.
6
6
 
7
+ ## 1.7.32
8
+
9
+ - feat: CI recap card, compaction indicator, Claude Task tools, deps upgrade, npm audit fix
10
+
11
+ ## 1.7.31
12
+
13
+ - feat: ready-to-merge status, open-pr fix, new models, dep audit
14
+
7
15
  ## 1.7.30
8
16
 
9
17
  - feat: open-in-terminal button + git creation/purge fixes
@@ -421,7 +421,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
421
421
  },
422
422
  {
423
423
  name: 'schedule_wakeup',
424
- description: 'CALL to schedule a follow-up turn on THIS workspace after a delay. End the current turn normally; once it finishes and the workspace is idle, Kōbō waits `delaySeconds`, then resumes the same conversation by injecting `prompt` as the next user message. The wakeup is scoped to the current workspace and resumes its latest session — you cannot target another workspace or another session. If a turn is still active when the timer fires, the wakeup is skipped (status: `session-active`). Replaces any previously pending wakeup on this workspace. Delay is clamped to [60, 21600] seconds (1min to 6h). Prefer this over the built-in `ScheduleWakeup` tool — it is the SDK-supported entry point.',
424
+ description: 'WHEN: use this whenever you would otherwise WAIT for or POLL a long-running task (test suite, CI, build, deploy, or external state) — never block your turn with sleep/poll loops, and never end a turn merely "waiting" on a background job, because the session goes idle and will not resume on its own. CALL to schedule a follow-up turn on THIS workspace after a delay. End the current turn normally; once it finishes and the workspace is idle, Kōbō waits `delaySeconds`, then resumes the same conversation by injecting `prompt` as the next user message. The wakeup is scoped to the current workspace and resumes its latest session — you cannot target another workspace or another session. If a turn is still active when the timer fires, the wakeup is skipped (status: `session-active`). Replaces any previously pending wakeup on this workspace. Delay is clamped to [60, 21600] seconds (1min to 6h). Prefer this over the built-in `ScheduleWakeup` tool — it is the SDK-supported entry point.',
425
425
  inputSchema: {
426
426
  type: 'object',
427
427
  properties: {
@@ -3,7 +3,7 @@ import { DEFAULT_NOTION_INITIAL_PROMPT, DEFAULT_SENTRY_INITIAL_PROMPT, } from '.
3
3
  import { DEFAULT_REVIEW_PROMPT_TEMPLATE } from '../services/review-template-service.js';
4
4
  import { DEFAULT_CHANGE_SOURCE_BRANCH_SCRIPT } from '../services/settings-defaults.js';
5
5
  import * as settingsService from '../services/settings-service.js';
6
- import { DEFAULT_CI_FIX_PROMPT_TEMPLATE, DEFAULT_GIT_CONVENTIONS, DEFAULT_PR_PROMPT_TEMPLATE, } from '../services/settings-service.js';
6
+ import { DEFAULT_CI_FIX_PROMPT_TEMPLATE, DEFAULT_FINALIZATION_PROMPT, DEFAULT_GIT_CONVENTIONS, DEFAULT_PR_PROMPT_TEMPLATE, } from '../services/settings-service.js';
7
7
  import { listTemplates, replaceAllTemplates } from '../services/templates-service.js';
8
8
  /** Hono sub-router for global and per-project settings CRUD. */
9
9
  const app = new Hono();
@@ -38,6 +38,7 @@ app.get('/defaults', (c) => {
38
38
  prPromptTemplate: DEFAULT_PR_PROMPT_TEMPLATE,
39
39
  reviewPromptTemplate: DEFAULT_REVIEW_PROMPT_TEMPLATE,
40
40
  ciFixPromptTemplate: DEFAULT_CI_FIX_PROMPT_TEMPLATE,
41
+ finalizationPrompt: DEFAULT_FINALIZATION_PROMPT,
41
42
  gitConventions: DEFAULT_GIT_CONVENTIONS,
42
43
  notionInitialPromptTemplate: DEFAULT_NOTION_INITIAL_PROMPT,
43
44
  sentryInitialPromptTemplate: DEFAULT_SENTRY_INITIAL_PROMPT,
@@ -691,7 +691,8 @@ app.post('/', migrationGuard, async (c) => {
691
691
  // been registered yet, the empty default below is correct.
692
692
  const projectSettingsForE2e = settingsService.getProjectSettings(body.projectPath);
693
693
  const e2eSettings = projectSettingsForE2e?.e2e ?? { framework: '', skill: '', prompt: '' };
694
- const finalizationSettings = projectSettingsForE2e?.finalization ?? { prompt: '' };
694
+ // Finalization cascades project || global (E2E stays project-only).
695
+ const finalizationSettings = settingsService.getEffectiveFinalization(body.projectPath);
695
696
  brainstormPrompt += `\n\n${suitePrompts.brainstormingInstruction}
696
697
 
697
698
  Auto-loop mode is active for this workspace. After the plan is ready, DO NOT implement anything. Instead:
@@ -1540,7 +1541,8 @@ app.get('/:id/prep-autoloop-prompt', (c) => {
1540
1541
  return c.json({ error: `Workspace '${id}' not found` }, 404);
1541
1542
  const projectSettings = settingsService.getProjectSettings(workspace.projectPath);
1542
1543
  const e2eSettings = projectSettings?.e2e ?? { framework: '', skill: '', prompt: '' };
1543
- const finalizationSettings = projectSettings?.finalization ?? { prompt: '' };
1544
+ // Finalization cascades project || global (E2E stays project-only).
1545
+ const finalizationSettings = settingsService.getEffectiveFinalization(workspace.projectPath);
1544
1546
  const globalSettings = settingsService.getGlobalSettings();
1545
1547
  const intro = buildGroomingIntro(globalSettings.skillSuite, globalSettings.customAutoLoopGroomingIntro);
1546
1548
  const prompt = `${intro}
@@ -2989,9 +2991,17 @@ app.post('/:id/open-pr', async (c) => {
2989
2991
  if (!lsRemoteOut.trim()) {
2990
2992
  return c.json({ error: 'Branch is not on remote', code: 'branch_not_pushed' }, 409);
2991
2993
  }
2992
- // Ensure all local commits are pushed
2994
+ // Ensure all local commits are pushed. Compare against origin/<workingBranch>
2995
+ // explicitly — NOT `@{u}`: the worktree is created from origin/<sourceBranch>
2996
+ // (worktree-service.createWorktree), so the branch's upstream tracks the BASE.
2997
+ // `@{u}..HEAD` would then count the branch's own commits and falsely report
2998
+ // "unpushed" for any branch pushed without -u (e.g. by the agent). This mirrors
2999
+ // getUnpushedCountAsync, the ref the GitPanel's "pushed" label already uses.
2993
3000
  try {
2994
- const { stdout } = await execFileAsync('git', ['rev-list', '@{u}..HEAD', '--count'], { cwd: worktreePath });
3001
+ const remoteRef = `origin/${workspace.workingBranch}`;
3002
+ const { stdout } = await execFileAsync('git', ['rev-list', `${remoteRef}..HEAD`, '--count'], {
3003
+ cwd: worktreePath,
3004
+ });
2995
3005
  const countStr = stdout.trim();
2996
3006
  const count = parseInt(countStr, 10) || 0;
2997
3007
  if (count > 0) {
@@ -3298,6 +3308,32 @@ app.post('/:id/dismiss-pr-attention', async (c) => {
3298
3308
  return c.json({ error: message }, 500);
3299
3309
  }
3300
3310
  });
3311
+ /**
3312
+ * POST /api/workspaces/:id/restore-pr-attention — undo a dismiss; clears the
3313
+ * dismissed-at column so the changes-requested / CI-failure badge surfaces
3314
+ * again. The inverse of dismiss-pr-attention.
3315
+ */
3316
+ app.post('/:id/restore-pr-attention', async (c) => {
3317
+ try {
3318
+ const id = c.req.param('id');
3319
+ const workspace = workspaceService.getWorkspace(id);
3320
+ if (!workspace) {
3321
+ return c.json({ error: `Workspace '${id}' not found` }, 404);
3322
+ }
3323
+ const body = await c.req.json().catch(() => ({}));
3324
+ const kind = body.kind === 'changes-requested' || body.kind === 'ci-failed' ? body.kind : null;
3325
+ if (!kind) {
3326
+ return c.json({ error: "Field 'kind' must be 'changes-requested' or 'ci-failed'" }, 400);
3327
+ }
3328
+ workspaceService.restorePrAttention(id, kind);
3329
+ wsService.emitEphemeral(id, 'workspace:pr-attention-restored', { kind });
3330
+ return c.json({ success: true });
3331
+ }
3332
+ catch (err) {
3333
+ const message = err instanceof Error ? err.message : String(err);
3334
+ return c.json({ error: message }, 500);
3335
+ }
3336
+ });
3301
3337
  /** POST /api/workspaces/:id/mark-read — mark workspace as read (clear unread indicator). */
3302
3338
  app.post('/:id/mark-read', (c) => {
3303
3339
  try {
@@ -156,6 +156,14 @@ export function mapSdkMessage(msg, state) {
156
156
  events.push({ kind: 'session:compacted' });
157
157
  return events;
158
158
  }
159
+ // Live status message: the SDK announces it is compacting context before the
160
+ // (slow) `compact_boundary` lands. Surface it as a transient indicator so the
161
+ // UI can tell the user "compacting…" instead of looking frozen.
162
+ if (subtype === 'status') {
163
+ const sdkStatus = typeof parsed.status === 'string' ? parsed.status : null;
164
+ events.push({ kind: 'session:compacting', active: sdkStatus === 'compacting' });
165
+ return events;
166
+ }
159
167
  if (subtype === 'task_started' || subtype === 'task_progress' || subtype === 'task_notification') {
160
168
  const toolCallId = typeof parsed.tool_use_id === 'string' ? parsed.tool_use_id : undefined;
161
169
  if (toolCallId) {
@@ -13,10 +13,20 @@ const KOBO_MCP_BRIEF = [
13
13
  '• `kobo__schedule_wakeup` / `kobo__cancel_wakeup` to schedule (or cancel) a follow-up session — prefer these over the built-in `ScheduleWakeup` tool.',
14
14
  'Each tool carries its own "WHEN to use" guidance in its description — follow it.',
15
15
  ].join('\n');
16
+ /**
17
+ * Appended to the Claude Code preset system prompt so the rule is always in
18
+ * context (not just the first turn like KOBO_MCP_BRIEF). Teaches the agent to
19
+ * survive long-running work via `kobo__schedule_wakeup` instead of stalling the
20
+ * session — the recurring "tell it how to stay alive" friction.
21
+ */
22
+ const KOBO_SYSTEM_APPEND = [
23
+ '[Kōbō] Surviving long waits — when a task takes more than ~1-2 min (test suites, CI, builds, deploys, waiting on external state): never block your turn with sleep/poll loops, and never end a turn merely "waiting" on a background job — the Kōbō session goes idle and will NOT resume itself, so the work stalls.',
24
+ 'Instead: launch it in the background (redirect output to a log file), call `kobo__schedule_wakeup` with `delaySeconds` ≈ the expected duration and a `prompt` telling future-you exactly what to check (the log path + next step), then end the turn. On wakeup: inspect the result, call `kobo__cancel_wakeup` if it finished early, and continue. Do this proactively, without being asked.',
25
+ ].join('\n');
16
26
  export function buildClaudeOptions(input) {
17
27
  const options = {
18
28
  cwd: input.workingDir,
19
- systemPrompt: { type: 'preset', preset: 'claude_code' },
29
+ systemPrompt: { type: 'preset', preset: 'claude_code', append: KOBO_SYSTEM_APPEND },
20
30
  // Leave `tools` undefined: the `claude_code` preset EXCLUDES MCP tools, so
21
31
  // under bypassPermissions MCP tools surface as "haven't granted it yet"
22
32
  // even when the user chose bypass. Undefined → full toolbox (built-ins +
@@ -4,6 +4,7 @@ export const ALL_AGENT_EVENT_KINDS = [
4
4
  'session:ended',
5
5
  'session:user-input-requested',
6
6
  'session:compacted',
7
+ 'session:compacting',
7
8
  'session:brainstorm-complete',
8
9
  'message:text',
9
10
  'message:thinking',
@@ -1,4 +1,10 @@
1
- import { emit } from '../websocket-service.js';
1
+ import { emit, emitEphemeral } from '../websocket-service.js';
2
2
  export function routeEvent(workspaceId, agentSessionId, event) {
3
+ // The compaction "in progress" signal is a transient live indicator — deliver
4
+ // it once and never persist/replay it. The persistent trace is `session:compacted`.
5
+ if (event.kind === 'session:compacting') {
6
+ emitEphemeral(workspaceId, 'agent:event', event);
7
+ return;
8
+ }
3
9
  emit(workspaceId, 'agent:event', event, agentSessionId);
4
10
  }
@@ -267,7 +267,8 @@ function spawnNextIteration(workspaceId, opts = {}) {
267
267
  // branches is purely cosmetic.
268
268
  const projectSettings = settingsService.getProjectSettings(row.project_path);
269
269
  const e2eSettings = projectSettings?.e2e ?? { framework: '', skill: '', prompt: '' };
270
- const finalizationSettings = projectSettings?.finalization ?? { prompt: '' };
270
+ // Finalization cascades project || global; E2E stays project-only.
271
+ const finalizationSettings = settingsService.getEffectiveFinalization(row.project_path);
271
272
  let overrideBlock = '';
272
273
  if (task.title.startsWith('[FINAL] ')) {
273
274
  overrideBlock = buildFinalizationIterationBlock(finalizationSettings);
@@ -1,6 +1,7 @@
1
1
  // src/server/services/forge/github/provider.ts
2
2
  import { execFile } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
+ import { deriveReadyToMerge } from '../types.js';
4
5
  const execFileAsync = promisify(execFile);
5
6
  // NOTE: `reviewThreads` is intentionally NOT in this list.
6
7
  // `gh pr view --json reviewThreads` is rejected with `Unknown JSON field`
@@ -54,13 +55,15 @@ function mapGhPrToSnapshot(raw) {
54
55
  rollup = 'SUCCESS';
55
56
  }
56
57
  const unresolvedReviewThreadsCount = (raw.reviewThreads ?? []).reduce((a, t) => a + (t.isResolved ? 0 : 1), 0);
58
+ const state = raw.state;
59
+ const reviewDecision = raw.reviewDecision ?? null;
57
60
  return {
58
61
  number: raw.number,
59
62
  title: raw.title,
60
63
  url: raw.url,
61
- state: raw.state,
64
+ state,
62
65
  base: raw.baseRefName ?? '',
63
- reviewDecision: raw.reviewDecision ?? null,
66
+ reviewDecision,
64
67
  author: { login: raw.author?.login ?? '' },
65
68
  assignees: (raw.assignees ?? []).map((a) => ({ login: a.login })),
66
69
  reviewers,
@@ -68,6 +71,7 @@ function mapGhPrToSnapshot(raw) {
68
71
  ci: { rollup, checks },
69
72
  updatedAt: raw.updatedAt ?? '',
70
73
  unresolvedReviewThreadsCount,
74
+ readyToMerge: deriveReadyToMerge({ state, ci: { rollup, checks }, reviewDecision, reviewers }),
71
75
  };
72
76
  }
73
77
  /** Map an execFile rejection to a ForgeAvailability reason. */
@@ -1,6 +1,7 @@
1
1
  // src/server/services/forge/gitlab/provider.ts
2
2
  import { execFile } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
+ import { deriveReadyToMerge } from '../types.js';
4
5
  const execFileAsync = promisify(execFile);
5
6
  /** Map GitLab MR state to the normalised PrSnapshot state. */
6
7
  function mapState(state) {
@@ -29,6 +30,7 @@ function mapGlabMrToSnapshot(raw) {
29
30
  ci: { rollup: null, checks: [] },
30
31
  updatedAt: raw.updated_at ?? '',
31
32
  unresolvedReviewThreadsCount: 0,
33
+ readyToMerge: false,
32
34
  };
33
35
  }
34
36
  /** Map a GitLab pipeline status string to the normalised CI rollup. */
@@ -147,6 +149,7 @@ export const gitlabProvider = {
147
149
  return null;
148
150
  const snapshot = mapGlabMrToSnapshot(JSON.parse(raw));
149
151
  snapshot.ci = await fetchGlabCi(repoPath, branch);
152
+ snapshot.readyToMerge = deriveReadyToMerge(snapshot);
150
153
  return snapshot;
151
154
  }
152
155
  catch {
@@ -1,4 +1,17 @@
1
1
  // src/server/services/forge/types.ts
2
+ /**
3
+ * True when nothing blocks merging the PR: it is open, CI is not failing or
4
+ * in-flight (green `SUCCESS` or absent `null` — matching GitHub's "Ready to
5
+ * merge"), and no reviewer is actively requesting changes. `null` covers repos
6
+ * or PRs with no CI configured. Pending/failure/cancelled/neutral are NOT ready.
7
+ * Mirrors the front-end blocking rule — trust a reviewer still in
8
+ * CHANGES_REQUESTED, not the sticky `reviewDecision` alone.
9
+ */
10
+ export function deriveReadyToMerge(s) {
11
+ const blocked = s.reviewDecision === 'CHANGES_REQUESTED' && s.reviewers.some((r) => r.state === 'CHANGES_REQUESTED');
12
+ const ciOk = s.ci.rollup === 'SUCCESS' || s.ci.rollup === null;
13
+ return s.state === 'OPEN' && ciOk && !blocked;
14
+ }
2
15
  /** Thrown by write operations when the forge cannot service them. */
3
16
  export class ForgeUnavailableError extends Error {
4
17
  code = 'forge_unavailable';
@@ -223,6 +223,11 @@ export async function checkPrStatuses() {
223
223
  if (prev.ci.rollup !== 'FAILURE' && pr.ci.rollup === 'FAILURE') {
224
224
  markUnread(ws.id);
225
225
  }
226
+ const notBusy = !['extracting', 'brainstorming', 'executing'].includes(ws.status);
227
+ if (notBusy && !prev.readyToMerge && pr.readyToMerge) {
228
+ emitEphemeral(ws.id, 'pr:ready-to-merge', { prNumber: pr.number, prUrl: pr.url });
229
+ markUnread(ws.id);
230
+ }
226
231
  }
227
232
  // Cache the snapshot for the next tick. For non-OPEN PRs (closed /
228
233
  // merged) we preserve the previous `base` if the fresh snapshot is
@@ -618,6 +618,17 @@ const settingsMigrations = [
618
618
  }
619
619
  },
620
620
  },
621
+ {
622
+ version: 38,
623
+ name: 'add-global-finalization-prompt',
624
+ migrate: ({ global }) => {
625
+ // Seed the global default; projects keep their own override (or empty to
626
+ // inherit this global value — cascade handled by getEffectiveFinalization).
627
+ if (typeof global.finalizationPrompt !== 'string') {
628
+ global.finalizationPrompt = DEFAULT_FINALIZATION_PROMPT;
629
+ }
630
+ },
631
+ },
621
632
  ];
622
633
  /** Current settings schema version — always equals the highest migration version. */
623
634
  export const SETTINGS_SCHEMA_VERSION = settingsMigrations.length > 0 ? settingsMigrations[settingsMigrations.length - 1].version : 0;
@@ -650,6 +661,7 @@ function defaultSettings() {
650
661
  prPromptTemplate: DEFAULT_PR_PROMPT_TEMPLATE,
651
662
  reviewPromptTemplate: DEFAULT_REVIEW_PROMPT_TEMPLATE,
652
663
  ciFixPromptTemplate: DEFAULT_CI_FIX_PROMPT_TEMPLATE,
664
+ finalizationPrompt: DEFAULT_FINALIZATION_PROMPT,
653
665
  notionInitialPromptTemplate: DEFAULT_NOTION_INITIAL_PROMPT,
654
666
  sentryInitialPromptTemplate: DEFAULT_SENTRY_INITIAL_PROMPT,
655
667
  gitConventions: DEFAULT_GIT_CONVENTIONS,
@@ -728,7 +740,10 @@ function defaultProjectSettings(projectPath) {
728
740
  prompt: '',
729
741
  },
730
742
  finalization: {
731
- prompt: DEFAULT_FINALIZATION_PROMPT,
743
+ // Empty by default — a project inherits the global finalization prompt
744
+ // (`global.finalizationPrompt`) unless it sets its own override. Cascade
745
+ // resolved by getEffectiveFinalization (project || global).
746
+ prompt: '',
732
747
  },
733
748
  color: null,
734
749
  forge: 'auto',
@@ -912,6 +927,17 @@ export function getProjectSettings(projectPath) {
912
927
  const settings = readSettings();
913
928
  return settings.projects.find((p) => p.path === projectPath) ?? null;
914
929
  }
930
+ /**
931
+ * Effective auto-loop finalization config for a project: the per-project prompt
932
+ * if the user set one, otherwise the global default (`global.finalizationPrompt`).
933
+ * Mirrors the project-||-global cascade used for `ciFixPromptTemplate` etc.
934
+ */
935
+ export function getEffectiveFinalization(projectPath) {
936
+ const settings = readSettings();
937
+ const project = settings.projects.find((p) => p.path === projectPath) ?? null;
938
+ const projectPrompt = project?.finalization?.prompt ?? '';
939
+ return { prompt: projectPrompt.trim() ? projectPrompt : settings.global.finalizationPrompt };
940
+ }
915
941
  /** Compute effective settings for a project (project overrides merged with global defaults). */
916
942
  export function getEffectiveSettings(projectPath) {
917
943
  const settings = readSettings();
@@ -990,6 +1016,7 @@ export function updateGlobalSettings(data) {
990
1016
  'prPromptTemplate',
991
1017
  'reviewPromptTemplate',
992
1018
  'ciFixPromptTemplate',
1019
+ 'finalizationPrompt',
993
1020
  'notionInitialPromptTemplate',
994
1021
  'sentryInitialPromptTemplate',
995
1022
  'gitConventions',
@@ -367,6 +367,21 @@ export function dismissPrAttention(id, kind, prUpdatedAt) {
367
367
  throw new Error(`Workspace '${id}' not found`);
368
368
  }
369
369
  }
370
+ /**
371
+ * Undo a PR-attention dismiss — clears the dismissed-at column so the
372
+ * changes-requested / CI-failure badge surfaces again ("mark as unseen").
373
+ * The inverse of {@link dismissPrAttention}.
374
+ */
375
+ export function restorePrAttention(id, kind) {
376
+ const column = kind === 'changes-requested' ? 'pr_changes_dismissed_at' : 'pr_ci_failure_dismissed_at';
377
+ const db = getDb();
378
+ const result = db
379
+ .prepare(`UPDATE workspaces SET ${column} = NULL, updated_at = ? WHERE id = ?`)
380
+ .run(new Date().toISOString(), id);
381
+ if (result.changes === 0) {
382
+ throw new Error(`Workspace '${id}' not found`);
383
+ }
384
+ }
370
385
  export function markWorktreePurged(id, restoreData) {
371
386
  const db = getDb();
372
387
  const now = new Date().toISOString();
@@ -5,6 +5,18 @@ export const CLAUDE_MODELS = [
5
5
  i18nLabelKey: 'model.auto',
6
6
  i18nDescriptionKey: 'model.autoDescription',
7
7
  },
8
+ {
9
+ id: 'claude-fable-5',
10
+ label: 'Fable 5',
11
+ i18nLabelKey: 'model.fable5',
12
+ i18nDescriptionKey: 'model.fable5Description',
13
+ },
14
+ {
15
+ id: 'claude-mythos-5',
16
+ label: 'Mythos 5 (Glasswing)',
17
+ i18nLabelKey: 'model.mythos5',
18
+ i18nDescriptionKey: 'model.mythos5Description',
19
+ },
8
20
  {
9
21
  id: 'claude-opus-4-8',
10
22
  label: 'Opus 4.8',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loicngr/kobo",
3
- "version": "1.7.30",
3
+ "version": "1.7.32",
4
4
  "description": "Kōbō — multi-workspace agent manager for Claude Code. Orchestrates isolated git worktrees with dev servers, Notion integration, and MCP tools.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-or-later",
@@ -67,28 +67,28 @@
67
67
  "prepublishOnly": "npm run build"
68
68
  },
69
69
  "dependencies": {
70
- "@anthropic-ai/claude-agent-sdk": "^0.2.90",
71
- "@emnapi/core": "^1.10.0",
72
- "@emnapi/runtime": "^1.10.0",
73
- "@hono/node-server": "^2.0.2",
70
+ "@anthropic-ai/claude-agent-sdk": "^0.3.173",
71
+ "@emnapi/core": "^1.11.0",
72
+ "@emnapi/runtime": "^1.11.0",
73
+ "@hono/node-server": "^2.0.4",
74
74
  "@modelcontextprotocol/sdk": "^1.29.0",
75
- "@openai/codex": "^0.130.0",
76
- "better-sqlite3": "^12.9.0",
75
+ "@openai/codex": "^0.139.0",
76
+ "better-sqlite3": "^12.10.0",
77
77
  "cron-parser": "^5.5.0",
78
- "hono": "^4.12.18",
78
+ "hono": "^4.12.25",
79
79
  "nanoid": "^5.1.11",
80
80
  "node-pty": "^1.1.0",
81
- "ws": "^8.20.0"
81
+ "ws": "^8.21.0"
82
82
  },
83
83
  "devDependencies": {
84
84
  "@biomejs/biome": "2.4.10",
85
85
  "@types/better-sqlite3": "^7.6.13",
86
- "@types/node": "^25.6.2",
86
+ "@types/node": "^25.9.3",
87
87
  "@types/ws": "^8.18.1",
88
- "@vitest/runner": "^4.1.5",
89
- "concurrently": "^9.2.1",
90
- "tsx": "^4.21.0",
88
+ "@vitest/runner": "^4.1.8",
89
+ "concurrently": "^10.0.3",
90
+ "tsx": "^4.22.4",
91
91
  "typescript": "^6.0.3",
92
- "vitest": "^4.1.5"
92
+ "vitest": "^4.1.8"
93
93
  }
94
94
  }
@@ -0,0 +1,8 @@
1
+ import{$ as e,B as t,F as n,I as r,R as i,S as a,U as o,W as s,_ as c,at as l,b as u,c as d,ct as f,g as p,h as m,it as h,k as g,m as _,n as v,p as y,s as b,st as x,y as S}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{l as C,t as w}from"./QIcon-C6C3QeM4.js";import{c as T,s as E}from"./notifications-C4MxuXC7.js";import{t as D}from"./QBtn-DwemGTZv.js";import{n as O}from"./vue-i18n-C5Tx4bGk.js";import{_ as k,c as A,m as j,u as ee}from"./index-CNin8jPU.js";import{t as te}from"./QSpinnerDots-atHe_AUn.js";import{t as M}from"./QTooltip-CyRLTG6i.js";import{t as ne}from"./QExpansionItem-C9vmJqEO.js";import{t as re}from"./QScrollArea-B5jf9S4y.js";import{i as ie,n as ae,t as N}from"./render-chat-markdown-BJsZCnSw.js";import{t as P}from"./documents-N8PwB_Gh.js";import{t as F}from"./_plugin-vue_export-helper-BzmG9fMN.js";function oe(e,t,n=!0){let r=[],i=new Map,a=new Map;for(let n=0;n<e.length;n++){let o=e[n],s=t?.[n];switch(o.kind){case`message:text`:{let e=i.get(o.messageId);if(e)e.text+=o.text,e.streaming=o.streaming;else{let e={type:`text`,messageId:o.messageId,text:o.text,streaming:o.streaming,ts:s};i.set(o.messageId,e),r.push(e)}break}case`message:end`:{let e=i.get(o.messageId);e&&(e.streaming=!1);break}case`message:thinking`:r.push({type:`thinking`,messageId:o.messageId,text:o.text,ts:s});break;case`tool:call`:{let e={type:`tool`,toolCallId:o.toolCallId,name:o.name,input:o.input,ts:s};a.set(o.toolCallId,e),r.push(e);break}case`tool:result`:{let e=a.get(o.toolCallId);e&&(e.result={output:o.output,isError:o.isError});break}case`session:started`:r.push({type:`session`,kind:`started`,detail:{engineSessionId:o.engineSessionId,model:o.model},ts:s});break;case`session:ended`:r.push({type:`session`,kind:`ended`,detail:{reason:o.reason,exitCode:o.exitCode},ts:s});break;case`session:compacted`:r.push({type:`session`,kind:`compacted`,ts:s});break;case`session:compacting`:case`session:brainstorm-complete`:case`session:user-input-requested`:case`message:raw`:case`skills:discovered`:case`usage`:case`rate_limit`:case`subagent:progress`:case`error`:break;default:}}let o=null;for(let e of r)e.type===`text`&&e.streaming&&(o&&(o.streaming=!1),o=e);return o&&!n&&(o.streaming=!1),r}function se(e,t){if(t.length===0)return e;let n=t.map(e=>({type:`user`,content:e.content,sender:e.sender,ts:e.ts})),r=[...e,...n];r.sort((e,t)=>{let n=e.ts??``,r=t.ts??``;return n===r?0:n?r?n<r?-1:1:-1:1});let i;for(let e of r)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!i||e.ts>i)&&(i=e.ts);if(i)for(let e of r)e.type===`text`&&e.streaming&&(!e.ts||e.ts<i)&&(e.streaming=!1);return r}var I=new Set([`setup`,`cleanup`,`archive`]);function L(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:I.has(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function ce(e){let t=[],n=null,r=null;for(let i of e){let e=L(i),a=e===`session`||e===`system-prompt`,o=e===`script`&&i.type===`user`?`script:${i.sender}`:e;!n||r!==o||a?(n={speaker:e,ts:i.ts,items:[i]},r=o,t.push(n),a&&(n=null)):n.items.push(i)}return t}var R={class:`text-caption text-grey-6`},z=a({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,n=y(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return`session.ended`;case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(i(),c(`span`,R,f(e.$t(n.value)),1))}});function le(e,t){if(t.length===0||e.length===0)return e;let n=[...t].sort((e,t)=>t.length-e.length),r=new DOMParser().parseFromString(`<div>${e}</div>`,`text/html`),i=r.body.firstChild;if(!i)return e;function a(e){if(e.nodeType===Node.TEXT_NODE){ue(e,n,r);return}if(e.nodeName===`A`)return;let t=Array.from(e.childNodes);for(let e of t)a(e)}return a(i),i.innerHTML}function ue(e,t,n){let r=e.textContent??``;if(!t.some(e=>r.includes(e)))return;let i=n.createDocumentFragment(),a=0;for(;a<r.length;){let e=B(r,a,t);if(!e){i.appendChild(n.createTextNode(r.slice(a)));break}e.index>a&&i.appendChild(n.createTextNode(r.slice(a,e.index)));let o=n.createElement(`a`);o.className=`document-link`,o.setAttribute(`data-document-path`,e.path),o.setAttribute(`href`,`#`),o.textContent=e.path,i.appendChild(o),a=e.index+e.path.length}e.parentNode?.replaceChild(i,e)}function B(e,t,n){let r=null;for(let i of n){let n=e.indexOf(i,t);n<0||(!r||n<r.index||n===r.index&&i.length>r.path.length)&&(r={index:n,path:i})}return r}var V=[`innerHTML`],H=F(a({__name:`TextMessageItem`,props:{item:{}},setup(e){let t=e,n=P(),r=A(),a=y(()=>{let e=r.selectedWorkspaceId;return e?n.documentsFor(e).map(e=>e.path):[]}),o=y(()=>ae(le(ie.parse(t.item.text,{async:!1,breaks:!0,gfm:!0}),a.value),{addAttr:[`data-document-path`]}));function s(e){let t=e.target?.closest(`.document-link`);if(!t)return;e.preventDefault();let i=t.getAttribute(`data-document-path`),a=r.selectedWorkspaceId;!i||!a||n.openDocumentByPath(a,i)}return(t,n)=>(i(),c(`div`,{class:`markdown-message`,onClick:s},[_(`div`,{innerHTML:o.value},null,8,V),e.item.streaming?(i(),m(C,{key:0,size:`xs`,class:`q-ml-xs`})):p(``,!0)]))}}),[[`__scopeId`,`data-v-1b7bd8ca`]]),de={key:0,class:`text-caption text-grey-5`,style:{"font-style":`italic`}},U=[`innerHTML`],W={key:1,style:{"white-space":`pre-wrap`}},G=F(a({__name:`ThinkingItem`,props:{item:{}},setup(e){let t=e,n=y(()=>t.item.text.trim().slice(0,100)),r=y(()=>t.item.text.trim().length>0),a=y(()=>t.item.text.trim().length>100),o=y(()=>N(t.item.text));return(t,l)=>r.value?(i(),c(`div`,de,[a.value?(i(),m(ne,{key:0,dense:``,"dense-toggle":``,label:n.value,"header-class":`text-grey-5 text-caption`,style:{"font-style":`italic`}},{default:s(()=>[_(`div`,{class:`q-py-xs markdown-thinking`,innerHTML:o.value},null,8,U)]),_:1},8,[`label`])):(i(),c(`span`,W,f(e.item.text),1))])):p(``,!0)}}),[[`__scopeId`,`data-v-7f45ed94`]]);function K(e,t){let n=e.split(`
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 fe(e){let t=e.split(`
4
+ `),n=[];for(let e of t)e.startsWith(`@@`)||e.startsWith(`+++`)||e.startsWith(`---`)||(e.startsWith(`+`)?n.push({type:`add`,content:e.slice(1)}):e.startsWith(`-`)?n.push({type:`del`,content:e.slice(1)}):e.startsWith(` `)?n.push({type:`context`,content:e.slice(1)}):e.length>0&&n.push({type:`context`,content:e}));return n}function pe(e,t){if(!t||typeof t!=`object`)return null;let n=t;if(e===`Edit`){let e=n.file_path;if(!e)return null;let t=n.old_string??``,r=n.new_string??``,i=typeof n.diff==`string`?n.diff:``;if(!t&&!r&&i.length>0){let t=fe(i);return{toolName:`Edit`,filePath:e,additions:t.filter(e=>e.type===`add`).length,deletions:t.filter(e=>e.type===`del`).length,diffLines:t}}return{toolName:`Edit`,filePath:e,oldString:t,newString:r,replaceAll:n.replace_all??!1,additions:r?r.split(`
5
+ `).length:0,deletions:t?t.split(`
6
+ `).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(`
7
+ `).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 q(e,t){if(!e||!t?.projectPath)return e;let n=t.worktreePath;if(n){let t=J(e,n);if(t!==e)return t}let r=J(e,`${t.projectPath}/${T}/${t.workingBranch}`);return r===e?J(e,t.projectPath):r}function J(e,t){if(!t)return e;let n=me(t);return n?e.replace(RegExp(`${n}[\\\\/]+`,`g`),``).replace(RegExp(`${n}(?=\\s|$|["'\`])`,`g`),`.`):e}function me(e){let t=e.replace(/[\\/]+$/,``);return t?`${/^[\\/]+/.test(t)?`[\\\\/]+`:``}${t.split(/[\\/]+/).filter(Boolean).map(he).join(`[\\\\/]+`)}`:``}function he(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}var ge={class:`tool-name`},Y=[`title`],X={key:0,class:`tool-stat-add`},_e={key:1,class:`tool-stat-del`},ve={class:`diff-sign`},Z={class:`tool-name`},Q=[`title`],$=F(a({__name:`ToolCallItem`,props:{item:{}},setup(n){let r=n,a=e(!1),s=A(),h=y(()=>pe(r.item.name,r.item.input)),g=y(()=>h.value?q(h.value.filePath,s.selectedWorkspace):``),v={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`,TaskCreate:`add_task`,TaskUpdate:`checklist`,TaskGet:`checklist`,TaskList:`checklist`,ToolSearch:`search`,WebFetch:`public`,WebSearch:`travel_explore`,NotebookRead:`book`,NotebookEdit:`edit_note`,SendMessage:`send`,ExitPlanMode:`check_circle_outline`,KillShell:`stop_circle`,BashOutput:`terminal`},x=y(()=>v[r.item.name]??`build`),C=y(()=>{if(h.value)return``;let e=r.item.input,t=T(e);return t?q(t,s.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=y(()=>{let e=h.value;return e?e.diffLines?e.diffLines:e.toolName===`Edit`&&e.oldString!==void 0&&e.newString!==void 0?K(e.oldString,e.newString):e.toolName===`Write`&&e.content!==void 0?e.content.split(`
8
+ `).map(e=>({type:`add`,content:e})):e.toolName===`Bash:rm`?[{type:`del`,content:`File deleted`}]:null:null}),D=y(()=>{let e=r.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`]),k=y(()=>!!(r.item.result&&D.value)&&(!O.has(r.item.name)||r.item.result?.isError===!0));function j(){a.value=!a.value}return o(()=>r.item.result?.isError===!0,e=>{e&&(a.value=!0)},{immediate:!0}),(e,r)=>h.value?(i(),c(`div`,{key:0,class:l([`tool-row`,{"tool-row-expanded":a.value}])},[_(`div`,{class:`tool-header`,onClick:j},[u(w,{name:x.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),_(`span`,ge,f(h.value.toolName===`Bash:rm`?`Bash`:h.value.toolName),1),_(`span`,{class:`tool-path`,title:h.value.filePath},f(g.value),9,Y),h.value.additions>0?(i(),c(`span`,X,`+`+f(h.value.additions),1)):p(``,!0),h.value.deletions>0?(i(),c(`span`,_e,`-`+f(h.value.deletions),1)):p(``,!0),n.item.result?.isError?(i(),m(w,{key:2,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-xs`})):n.item.result?(i(),m(w,{key:3,name:`check`,color:`positive`,size:`xs`,class:`q-ml-xs`})):p(``,!0),u(w,{name:a.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-auto text-grey-6`},null,8,[`name`])]),a.value&&E.value?(i(),c(`div`,{key:0,class:`tool-diff`,onClick:r[0]||=b(()=>{},[`stop`])},[(i(!0),c(d,null,t(E.value,(e,t)=>(i(),c(`div`,{key:t,class:l([`diff-line`,{"diff-del":e.type===`del`,"diff-add":e.type===`add`,"diff-context":e.type===`context`}])},[_(`span`,ve,f(e.type===`del`?`-`:e.type===`add`?`+`:` `),1),S(f(e.content),1)],2))),128))])):p(``,!0)],2)):(i(),c(`div`,{key:1,class:l([`tool-row tool-row-generic`,{"tool-row-expanded":a.value,"tool-row--toggleable":k.value}])},[_(`div`,{class:`tool-header`,onClick:r[1]||=e=>k.value&&j()},[u(w,{name:x.value,size:`14px`,class:`tool-icon`},null,8,[`name`]),_(`span`,Z,f(n.item.name),1),C.value?(i(),c(`span`,{key:0,class:`tool-arg`,title:T(n.item.input)||C.value},f(C.value),9,Q)):p(``,!0),n.item.result?.isError?(i(),m(w,{key:1,name:`error_outline`,color:`negative`,size:`xs`,class:`q-ml-auto`})):n.item.result?(i(),m(w,{key:2,name:`check`,color:`positive`,size:`xs`,class:`q-ml-auto`})):p(``,!0),k.value?(i(),m(w,{key:3,name:a.value?`expand_less`:`expand_more`,size:`xs`,class:`q-ml-xs text-grey-6`},null,8,[`name`])):p(``,!0)]),a.value&&k.value?(i(),c(`div`,{key:0,class:`tool-output`,onClick:r[2]||=b(()=>{},[`stop`])},f(D.value),1)):p(``,!0)],2))}}),[[`__scopeId`,`data-v-e7bdb021`]]);function ye(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 be=[`innerHTML`],xe=[`innerHTML`],Se=[`src`],Ce=F(a({__name:`UserMessageItem`,props:{item:{}},setup(t){let n=t,r=A(),a=y(()=>n.item.sender===`system-prompt`),o=y(()=>N(ye(n.item.content,r.selectedWorkspaceId??``))),l=e(null),f=e(!1);function h(e){let t=e.target;if(t?.tagName!==`IMG`)return;let n=t;n.src&&(l.value=n.src,f.value=!0)}return(e,t)=>(i(),c(d,null,[a.value?(i(),m(ne,{key:0,dense:``,"dense-toggle":``,label:e.$t(`chat.systemPrompt`),"header-class":`text-grey-5 text-caption`},{default:s(()=>[_(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:o.value},null,8,be)]),_:1},8,[`label`])):(i(),c(`div`,{key:1,class:`markdown-message`,onClick:h},[_(`div`,{innerHTML:o.value},null,8,xe)])),u(k,{modelValue:f.value,"onUpdate:modelValue":t[1]||=e=>f.value=e},{default:s(()=>[l.value?(i(),c(`img`,{key:0,src:l.value,alt:``,class:`image-lightbox-img`,onClick:t[0]||=e=>f.value=!1},null,8,Se)):p(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-f34be4c5`]]),we={class:`turn-header`},Te={key:0,class:`turn-time`},Ee={class:`turn-time turn-time-updated`},De={key:2,class:`turn-actions`},Oe={class:`turn-body`},ke={key:0,class:`turn-scroll-top`},Ae=F(a({__name:`TurnCard`,props:{turn:{}},emits:[`scrollTo`],setup(n,{emit:r}){let a=n,o=r,{t:g}=O(),v=e(null);function b(){let e=v.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;o(`scrollTo`,Math.max(0,n-8))}let C=y(()=>{switch(a.turn.speaker){case`user`:return{label:g(`chat.you`),accent:`#ce93d8`,badgeClass:`turn-badge-user`};case`agent`:return{label:g(`chat.agent`),accent:`#7986cb`,badgeClass:`turn-badge-agent`};case`system-prompt`:return{label:g(`chat.systemPrompt`),accent:`#757575`,badgeClass:`turn-badge-system`};case`session`:return{label:g(`chat.session`),accent:`#616161`,badgeClass:`turn-badge-session`};case`script`:{let e=a.turn.items[0],t=e?.type===`user`?e.sender:``;return{label:g(t===`archive`?`chat.archiveScript`:t===`setup`?`chat.setupScript`:`chat.cleanupScript`),accent:`#4db6ac`,badgeClass:`turn-badge-script`}}}});function T(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 E=y(()=>T(a.turn.ts)),k=y(()=>{let e=a.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=y(()=>{let e=a.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?``:T(t,r-n<6e4)}),j=y(()=>A.value!==``),ee=y(()=>a.turn.items.filter(e=>e.type===`tool`).length);return(e,r)=>(i(),c(`div`,{ref_key:`cardEl`,ref:v,class:l([`turn-card`,{"turn-card--user":n.turn.speaker===`user`}]),style:x({"--turn-accent":C.value.accent})},[_(`div`,we,[_(`span`,{class:l([`turn-badge`,C.value.badgeClass])},f(C.value.label),3),E.value?(i(),c(`span`,Te,f(E.value),1)):p(``,!0),j.value?(i(),c(d,{key:1},[u(w,{name:`arrow_forward`,size:`10px`,color:`grey-7`,class:`turn-time-arrow`}),_(`span`,Ee,[S(f(A.value)+` `,1),u(M,null,{default:s(()=>[S(f(h(g)(`chat.lastUpdatedAt`,{time:A.value})),1)]),_:1})])],64)):p(``,!0),ee.value>0?(i(),c(`span`,De,` · `+f(h(g)(`chat.nActions`,{n:ee.value})),1)):p(``,!0)]),_(`div`,Oe,[(i(!0),c(d,null,t(n.turn.items,(e,t)=>(i(),c(d,{key:t},[e.type===`text`?(i(),m(H,{key:0,item:e},null,8,[`item`])):e.type===`thinking`?(i(),m(G,{key:1,item:e},null,8,[`item`])):e.type===`tool`?(i(),m($,{key:2,item:e},null,8,[`item`])):e.type===`user`?(i(),m(Ce,{key:3,item:e},null,8,[`item`])):e.type===`session`?(i(),m(z,{key:4,item:e},null,8,[`item`])):p(``,!0)],64))),128))]),n.turn.items.length>4?(i(),c(`div`,ke,[u(D,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`grey-6`,class:`turn-scroll-top-btn`,onClick:b},{default:s(()=>[u(M,null,{default:s(()=>[S(f(h(g)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):p(``,!0)],6))}}),[[`__scopeId`,`data-v-ce5d132b`]]),je={key:0,class:`activity-feed-switching`},Me={key:1,class:`activity-feed-wrap`},Ne={key:0,class:`activity-feed-compacting`},Pe={class:`text-caption text-grey-4`},Fe={key:0,class:`text-center q-py-sm text-caption text-grey-6`},Ie={class:`q-pa-md`},Le={key:1,class:`q-px-md q-pb-md`},Re={class:`activity-feed-nav-cluster`},ze=60,Be=200,Ve=200,He=400,Ue=200,We=180,Ge=F(a({__name:`ActivityFeed`,props:{workspaceId:{}},setup(a){let l=a,h=j(),b=E(),x=A(),w=y(()=>h.isCompacting(l.workspaceId)),T=y(()=>x.selectedSessionId),O=y(()=>x.sessions.find(e=>e.id===T.value)?.engineSessionId??null),k=y(()=>{let e=x.sessions;return e.length===0?!1:T.value===e[e.length-1].id});function M(e){return T.value?e?e===T.value||e===O.value:k.value:!0}let ie=y(()=>(x.activityFeeds[l.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&M(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,ts:e.timestamp,sessionId:e.sessionId}))),ae=y(()=>ee(x.workspaces.find(e=>e.id===l.workspaceId)?.status)),N=y(()=>{let e=h.eventsFor(l.workspaceId),t=h.timestampsFor(l.workspaceId),n=h.sessionIdsFor(l.workspaceId),r=[],i=[];for(let a=0;a<e.length;a++)M(n[a])&&(r.push(e[a]),i.push(t[a]));let a=se(oe(r,i,ae.value),ie.value);return ce(b.showVerboseSystemMessages?a:a.filter(e=>e.type!==`session`))}),P=y(()=>b.showVerboseSystemMessages?h.eventsFor(l.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),F=e(null),I=e(!0),L=e(!1),R=!1,z=e(!0),le=e(new Map);function ue(e){I.value=e.verticalSize-e.verticalPosition-e.verticalContainerSize<=ze,R&&e.verticalPosition<=Be&&!L.value&&V()&&U()}function B(e,t){return`${e}:${t}`}function V(){let e=T.value;return e?le.value.get(B(l.workspaceId,e))??!0:h.hasMoreOlderFor(l.workspaceId)}function H(e,t,n){le.value.set(B(e,t),n)}function de(e){if(!T.value)return h.oldestIdFor(e);let t=h.eventIdsFor(e),n=h.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!M(n[e]))continue;let r=t[e];if(r)return r}}async function U(){let e=l.workspaceId,t=T.value,n=de(e);if(!n)return;L.value=!0;let r=Date.now();try{let r=F.value;await g();let i=r?.getScroll().verticalSize??0,a=r?.getScroll().verticalPosition??0,o=new URLSearchParams({before:n,limit:`200`});t&&o.set(`session`,t);let s=fetch(`/api/workspaces/${e}/events?${o.toString()}`),c=new Promise(e=>setTimeout(e,Ve)),[l]=await Promise.all([s,c]);if(!l.ok){t?H(e,t,!1):h.prepend(e,[],[],{oldestId:n,hasMoreOlder:!1});return}let u=await l.json(),d=u.events??[],f=d.filter(t=>t.type===`agent:event`&&t.workspaceId===e),p=d.filter(t=>t.type===`user:message`&&t.workspaceId===e),m=f.map(e=>e.payload),_=f.map(e=>e.createdAt),v=f.map(e=>e.sessionId??null),y=f.map(e=>e.id),b=d.length>0?d[0].id:n;t&&H(e,t,u.hasMore),h.prepend(e,m,_,{oldestId:b,hasMoreOlder:t?h.hasMoreOlderFor(e):u.hasMore,sessionIds:v,eventIds:y});for(let t of p){let n=t.payload;typeof n.content==`string`&&x.addActivityItem(e,{id:t.id,type:`text`,content:n.content,timestamp:t.createdAt,sessionId:t.sessionId??void 0,meta:{sender:n.sender??`user`}})}if(await g(),r){let e=r.getScroll().verticalSize-i;if(e>0){let t=Math.max(a+e,Be+50);r.setScrollPosition(`vertical`,t,0)}}}catch(e){console.error(`[ActivityFeed] failed to load older events:`,e)}finally{let e=Date.now()-r,t=Math.max(0,Ve-e);await new Promise(e=>setTimeout(e,t+He)),L.value=!1}}async function W(e=0){await g();let t=F.value;if(!t)return;let n=t.getScroll();t.setScrollPosition(`vertical`,n.verticalSize,e)}let G=null,K=0;function fe(){if(G!=null)return;let e=performance.now()-K<We;G=requestAnimationFrame(()=>{G=null,K=performance.now(),W(e?0:180)})}function pe(e){let t=F.value;t&&t.setScrollPosition(`vertical`,Math.max(0,e),250)}let q=e([]),J=e(null);function me(){let e=N.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 he(){let e=F.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 me()){let t=e.getBoundingClientRect().top-r;if(t<n-40)i=t;else break}return i}async function ge(){let e=F.value;if(!e)return;let t=he();if(t===null)for(let e=0;e<15&&V();e++){for(;L.value;)await new Promise(e=>setTimeout(e,50));if(await U(),await g(),t=he(),t!==null)break}t!==null&&e.setScrollPosition(`vertical`,Math.max(0,t-12),250)}async function Y(){R=!1,await g(),await W(0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{R=!0})})}let X=y(()=>{let e=h.sessionIdsFor(l.workspaceId);if(!T.value)return e.length;let t=0;for(let n of e)M(n)&&t++;return t}),_e=y(()=>h.eventsFor(l.workspaceId).length);async function ve(){z.value=!0;let e=Date.now();await new Promise(e=>setTimeout(e,Ue));let t=e+5e3;for(;_e.value===0&&Date.now()<t;)await new Promise(e=>setTimeout(e,50));z.value=!1}o(z,async e=>{!e&&X.value>0&&await Y(),!e&&X.value===0&&T.value&&$()}),n(()=>{ve(),X.value>0&&Y(),T.value&&$()});let Z=!1;o(X,async(e,t)=>{if(!Z&&e>0){Z=!0,await Y();return}e>t&&I.value&&!L.value&&fe()}),r(()=>{G!=null&&(cancelAnimationFrame(G),G=null)}),o(()=>l.workspaceId,()=>{I.value=!0,Z=!1,R=!1,ve(),X.value>0&&Y()}),o(()=>x.selectedSessionId,async()=>{I.value=!0,R=!1,await Y(),$()});let Q=new Set;async function $(){let e=T.value;if(!e||X.value>0)return;let t=B(l.workspaceId,e);if(!Q.has(t)){Q.add(t);try{let t=await fetch(`/api/workspaces/${l.workspaceId}/events?session=${encodeURIComponent(e)}&limit=500`);if(!t.ok)return;let n=await t.json(),r=n.events??[];if(r.length===0)return;let i=r.filter(e=>e.type===`agent:event`&&e.workspaceId===l.workspaceId),a=r.filter(e=>e.type===`user:message`&&e.workspaceId===l.workspaceId),o=i.map(e=>e.payload),s=i.map(e=>e.createdAt),c=i.map(e=>e.sessionId??null),u=i.map(e=>e.id);H(l.workspaceId,e,n.hasMore),o.length>0&&h.prepend(l.workspaceId,o,s,{oldestId:r[0].id,hasMoreOlder:h.hasMoreOlderFor(l.workspaceId),sessionIds:c,eventIds:u});for(let e of a){let t=e.payload;typeof t.content==`string`&&x.addActivityItem(l.workspaceId,{id:e.id,type:`text`,content:t.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:t.sender??`user`}})}await g(),await W(0)}catch(e){console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),Q.delete(t)}}}o(y(()=>ie.value.filter(e=>e.sender!==`system-prompt`).length),async(e,t)=>{e>t&&(I.value=!0,await W(180))});async function ye(){I.value=!0,await W(250)}return(e,n)=>z.value?(i(),c(`div`,je,[u(te,{size:`40px`,color:`indigo-4`})])):(i(),c(`div`,Me,[u(v,{name:`fade`},{default:s(()=>[w.value?(i(),c(`div`,Ne,[u(te,{size:`18px`,color:`indigo-4`}),_(`span`,Pe,f(e.$t(`activity.compacting`)),1)])):p(``,!0)]),_:1}),u(re,{ref_key:`scrollRef`,ref:F,class:`activity-feed-scroll`,onScroll:ue},{default:s(()=>[_(`div`,{ref_key:`contentOriginRef`,ref:J,class:`content-origin-marker`},null,512),L.value?(i(),c(`div`,Fe,[u(C,{size:`sm`}),S(` `+f(e.$t(`activity.loading_older`)),1)])):p(``,!0),_(`div`,Ie,[(i(!0),c(d,null,t(N.value,(e,t)=>(i(),m(Ae,{key:t,ref_for:!0,ref_key:`turnRefs`,ref:q,turn:e,onScrollTo:pe},null,8,[`turn`]))),128))]),P.value.length?(i(),c(`div`,Le,[u(ne,{label:e.$t(`activity.raw_lines`,{n:P.value.length}),dense:``},{default:s(()=>[(i(!0),c(d,null,t(P.value,(e,t)=>(i(),c(`div`,{key:t,class:`text-caption text-grey q-pa-xs`},f(e),1))),128))]),_:1},8,[`label`])])):p(``,!0)]),_:1},512),_(`div`,Re,[I.value?p(``,!0):(i(),m(D,{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:ye},null,8,[`title`])),u(D,{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:ge},null,8,[`title`])])]))}}),[[`__scopeId`,`data-v-d16ab9e7`]]);export{Ge as default};
@@ -1 +1 @@
1
- .markdown-message[data-v-1b7bd8ca]{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-1b7bd8ca] *{max-width:100%}.markdown-message[data-v-1b7bd8ca] p{margin:0 0 .5em}.markdown-message[data-v-1b7bd8ca] p:last-child{margin-bottom:0}.markdown-message[data-v-1b7bd8ca] pre{background:#00000059;border-radius:4px;margin:.5em 0;padding:.5em .75em;overflow-x:auto}.markdown-message[data-v-1b7bd8ca] code{word-break:break-all;background:#0000004d;border-radius:3px;padding:.1em .3em;font-size:.9em}.markdown-message[data-v-1b7bd8ca] pre code{background:0 0;padding:0}.markdown-message[data-v-1b7bd8ca] ul,.markdown-message[data-v-1b7bd8ca] ol{margin:.25em 0 .5em;padding-left:1.5em}.markdown-message[data-v-1b7bd8ca] li{margin:.15em 0}.markdown-message[data-v-1b7bd8ca] a{color:#7986cb;text-decoration:underline}.markdown-message[data-v-1b7bd8ca] .document-link{color:#9fa8da;cursor:pointer;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-message[data-v-1b7bd8ca] .document-link:hover{color:#c5cae9;-webkit-text-decoration:underline;text-decoration:underline}.markdown-message[data-v-1b7bd8ca] h1,.markdown-message[data-v-1b7bd8ca] h2,.markdown-message[data-v-1b7bd8ca] h3,.markdown-message[data-v-1b7bd8ca] h4,.markdown-message[data-v-1b7bd8ca] h5,.markdown-message[data-v-1b7bd8ca] h6{margin:.5em 0 .3em;font-weight:600;line-height:1.3}.markdown-message[data-v-1b7bd8ca] h1{font-size:1.25em}.markdown-message[data-v-1b7bd8ca] h2{font-size:1.15em}.markdown-message[data-v-1b7bd8ca] h3{font-size:1.08em}.markdown-message[data-v-1b7bd8ca] h4,.markdown-message[data-v-1b7bd8ca] h5,.markdown-message[data-v-1b7bd8ca] h6{font-size:1em}.markdown-message[data-v-1b7bd8ca] blockquote{color:#ffffffb3;border-left:3px solid #fff3;margin:.5em 0;padding-left:.75em}.markdown-message[data-v-1b7bd8ca] table{border-collapse:collapse;margin:.5em 0}.markdown-message[data-v-1b7bd8ca] th,.markdown-message[data-v-1b7bd8ca] td{border:1px solid #ffffff26;padding:.25em .5em}.markdown-thinking[data-v-7f45ed94] p{margin:0 0 .4em}.markdown-thinking[data-v-7f45ed94] p:last-child{margin-bottom:0}.markdown-thinking[data-v-7f45ed94] code{background:#ffffff14;border-radius:3px;padding:.1em .3em}.tool-row[data-v-1702f1be]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-1702f1be]{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-1702f1be],.tool-row--toggleable .tool-header[data-v-1702f1be]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-1702f1be]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-1702f1be]:hover,.tool-row--toggleable .tool-header[data-v-1702f1be]:hover{background:#ffffff08}.tool-icon[data-v-1702f1be]{color:#9fbce0;flex-shrink:0}.tool-name[data-v-1702f1be]{color:#d0d0d0;flex-shrink:0;font-weight:600}.tool-arg[data-v-1702f1be],.tool-path[data-v-1702f1be]{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-1702f1be],.tool-arg[data-v-1702f1be]{flex:1}.tool-stat-add[data-v-1702f1be]{color:#66bb6a;flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-1702f1be]{color:#ef5350;flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-1702f1be]{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-1702f1be]{white-space:pre;color:#bbb;padding:0 12px}.diff-sign[data-v-1702f1be]{color:#555;-webkit-user-select:none;user-select:none;width:14px;display:inline-block}.diff-add[data-v-1702f1be]{color:#c8e6c9;background:#66bb6a1a}.diff-add .diff-sign[data-v-1702f1be]{color:#66bb6a}.diff-del[data-v-1702f1be]{color:#ffcdd2;background:#ef53501a}.diff-del .diff-sign[data-v-1702f1be]{color:#ef5350}.tool-output[data-v-1702f1be]{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-f34be4c5]{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-f34be4c5] *{max-width:100%}.markdown-message[data-v-f34be4c5] 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-f34be4c5] code{word-break:break-all}.markdown-message[data-v-f34be4c5] p{margin:0 0 .4em}.markdown-message[data-v-f34be4c5] p:last-child{margin-bottom:0}.markdown-message[data-v-f34be4c5] code{background:#00000040;border-radius:3px;padding:.1em .3em}.markdown-message[data-v-f34be4c5] h1,.markdown-message[data-v-f34be4c5] h2,.markdown-message[data-v-f34be4c5] h3,.markdown-message[data-v-f34be4c5] h4,.markdown-message[data-v-f34be4c5] h5,.markdown-message[data-v-f34be4c5] h6{margin:.4em 0 .25em;font-weight:600;line-height:1.3}.markdown-message[data-v-f34be4c5] h1{font-size:1.25em}.markdown-message[data-v-f34be4c5] h2{font-size:1.15em}.markdown-message[data-v-f34be4c5] h3{font-size:1.08em}.markdown-message[data-v-f34be4c5] h4,.markdown-message[data-v-f34be4c5] h5,.markdown-message[data-v-f34be4c5] h6{font-size:1em}.markdown-user-prompt[data-v-f34be4c5]{color:#aaa;font-size:12px;font-style:italic}.markdown-user-prompt[data-v-f34be4c5] p{margin:0 0 .4em}.markdown-user-prompt[data-v-f34be4c5] 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-ce5d132b]{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-ce5d132b]{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-ce5d132b]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-ce5d132b]{color:#ce93d8;background:#ce93d826}.turn-badge-agent[data-v-ce5d132b]{color:#7986cb;background:#7986cb26}.turn-badge-system[data-v-ce5d132b]{color:#bdbdbd;background:#75757533;font-style:italic}.turn-badge-session[data-v-ce5d132b]{color:#9e9e9e;background:#61616133}.turn-badge-script[data-v-ce5d132b]{color:#4db6ac;background:#4db6ac26}.turn-time[data-v-ce5d132b]{color:#666;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px}.turn-time-arrow[data-v-ce5d132b]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-ce5d132b]{color:#8891a3}.turn-actions[data-v-ce5d132b]{color:#777;font-size:11px}.turn-body[data-v-ce5d132b]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-ce5d132b]>*{min-width:0;max-width:100%}.turn-body[data-v-ce5d132b] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-ce5d132b]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-ce5d132b]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-ce5d132b]:hover{opacity:1}.activity-feed-wrap[data-v-c133a623]{width:100%;height:100%;position:relative}.activity-feed-scroll[data-v-c133a623]{width:100%;height:100%}.activity-feed-nav-cluster[data-v-c133a623]{z-index:2;align-items:center;gap:8px;display:flex;position:absolute;bottom:14px;right:14px}.activity-feed-nav-btn[data-v-c133a623]{opacity:.8;transition:opacity .12s}.activity-feed-nav-btn[data-v-c133a623]:hover{opacity:1}.content-origin-marker[data-v-c133a623]{pointer-events:none;width:0;height:0;margin:0;padding:0}.activity-feed-scroll[data-v-c133a623] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-c133a623]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}
1
+ .markdown-message[data-v-1b7bd8ca]{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-1b7bd8ca] *{max-width:100%}.markdown-message[data-v-1b7bd8ca] p{margin:0 0 .5em}.markdown-message[data-v-1b7bd8ca] p:last-child{margin-bottom:0}.markdown-message[data-v-1b7bd8ca] pre{background:#00000059;border-radius:4px;margin:.5em 0;padding:.5em .75em;overflow-x:auto}.markdown-message[data-v-1b7bd8ca] code{word-break:break-all;background:#0000004d;border-radius:3px;padding:.1em .3em;font-size:.9em}.markdown-message[data-v-1b7bd8ca] pre code{background:0 0;padding:0}.markdown-message[data-v-1b7bd8ca] ul,.markdown-message[data-v-1b7bd8ca] ol{margin:.25em 0 .5em;padding-left:1.5em}.markdown-message[data-v-1b7bd8ca] li{margin:.15em 0}.markdown-message[data-v-1b7bd8ca] a{color:#7986cb;text-decoration:underline}.markdown-message[data-v-1b7bd8ca] .document-link{color:#9fa8da;cursor:pointer;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-message[data-v-1b7bd8ca] .document-link:hover{color:#c5cae9;-webkit-text-decoration:underline;text-decoration:underline}.markdown-message[data-v-1b7bd8ca] h1,.markdown-message[data-v-1b7bd8ca] h2,.markdown-message[data-v-1b7bd8ca] h3,.markdown-message[data-v-1b7bd8ca] h4,.markdown-message[data-v-1b7bd8ca] h5,.markdown-message[data-v-1b7bd8ca] h6{margin:.5em 0 .3em;font-weight:600;line-height:1.3}.markdown-message[data-v-1b7bd8ca] h1{font-size:1.25em}.markdown-message[data-v-1b7bd8ca] h2{font-size:1.15em}.markdown-message[data-v-1b7bd8ca] h3{font-size:1.08em}.markdown-message[data-v-1b7bd8ca] h4,.markdown-message[data-v-1b7bd8ca] h5,.markdown-message[data-v-1b7bd8ca] h6{font-size:1em}.markdown-message[data-v-1b7bd8ca] blockquote{color:#ffffffb3;border-left:3px solid #fff3;margin:.5em 0;padding-left:.75em}.markdown-message[data-v-1b7bd8ca] table{border-collapse:collapse;margin:.5em 0}.markdown-message[data-v-1b7bd8ca] th,.markdown-message[data-v-1b7bd8ca] td{border:1px solid #ffffff26;padding:.25em .5em}.markdown-thinking[data-v-7f45ed94] p{margin:0 0 .4em}.markdown-thinking[data-v-7f45ed94] p:last-child{margin-bottom:0}.markdown-thinking[data-v-7f45ed94] code{background:#ffffff14;border-radius:3px;padding:.1em .3em}.tool-row[data-v-e7bdb021]{border-radius:4px;margin:0;font-size:12px}.tool-header[data-v-e7bdb021]{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-e7bdb021],.tool-row--toggleable .tool-header[data-v-e7bdb021]{cursor:pointer}.tool-row:has(.tool-diff) .tool-header[data-v-e7bdb021]{cursor:pointer}.tool-row:not(.tool-row-generic) .tool-header[data-v-e7bdb021]:hover,.tool-row--toggleable .tool-header[data-v-e7bdb021]:hover{background:#ffffff08}.tool-icon[data-v-e7bdb021]{color:#9fbce0;flex-shrink:0}.tool-name[data-v-e7bdb021]{color:#d0d0d0;flex-shrink:0;font-weight:600}.tool-arg[data-v-e7bdb021],.tool-path[data-v-e7bdb021]{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-e7bdb021],.tool-arg[data-v-e7bdb021]{flex:1}.tool-stat-add[data-v-e7bdb021]{color:#66bb6a;flex-shrink:0;font-size:11px;font-weight:600}.tool-stat-del[data-v-e7bdb021]{color:#ef5350;flex-shrink:0;font-size:11px;font-weight:600}.tool-diff[data-v-e7bdb021]{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-e7bdb021]{white-space:pre;color:#bbb;padding:0 12px}.diff-sign[data-v-e7bdb021]{color:#555;-webkit-user-select:none;user-select:none;width:14px;display:inline-block}.diff-add[data-v-e7bdb021]{color:#c8e6c9;background:#66bb6a1a}.diff-add .diff-sign[data-v-e7bdb021]{color:#66bb6a}.diff-del[data-v-e7bdb021]{color:#ffcdd2;background:#ef53501a}.diff-del .diff-sign[data-v-e7bdb021]{color:#ef5350}.tool-output[data-v-e7bdb021]{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-f34be4c5]{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-f34be4c5] *{max-width:100%}.markdown-message[data-v-f34be4c5] 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-f34be4c5] code{word-break:break-all}.markdown-message[data-v-f34be4c5] p{margin:0 0 .4em}.markdown-message[data-v-f34be4c5] p:last-child{margin-bottom:0}.markdown-message[data-v-f34be4c5] code{background:#00000040;border-radius:3px;padding:.1em .3em}.markdown-message[data-v-f34be4c5] h1,.markdown-message[data-v-f34be4c5] h2,.markdown-message[data-v-f34be4c5] h3,.markdown-message[data-v-f34be4c5] h4,.markdown-message[data-v-f34be4c5] h5,.markdown-message[data-v-f34be4c5] h6{margin:.4em 0 .25em;font-weight:600;line-height:1.3}.markdown-message[data-v-f34be4c5] h1{font-size:1.25em}.markdown-message[data-v-f34be4c5] h2{font-size:1.15em}.markdown-message[data-v-f34be4c5] h3{font-size:1.08em}.markdown-message[data-v-f34be4c5] h4,.markdown-message[data-v-f34be4c5] h5,.markdown-message[data-v-f34be4c5] h6{font-size:1em}.markdown-user-prompt[data-v-f34be4c5]{color:#aaa;font-size:12px;font-style:italic}.markdown-user-prompt[data-v-f34be4c5] p{margin:0 0 .4em}.markdown-user-prompt[data-v-f34be4c5] 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-ce5d132b]{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-ce5d132b]{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-ce5d132b]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-ce5d132b]{color:#ce93d8;background:#ce93d826}.turn-badge-agent[data-v-ce5d132b]{color:#7986cb;background:#7986cb26}.turn-badge-system[data-v-ce5d132b]{color:#bdbdbd;background:#75757533;font-style:italic}.turn-badge-session[data-v-ce5d132b]{color:#9e9e9e;background:#61616133}.turn-badge-script[data-v-ce5d132b]{color:#4db6ac;background:#4db6ac26}.turn-time[data-v-ce5d132b]{color:#666;font-family:SF Mono,Menlo,Consolas,monospace;font-size:11px}.turn-time-arrow[data-v-ce5d132b]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-ce5d132b]{color:#8891a3}.turn-actions[data-v-ce5d132b]{color:#777;font-size:11px}.turn-body[data-v-ce5d132b]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-ce5d132b]>*{min-width:0;max-width:100%}.turn-body[data-v-ce5d132b] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-ce5d132b]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-ce5d132b]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-ce5d132b]:hover{opacity:1}.activity-feed-wrap[data-v-d16ab9e7]{width:100%;height:100%;position:relative}.activity-feed-scroll[data-v-d16ab9e7]{width:100%;height:100%}.activity-feed-nav-cluster[data-v-d16ab9e7]{z-index:2;align-items:center;gap:8px;display:flex;position:absolute;bottom:14px;right:14px}.activity-feed-compacting[data-v-d16ab9e7]{z-index:3;background:var(--kobo-surface);border:1px solid var(--kobo-border);border-radius:6px;align-items:center;gap:8px;padding:6px 14px;display:flex;position:absolute;top:12px;left:50%;transform:translate(-50%);box-shadow:0 4px 16px #00000059}.fade-enter-active[data-v-d16ab9e7],.fade-leave-active[data-v-d16ab9e7]{transition:opacity .16s}.fade-enter-from[data-v-d16ab9e7],.fade-leave-to[data-v-d16ab9e7]{opacity:0}.activity-feed-nav-btn[data-v-d16ab9e7]{opacity:.8;transition:opacity .12s}.activity-feed-nav-btn[data-v-d16ab9e7]:hover{opacity:1}.content-origin-marker[data-v-d16ab9e7]{pointer-events:none;width:0;height:0;margin:0;padding:0}.activity-feed-scroll[data-v-d16ab9e7] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-d16ab9e7]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}
@@ -0,0 +1 @@
1
+ import{$ as e,B as t,F as n,R as r,S as i,W as a,_ as o,b as s,c,ct as l,g as u,h as d,it as f,m as p}from"./vue.runtime.esm-bundler-BAtKyT0Y.js";import{t as m}from"./QBtn-DwemGTZv.js";import{b as h,i as g,x as _}from"./index-CNin8jPU.js";import{t as v}from"./render-chat-markdown-BJsZCnSw.js";import{t as y}from"./_plugin-vue_export-helper-BzmG9fMN.js";import{t as b}from"./QSpace-CrVsndpV.js";import{t as x}from"./QChip-BpS8c1sW.js";import{t as S}from"./QPage-C6xc9fOe.js";var C={class:`row items-center q-mb-md`},w={class:`text-h6 q-ml-sm`},T={key:0,class:`text-grey-6 text-center q-pa-lg`},E={key:1,class:`text-negative text-center q-pa-lg`},D={key:2,class:`text-grey-6 text-center q-pa-lg`},O={key:3,class:`column q-gutter-md`},k={key:0,class:`text-caption text-grey-6`},A={class:`row items-center q-mb-sm`},j={class:`text-subtitle1 text-indigo-3`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},M=[`innerHTML`],N=y(i({__name:`ChangelogPage`,setup(i){let y=g(),N=e([]),P=e(``),F=e(!1),I=e(null);function L(e){return v(e)}async function R(){F.value=!0,I.value=null;try{let e=await fetch(`/api/changelog`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();P.value=t.currentVersion??``,N.value=t.versions??[]}catch(e){I.value=e instanceof Error?e.message:String(e)}finally{F.value=!1}}return n(R),(e,n)=>(r(),d(S,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:a(()=>[p(`div`,C,[s(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:n[0]||=e=>f(y).back()}),p(`div`,w,l(e.$t(`changelog.title`)),1),s(b),s(m,{flat:``,dense:``,icon:`refresh`,loading:F.value,label:e.$t(`common.refresh`),onClick:R},null,8,[`loading`,`label`])]),F.value&&N.value.length===0?(r(),o(`div`,T,l(e.$t(`common.loading`)),1)):I.value?(r(),o(`div`,E,l(I.value),1)):N.value.length===0?(r(),o(`div`,D,l(e.$t(`changelog.empty`)),1)):(r(),o(`div`,O,[P.value?(r(),o(`div`,k,l(e.$t(`changelog.currentVersion`,{version:P.value})),1)):u(``,!0),(r(!0),o(c,null,t(N.value,t=>(r(),d(h,{key:t.version,dark:``,flat:``,bordered:``},{default:a(()=>[s(_,null,{default:a(()=>[p(`div`,A,[p(`div`,j,` v`+l(t.version),1),t.version===P.value?(r(),d(x,{key:0,dense:``,size:`sm`,color:`indigo-7`,"text-color":`grey-2`,label:e.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):u(``,!0)]),p(`div`,{class:`changelog-notes`,innerHTML:L(t.notes)},null,8,M)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-ed73d661`]]);export{N as default};
@@ -0,0 +1 @@
1
+ import{F as e,b as t}from"./QIcon-C6C3QeM4.js";import{D as n,E as r}from"./notifications-C4MxuXC7.js";function i(e){return e===!1?0:e===!0||e===void 0?1:Number.parseInt(e,10)||0}var a=e({name:`close-popup`,beforeMount(e,{value:a}){let o={depth:i(a),handler(t){o.depth!==0&&setTimeout(()=>{let i=n(e);i!==void 0&&r(i,t,o.depth)})},handlerKey(e){t(e,13)&&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};
@@ -0,0 +1 @@
1
+ .create-page[data-v-4c087441]{background-color:#1a1a2e;min-height:100%;padding:48px 24px}.create-inner[data-v-4c087441]{width:100%;max-width:700px}.create-title[data-v-4c087441]{font-size:24px;line-height:1.3}.create-card[data-v-4c087441]{background:#224;border:1px solid #444;overflow:hidden}.card-top-bar[data-v-4c087441]{background:#1e1e3a;min-height:36px}.card-name-wrap[data-v-4c087441]{background:#224;padding:8px 16px 4px}.card-name-wrap[data-v-4c087441] .q-field__control{height:32px;min-height:32px;padding:0}.card-name-wrap[data-v-4c087441] input{color:#e0e0e0;font-size:15px;font-weight:500}.card-name-wrap[data-v-4c087441] input::placeholder{color:#555}.card-textarea-wrap[data-v-4c087441]{background:#224;position:relative}.create-slash-popup[data-v-4c087441]{z-index:9999;position:absolute;top:calc(100% + 4px);left:12px;right:12px}.repo-select[data-v-4c087441]{min-width:160px;max-width:260px}.repo-select[data-v-4c087441] .q-field__prepend{align-items:center;height:auto;padding-top:0}.create-textarea[data-v-4c087441]{color:#d0d0d0;width:100%;padding:12px 16px 4px}.create-textarea[data-v-4c087441] .q-field__control{padding:0}.create-textarea[data-v-4c087441] textarea{color:#d0d0d0;resize:none;min-height:100px;font-size:14px;line-height:1.6}.create-textarea[data-v-4c087441] textarea::placeholder{color:#666}.voice-btn--recording[data-v-4c087441]{animation:1.1s ease-in-out infinite voice-pulse-4c087441}@keyframes voice-pulse-4c087441{0%{opacity:1;transform:scale(1)}50%{opacity:.86;transform:scale(1.06)}to{opacity:1;transform:scale(1)}}.notion-toggle-btn[data-v-4c087441]{background:#333;padding:2px 10px}.notion-url-wrap[data-v-4c087441]{background:#1e1e3a;padding:8px 0 0}.notion-url-input[data-v-4c087441]{padding:0 12px}.notion-url-input[data-v-4c087441] .q-field__control{height:36px;min-height:36px;padding:0}.notion-url-input[data-v-4c087441] input{color:#d0d0d0;font-size:13px}.notion-url-input[data-v-4c087441] input::placeholder{color:#555;font-size:12px}.notion-error[data-v-4c087441],.notion-valid[data-v-4c087441]{padding-bottom:6px}.notion-peek-choice[data-v-4c087441]{padding-top:4px}.peek-card[data-v-4c087441]{cursor:pointer;text-align:left;color:#e0e0e0;font-family:inherit;font-size:inherit;background:#ffffff08;border:1px solid #ffffff14;border-radius:8px;align-items:center;gap:10px;padding:10px 12px;transition:background .15s,border-color .15s,transform .1s;display:flex;position:relative}.peek-card[data-v-4c087441]:hover{background:#ffffff0f;border-color:#6c63ff66}.peek-card[data-v-4c087441]:active{transform:scale(.99)}.peek-card--active[data-v-4c087441]{background:#6c63ff1f;border-color:#6c63ffd9;box-shadow:0 0 0 1px #6c63ff66}.peek-card--active .peek-card-icon[data-v-4c087441]{color:#8a82ff}.peek-card--active .peek-card-title[data-v-4c087441]{color:#fff}.peek-card-icon[data-v-4c087441]{color:#999;flex-shrink:0}.peek-card-text[data-v-4c087441]{flex:1;min-width:0;line-height:1.25}.peek-card-title[data-v-4c087441]{color:#d0d0d0;font-size:12px;font-weight:600}.peek-card-desc[data-v-4c087441]{color:#888;margin-top:2px;font-size:10.5px}.peek-card-check[data-v-4c087441]{flex-shrink:0}.sentry-toggle-btn[data-v-4c087441]{background:#333;padding:2px 10px}.sentry-url-wrap[data-v-4c087441]{background:#1e1e3a;padding:8px 0 0}.sentry-url-input[data-v-4c087441]{padding:0 12px}.sentry-url-input[data-v-4c087441] .q-field__control{height:36px;min-height:36px;padding:0}.sentry-url-input[data-v-4c087441] input{color:#d0d0d0;font-size:13px}.sentry-url-input[data-v-4c087441] input::placeholder{color:#555;font-size:12px}.sentry-error[data-v-4c087441],.sentry-valid[data-v-4c087441]{padding-bottom:6px}.slide-enter-active[data-v-4c087441],.slide-leave-active[data-v-4c087441]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-4c087441],.slide-leave-to[data-v-4c087441]{opacity:0;max-height:0}.slide-enter-to[data-v-4c087441],.slide-leave-from[data-v-4c087441]{opacity:1;max-height:120px}.card-bottom-bar[data-v-4c087441]{background:#1e1e3a}.skip-setup-btn[data-v-4c087441]{min-height:28px;padding:2px 10px;font-size:11px}.skip-setup-btn[data-v-4c087441] .q-btn__content{gap:4px}.skip-setup-btn[data-v-4c087441] .q-icon{font-size:14px}.bottom-row-git .bottom-select-label[data-v-4c087441]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bottom-row-git .bottom-select.repo-select[data-v-4c087441] input{color:#bbb;padding:0 4px;font-size:11px}.bottom-row-git .bottom-select.repo-select[data-v-4c087441] input::placeholder{color:#666;font-style:italic}.bottom-select[data-v-4c087441]{background:#333;height:28px;padding:0 6px}.bottom-select[data-v-4c087441] .q-field__control{height:28px;min-height:28px;padding:0}.bottom-select[data-v-4c087441] .q-field__native{min-height:unset;padding:0}.bottom-select-label[data-v-4c087441]{color:#bbb;gap:2px;font-size:11px}.bottom-sep[data-v-4c087441]{color:#555;padding:0 2px;font-size:12px;line-height:1}.repo-path-wrap[data-v-4c087441]{background:#333;border-radius:6px;height:28px;padding:0 8px}.repo-input[data-v-4c087441]{min-width:140px}.repo-input[data-v-4c087441] .q-field__control{height:28px;min-height:28px;padding:0}.repo-input[data-v-4c087441] input{color:#bbb;font-size:11px}.repo-input[data-v-4c087441] input::placeholder{color:#666;font-size:11px}.branch-select[data-v-4c087441]{min-width:80px}.create-btn[data-v-4c087441]{color:#fff;background:#4f46e5;min-width:220px;height:32px;padding:0 32px;font-size:13px}.create-btn[data-v-4c087441] .q-btn__content{height:32px}.create-hint[data-v-4c087441]{line-height:1.5}.fade-enter-active[data-v-4c087441],.fade-leave-active[data-v-4c087441]{transition:opacity .2s}.fade-enter-from[data-v-4c087441],.fade-leave-to[data-v-4c087441]{opacity:0}.manual-hint[data-v-4c087441]{background:#1e1e3a;line-height:1.4}.manual-expansion[data-v-4c087441]{background:#1e1e3a;border:1px solid #333;border-radius:4px;margin-top:6px;overflow:hidden}.manual-expansion[data-v-4c087441] .manual-expansion-header{min-height:32px;padding:4px 10px;font-size:12px}.manual-expansion[data-v-4c087441] .q-expansion-item__content,.manual-section-body[data-v-4c087441]{background:#1a1a2e}.manual-input[data-v-4c087441] .q-field__control{height:26px;min-height:26px;padding:0}.manual-input[data-v-4c087441] input{color:#e0e0e0;font-size:12px}.manual-input[data-v-4c087441] input::placeholder{color:#555}.manual-item[data-v-4c087441]{border-top:1px solid #ffffff0a}.manual-item[data-v-4c087441]:first-child{border-top:none}