@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.
- package/CHANGELOG.md +8 -0
- package/dist/mcp-server/kobo-tasks-server.js +1 -1
- package/dist/server/routes/settings.js +2 -1
- package/dist/server/routes/workspaces.js +40 -4
- package/dist/server/services/agent/engines/claude-code/event-mapper.js +8 -0
- package/dist/server/services/agent/engines/claude-code/options-builder.js +11 -1
- package/dist/server/services/agent/engines/types.js +1 -0
- package/dist/server/services/agent/event-router.js +7 -1
- package/dist/server/services/auto-loop-service.js +2 -1
- package/dist/server/services/forge/github/provider.js +6 -2
- package/dist/server/services/forge/gitlab/provider.js +3 -0
- package/dist/server/services/forge/types.js +13 -0
- package/dist/server/services/pr-watcher-service.js +5 -0
- package/dist/server/services/settings-service.js +28 -1
- package/dist/server/services/workspace-service.js +15 -0
- package/dist/shared/models.js +12 -0
- package/package.json +14 -14
- package/src/client/dist/spa/assets/ActivityFeed-COdkQaiZ.js +8 -0
- package/src/client/dist/spa/assets/{ActivityFeed-yUMQhnW4.css → ActivityFeed-HbMZOClq.css} +1 -1
- package/src/client/dist/spa/assets/ChangelogPage-BXD8H3j-.js +1 -0
- package/src/client/dist/spa/assets/ClosePopup-DD10nToj.js +1 -0
- package/src/client/dist/spa/assets/CreatePage-CE-ljszo.css +1 -0
- package/src/client/dist/spa/assets/CreatePage-DX4TjLqr.js +2 -0
- package/src/client/dist/spa/assets/DiffViewer-BUjVXGyZ.js +8 -0
- package/src/client/dist/spa/assets/HealthPage-DM7fvP4v.js +1 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiAw-BCOjigVR.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtalmUiAw-Ocp2tNig.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabVmUiAw-6jEn9xEl.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bVmUiAw-CCs8I9zJ.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbFmUiAw-BLaboPi0.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAw-DHuK6FBl.woff +0 -0
- package/src/client/dist/spa/assets/MainLayout-CbUZOTwz.js +37 -0
- package/src/client/dist/spa/assets/{MainLayout-D2SRkiCN.css → MainLayout-DtTxmFXf.css} +1 -1
- package/src/client/dist/spa/assets/QBadge-CIC5n8w7.js +1 -0
- package/src/client/dist/spa/assets/QBanner-BxBEdhfp.js +1 -0
- package/src/client/dist/spa/assets/QBtn-DwemGTZv.js +1 -0
- package/src/client/dist/spa/assets/QCheckbox-o3UHW596.js +1 -0
- package/src/client/dist/spa/assets/QChip-BpS8c1sW.js +1 -0
- package/src/client/dist/spa/assets/QExpansionItem-C9vmJqEO.js +1 -0
- package/src/client/dist/spa/assets/QIcon-C6C3QeM4.js +1 -0
- package/src/client/dist/spa/assets/QInput-CLZtb8E0.js +1 -0
- package/src/client/dist/spa/assets/QItemLabel-BYSjzk-t.js +1 -0
- package/src/client/dist/spa/assets/QItemSection-O9WBXftL.js +1 -0
- package/src/client/dist/spa/assets/QList-DRW_oyZ4.js +1 -0
- package/src/client/dist/spa/assets/QMenu-D_9kEp2i.js +1 -0
- package/src/client/dist/spa/assets/QPage-C6xc9fOe.js +1 -0
- package/src/client/dist/spa/assets/QRadio-B_TurTzx.js +1 -0
- package/src/client/dist/spa/assets/QScrollArea-B5jf9S4y.js +1 -0
- package/src/client/dist/spa/assets/QScrollObserver-Cxj52Zfg.js +1 -0
- package/src/client/dist/spa/assets/QSelect-DERXhq6x.js +36 -0
- package/src/client/dist/spa/assets/QSpace-CrVsndpV.js +1 -0
- package/src/client/dist/spa/assets/QSpinnerDots-atHe_AUn.js +1 -0
- package/src/client/dist/spa/assets/QToggle-Dwr3hSLw.js +1 -0
- package/src/client/dist/spa/assets/QTooltip-CyRLTG6i.js +1 -0
- package/src/client/dist/spa/assets/SearchPage-OaTRqd2Q.js +1 -0
- package/src/client/dist/spa/assets/SettingsPage-B7H6sD7r.css +1 -0
- package/src/client/dist/spa/assets/SettingsPage-BBk3MB8w.js +9 -0
- package/src/client/dist/spa/assets/TouchPan-BmfIMD00.js +1 -0
- package/src/client/dist/spa/assets/WorkspacePage-k_qzLoLC.js +4 -0
- package/src/client/dist/spa/assets/build-path-tree-D4_LR3mz.js +1 -0
- package/src/client/dist/spa/assets/chunk-DtRyYLXJ.js +1 -0
- package/src/client/dist/spa/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/src/client/dist/spa/assets/{css.worker-D1piIYC4.js → css.worker-BtW9exzf.js} +32 -45
- package/src/client/dist/spa/assets/cssMode-CdNIff6x.js +1 -0
- package/src/client/dist/spa/assets/documents-N8PwB_Gh.js +1 -0
- package/src/client/dist/spa/assets/editor-BFebQ78e.css +1 -0
- package/src/client/dist/spa/assets/editor.api2-CEAFHkwY.js +872 -0
- package/src/client/dist/spa/assets/editor.main-DuQa2C4S.js +6 -0
- package/src/client/dist/spa/assets/editor.worker-DWlYVeeX.js +26 -0
- package/src/client/dist/spa/assets/engineFeatures-DChekJQO.js +1 -0
- package/src/client/dist/spa/assets/expand-template-BXNt_oWH.js +1 -0
- package/src/client/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff +0 -0
- package/src/client/dist/spa/assets/{formatters-BKR66G3t.js → formatters-wq5wP2If.js} +1 -1
- package/src/client/dist/spa/assets/freemarker2-DXz2Sr_a.js +3 -0
- package/src/client/dist/spa/assets/handlebars-B6DHJ8jd.js +1 -0
- package/src/client/dist/spa/assets/html-_UvZHIUo.js +1 -0
- package/src/client/dist/spa/assets/{html.worker-C4q4XMPn.js → html.worker-Dg1SpGQ4.js} +22 -29
- package/src/client/dist/spa/assets/htmlMode-DZ0ixGc6.js +1 -0
- package/src/client/dist/spa/assets/i18n-DXMuiAyu.js +1 -0
- package/src/client/dist/spa/assets/{index-ClabzOPc.css → index-C3dgH7TE.css} +1 -1
- package/src/client/dist/spa/assets/index-CNin8jPU.js +82 -0
- package/src/client/dist/spa/assets/{javascript-B3eFu2aM.js → javascript-C6Gf4Ys2.js} +1 -1
- package/src/client/dist/spa/assets/json.worker-CCzEOxDx.js +58 -0
- package/src/client/dist/spa/assets/jsonMode-aE8EPidy.js +7 -0
- package/src/client/dist/spa/assets/{kobo-commands-Bty0N8JZ.js → kobo-commands-Ip0ObeCE.js} +1 -1
- package/src/client/dist/spa/assets/{kotlin-CllWo3gX.js → kotlin-DIUPrqKg.js} +1 -1
- package/src/client/dist/spa/assets/liquid-CSp27lUC.js +1 -0
- package/src/client/dist/spa/assets/lspLanguageFeatures-UxO-LpRp.js +4 -0
- package/src/client/dist/spa/assets/mdx-BSCEgQSy.js +1 -0
- package/src/client/dist/spa/assets/monaco.contribution-DqqsS1kc.js +2 -0
- package/src/client/dist/spa/assets/notifications-C4MxuXC7.js +1 -0
- package/src/client/dist/spa/assets/permissionModes-CJN6Olox.js +1 -0
- package/src/client/dist/spa/assets/python-CA5lSk1U.js +1 -0
- package/src/client/dist/spa/assets/razor-BznM4hXD.js +1 -0
- package/src/client/dist/spa/assets/render-chat-markdown-BJsZCnSw.js +66 -0
- package/src/client/dist/spa/assets/touch-yfnu5R3D.js +1 -0
- package/src/client/dist/spa/assets/ts.worker-DI5g4t5j.js +67719 -0
- package/src/client/dist/spa/assets/tsMode-NbGeOvoN.js +11 -0
- package/src/client/dist/spa/assets/typescript-kHDph5jb.js +1 -0
- package/src/client/dist/spa/assets/use-checkbox-BnkSQgTJ.js +1 -0
- package/src/client/dist/spa/assets/use-id-By86THzm.js +1 -0
- package/src/client/dist/spa/assets/{use-onboarding-BorG03FJ.js → use-onboarding-C4tGLHsr.js} +1 -1
- package/src/client/dist/spa/assets/use-quasar-DcJRs0ay.js +1 -0
- package/src/client/dist/spa/assets/vue-i18n-C5Tx4bGk.js +3 -0
- package/src/client/dist/spa/assets/vue.runtime.esm-bundler-BAtKyT0Y.js +3 -0
- package/src/client/dist/spa/assets/workers-DFjmWZva.js +1 -0
- package/src/client/dist/spa/assets/xml-BXzZhhmL.js +1 -0
- package/src/client/dist/spa/assets/yaml-DQNlz7_W.js +1 -0
- package/src/client/dist/spa/index.html +14 -13
- package/src/mcp-server/kobo-tasks-server.ts +1 -1
- package/src/client/dist/spa/assets/ActivityFeed-Dcp3KOD-.js +0 -8
- package/src/client/dist/spa/assets/ChangelogPage-CQuEm5ri.js +0 -1
- package/src/client/dist/spa/assets/ClosePopup-CY16K9Yi.js +0 -1
- package/src/client/dist/spa/assets/CreatePage-DDuStqsB.css +0 -1
- package/src/client/dist/spa/assets/CreatePage-DwPnA1bE.js +0 -2
- package/src/client/dist/spa/assets/DiffViewer-CdpddYBw.js +0 -8
- package/src/client/dist/spa/assets/HealthPage-czYUHzsb.js +0 -1
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiAw-k1h7X_-h.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtalmUiAw-B7du-70m.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabVmUiAw-CoAZ_DKt.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bVmUiAw-D0406B4n.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbFmUiAw-CnAg2DeQ.woff +0 -0
- package/src/client/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAw-BG9VWE5v.woff +0 -0
- package/src/client/dist/spa/assets/MainLayout-DsG5p1lc.js +0 -37
- package/src/client/dist/spa/assets/QBadge-DNQSqPg-.js +0 -1
- package/src/client/dist/spa/assets/QBanner-C_TvxtXi.js +0 -1
- package/src/client/dist/spa/assets/QBtn-CoU-UC_j.js +0 -1
- package/src/client/dist/spa/assets/QCheckbox-Cq2STfHp.js +0 -1
- package/src/client/dist/spa/assets/QChip-5bnjPnRz.js +0 -1
- package/src/client/dist/spa/assets/QExpansionItem-_8j8FyQg.js +0 -1
- package/src/client/dist/spa/assets/QIcon-BmEX2rXO.js +0 -1
- package/src/client/dist/spa/assets/QInput-D0t39uK_.js +0 -1
- package/src/client/dist/spa/assets/QItemLabel-Btqw0P7M.js +0 -1
- package/src/client/dist/spa/assets/QItemSection-DRg-QuAD.js +0 -1
- package/src/client/dist/spa/assets/QList-Ch5K5W7r.js +0 -1
- package/src/client/dist/spa/assets/QMenu-BXssnk-g.js +0 -1
- package/src/client/dist/spa/assets/QPage-3-ah4oor.js +0 -1
- package/src/client/dist/spa/assets/QRadio-M9mC5jZy.js +0 -1
- package/src/client/dist/spa/assets/QScrollArea-_Mvx2t8o.js +0 -1
- package/src/client/dist/spa/assets/QScrollObserver-C6P7wS4h.js +0 -1
- package/src/client/dist/spa/assets/QSelect-kWnJnHbT.js +0 -36
- package/src/client/dist/spa/assets/QSpace-Crcx82On.js +0 -1
- package/src/client/dist/spa/assets/QSpinnerDots-DspFKwCZ.js +0 -1
- package/src/client/dist/spa/assets/QToggle-DBzTAIbK.js +0 -1
- package/src/client/dist/spa/assets/QTooltip-DyIRS1GH.js +0 -1
- package/src/client/dist/spa/assets/SearchPage-CxqEGjQZ.js +0 -1
- package/src/client/dist/spa/assets/SettingsPage-CL9uI9wk.js +0 -9
- package/src/client/dist/spa/assets/SettingsPage-D1Ap5wB7.css +0 -1
- package/src/client/dist/spa/assets/TouchPan-DZZEI8eo.js +0 -1
- package/src/client/dist/spa/assets/WorkspacePage-DYOstvf6.js +0 -4
- package/src/client/dist/spa/assets/build-path-tree-BUfhgOSH.js +0 -1
- package/src/client/dist/spa/assets/codicon-CgENjH2v.ttf +0 -0
- package/src/client/dist/spa/assets/cssMode-DK7cw-vE.js +0 -4
- package/src/client/dist/spa/assets/documents-CX2-4fhr.js +0 -1
- package/src/client/dist/spa/assets/editor-COGk2gAX.css +0 -1
- package/src/client/dist/spa/assets/editor-CS3NEPi9.css +0 -1
- package/src/client/dist/spa/assets/editor.api-DvSpUXCz.js +0 -818
- package/src/client/dist/spa/assets/editor.main-DwPjO6GT.js +0 -53
- package/src/client/dist/spa/assets/editor.worker-CJ9iTmkr.js +0 -26
- package/src/client/dist/spa/assets/engineFeatures-Bt8kYOzE.js +0 -1
- package/src/client/dist/spa/assets/expand-template-CIu2odEp.js +0 -1
- package/src/client/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-OUIwM9U8.woff +0 -0
- package/src/client/dist/spa/assets/freemarker2-D7ge7blW.js +0 -3
- package/src/client/dist/spa/assets/handlebars-CUEC5MGt.js +0 -1
- package/src/client/dist/spa/assets/html-CxVVScDS.js +0 -1
- package/src/client/dist/spa/assets/htmlMode-B56eLBAd.js +0 -4
- package/src/client/dist/spa/assets/i18n-QWFh8Zwf.js +0 -1
- package/src/client/dist/spa/assets/index-B-lBV8Zz.js +0 -82
- package/src/client/dist/spa/assets/json.worker-C9p7xCYk.js +0 -65
- package/src/client/dist/spa/assets/jsonMode-D2R4UZpk.js +0 -10
- package/src/client/dist/spa/assets/liquid-96V_PNfN.js +0 -1
- package/src/client/dist/spa/assets/mdx-Dm6cvsMe.js +0 -1
- package/src/client/dist/spa/assets/monaco.contribution-CYHCoAZe.js +0 -2
- package/src/client/dist/spa/assets/notifications-BtVr85fZ.js +0 -1
- package/src/client/dist/spa/assets/permissionModes-BUhr5Wdx.js +0 -1
- package/src/client/dist/spa/assets/python-DswGzTX7.js +0 -1
- package/src/client/dist/spa/assets/razor-4HZKZMY8.js +0 -1
- package/src/client/dist/spa/assets/render-chat-markdown-BpWIaLW6.js +0 -60
- package/src/client/dist/spa/assets/runtime-core.esm-bundler-D_RRiKBh.js +0 -1
- package/src/client/dist/spa/assets/touch-2Qa-HSDZ.js +0 -1
- package/src/client/dist/spa/assets/ts.worker-Cj3zTgVE.js +0 -51353
- package/src/client/dist/spa/assets/tsMode-C83Lp_IK.js +0 -11
- package/src/client/dist/spa/assets/typescript-Dbm3rcf_.js +0 -1
- package/src/client/dist/spa/assets/use-checkbox-DnSuDqo2.js +0 -1
- package/src/client/dist/spa/assets/use-id-BCnfiBjU.js +0 -1
- package/src/client/dist/spa/assets/use-quasar-sypIWZgU.js +0 -1
- package/src/client/dist/spa/assets/vue-i18n-Cq-KgjJC.js +0 -3
- package/src/client/dist/spa/assets/xml-BDATADOG.js +0 -1
- package/src/client/dist/spa/assets/yaml-Fic7yQhp.js +0 -1
- /package/src/client/dist/spa/assets/{_plugin-vue_export-helper-r4mAJOHR.js → _plugin-vue_export-helper-BzmG9fMN.js} +0 -0
- /package/src/client/dist/spa/assets/{fsharp-CMk2OIJN.js → fsharp-CFNadkg7.js} +0 -0
- /package/src/client/dist/spa/assets/{go-BrMkuJg0.js → go-dSur1iB2.js} +0 -0
- /package/src/client/dist/spa/assets/{graphql-PSR1UKGv.js → graphql-qyhAo11d.js} +0 -0
- /package/src/client/dist/spa/assets/{hcl-DAQrbDOW.js → hcl-DFzjMyzm.js} +0 -0
- /package/src/client/dist/spa/assets/{ini-0TG5BxW0.js → ini-TdzA8TIl.js} +0 -0
- /package/src/client/dist/spa/assets/{java-rgorz17v.js → java-CSGA9pkE.js} +0 -0
- /package/src/client/dist/spa/assets/{julia-C8VMdHm8.js → julia-9izz5OsY.js} +0 -0
- /package/src/client/dist/spa/assets/{less-Cgca25AP.js → less-B8d93iCg.js} +0 -0
- /package/src/client/dist/spa/assets/{lexon-D0GHdBaw.js → lexon-DWtEIyu7.js} +0 -0
- /package/src/client/dist/spa/assets/{lua-DmRsNG-P.js → lua-Ciq0OGgt.js} +0 -0
- /package/src/client/dist/spa/assets/{m3-BgL5dNKT.js → m3-Cki6JWj_.js} +0 -0
- /package/src/client/dist/spa/assets/{markdown-BuJfycGS.js → markdown-Cu47xwU0.js} +0 -0
- /package/src/client/dist/spa/assets/{mips-C9m_93PR.js → mips-BM8ui995.js} +0 -0
- /package/src/client/dist/spa/assets/{msdax-CpFHC9OI.js → msdax-DqLio0_c.js} +0 -0
- /package/src/client/dist/spa/assets/{mysql-qFvltsqN.js → mysql-v1wbjJOq.js} +0 -0
- /package/src/client/dist/spa/assets/{objective-c-Bnmr858J.js → objective-c-CQl3PGSB.js} +0 -0
- /package/src/client/dist/spa/assets/{pascal-WP0_D5AO.js → pascal-D4iW0ZtD.js} +0 -0
- /package/src/client/dist/spa/assets/{pascaligo-Blom4Rij.js → pascaligo-BdC9CZdj.js} +0 -0
- /package/src/client/dist/spa/assets/{perl-B-vk8g64.js → perl-BL10m4XD.js} +0 -0
- /package/src/client/dist/spa/assets/{pgsql-Cgvz6v67.js → pgsql-Be_oqVo3.js} +0 -0
- /package/src/client/dist/spa/assets/{php-8a3Lrw9m.js → php-BtvXSFRI.js} +0 -0
- /package/src/client/dist/spa/assets/{pla-DuFqEZ8V.js → pla-B2vUy15C.js} +0 -0
- /package/src/client/dist/spa/assets/{postiats-DkLtSgkp.js → postiats-CbmTTfXr.js} +0 -0
- /package/src/client/dist/spa/assets/{powerquery-BJ1aNepW.js → powerquery-DszLhJGx.js} +0 -0
- /package/src/client/dist/spa/assets/{powershell-rE98k687.js → powershell-B0dYktF6.js} +0 -0
- /package/src/client/dist/spa/assets/{protobuf-CUheFacr.js → protobuf-CZvaj1VX.js} +0 -0
- /package/src/client/dist/spa/assets/{pug-LDcAMD8w.js → pug-CPDx1B3S.js} +0 -0
- /package/src/client/dist/spa/assets/{qsharp-DUKSQoR1.js → qsharp-CDP9TFLl.js} +0 -0
- /package/src/client/dist/spa/assets/{r-D-QApv87.js → r-8DbbFX2l.js} +0 -0
- /package/src/client/dist/spa/assets/{redis-SXdDyWR9.js → redis-DRWj9MtJ.js} +0 -0
- /package/src/client/dist/spa/assets/{redshift-Y6lsCryn.js → redshift-C6cElE_5.js} +0 -0
- /package/src/client/dist/spa/assets/{restructuredtext-edObr9a8.js → restructuredtext-W9pS9n3m.js} +0 -0
- /package/src/client/dist/spa/assets/{ruby-CNnUfF-8.js → ruby-BKnzWnk-.js} +0 -0
- /package/src/client/dist/spa/assets/{rust-IHUZWzBr.js → rust-YPCclWwe.js} +0 -0
- /package/src/client/dist/spa/assets/{sb-DrUvY44N.js → sb-BgM4DTFb.js} +0 -0
- /package/src/client/dist/spa/assets/{scala-B4hbXGLM.js → scala-fz1OPLMl.js} +0 -0
- /package/src/client/dist/spa/assets/{scheme-BGrd12j3.js → scheme-8Uz1RIbu.js} +0 -0
- /package/src/client/dist/spa/assets/{scss-x5G1ES4U.js → scss-Djo3IYXr.js} +0 -0
- /package/src/client/dist/spa/assets/{shell-DOehe2Y8.js → shell-CINF5Tx_.js} +0 -0
- /package/src/client/dist/spa/assets/{solidity-BeRvcwWV.js → solidity-GgiNEuUm.js} +0 -0
- /package/src/client/dist/spa/assets/{sophia-DZbkUNjy.js → sophia-Culj97P9.js} +0 -0
- /package/src/client/dist/spa/assets/{sparql-B7_oi5-h.js → sparql-C2ZlpxOY.js} +0 -0
- /package/src/client/dist/spa/assets/{sql-CTlsFWVE.js → sql-BEf5Pg7Y.js} +0 -0
- /package/src/client/dist/spa/assets/{st-DJVEJdPE.js → st-CT6UUoeH.js} +0 -0
- /package/src/client/dist/spa/assets/{swift-CwhT3fYa.js → swift-B5g0xTG3.js} +0 -0
- /package/src/client/dist/spa/assets/{systemverilog-BQN63pkN.js → systemverilog-CEgQz9DR.js} +0 -0
- /package/src/client/dist/spa/assets/{tcl-DqwfpskA.js → tcl-D0qL2L0I.js} +0 -0
- /package/src/client/dist/spa/assets/{twig-BiyenUgc.js → twig-BFUAVf1E.js} +0 -0
- /package/src/client/dist/spa/assets/{typespec-CWOJribt.js → typespec-CjVVcNKm.js} +0 -0
- /package/src/client/dist/spa/assets/{vb-Cq5F87m3.js → vb-CZJr-DQz.js} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
|
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 +
|
|
@@ -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
|
-
|
|
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
|
|
64
|
+
state,
|
|
62
65
|
base: raw.baseRefName ?? '',
|
|
63
|
-
reviewDecision
|
|
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
|
|
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();
|
package/dist/shared/models.js
CHANGED
|
@@ -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.
|
|
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.
|
|
71
|
-
"@emnapi/core": "^1.
|
|
72
|
-
"@emnapi/runtime": "^1.
|
|
73
|
-
"@hono/node-server": "^2.0.
|
|
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.
|
|
76
|
-
"better-sqlite3": "^12.
|
|
75
|
+
"@openai/codex": "^0.139.0",
|
|
76
|
+
"better-sqlite3": "^12.10.0",
|
|
77
77
|
"cron-parser": "^5.5.0",
|
|
78
|
-
"hono": "^4.12.
|
|
78
|
+
"hono": "^4.12.25",
|
|
79
79
|
"nanoid": "^5.1.11",
|
|
80
80
|
"node-pty": "^1.1.0",
|
|
81
|
-
"ws": "^8.
|
|
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.
|
|
86
|
+
"@types/node": "^25.9.3",
|
|
87
87
|
"@types/ws": "^8.18.1",
|
|
88
|
-
"@vitest/runner": "^4.1.
|
|
89
|
-
"concurrently": "^
|
|
90
|
-
"tsx": "^4.
|
|
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.
|
|
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)?`}/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-
|
|
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}
|