@loicngr/kobo 2.1.6 → 2.1.9

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 (196) hide show
  1. package/AGENTS.md +16 -0
  2. package/CHANGELOG.md +16 -0
  3. package/CONFIGURATION.md +39 -0
  4. package/DESIGN.md +11 -1
  5. package/README.md +4 -0
  6. package/dist/mcp-server/kobo-tasks-handlers.js +17 -4
  7. package/dist/mcp-server/kobo-tasks-server.js +47 -3
  8. package/dist/mcp-server/memory-client.js +39 -0
  9. package/dist/mcp-server/workspace-dialogue-client.js +4 -1
  10. package/dist/server/db/memory-schema.js +185 -0
  11. package/dist/server/db/migrations.js +6 -0
  12. package/dist/server/db/schema.js +2 -0
  13. package/dist/server/index.js +4 -0
  14. package/dist/server/routes/mcp.js +31 -2
  15. package/dist/server/routes/memory.js +525 -0
  16. package/dist/server/routes/settings.js +3 -0
  17. package/dist/server/routes/workspaces.js +4 -1
  18. package/dist/server/services/agent/engines/claude-code/event-mapper.js +13 -2
  19. package/dist/server/services/agent/engines/codex/event-mapper.js +2 -2
  20. package/dist/server/services/agent/orchestrator.js +110 -6
  21. package/dist/server/services/dev-server-service.js +7 -1
  22. package/dist/server/services/memory-agent-runtime.js +65 -0
  23. package/dist/server/services/memory-budget-service.js +183 -0
  24. package/dist/server/services/memory-context-service.js +287 -0
  25. package/dist/server/services/memory-mcp-service.js +339 -0
  26. package/dist/server/services/memory-service.js +891 -0
  27. package/dist/server/services/settings-service.js +19 -0
  28. package/dist/server/utils/memory-project-identity.js +17 -0
  29. package/dist/server/utils/memory-token-budget.js +221 -0
  30. package/dist/shared/codex-models.js +0 -24
  31. package/dist/shared/memory-prompts.js +18 -0
  32. package/dist/shared/memory-tools.js +215 -0
  33. package/dist/shared/memory.js +81 -0
  34. package/dist/shared/models.js +35 -41
  35. package/package.json +1 -1
  36. package/src/client/dist/pwa/assets/ActivityFeed-DdJvMzRI.css +1 -0
  37. package/src/client/dist/pwa/assets/ActivityFeed-w8TNfMKd.js +2 -0
  38. package/src/client/dist/pwa/assets/ChangelogPage-B1rkKskD.js +1 -0
  39. package/src/client/dist/pwa/assets/ClosePopup-CRV2hxHS.js +1 -0
  40. package/src/client/dist/pwa/assets/{ComparisonPanel-CfmJHeH_.js → ComparisonPanel-kMWS9il3.js} +2 -2
  41. package/src/client/dist/pwa/assets/CreatePage-C7fLOpai.css +1 -0
  42. package/src/client/dist/pwa/assets/CreatePage-DOamHqeH.js +2 -0
  43. package/src/client/dist/pwa/assets/DashboardPage-Ds6Y8xlV.js +1 -0
  44. package/src/client/dist/pwa/assets/DiffViewer-j7rwPKxU.js +8 -0
  45. package/src/client/dist/pwa/assets/DocumentsPanel-BTp3J6Rq.js +1 -0
  46. package/src/client/dist/pwa/assets/{DrawerToggleButton-DKytIBlk.js → DrawerToggleButton-DcVhAbjN.js} +1 -1
  47. package/src/client/dist/pwa/assets/GitPanel-DOugIJUS.js +3 -0
  48. package/src/client/dist/pwa/assets/HealthPage-BSrTmp1k.js +1 -0
  49. package/src/client/dist/pwa/assets/{MainLayout-DkSavoiV.css → MainLayout-DAcSwgUw.css} +1 -1
  50. package/src/client/dist/pwa/assets/MainLayout-DWzXL1KW.js +2 -0
  51. package/src/client/dist/pwa/assets/MemoryPanel-BivQoMQ6.js +1 -0
  52. package/src/client/dist/pwa/assets/MemoryPanel-Ch3qeyQw.css +1 -0
  53. package/src/client/dist/pwa/assets/MemoryProposalList-BnoVbFsj.js +1 -0
  54. package/src/client/dist/pwa/assets/MemoryProposalList-OmDpl3o5.css +1 -0
  55. package/src/client/dist/pwa/assets/QBadge-CW3Lw-kL.js +1 -0
  56. package/src/client/dist/pwa/assets/QBanner-BT2ZemYu.js +1 -0
  57. package/src/client/dist/pwa/assets/QBtn-BUSdPaf4.js +1 -0
  58. package/src/client/dist/pwa/assets/QBtnDropdown-B9xNOKD0.js +1 -0
  59. package/src/client/dist/pwa/assets/QBtnGroup-CnM4vSJA.js +1 -0
  60. package/src/client/dist/pwa/assets/QBtnToggle-DccOOtbh.js +1 -0
  61. package/src/client/dist/pwa/assets/QChip-Be16M4Ig.js +1 -0
  62. package/src/client/dist/pwa/assets/QExpansionItem-BBTTV_37.js +1 -0
  63. package/src/client/dist/pwa/assets/QItemSection-MdJ1_ZK7.js +1 -0
  64. package/src/client/dist/pwa/assets/QList-Cx1UfaUm.js +1 -0
  65. package/src/client/dist/pwa/assets/QMarkupTable-UhP7fVUp.js +1 -0
  66. package/src/client/dist/pwa/assets/QPage-CqkGHokx.js +1 -0
  67. package/src/client/dist/pwa/assets/QScrollArea-bm6nYMnB.js +1 -0
  68. package/src/client/dist/pwa/assets/QSelect-CPE9LsIn.js +1 -0
  69. package/src/client/dist/pwa/assets/QSpinnerDots-xdWyaE1i.js +1 -0
  70. package/src/client/dist/pwa/assets/QTooltip-CgVCYatx.js +1 -0
  71. package/src/client/dist/pwa/assets/SchedulePanel-DNwt3V1a.js +1 -0
  72. package/src/client/dist/pwa/assets/SearchPage-Dr43rGji.js +1 -0
  73. package/src/client/dist/pwa/assets/SettingsPage-C1dcMqCO.css +1 -0
  74. package/src/client/dist/pwa/assets/SettingsPage-oSGNwimG.js +9 -0
  75. package/src/client/dist/pwa/assets/SplitWorkspacePage-Cjd_Lq-0.js +1 -0
  76. package/src/client/dist/pwa/assets/{TerminalPanel-C4dYabx6.js → TerminalPanel-Bsrg96VZ.js} +9 -9
  77. package/src/client/dist/pwa/assets/ToolCallItem-M3CSguac.js +8 -0
  78. package/src/client/dist/pwa/assets/TouchPan-CxThkotY.js +1 -0
  79. package/src/client/dist/pwa/assets/{TourReplayButton-DhbNI6O5.js → TourReplayButton-COI4vR7q.js} +1 -1
  80. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-CqlhQOqG.js +1 -0
  81. package/src/client/dist/pwa/assets/{WorkspacePage-BnW-gp3u.css → WorkspacePage-Ba0jAHhn.css} +1 -1
  82. package/src/client/dist/pwa/assets/WorkspacePage-C-JXKt-S.js +4 -0
  83. package/src/client/dist/pwa/assets/{browser-CTkGHrN5.js → browser-DuFAaYHh.js} +1 -1
  84. package/src/client/dist/pwa/assets/build-path-tree-DFwB0SSs.js +1 -0
  85. package/src/client/dist/pwa/assets/custom-sounds-DTV-xHVv.js +1 -0
  86. package/src/client/dist/pwa/assets/de-YFD4X2nQ.js +17 -0
  87. package/src/client/dist/pwa/assets/detached-fullscreen-Du3TcYdX.js +1 -0
  88. package/src/client/dist/pwa/assets/dom-BtYTvLeN.js +2 -0
  89. package/src/client/dist/pwa/assets/{editor.api-CKcTKXcM.js → editor.api-DDwuA_C9.js} +1 -1
  90. package/src/client/dist/pwa/assets/efforts-DU9dTnaN.js +9 -0
  91. package/src/client/dist/pwa/assets/es-BvRPXBHq.js +17 -0
  92. package/src/client/dist/pwa/assets/expand-template-LaRhdYUp.js +1 -0
  93. package/src/client/dist/pwa/assets/{format-MtzcnR3z.js → format-BUmAn8W2.js} +1 -1
  94. package/src/client/dist/pwa/assets/formatters-DfLD95iT.js +1 -0
  95. package/src/client/dist/pwa/assets/fr-CZhjMFZl.js +17 -0
  96. package/src/client/dist/pwa/assets/{freemarker2-JGUTjYvR.js → freemarker2-DVQM2t3e.js} +1 -1
  97. package/src/client/dist/pwa/assets/{handlebars-BWStl2Hc.js → handlebars-ChiPNy9j.js} +1 -1
  98. package/src/client/dist/pwa/assets/{html-CjGCxUEe.js → html-CnGW31DH.js} +1 -1
  99. package/src/client/dist/pwa/assets/i18n-v1pgIO4z.js +1 -0
  100. package/src/client/dist/pwa/assets/index-DPN7dSDH.js +20 -0
  101. package/src/client/dist/pwa/assets/it-B4rz5PZO.js +17 -0
  102. package/src/client/dist/pwa/assets/{javascript-C_jd0j2i.js → javascript-BmeNra1c.js} +1 -1
  103. package/src/client/dist/pwa/assets/{liquid-DMyQVGkp.js → liquid-C5qQFvIu.js} +1 -1
  104. package/src/client/dist/pwa/assets/{mdx-DeW5qzOU.js → mdx-TsWwhlKp.js} +1 -1
  105. package/src/client/dist/pwa/assets/{monaco-contributions-Be_o6s3m.js → monaco-contributions-SMzL7GRn.js} +1 -1
  106. package/src/client/dist/pwa/assets/monaco.contribution-sN2BZtSW.js +2 -0
  107. package/src/client/dist/pwa/assets/network-auth-DXsDKXrM.js +1 -0
  108. package/src/client/dist/pwa/assets/{notify-theme-uhSG2r09.js → notify-theme-BXJypfo4.js} +1 -1
  109. package/src/client/dist/pwa/assets/{permissionModes-Cc5VaOdC.js → permissionModes-DLWiBfdb.js} +1 -1
  110. package/src/client/dist/pwa/assets/{private.use-form-vxvbh_VN.js → private.use-form-DY1BkePL.js} +1 -1
  111. package/src/client/dist/pwa/assets/{project-color-BQbOnYBN.js → project-color-CBLQt6bM.js} +1 -1
  112. package/src/client/dist/pwa/assets/{python-C1v3VovI.js → python-CKHf2s-D.js} +1 -1
  113. package/src/client/dist/pwa/assets/{razor-DMEmKSdO.js → razor-D_5X4O5M.js} +1 -1
  114. package/src/client/dist/pwa/assets/reactivity.esm-bundler-DY1JkAEA.js +1 -0
  115. package/src/client/dist/pwa/assets/runtime-core.esm-bundler-Bqg71Vll.js +1 -0
  116. package/src/client/dist/pwa/assets/{typescript-rKyiSQID.js → typescript-D62emDGo.js} +1 -1
  117. package/src/client/dist/pwa/assets/use-checkbox-v4aAbE6K.js +1 -0
  118. package/src/client/dist/pwa/assets/use-dark-BHObfh0O.js +1 -0
  119. package/src/client/dist/pwa/assets/use-id-BrdYXce0.js +1 -0
  120. package/src/client/dist/pwa/assets/use-is-mobile-CDB_rzM9.js +1 -0
  121. package/src/client/dist/pwa/assets/use-search-index-status-bIKbEP5q.js +1 -0
  122. package/src/client/dist/pwa/assets/{use-slide-transition-C5eDGOmu.js → use-slide-transition-B_Nu6u-t.js} +1 -1
  123. package/src/client/dist/pwa/assets/use-tours-CTNYIX-Q.js +2 -0
  124. package/src/client/dist/pwa/assets/use-worktree-restore-D69uzYON.js +1 -0
  125. package/src/client/dist/pwa/assets/workspace-templates-CSwgMrUf.js +1 -0
  126. package/src/client/dist/pwa/assets/{xml-U_pDcywM.js → xml-Kyg_K_5X.js} +1 -1
  127. package/src/client/dist/pwa/assets/{yaml-CRCd_ET9.js → yaml-DC__PKjj.js} +1 -1
  128. package/src/client/dist/pwa/index.html +10 -10
  129. package/src/client/dist/pwa/sw.js +1 -1
  130. package/src/mcp-server/README.md +23 -0
  131. package/src/mcp-server/kobo-tasks-handlers.ts +24 -9
  132. package/src/mcp-server/kobo-tasks-server.ts +52 -3
  133. package/src/mcp-server/memory-client.ts +52 -0
  134. package/src/mcp-server/workspace-dialogue-client.ts +4 -1
  135. package/src/client/dist/pwa/assets/ActivityFeed-BO1mKMJ0.js +0 -1
  136. package/src/client/dist/pwa/assets/ActivityFeed-ZTxXVmNM.css +0 -1
  137. package/src/client/dist/pwa/assets/ChangelogPage-BXNz7PGb.js +0 -1
  138. package/src/client/dist/pwa/assets/ClosePopup-C1a82pL9.js +0 -1
  139. package/src/client/dist/pwa/assets/CreatePage-6_AP5zso.js +0 -2
  140. package/src/client/dist/pwa/assets/CreatePage-CMyl2j8Z.css +0 -1
  141. package/src/client/dist/pwa/assets/DashboardPage-BKCrV6u0.js +0 -1
  142. package/src/client/dist/pwa/assets/DiffViewer-BMzrb9fB.js +0 -8
  143. package/src/client/dist/pwa/assets/DocumentsPanel-CqGg38Oi.js +0 -1
  144. package/src/client/dist/pwa/assets/GitPanel-DRzhrs_V.js +0 -3
  145. package/src/client/dist/pwa/assets/HealthPage-DWotmfkh.js +0 -1
  146. package/src/client/dist/pwa/assets/MainLayout-fRVZ01LN.js +0 -2
  147. package/src/client/dist/pwa/assets/QBadge-rGILsUYl.js +0 -1
  148. package/src/client/dist/pwa/assets/QBanner-mzrnn82R.js +0 -1
  149. package/src/client/dist/pwa/assets/QBtn-b_baQtAt.js +0 -1
  150. package/src/client/dist/pwa/assets/QBtnDropdown-BGGvQIvH.js +0 -1
  151. package/src/client/dist/pwa/assets/QBtnGroup-CUmAgBV8.js +0 -1
  152. package/src/client/dist/pwa/assets/QBtnToggle-COL46j6W.js +0 -1
  153. package/src/client/dist/pwa/assets/QChip-Chu7r6RZ.js +0 -1
  154. package/src/client/dist/pwa/assets/QExpansionItem-C2XXHOHk.js +0 -1
  155. package/src/client/dist/pwa/assets/QItemSection-CR3Kfibl.js +0 -1
  156. package/src/client/dist/pwa/assets/QList-DnezW6gW.js +0 -1
  157. package/src/client/dist/pwa/assets/QMarkupTable-wuDf50Oh.js +0 -1
  158. package/src/client/dist/pwa/assets/QPage-BCDXjfVj.js +0 -1
  159. package/src/client/dist/pwa/assets/QScrollArea-BnmQ9US7.js +0 -1
  160. package/src/client/dist/pwa/assets/QSelect-BskTzVCM.js +0 -1
  161. package/src/client/dist/pwa/assets/QSpinnerDots-BsKmccpX.js +0 -1
  162. package/src/client/dist/pwa/assets/QTooltip-CO84H0cq.js +0 -1
  163. package/src/client/dist/pwa/assets/SchedulePanel-CPirTYw5.js +0 -1
  164. package/src/client/dist/pwa/assets/SearchPage-CnT0-Hpe.js +0 -1
  165. package/src/client/dist/pwa/assets/SettingsPage-CpykRKq2.css +0 -1
  166. package/src/client/dist/pwa/assets/SettingsPage-DCMZL7GO.js +0 -9
  167. package/src/client/dist/pwa/assets/SplitWorkspacePage-DwWsD7f5.js +0 -1
  168. package/src/client/dist/pwa/assets/ToolCallItem-CjXWiKJc.js +0 -8
  169. package/src/client/dist/pwa/assets/TouchPan-6fI8xFPq.js +0 -1
  170. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-CZxW7QSq.js +0 -1
  171. package/src/client/dist/pwa/assets/WorkspacePage-B0wCQdev.js +0 -4
  172. package/src/client/dist/pwa/assets/build-path-tree-Bd50EZMW.js +0 -1
  173. package/src/client/dist/pwa/assets/custom-sounds-DoPDmcY5.js +0 -1
  174. package/src/client/dist/pwa/assets/de-BPtzBQu0.js +0 -17
  175. package/src/client/dist/pwa/assets/efforts-CDsBbk8o.js +0 -9
  176. package/src/client/dist/pwa/assets/es-BoNOfG0w.js +0 -17
  177. package/src/client/dist/pwa/assets/expand-template-D6zFPzzB.js +0 -1
  178. package/src/client/dist/pwa/assets/formatters-DCjBZ47F.js +0 -1
  179. package/src/client/dist/pwa/assets/fr-Bu92fK5U.js +0 -17
  180. package/src/client/dist/pwa/assets/i18n-DKj-umtn.js +0 -19
  181. package/src/client/dist/pwa/assets/i18n-DtmbeJu8.js +0 -1
  182. package/src/client/dist/pwa/assets/index-BPmUmc6D.js +0 -2
  183. package/src/client/dist/pwa/assets/it-CrA4Q7oc.js +0 -17
  184. package/src/client/dist/pwa/assets/latest-request-CBPb8UWQ.js +0 -1
  185. package/src/client/dist/pwa/assets/monaco.contribution-VUGNbVME.js +0 -2
  186. package/src/client/dist/pwa/assets/network-auth-CSx0jS5X.js +0 -1
  187. package/src/client/dist/pwa/assets/preload-helper-DjzSQ1t3.js +0 -1
  188. package/src/client/dist/pwa/assets/reactivity.esm-bundler-tuEvQ47f.js +0 -1
  189. package/src/client/dist/pwa/assets/runtime-core.esm-bundler-DOiZcasU.js +0 -1
  190. package/src/client/dist/pwa/assets/use-checkbox-BqDMQ6x7.js +0 -1
  191. package/src/client/dist/pwa/assets/use-id-b4A2I8LB.js +0 -1
  192. package/src/client/dist/pwa/assets/use-is-mobile-DLIZxEo9.js +0 -1
  193. package/src/client/dist/pwa/assets/use-search-index-status-BL3cb04x.js +0 -1
  194. package/src/client/dist/pwa/assets/use-tours-Dum-bOyQ.js +0 -2
  195. package/src/client/dist/pwa/assets/use-worktree-restore-BQyoz3Qa.js +0 -1
  196. package/src/client/dist/pwa/assets/workspace-templates-YRwFjkUh.js +0 -1
@@ -0,0 +1 @@
1
+ import{M as e,lt as t,pt as n}from"./reactivity.esm-bundler-DY1JkAEA.js";import{L as r,Y as i,_ as a,d as o,f as s,g as c,l,y as u}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{d}from"./dom-BtYTvLeN.js";import{it as f,qt as p,rt as m}from"./index-DPN7dSDH.js";import{a as h}from"./use-tours-CTNYIX-Q.js";import{t as g}from"./QTooltip-CgVCYatx.js";import{t as _}from"./QChip-Be16M4Ig.js";function v(e){let t=e.replace(/\u001b\[\d+m/g,``).trim();return/^warning:/i.test(t)}function y(e,t,n){for(let r=e.length-1;r>=0;r--){let i=e[r];if(i.kind!==`error`||i.category===`quota`||i.category===`other`&&v(i.message)||i.category===`other`&&(i.code===`result_drain_timeout`||i.code===`stream_idle_timeout`||!i.code&&(i.message===`Session force-ended: the SDK generator stayed open after its final result (drain watchdog).`||i.message===`Session force-ended by the liveness watchdog: no SDK activity within the deadline. If the agent was legitimately busy, this is a bug worth reporting.`)))continue;let a=t[r]??null;if(!(a&&n.has(a)))return{event:i,eventId:a}}return null}function b(e){switch(e?.reason){case`completed`:return`session.endedCompleted`;case`killed`:return`session.endedKilled`;case`error`:return`session.endedError`;case`watchdog`:return`session.endedWatchdog`;default:return`session.ended`}}function x(e){return e?.reason===`completed`}function S(){return{count:0,lastEvent:null,items:[],textItems:new Map,toolItems:new Map}}function C(e,t,n=!0,r){return w(S(),e,t,n,r)}function w(e,t,n,r=!0,i){let a=e.count>0&&t.length>=e.count&&t[e.count-1]===e.lastEvent,o=a?null:e.items;if(a||(e.count=0,e.lastEvent=null,e.items=[],e.textItems=new Map,e.toolItems=new Map),D(e,t,n,i,e.count,t.length),e.count=t.length,e.lastEvent=t.length>0?t[t.length-1]:null,O(e,r),o?.length){let t=new Map(o.map(e=>[JSON.stringify(e),e]));for(let n=0;n<e.items.length;n++){let r=e.items[n],i=t.get(JSON.stringify(r));if(i){if(e.items[n]=i,i.type===`text`){let t=e.textItems.get(i.messageId);t&&(t.item=i)}else if(i.type===`tool`){let t=e.toolItems.get(i.toolCallId);t&&(t.item=i)}}}}return e.items}function T(e,t,n){e[t.index]=n,t.item=n}function E(e,t){return!t||!e?e:[...e,t]}function D(e,t,n,r,i,a){let{items:o,textItems:s,toolItems:c}=e;for(let e=i;e<a;e++){let i=t[e],a=n?.[e],l=r?.[e]??void 0;switch(i.kind){case`message:text`:{let e=s.get(i.messageId);if(e)T(o,e,{...e.item,text:e.item.text+i.text,streaming:i.streaming,origin:i.origin??e.item.origin,eventIds:E(e.item.eventIds,l)});else{let e={type:`text`,messageId:i.messageId,text:i.text,streaming:i.streaming,origin:i.origin,ts:a,eventIds:l?[l]:void 0};s.set(i.messageId,{item:e,index:o.length}),o.push(e)}break}case`message:end`:{let e=s.get(i.messageId);e?.item.streaming&&T(o,e,{...e.item,streaming:!1});break}case`message:thinking`:o.push({type:`thinking`,messageId:i.messageId,text:i.text,origin:i.origin,ts:a,eventIds:l?[l]:void 0});break;case`tool:call`:{let e={type:`tool`,toolCallId:i.toolCallId,name:i.name,input:i.input,origin:i.origin,ts:a,eventIds:l?[l]:void 0};c.set(i.toolCallId,{item:e,index:o.length}),o.push(e);break}case`tool:result`:{let e=c.get(i.toolCallId);e&&T(o,e,{...e.item,result:{output:i.output,isError:i.isError},eventIds:E(e.item.eventIds,l)});break}case`session:started`:o.push({type:`session`,kind:`started`,detail:{engineSessionId:i.engineSessionId,model:i.model},ts:a,eventIds:l?[l]:void 0});break;case`session:ended`:o.push({type:`session`,kind:`ended`,detail:{reason:i.reason,exitCode:i.exitCode},ts:a,eventIds:l?[l]:void 0});break;case`session:compacted`:o.push({type:`session`,kind:`compacted`,ts:a,eventIds:l?[l]:void 0});break;case`error`:if(i.category===`quota`||i.category===`other`&&v(i.message))break;o.push({type:`error`,category:i.category,message:i.message,ts:a,eventIds:l?[l]:void 0})}}}function O(e,t){let{items:n}=e,r=-1;for(let t=0;t<n.length;t++){let i=n[t];i.type===`text`&&i.streaming&&(r>=0&&k(e,r),r=t)}r>=0&&!t&&k(e,r)}function k(e,t){let n=e.items[t];if(n.type!==`text`||!n.streaming)return;let r={...n,streaming:!1};e.items[t]=r;let i=e.textItems.get(n.messageId);i&&i.index===t&&(i.item=r)}function A(e){return e.ts??`￿`}function j(e){for(let t=1;t<e.length;t++)if(A(e[t-1])>A(e[t]))return!1;return!0}function M(e,t){if(!j(e)||!j(t)){let n=[...e,...t];return n.sort((e,t)=>{let n=A(e),r=A(t);return n===r?0:n<r?-1:1}),n}let n=[],r=0,i=0;for(;r<e.length&&i<t.length;)n.push(A(e[r])<=A(t[i])?e[r++]:t[i++]);for(;r<e.length;)n.push(e[r++]);for(;i<t.length;)n.push(t[i++]);return n}function N(e,t){if(t.length===0)return e;let n=M(e,t.map(e=>({type:`user`,content:e.content,sender:e.sender,...e.source?{source:e.source}:{},ts:e.ts,eventIds:e.eventIds}))),r;for(let e of n)e.type===`user`&&e.sender!==`system-prompt`&&e.ts&&(!r||e.ts>r)&&(r=e.ts);if(r)for(let t=0;t<n.length;t++){let i=n[t];if(i.type!==`text`||!i.streaming||i.ts&&i.ts>=r)continue;let a={...i,streaming:!1};n[t]=a;let o=e.indexOf(i);o!==-1&&(e[o]=a)}return n}var P={"claude-code":!0,codex:!0};function F(e){return e?P[e]??!0:!0}var I={"claude-code":!0,codex:!0};function L(e){return e?I[e]??!0:!0}var R={"claude-code":!0,codex:!0};function z(e){return e?R[e]??!1:!1}var B={"claude-code":!0,codex:!1};function V(e){return e?B[e]??!1:!1}function H(e){let t=e=>Math.max(Date.parse(e.startedAt),Date.parse(e.endedAt??e.startedAt));return e.reduce((e,n)=>(n.activationOrder??0)<0?e:e?n.status===`running`==(e.status===`running`)?(n.activationOrder??0)===(e.activationOrder??0)?t(n)>t(e)?n:e:(n.activationOrder??0)>(e.activationOrder??0)?n:e:n.status===`running`?n:e:n,void 0)}var U=h(u({__name:`AutoLoopChip`,props:{workspace:{default:null}},setup(u){let d=u,{t:m}=p(),h=f(),v=l(()=>d.workspace??h.selectedWorkspace),y=l(()=>v.value?.id??null),b=l(()=>y.value?h.autoLoopStates[y.value]??null:null),x=l(()=>!!b.value?.auto_loop),S=l(()=>!!b.value?.auto_loop_ready),C=l(()=>y.value!==null&&h.selectedWorkspaceId===y.value),w=l(()=>C.value?h.tasks.filter(e=>e.status===`done`).length:b.value?.tasks_done??0),T=l(()=>C.value?h.tasks.length:b.value?.tasks_total??0);return(l,u)=>x.value&&(b.value?.state===`blocked`||b.value?.state===`waiting`)?(r(),o(_,{key:0,dense:``,square:``,size:`sm`,class:t([`q-ml-sm auto-loop-chip`,{"auto-loop-chip--blocked":b.value.state===`blocked`}])},{default:i(()=>[c(n(e(m)(`autoLoop.toggle`))+` · `+n(e(m)(`autoLoop.status.${b.value.state}`)),1)]),_:1},8,[`class`])):x.value&&!S.value?(r(),o(_,{key:1,dense:``,square:``,size:`sm`,color:`primary`,"text-color":`white`,icon:`hourglass_top`,class:`q-ml-sm`},{default:i(()=>[c(n(e(m)(`autoLoop.preparing`))+` `,1),a(g,null,{default:i(()=>[c(n(e(m)(`autoLoop.preparingTooltip`)),1)]),_:1})]),_:1})):x.value?(r(),o(_,{key:2,dense:``,square:``,size:`sm`,color:`amber-9`,"text-color":`white`,icon:`autorenew`,class:`q-ml-sm`},{default:i(()=>[c(n(e(m)(`autoLoop.progress`,{done:w.value,total:T.value})),1)]),_:1})):s(``,!0)}}),[[`__scopeId`,`data-v-c60d5ae9`]]);function W(e,t){if(e===``)return 0;let n=e.toLowerCase(),r=t.toLowerCase(),i=0,a=0,o=-2;for(let e of n){let t=-1;for(let n=a;n<r.length;n++)if(r[n]===e){t=n;break}if(t===-1)return null;i+=t===o+1?5:1;let n=t>0?r[t-1]:``;(t===0||n===`/`||n===`-`||n===`_`||n===`.`)&&(i+=2),o=t,a=t+1}return i-t.length*.01}function G(e,t,n,r=W){if(n<=0)return[];let i=[];for(let a of t){let t=r(e,a);if(t===null||i.length===n&&t<=i[n-1].score)continue;let o=i.length;for(;o>0&&i[o-1].score<t;)o--;i.splice(o,0,{item:a,score:t}),i.length>n&&i.pop()}return i.map(e=>e.item)}var K=new Set([`not-found`,`not-purged`,`workspace-busy`,`worktree-not-owned`,`project-unavailable`,`path-conflict`,`branch-in-use`,`recovery-source-unavailable`,`git-failed`]),q=`https://github.com/loicngr/kobo/blob/develop/CONFIGURATION.md#restoring-a-purged-workspace`;function J(){let e=f(),t=d(),{t:n}=p();async function r(r){if(!e.restoringWorktreeIds.includes(r))try{await e.restoreWorktree(r),t.notify({type:`positive`,message:n(`workspacePage.worktreeRestoreSuccess`),position:`top`})}catch(e){let r=e instanceof m&&e.code&&K.has(e.code)?e.code:`git-failed`;t.notify({type:`negative`,message:n(`workspacePage.restoreError.${r}`),position:`top`,actions:[{label:n(`common.details`),handler:()=>window.open(q,`_blank`,`noopener,noreferrer`)}]})}}return{restoreWorktree:r}}export{H as a,V as c,C as d,w as f,b as g,y as h,U as i,F as l,N as m,W as n,z as o,x as p,G as r,L as s,J as t,S as u};
@@ -0,0 +1 @@
1
+ import{M as e,pt as t}from"./reactivity.esm-bundler-DY1JkAEA.js";import{L as n,d as r,l as i,p as a,r as o,u as s,y as c,z as l}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{It as u,Jt as d,j as f,qt as p}from"./index-DPN7dSDH.js";import{t as m}from"./QSelect-CPE9LsIn.js";var h=[`aria-label`],g={class:`text-subtitle2 q-mb-xs`},_={class:`text-caption`},v=c({__name:`WorkflowPolicyEditor`,props:{modelValue:{},inherit:{type:Boolean}},emits:[`update:modelValue`],setup(c,{emit:u}){let d=c,v=u,{t:y}=p(),b=i(()=>[...d.inherit?[{label:y(`workflow.inherit`),value:``}]:[],{label:y(`workflow.manual`),value:`manual`},{label:y(`workflow.automatic`),value:`automatic`}]);function x(e,t){let n={...d.modelValue};t?n[e]=t:delete n[e],v(`update:modelValue`,n)}return(i,u)=>(n(),a(`section`,{class:`q-mb-md`,"aria-label":i.$t(`workflow.title`)},[s(`div`,g,t(i.$t(`workflow.title`)),1),s(`p`,_,t(i.$t(`workflow.hint`)),1),(n(!0),a(o,null,l(e(f),e=>(n(),r(m,{key:e,class:`q-mb-sm`,outlined:``,dense:``,label:i.$t(`workflow.${e}`),"model-value":c.modelValue[e]??``,options:b.value,"emit-value":``,"map-options":``,"onUpdate:modelValue":t=>x(e,t)},null,8,[`label`,`model-value`,`options`,`onUpdate:modelValue`]))),128))],8,h))}}),y=d(`workspace-templates`,{state:()=>({templates:[],loading:!1,loaded:!1}),getters:{findByName:e=>t=>{let n=t.trim().toLowerCase();if(n)return e.templates.find(e=>e.name.toLowerCase()===n)}},actions:{async fetchTemplates(){if(!this.loading){this.loading=!0;try{let e=await u(`/api/workspace-templates`);this.templates=e.templates,this.loaded=!0}catch(e){console.error(`[workspace-templates store] fetchTemplates failed:`,e)}finally{this.loading=!1}}},async createTemplate(e){let{template:t}=await u(`/api/workspace-templates`,{method:`POST`,body:e});return this.templates.push(t),t},async updateTemplate(e,t){let{template:n}=await u(`/api/workspace-templates/${encodeURIComponent(e)}`,{method:`PUT`,body:t}),r=this.templates.findIndex(t=>t.id===e);return r>=0?this.templates[r]=n:this.templates.push(n),n},async deleteTemplate(e){await u(`/api/workspace-templates/${encodeURIComponent(e)}`,{method:`DELETE`}),this.templates=this.templates.filter(t=>t.id!==e)}}});export{v as n,y as t};
@@ -1 +1 @@
1
- import{n as e}from"./editor.api-CKcTKXcM.js";var t={comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<`,`>`]],autoClosingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],surroundingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],onEnterRules:[{beforeText:RegExp(`<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}]},n={defaultToken:``,tokenPostfix:`.xml`,ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,``],{include:`@whitespace`},[/(<)(@qualifiedName)/,[{token:`delimiter`},{token:`tag`,next:`@tag`}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:`delimiter`},{token:`tag`},``,{token:`delimiter`}]],[/(<\?)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/(<\!)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/<\!\[CDATA\[/,{token:`delimiter.cdata`,next:`@cdata`}],[/&\w+;/,`string.escape`]],cdata:[[/[^\]]+/,``],[/\]\]>/,{token:`delimiter.cdata`,next:`@pop`}],[/\]/,``]],tag:[[/[ \t\r\n]+/,``],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,[`attribute.name`,``,`attribute.value`]],[/@qualifiedName/,`attribute.name`],[/\?>/,{token:`delimiter`,next:`@pop`}],[/(\/)(>)/,[{token:`tag`},{token:`delimiter`,next:`@pop`}]],[/>/,{token:`delimiter`,next:`@pop`}]],whitespace:[[/[ \t\r\n]+/,``],[/<!--/,{token:`comment`,next:`@comment`}]],comment:[[/[^<\-]+/,`comment.content`],[/-->/,{token:`comment`,next:`@pop`}],[/<!--/,`comment.content.invalid`],[/[<\-]/,`comment.content`]]}};export{t as conf,n as language};
1
+ import{n as e}from"./editor.api-DDwuA_C9.js";var t={comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<`,`>`]],autoClosingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],surroundingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],onEnterRules:[{beforeText:RegExp(`<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}]},n={defaultToken:``,tokenPostfix:`.xml`,ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,``],{include:`@whitespace`},[/(<)(@qualifiedName)/,[{token:`delimiter`},{token:`tag`,next:`@tag`}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:`delimiter`},{token:`tag`},``,{token:`delimiter`}]],[/(<\?)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/(<\!)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/<\!\[CDATA\[/,{token:`delimiter.cdata`,next:`@cdata`}],[/&\w+;/,`string.escape`]],cdata:[[/[^\]]+/,``],[/\]\]>/,{token:`delimiter.cdata`,next:`@pop`}],[/\]/,``]],tag:[[/[ \t\r\n]+/,``],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,[`attribute.name`,``,`attribute.value`]],[/@qualifiedName/,`attribute.name`],[/\?>/,{token:`delimiter`,next:`@pop`}],[/(\/)(>)/,[{token:`tag`},{token:`delimiter`,next:`@pop`}]],[/>/,{token:`delimiter`,next:`@pop`}]],whitespace:[[/[ \t\r\n]+/,``],[/<!--/,{token:`comment`,next:`@comment`}]],comment:[[/[^<\-]+/,`comment.content`],[/-->/,{token:`comment`,next:`@pop`}],[/<!--/,`comment.content.invalid`],[/[<\-]/,`comment.content`]]}};export{t as conf,n as language};
@@ -1 +1 @@
1
- import{n as e}from"./editor.api-CKcTKXcM.js";var t={comments:{lineComment:`#`},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],folding:{offSide:!0},onEnterRules:[{beforeText:/:\s*$/,action:{indentAction:e.IndentAction.Indent}}]},n={tokenPostfix:`.yaml`,brackets:[{token:`delimiter.bracket`,open:`{`,close:`}`},{token:`delimiter.square`,open:`[`,close:`]`}],keywords:[`true`,`True`,`TRUE`,`false`,`False`,`FALSE`,`null`,`Null`,`Null`,`~`],numberInteger:/(?:0|[+-]?[0-9]+)/,numberFloat:/(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/,numberOctal:/0o[0-7]+/,numberHex:/0x[0-9a-fA-F]+/,numberInfinity:/[+-]?\.(?:inf|Inf|INF)/,numberNaN:/\.(?:nan|Nan|NAN)/,numberDate:/\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/,escapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,tokenizer:{root:[{include:`@whitespace`},{include:`@comment`},[/%[^ ]+.*$/,`meta.directive`],[/---/,`operators.directivesEnd`],[/\.{3}/,`operators.documentEnd`],[/[-?:](?= )/,`operators`],{include:`@anchor`},{include:`@tagHandle`},{include:`@flowCollections`},{include:`@blockStyle`},[/@numberInteger(?![ \t]*\S+)/,`number`],[/@numberFloat(?![ \t]*\S+)/,`number.float`],[/@numberOctal(?![ \t]*\S+)/,`number.octal`],[/@numberHex(?![ \t]*\S+)/,`number.hex`],[/@numberInfinity(?![ \t]*\S+)/,`number.infinity`],[/@numberNaN(?![ \t]*\S+)/,`number.nan`],[/@numberDate(?![ \t]*\S+)/,`number.date`],[/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/,[`type`,`white`,`operators`,`white`]],{include:`@flowScalars`},[/.+?(?=(\s+#|$))/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],object:[{include:`@whitespace`},{include:`@comment`},[/\}/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],[/:(?= )/,`operators`],[/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/,`type`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\},]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],array:[{include:`@whitespace`},{include:`@comment`},[/\]/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\],]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],multiString:[[/^( +).+$/,`string`,`@multiStringContinued.$1`]],multiStringContinued:[[/^( *).+$/,{cases:{"$1==$S2":`string`,"@default":{token:`@rematch`,next:`@popall`}}}]],whitespace:[[/[ \t\r\n]+/,`white`]],comment:[[/#.*$/,`comment`]],flowCollections:[[/\[/,`@brackets`,`@array`],[/\{/,`@brackets`,`@object`]],flowScalars:[[/"([^"\\]|\\.)*$/,`string.invalid`],[/'([^'\\]|\\.)*$/,`string.invalid`],[/'[^']*'/,`string`],[/"/,`string`,`@doubleQuotedString`]],doubleQuotedString:[[/[^\\"]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/"/,`string`,`@pop`]],blockStyle:[[/[>|][0-9]*[+-]?$/,`operators`,`@multiString`]],flowNumber:[[/@numberInteger(?=[ \t]*[,\]\}])/,`number`],[/@numberFloat(?=[ \t]*[,\]\}])/,`number.float`],[/@numberOctal(?=[ \t]*[,\]\}])/,`number.octal`],[/@numberHex(?=[ \t]*[,\]\}])/,`number.hex`],[/@numberInfinity(?=[ \t]*[,\]\}])/,`number.infinity`],[/@numberNaN(?=[ \t]*[,\]\}])/,`number.nan`],[/@numberDate(?=[ \t]*[,\]\}])/,`number.date`]],tagHandle:[[/\![^ ]*/,`tag`]],anchor:[[/[&*][^ ]+/,`namespace`]]}};export{t as conf,n as language};
1
+ import{n as e}from"./editor.api-DDwuA_C9.js";var t={comments:{lineComment:`#`},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],folding:{offSide:!0},onEnterRules:[{beforeText:/:\s*$/,action:{indentAction:e.IndentAction.Indent}}]},n={tokenPostfix:`.yaml`,brackets:[{token:`delimiter.bracket`,open:`{`,close:`}`},{token:`delimiter.square`,open:`[`,close:`]`}],keywords:[`true`,`True`,`TRUE`,`false`,`False`,`FALSE`,`null`,`Null`,`Null`,`~`],numberInteger:/(?:0|[+-]?[0-9]+)/,numberFloat:/(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/,numberOctal:/0o[0-7]+/,numberHex:/0x[0-9a-fA-F]+/,numberInfinity:/[+-]?\.(?:inf|Inf|INF)/,numberNaN:/\.(?:nan|Nan|NAN)/,numberDate:/\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/,escapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,tokenizer:{root:[{include:`@whitespace`},{include:`@comment`},[/%[^ ]+.*$/,`meta.directive`],[/---/,`operators.directivesEnd`],[/\.{3}/,`operators.documentEnd`],[/[-?:](?= )/,`operators`],{include:`@anchor`},{include:`@tagHandle`},{include:`@flowCollections`},{include:`@blockStyle`},[/@numberInteger(?![ \t]*\S+)/,`number`],[/@numberFloat(?![ \t]*\S+)/,`number.float`],[/@numberOctal(?![ \t]*\S+)/,`number.octal`],[/@numberHex(?![ \t]*\S+)/,`number.hex`],[/@numberInfinity(?![ \t]*\S+)/,`number.infinity`],[/@numberNaN(?![ \t]*\S+)/,`number.nan`],[/@numberDate(?![ \t]*\S+)/,`number.date`],[/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/,[`type`,`white`,`operators`,`white`]],{include:`@flowScalars`},[/.+?(?=(\s+#|$))/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],object:[{include:`@whitespace`},{include:`@comment`},[/\}/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],[/:(?= )/,`operators`],[/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/,`type`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\},]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],array:[{include:`@whitespace`},{include:`@comment`},[/\]/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\],]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],multiString:[[/^( +).+$/,`string`,`@multiStringContinued.$1`]],multiStringContinued:[[/^( *).+$/,{cases:{"$1==$S2":`string`,"@default":{token:`@rematch`,next:`@popall`}}}]],whitespace:[[/[ \t\r\n]+/,`white`]],comment:[[/#.*$/,`comment`]],flowCollections:[[/\[/,`@brackets`,`@array`],[/\{/,`@brackets`,`@object`]],flowScalars:[[/"([^"\\]|\\.)*$/,`string.invalid`],[/'([^'\\]|\\.)*$/,`string.invalid`],[/'[^']*'/,`string`],[/"/,`string`,`@doubleQuotedString`]],doubleQuotedString:[[/[^\\"]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/"/,`string`,`@pop`]],blockStyle:[[/[>|][0-9]*[+-]?$/,`operators`,`@multiString`]],flowNumber:[[/@numberInteger(?=[ \t]*[,\]\}])/,`number`],[/@numberFloat(?=[ \t]*[,\]\}])/,`number.float`],[/@numberOctal(?=[ \t]*[,\]\}])/,`number.octal`],[/@numberHex(?=[ \t]*[,\]\}])/,`number.hex`],[/@numberInfinity(?=[ \t]*[,\]\}])/,`number.infinity`],[/@numberNaN(?=[ \t]*[,\]\}])/,`number.nan`],[/@numberDate(?=[ \t]*[,\]\}])/,`number.date`]],tagHandle:[[/\![^ ]*/,`tag`]],anchor:[[/[&*][^ ]+/,`namespace`]]}};export{t as conf,n as language};
@@ -1,13 +1,13 @@
1
- <!DOCTYPE html><html lang=en><head><title>Kōbō</title><link rel=icon type=image/svg+xml href=/favicon.svg><meta charset=utf-8><meta name=description content="Kōbō — multi-workspace agent manager for Claude Code"><meta name=format-detection content="telephone=no"><meta name=msapplication-tap-highlight content=no><meta name=viewport content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"> <script type="module" crossorigin src="/assets/index-BPmUmc6D.js"></script>
2
- <link rel="modulepreload" crossorigin href="/assets/reactivity.esm-bundler-tuEvQ47f.js">
3
- <link rel="modulepreload" crossorigin href="/assets/runtime-core.esm-bundler-DOiZcasU.js">
4
- <link rel="modulepreload" crossorigin href="/assets/QBtn-b_baQtAt.js">
1
+ <!DOCTYPE html><html lang=en><head><title>Kōbō</title><link rel=icon type=image/svg+xml href=/favicon.svg><meta charset=utf-8><meta name=description content="Kōbō — multi-workspace agent manager for Claude Code"><meta name=format-detection content="telephone=no"><meta name=msapplication-tap-highlight content=no><meta name=viewport content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"> <script type="module" crossorigin src="/assets/index-DPN7dSDH.js"></script>
2
+ <link rel="modulepreload" crossorigin href="/assets/reactivity.esm-bundler-DY1JkAEA.js">
3
+ <link rel="modulepreload" crossorigin href="/assets/runtime-core.esm-bundler-Bqg71Vll.js">
4
+ <link rel="modulepreload" crossorigin href="/assets/dom-BtYTvLeN.js">
5
+ <link rel="modulepreload" crossorigin href="/assets/QBtn-BUSdPaf4.js">
6
+ <link rel="modulepreload" crossorigin href="/assets/use-dark-BHObfh0O.js">
7
+ <link rel="modulepreload" crossorigin href="/assets/detached-fullscreen-Du3TcYdX.js">
5
8
  <link rel="modulepreload" crossorigin href="/assets/defineProperty-BbfpZ9Tg.js">
6
- <link rel="modulepreload" crossorigin href="/assets/preload-helper-DjzSQ1t3.js">
7
- <link rel="modulepreload" crossorigin href="/assets/i18n-DKj-umtn.js">
8
- <link rel="modulepreload" crossorigin href="/assets/latest-request-CBPb8UWQ.js">
9
- <link rel="modulepreload" crossorigin href="/assets/use-id-b4A2I8LB.js">
10
- <link rel="modulepreload" crossorigin href="/assets/private.use-form-vxvbh_VN.js">
11
- <link rel="modulepreload" crossorigin href="/assets/use-checkbox-BqDMQ6x7.js">
9
+ <link rel="modulepreload" crossorigin href="/assets/use-id-BrdYXce0.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/private.use-form-DY1BkePL.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/use-checkbox-v4aAbE6K.js">
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-C8zAZ-k-.css">
13
13
  <link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#6c63ff"><link rel="mask-icon" href="/icons/safari-pinned-tab.svg" color="#6c63ff"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="Kōbō"><link rel="apple-touch-icon" href="/icons/apple-icon-120x120.png"><link rel="apple-touch-icon" sizes="152x152" href="/icons/apple-icon-152x152.png"><link rel="apple-touch-icon" sizes="167x167" href="/icons/apple-icon-167x167.png"><link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-icon-180x180.png"></head><body><div id=q-app></div></body></html>
@@ -1 +1 @@
1
- if(!self.define){let s,e={};const a=(a,r)=>(a=new URL(a+".js",r).href,e[a]||new Promise(e=>{if("document"in self){const s=document.createElement("script");s.src=a,s.onload=e,document.head.appendChild(s)}else s=a,importScripts(a),e()}).then(()=>{let s=e[a];if(!s)throw new Error(`Module ${a} didn’t register its module`);return s}));self.define=(r,i)=>{const c=s||("document"in self?document.currentScript.src:"")||location.href;if(e[c])return;let d={};const b=s=>a(s,c),f={module:{uri:c},exports:d,require:b};e[c]=Promise.all(r.map(s=>f[s]||b(s))).then(s=>(i(...s),d))}}define(["./workbox-778a14ff"],function(s){"use strict";s.setCacheNameDetails({prefix:"kobo-client"}),self.addEventListener("message",s=>{s.data&&"SKIP_WAITING"===s.data.type&&self.skipWaiting()}),s.clientsClaim(),s.precacheAndRoute([{url:"manifest.json",revision:"73f02ba4eb4414fb70bbe5ca76cc9580"},{url:"index.html",revision:"2c07184cf17bff0ec963e1393fd78f0f"},{url:"favicon.svg",revision:"9d89ef10d49f14d08c25cfca9bd4ea75"},{url:"sounds/ready.wav",revision:"cd00e80e7a9d443a0e95272bb22bed6e"},{url:"sounds/neutral.wav",revision:"cb264f6e7eb97388229e82fe7d6fa5cf"},{url:"fonts/GeistMono-Variable.woff2",revision:"308360d8a547331fd40bc09a7145d59a"},{url:"fonts/Geist-Variable.woff2",revision:"dfa48d5a853753289194436953e3f202"},{url:"fonts/GEIST-LICENSE.txt",revision:"563d13575f813953c3151e1ecce3b76f"},{url:"assets/yaml-CRCd_ET9.js",revision:"3c61b44209966bac50d8fd95bcbad1b3"},{url:"assets/xml-U_pDcywM.js",revision:"a2f86eea446cd3543e7c922c4b37da2b"},{url:"assets/workspace-templates-YRwFjkUh.js",revision:"f74d3cfbbb0c8acace14b3c05720193f"},{url:"assets/workspace-page-layout-Dw9NhZsL.js",revision:"0c933f7b6c6bf3c90ea1875abad85392"},{url:"assets/wgsl-DpFanUEy.js",revision:"4cf32279d7c6a601611a6e32a14f3b1e"},{url:"assets/vb-DV3o63ZY.js",revision:"a5b3a756d667f5e4a5da6da4013d7341"},{url:"assets/use-worktree-restore-BQyoz3Qa.js",revision:"5dc189681ff87f7f812bc63bddfeba34"},{url:"assets/use-worktree-restore-B-9jHocY.css",revision:"54449cd3d2d5c88b0bd7d88f53f581c3"},{url:"assets/use-tours-Dum-bOyQ.js",revision:"9f697dfcbe48a7ba8dbeba24f3cc609b"},{url:"assets/use-tours-CTZuBZOi.css",revision:"2f6d79046e1409f0472f65179eaa76f3"},{url:"assets/use-slide-transition-C5eDGOmu.js",revision:"b90dcd38b96a2011b13e3cb1fad8c810"},{url:"assets/use-search-index-status-BL3cb04x.js",revision:"a50ce281167f11c0cbb8e36a8175d358"},{url:"assets/use-is-mobile-DLIZxEo9.js",revision:"4f97e87ed19624f38a21469b2bc9b625"},{url:"assets/use-id-b4A2I8LB.js",revision:"6794200f2a5efdc2931d9e372716b5a3"},{url:"assets/use-checkbox-BqDMQ6x7.js",revision:"1dd7104744ae106eae83c4f57e118d33"},{url:"assets/typespec-B8J7ngcE.js",revision:"6c28560625f59db6a5897aa92de81033"},{url:"assets/typescript-rKyiSQID.js",revision:"26e19b90e360fa9c366a18b5dd3805c5"},{url:"assets/twig-De2hgUGE.js",revision:"dfb4c76c8ec0d822070abac68d2bd473"},{url:"assets/tcl-DISqw1ZD.js",revision:"6d0ddaebd76ad41c47c96d484af119f8"},{url:"assets/systemverilog-Bz4Y3fRF.js",revision:"18e6d6e82eeb1107458d8d5531f82246"},{url:"assets/swift-Bxkupp3x.js",revision:"65b88f49188974d7c12e1a6cd12a9de5"},{url:"assets/st-DbInun42.js",revision:"d7294c4d47351db4e5edd4d91e445a21"},{url:"assets/sql-NEE52Syq.js",revision:"48352e15fff2141c7deaaab4e51e9565"},{url:"assets/sparql-D_Lu-MrJ.js",revision:"65390637b1a24614803db6844a0db77b"},{url:"assets/sophia-CRfGWb83.js",revision:"a330db913fee26a14679bed631a59043"},{url:"assets/solidity-BEEn4gHE.js",revision:"c2cd02221ec3d86f9a6bb09bfb1f8978"},{url:"assets/shell-CC2rA5mh.js",revision:"8362d325cda511ef760335e0847d3910"},{url:"assets/scss-gp-XZpBa.js",revision:"bf0805dd5cd80d90fef58c9866a7751e"},{url:"assets/scheme-BeGwcela.js",revision:"55c990715708ea012165486d065b3e2c"},{url:"assets/scala-DHpiXF5c.js",revision:"4eeea167d27954255e39d91412b62f87"},{url:"assets/sb-CcwsVR0C.js",revision:"93fc05f23a9cbb96d4f72dbc73e2e53b"},{url:"assets/rust-DdL9SqIa.js",revision:"356bac76300c8d83e8e9d76becf3c9ea"},{url:"assets/runtime-core.esm-bundler-DOiZcasU.js",revision:"c8b24ba609f8e3f7d98b4e4f2fcab5b0"},{url:"assets/ruby-DezsRK8O.js",revision:"95c3294c6d6cead3cccd7e4e973ab964"},{url:"assets/restructuredtext-BYgofb2h.js",revision:"f75377ae694f4e8f0bcccd05b5b9e65c"},{url:"assets/render-chat-markdown-CafzCcmu.js",revision:"336025fd68881d002bff5a7615ecb72f"},{url:"assets/redshift-DT7zqm-g.js",revision:"44e23f67b6a02e60d28c9947cd025207"},{url:"assets/redis-ClamHrr6.js",revision:"e3141183a6756253db43e10f8a305787"},{url:"assets/reactivity.esm-bundler-tuEvQ47f.js",revision:"132ddf3ef5e25c89e4757cb7f05605ba"},{url:"assets/razor-DMEmKSdO.js",revision:"24db624a00d87382f6c30ffba21a175e"},{url:"assets/r-BwWrilGY.js",revision:"f18d3e790ef07bc993539322d29548e4"},{url:"assets/qsharp-DkqhCAOL.js",revision:"c53fe08a83f8fcbcd81723105136a691"},{url:"assets/python-C1v3VovI.js",revision:"0a19416c931b0a09db28a07e191fb5b4"},{url:"assets/pug-Z5eAx3Zn.js",revision:"6e3de6d5214d2cf61b90949e1d383b49"},{url:"assets/protobuf-C531GsRP.js",revision:"04e688a7fef2bde8cef525653497371f"},{url:"assets/project-color-BQbOnYBN.js",revision:"019b5cceb83546534a161a6715c9a494"},{url:"assets/private.use-form-vxvbh_VN.js",revision:"727ba8d79bb6c06c76f6f88d36809f1c"},{url:"assets/preload-helper-DjzSQ1t3.js",revision:"0d547ee95526688c66f48be0a9d9b335"},{url:"assets/powershell-DmHpPYUd.js",revision:"ff476e9c4398edc9dfd2eb0ee9356352"},{url:"assets/powerquery-D3hlyOfw.js",revision:"0cacccadbe7cd4415f9a3112763c89f3"},{url:"assets/postiats-43DmfD33.js",revision:"b5dbce3331b7ccb325853328702b4bd9"},{url:"assets/pla-CopQ2nXW.js",revision:"b31678678d642accba98d7e7249a20b2"},{url:"assets/php-nr791fC2.js",revision:"ee487693840b66c2abf7c2da872dd6a8"},{url:"assets/pgsql-DTj74zXo.js",revision:"75375029d157fc5e789a13718eed9da7"},{url:"assets/permissionModes-Cc5VaOdC.js",revision:"58ae0c29396a74cae24708d4bda9f945"},{url:"assets/perl-oz_6vUea.js",revision:"fee6d319d328db438b336b52ac07a46a"},{url:"assets/pascaligo-D-ptJ9y-.js",revision:"88be4e81a252f44f049ac92f7b6ea518"},{url:"assets/pascal-DrH0SRf2.js",revision:"0d81121099a69b47e10701bf075fe3cd"},{url:"assets/objective-c-FvmIjYaQ.js",revision:"6d64543dd4430fb71bcd7a5347a0398c"},{url:"assets/notify-theme-uhSG2r09.js",revision:"bb5524d1cc3534a1adc16b60dc3d08e8"},{url:"assets/network-auth-CSx0jS5X.js",revision:"c5d1cdf5ac959c66197fdea695f0c98a"},{url:"assets/mysql-SOo6toE5.js",revision:"677c089d979324385539e96bd2eb11e4"},{url:"assets/msdax-DauUninz.js",revision:"a63bfea2dd041755a34fe3e307159413"},{url:"assets/monaco.contribution-VUGNbVME.js",revision:"c89cf4f35a8057add9c4bbf4273cc3c5"},{url:"assets/monaco-contributions-DvnCTJI2.css",revision:"964f32a36c06b4d5a66ac1b01556eb2b"},{url:"assets/monaco-contributions-Be_o6s3m.js",revision:"ef6caef0bfbfb81bfc1b50c0e131c640"},{url:"assets/mips-CIPQ_RoX.js",revision:"b22614ddc8855670a3f76290908877f5"},{url:"assets/mdx-DeW5qzOU.js",revision:"67278b3f0e9eed1637de3a0d33844622"},{url:"assets/markdown-Cimd5fb3.js",revision:"38eaa88ca7719b9da2894b7c26f2f65b"},{url:"assets/m3-D-oSqn_W.js",revision:"624c73b0332fe1ddfef6013306c5998d"},{url:"assets/lua-CsQS60Ue.js",revision:"5568edf60b64f912bd17561f26e03d44"},{url:"assets/liquid-DMyQVGkp.js",revision:"c8a4bd84a58b323afc61c26f1c8be4b7"},{url:"assets/lexon-CfSJPG6W.js",revision:"32b224ffe991474a4cfcbed19971a98d"},{url:"assets/less-B9JPFI3C.js",revision:"c80573ae2313727c545a585d90d3ff36"},{url:"assets/latest-request-CBPb8UWQ.js",revision:"cc6b8d5d23f9a72e4959634f7cd06fba"},{url:"assets/kotlin-BOotOW0E.js",revision:"7c2a31b16b6ddc97b60891b09afa11b1"},{url:"assets/julia-Bri6UV-V.js",revision:"bb5062cdf870c17c7c9be635c1a8a3be"},{url:"assets/javascript-C_jd0j2i.js",revision:"2f590eb5d6faafb695e0cd76e710d829"},{url:"assets/java-BEtHBSE6.js",revision:"987edcd2170749acca47ea184dd9ab25"},{url:"assets/it-CrA4Q7oc.js",revision:"00f74f905d167b5fba3d4f9937aa2529"},{url:"assets/ini-sBoK_t0W.js",revision:"35f8ec10844ea4f62c2712d3f5c1e129"},{url:"assets/index-C8zAZ-k-.css",revision:"1488166e385bd7f03f15dbf2e6f4fc60"},{url:"assets/index-BPmUmc6D.js",revision:"670c83efe592b1aa0802cfd56c4d83de"},{url:"assets/i18n-DtmbeJu8.js",revision:"74808afa3e1133cec759c684de77703e"},{url:"assets/i18n-DKj-umtn.js",revision:"b52f9d17ff894f49fcb49660c62cf9c5"},{url:"assets/html-CjGCxUEe.js",revision:"a019e03046473eb3ce62b78ada013a33"},{url:"assets/hcl-CpzslTdj.js",revision:"f9ef1004e908957ec1c3bbea2049a0e9"},{url:"assets/handlebars-BWStl2Hc.js",revision:"e8904fbc5b2fdf914c9553b8b0ae72bd"},{url:"assets/graphql-fmXr3nnJ.js",revision:"a51df1d5dca011f5d85dd09a2ffbe1e5"},{url:"assets/go-C-y9NEjX.js",revision:"9213c8381eb32996b86ca9600ca6a07e"},{url:"assets/fsharp-C8Ef5oNN.js",revision:"72f3de59be781f8a4ec49d16bac02119"},{url:"assets/freemarker2-JGUTjYvR.js",revision:"bcf25884388ba94ad2c17cfb38a9104a"},{url:"assets/fr-Bu92fK5U.js",revision:"0abb0cbd5b553ff23eada00e7267f082"},{url:"assets/formatters-DCjBZ47F.js",revision:"39fbe122c75eecedeb73bdbbd96d9b55"},{url:"assets/format-DoyK4IAn.css",revision:"51174980568a53694c8da3cc935fe4e6"},{url:"assets/flow9-C5_-GSwl.js",revision:"0e60dc6453d9684c059f20c846ae0ec4"},{url:"assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2",revision:"a4160421d2605545f69a4cd6cd642902"},{url:"assets/expand-template-D6zFPzzB.js",revision:"f3b5291abc35c90d321b354eb93be327"},{url:"assets/expand-template-CTUNyJrv.css",revision:"a4033bbc7a564e856b2b0c42816a24f7"},{url:"assets/es-BoNOfG0w.js",revision:"55bac8c8e0cf334394365908054f7e06"},{url:"assets/elixir-6RTg0lbw.js",revision:"fb736f7429d9c6a596ed7905653dbf14"},{url:"assets/efforts-CDsBbk8o.js",revision:"02d9eb3ebb012d319246efdbf772a5e1"},{url:"assets/editor.worker-BLJF_oQx.js",revision:"73d3d20cadfc19535b465c224d29ba1b"},{url:"assets/editor.api-CKcTKXcM.js",revision:"cdab3c5aa1944f2022f887df0b69b47f"},{url:"assets/editor-CmVjQp1O.css",revision:"dda9d7400b872282ecff92d1cb7da023"},{url:"assets/ecl-D05T4iGw.js",revision:"496ceca3c8bae12c563a8a781cf639f3"},{url:"assets/dockerfile-DZFCIeNp.js",revision:"6af03903b1e51179ae2120866bb68acd"},{url:"assets/defineProperty-BbfpZ9Tg.js",revision:"489a6e8420626ba7812b1b715b5ed17e"},{url:"assets/de-BPtzBQu0.js",revision:"6b944f4ae71d48a31edd2b4ed26003b7"},{url:"assets/dart-onAF5SnQ.js",revision:"4fc14a4d2b7e030db6af8025d8fe831b"},{url:"assets/cypher-CVaqCwHa.js",revision:"75a568a8c6b29818b6a6c8675841ebf7"},{url:"assets/custom-sounds-DoPDmcY5.js",revision:"c8f9f78d1f3307c34915edc5328314a0"},{url:"assets/css-DIMkf-bt.js",revision:"368cd7c0ef4cdeca015fe9fe40ed1b2c"},{url:"assets/csp-bTuwJoIa.js",revision:"d13f525ef224dae69f8bde261bb48507"},{url:"assets/csharp-BKxtCVv1.js",revision:"e5831c8275e73409bc73a3991ceb194e"},{url:"assets/cpp-C7h46wYY.js",revision:"7fa3a56badaae54657cda12c403da2c7"},{url:"assets/coffee-Ba7i2nA0.js",revision:"1a1012b2a9bd329b3b1794297125c9a9"},{url:"assets/codicon-DF1abBS2.ttf",revision:"94829fd323d002e45660034255257955"},{url:"assets/clojure-Cm7r79vr.js",revision:"e3307e92ae8965ebb29ec9c9097774cd"},{url:"assets/clipboard-t9qe6lK7.js",revision:"04f746e11f1ac85a8652dff1abde80f4"},{url:"assets/cameligo-DMUM7wLl.js",revision:"ad01c48b3bff95a5fb691c7cd8427122"},{url:"assets/build-path-tree-Bd50EZMW.js",revision:"b4c67409460e67160b4447b653f4540c"},{url:"assets/browser-CTkGHrN5.js",revision:"dbbef2f69dc28fbfa312c417f7686578"},{url:"assets/bicep-B5-_aFwp.js",revision:"b2c3f814c02ba6e4672b16282c0a1376"},{url:"assets/bat-i0X4ZdIN.js",revision:"914960f9abae1bfe5a2189a174a1e1c1"},{url:"assets/azcli-Bc_sGQ0U.js",revision:"c1dfc1889c57d0712d6415ecb14b66ed"},{url:"assets/apex-BWPQTe0t.js",revision:"eee56c5abf95c2575e288f36fdbb8737"},{url:"assets/abap-08VXUWAP.js",revision:"08897cd48182b5410786802ea9af6fa2"},{url:"assets/WorkspacePage-BnW-gp3u.css",revision:"fc875a8c50998d5fd8cec9f2c830cd94"},{url:"assets/WorkspacePage-B0wCQdev.js",revision:"11f18729babb2c74544ded6f08a325a3"},{url:"assets/WorkspaceAttentionLabels-DSw8Upcp.css",revision:"4c648f6466a78473af69fd72824b79ad"},{url:"assets/WorkspaceAttentionLabels-CZxW7QSq.js",revision:"42bdeb3483324560e7833274fe654936"},{url:"assets/TourReplayButton-DhbNI6O5.js",revision:"65a48d348d0af342573e774eefc51be2"},{url:"assets/TouchPan-6fI8xFPq.js",revision:"27d30d9418668bc2f172429a0d1eb9c6"},{url:"assets/ToolCallItem-DhjdG8vp.css",revision:"515c28b42f339bc39369af27a50ac1e7"},{url:"assets/ToolCallItem-CjXWiKJc.js",revision:"368d61d9ee2dd7b29572a43fe6207b20"},{url:"assets/TerminalPanel-Dz9EE-Ph.css",revision:"9fd7805b12e550833d2ac46b5c24dc7a"},{url:"assets/TerminalPanel-C4dYabx6.js",revision:"4c0f422fe226c602d87bcb7e1db25077"},{url:"assets/SplitWorkspacePage-lWQO8xro.css",revision:"cabea8d2cabbc3e1012ffa88225e04d3"},{url:"assets/SplitWorkspacePage-DwWsD7f5.js",revision:"130e38a37f5189b5f6a4ecc5f55ad60c"},{url:"assets/SettingsPage-DCMZL7GO.js",revision:"65422723479fbc1cf0813993801def67"},{url:"assets/SettingsPage-CpykRKq2.css",revision:"52d883cca7d949994e0700cded5e7d17"},{url:"assets/SearchPage-CnT0-Hpe.js",revision:"0aec26e0d5ac1ec7ad6d1947bba7b152"},{url:"assets/SearchPage-BGc1oQSM.css",revision:"d988bd3c7ed5458189b7225097e4cdeb"},{url:"assets/SchedulePanel-CPirTYw5.js",revision:"8462d2974897993f74274468bca075cb"},{url:"assets/SchedulePanel-CBM_GpS3.css",revision:"e4d8a73291701f8574305d69cb366164"},{url:"assets/QTooltip-CO84H0cq.js",revision:"65fde0814a8f29c94d8e86e002d3baf1"},{url:"assets/QSpinnerDots-BsKmccpX.js",revision:"29e78fc1d0cffdebe6e180af9fd7e749"},{url:"assets/QSelect-BskTzVCM.js",revision:"65a46754c223205cf9c03f1fce2e7ffa"},{url:"assets/QScrollArea-BnmQ9US7.js",revision:"51d785f31a98395911ef81b0267772cf"},{url:"assets/QPage-BCDXjfVj.js",revision:"f4a663b3a098f60ef913f57f9885cfeb"},{url:"assets/QMarkupTable-wuDf50Oh.js",revision:"ca51bb870ec7d3144e62d2fed594b776"},{url:"assets/QList-DnezW6gW.js",revision:"8274e3c6b6b732e87d9d5ef1fecc2d09"},{url:"assets/QItemSection-CR3Kfibl.js",revision:"98bf5adde2a17ce16d87de73e9a8f533"},{url:"assets/QExpansionItem-C2XXHOHk.js",revision:"ab93929cbadb5ddd4b7a9b3636f95a4d"},{url:"assets/QChip-Chu7r6RZ.js",revision:"3423911a2f477b8b0fce9dccefea7c48"},{url:"assets/QBtnToggle-COL46j6W.js",revision:"d1f0790e2ebe910da26f6043bf2dea75"},{url:"assets/QBtnGroup-CUmAgBV8.js",revision:"5640a093f05cd905dba45fdbb96f3385"},{url:"assets/QBtnDropdown-BGGvQIvH.js",revision:"b6b24600e0e00d5369279b6e4a3b2ab7"},{url:"assets/QBtn-b_baQtAt.js",revision:"81dd45c852de16ec87e5e5de1bca8316"},{url:"assets/QBanner-mzrnn82R.js",revision:"86496fb45170f5056faa07821d4179ae"},{url:"assets/QBadge-rGILsUYl.js",revision:"0846eb34c673b322a25a167f541b928f"},{url:"assets/MainLayout-fRVZ01LN.js",revision:"58bc525be79eab8ac34c8866829bd3fe"},{url:"assets/MainLayout-DkSavoiV.css",revision:"c586d2a6c44c7d84cc3d72d5bec985d3"},{url:"assets/HealthPage-DWotmfkh.js",revision:"d22f62eb12fca8069bf30350b06beee7"},{url:"assets/HealthPage-DT8FGrKA.css",revision:"e9cfc5cd6eff64124a91763108aab443"},{url:"assets/GitPanel-DRzhrs_V.js",revision:"c988f51a1623bd9e8266624576a492f7"},{url:"assets/GitPanel-C3blk_Pd.css",revision:"b1e525441f9ee27fccd4fd2de7bb63a1"},{url:"assets/DrawerToggleButton-DKytIBlk.js",revision:"a4f95aede5d14e6b8afb690ec73d13c7"},{url:"assets/DocumentsPanel-CqGg38Oi.js",revision:"9115afca34be1c9d5eb42a99fb6e14e3"},{url:"assets/DocumentsPanel-B8QY7FTj.css",revision:"676a3a838b07224f48fdd99e0cb6bbc8"},{url:"assets/DiffViewer-DEPOa3D7.css",revision:"7a2be47c13fe02cd2158e94eb0d320c5"},{url:"assets/DiffViewer-BMzrb9fB.js",revision:"f60efd0d20440b4d6d889192cc12b703"},{url:"assets/DashboardPage-CtaHaVdf.css",revision:"729d05fd05c14a73cbbfd35f6d3be6fd"},{url:"assets/DashboardPage-BKCrV6u0.js",revision:"c98daf538d47af83485948a57d936025"},{url:"assets/CreatePage-CMyl2j8Z.css",revision:"2d2882a61de44fab4965972f3fd84fce"},{url:"assets/CreatePage-6_AP5zso.js",revision:"e3f924910fbf85d3640b379c8d2da017"},{url:"assets/ComparisonPanel-CfmJHeH_.js",revision:"a9d3301ca0f23da9448d10e015f41969"},{url:"assets/ComparisonPanel-ByVbqYCs.css",revision:"40f8723a54937dbdb64e5de3d8bda349"},{url:"assets/ClosePopup-C1a82pL9.js",revision:"16e75558fa61b98a1e4334318655a3ec"},{url:"assets/ChangelogPage-DVyx9ZjV.css",revision:"fd9c6a99457c6fb03e97d8137880243c"},{url:"assets/ChangelogPage-BXNz7PGb.js",revision:"9722232fda8a8abd08728336a949160c"},{url:"assets/ActivityFeed-ZTxXVmNM.css",revision:"10763e97c9be4ca030ba0a41f044a2bf"},{url:"assets/ActivityFeed-BO1mKMJ0.js",revision:"76c0a035f118fa42e4c80c2dcbb51fa8"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html"),{denylist:[/sw\.js$/,/workbox-(.)*\.js$/]}))});
1
+ if(!self.define){let s,e={};const a=(a,r)=>(a=new URL(a+".js",r).href,e[a]||new Promise(e=>{if("document"in self){const s=document.createElement("script");s.src=a,s.onload=e,document.head.appendChild(s)}else s=a,importScripts(a),e()}).then(()=>{let s=e[a];if(!s)throw new Error(`Module ${a} didn’t register its module`);return s}));self.define=(r,i)=>{const c=s||("document"in self?document.currentScript.src:"")||location.href;if(e[c])return;let d={};const f=s=>a(s,c),b={module:{uri:c},exports:d,require:f};e[c]=Promise.all(r.map(s=>b[s]||f(s))).then(s=>(i(...s),d))}}define(["./workbox-778a14ff"],function(s){"use strict";s.setCacheNameDetails({prefix:"kobo-client"}),self.addEventListener("message",s=>{s.data&&"SKIP_WAITING"===s.data.type&&self.skipWaiting()}),s.clientsClaim(),s.precacheAndRoute([{url:"manifest.json",revision:"73f02ba4eb4414fb70bbe5ca76cc9580"},{url:"index.html",revision:"f9e32ec3bdeb68bd18ed5de336e29e08"},{url:"favicon.svg",revision:"9d89ef10d49f14d08c25cfca9bd4ea75"},{url:"sounds/ready.wav",revision:"cd00e80e7a9d443a0e95272bb22bed6e"},{url:"sounds/neutral.wav",revision:"cb264f6e7eb97388229e82fe7d6fa5cf"},{url:"fonts/GeistMono-Variable.woff2",revision:"308360d8a547331fd40bc09a7145d59a"},{url:"fonts/Geist-Variable.woff2",revision:"dfa48d5a853753289194436953e3f202"},{url:"fonts/GEIST-LICENSE.txt",revision:"563d13575f813953c3151e1ecce3b76f"},{url:"assets/yaml-DC__PKjj.js",revision:"f216e47926776951c43113958dad58e1"},{url:"assets/xml-Kyg_K_5X.js",revision:"b6ba6b6d836808e9821d4655ab288b67"},{url:"assets/workspace-templates-CSwgMrUf.js",revision:"d753fc864d35c242e2aa4d225e1e42c7"},{url:"assets/workspace-page-layout-Dw9NhZsL.js",revision:"0c933f7b6c6bf3c90ea1875abad85392"},{url:"assets/wgsl-DpFanUEy.js",revision:"4cf32279d7c6a601611a6e32a14f3b1e"},{url:"assets/vb-DV3o63ZY.js",revision:"a5b3a756d667f5e4a5da6da4013d7341"},{url:"assets/use-worktree-restore-D69uzYON.js",revision:"fa4d337b72be3b2c54a42d2bc261d16d"},{url:"assets/use-worktree-restore-B-9jHocY.css",revision:"54449cd3d2d5c88b0bd7d88f53f581c3"},{url:"assets/use-tours-CTZuBZOi.css",revision:"2f6d79046e1409f0472f65179eaa76f3"},{url:"assets/use-tours-CTNYIX-Q.js",revision:"4b550781436172c66e31a4f3249c9a40"},{url:"assets/use-slide-transition-B_Nu6u-t.js",revision:"00b155c171e638ef6fb5919cd6ebaf99"},{url:"assets/use-search-index-status-bIKbEP5q.js",revision:"a77a41c782f44926f84625732e5490d0"},{url:"assets/use-is-mobile-CDB_rzM9.js",revision:"736bff389e8d66a39ea1d2c842a28c82"},{url:"assets/use-id-BrdYXce0.js",revision:"2f38f32fe319b396537b34b776e791ce"},{url:"assets/use-dark-BHObfh0O.js",revision:"65f079943eb44c61f1a79c389fbe5e29"},{url:"assets/use-checkbox-v4aAbE6K.js",revision:"7eb92cef8192fe736bb1834ae8b13620"},{url:"assets/typespec-B8J7ngcE.js",revision:"6c28560625f59db6a5897aa92de81033"},{url:"assets/typescript-D62emDGo.js",revision:"81c8d8413f10171321399bac141dd4fd"},{url:"assets/twig-De2hgUGE.js",revision:"dfb4c76c8ec0d822070abac68d2bd473"},{url:"assets/tcl-DISqw1ZD.js",revision:"6d0ddaebd76ad41c47c96d484af119f8"},{url:"assets/systemverilog-Bz4Y3fRF.js",revision:"18e6d6e82eeb1107458d8d5531f82246"},{url:"assets/swift-Bxkupp3x.js",revision:"65b88f49188974d7c12e1a6cd12a9de5"},{url:"assets/st-DbInun42.js",revision:"d7294c4d47351db4e5edd4d91e445a21"},{url:"assets/sql-NEE52Syq.js",revision:"48352e15fff2141c7deaaab4e51e9565"},{url:"assets/sparql-D_Lu-MrJ.js",revision:"65390637b1a24614803db6844a0db77b"},{url:"assets/sophia-CRfGWb83.js",revision:"a330db913fee26a14679bed631a59043"},{url:"assets/solidity-BEEn4gHE.js",revision:"c2cd02221ec3d86f9a6bb09bfb1f8978"},{url:"assets/shell-CC2rA5mh.js",revision:"8362d325cda511ef760335e0847d3910"},{url:"assets/scss-gp-XZpBa.js",revision:"bf0805dd5cd80d90fef58c9866a7751e"},{url:"assets/scheme-BeGwcela.js",revision:"55c990715708ea012165486d065b3e2c"},{url:"assets/scala-DHpiXF5c.js",revision:"4eeea167d27954255e39d91412b62f87"},{url:"assets/sb-CcwsVR0C.js",revision:"93fc05f23a9cbb96d4f72dbc73e2e53b"},{url:"assets/rust-DdL9SqIa.js",revision:"356bac76300c8d83e8e9d76becf3c9ea"},{url:"assets/runtime-core.esm-bundler-Bqg71Vll.js",revision:"7feb349c2f329e619c68003a1cb3ca5b"},{url:"assets/ruby-DezsRK8O.js",revision:"95c3294c6d6cead3cccd7e4e973ab964"},{url:"assets/restructuredtext-BYgofb2h.js",revision:"f75377ae694f4e8f0bcccd05b5b9e65c"},{url:"assets/render-chat-markdown-CafzCcmu.js",revision:"336025fd68881d002bff5a7615ecb72f"},{url:"assets/redshift-DT7zqm-g.js",revision:"44e23f67b6a02e60d28c9947cd025207"},{url:"assets/redis-ClamHrr6.js",revision:"e3141183a6756253db43e10f8a305787"},{url:"assets/reactivity.esm-bundler-DY1JkAEA.js",revision:"f1cfbc11612769c44a0303b91e9b3cd2"},{url:"assets/razor-D_5X4O5M.js",revision:"a58552b1512f167b0bc3035e89f0e42b"},{url:"assets/r-BwWrilGY.js",revision:"f18d3e790ef07bc993539322d29548e4"},{url:"assets/qsharp-DkqhCAOL.js",revision:"c53fe08a83f8fcbcd81723105136a691"},{url:"assets/python-CKHf2s-D.js",revision:"51e450a0e889c3c32cb6d3869d22dec9"},{url:"assets/pug-Z5eAx3Zn.js",revision:"6e3de6d5214d2cf61b90949e1d383b49"},{url:"assets/protobuf-C531GsRP.js",revision:"04e688a7fef2bde8cef525653497371f"},{url:"assets/project-color-CBLQt6bM.js",revision:"b115d4a4dc76aa637362b9cca4ad540d"},{url:"assets/private.use-form-DY1BkePL.js",revision:"40d007f5f5d046d6278c001bec3ae86d"},{url:"assets/powershell-DmHpPYUd.js",revision:"ff476e9c4398edc9dfd2eb0ee9356352"},{url:"assets/powerquery-D3hlyOfw.js",revision:"0cacccadbe7cd4415f9a3112763c89f3"},{url:"assets/postiats-43DmfD33.js",revision:"b5dbce3331b7ccb325853328702b4bd9"},{url:"assets/pla-CopQ2nXW.js",revision:"b31678678d642accba98d7e7249a20b2"},{url:"assets/php-nr791fC2.js",revision:"ee487693840b66c2abf7c2da872dd6a8"},{url:"assets/pgsql-DTj74zXo.js",revision:"75375029d157fc5e789a13718eed9da7"},{url:"assets/permissionModes-DLWiBfdb.js",revision:"3553789e969961f62cb7167bedd5b8ae"},{url:"assets/perl-oz_6vUea.js",revision:"fee6d319d328db438b336b52ac07a46a"},{url:"assets/pascaligo-D-ptJ9y-.js",revision:"88be4e81a252f44f049ac92f7b6ea518"},{url:"assets/pascal-DrH0SRf2.js",revision:"0d81121099a69b47e10701bf075fe3cd"},{url:"assets/objective-c-FvmIjYaQ.js",revision:"6d64543dd4430fb71bcd7a5347a0398c"},{url:"assets/notify-theme-BXJypfo4.js",revision:"619375ff2ff317bdc1dede2e9f33f78f"},{url:"assets/network-auth-DXsDKXrM.js",revision:"fac3490560a36980b00616b65f8cd39b"},{url:"assets/mysql-SOo6toE5.js",revision:"677c089d979324385539e96bd2eb11e4"},{url:"assets/msdax-DauUninz.js",revision:"a63bfea2dd041755a34fe3e307159413"},{url:"assets/monaco.contribution-sN2BZtSW.js",revision:"29872e1f300d65adf9625093cb15e101"},{url:"assets/monaco-contributions-SMzL7GRn.js",revision:"d802a2488d5ee5f5903ff1db64e5af62"},{url:"assets/monaco-contributions-DvnCTJI2.css",revision:"964f32a36c06b4d5a66ac1b01556eb2b"},{url:"assets/mips-CIPQ_RoX.js",revision:"b22614ddc8855670a3f76290908877f5"},{url:"assets/mdx-TsWwhlKp.js",revision:"a26ac15312f04185668c8d917dcbfc0b"},{url:"assets/markdown-Cimd5fb3.js",revision:"38eaa88ca7719b9da2894b7c26f2f65b"},{url:"assets/m3-D-oSqn_W.js",revision:"624c73b0332fe1ddfef6013306c5998d"},{url:"assets/lua-CsQS60Ue.js",revision:"5568edf60b64f912bd17561f26e03d44"},{url:"assets/liquid-C5qQFvIu.js",revision:"e0622f49f607cfb83833862c38891541"},{url:"assets/lexon-CfSJPG6W.js",revision:"32b224ffe991474a4cfcbed19971a98d"},{url:"assets/less-B9JPFI3C.js",revision:"c80573ae2313727c545a585d90d3ff36"},{url:"assets/kotlin-BOotOW0E.js",revision:"7c2a31b16b6ddc97b60891b09afa11b1"},{url:"assets/julia-Bri6UV-V.js",revision:"bb5062cdf870c17c7c9be635c1a8a3be"},{url:"assets/javascript-BmeNra1c.js",revision:"d5e00ea2d42df5d08b9785c5f23d5db8"},{url:"assets/java-BEtHBSE6.js",revision:"987edcd2170749acca47ea184dd9ab25"},{url:"assets/it-B4rz5PZO.js",revision:"45ac1ae5e37a6587f5207f8efc86bd22"},{url:"assets/ini-sBoK_t0W.js",revision:"35f8ec10844ea4f62c2712d3f5c1e129"},{url:"assets/index-DPN7dSDH.js",revision:"174bd7183c1ad4666bc428bce61b67ff"},{url:"assets/index-C8zAZ-k-.css",revision:"1488166e385bd7f03f15dbf2e6f4fc60"},{url:"assets/i18n-v1pgIO4z.js",revision:"b454200d397c6a90cdda3a9c51769696"},{url:"assets/html-CnGW31DH.js",revision:"36c54a7bbe17eda50ecd8f046ec76031"},{url:"assets/hcl-CpzslTdj.js",revision:"f9ef1004e908957ec1c3bbea2049a0e9"},{url:"assets/handlebars-ChiPNy9j.js",revision:"93b7122658f56fff5615520f7f2f9c00"},{url:"assets/graphql-fmXr3nnJ.js",revision:"a51df1d5dca011f5d85dd09a2ffbe1e5"},{url:"assets/go-C-y9NEjX.js",revision:"9213c8381eb32996b86ca9600ca6a07e"},{url:"assets/fsharp-C8Ef5oNN.js",revision:"72f3de59be781f8a4ec49d16bac02119"},{url:"assets/freemarker2-DVQM2t3e.js",revision:"3b6edecfcdb0bdca2e8574eb237ac376"},{url:"assets/fr-CZhjMFZl.js",revision:"9c8cfd94918e09c218ecfd40bce63f90"},{url:"assets/formatters-DfLD95iT.js",revision:"e468cde3cbf5efd84a5a7d3fb3089103"},{url:"assets/format-DoyK4IAn.css",revision:"51174980568a53694c8da3cc935fe4e6"},{url:"assets/flow9-C5_-GSwl.js",revision:"0e60dc6453d9684c059f20c846ae0ec4"},{url:"assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2",revision:"a4160421d2605545f69a4cd6cd642902"},{url:"assets/expand-template-LaRhdYUp.js",revision:"59ea165885871112d66b835520247a1f"},{url:"assets/expand-template-CTUNyJrv.css",revision:"a4033bbc7a564e856b2b0c42816a24f7"},{url:"assets/es-BvRPXBHq.js",revision:"35bf3a39bf8c6c4cff56a77d0d4036a3"},{url:"assets/elixir-6RTg0lbw.js",revision:"fb736f7429d9c6a596ed7905653dbf14"},{url:"assets/efforts-DU9dTnaN.js",revision:"b9d0f4a6c09e2a7543bded33de79361c"},{url:"assets/editor.worker-BLJF_oQx.js",revision:"73d3d20cadfc19535b465c224d29ba1b"},{url:"assets/editor.api-DDwuA_C9.js",revision:"c8f3506fc50e20789b2c8f42877e0d01"},{url:"assets/editor-CmVjQp1O.css",revision:"dda9d7400b872282ecff92d1cb7da023"},{url:"assets/ecl-D05T4iGw.js",revision:"496ceca3c8bae12c563a8a781cf639f3"},{url:"assets/dom-BtYTvLeN.js",revision:"ed94f94fd89f05be544a248d8aa2694e"},{url:"assets/dockerfile-DZFCIeNp.js",revision:"6af03903b1e51179ae2120866bb68acd"},{url:"assets/detached-fullscreen-Du3TcYdX.js",revision:"e1a742ca0ac13ba1d1d45fbce498c981"},{url:"assets/defineProperty-BbfpZ9Tg.js",revision:"489a6e8420626ba7812b1b715b5ed17e"},{url:"assets/de-YFD4X2nQ.js",revision:"50b3df9df44de84f509cd4b4dd1bce8a"},{url:"assets/dart-onAF5SnQ.js",revision:"4fc14a4d2b7e030db6af8025d8fe831b"},{url:"assets/cypher-CVaqCwHa.js",revision:"75a568a8c6b29818b6a6c8675841ebf7"},{url:"assets/custom-sounds-DTV-xHVv.js",revision:"4ca0e331537ee84f3eb92e592d9dfa86"},{url:"assets/css-DIMkf-bt.js",revision:"368cd7c0ef4cdeca015fe9fe40ed1b2c"},{url:"assets/csp-bTuwJoIa.js",revision:"d13f525ef224dae69f8bde261bb48507"},{url:"assets/csharp-BKxtCVv1.js",revision:"e5831c8275e73409bc73a3991ceb194e"},{url:"assets/cpp-C7h46wYY.js",revision:"7fa3a56badaae54657cda12c403da2c7"},{url:"assets/coffee-Ba7i2nA0.js",revision:"1a1012b2a9bd329b3b1794297125c9a9"},{url:"assets/codicon-DF1abBS2.ttf",revision:"94829fd323d002e45660034255257955"},{url:"assets/clojure-Cm7r79vr.js",revision:"e3307e92ae8965ebb29ec9c9097774cd"},{url:"assets/clipboard-t9qe6lK7.js",revision:"04f746e11f1ac85a8652dff1abde80f4"},{url:"assets/cameligo-DMUM7wLl.js",revision:"ad01c48b3bff95a5fb691c7cd8427122"},{url:"assets/build-path-tree-DFwB0SSs.js",revision:"fb3cd32cc67b6ed2c30805e45aa8b1c1"},{url:"assets/browser-DuFAaYHh.js",revision:"bbc71f0318315dc465cf3f14463c2a5a"},{url:"assets/bicep-B5-_aFwp.js",revision:"b2c3f814c02ba6e4672b16282c0a1376"},{url:"assets/bat-i0X4ZdIN.js",revision:"914960f9abae1bfe5a2189a174a1e1c1"},{url:"assets/azcli-Bc_sGQ0U.js",revision:"c1dfc1889c57d0712d6415ecb14b66ed"},{url:"assets/apex-BWPQTe0t.js",revision:"eee56c5abf95c2575e288f36fdbb8737"},{url:"assets/abap-08VXUWAP.js",revision:"08897cd48182b5410786802ea9af6fa2"},{url:"assets/WorkspacePage-C-JXKt-S.js",revision:"8cccfd395d61d4ccbba52ed2b3aeb83b"},{url:"assets/WorkspacePage-Ba0jAHhn.css",revision:"dfe688e04c34aaff25cb9545145b0aee"},{url:"assets/WorkspaceAttentionLabels-DSw8Upcp.css",revision:"4c648f6466a78473af69fd72824b79ad"},{url:"assets/WorkspaceAttentionLabels-CqlhQOqG.js",revision:"c7a206b3f07f88b8941c7376b3c1eadf"},{url:"assets/TourReplayButton-COI4vR7q.js",revision:"e9dc1347f9f3bc45de78635728f2514c"},{url:"assets/TouchPan-CxThkotY.js",revision:"fba00a0ac216d5eb712001793a83ac63"},{url:"assets/ToolCallItem-M3CSguac.js",revision:"fb0ea912f6a276c4783b32ed0d26e66e"},{url:"assets/ToolCallItem-DhjdG8vp.css",revision:"515c28b42f339bc39369af27a50ac1e7"},{url:"assets/TerminalPanel-Dz9EE-Ph.css",revision:"9fd7805b12e550833d2ac46b5c24dc7a"},{url:"assets/TerminalPanel-Bsrg96VZ.js",revision:"55edd76f4ba628caa9d239c0f387c5e0"},{url:"assets/SplitWorkspacePage-lWQO8xro.css",revision:"cabea8d2cabbc3e1012ffa88225e04d3"},{url:"assets/SplitWorkspacePage-Cjd_Lq-0.js",revision:"13d70306d93df055b66560dd5a797671"},{url:"assets/SettingsPage-oSGNwimG.js",revision:"fb5988dd7acd48161f6d75233f45ffee"},{url:"assets/SettingsPage-C1dcMqCO.css",revision:"300f7863c142e91763c2ff0e30e81947"},{url:"assets/SearchPage-Dr43rGji.js",revision:"901f766319f67a5a54fdc22ee898577b"},{url:"assets/SearchPage-BGc1oQSM.css",revision:"d988bd3c7ed5458189b7225097e4cdeb"},{url:"assets/SchedulePanel-DNwt3V1a.js",revision:"bc7a83be4a63b8bf662696e555798beb"},{url:"assets/SchedulePanel-CBM_GpS3.css",revision:"e4d8a73291701f8574305d69cb366164"},{url:"assets/QTooltip-CgVCYatx.js",revision:"98c42b1abd15b2e9a75704f4971a31c8"},{url:"assets/QSpinnerDots-xdWyaE1i.js",revision:"55b8a4269a2b5e98cf5814142583ffca"},{url:"assets/QSelect-CPE9LsIn.js",revision:"12a97eb673779ec749133da2c6558377"},{url:"assets/QScrollArea-bm6nYMnB.js",revision:"518d4b64a92ed09308a1cf7d908e12a3"},{url:"assets/QPage-CqkGHokx.js",revision:"8b288520e591a41f177e3791dc7faa23"},{url:"assets/QMarkupTable-UhP7fVUp.js",revision:"c92050ccd8960b77d3fe62f5f571e5d5"},{url:"assets/QList-Cx1UfaUm.js",revision:"cc5735e323efbe3482109703554ecfb7"},{url:"assets/QItemSection-MdJ1_ZK7.js",revision:"d550545b87d619522be2c2702c9a6d9f"},{url:"assets/QExpansionItem-BBTTV_37.js",revision:"3237139efa347f4d88631375650ee83f"},{url:"assets/QChip-Be16M4Ig.js",revision:"d217d603e5c6e691c02a888ffc1d213b"},{url:"assets/QBtnToggle-DccOOtbh.js",revision:"8c64e4c2fd1a993cb56403d1e62e6c09"},{url:"assets/QBtnGroup-CnM4vSJA.js",revision:"ddfd643b34c3c3ae7d3aa4a27bea664f"},{url:"assets/QBtnDropdown-B9xNOKD0.js",revision:"3739b399f876b54c549746978686abf5"},{url:"assets/QBtn-BUSdPaf4.js",revision:"d17c16beb07a97466b66d2d27b5a5ad8"},{url:"assets/QBanner-BT2ZemYu.js",revision:"5f6df26329a8dca94971f06f78162d70"},{url:"assets/QBadge-CW3Lw-kL.js",revision:"4f52dbd5f6dcaa77fd5b226d6053351a"},{url:"assets/MemoryProposalList-OmDpl3o5.css",revision:"eba7a0c30ad67b57e7c59179058128fc"},{url:"assets/MemoryProposalList-BnoVbFsj.js",revision:"3be1a560c898c8a8859d9e1e31d6f1ca"},{url:"assets/MemoryPanel-Ch3qeyQw.css",revision:"a080bd22ae7a7eb244df25c0a42d0f7c"},{url:"assets/MemoryPanel-BivQoMQ6.js",revision:"506137106f632932990b042ee5767b10"},{url:"assets/MainLayout-DWzXL1KW.js",revision:"48427b6d8b25d3787869a0e785dc91fc"},{url:"assets/MainLayout-DAcSwgUw.css",revision:"6e7f9b1cb6934ebda3a0a6f0b1d345eb"},{url:"assets/HealthPage-DT8FGrKA.css",revision:"e9cfc5cd6eff64124a91763108aab443"},{url:"assets/HealthPage-BSrTmp1k.js",revision:"7fa301275f6ca0e0aff8557b6184698d"},{url:"assets/GitPanel-DOugIJUS.js",revision:"e32d81b0bccc42cd27aa0a2dbb05657d"},{url:"assets/GitPanel-C3blk_Pd.css",revision:"b1e525441f9ee27fccd4fd2de7bb63a1"},{url:"assets/DrawerToggleButton-DcVhAbjN.js",revision:"71a462aed37f2447205b94eca99722b3"},{url:"assets/DocumentsPanel-BTp3J6Rq.js",revision:"16bfdfd26b29b6c2ed306ad982f4ad8a"},{url:"assets/DocumentsPanel-B8QY7FTj.css",revision:"676a3a838b07224f48fdd99e0cb6bbc8"},{url:"assets/DiffViewer-j7rwPKxU.js",revision:"c43ce428783707b89b7bf46fdf14846a"},{url:"assets/DiffViewer-DEPOa3D7.css",revision:"7a2be47c13fe02cd2158e94eb0d320c5"},{url:"assets/DashboardPage-Ds6Y8xlV.js",revision:"3f27424e63fc541195451ddfa5100f96"},{url:"assets/DashboardPage-CtaHaVdf.css",revision:"729d05fd05c14a73cbbfd35f6d3be6fd"},{url:"assets/CreatePage-DOamHqeH.js",revision:"52fc0871b754dde99da9162a07519702"},{url:"assets/CreatePage-C7fLOpai.css",revision:"d7d5aee8a8da00f0f29d1c4d6bc6e253"},{url:"assets/ComparisonPanel-kMWS9il3.js",revision:"12550d608bd555a4633d4547c44fe591"},{url:"assets/ComparisonPanel-ByVbqYCs.css",revision:"40f8723a54937dbdb64e5de3d8bda349"},{url:"assets/ClosePopup-CRV2hxHS.js",revision:"408af589ed45c4f8e5f53522bc47c5f2"},{url:"assets/ChangelogPage-DVyx9ZjV.css",revision:"fd9c6a99457c6fb03e97d8137880243c"},{url:"assets/ChangelogPage-B1rkKskD.js",revision:"fa3ae006271ed50f31d92a8d70a1d7b8"},{url:"assets/ActivityFeed-w8TNfMKd.js",revision:"b4f2ad04cf42721c8df833c8d3d74116"},{url:"assets/ActivityFeed-DdJvMzRI.css",revision:"0ba8a4ec4311b7276146ba90134bbe29"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html"),{denylist:[/sw\.js$/,/workbox-(.)*\.js$/]}))});
@@ -382,6 +382,29 @@ Stop the currently running agent session on a workspace, like the Stop action in
382
382
 
383
383
  ---
384
384
 
385
+ ## Persistent memory tools
386
+
387
+ The same six memory tools are available on a workspace-bound agent server and on the global external MCP server: `list_memory_scopes`, `list_memories`, `read_memory`, `search_memories`, `list_memory_operations`, and `remember`. They call Kōbō's shared memory service; HTTP and stdio clients see the same stored scopes and entries. External calls do not create or resume a workspace, agent session, or native engine conversation.
388
+
389
+ | Tool | Purpose and important arguments |
390
+ |---|---|
391
+ | `list_memory_scopes` | Lists selectable scopes; external clients may pass `workspace_id` to list exactly the applicable global/project/workspace scopes. |
392
+ | `list_memories` | Bounded page of compact metadata; select one `scope_id`, or an applicable `workspace_id` externally. |
393
+ | `read_memory` | Reads a specific `scope_id` + `entry_id`; large bodies are returned as explicit fragments with a revision/code-point cursor. Set `repeat: true` only to intentionally spend budget rereading an unchanged range. |
394
+ | `search_memories` | Bounded search in a selected scope or external workspace view; results are metadata/excerpts, not a corpus dump. |
395
+ | `list_memory_operations` | Bounded content-free journal page for one scope or external workspace view. |
396
+ | `remember` | Creates/updates a concise fact. Supply `scope_id`, `expected_generation`, `key`, `title`, and `body`; updates also require `entry_id`, `expected_revision`, and `key`. |
397
+
398
+ Internal tools derive workspace/session/engine attribution and access from a short-lived launch capability. Do not send an actor field. A read-only plan/review/report launch cannot write, and stopping revokes its capability. External clients must choose a scope explicitly for writes and `read_memory`; they cannot forge an internal session, human actor, or use the workspace bridge to escape its scope. Memory MCP exposes no delete, promotion, proposal approval, or clear operation; a human performs those in Settings/the workspace drawer.
399
+
400
+ Mode applies to internal and external writes at call time: Manual denies agent writes, Hybrid applies workspace writes and proposes project/global changes, and Automatic applies the selected scope. A `remember` receipt reports denied/applied/proposed and revision/generation metadata, not a copy of the saved body. No mutation is retried automatically after a transport error; inspect the key/proposal before deciding whether to retry. Hybrid proposals stay pending until human approval; switching modes never approves them.
401
+
402
+ Each response is independently bounded, and native conversation memory output is cumulatively budgeted across resumes/restarts. Bootstrap targets 1,000 estimated tokens, ordinary tool output targets 1,000 with a hard 1,500 cap, and a native context epoch has a 6,000 cumulative estimated-token ceiling. Regular output stops at 5,500, reserving up to 500 tokens for one terminal budget-denial receipt. After that receipt, exhausted MCP calls return `isError: true` with `content: []`. The final serialized envelope has a separate 12,000-byte ceiling and includes 96 bytes of framing headroom in its cost. These values estimate only Kōbō memory output; Kōbō has no trustworthy full-context/window telemetry and cannot promise the rest of a provider conversation fits.
403
+
404
+ External `list_memory_scopes` returns scope IDs, levels, and generation/revision CAS values; pass the current generation to `remember` and rediscover after a clear/conflict. HTTP/global-stdio clients should reuse the opaque `memory_context_id` returned by receipts for one cooperative external conversation. This keeps its cumulative allowance across stateless requests; it is budget bookkeeping, not an authorization token and cannot reference an internal conversation ledger. Kōbō cannot detect external compaction or know that a new ID means an empty model context. External provenance records the normalized display client name and `http`/`stdio` transport, not an authenticated identity. Reuse the same id across calls and respect returned exhaustion receipts instead of looping.
405
+
406
+ Automatic mode means the agent deliberately calls `remember` when it has stable, reusable knowledge; there is no background transcript extraction or post-session model call. Clear prevents later Kōbō memory reads/injection but cannot retract text already transmitted to an engine or remove provider chat history. See [Persistent memory](../../CONFIGURATION.md#persistent-memory) for scope lifecycle, erasure and UI behavior.
407
+
385
408
  ## Implementation notes
386
409
 
387
410
  - **Handlers** live in `kobo-tasks-handlers.ts` as pure functions taking the DB handle (and sometimes paths) as arguments. This keeps them unit-testable in isolation — see `src/__tests__/kobo-tasks-server.test.ts`.
@@ -76,6 +76,7 @@ export interface WorkspaceListItemDto {
76
76
  id: string
77
77
  title: string
78
78
  status: string
79
+ tags: string[]
79
80
  createdAt: string
80
81
  }
81
82
 
@@ -83,9 +84,19 @@ interface WorkspaceListRow {
83
84
  id: string
84
85
  name: string
85
86
  status: string
87
+ tags: string
86
88
  created_at: string
87
89
  }
88
90
 
91
+ function parseWorkspaceTags(raw: string): string[] {
92
+ try {
93
+ const tags = JSON.parse(raw)
94
+ return Array.isArray(tags) ? tags.filter((tag): tag is string => typeof tag === 'string') : []
95
+ } catch {
96
+ return []
97
+ }
98
+ }
99
+
89
100
  /**
90
101
  * List workspaces for the global `list_workspaces` MCP tool. Reads SQLite
91
102
  * directly (no backend HTTP dependency) so it works even when the Kōbō
@@ -93,19 +104,23 @@ interface WorkspaceListRow {
93
104
  */
94
105
  export function listWorkspacesHandler(
95
106
  db: Database.Database,
96
- opts: { includeArchived?: boolean },
107
+ opts: { includeArchived?: boolean; tag?: string },
97
108
  ): WorkspaceListItemDto[] {
98
109
  // updated_at can collide at second resolution (e.g. bulk-seeded test data); rowid DESC breaks ties, most-recently-inserted first.
99
110
  const sql = opts.includeArchived
100
- ? 'SELECT id, name, status, created_at FROM workspaces ORDER BY updated_at DESC, rowid DESC'
101
- : 'SELECT id, name, status, created_at FROM workspaces WHERE archived_at IS NULL ORDER BY updated_at DESC, rowid DESC'
111
+ ? 'SELECT id, name, status, tags, created_at FROM workspaces ORDER BY updated_at DESC, rowid DESC'
112
+ : 'SELECT id, name, status, tags, created_at FROM workspaces WHERE archived_at IS NULL ORDER BY updated_at DESC, rowid DESC'
102
113
  const rows = db.prepare(sql).all() as WorkspaceListRow[]
103
- return rows.map((row) => ({
104
- id: row.id,
105
- title: row.name,
106
- status: row.status,
107
- createdAt: row.created_at,
108
- }))
114
+ const tag = opts.tag?.trim()
115
+ return rows
116
+ .map((row) => ({
117
+ id: row.id,
118
+ title: row.name,
119
+ status: row.status,
120
+ tags: parseWorkspaceTags(row.tags),
121
+ createdAt: row.created_at,
122
+ }))
123
+ .filter((workspace) => !tag || workspace.tags.includes(tag))
109
124
  }
110
125
 
111
126
  /**
@@ -4,6 +4,7 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
4
4
  import { CallToolRequestSchema, ListToolsRequestSchema, type Tool } from '@modelcontextprotocol/sdk/types.js'
5
5
  import type Database from 'better-sqlite3'
6
6
  import { getDb } from '../server/db/index.js'
7
+ import { EXTERNAL_MEMORY_TOOL_DEFINITIONS, isMemoryToolName, MEMORY_TOOL_DEFINITIONS } from '../shared/memory-tools.js'
7
8
  import { WORKSPACE_DIALOGUE_TOOLS } from '../shared/workspace-dialogue-tools.js'
8
9
  import {
9
10
  createTaskHandler,
@@ -26,6 +27,7 @@ import {
26
27
  setWorkspaceAgentDescriptionHandler,
27
28
  updateTaskHandler,
28
29
  } from './kobo-tasks-handlers.js'
30
+ import { callMemoryTool, isMemoryOutputSuppressed } from './memory-client.js'
29
31
  import { callWorkspaceDialogueTool } from './workspace-dialogue-client.js'
30
32
 
31
33
  const handoffId = process.env.KOBO_HANDOFF_ID
@@ -598,14 +600,16 @@ const WORKSPACE_SCOPED_TOOLS: Tool[] = [
598
600
  inputSchema: { type: 'object', properties: {}, required: [] },
599
601
  annotations: { destructiveHint: false, openWorldHint: false },
600
602
  },
603
+ ...MEMORY_TOOL_DEFINITIONS,
601
604
  ]
602
605
 
603
606
  const GLOBAL_TOOLS: typeof WORKSPACE_SCOPED_TOOLS = [
604
607
  ...WORKSPACE_DIALOGUE_TOOLS,
608
+ ...EXTERNAL_MEMORY_TOOL_DEFINITIONS,
605
609
  {
606
610
  name: 'list_workspaces',
607
611
  description:
608
- 'List Kōbō workspaces with their id, title, status, and creation date. Works even when the Kōbō backend server is not running (reads the database directly). Use this to discover existing workspaces before creating one or targeting one with archive_workspace/stop_workspace.',
612
+ 'List Kōbō workspaces with their id, title, status, tags, and creation date. Set tag to return only workspaces carrying that exact tag. Works even when the Kōbō backend server is not running (reads the database directly). Use this to discover existing workspaces before creating one or targeting one with archive_workspace/stop_workspace.',
609
613
  inputSchema: {
610
614
  type: 'object',
611
615
  properties: {
@@ -613,6 +617,11 @@ const GLOBAL_TOOLS: typeof WORKSPACE_SCOPED_TOOLS = [
613
617
  type: 'boolean',
614
618
  description: 'Include archived workspaces (default false).',
615
619
  },
620
+ tag: {
621
+ type: 'string',
622
+ minLength: 1,
623
+ description: 'Return only workspaces with this exact tag, for example "API".',
624
+ },
616
625
  },
617
626
  required: [],
618
627
  },
@@ -636,6 +645,11 @@ const GLOBAL_TOOLS: typeof WORKSPACE_SCOPED_TOOLS = [
636
645
  reasoning_effort: { type: 'string', description: 'Reasoning effort override (optional).' },
637
646
  engine: { type: 'string', description: 'Agent engine id, e.g. "claude-code" or "codex" (optional).' },
638
647
  description: { type: 'string', description: 'Task description / initial brainstorming prompt (optional).' },
648
+ tags: {
649
+ type: 'array',
650
+ items: { type: 'string' },
651
+ description: 'Workspace tags to assign at creation (optional).',
652
+ },
639
653
  tasks: { type: 'array', items: { type: 'string' }, description: 'Initial manual task titles (optional).' },
640
654
  acceptance_criteria: {
641
655
  type: 'array',
@@ -696,7 +710,11 @@ const GLOBAL_TOOLS: typeof WORKSPACE_SCOPED_TOOLS = [
696
710
  const GLOBAL_TOOL_NAMES = new Set(GLOBAL_TOOLS.map((t) => t.name))
697
711
 
698
712
  function availableTools(): Tool[] {
699
- const tools = workspaceId ? [...WORKSPACE_SCOPED_TOOLS, ...GLOBAL_TOOLS] : GLOBAL_TOOLS
713
+ // A workspace process exposes the capability-bound memory tools exactly once.
714
+ // Unbound/global stdio exposes the external bridge variant instead.
715
+ const tools = workspaceId
716
+ ? [...WORKSPACE_SCOPED_TOOLS, ...GLOBAL_TOOLS.filter((tool) => !isMemoryToolName(tool.name))]
717
+ : GLOBAL_TOOLS
700
718
  return tools.filter((tool) =>
701
719
  handoffId && handoffToken
702
720
  ? tool.name === 'submit_session_handoff' || tool.annotations?.readOnlyHint === true
@@ -753,6 +771,35 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
753
771
  }),
754
772
  )
755
773
  }
774
+ if (isMemoryToolName(name)) {
775
+ if (!workspaceId) {
776
+ return await callWorkspaceDialogueTool(
777
+ backendUrl,
778
+ name,
779
+ a,
780
+ process.env.KOBO_NETWORK_TOKEN,
781
+ process.env.KOBO_MCP_CLIENT_NAME ?? server.getClientVersion()?.name,
782
+ )
783
+ }
784
+ // Workspace-bound memory is always dispatched to its launch-scoped capability.
785
+ // It must never fall through to the unrestricted external/global bridge.
786
+ if (!process.env.KOBO_MEMORY_SESSION_TOKEN)
787
+ return fail('Memory tools require the current workspace launch capability.')
788
+ const memoryResult = await callMemoryTool({
789
+ backendUrl,
790
+ name,
791
+ args: a,
792
+ capability: process.env.KOBO_MEMORY_SESSION_TOKEN,
793
+ networkToken: process.env.KOBO_NETWORK_TOKEN,
794
+ })
795
+ if (isMemoryOutputSuppressed(memoryResult)) return { content: [], isError: true }
796
+ return {
797
+ ...ok(memoryResult),
798
+ ...(memoryResult && typeof memoryResult === 'object' && 'budgetExhausted' in memoryResult
799
+ ? { isError: true }
800
+ : {}),
801
+ }
802
+ }
756
803
  if (WORKSPACE_DIALOGUE_TOOLS.some((tool) => tool.name === name)) {
757
804
  if (workspaceId && a.workspace_id === workspaceId && name === 'send_workspace_message')
758
805
  return fail('Use the normal conversation to communicate in your own workspace.')
@@ -1047,7 +1094,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1047
1094
 
1048
1095
  if (name === 'list_workspaces') {
1049
1096
  const includeArchived = a.include_archived === true
1050
- return ok(listWorkspacesHandler(db, { includeArchived }))
1097
+ const tag = typeof a.tag === 'string' ? a.tag : undefined
1098
+ return ok(listWorkspacesHandler(db, { includeArchived, tag }))
1051
1099
  }
1052
1100
 
1053
1101
  if (name === 'create_workspace') {
@@ -1068,6 +1116,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1068
1116
  reasoningEffort: a.reasoning_effort as string | undefined,
1069
1117
  engine: a.engine as string | undefined,
1070
1118
  description: a.description as string | undefined,
1119
+ tags: a.tags as string[] | undefined,
1071
1120
  tasks: a.tasks as string[] | undefined,
1072
1121
  acceptanceCriteria: a.acceptance_criteria as string[] | undefined,
1073
1122
  agentPermissionMode: a.agent_permission_mode as string | undefined,
@@ -0,0 +1,52 @@
1
+ import { isMemoryToolName, validateMemoryToolArguments } from '../shared/memory-tools.js'
2
+
3
+ export type MemoryFetch = typeof fetch
4
+
5
+ export function isMemoryOutputSuppressed(value: unknown): boolean {
6
+ return (
7
+ !!value &&
8
+ typeof value === 'object' &&
9
+ !Array.isArray(value) &&
10
+ 'memoryOutputSuppressed' in value &&
11
+ value.memoryOutputSuppressed === true
12
+ )
13
+ }
14
+
15
+ export async function callMemoryTool(input: {
16
+ backendUrl: string
17
+ name: string
18
+ args: unknown
19
+ capability?: string
20
+ networkToken?: string
21
+ fetcher?: MemoryFetch
22
+ timeoutMs?: number
23
+ }): Promise<unknown> {
24
+ if (!isMemoryToolName(input.name)) throw new TypeError('Unknown memory tool')
25
+ if (!input.capability) throw new Error('Memory capability is unavailable for this process')
26
+ const args = validateMemoryToolArguments(input.name, input.args)
27
+ const headers: Record<string, string> = {
28
+ 'Content-Type': 'application/json',
29
+ 'X-Kobo-Memory-Session': input.capability,
30
+ }
31
+ if (input.networkToken) headers['X-Kobo-Token'] = input.networkToken
32
+ const timeoutMs = input.timeoutMs ?? 30_000
33
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1) throw new TypeError('Memory request timeout must be positive')
34
+ const signal = AbortSignal.timeout(timeoutMs)
35
+ const response = await (input.fetcher ?? fetch)(
36
+ `${input.backendUrl.replace(/\/$/, '')}/api/memory/agent/${input.name}`,
37
+ { method: 'POST', headers, body: JSON.stringify(args), signal },
38
+ )
39
+ const raw = await response.text()
40
+ let payload: unknown
41
+ try {
42
+ payload = raw ? JSON.parse(raw) : null
43
+ } catch {
44
+ payload = { error: 'Backend returned invalid JSON' }
45
+ }
46
+ if (!response.ok) {
47
+ const detail =
48
+ payload && typeof payload === 'object' && 'error' in payload ? String(payload.error) : response.statusText
49
+ throw new Error(`Memory backend returned ${response.status}: ${detail}`)
50
+ }
51
+ return payload
52
+ }
@@ -1,5 +1,6 @@
1
1
  import { Client } from '@modelcontextprotocol/sdk/client/index.js'
2
2
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'
3
+ import { isMemoryToolName, validateMemoryToolArguments } from '../shared/memory-tools.js'
3
4
  import { validateDialogueArguments } from '../shared/workspace-dialogue-tools.js'
4
5
  import { normalizeClientName } from '../shared/workspace-message-types.js'
5
6
 
@@ -11,7 +12,9 @@ export async function callWorkspaceDialogueTool(
11
12
  token?: string,
12
13
  clientName?: string,
13
14
  ) {
14
- const arguments_ = validateDialogueArguments(name, args)
15
+ const arguments_ = isMemoryToolName(name)
16
+ ? validateMemoryToolArguments(name, args, true)
17
+ : validateDialogueArguments(name, args)
15
18
  const client = new Client({ name: 'kobo-stdio-bridge', version: '1.0.0' })
16
19
  const signal = AbortSignal.timeout(30_000)
17
20
  const transport = new StreamableHTTPClientTransport(new URL(`${backendUrl.replace(/\/$/, '')}/api/mcp`), {
@@ -1 +0,0 @@
1
- import{M as e,S as t,dt as n,lt as r,p as i,st as a,v as o}from"./reactivity.esm-bundler-tuEvQ47f.js";import{C as s,F as c,J as l,L as u,N as d,O as f,P as p,T as m,Y as h,_ as g,d as _,f as v,g as y,j as b,k as x,l as S,p as C,r as w,u as T,y as E,z as ee}from"./runtime-core.esm-bundler-DOiZcasU.js";import{T as te,Y as ne,l as re,lt as ie,mt as D,nt as ae,t as O,x as oe}from"./QBtn-b_baQtAt.js";import{l as se,n as ce,o as le,t as ue}from"./latest-request-CBPb8UWQ.js";import{a as de}from"./i18n-DKj-umtn.js";import{O as fe,Rt as pe,T as me,Vt as k,ct as he,g as ge,jt as A,nt as _e,p as ve,rt as ye}from"./index-BPmUmc6D.js";import{t as be}from"./QSpinnerDots-BsKmccpX.js";import{t as xe}from"./QList-DnezW6gW.js";import{t as Se}from"./QMarkupTable-wuDf50Oh.js";import{c as j,l as M,s as N}from"./QSelect-BskTzVCM.js";import{t as P}from"./QItemSection-CR3Kfibl.js";import{t as Ce}from"./QExpansionItem-C2XXHOHk.js";import{a as F,r as I,t as L}from"./ToolCallItem-CjXWiKJc.js";import{t as we}from"./QScrollArea-BnmQ9US7.js";import{a as R}from"./use-tours-Dum-bOyQ.js";import{f as Te,g as z,m as Ee,p as De,u as Oe}from"./use-worktree-restore-BQyoz3Qa.js";import{t as B}from"./QTooltip-CO84H0cq.js";import{n as ke}from"./render-chat-markdown-CafzCcmu.js";import{n as V}from"./WorkspacePage-B0wCQdev.js";function H(e,t){return s(`div`,e,[s(`table`,{class:`q-table`},t)])}var Ae={list:xe,table:Se},je=[`list`,`table`,`__qtable`],Me=ae({name:`QVirtualScroll`,props:{...M,type:{type:String,default:`list`,validator:e=>je.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:k},setup(e,{slots:n,attrs:r}){let i,a=t(null),o=S(()=>e.itemsSize>=0&&e.itemsFn!==void 0?Number.parseInt(e.itemsSize,10):Array.isArray(e.items)?e.items.length:0),{virtualScrollSliceRange:c,localResetVirtualScroll:u,padVirtualScroll:f,onVirtualScrollEvt:m}=j({virtualScrollLength:o,getVirtualScrollTarget:y,getVirtualScrollEl:v}),h=S(()=>{if(o.value===0)return[];let t=(e,t)=>({index:c.value.from+t,item:e});return e.itemsFn===void 0?e.items.slice(c.value.from,c.value.to).map(t):e.itemsFn(c.value.from,c.value.to-c.value.from).map(t)}),g=S(()=>`q-virtual-scroll q-virtual-scroll`+(e.virtualScrollHorizontal?`--horizontal`:`--vertical`)+(e.scrollTarget===void 0?` scroll`:``)),_=S(()=>e.scrollTarget===void 0?{tabindex:0}:{});l(o,()=>{u()}),l(()=>e.scrollTarget,()=>{w(),C()});function v(){let e=a.value;return e===null?null:e.$el||e}function y(){return i}function C(){let t=v();t!==null&&(i=pe(t,e.scrollTarget),i.addEventListener(`scroll`,m,ne.passive))}function w(){i!==void 0&&(i.removeEventListener(`scroll`,m,ne.passive),i=void 0)}function T(){let t=f(e.type===`list`?`div`:`tbody`,h.value.map(n.default));return n.before!==void 0&&(t=n.before().concat(t)),oe(n.after,t)}return u(),p(()=>{C()}),x(()=>{C()}),d(()=>{w()}),b(()=>{w()}),()=>{if(n.default===void 0){console.error(`QVirtualScroll: default scoped slot is required for rendering`);return}return e.type===`__qtable`?H({ref:a,class:`q-table__middle `+g.value,tabindex:0},T()):s(Ae[e.type],{...r,ref:a,class:[r.class,g.value],..._.value},T)}}}),U=new Set([`setup`,`cleanup`,`archive`]);function Ne(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:U.has(e.sender)||me(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function Pe(e){let t=[],n=null,r=null;for(let i of e){let e=Ne(i),a=e===`session`||e===`system-prompt`,o=e===`script`&&i.type===`user`?`script:${i.sender}`:e===`user`&&i.type===`user`&&i.source?JSON.stringify([`mcp`,i.source.transport,i.source.clientName]):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}function Fe(e){switch(e.type){case`text`:return`text:${e.messageId}`;case`thinking`:return`thinking:${e.messageId}:${e.eventIds?.[0]??e.ts??``}`;case`tool`:return`tool:${e.toolCallId}`;case`session`:return`session:${e.kind}:${e.eventIds?.[0]??e.ts??``}`;case`user`:return`user:${e.eventIds?.[0]??`${e.sender}:${e.ts??``}`}`;case`error`:return`error:${e.eventIds?.[0]??`${e.category}:${e.ts??``}`}`}}function Ie(e){let t=e.items[0];return`${e.speaker}:${t?Fe(t):`empty`}`}function Le(e,t){let n=Math.min(t,e.length)-1;for(let t=n;t>=0;t--)if(e[t]?.speaker===`user`)return t;return-1}function Re(e,t,n){return new Promise(r=>{let i=!1,a=null,o=null,s=e=>{i||(i=!0,a!==null&&clearTimeout(a),a=null,o?.(),r(e))};if(o=l(e,e=>{t(e)&&s(!0)},{immediate:!0}),i){o();return}a=setTimeout(()=>s(!1),n)})}var W={class:`agent-error-item`},ze={class:`agent-error-item__body`},Be={class:`agent-error-item__title`},Ve={class:`agent-error-item__message`},G=R(E({__name:`AgentErrorItem`,props:{item:{}},setup(e){let t=e,{te:r}=de(),i=S(()=>{let e=`agent.error.${t.item.category}`;return r(e)?e:`agent.error.other`});return(t,r)=>(u(),C(`div`,W,[g(re,{name:`error_outline`,size:`16px`,class:`agent-error-item__icon`}),T(`div`,ze,[T(`div`,Be,n(t.$t(i.value)),1),T(`div`,Ve,n(e.item.message),1)])]))}}),[[`__scopeId`,`data-v-e98c3c02`]]),He={class:`text-caption text-kobo-3`},Ue=E({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,r=S(()=>{switch(t.item.kind){case`started`:return`session.started`;case`ended`:return z(t.item.detail);case`compacted`:return`session.compacted`;default:return`session.started`}});return(e,t)=>(u(),C(`span`,He,n(e.$t(r.value)),1))}}),K=new Map;function We(){for(let e of K.values())e.controller.abort(),e.blobUrl&&URL.revokeObjectURL(e.blobUrl);K.clear()}typeof window<`u`&&(window.addEventListener(`kobo:auth-token-changed`,We),window.addEventListener(`storage`,e=>{(e.key===`kobo:network-token`||e.key===null)&&We()}));function q(e){if(!/^\/api\/workspaces\/[^/]+\/images\/file\?path=/.test(e))throw Error(`Invalid workspace image URL`);let t=K.get(e);if(!t){let n=new AbortController,r={references:0,controller:n,ready:Promise.resolve(``)};r.ready=le(e,{signal:n.signal}).then(async e=>{if(!e.ok)throw await se(e);let t=await e.blob();if(n.signal.aborted)throw new DOMException(`Aborted`,`AbortError`);return r.blobUrl=URL.createObjectURL(t),r.blobUrl}),t=r,K.set(e,t)}t.references++;let n=!1,r=t;return{ready:r.ready,release(){n||(n=!0,!(--r.references>0)&&(r.controller.abort(),r.blobUrl&&URL.revokeObjectURL(r.blobUrl),K.get(e)===r&&K.delete(e)))}}}function J(e,t){let n=o(``),r=o(0),a=()=>{r.value++},s=e=>{(e.key===`kobo:network-token`||e.key===null)&&a()};return window.addEventListener(`kobo:auth-token-changed`,a),window.addEventListener(`storage`,s),i(()=>{window.removeEventListener(`kobo:auth-token-changed`,a),window.removeEventListener(`storage`,s)}),l([e,r],([e],r,i)=>{let a=!0,o=[],s=document.createElement(`template`);s.innerHTML=e;for(let e of s.content.querySelectorAll(`img`)){let r=e.getAttribute(`src`)??``;if(e.removeAttribute(`data-kobo-image-url`),!/^\/api\/workspaces\/[^/]+\/images\/file\?path=/.test(r))continue;e.removeAttribute(`src`);let i=q(r);o.push(i),i.ready.then(t=>{a&&(e.setAttribute(`src`,t),e.setAttribute(`data-kobo-image-url`,r),n.value=s.innerHTML)}).catch(()=>{a&&(e.setAttribute(`title`,t()),n.value=s.innerHTML)})}n.value=s.innerHTML,i(()=>{a=!1;for(let e of o)e.release()})},{immediate:!0}),n}function Ge(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 Ke=[`innerHTML`],qe=[`innerHTML`],Je=[`src`],Ye=R(E({__name:`UserMessageItem`,props:{item:{},workspaceId:{}},setup(t){let n=t,{t:r}=de(),a=S(()=>n.item.sender===`system-prompt`),s=J(S(()=>{let e=Ge(n.item.content,n.workspaceId);return ke(e)}),()=>r(`network.login.unreachable`)),c=o(null),d=o(!1),f;function p(){d.value=!1,c.value=null,f?.release(),f=void 0}l(d,e=>{e||p()}),l(()=>n.workspaceId,p);let m=e=>{(e.key===`kobo:network-token`||e.key===null)&&p()};window.addEventListener(`storage`,m),window.addEventListener(`kobo:auth-token-changed`,p),i(()=>{p(),window.removeEventListener(`kobo:auth-token-changed`,p),window.removeEventListener(`storage`,m)});function y(e){let t=e.target;if(t?.tagName!==`IMG`)return;let n=t;n.src&&(p(),n.dataset.koboImageUrl&&(f=q(n.dataset.koboImageUrl),f.ready.catch(p)),c.value=n.src,d.value=!0)}return(t,n)=>(u(),C(w,null,[a.value?(u(),_(Ce,{key:0,dense:``,"dense-toggle":``,label:t.$t(`chat.systemPrompt`),"header-class":`text-kobo-2 text-caption`},{default:h(()=>[T(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:e(s)},null,8,Ke)]),_:1},8,[`label`])):(u(),C(`div`,{key:1,class:`markdown-message`,onClick:y},[T(`div`,{innerHTML:e(s)},null,8,qe)])),g(A,{modelValue:d.value,"onUpdate:modelValue":n[1]||=e=>d.value=e},{default:h(()=>[c.value?(u(),C(`img`,{key:0,src:c.value,alt:``,class:`image-lightbox-img`,onClick:n[0]||=e=>d.value=!1},null,8,Je)):v(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-db2fc622`]]),Xe=[`data-event-ids`],Ze={class:`turn-header`},Y={key:0,class:`turn-time`},Qe={class:`turn-time turn-time-updated`},X={key:2,class:`turn-actions`},$e={class:`turn-body`},Z={class:`q-px-sm q-pb-sm`},et={key:0,class:`turn-scroll-top`},tt=R(E({__name:`TurnCard`,props:{turn:{},workspaceId:{},highlighted:{type:Boolean}},emits:[`scrollTo`],setup(t,{emit:i}){let s=t,c=i,{t:l}=de(),d=m(F),f=o(null);function p(){let e=f.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;c(`scrollTo`,Math.max(0,n-8))}let b=S(()=>{switch(s.turn.speaker){case`user`:{let e=s.turn.items[0],t=e?.type===`user`?e.source:void 0;return{label:t?l(`chat.externalLlm`,{name:t.clientName}):l(`chat.you`),accent:`var(--kobo-turn-user)`,badgeClass:`turn-badge-user`}}case`agent`:return{label:l(`chat.agent`),accent:`var(--kobo-turn-agent)`,badgeClass:`turn-badge-agent`};case`system-prompt`:return{label:l(`chat.systemPrompt`),accent:`var(--kobo-text-3)`,badgeClass:`turn-badge-system`};case`session`:return{label:l(`chat.session`),accent:`var(--kobo-text-3)`,badgeClass:`turn-badge-session`};case`script`:{let e=s.turn.items[0],t=e?.type===`user`?e.sender:``;return{label:me(t)?l(`chat.hookScript`,{event:t.slice(5)}):l(t===`archive`?`chat.archiveScript`:t===`setup`?`chat.setupScript`:`chat.cleanupScript`),accent:`var(--kobo-success)`,badgeClass:`turn-badge-script`}}}});function x(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=S(()=>x(s.turn.ts)),te=S(()=>s.turn.items.flatMap(e=>e.eventIds??[]).join(` `)),ne=S(()=>{let e=s.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}),ie=S(()=>{let e=s.turn.ts,t=ne.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?``:x(t,r-n<6e4)}),ae=S(()=>ie.value!==``),oe=S(()=>{let e=[];for(let t of s.turn.items){let n=(t.type===`text`||t.type===`thinking`||t.type===`tool`)&&t.origin?.kind===`subagent`,r=e.at(-1);if(n&&r?.type===`subagent`){r.items.push(t);continue}if(n){e.push({type:`subagent`,key:`subagent:${Fe(t)}`,items:[t]});continue}e.push({type:`item`,key:Fe(t),item:t})}return e});function se(e){e.origin&&d?.({origin:e.origin})}let ce=S(()=>s.turn.items.filter(e=>e.type===`tool`).length);return(i,o)=>(u(),C(`div`,{ref_key:`cardEl`,ref:f,class:a([`turn-card`,{"turn-card--user":t.turn.speaker===`user`,"turn-card--highlighted":t.highlighted}]),"data-event-ids":te.value,style:r({"--turn-accent":b.value.accent})},[T(`div`,Ze,[T(`span`,{class:a([`turn-badge`,b.value.badgeClass])},n(b.value.label),3),E.value?(u(),C(`span`,Y,n(E.value),1)):v(``,!0),ae.value?(u(),C(w,{key:1},[g(re,{name:`arrow_forward`,size:`10px`,color:`kobo-3`,class:`turn-time-arrow`}),T(`span`,Qe,[y(n(ie.value)+` `,1),g(B,null,{default:h(()=>[y(n(e(l)(`chat.lastUpdatedAt`,{time:ie.value})),1)]),_:1})])],64)):v(``,!0),ce.value>0?(u(),C(`span`,X,` · `+n(e(l)(`chat.nActions`,{n:ce.value})),1)):v(``,!0)]),T(`div`,$e,[(u(!0),C(w,null,ee(oe.value,r=>(u(),C(w,{key:r.key},[r.type===`subagent`?(u(),_(Ce,{key:0,class:`turn-subagent-activity`,dense:``,label:e(l)(`chat.subagentActivity`),caption:e(l)(`chat.nActions`,{n:r.items.length}),"default-opened":t.highlighted&&r.items.some(e=>e.eventIds?.some(e=>te.value.includes(e)))},{header:h(()=>[g(P,null,{default:h(()=>[g(N,null,{default:h(()=>[y(n(e(l)(`chat.subagentActivity`)),1)]),_:1}),g(N,{caption:``},{default:h(()=>[y(n(e(l)(`chat.nActions`,{n:r.items.length})),1)]),_:2},1024)]),_:2},1024),g(P,{side:``},{default:h(()=>[g(O,{flat:``,round:``,dense:``,size:`sm`,icon:`open_in_new`,"aria-label":e(l)(`chat.openSubagentActivity`),onClick:D(e=>se(r.items[0]),[`stop`])},{default:h(()=>[g(B,null,{default:h(()=>[y(n(e(l)(`chat.openSubagentActivity`)),1)]),_:1})]),_:1},8,[`aria-label`,`onClick`])]),_:2},1024)]),default:h(()=>[T(`div`,Z,[(u(!0),C(w,null,ee(r.items,t=>(u(),C(w,{key:e(Fe)(t)},[t.type===`text`?(u(),_(I,{key:0,item:t},null,8,[`item`])):t.type===`thinking`?(u(),_(V,{key:1,item:t},null,8,[`item`])):t.type===`tool`?(u(),_(L,{key:2,item:t},null,8,[`item`])):v(``,!0)],64))),128))])]),_:2},1032,[`label`,`caption`,`default-opened`])):(u(),C(w,{key:1},[r.item.type===`text`?(u(),_(I,{key:0,item:r.item},null,8,[`item`])):r.item.type===`thinking`?(u(),_(V,{key:1,item:r.item},null,8,[`item`])):r.item.type===`tool`?(u(),_(L,{key:2,item:r.item},null,8,[`item`])):r.item.type===`user`?(u(),_(Ye,{key:3,item:r.item,"workspace-id":t.workspaceId},null,8,[`item`,`workspace-id`])):r.item.type===`session`?(u(),_(Ue,{key:4,item:r.item},null,8,[`item`])):r.item.type===`error`?(u(),_(G,{key:5,item:r.item},null,8,[`item`])):v(``,!0)],64))],64))),128))]),t.turn.items.length>4?(u(),C(`div`,et,[g(O,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`kobo-3`,class:`turn-scroll-top-btn`,onClick:p},{default:h(()=>[g(B,null,{default:h(()=>[y(n(e(l)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):v(``,!0)],14,Xe))}}),[[`__scopeId`,`data-v-a8a6fa27`]]),nt={key:0,class:`activity-feed-switching`},rt={key:1,class:`activity-feed-wrap`,"data-tour":`ws-chat`},it={key:0,role:`alert`,class:`q-pa-sm text-negative`},at={key:1,"data-testid":`history-load-error`,role:`alert`,class:`q-pa-sm text-negative`},ot=[`aria-label`],st={key:0,class:`activity-feed-compacting`},ct={class:`text-caption text-kobo-2`},lt={key:0,class:`text-center q-py-sm text-caption text-kobo-3`},ut={key:1,class:`activity-feed-empty q-pa-md`},dt={class:`activity-feed-empty__title`},ft={class:`activity-feed-empty__hint`},pt={key:2,class:`q-px-md q-pb-md`},mt={class:`activity-feed-nav-cluster`},ht=300,gt=60,_t=200,vt=180,yt=3,bt=60,Q=R(E({__name:`ActivityFeed`,props:{workspaceId:{}},setup(t){let{t:r}=de(),i=t,a=he(),s=fe(),d=_e(),m=ve(),b=S(()=>m.isCompacting(i.workspaceId)),x=S(()=>d.selectedSessionId),E=S(()=>d.sessions.find(e=>e.id===x.value)?.engineSessionId??null),ne=S(()=>{let e=d.sessions;return e.length!==0&&x.value===e[e.length-1].id});function D(e){return x.value?e?e===x.value||e===E.value:ne.value:!0}let ae=S(()=>(d.activityFeeds[i.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&D(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,source:ge(e.meta?.source),ts:e.timestamp,sessionId:e.sessionId,eventIds:[e.id]}))),oe=S(()=>{let e=d.workspaces.find(e=>e.id===i.workspaceId);return ye(e?.status)}),pe=Oe(),me=``,k=S(()=>{let e=a.eventsFor(i.workspaceId),t=a.timestampsFor(i.workspaceId),n=a.sessionIdsFor(i.workspaceId),r=a.eventIdsFor(i.workspaceId),o=[],c=[],l=[];for(let i=0;i<e.length;i++)D(n[i])&&(o.push(e[i]),c.push(t[i]),l.push(r[i]??null));let u=`${i.workspaceId}::${x.value??`*`}`;u!==me&&(pe=Oe(),me=u);let d=Te(pe,o,c,oe.value,l);return Pe(Ee(d,ae.value).filter(e=>e.type===`thinking`?!1:e.type===`session`?e.kind===`ended`?s.showVerboseSystemMessages||!De(e.detail):s.showVerboseSystemMessages:!0))}),A=S(()=>s.showVerboseSystemMessages?a.eventsFor(i.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),xe=S(()=>{for(let e=k.value.length-1;e>=0;e--){let t=k.value[e]?.items??[];for(let e=t.length-1;e>=0;e--){let n=t[e];if(n){if(n.type===`text`&&!n.streaming)return{key:`text:${n.messageId}`,text:n.text};if(n.type===`tool`)return n.result?{key:`tool:${n.toolCallId}:end`,text:n.result.isError?r(`activity.a11y.toolFailed`,{name:n.name}):r(`activity.a11y.toolFinished`,{name:n.name})}:{key:`tool:${n.toolCallId}:start`,text:r(`activity.a11y.toolStarted`,{name:n.name})}}}}return null}),Se=o(``);l(xe,(e,t)=>{if(!e||e.key===t?.key)return;let n=e.key.startsWith(`text:`)?r(`activity.a11y.agentSaid`,{text:e.text.slice(0,ht)}):e.text;Se.value=n});let j=o(null),M=o(!0),N=o(!1),P=o(``),F=ue(),I=ue(),L=ue(),R=o(null),z=!1,B=!0,ke=null,V=o(new Set),H=new Map,Ae=S(()=>{if(k.value.length>0||A.value.length>0)return!1;let e=i.workspaceId,t=x.value;return!!d.loadingSessions[e]||m.isSyncPending(e)||t!==null&&V.value.has(W(e,t))}),je=o(new Map),U=S(()=>k.value.length>0||A.value.length>0),Ne=S(()=>!!d.loadingSessions[i.workspaceId]||m.isSyncPending(i.workspaceId)||x.value!==null&&V.value.has(W(i.workspaceId,x.value)));function Fe(e){let t=ke;if(ke=e.verticalSize,t!==null&&e.verticalSize>t&&M.value&&!N.value){q(0);return}let n=e.verticalSize-e.verticalPosition-e.verticalContainerSize;M.value=n<=gt,z&&e.verticalPosition<=_t&&!N.value&&!P.value&&ze()&&He()}function W(e,t){return`${e}:${t}`}function ze(){let e=x.value;return e?je.value.get(W(i.workspaceId,e))??!0:a.hasMoreOlderFor(i.workspaceId)}function Be(e,t,n){je.value.set(W(e,t),n)}function Ve(e){if(!x.value)return a.oldestIdFor(e);let t=a.eventIdsFor(e),n=a.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!D(n[e]))continue;let r=t[e];if(r)return r}}let G=null;function He(){if(G)return G;let e=We().finally(()=>{G===e&&(G=null)});return G=e,G}function Ue(){F.abort(),I.abort(),L.abort(),N.value=!1,G=null;for(let e of V.value)wt.delete(e);H.clear(),V.value.clear(),P.value=``}function K(){P.value=``,xt.value===0&&x.value?Tt():He()}l(()=>[i.workspaceId,x.value],Ue,{flush:`sync`});async function We(){let e=i.workspaceId,t=x.value,n=Ve(e);if(!n)return;let r=F.begin();P.value=``,N.value=!0;try{let i=j.value;if(await f(),!F.isCurrent(r))return;let o=i?.getScroll().verticalSize??0,s=i?.getScroll().verticalPosition??0,c=new URLSearchParams({before:n,limit:`200`});t&&c.set(`session`,t);let l=await le(`/api/workspaces/${e}/events?${c.toString()}`,{signal:r});if(!l.ok)throw await se(l);let u=await l.json();if(!F.isCurrent(r))return;let p=u.events??[],m=p.filter(t=>t.type===`agent:event`&&t.workspaceId===e),h=p.filter(t=>t.type===`user:message`&&t.workspaceId===e),g=m.map(e=>e.payload),_=m.map(e=>e.createdAt),v=m.map(e=>e.sessionId??null),y=m.map(e=>e.id),b=p.length>0?p[0].id:n;t&&Be(e,t,u.hasMore),a.prepend(e,g,_,{oldestId:b,hasMoreOlder:t?a.hasMoreOlderFor(e):u.hasMore,sessionIds:v,eventIds:y});for(let t of h){let n=t.payload;typeof n.content==`string`&&d.addActivityItem(e,{id:t.id,type:`text`,content:n.content,timestamp:t.createdAt,sessionId:t.sessionId??void 0,meta:{sender:n.sender??`user`,source:ge(n.source)}})}if(await f(),i&&F.isCurrent(r)){let e=i.getScroll().verticalSize-o;if(e>0){let t=Math.max(s+e,250);i.setScrollPosition(`vertical`,t,0)}}}catch(e){if(ce(e)||!F.isCurrent(r))return;P.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to load older events:`,e)}finally{F.isCurrent(r)&&(N.value=!1)}}async function q(e=0){let t=Ct();if(await f(),t!==Ct())return;let n=j.value;if(!n)return;let r=n.getScroll();n.setScrollPosition(`vertical`,r.verticalSize,e)}let J=null,Ge=0;function Ke(){if(J!=null)return;let e=performance.now()-Ge<vt,t=Ct();J=requestAnimationFrame(()=>{J=null,t===Ct()&&(Ge=performance.now(),q(e?0:180))})}function qe(e){$(),M.value=!1;let t=j.value;t&&t.setScrollPosition(`vertical`,Math.max(0,e),250)}function Je(){let e=window.location.hash,t=e.indexOf(`?`);if(t===-1||!new URLSearchParams(e.slice(t+1)).has(`eventId`))return;let n=e.slice(0,t);window.history.replaceState(window.history.state,``,`${window.location.pathname}${window.location.search}${n}`)}async function Ye(e){let t=e.detail;if(t?.workspaceId!==i.workspaceId||!t.eventId)return;$(),M.value=!1;let n=L.begin(),r=i.workspaceId;try{let e=new URLSearchParams({around:t.eventId,limit:`200`});t.sessionId&&e.set(`session`,t.sessionId);let o=await le(`/api/workspaces/${r}/events?${e}`,{signal:n});if(!o.ok)throw await se(o);let s=await o.json();if(!L.isCurrent(n))return;let c=s.events??[],l=c.filter(e=>e.type===`agent:event`&&e.workspaceId===i.workspaceId),u=c.filter(e=>e.type===`user:message`&&e.workspaceId===i.workspaceId);a.reset(i.workspaceId,l.map(e=>e.payload),l.map(e=>e.createdAt),{oldestId:c[0]?.id,hasMoreOlder:s.hasMore??!1,sessionIds:l.map(e=>e.sessionId),eventIds:l.map(e=>e.id)});for(let e of u){let t=e.payload;typeof t.content==`string`&&d.addActivityItem(i.workspaceId,{id:e.id,type:`text`,content:t.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:t.sender??`user`,source:ge(t.source)}})}if(await Re(Ae,e=>!e,5e3),await f(),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e()))),!L.isCurrent(n))return;let p=k.value.findIndex(e=>e.items.some(e=>e.eventIds?.includes(t.eventId)??!1));if(p<0)return;R.value=t.eventId,Xe.value?.scrollTo(p,`center`),Y.value=p,window.setTimeout(()=>{R.value===t.eventId&&(R.value=null)},1800)}catch(e){if(ce(e)||!L.isCurrent(n))return;P.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to focus history event:`,e)}}let Xe=o(null),Ze=o(null),Y=o(0);function Qe(e){Y.value=e.index}let X=o(!1);async function $e(){if(X.value)return;$(),M.value=!1,X.value=!0;let e=i.workspaceId;try{let t=Le(k.value,Y.value);if(t<0)for(let n=0;n<15;n++){if(e!==i.workspaceId)return;if(!ze())break;let n=k.value.length;if(await He(),await f(),e!==i.workspaceId)return;if(Y.value+=k.value.length-n,t=Le(k.value,Y.value),t>=0)break}t>=0&&e===i.workspaceId&&(Xe.value?.scrollTo(t,`start`),Y.value=t)}finally{X.value=!1}}let Z=0;function et(){return new Promise(e=>requestAnimationFrame(()=>e()))}async function Q(){if(!B||!U.value||Ae.value)return;z=!1;let e=++Z;if(await f(),e!==Z||!B||(Ze.value=j.value?.getScrollTarget()??null,await f(),e!==Z||!B))return;k.value.length>0&&Xe.value?.scrollTo(k.value.length-1,`end-force`),await et();let t=-1,n=0;for(let r=0;r<bt&&n<yt;r++){if(e!==Z||!B)return;await q(0),await et();let r=j.value?.getScroll().verticalSize??0;ke=r,n=r===t?n+1:0,t=r}e===Z&&!Ne.value&&(z=!0,B=!1)}function $(){B=!1,!z&&(Z++,z=!0)}let xt=S(()=>{let e=a.sessionIdsFor(i.workspaceId);if(!x.value)return e.length;let t=0;for(let n of e)D(n)&&t++;return t});l(Ae,async e=>{!e&&U.value&&await Q(),e||f(()=>{Ze.value=j.value?.getScrollTarget()??null})}),l(Ne,(e,t)=>{!e&&t&&B&&U.value&&Q()}),p(()=>{window.addEventListener(`kobo:focus-history-event`,Ye),f(()=>{Ze.value=j.value?.getScrollTarget()??null}),U.value&&Q(),x.value&&Tt();let e=new URLSearchParams(window.location.hash.split(`?`)[1]??``).get(`eventId`);e&&(Ye(new CustomEvent(`kobo:focus-history-event`,{detail:{workspaceId:i.workspaceId,sessionId:x.value,eventId:e}})),Je())}),l([xt,()=>ae.value.length,()=>A.value.length],async([e,t,n])=>{N.value||B&&e+t+n>0&&await Q()});let St=S(()=>a.liveAppendCountFor(i.workspaceId,D)),Ct=()=>`${i.workspaceId}\u0000${d.selectedSessionId??``}`;l([St,Ct],([e,t],[n,r])=>{t===r&&e>n&&M.value&&!N.value&&Ke()}),c(()=>{Z++,B=!1,Ue(),window.removeEventListener(`kobo:focus-history-event`,Ye),J!=null&&(cancelAnimationFrame(J),J=null)}),l([()=>i.workspaceId,()=>d.selectedSessionId],()=>{Z++,B=!0,ke=null,M.value=!0,z=!1,Tt(),U.value&&Q()});let wt=new Set;async function Tt(){let e=i.workspaceId,t=x.value;if(!t||xt.value>0)return;let n=W(e,t);if(wt.has(n))return;wt.add(n),V.value.add(n);let r=I.begin();H.set(n,r),P.value=``;try{let n=await le(`/api/workspaces/${e}/events?session=${encodeURIComponent(t)}&limit=500`,{signal:r});if(!n.ok)throw await se(n);let i=await n.json();if(!I.isCurrent(r))return;let o=i.events??[];if(o.length===0)return;let s=o.filter(t=>t.type===`agent:event`&&t.workspaceId===e),c=o.filter(t=>t.type===`user:message`&&t.workspaceId===e),l=s.map(e=>e.payload),u=s.map(e=>e.createdAt),f=s.map(e=>e.sessionId??null),p=s.map(e=>e.id);Be(e,t,i.hasMore),l.length>0&&a.prepend(e,l,u,{oldestId:o[0].id,hasMoreOlder:a.hasMoreOlderFor(e),sessionIds:f,eventIds:p});for(let t of c){let n=t.payload;typeof n.content==`string`&&d.addActivityItem(e,{id:t.id,type:`text`,content:n.content,timestamp:t.createdAt,sessionId:t.sessionId??void 0,meta:{sender:n.sender??`user`,source:ge(n.source)}})}}catch(e){if(ce(e)||!I.isCurrent(r)){(!H.has(n)||H.get(n)===r)&&wt.delete(n);return}P.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),wt.delete(n)}finally{H.get(n)===r&&(H.delete(n),V.value.delete(n))}}let Et=S(()=>ae.value.filter(e=>e.sender===`user`).length),Dt=S(()=>(d.activityFeeds[i.workspaceId]??[]).filter(e=>e.meta?.sender===`user`&&e.meta.pending&&D(e.sessionId)).length);l([Et,Dt,Ct],async([e,t,n],[r,i,a])=>{let o=t>i;n===a&&(o||e>r&&M.value&&!N.value&&!Ne.value)&&(M.value=!0,await q(o?180:0))});async function Ot(){M.value=!0,await q(250)}return(t,r)=>Ae.value?(u(),C(`div`,nt,[g(be,{size:`40px`,color:`primary`})])):(u(),C(`div`,rt,[e(d).sessionsErrors[i.workspaceId]?(u(),C(`div`,it,[y(n(t.$t(`activity.sessionsError`,{message:e(d).sessionsErrors[i.workspaceId]}))+` `,1),g(O,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:r[0]||=t=>e(d).fetchSessions(i.workspaceId)},null,8,[`label`])])):v(``,!0),P.value?(u(),C(`div`,at,[y(n(t.$t(`activity.historyError`,{message:P.value}))+` `,1),g(O,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:K},null,8,[`label`])])):v(``,!0),T(`div`,{"data-testid":`activity-live-region`,class:`sr-only`,role:`log`,"aria-live":`polite`,"aria-atomic":`true`,"aria-label":t.$t(`activity.a11y.region`)},n(Se.value),9,ot),g(ie,{name:`fade`},{default:h(()=>[b.value?(u(),C(`div`,st,[g(be,{size:`18px`,color:`primary`}),T(`span`,ct,n(t.$t(`activity.compacting`)),1)])):v(``,!0)]),_:1}),g(we,{ref_key:`scrollRef`,ref:j,class:`activity-feed-scroll`,onScroll:Fe,onWheelPassive:$,onTouchstartPassive:$,onKeydown:$},{default:h(()=>[N.value?(u(),C(`div`,lt,[g(te,{size:`sm`}),y(` `+n(t.$t(`activity.loading_older`)),1)])):v(``,!0),g(Me,{ref_key:`virtualScrollRef`,ref:Xe,class:`q-pa-md`,items:k.value,"scroll-target":Ze.value??void 0,"virtual-scroll-item-size":160,"virtual-scroll-slice-size":20,onVirtualScroll:Qe},{default:h(({item:t,index:n})=>[(u(),_(tt,{key:e(Ie)(t),turn:t,"workspace-id":i.workspaceId,"data-turn-index":n,highlighted:t.items.some(e=>e.eventIds?.includes(R.value??``)??!1),onScrollTo:qe},null,8,[`turn`,`workspace-id`,`data-turn-index`,`highlighted`]))]),_:1},8,[`items`,`scroll-target`]),k.value.length===0&&A.value.length===0&&!N.value?(u(),C(`div`,ut,[g(re,{name:`forum`,size:`28px`}),T(`div`,dt,n(t.$t(`activity.empty`)),1),T(`div`,ft,n(t.$t(`activity.emptyHint`)),1)])):v(``,!0),A.value.length?(u(),C(`div`,pt,[g(Ce,{label:t.$t(`activity.raw_lines`,{n:A.value.length}),dense:``},{default:h(()=>[(u(!0),C(w,null,ee(A.value,(e,t)=>(u(),C(`div`,{key:t,class:`text-caption text-kobo-3 q-pa-xs`},n(e),1))),128))]),_:1},8,[`label`])])):v(``,!0)]),_:1},512),T(`div`,mt,[M.value?v(``,!0):(u(),_(O,{key:0,round:``,dense:``,unelevated:``,color:`kobo-surface-2`,"text-color":`kobo-1`,icon:`arrow_downward`,size:`sm`,class:`activity-feed-nav-btn`,title:t.$t(`activity.scroll_to_bottom`),"aria-label":t.$t(`activity.scroll_to_bottom`),onClick:Ot},null,8,[`title`,`aria-label`])),g(O,{round:``,dense:``,unelevated:``,color:`kobo-surface-2`,"text-color":`kobo-1`,icon:`arrow_upward`,size:`sm`,class:`activity-feed-nav-btn`,title:t.$t(`activity.prev_user_message`),"aria-label":t.$t(`activity.prev_user_message`),loading:X.value,disable:X.value,onClick:$e},null,8,[`title`,`aria-label`,`loading`,`disable`])])]))}}),[[`__scopeId`,`data-v-f3878c46`]]);export{Q as default};
@@ -1 +0,0 @@
1
- .agent-error-item[data-v-e98c3c02]{gap:var(--kobo-space-sm);padding:var(--kobo-space-sm) var(--kobo-space-md);border-left:2px solid var(--kobo-danger);background:var(--kobo-surface-2);border-radius:var(--kobo-radius-sm);align-items:flex-start;display:flex}.agent-error-item__icon[data-v-e98c3c02]{color:var(--kobo-danger);flex:none;margin-top:2px}.agent-error-item__body[data-v-e98c3c02]{min-width:0}.agent-error-item__title[data-v-e98c3c02]{color:var(--kobo-text);font-weight:600}.agent-error-item__message[data-v-e98c3c02]{color:var(--kobo-text-2);font-family:var(--kobo-font-mono);white-space:pre-wrap;word-break:break-word;font-size:12px}.markdown-message[data-v-db2fc622]{color:var(--kobo-text-2);word-break:break-word;overflow-wrap:anywhere;min-width:0;max-width:100%;font-size:13px;line-height:1.55}.markdown-message[data-v-db2fc622] *{max-width:100%}.markdown-message[data-v-db2fc622] 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-db2fc622] code{word-break:break-all}.markdown-message[data-v-db2fc622] p{margin:0 0 .4em}.markdown-message[data-v-db2fc622] p:last-child{margin-bottom:0}.markdown-message[data-v-db2fc622] code{background:#00000040;border-radius:3px;padding:.1em .3em}.markdown-message[data-v-db2fc622] h1,.markdown-message[data-v-db2fc622] h2,.markdown-message[data-v-db2fc622] h3,.markdown-message[data-v-db2fc622] h4,.markdown-message[data-v-db2fc622] h5,.markdown-message[data-v-db2fc622] h6{margin:.4em 0 .25em;font-weight:600;line-height:1.3}.markdown-message[data-v-db2fc622] h1{font-size:1.25em}.markdown-message[data-v-db2fc622] h2{font-size:1.15em}.markdown-message[data-v-db2fc622] h3{font-size:1.08em}.markdown-message[data-v-db2fc622] h4,.markdown-message[data-v-db2fc622] h5,.markdown-message[data-v-db2fc622] h6{font-size:1em}.markdown-user-prompt[data-v-db2fc622]{color:var(--kobo-text-2);font-size:12px;font-style:italic}.markdown-user-prompt[data-v-db2fc622] p{margin:0 0 .4em}.markdown-user-prompt[data-v-db2fc622] 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-a8a6fa27]{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-card--highlighted[data-v-a8a6fa27]{animation:1.8s ease-out search-highlight-a8a6fa27}@keyframes search-highlight-a8a6fa27{0%,45%{box-shadow:0 0 0 2px #818cf8f2,0 0 22px #818cf873}to{box-shadow:none}}.turn-header[data-v-a8a6fa27]{color:var(--kobo-text-3);background:#ffffff08;border-bottom:1px solid #ffffff0d;align-items:center;gap:8px;padding:8px 14px;font-size:11px;display:flex}.turn-badge[data-v-a8a6fa27]{letter-spacing:.3px;border-radius:3px;padding:2px 8px;font-size:11px;font-weight:700}.turn-badge-user[data-v-a8a6fa27]{color:var(--kobo-turn-user);background:#ce93d826}.turn-badge-agent[data-v-a8a6fa27]{color:var(--kobo-turn-agent);background:#7986cb26}.turn-badge-system[data-v-a8a6fa27]{color:var(--kobo-text-2);background:#75757533;font-style:italic}.turn-badge-session[data-v-a8a6fa27]{color:var(--kobo-text-3);background:#61616133}.turn-badge-script[data-v-a8a6fa27]{color:var(--kobo-success);background:#4db6ac26}.turn-time[data-v-a8a6fa27]{color:var(--kobo-text-disabled);font-family:var(--kobo-font-mono);font-size:11px}.turn-time-arrow[data-v-a8a6fa27]{opacity:.7;margin:0 -2px}.turn-time-updated[data-v-a8a6fa27]{color:var(--kobo-text-3)}.turn-actions[data-v-a8a6fa27]{color:var(--kobo-text-3);font-size:11px}.turn-body[data-v-a8a6fa27]{flex-direction:column;gap:12px;min-width:0;padding:14px 18px;display:flex}.turn-body[data-v-a8a6fa27]>*{min-width:0;max-width:100%}.turn-body[data-v-a8a6fa27] .tool-row+.tool-row{margin-top:-8px}.turn-scroll-top[data-v-a8a6fa27]{justify-content:flex-start;padding:0 8px 6px;display:flex}.turn-scroll-top-btn[data-v-a8a6fa27]{opacity:.5;transition:opacity .15s}.turn-scroll-top-btn[data-v-a8a6fa27]:hover{opacity:1}.activity-feed-wrap[data-v-f3878c46]{flex-direction:column;width:100%;height:100%;display:flex;position:relative}.activity-feed-scroll[data-v-f3878c46]{flex:1;width:100%;height:100%;min-height:0}.activity-feed-nav-cluster[data-v-f3878c46]{z-index:2;align-items:center;gap:8px;display:flex;position:absolute;bottom:14px;right:14px}.activity-feed-compacting[data-v-f3878c46]{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-f3878c46],.fade-leave-active[data-v-f3878c46]{transition:opacity .16s}.fade-enter-from[data-v-f3878c46],.fade-leave-to[data-v-f3878c46]{opacity:0}.activity-feed-nav-btn[data-v-f3878c46]{opacity:.8;transition:opacity .12s}.activity-feed-nav-btn[data-v-f3878c46]:hover{opacity:1}.activity-feed-scroll[data-v-f3878c46] .q-scrollarea__content{max-width:100%;overflow-x:hidden}.activity-feed-switching[data-v-f3878c46]{justify-content:center;align-items:center;width:100%;height:100%;display:flex}.activity-feed-empty[data-v-f3878c46]{align-items:center;gap:var(--kobo-space-sm);padding:var(--kobo-space-4xl) var(--kobo-space-xl);color:var(--kobo-text-3);text-align:center;flex-direction:column;display:flex}.activity-feed-empty__title[data-v-f3878c46]{font-family:var(--kobo-font-sans);color:var(--kobo-text-2);font-size:14px;font-weight:500}.activity-feed-empty__hint[data-v-f3878c46]{font-family:var(--kobo-font-sans);color:var(--kobo-text-3);max-width:380px;font-size:13px}
@@ -1 +0,0 @@
1
- import{M as e,dt as t,v as n}from"./reactivity.esm-bundler-tuEvQ47f.js";import{L as r,P as i,Y as a,_ as o,d as s,f as c,p as l,r as u,u as d,y as f,z as p}from"./runtime-core.esm-bundler-DOiZcasU.js";import{t as m}from"./QBtn-b_baQtAt.js";import{l as h,o as g}from"./latest-request-CBPb8UWQ.js";import{Jt as _,Kt as v,i as y}from"./index-BPmUmc6D.js";import{a as b,i as x,n as S}from"./use-tours-Dum-bOyQ.js";import{n as C}from"./render-chat-markdown-CafzCcmu.js";import{t as w}from"./QChip-Chu7r6RZ.js";import{t as T}from"./QPage-BCDXjfVj.js";import{t as E}from"./DrawerToggleButton-DKytIBlk.js";import{t as D}from"./TourReplayButton-DhbNI6O5.js";var O={class:`row items-center q-mb-md`},k={class:`text-h6 q-ml-sm`},A={key:0,class:`text-kobo-3 text-center q-pa-lg`},j={key:1,class:`text-negative text-center q-pa-lg`},M={key:2,class:`text-kobo-3 text-center q-pa-lg`},N={key:3,class:`column q-gutter-md`,"data-tour":`changelog-list`},P={key:0,class:`text-caption text-kobo-3`},F={class:`row items-center q-mb-sm`},I={class:`text-subtitle1 text-kobo-2`,style:{"font-family":`var(--kobo-font-mono, monospace)`}},L=[`innerHTML`],R=b(f({__name:`ChangelogPage`,setup(f){let b=y(),{scheduleAutoRun:R}=S(),z=n([]),B=n(``),V=n(!1),H=n(null);function U(e){return C(e)}async function W(){V.value=!0,H.value=null;try{let e=await g(`/api/changelog`);if(!e.ok)throw await h(e);let t=await e.json();B.value=t.currentVersion??``,z.value=t.versions??[]}catch(e){H.value=e instanceof Error?e.message:String(e)}finally{V.value=!1}}return i(()=>{W(),R(`changelog`)}),(n,i)=>(r(),s(T,{class:`q-pa-md`,style:{"max-width":`900px`,margin:`0 auto`}},{default:a(()=>[d(`div`,O,[o(E,{class:`q-mr-xs`}),o(m,{flat:``,dense:``,round:``,icon:`arrow_back`,onClick:i[0]||=t=>e(b).back()}),d(`div`,k,t(n.$t(`changelog.title`)),1),o(x),o(m,{flat:``,dense:``,icon:`refresh`,loading:V.value,label:n.$t(`common.refresh`),onClick:W},null,8,[`loading`,`label`]),o(D,{"tour-id":`changelog`,class:`q-ml-xs`})]),V.value&&z.value.length===0?(r(),l(`div`,A,t(n.$t(`common.loading`)),1)):H.value?(r(),l(`div`,j,t(H.value),1)):z.value.length===0?(r(),l(`div`,M,t(n.$t(`changelog.empty`)),1)):(r(),l(`div`,N,[B.value?(r(),l(`div`,P,t(n.$t(`changelog.currentVersion`,{version:B.value})),1)):c(``,!0),(r(!0),l(u,null,p(z.value,e=>(r(),s(v,{key:e.version,dark:``,flat:``,bordered:``},{default:a(()=>[o(_,null,{default:a(()=>[d(`div`,F,[d(`div`,I,` v`+t(e.version),1),e.version===B.value?(r(),s(w,{key:0,dense:``,size:`sm`,color:`primary`,"text-color":`kobo-1`,label:n.$t(`changelog.current`),class:`q-ml-sm`},null,8,[`label`])):c(``,!0)]),d(`div`,{class:`changelog-notes`,innerHTML:U(e.notes)},null,8,L)]),_:2},1024)]),_:2},1024))),128))]))]),_:1}))}}),[[`__scopeId`,`data-v-4032778f`]]);export{R as default};
@@ -1 +0,0 @@
1
- import{H as e,rt as t}from"./QBtn-b_baQtAt.js";import{g as n,h as r}from"./use-id-b4A2I8LB.js";function i(e){return e===!1?0:e===!0||e===void 0?1:Number.parseInt(e,10)||0}function a(e){let t=e.currentTarget,i=t.__qclosepopup;i!==0&&setTimeout(()=>{let a=n(t);a!==void 0&&r(a,e,i)},0)}function o(t){e(t,13)&&a(t)}var s=t({name:`close-popup`,beforeMount(e,{value:t}){e.__qclosepopup=i(t),e.addEventListener(`click`,a),e.addEventListener(`keyup`,o)},updated(e,{value:t,oldValue:n}){t!==n&&e.__qclosepopup!==void 0&&(e.__qclosepopup=i(t))},beforeUnmount(e){e.__qclosepopup!==void 0&&(e.removeEventListener(`click`,a),e.removeEventListener(`keyup`,o),e.__qclosepopup=void 0)}});export{s as t};