@loicngr/kobo 2.1.18 → 2.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +49 -0
- package/CHANGELOG.md +4 -0
- package/CONFIGURATION.md +47 -1
- package/README.md +2 -0
- package/dist/mcp-server/kobo-tasks-server.js +28 -6
- package/dist/mcp-server/progress-bar-client.js +20 -0
- package/dist/mcp-server/workspace-dialogue-client.js +27 -7
- package/dist/server/db/migrations.js +2 -0
- package/dist/server/db/progress-bar-schema.js +27 -0
- package/dist/server/db/schema.js +2 -0
- package/dist/server/index.js +4 -0
- package/dist/server/routes/mcp.js +19 -9
- package/dist/server/routes/progress-bars.js +56 -0
- package/dist/server/routes/workspaces.js +33 -63
- package/dist/server/services/agent/engines/claude-code/engine.js +59 -16
- package/dist/server/services/agent/engines/claude-code/options-builder.js +13 -34
- package/dist/server/services/agent/engines/claude-code/stop-hook.js +8 -27
- package/dist/server/services/agent/engines/codex/engine.js +8 -1
- package/dist/server/services/agent/engines/codex/options-builder.js +11 -16
- package/dist/server/services/agent/orchestrator.js +53 -7
- package/dist/server/services/auto-loop-final-review-service.js +1 -1
- package/dist/server/services/auto-loop-service.js +10 -10
- package/dist/server/services/progress-bar-mcp-service.js +44 -0
- package/dist/server/services/progress-bar-runtime.js +29 -0
- package/dist/server/services/progress-bar-service.js +232 -0
- package/dist/shared/auto-loop-prompts.js +12 -12
- package/dist/shared/launch-instructions.js +57 -0
- package/dist/shared/progress-bar-prompts.js +7 -0
- package/dist/shared/progress-bar-tools.js +73 -0
- package/dist/shared/progress-bars.js +3 -0
- package/package.json +1 -1
- package/src/client/dist/pwa/assets/ActivityFeed-DiUxnmGJ.js +2 -0
- package/src/client/dist/pwa/assets/{AutoLoopFinalReviewSettings-CC8ICe_I.js → AutoLoopFinalReviewSettings-f4VDR5dd.js} +1 -1
- package/src/client/dist/pwa/assets/{ChangelogPage-C1aiPBoi.js → ChangelogPage-dEWpjTlp.js} +1 -1
- package/src/client/dist/pwa/assets/ComparisonPanel-Bwbqgvr4.js +2 -0
- package/src/client/dist/pwa/assets/CreatePage-CCCCAhrx.js +2 -0
- package/src/client/dist/pwa/assets/{DashboardPage-D1S3QGp4.js → DashboardPage-3byhBITf.js} +1 -1
- package/src/client/dist/pwa/assets/DiffViewer-Bj_NTfCF.js +8 -0
- package/src/client/dist/pwa/assets/{DocumentsPanel-C4AvyZF3.js → DocumentsPanel-xyLDV3T1.js} +1 -1
- package/src/client/dist/pwa/assets/{DrawerToggleButton-LzIEeeJY.js → DrawerToggleButton-pwBSstQP.js} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-DvIdrkVw.js +3 -0
- package/src/client/dist/pwa/assets/{HealthPage-Cm13vxOi.js → HealthPage-BSwhZQRo.js} +1 -1
- package/src/client/dist/pwa/assets/MainLayout-DZJ9BvZw.js +2 -0
- package/src/client/dist/pwa/assets/{MemoryPanel-C6tzCv6D.js → MemoryPanel-ChR032zP.js} +1 -1
- package/src/client/dist/pwa/assets/{MemoryProposalList-CzpzIirK.js → MemoryProposalList-BRKSoS4K.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnDropdown-BnuKPevV.js → QBtnDropdown-o3QH0Bb8.js} +1 -1
- package/src/client/dist/pwa/assets/{QExpansionItem-DjaUhgjt.js → QExpansionItem-BhFHiyq9.js} +1 -1
- package/src/client/dist/pwa/assets/{QScrollArea-Dpksslru.js → QScrollArea-BsNY6slB.js} +1 -1
- package/src/client/dist/pwa/assets/QSelect-bEq3g_io.js +1 -0
- package/src/client/dist/pwa/assets/{QTooltip-CH45NuVs.js → QTooltip-xYZ6KNu2.js} +1 -1
- package/src/client/dist/pwa/assets/{SchedulePanel-QAjXuTIN.js → SchedulePanel-DIFv_FTY.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-B1pbwDej.js → SearchPage-BqTBIt5E.js} +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-BLD0xWFB.js +9 -0
- package/src/client/dist/pwa/assets/{SplitWorkspacePage-CJ7e-KPh.js → SplitWorkspacePage-D6r2pl5g.js} +1 -1
- package/src/client/dist/pwa/assets/{TerminalPanel-DVomz3oo.js → TerminalPanel-CladK9Vv.js} +9 -9
- package/src/client/dist/pwa/assets/{ToolCallItem-BntDHc6p.js → ToolCallItem-CdzEME4w.js} +3 -3
- package/src/client/dist/pwa/assets/{TouchPan-DwqfsAxH.js → TouchPan-B4gQPwGN.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-OIavXdUg.js → TourReplayButton-B0j6AZwU.js} +1 -1
- package/src/client/dist/pwa/assets/{WorkspaceAttentionLabels-CYwN1-Rf.js → WorkspaceAttentionLabels-CeVhoidC.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspacePage-CK5XCuG_.js +4 -0
- package/src/client/dist/pwa/assets/{WorkspacePage-B248nKIU.css → WorkspacePage-w2bF8wTd.css} +1 -1
- package/src/client/dist/pwa/assets/{browser-Cl0d1gbu.js → browser-B8tNScg1.js} +1 -1
- package/src/client/dist/pwa/assets/{build-path-tree-J3YQeMuV.js → build-path-tree-kmVAcvs_.js} +1 -1
- package/src/client/dist/pwa/assets/custom-sounds-CJwd-8TL.js +1 -0
- package/src/client/dist/pwa/assets/{de-C-RtXLqL.js → de-BaO6kbdO.js} +1 -1
- package/src/client/dist/pwa/assets/{editor.api-BoFiCjBZ.js → editor.api-CgbPVW9s.js} +1 -1
- package/src/client/dist/pwa/assets/{efforts-Y6XotW97.js → efforts-y7Wf_Rgd.js} +2 -2
- package/src/client/dist/pwa/assets/{es-CBlW91ZK.js → es-DTvSsbD0.js} +1 -1
- package/src/client/dist/pwa/assets/{expand-template-sfOHWudd.js → expand-template-BFbbjj7X.js} +1 -1
- package/src/client/dist/pwa/assets/{format-mWov137C.js → format-BETfc4z9.js} +1 -1
- package/src/client/dist/pwa/assets/{formatters-B_XsveM0.js → formatters-C22K9vlC.js} +1 -1
- package/src/client/dist/pwa/assets/{fr-Hfzp_sF5.js → fr-BH7V66Yz.js} +1 -1
- package/src/client/dist/pwa/assets/{freemarker2-2pGNakhH.js → freemarker2-DiRVvp9O.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-Bn2V6Liw.js → handlebars-BLYRroSQ.js} +1 -1
- package/src/client/dist/pwa/assets/{html-BBhkJkf2.js → html-DAW2vteY.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-DnuTmw3O.js +1 -0
- package/src/client/dist/pwa/assets/{index-DCpe-Tfm.js → index-CbyHfF8I.js} +2 -2
- package/src/client/dist/pwa/assets/{it-Bl-v27qg.js → it-DZGbkkoy.js} +1 -1
- package/src/client/dist/pwa/assets/{javascript-Ba0G68U2.js → javascript-Bb5J8n0k.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-C5VrzHr_.js → liquid-Dqx3adnJ.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-DrPRiuKb.js → mdx-D_7igLV3.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco-contributions-qQUY6VS7.js → monaco-contributions-C-0CbrAy.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco.contribution-Dtq2RsyB.js → monaco.contribution-c6JPBEZI.js} +2 -2
- package/src/client/dist/pwa/assets/network-auth-BE4qbvWm.js +1 -0
- package/src/client/dist/pwa/assets/notify-theme-BVFBBGrJ.js +1 -0
- package/src/client/dist/pwa/assets/{project-color-Dzvvmaml.js → project-color-CHOR2jB5.js} +1 -1
- package/src/client/dist/pwa/assets/{python-Cuf_7umq.js → python-Dqubw1F5.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-DcVpxFeh.js → razor-BQphc9Kt.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-Bjcc3kYC.js → typescript-Dep00l0X.js} +1 -1
- package/src/client/dist/pwa/assets/{use-search-index-status-Bwf40BEI.js → use-search-index-status-CQHHvHwM.js} +1 -1
- package/src/client/dist/pwa/assets/{use-tours-CWafZt-m.js → use-tours-IVbXTmz2.js} +2 -2
- package/src/client/dist/pwa/assets/{use-worktree-restore-DkcM2FAZ.js → use-worktree-restore-B3s5xDGR.js} +1 -1
- package/src/client/dist/pwa/assets/{workspace-templates-DL_Cs7mD.js → workspace-templates-CyuTpztP.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-BmJwqJOz.js → xml-BMS2dvaF.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-DAssfLhS.js → yaml-CYw92aic.js} +1 -1
- package/src/client/dist/pwa/index.html +1 -1
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/mcp-server/README.md +88 -1
- package/src/mcp-server/kobo-tasks-server.ts +34 -6
- package/src/mcp-server/progress-bar-client.ts +27 -0
- package/src/mcp-server/workspace-dialogue-client.ts +26 -7
- package/src/client/dist/pwa/assets/ActivityFeed-S3XGw3WW.js +0 -2
- package/src/client/dist/pwa/assets/ComparisonPanel-DElbn4ac.js +0 -2
- package/src/client/dist/pwa/assets/CreatePage-Bx58t4YW.js +0 -2
- package/src/client/dist/pwa/assets/DiffViewer-BH4X9ru1.js +0 -8
- package/src/client/dist/pwa/assets/GitPanel-BP3N_4nh.js +0 -3
- package/src/client/dist/pwa/assets/MainLayout-DGmMkfuw.js +0 -2
- package/src/client/dist/pwa/assets/QSelect-Dh4CjliE.js +0 -1
- package/src/client/dist/pwa/assets/SettingsPage-CUQefsDh.js +0 -9
- package/src/client/dist/pwa/assets/WorkspacePage-CAsY7Hl-.js +0 -4
- package/src/client/dist/pwa/assets/custom-sounds-D-T5rpgv.js +0 -1
- package/src/client/dist/pwa/assets/i18n-sBCWwf8Y.js +0 -1
- package/src/client/dist/pwa/assets/network-auth-BPJpXK4L.js +0 -1
- package/src/client/dist/pwa/assets/notify-theme-Bl9iRsZB.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./editor.api-
|
|
1
|
+
import{n as e}from"./editor.api-CgbPVW9s.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,4 +1,4 @@
|
|
|
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-
|
|
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-CbyHfF8I.js"></script>
|
|
2
2
|
<link rel="modulepreload" crossorigin href="/assets/reactivity.esm-bundler-DY1JkAEA.js">
|
|
3
3
|
<link rel="modulepreload" crossorigin href="/assets/runtime-core.esm-bundler-Bqg71Vll.js">
|
|
4
4
|
<link rel="modulepreload" crossorigin href="/assets/dom-BtYTvLeN.js">
|
|
@@ -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 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:"1d6b5397598c069258ef111c4c2a29b5"},{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-DAssfLhS.js",revision:"83f6b236253d7bbf7aee87015de13d6d"},{url:"assets/xml-BmJwqJOz.js",revision:"cc21a9c33d8be7df92089651e2eb053d"},{url:"assets/workspace-templates-DL_Cs7mD.js",revision:"892d6d012f64f5dac5d1e268225dc7bc"},{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-DkcM2FAZ.js",revision:"8ec2bfe9e6f90b91021f98027108597a"},{url:"assets/use-worktree-restore-B-9jHocY.css",revision:"54449cd3d2d5c88b0bd7d88f53f581c3"},{url:"assets/use-tours-CWafZt-m.js",revision:"3709e87950a0fcc3cb24d6994215a622"},{url:"assets/use-tours-CTZuBZOi.css",revision:"2f6d79046e1409f0472f65179eaa76f3"},{url:"assets/use-slide-transition-B_Nu6u-t.js",revision:"00b155c171e638ef6fb5919cd6ebaf99"},{url:"assets/use-search-index-status-Bwf40BEI.js",revision:"eef6c35cf58503be1bcd9d37f519d314"},{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-Bjcc3kYC.js",revision:"a0e204d44fd54484b49b1b7633c21bf1"},{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-DcVpxFeh.js",revision:"467a48c4602292df55ac2ff2519be896"},{url:"assets/r-BwWrilGY.js",revision:"f18d3e790ef07bc993539322d29548e4"},{url:"assets/qsharp-DkqhCAOL.js",revision:"c53fe08a83f8fcbcd81723105136a691"},{url:"assets/python-Cuf_7umq.js",revision:"a170675b2d846f5e867e070a8bc51b90"},{url:"assets/pug-Z5eAx3Zn.js",revision:"6e3de6d5214d2cf61b90949e1d383b49"},{url:"assets/protobuf-C531GsRP.js",revision:"04e688a7fef2bde8cef525653497371f"},{url:"assets/project-color-Dzvvmaml.js",revision:"6a5d530de8f1bb91376d73708d85225c"},{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-Bl9iRsZB.js",revision:"538a289cb743841e95408ef45f148207"},{url:"assets/network-auth-BPJpXK4L.js",revision:"6c44b325b0baac874b2c3a689bb6288d"},{url:"assets/mysql-SOo6toE5.js",revision:"677c089d979324385539e96bd2eb11e4"},{url:"assets/msdax-DauUninz.js",revision:"a63bfea2dd041755a34fe3e307159413"},{url:"assets/monaco.contribution-Dtq2RsyB.js",revision:"45a9ed2abe08cf7ee30a233e07308e20"},{url:"assets/monaco-contributions-qQUY6VS7.js",revision:"c01da0d97898295f1f2afa8c1db79386"},{url:"assets/monaco-contributions-DvnCTJI2.css",revision:"964f32a36c06b4d5a66ac1b01556eb2b"},{url:"assets/mips-CIPQ_RoX.js",revision:"b22614ddc8855670a3f76290908877f5"},{url:"assets/mdx-DrPRiuKb.js",revision:"30b578a707f3a2ed62cc9d3c798b6804"},{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-C5VrzHr_.js",revision:"5a24ab29fd7dddf3cb52d8e106900def"},{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-Ba0G68U2.js",revision:"913a6b228b83065dc87e70506a434b76"},{url:"assets/java-BEtHBSE6.js",revision:"987edcd2170749acca47ea184dd9ab25"},{url:"assets/it-Bl-v27qg.js",revision:"34c68509d46975ebf72afd0c7c6138e8"},{url:"assets/ini-sBoK_t0W.js",revision:"35f8ec10844ea4f62c2712d3f5c1e129"},{url:"assets/index-DCpe-Tfm.js",revision:"dc352803393a89cfba818f73467ee469"},{url:"assets/index-C8zAZ-k-.css",revision:"1488166e385bd7f03f15dbf2e6f4fc60"},{url:"assets/i18n-sBCWwf8Y.js",revision:"452feaf760c818e76544e673146104df"},{url:"assets/html-BBhkJkf2.js",revision:"a779209a17b5cb09bec923d54ae8aad4"},{url:"assets/hcl-CpzslTdj.js",revision:"f9ef1004e908957ec1c3bbea2049a0e9"},{url:"assets/handlebars-Bn2V6Liw.js",revision:"c18949fd849627bf9ea6a1314a24c350"},{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-2pGNakhH.js",revision:"a3ff039a61433d6527941491e79bbb99"},{url:"assets/fr-Hfzp_sF5.js",revision:"9efbb9e5b8f76ab9692ef18ed289166e"},{url:"assets/formatters-B_XsveM0.js",revision:"ca9ca1232efb3017e95f2b01712f2544"},{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-sfOHWudd.js",revision:"a551f37ef92ab7a071d3a2f460baff23"},{url:"assets/expand-template-CTUNyJrv.css",revision:"a4033bbc7a564e856b2b0c42816a24f7"},{url:"assets/es-CBlW91ZK.js",revision:"e873455363de853e4dd25557cb854160"},{url:"assets/elixir-6RTg0lbw.js",revision:"fb736f7429d9c6a596ed7905653dbf14"},{url:"assets/efforts-Y6XotW97.js",revision:"f2884fa5449caf1e12c3931645e90114"},{url:"assets/editor.worker-BLJF_oQx.js",revision:"73d3d20cadfc19535b465c224d29ba1b"},{url:"assets/editor.api-BoFiCjBZ.js",revision:"80f08f6bc408bad3f76a516a472be582"},{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-C-RtXLqL.js",revision:"5ab391940e341a5eccaacde5a2b1af00"},{url:"assets/dart-onAF5SnQ.js",revision:"4fc14a4d2b7e030db6af8025d8fe831b"},{url:"assets/cypher-CVaqCwHa.js",revision:"75a568a8c6b29818b6a6c8675841ebf7"},{url:"assets/custom-sounds-D-T5rpgv.js",revision:"4f74fe16162f56785f64542c63612f68"},{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-J3YQeMuV.js",revision:"9cee49a08bdbc7fc52ea8e308bde49af"},{url:"assets/browser-Cl0d1gbu.js",revision:"19ba1782f9a3c7ca8cffa6507c8f5daf"},{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-CAsY7Hl-.js",revision:"ca96aafbad972c91da9849fd0bf8073b"},{url:"assets/WorkspacePage-B248nKIU.css",revision:"d1c55c993cc9228ff45cb1795b82eaf3"},{url:"assets/WorkspaceAttentionLabels-CYwN1-Rf.js",revision:"e78087f4ab666ae8c50c832edbf2b566"},{url:"assets/WorkspaceAttentionLabels-B9LE8HtU.css",revision:"8670216f1246dc6e0f51ef50b62f0243"},{url:"assets/TourReplayButton-OIavXdUg.js",revision:"27962759126e2b673fa390357e1f955d"},{url:"assets/TouchPan-DwqfsAxH.js",revision:"046dab7b3ff3e37f4d92cdbdea6292fa"},{url:"assets/ToolCallItem-m-YnWEbv.css",revision:"ff71b53979cd34e71a0d7ac68ba39695"},{url:"assets/ToolCallItem-BntDHc6p.js",revision:"c9940cd7ee52f9661cab690bfcc6e08b"},{url:"assets/TerminalPanel-Dz9EE-Ph.css",revision:"9fd7805b12e550833d2ac46b5c24dc7a"},{url:"assets/TerminalPanel-DVomz3oo.js",revision:"b39014f407d0fa3da6eab2e55660eaf0"},{url:"assets/SplitWorkspacePage-lWQO8xro.css",revision:"cabea8d2cabbc3e1012ffa88225e04d3"},{url:"assets/SplitWorkspacePage-CJ7e-KPh.js",revision:"2130b7a93508b5664a2ee37812f732f4"},{url:"assets/SettingsPage-CUQefsDh.js",revision:"b3b31a13a6600982071fa36645c78046"},{url:"assets/SettingsPage-BRvUAZ5r.css",revision:"81ab4e4675ef0049ad7d9f6bc283eebc"},{url:"assets/SearchPage-BGc1oQSM.css",revision:"d988bd3c7ed5458189b7225097e4cdeb"},{url:"assets/SearchPage-B1pbwDej.js",revision:"2fdb9d36ecd4ab49e8045f0accba9742"},{url:"assets/SchedulePanel-QAjXuTIN.js",revision:"0d5af4871b656c1048d603cc5cfab4f7"},{url:"assets/SchedulePanel-AugvL_tp.css",revision:"cfd82a05588bdf00917646754909fe75"},{url:"assets/QTooltip-CH45NuVs.js",revision:"fdcd5718673efd570cec973186f39b56"},{url:"assets/QSpinnerDots-xdWyaE1i.js",revision:"55b8a4269a2b5e98cf5814142583ffca"},{url:"assets/QSelect-Dh4CjliE.js",revision:"e79d2d22708cb9cbcc1fc561a081eeb1"},{url:"assets/QScrollArea-Dpksslru.js",revision:"a65fb04dd511d06b3730fea4db1210be"},{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-DjaUhgjt.js",revision:"7a028492d9a6746c957da2c626c8e538"},{url:"assets/QChip-Be16M4Ig.js",revision:"d217d603e5c6e691c02a888ffc1d213b"},{url:"assets/QBtnToggle-DccOOtbh.js",revision:"8c64e4c2fd1a993cb56403d1e62e6c09"},{url:"assets/QBtnGroup-CnM4vSJA.js",revision:"ddfd643b34c3c3ae7d3aa4a27bea664f"},{url:"assets/QBtnDropdown-BnuKPevV.js",revision:"7d28d5f96f9f505eaa5020501ac663b3"},{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-CzpzIirK.js",revision:"22d5f8e75a4f56250b218ffd5f168687"},{url:"assets/MemoryPanel-Ch3qeyQw.css",revision:"a080bd22ae7a7eb244df25c0a42d0f7c"},{url:"assets/MemoryPanel-C6tzCv6D.js",revision:"a43da78c307e0ca73c1f9e7cd87eb70d"},{url:"assets/MainLayout-DoAEgANU.css",revision:"2e7b4665a554e739954e8539183b1b22"},{url:"assets/MainLayout-DGmMkfuw.js",revision:"30141d8b886c3c0c40c919d860d3296d"},{url:"assets/HealthPage-Cnlhrn--.css",revision:"937880bb96f3708c02608a026c875bbb"},{url:"assets/HealthPage-Cm13vxOi.js",revision:"dcc2af51fa7692bf142807894461818f"},{url:"assets/GitPanel-CNFtj6k0.css",revision:"f6efc5e9ebcba7653d66444f4cdef69f"},{url:"assets/GitPanel-BP3N_4nh.js",revision:"31a4173ddfd2a5145273d32c3e6ff33c"},{url:"assets/DrawerToggleButton-LzIEeeJY.js",revision:"95632253cebc1d0cb4d0cca44cd0b06f"},{url:"assets/DocumentsPanel-C4AvyZF3.js",revision:"d1594c68422c4177bdbe19c73b1a5c86"},{url:"assets/DocumentsPanel-B8QY7FTj.css",revision:"676a3a838b07224f48fdd99e0cb6bbc8"},{url:"assets/DiffViewer-DEPOa3D7.css",revision:"7a2be47c13fe02cd2158e94eb0d320c5"},{url:"assets/DiffViewer-BH4X9ru1.js",revision:"bbeb310b154727d189f0a92ad8171a6a"},{url:"assets/DashboardPage-D1S3QGp4.js",revision:"f815ea9d29a7c71e6e755dd9dfe593ae"},{url:"assets/DashboardPage-CtaHaVdf.css",revision:"729d05fd05c14a73cbbfd35f6d3be6fd"},{url:"assets/CreatePage-DxOes_cF.css",revision:"343616e2ae2ef668bcfc74313d88d69f"},{url:"assets/CreatePage-Bx58t4YW.js",revision:"f9197884a9f47c89492ab03d0d9e0179"},{url:"assets/ComparisonPanel-DElbn4ac.js",revision:"932440f306fc5de254bafeabe899bf1b"},{url:"assets/ComparisonPanel-ByVbqYCs.css",revision:"40f8723a54937dbdb64e5de3d8bda349"},{url:"assets/ClosePopup-CRV2hxHS.js",revision:"408af589ed45c4f8e5f53522bc47c5f2"},{url:"assets/ChangelogPage-DVyx9ZjV.css",revision:"fd9c6a99457c6fb03e97d8137880243c"},{url:"assets/ChangelogPage-C1aiPBoi.js",revision:"410e8b9be0679e371fb285baffbd4d41"},{url:"assets/AutoLoopFinalReviewSettings-Q-OlSQ1c.css",revision:"a2e7b8d9f10da2fb2302213449f9428e"},{url:"assets/AutoLoopFinalReviewSettings-CC8ICe_I.js",revision:"1b06397cbdd2b661195c0255d9b962ae"},{url:"assets/ActivityFeed-S3XGw3WW.js",revision:"f35a6bff863a80c9d4d4aa1fa06766fe"},{url:"assets/ActivityFeed-DdJvMzRI.css",revision:"0ba8a4ec4311b7276146ba90134bbe29"}],{}),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 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:"68cf24c95cb3bd97672b4062d9438c90"},{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-CYw92aic.js",revision:"9b2f39bd291d576c35257ec7baaa48f7"},{url:"assets/xml-BMS2dvaF.js",revision:"aa9cb765b06913356995230b0075c405"},{url:"assets/workspace-templates-CyuTpztP.js",revision:"ccbb7c891228384eb5369c4d842dc108"},{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-B3s5xDGR.js",revision:"e419dcae87bb15b7efda1ce87f0f620f"},{url:"assets/use-worktree-restore-B-9jHocY.css",revision:"54449cd3d2d5c88b0bd7d88f53f581c3"},{url:"assets/use-tours-IVbXTmz2.js",revision:"7698ac3ba943817cc541d042a256540f"},{url:"assets/use-tours-CTZuBZOi.css",revision:"2f6d79046e1409f0472f65179eaa76f3"},{url:"assets/use-slide-transition-B_Nu6u-t.js",revision:"00b155c171e638ef6fb5919cd6ebaf99"},{url:"assets/use-search-index-status-CQHHvHwM.js",revision:"1aca571a046ae2a20b1d7b02d5c99ed2"},{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-Dep00l0X.js",revision:"ed07b977863aef60df11bc846ff58b88"},{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-BQphc9Kt.js",revision:"559106fdc978a24825e03bbf2499ad92"},{url:"assets/r-BwWrilGY.js",revision:"f18d3e790ef07bc993539322d29548e4"},{url:"assets/qsharp-DkqhCAOL.js",revision:"c53fe08a83f8fcbcd81723105136a691"},{url:"assets/python-Dqubw1F5.js",revision:"1be2afb53130598e129ea295f12b8ecc"},{url:"assets/pug-Z5eAx3Zn.js",revision:"6e3de6d5214d2cf61b90949e1d383b49"},{url:"assets/protobuf-C531GsRP.js",revision:"04e688a7fef2bde8cef525653497371f"},{url:"assets/project-color-CHOR2jB5.js",revision:"6577f20d32d746b5b8dbe2d5e3e41b09"},{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-BVFBBGrJ.js",revision:"e7c993f30224638ea86054ef57eb4936"},{url:"assets/network-auth-BE4qbvWm.js",revision:"4aef0cc2e6720d6770e980a3ca8bb729"},{url:"assets/mysql-SOo6toE5.js",revision:"677c089d979324385539e96bd2eb11e4"},{url:"assets/msdax-DauUninz.js",revision:"a63bfea2dd041755a34fe3e307159413"},{url:"assets/monaco.contribution-c6JPBEZI.js",revision:"32dd70e10cc6c9aa0c11ce284f1aae9f"},{url:"assets/monaco-contributions-DvnCTJI2.css",revision:"964f32a36c06b4d5a66ac1b01556eb2b"},{url:"assets/monaco-contributions-C-0CbrAy.js",revision:"2a1ab3df8a7b21178d5aa7ad214b6d04"},{url:"assets/mips-CIPQ_RoX.js",revision:"b22614ddc8855670a3f76290908877f5"},{url:"assets/mdx-D_7igLV3.js",revision:"e31003f972726a9d306c2c10f6d919af"},{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-Dqx3adnJ.js",revision:"3265dc1285c20f3661dfa84044198e60"},{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-Bb5J8n0k.js",revision:"1f27310a1c70594d3d465db4e165c65d"},{url:"assets/java-BEtHBSE6.js",revision:"987edcd2170749acca47ea184dd9ab25"},{url:"assets/it-DZGbkkoy.js",revision:"cb1ef313eced4dcf1e720684c9cc6b54"},{url:"assets/ini-sBoK_t0W.js",revision:"35f8ec10844ea4f62c2712d3f5c1e129"},{url:"assets/index-CbyHfF8I.js",revision:"d9276d5bab1d602d7d62c977999de211"},{url:"assets/index-C8zAZ-k-.css",revision:"1488166e385bd7f03f15dbf2e6f4fc60"},{url:"assets/i18n-DnuTmw3O.js",revision:"8ba9d855640048efdf9e29e34e7165fe"},{url:"assets/html-DAW2vteY.js",revision:"b94dce8417057f5e0c446477f71e5d04"},{url:"assets/hcl-CpzslTdj.js",revision:"f9ef1004e908957ec1c3bbea2049a0e9"},{url:"assets/handlebars-BLYRroSQ.js",revision:"5bf376c25a19dafb03b4b00ba9392844"},{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-DiRVvp9O.js",revision:"95c929ecae1d50176be52638e6ff6c30"},{url:"assets/fr-BH7V66Yz.js",revision:"952d7c1c5223bd1d7a003c5ff8fd3f90"},{url:"assets/formatters-C22K9vlC.js",revision:"54c3dfd6a9f53df63185ed26ca8f80c1"},{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-CTUNyJrv.css",revision:"a4033bbc7a564e856b2b0c42816a24f7"},{url:"assets/expand-template-BFbbjj7X.js",revision:"94c71af8309886c13802c92cde5ba00d"},{url:"assets/es-DTvSsbD0.js",revision:"26fb357649db1d21f2d90f42925d626f"},{url:"assets/elixir-6RTg0lbw.js",revision:"fb736f7429d9c6a596ed7905653dbf14"},{url:"assets/efforts-y7Wf_Rgd.js",revision:"79b58c33f0ab69c121622885e912a6dc"},{url:"assets/editor.worker-BLJF_oQx.js",revision:"73d3d20cadfc19535b465c224d29ba1b"},{url:"assets/editor.api-CgbPVW9s.js",revision:"7513d7ee59c265f1c138b3923d0bbc43"},{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-BaO6kbdO.js",revision:"5457b947e2ab9971e06db17405af2250"},{url:"assets/dart-onAF5SnQ.js",revision:"4fc14a4d2b7e030db6af8025d8fe831b"},{url:"assets/cypher-CVaqCwHa.js",revision:"75a568a8c6b29818b6a6c8675841ebf7"},{url:"assets/custom-sounds-CJwd-8TL.js",revision:"2427112d21181ecef757df7c226e2ed2"},{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-kmVAcvs_.js",revision:"8e267a951ed43c6a027b4a31a52d87ec"},{url:"assets/browser-B8tNScg1.js",revision:"0fbb57c5a9929bd267b0f43764bd4413"},{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-w2bF8wTd.css",revision:"5290a5bcbf1bf7d20360494a74875467"},{url:"assets/WorkspacePage-CK5XCuG_.js",revision:"e4eb89a00727e337efb942e80b327f14"},{url:"assets/WorkspaceAttentionLabels-CeVhoidC.js",revision:"78006d32b3d6d7d26dba0836cdebf65d"},{url:"assets/WorkspaceAttentionLabels-B9LE8HtU.css",revision:"8670216f1246dc6e0f51ef50b62f0243"},{url:"assets/TourReplayButton-B0j6AZwU.js",revision:"818a2b59d222aca39bc6be2c600b74a7"},{url:"assets/TouchPan-B4gQPwGN.js",revision:"c15fd824e713140682f7de3e9f0d9463"},{url:"assets/ToolCallItem-m-YnWEbv.css",revision:"ff71b53979cd34e71a0d7ac68ba39695"},{url:"assets/ToolCallItem-CdzEME4w.js",revision:"cd06aab38875cb556a2296d26938ec77"},{url:"assets/TerminalPanel-Dz9EE-Ph.css",revision:"9fd7805b12e550833d2ac46b5c24dc7a"},{url:"assets/TerminalPanel-CladK9Vv.js",revision:"02c094136e6c17ff3c39d4f97737af1d"},{url:"assets/SplitWorkspacePage-lWQO8xro.css",revision:"cabea8d2cabbc3e1012ffa88225e04d3"},{url:"assets/SplitWorkspacePage-D6r2pl5g.js",revision:"3808d8cdc5826601444dad7ac76e14ae"},{url:"assets/SettingsPage-BRvUAZ5r.css",revision:"81ab4e4675ef0049ad7d9f6bc283eebc"},{url:"assets/SettingsPage-BLD0xWFB.js",revision:"e76dc8e0b0be06dd77de0d305675ad61"},{url:"assets/SearchPage-BqTBIt5E.js",revision:"6144c544073d848069dbd556f6000dcf"},{url:"assets/SearchPage-BGc1oQSM.css",revision:"d988bd3c7ed5458189b7225097e4cdeb"},{url:"assets/SchedulePanel-DIFv_FTY.js",revision:"3be086ed3ee26a14e6c78141f6e95ac9"},{url:"assets/SchedulePanel-AugvL_tp.css",revision:"cfd82a05588bdf00917646754909fe75"},{url:"assets/QTooltip-xYZ6KNu2.js",revision:"1fd7a0f5dc91bd0ea7d99e38ab4191c0"},{url:"assets/QSpinnerDots-xdWyaE1i.js",revision:"55b8a4269a2b5e98cf5814142583ffca"},{url:"assets/QSelect-bEq3g_io.js",revision:"79c5d8e64bc2ebe657ee7f7f889a8a1b"},{url:"assets/QScrollArea-BsNY6slB.js",revision:"482e3dd7dd87d81c93559d98657ef2f7"},{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-BhFHiyq9.js",revision:"e05d337a324b57f8d4b8927f29389db5"},{url:"assets/QChip-Be16M4Ig.js",revision:"d217d603e5c6e691c02a888ffc1d213b"},{url:"assets/QBtnToggle-DccOOtbh.js",revision:"8c64e4c2fd1a993cb56403d1e62e6c09"},{url:"assets/QBtnGroup-CnM4vSJA.js",revision:"ddfd643b34c3c3ae7d3aa4a27bea664f"},{url:"assets/QBtnDropdown-o3QH0Bb8.js",revision:"d73bd4eeaf7ec688ea9591fe4f69f9c6"},{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-BRKSoS4K.js",revision:"9e2a0f78b80d270860ad6ab9d755856b"},{url:"assets/MemoryPanel-ChR032zP.js",revision:"907c98090437f622cb0b34f89a41faae"},{url:"assets/MemoryPanel-Ch3qeyQw.css",revision:"a080bd22ae7a7eb244df25c0a42d0f7c"},{url:"assets/MainLayout-DoAEgANU.css",revision:"2e7b4665a554e739954e8539183b1b22"},{url:"assets/MainLayout-DZJ9BvZw.js",revision:"59dbdc0b84ce83ac2571413d78039b91"},{url:"assets/HealthPage-Cnlhrn--.css",revision:"937880bb96f3708c02608a026c875bbb"},{url:"assets/HealthPage-BSwhZQRo.js",revision:"8b74c81e99ab2f821375012e1e43a5db"},{url:"assets/GitPanel-DvIdrkVw.js",revision:"47a75f3bf1af3e51378590f048992de9"},{url:"assets/GitPanel-CNFtj6k0.css",revision:"f6efc5e9ebcba7653d66444f4cdef69f"},{url:"assets/DrawerToggleButton-pwBSstQP.js",revision:"1eb9594a3a941761a461dad8d18c41c7"},{url:"assets/DocumentsPanel-xyLDV3T1.js",revision:"82349b28dd91e69e9a6b3143545da7bc"},{url:"assets/DocumentsPanel-B8QY7FTj.css",revision:"676a3a838b07224f48fdd99e0cb6bbc8"},{url:"assets/DiffViewer-DEPOa3D7.css",revision:"7a2be47c13fe02cd2158e94eb0d320c5"},{url:"assets/DiffViewer-Bj_NTfCF.js",revision:"41fe0bf506a670ed79e38857e5e9d7bd"},{url:"assets/DashboardPage-CtaHaVdf.css",revision:"729d05fd05c14a73cbbfd35f6d3be6fd"},{url:"assets/DashboardPage-3byhBITf.js",revision:"0bf808a64387fca24b9ef795b0a258e4"},{url:"assets/CreatePage-DxOes_cF.css",revision:"343616e2ae2ef668bcfc74313d88d69f"},{url:"assets/CreatePage-CCCCAhrx.js",revision:"e444fdd9cd41b5324e9b03721cecbfe6"},{url:"assets/ComparisonPanel-ByVbqYCs.css",revision:"40f8723a54937dbdb64e5de3d8bda349"},{url:"assets/ComparisonPanel-Bwbqgvr4.js",revision:"48c4bd8c512a9e31ecbb39da7f1ce6c1"},{url:"assets/ClosePopup-CRV2hxHS.js",revision:"408af589ed45c4f8e5f53522bc47c5f2"},{url:"assets/ChangelogPage-dEWpjTlp.js",revision:"72c1b1244216cd697fcb2361703077d9"},{url:"assets/ChangelogPage-DVyx9ZjV.css",revision:"fd9c6a99457c6fb03e97d8137880243c"},{url:"assets/AutoLoopFinalReviewSettings-f4VDR5dd.js",revision:"1d4c1b8024be6e7128ef0fd986120e85"},{url:"assets/AutoLoopFinalReviewSettings-Q-OlSQ1c.css",revision:"a2e7b8d9f10da2fb2302213449f9428e"},{url:"assets/ActivityFeed-DiUxnmGJ.js",revision:"0111c047db06214e29da8f727182cc26"},{url:"assets/ActivityFeed-DdJvMzRI.css",revision:"0ba8a4ec4311b7276146ba90134bbe29"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html"),{denylist:[/sw\.js$/,/workbox-(.)*\.js$/]}))});
|
package/src/mcp-server/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Standalone MCP (Model Context Protocol) server configured for each Claude Code or Codex agent running inside a workspace. Exposes workspace-scoped tools that the agent can invoke to interact with Kōbō state: tasks, settings, dev server, images, git, etc.
|
|
4
4
|
|
|
5
|
-
Kōbō also exposes workspace creation, PR checkout diagnosis and
|
|
5
|
+
Kōbō also exposes workspace creation, PR checkout diagnosis, conversation and [session progress tools](#session-progress-tools) to external MCP clients over HTTP and through the global stdio server.
|
|
6
6
|
|
|
7
7
|
## Connect an external LLM
|
|
8
8
|
|
|
@@ -558,3 +558,90 @@ workspace history before issuing another request for an uncertain recipient.
|
|
|
558
558
|
MCP client name and HTTP/stdio provenance remain attached to delivered messages.
|
|
559
559
|
Read-only final-review and handoff launches expose preview and receipt lookup,
|
|
560
560
|
but cannot submit a group message.
|
|
561
|
+
|
|
562
|
+
## Session progress tools
|
|
563
|
+
|
|
564
|
+
Use these tools to report long-running activities, including tests or reviews
|
|
565
|
+
delegated to subagents. Each indicator belongs to an existing workspace session.
|
|
566
|
+
Reporting neither starts an agent nor completes or verifies workspace tasks.
|
|
567
|
+
|
|
568
|
+
| Tool | Required arguments | Optional arguments |
|
|
569
|
+
|---|---|---|
|
|
570
|
+
| `create_progress_bar` | `activity_key`, `label` | `step`, paired `current`/`total` |
|
|
571
|
+
| `update_progress_bar` | `progress_id`, `sequence` | `step`, paired `current`/`total` |
|
|
572
|
+
| `finish_progress_bar` | `progress_id`, `sequence`, `outcome` (`succeeded` or `failed`) | `step` |
|
|
573
|
+
| `list_progress_bars` | — | `limit` (1–100, default 50), `offset` (default 0) |
|
|
574
|
+
|
|
575
|
+
**External HTTP and global stdio callers must also provide `workspace_id` and
|
|
576
|
+
`session_id` on every call.** Use `list_workspace_sessions` to discover session
|
|
577
|
+
IDs. Workspace-bound callers omit those fields: the backend derives their scope
|
|
578
|
+
from a per-launch capability. They cannot forge another workspace, session or
|
|
579
|
+
launch. The managed server exposes the same tools to capable subagents; custom
|
|
580
|
+
subagent tool restrictions still apply. If a child lacks access, the parent
|
|
581
|
+
reports its activity rather than creating a duplicate indicator.
|
|
582
|
+
|
|
583
|
+
For example, an external client can create an activity with:
|
|
584
|
+
|
|
585
|
+
```json
|
|
586
|
+
{
|
|
587
|
+
"workspace_id": "<workspace ID>",
|
|
588
|
+
"session_id": "<session ID>",
|
|
589
|
+
"activity_key": "backend-tests-1",
|
|
590
|
+
"label": "Backend tests",
|
|
591
|
+
"current": 0,
|
|
592
|
+
"total": 120
|
|
593
|
+
}
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
Keep the returned `id`. Report absolute progress with `update_progress_bar`:
|
|
597
|
+
|
|
598
|
+
```json
|
|
599
|
+
{
|
|
600
|
+
"workspace_id": "<workspace ID>",
|
|
601
|
+
"session_id": "<session ID>",
|
|
602
|
+
"progress_id": "<returned id>",
|
|
603
|
+
"sequence": 1,
|
|
604
|
+
"current": 40,
|
|
605
|
+
"total": 120,
|
|
606
|
+
"step": "API tests"
|
|
607
|
+
}
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
Then call `finish_progress_bar` with the same scope/id, a higher `sequence`,
|
|
611
|
+
`outcome: "succeeded"` or `"failed"`, and an optional summary in `step`.
|
|
612
|
+
Supply numeric progress only when known: both values must be finite, with
|
|
613
|
+
`total > 0` and `0 <= current <= total`. Omit both at creation, or send both as
|
|
614
|
+
`null`, for an indeterminate indicator. Updates with no numeric pair keep the
|
|
615
|
+
previous values. Finishing successfully does not invent a final count.
|
|
616
|
+
|
|
617
|
+
Creation keys identify activities, not tool calls. Retry a lost creation reply
|
|
618
|
+
with the **same key and inputs** to recover the existing record, even if it was
|
|
619
|
+
dismissed or finished. Changed inputs under that key are rejected. Use a new key
|
|
620
|
+
for genuinely new work. Internal keys are scoped to a launch; external keys to
|
|
621
|
+
the selected workspace/session, independently of the client display name.
|
|
622
|
+
|
|
623
|
+
Producer sequences start at 1 and increase. Retrying the last accepted sequence
|
|
624
|
+
with exactly the same payload is safe; a changed payload at that sequence or an
|
|
625
|
+
older sequence is rejected. Completed states cannot be overwritten by delayed
|
|
626
|
+
updates. Running updates are limited to one accepted update per second; respect
|
|
627
|
+
the returned retry guidance instead of polling. Finish reports are exempt.
|
|
628
|
+
|
|
629
|
+
Mutation results return the public indicator: `id`, `workspaceId`, `sessionId`,
|
|
630
|
+
`label`, `step`, `current`, `total`, `status`, `sequence`, server `revision`,
|
|
631
|
+
`dismissed`, `dismissedAt`, `completedAt`, `createdAt` and `updatedAt`. Listing
|
|
632
|
+
returns `{ items, totalCount, nextOffset, serverTime }` and includes hidden and
|
|
633
|
+
terminal records. Follow `nextOffset` until it is `null` when a full list is
|
|
634
|
+
needed. Limits are 200 characters for labels, 500 for steps, 100 for activity
|
|
635
|
+
keys, 32 running and 1,000 retained indicators per session.
|
|
636
|
+
|
|
637
|
+
The human can dismiss an individual bar above the chat input. `dismissed: true`
|
|
638
|
+
means later updates remain hidden; do not create a replacement merely to bypass
|
|
639
|
+
that choice. New activities appear normally. Success disappears five seconds
|
|
640
|
+
after completion; failure remains until dismissed. Dismissal does not stop work.
|
|
641
|
+
|
|
642
|
+
Internal capability revocation prevents further reports after stopping begins.
|
|
643
|
+
Confirmed runtime closure, or recovery after server restart, changes unfinished
|
|
644
|
+
internal bars to `interrupted`: reporting stopped, but independent background
|
|
645
|
+
jobs might continue. External reporters retain their last state across restart.
|
|
646
|
+
Final-review and handoff sessions may use this narrow reporting capability while
|
|
647
|
+
their existing restrictions on project/task mutations remain in force.
|
|
@@ -5,6 +5,7 @@ import { CallToolRequestSchema, ListToolsRequestSchema, type Tool } from '@model
|
|
|
5
5
|
import type Database from 'better-sqlite3'
|
|
6
6
|
import { getDb } from '../server/db/index.js'
|
|
7
7
|
import { EXTERNAL_MEMORY_TOOL_DEFINITIONS, isMemoryToolName, MEMORY_TOOL_DEFINITIONS } from '../shared/memory-tools.js'
|
|
8
|
+
import { INTERNAL_PROGRESS_BAR_TOOLS, isProgressBarTool, PROGRESS_BAR_TOOLS } from '../shared/progress-bar-tools.js'
|
|
8
9
|
import {
|
|
9
10
|
isWorkspaceCreationTool,
|
|
10
11
|
MAX_MCP_CREATION_REQUEST_BYTES,
|
|
@@ -35,6 +36,7 @@ import {
|
|
|
35
36
|
updateTaskHandler,
|
|
36
37
|
} from './kobo-tasks-handlers.js'
|
|
37
38
|
import { callMemoryTool, isMemoryOutputSuppressed } from './memory-client.js'
|
|
39
|
+
import { callProgressBarTool } from './progress-bar-client.js'
|
|
38
40
|
import { callWorkspaceDialogueTool } from './workspace-dialogue-client.js'
|
|
39
41
|
|
|
40
42
|
const finalReviewToken = process.env.KOBO_FINAL_REVIEW_TOKEN
|
|
@@ -256,7 +258,7 @@ const WORKSPACE_SCOPED_TOOLS: Tool[] = [
|
|
|
256
258
|
{
|
|
257
259
|
name: 'mark_auto_loop_ready',
|
|
258
260
|
description:
|
|
259
|
-
'CALL
|
|
261
|
+
'CALL at the end of authorized auto-loop preparation, either during initial workspace creation with auto-loop or a later `/kobo-prep-autoloop` grooming session. First ensure tasks are atomic, implementable, and include the required verification/finalization work. Marks preparation ready; this is a mutation and cannot be called from a read-only launch. Do NOT call during unrelated normal sessions.',
|
|
260
262
|
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
261
263
|
annotations: { destructiveHint: false, openWorldHint: false },
|
|
262
264
|
},
|
|
@@ -380,7 +382,7 @@ const WORKSPACE_SCOPED_TOOLS: Tool[] = [
|
|
|
380
382
|
{
|
|
381
383
|
name: 'cron_create',
|
|
382
384
|
description:
|
|
383
|
-
'Schedule a recurring trigger on THIS workspace. At each fire, Kōbō
|
|
385
|
+
'Schedule a recurring trigger on THIS workspace. At each fire, Kōbō checks that the workspace is idle (no active session), then injects `prompt` into the conversation pinned when scheduled (`mode=resume`) or starts a new session (`mode=fresh`). Skip-if-active: if a session is already running when the timer fires, that occurrence is skipped, the next occurrence is computed, and the cron continues. The cron persists across server restarts (skip-missed semantics on boot — no catchup spam). Delete with `cron_delete(id)`. Multiple crons per workspace are allowed.',
|
|
384
386
|
inputSchema: {
|
|
385
387
|
type: 'object',
|
|
386
388
|
properties: {
|
|
@@ -609,7 +611,7 @@ const WORKSPACE_SCOPED_TOOLS: Tool[] = [
|
|
|
609
611
|
{
|
|
610
612
|
name: 'schedule_wakeup',
|
|
611
613
|
description:
|
|
612
|
-
'WHEN:
|
|
614
|
+
'WHEN: the parent agent needs a durable later check for detached work or external state without a tracked completion notification. Do not duplicate SDK tracked-job continuation or schedule merely to advance auto-loop; subagents must leave the one workspace wakeup to their parent. Delay is measured from this call and clamped to [60, 21600] seconds. The wakeup targets this workspace and the session selected at scheduling time, not whichever session is newest later. It is deferred while busy when it cannot be delivered to the waiting controller; active auto-loop receives it as a queued instruction. Replaces the existing pending wakeup on this workspace, so preserve unrelated scheduled intent. Supply a concrete follow-up prompt and optional reason. End the current turn normally; delivery timing also depends on workspace availability. Prefer this durable Kōbō tool over native ScheduleWakeup',
|
|
613
615
|
inputSchema: {
|
|
614
616
|
type: 'object',
|
|
615
617
|
properties: {
|
|
@@ -638,6 +640,7 @@ const WORKSPACE_SCOPED_TOOLS: Tool[] = [
|
|
|
638
640
|
annotations: { destructiveHint: false, openWorldHint: false },
|
|
639
641
|
},
|
|
640
642
|
...MEMORY_TOOL_DEFINITIONS,
|
|
643
|
+
...INTERNAL_PROGRESS_BAR_TOOLS,
|
|
641
644
|
]
|
|
642
645
|
|
|
643
646
|
const GLOBAL_TOOLS: typeof WORKSPACE_SCOPED_TOOLS = [
|
|
@@ -646,6 +649,7 @@ const GLOBAL_TOOLS: typeof WORKSPACE_SCOPED_TOOLS = [
|
|
|
646
649
|
...WORKSPACE_LIFECYCLE_TOOLS,
|
|
647
650
|
...WORKSPACE_GROUP_MESSAGE_TOOLS,
|
|
648
651
|
...EXTERNAL_MEMORY_TOOL_DEFINITIONS,
|
|
652
|
+
...PROGRESS_BAR_TOOLS,
|
|
649
653
|
{
|
|
650
654
|
name: 'list_workspaces',
|
|
651
655
|
description:
|
|
@@ -694,13 +698,20 @@ function availableTools(): Tool[] {
|
|
|
694
698
|
// A workspace process exposes the capability-bound memory tools exactly once.
|
|
695
699
|
// Unbound/global stdio exposes the external bridge variant instead.
|
|
696
700
|
const tools = workspaceId
|
|
697
|
-
? [
|
|
701
|
+
? [
|
|
702
|
+
...WORKSPACE_SCOPED_TOOLS,
|
|
703
|
+
...GLOBAL_TOOLS.filter((tool) => !isMemoryToolName(tool.name) && !isProgressBarTool(tool.name)),
|
|
704
|
+
]
|
|
698
705
|
: GLOBAL_TOOLS
|
|
699
706
|
return tools.filter((tool) =>
|
|
700
707
|
handoffId && handoffToken
|
|
701
|
-
? tool.name === 'submit_session_handoff' ||
|
|
708
|
+
? tool.name === 'submit_session_handoff' ||
|
|
709
|
+
tool.annotations?.readOnlyHint === true ||
|
|
710
|
+
(isProgressBarTool(tool.name) && !!process.env.KOBO_PROGRESS_SESSION_TOKEN)
|
|
702
711
|
: finalReviewToken && finalReviewSessionId
|
|
703
|
-
? tool.name === 'submit_final_review' ||
|
|
712
|
+
? tool.name === 'submit_final_review' ||
|
|
713
|
+
tool.annotations?.readOnlyHint === true ||
|
|
714
|
+
(isProgressBarTool(tool.name) && !!process.env.KOBO_PROGRESS_SESSION_TOKEN)
|
|
704
715
|
: tool.name !== 'submit_session_handoff' && tool.name !== 'submit_final_review',
|
|
705
716
|
)
|
|
706
717
|
}
|
|
@@ -767,6 +778,23 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
767
778
|
}),
|
|
768
779
|
)
|
|
769
780
|
}
|
|
781
|
+
if (isProgressBarTool(name)) {
|
|
782
|
+
if (!workspaceId)
|
|
783
|
+
return await callWorkspaceDialogueTool(
|
|
784
|
+
backendUrl,
|
|
785
|
+
name,
|
|
786
|
+
a,
|
|
787
|
+
process.env.KOBO_NETWORK_TOKEN,
|
|
788
|
+
process.env.KOBO_MCP_CLIENT_NAME ?? server.getClientVersion()?.name,
|
|
789
|
+
)
|
|
790
|
+
return await callProgressBarTool({
|
|
791
|
+
backendUrl,
|
|
792
|
+
name,
|
|
793
|
+
args: a,
|
|
794
|
+
capability: process.env.KOBO_PROGRESS_SESSION_TOKEN,
|
|
795
|
+
networkToken: process.env.KOBO_NETWORK_TOKEN,
|
|
796
|
+
})
|
|
797
|
+
}
|
|
770
798
|
if (isMemoryToolName(name)) {
|
|
771
799
|
if (!workspaceId) {
|
|
772
800
|
return await callWorkspaceDialogueTool(
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { isProgressBarTool } from '../shared/progress-bar-tools.js'
|
|
2
|
+
export async function callProgressBarTool(input: {
|
|
3
|
+
backendUrl: string
|
|
4
|
+
name: string
|
|
5
|
+
args: unknown
|
|
6
|
+
capability?: string
|
|
7
|
+
networkToken?: string
|
|
8
|
+
fetcher?: typeof fetch
|
|
9
|
+
}) {
|
|
10
|
+
if (!isProgressBarTool(input.name)) throw new TypeError('Unknown progress tool')
|
|
11
|
+
if (!input.capability) throw new Error('Progress capability is unavailable for this process')
|
|
12
|
+
const headers: Record<string, string> = {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'X-Kobo-Progress-Session': input.capability,
|
|
15
|
+
}
|
|
16
|
+
if (input.networkToken) headers['X-Kobo-Token'] = input.networkToken
|
|
17
|
+
const response = await (input.fetcher ?? fetch)(
|
|
18
|
+
`${input.backendUrl.replace(/\/$/, '')}/api/progress-bars/agent/${input.name}`,
|
|
19
|
+
{ method: 'POST', headers, body: JSON.stringify(input.args), signal: AbortSignal.timeout(30_000) },
|
|
20
|
+
)
|
|
21
|
+
const data = (await response.json()) as Record<string, unknown>
|
|
22
|
+
return {
|
|
23
|
+
content: [{ type: 'text' as const, text: JSON.stringify(data) }],
|
|
24
|
+
structuredContent: data,
|
|
25
|
+
...(!response.ok ? { isError: true } : {}),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
|
|
2
2
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'
|
|
3
3
|
import { isMemoryToolName, validateMemoryToolArguments } from '../shared/memory-tools.js'
|
|
4
|
+
import { isProgressBarTool, validateProgressBarArguments } from '../shared/progress-bar-tools.js'
|
|
4
5
|
import { isWorkspaceCreationTool, validateWorkspaceCreationArguments } from '../shared/workspace-creation-tools.js'
|
|
5
6
|
import { validateDialogueArguments } from '../shared/workspace-dialogue-tools.js'
|
|
6
7
|
import {
|
|
@@ -18,15 +19,33 @@ export async function callWorkspaceDialogueTool(
|
|
|
18
19
|
token?: string,
|
|
19
20
|
clientName?: string,
|
|
20
21
|
) {
|
|
22
|
+
if (isProgressBarTool(name)) {
|
|
23
|
+
try {
|
|
24
|
+
validateProgressBarArguments(name, args, true)
|
|
25
|
+
} catch (error) {
|
|
26
|
+
const data = {
|
|
27
|
+
error: error instanceof Error ? error.message : 'Invalid arguments',
|
|
28
|
+
status: 400,
|
|
29
|
+
code: 'invalid_arguments',
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
isError: true,
|
|
33
|
+
content: [{ type: 'text' as const, text: JSON.stringify(data) }],
|
|
34
|
+
structuredContent: data,
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
21
38
|
const arguments_ = isMemoryToolName(name)
|
|
22
39
|
? validateMemoryToolArguments(name, args, true)
|
|
23
|
-
:
|
|
24
|
-
?
|
|
25
|
-
:
|
|
26
|
-
?
|
|
27
|
-
:
|
|
28
|
-
?
|
|
29
|
-
:
|
|
40
|
+
: isProgressBarTool(name)
|
|
41
|
+
? (args as Record<string, unknown>)
|
|
42
|
+
: isWorkspaceCreationTool(name)
|
|
43
|
+
? validateWorkspaceCreationArguments(name, args)
|
|
44
|
+
: isWorkspaceLifecycleTool(name)
|
|
45
|
+
? validateWorkspaceLifecycleArguments(name, args)
|
|
46
|
+
: isWorkspaceGroupMessageTool(name)
|
|
47
|
+
? validateWorkspaceGroupMessageArguments(name, args)
|
|
48
|
+
: validateDialogueArguments(name, args)
|
|
30
49
|
const client = new Client({ name: 'kobo-stdio-bridge', version: '1.0.0' })
|
|
31
50
|
// Creation can include forge reads, worktree setup and user setup scripts.
|
|
32
51
|
// A timed-out creation is ambiguous and must never be retried automatically.
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{M as e,S as t,dt as n,lt as r,p as i,pt as a,v as o}from"./reactivity.esm-bundler-DY1JkAEA.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 ee,k as b,l as x,p as S,r as C,u as w,y as T,z as te}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{$ as ne,K as re,M as E,f as ie,z as ae}from"./dom-BtYTvLeN.js";import{l as oe,t as D,u as se}from"./QBtn-BUSdPaf4.js";import{Gt as ce,Ht as O,O as le,Zt as ue,at as de,en as fe,gt as pe,j as me,m as he,mt as ge,pt as _e,sn as k,st as ve,un as A,v as ye}from"./index-DCpe-Tfm.js";import{t as be}from"./QSpinnerDots-xdWyaE1i.js";import{t as xe}from"./QList-Cx1UfaUm.js";import{t as Se}from"./QMarkupTable-UhP7fVUp.js";import{c as j,l as M,s as N}from"./QSelect-Dh4CjliE.js";import{t as P}from"./QItemSection-MdJ1_ZK7.js";import{t as Ce}from"./QExpansionItem-DjaUhgjt.js";import{a as F,c as we,r as I,t as L}from"./ToolCallItem-BntDHc6p.js";import{t as Te}from"./QScrollArea-Dpksslru.js";import{a as R}from"./use-tours-CWafZt-m.js";import{f as Ee,g as z,m as De,p as Oe,u as ke}from"./use-worktree-restore-DkcM2FAZ.js";import{t as B}from"./QTooltip-CH45NuVs.js";import{n as V}from"./render-chat-markdown-CafzCcmu.js";import{n as H}from"./WorkspacePage-CAsY7Hl-.js";function Ae(e,t){return s(`div`,e,[s(`table`,{class:`q-table`},t)])}var je={list:xe,table:Se},U=[`list`,`table`,`__qtable`],Me=ae({name:`QVirtualScroll`,props:{...M,type:{type:String,default:`list`,validator:e=>U.includes(e)},items:{type:Array,default:()=>[]},itemsFn:Function,itemsSize:Number,scrollTarget:A},setup(e,{slots:n,attrs:r}){let i,a=t(null),o=x(()=>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=x(()=>{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=x(()=>`q-virtual-scroll q-virtual-scroll`+(e.virtualScrollHorizontal?`--horizontal`:`--vertical`)+(e.scrollTarget===void 0?` scroll`:``)),_=x(()=>e.scrollTarget===void 0?{tabindex:0}:{});l(o,()=>{u()}),l(()=>e.scrollTarget,()=>{C(),S()});function v(){let e=a.value;return e===null?null:e.$el||e}function y(){return i}function S(){let t=v();t!==null&&(i=k(t,e.scrollTarget),i.addEventListener(`scroll`,m,E.passive))}function C(){i!==void 0&&(i.removeEventListener(`scroll`,m,E.passive),i=void 0)}function w(){let t=f(e.type===`list`?`div`:`tbody`,h.value.map(n.default));return n.before!==void 0&&(t=n.before().concat(t)),ie(n.after,t)}return u(),p(()=>{S()}),b(()=>{S()}),d(()=>{C()}),ee(()=>{C()}),()=>{if(n.default===void 0){console.error(`QVirtualScroll: default scoped slot is required for rendering`);return}return e.type===`__qtable`?Ae({ref:a,class:`q-table__middle `+g.value,tabindex:0},w()):s(je[e.type],{...r,ref:a,class:[r.class,g.value],..._.value},w)}}}),Ne=new Set([`setup`,`cleanup`,`archive`]);function Pe(e){switch(e.type){case`user`:return e.sender===`system-prompt`?`system-prompt`:Ne.has(e.sender)||le(e.sender)?`script`:`user`;case`session`:return`session`;default:return`agent`}}function Fe(e){let t=[],n=null,r=null;for(let i of e){let e=Pe(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 W(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?W(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 ze={class:`agent-error-item`},Be={class:`agent-error-item__body`},Ve={class:`agent-error-item__title`},G={class:`agent-error-item__message`},He=R(T({__name:`AgentErrorItem`,props:{item:{}},setup(e){let t=e,{te:n}=ue(),r=x(()=>{let e=`agent.error.${t.item.category}`;return n(e)?e:`agent.error.other`});return(t,n)=>(u(),S(`div`,ze,[g(oe,{name:`error_outline`,size:`16px`,class:`agent-error-item__icon`}),w(`div`,Be,[w(`div`,Ve,a(t.$t(r.value)),1),w(`div`,G,a(e.item.message),1)])]))}}),[[`__scopeId`,`data-v-e98c3c02`]]),Ue={class:`text-caption text-kobo-3`},We=T({__name:`SessionEventItem`,props:{item:{}},setup(e){let t=e,n=x(()=>{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(),S(`span`,Ue,a(e.$t(n.value)),1))}}),K=new Map;function q(){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`,q),window.addEventListener(`storage`,e=>{(e.key===`kobo:network-token`||e.key===null)&&q()}));function J(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=O(e,{signal:n.signal}).then(async e=>{if(!e.ok)throw await ce(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 Ge(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=J(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 Ke(e,t){return t?e.replace(/\[image:\s+([^\]]+)\]/g,(e,n)=>{let r=String(n).trim();return/^(\.ai\/images\/|images\/)/.test(r)?`}/images/file?path=${encodeURIComponent(r)}`})`:e}):e}var qe=[`innerHTML`],Je=[`innerHTML`],Ye=[`src`],Y=R(T({__name:`UserMessageItem`,props:{item:{},workspaceId:{}},setup(t){let n=t,{t:r}=ue(),a=x(()=>n.item.sender===`system-prompt`),s=Ge(x(()=>{let e=Ke(n.item.content,n.workspaceId);return V(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=J(n.dataset.koboImageUrl),f.ready.catch(p)),c.value=n.src,d.value=!0)}return(t,n)=>(u(),S(C,null,[a.value?(u(),_(Ce,{key:0,dense:``,"dense-toggle":``,label:t.$t(`chat.systemPrompt`),"header-class":`text-kobo-2 text-caption`},{default:h(()=>[w(`div`,{class:`q-py-xs markdown-user-prompt`,innerHTML:e(s)},null,8,qe)]),_:1},8,[`label`])):(u(),S(`div`,{key:1,class:`markdown-message`,onClick:y},[w(`div`,{innerHTML:e(s)},null,8,Je)])),g(fe,{modelValue:d.value,"onUpdate:modelValue":n[1]||=e=>d.value=e},{default:h(()=>[c.value?(u(),S(`img`,{key:0,src:c.value,alt:``,class:`image-lightbox-img`,onClick:n[0]||=e=>d.value=!1},null,8,Ye)):v(``,!0)]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-db2fc622`]]),Xe=[`data-event-ids`],X={class:`turn-header`},Ze={key:0,class:`turn-time`},Qe={class:`turn-time turn-time-updated`},Z={key:2,class:`turn-actions`},$e={class:`turn-body`},et={class:`ellipsis`},tt={class:`q-px-sm q-pb-sm`},nt={key:0,class:`turn-scroll-top`},rt=R(T({__name:`TurnCard`,props:{turn:{},workspaceId:{},highlighted:{type:Boolean}},emits:[`scrollTo`],setup(t,{emit:i}){let s=t,c=i,{t:l}=ue(),d=de(),f=m(F),p=o(null);function ee(){let e=p.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=x(()=>{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:le(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 T(e,t=!1){if(!e)return``;let n=new Date(e);return Number.isNaN(n.getTime())?``:n.toLocaleTimeString(void 0,t?{hour:`2-digit`,minute:`2-digit`,second:`2-digit`}:{hour:`2-digit`,minute:`2-digit`})}let re=x(()=>T(s.turn.ts)),E=x(()=>s.turn.items.flatMap(e=>e.eventIds??[]).join(` `)),ie=x(()=>{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}),ae=x(()=>{let e=s.turn.ts,t=ie.value;if(!t||!e||t===e)return``;let n=new Date(e).getTime(),r=new Date(t).getTime();return Number.isNaN(n)||Number.isNaN(r)||r<=n?``:T(t,r-n<6e4)}),se=x(()=>ae.value!==``);function ce(e){return we(e.origin,Object.values(d.subagents[s.workspaceId]??{}),e.type===`tool`?e.toolCallId:void 0)}function O(e){return e||l(`chat.subagentActivity`)}function fe(e){return(e.type===`text`||e.type===`thinking`||e.type===`tool`)&&e.origin?.kind===`subagent`}let pe=x(()=>{let e=[],t=new Map;for(let n of s.turn.items){if(!fe(n)){e.push({type:`item`,key:W(n),item:n});continue}let r=ce(n),i=r?.toolUseId??n.origin?.toolCallId??n.origin?.threadId??W(n),a=t.get(i);if(a){a.items.push(n);continue}let o={type:`subagent`,key:`subagent:${W(n)}`,items:[n],subagentKey:i,subagentName:r?.description||null};t.set(i,o),e.push(o)}return e});function me(e){e.origin&&f?.({origin:e.origin})}let he=x(()=>s.turn.items.filter(e=>e.type===`tool`).length);return(i,o)=>(u(),S(`div`,{ref_key:`cardEl`,ref:p,class:r([`turn-card`,{"turn-card--user":t.turn.speaker===`user`,"turn-card--highlighted":t.highlighted}]),"data-event-ids":E.value,style:n({"--turn-accent":b.value.accent})},[w(`div`,X,[w(`span`,{class:r([`turn-badge`,b.value.badgeClass])},a(b.value.label),3),re.value?(u(),S(`span`,Ze,a(re.value),1)):v(``,!0),se.value?(u(),S(C,{key:1},[g(oe,{name:`arrow_forward`,size:`10px`,color:`kobo-3`,class:`turn-time-arrow`}),w(`span`,Qe,[y(a(ae.value)+` `,1),g(B,null,{default:h(()=>[y(a(e(l)(`chat.lastUpdatedAt`,{time:ae.value})),1)]),_:1})])],64)):v(``,!0),he.value>0?(u(),S(`span`,Z,` · `+a(e(l)(`chat.nActions`,{n:he.value})),1)):v(``,!0)]),w(`div`,$e,[(u(!0),S(C,null,te(pe.value,n=>(u(),S(C,{key:n.key},[n.type===`subagent`?(u(),_(Ce,{key:0,class:`turn-subagent-activity`,dense:``,label:O(n.subagentName),caption:e(l)(`chat.nActions`,{n:n.items.length}),"default-opened":t.highlighted&&n.items.some(e=>e.eventIds?.some(e=>E.value.includes(e)))},{header:h(()=>[g(P,null,{default:h(()=>[g(N,{class:`row items-center no-wrap`,title:n.subagentName??void 0},{default:h(()=>[g(oe,{name:`hub`,size:`16px`,class:`q-mr-xs`},{default:h(()=>[g(B,null,{default:h(()=>[y(a(e(l)(`chat.subagentActivity`)),1)]),_:1})]),_:1}),w(`span`,et,a(O(n.subagentName)),1)]),_:2},1032,[`title`]),g(N,{caption:``},{default:h(()=>[y(a(e(l)(`chat.nActions`,{n:n.items.length})),1)]),_:2},1024)]),_:2},1024),g(P,{side:``},{default:h(()=>[g(D,{flat:``,round:``,dense:``,size:`sm`,icon:`open_in_new`,"aria-label":e(l)(`chat.openSubagentActivity`),onClick:ne(e=>me(n.items[0]),[`stop`])},{default:h(()=>[g(B,null,{default:h(()=>[y(a(e(l)(`chat.openSubagentActivity`)),1)]),_:1})]),_:1},8,[`aria-label`,`onClick`])]),_:2},1024)]),default:h(()=>[w(`div`,tt,[(u(!0),S(C,null,te(n.items,t=>(u(),S(C,{key:e(W)(t)},[t.type===`text`?(u(),_(I,{key:0,item:t},null,8,[`item`])):t.type===`thinking`?(u(),_(H,{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(),S(C,{key:1},[n.item.type===`text`?(u(),_(I,{key:0,item:n.item},null,8,[`item`])):n.item.type===`thinking`?(u(),_(H,{key:1,item:n.item},null,8,[`item`])):n.item.type===`tool`?(u(),_(L,{key:2,item:n.item},null,8,[`item`])):n.item.type===`user`?(u(),_(Y,{key:3,item:n.item,"workspace-id":t.workspaceId},null,8,[`item`,`workspace-id`])):n.item.type===`session`?(u(),_(We,{key:4,item:n.item},null,8,[`item`])):n.item.type===`error`?(u(),_(He,{key:5,item:n.item},null,8,[`item`])):v(``,!0)],64))],64))),128))]),t.turn.items.length>4?(u(),S(`div`,nt,[g(D,{flat:``,round:``,dense:``,size:`xs`,icon:`arrow_upward`,color:`kobo-3`,class:`turn-scroll-top-btn`,onClick:ee},{default:h(()=>[g(B,null,{default:h(()=>[y(a(e(l)(`chat.scrollToTurnTop`)),1)]),_:1})]),_:1})])):v(``,!0)],14,Xe))}}),[[`__scopeId`,`data-v-13bebb3d`]]),it={key:0,class:`activity-feed-switching`},at={key:1,class:`activity-feed-wrap`,"data-tour":`ws-chat`},ot={key:0,role:`alert`,class:`q-pa-sm text-negative`},st={key:1,"data-testid":`history-load-error`,role:`alert`,class:`q-pa-sm text-negative`},ct=[`aria-label`],lt={key:0,class:`activity-feed-compacting`},ut={class:`text-caption text-kobo-2`},dt={key:0,class:`text-center q-py-sm text-caption text-kobo-3`},ft={key:1,class:`activity-feed-empty q-pa-md`},pt={class:`activity-feed-empty__title`},mt={class:`activity-feed-empty__hint`},ht={key:2,class:`q-px-md q-pb-md`},gt=[`title`],_t={class:`ellipsis`},vt={class:`activity-feed-nav-cluster`},yt=300,bt=60,xt=200,St=180,Ct=255,wt=3,Tt=60,Et=R(T({__name:`ActivityFeed`,props:{workspaceId:{}},setup(t){let{t:n}=ue(),r=t,i=pe(),s=me(),d=de(),m=he(),ee=x(()=>m.isCompacting(r.workspaceId)),b=x(()=>d.selectedSessionId),T=x(()=>d.sessions.find(e=>e.id===b.value)?.engineSessionId??null),ne=x(()=>{let e=d.sessions;return e.length!==0&&b.value===e[e.length-1].id});function E(e){return b.value?e?e===b.value||e===T.value:ne.value:!0}let ie=x(()=>(d.activityFeeds[r.workspaceId]??[]).filter(e=>e.type===`text`&&typeof e.content==`string`&&E(e.sessionId)).map(e=>({content:e.content,sender:e.meta?.sender??`user`,source:ye(e.meta?.source),ts:e.timestamp,sessionId:e.sessionId,eventIds:[e.id]}))),ae=x(()=>{let e=d.workspaces.find(e=>e.id===r.workspaceId);return ve(e?.status)}),le=ke(),fe=``,k=x(()=>{let e=i.eventsFor(r.workspaceId),t=i.timestampsFor(r.workspaceId),n=i.sessionIdsFor(r.workspaceId),a=i.eventIdsFor(r.workspaceId),o=[],c=[],l=[];for(let r=0;r<e.length;r++)E(n[r])&&(o.push(e[r]),c.push(t[r]),l.push(a[r]??null));let u=`${r.workspaceId}::${b.value??`*`}`;u!==fe&&(le=ke(),fe=u);let d=Ee(le,o,c,ae.value,l);return Fe(De(d,ie.value).filter(e=>e.type===`thinking`?!1:e.type===`session`?e.kind===`ended`?s.showVerboseSystemMessages||!Oe(e.detail):s.showVerboseSystemMessages:!0))}),A=x(()=>s.showVerboseSystemMessages?i.eventsFor(r.workspaceId).filter(e=>e.kind===`message:raw`).map(e=>e.content):[]),xe=x(()=>{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 r=t[e];if(r){if(r.type===`text`&&!r.streaming)return{key:`text:${r.messageId}`,text:r.text};if(r.type===`tool`)return r.result?{key:`tool:${r.toolCallId}:end`,text:r.result.isError?n(`activity.a11y.toolFailed`,{name:r.name}):n(`activity.a11y.toolFinished`,{name:r.name})}:{key:`tool:${r.toolCallId}:start`,text:n(`activity.a11y.toolStarted`,{name:r.name})}}}}return null}),Se=o(``);l(xe,(e,t)=>{if(!e||e.key===t?.key)return;let r=e.key.startsWith(`text:`)?n(`activity.a11y.agentSaid`,{text:e.text.slice(0,yt)}):e.text;Se.value=r});let j=o(null),M=o(!0),N=o(!1),P=o(``),F=_e(),we=_e(),I=_e(),L=o(null),R=!1,z=!0,B=null,V=o(new Set),H=new Map,Ae=x(()=>{if(k.value.length>0||A.value.length>0)return!1;let e=r.workspaceId,t=b.value;return!!d.loadingSessions[e]||m.isSyncPending(e)||t!==null&&V.value.has(W(e,t))}),je=o(new Map),U=x(()=>k.value.length>0||A.value.length>0),Ne=x(()=>!!d.loadingSessions[r.workspaceId]||m.isSyncPending(r.workspaceId)||b.value!==null&&V.value.has(W(r.workspaceId,b.value)));function Pe(e){et();let t=B;if(B=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<=bt,R&&e.verticalPosition<=xt&&!N.value&&!P.value&&ze()&&He()}function W(e,t){return`${e}:${t}`}function ze(){let e=b.value;return e?je.value.get(W(r.workspaceId,e))??!0:i.hasMoreOlderFor(r.workspaceId)}function Be(e,t,n){je.value.set(W(e,t),n)}function Ve(e){if(!b.value)return i.oldestIdFor(e);let t=i.eventIdsFor(e),n=i.sessionIdsFor(e);for(let e=0;e<t.length;e++){if(!E(n[e]))continue;let r=t[e];if(r)return r}}let G=null;function He(){if(G)return G;let e=K().finally(()=>{G===e&&(G=null)});return G=e,G}function Ue(){F.abort(),we.abort(),I.abort(),N.value=!1,G=null;for(let e of V.value)Ft.delete(e);H.clear(),V.value.clear(),P.value=``}function We(){P.value=``,Mt.value===0&&b.value?It():He()}l(()=>[r.workspaceId,b.value],Ue,{flush:`sync`});async function K(){let e=r.workspaceId,t=b.value,n=Ve(e);if(!n)return;let a=F.begin();P.value=``,N.value=!0;try{let r=j.value;if(await f(),!F.isCurrent(a))return;let o=r?.getScroll().verticalSize??0,s=r?.getScroll().verticalPosition??0,c=new URLSearchParams({before:n,limit:`200`});t&&c.set(`session`,t);let l=await O(`/api/workspaces/${e}/events?${c.toString()}`,{signal:a});if(!l.ok)throw await ce(l);let u=await l.json();if(!F.isCurrent(a))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),ee=p.length>0?p[0].id:n;t&&Be(e,t,u.hasMore),i.prepend(e,g,_,{oldestId:ee,hasMoreOlder:t?i.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:ye(n.source)}})}if(await f(),r&&F.isCurrent(a)){let e=r.getScroll().verticalSize-o;if(e>0){let t=Math.max(s+e,250);r.setScrollPosition(`vertical`,t,0)}}}catch(e){if(ge(e)||!F.isCurrent(a))return;P.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to load older events:`,e)}finally{F.isCurrent(a)&&(N.value=!1)}}async function q(e=0){let t=Pt();if(await f(),t!==Pt())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<St,t=Pt();J=requestAnimationFrame(()=>{J=null,t===Pt()&&(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!==r.workspaceId||!t.eventId)return;$(),M.value=!1;let n=I.begin(),a=r.workspaceId;try{let e=new URLSearchParams({around:t.eventId,limit:`200`});t.sessionId&&e.set(`session`,t.sessionId);let o=await O(`/api/workspaces/${a}/events?${e}`,{signal:n});if(!o.ok)throw await ce(o);let s=await o.json();if(!I.isCurrent(n))return;let c=s.events??[],l=c.filter(e=>e.type===`agent:event`&&e.workspaceId===r.workspaceId),u=c.filter(e=>e.type===`user:message`&&e.workspaceId===r.workspaceId);i.reset(r.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(r.workspaceId,{id:e.id,type:`text`,content:t.content,timestamp:e.createdAt,sessionId:e.sessionId??void 0,meta:{sender:t.sender??`user`,source:ye(t.source)}})}if(await Re(Ae,e=>!e,5e3),await f(),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e()))),!I.isCurrent(n))return;let p=k.value.findIndex(e=>e.items.some(e=>e.eventIds?.includes(t.eventId)??!1));if(p<0)return;L.value=t.eventId,Y.value?.scrollTo(p,`center`),X.value=p,window.setTimeout(()=>{L.value===t.eventId&&(L.value=null)},1800)}catch(e){if(ge(e)||!I.isCurrent(n))return;P.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] failed to focus history event:`,e)}}let Y=o(null),Xe=o(null),X=o(0),Ze=o(!1),Qe=x(()=>{for(let e=k.value.length-1;e>=0;e--)if(k.value[e]?.speaker===`user`)return e;return-1}),Z=null;function $e(){let e=Qe.value,t=j.value?.getScrollTarget(),n=t?.querySelector(`[data-turn-index="${e}"]`);if(!n||!t){Ze.value=!1;return}let r=t.getBoundingClientRect(),i=n.getBoundingClientRect();Ze.value=i.bottom>r.top&&i.top<r.bottom}function et(){Z===null&&(Z=requestAnimationFrame(()=>{Z=null,$e()}))}function tt(e){return e.length<=Ct?e:`${e.slice(0,252)}...`}let nt=x(()=>{let e=Qe.value,t=k.value[e];if(!t||X.value<=e||Ze.value)return null;let n=t.items.filter(e=>e.type===`user`).map(e=>e.content).join(`
|
|
2
|
-
`).trim();return n?{index:e,content:tt(n)}:null});function Et(e){X.value=e.index,et()}function Dt(){let e=nt.value;e&&($(),M.value=!1,Y.value?.scrollTo(e.index,`start`),X.value=e.index)}let Ot=o(!1);async function kt(){if(Ot.value)return;$(),M.value=!1,Ot.value=!0;let e=r.workspaceId;try{let t=Le(k.value,X.value);if(t<0)for(let n=0;n<15;n++){if(e!==r.workspaceId)return;if(!ze())break;let n=k.value.length;if(await He(),await f(),e!==r.workspaceId)return;if(X.value+=k.value.length-n,t=Le(k.value,X.value),t>=0)break}t>=0&&e===r.workspaceId&&(Y.value?.scrollTo(t,`start`),X.value=t)}finally{Ot.value=!1}}let Q=0;function At(){return new Promise(e=>requestAnimationFrame(()=>e()))}async function jt(){if(!z||!U.value||Ae.value)return;R=!1;let e=++Q;if(await f(),e!==Q||!z||(Xe.value=j.value?.getScrollTarget()??null,await f(),e!==Q||!z))return;k.value.length>0&&Y.value?.scrollTo(k.value.length-1,`end-force`),await At();let t=-1,n=0;for(let r=0;r<Tt&&n<wt;r++){if(e!==Q||!z)return;await q(0),await At();let r=j.value?.getScroll().verticalSize??0;B=r,n=r===t?n+1:0,t=r}e===Q&&!Ne.value&&(R=!0,z=!1)}function $(){z=!1,!R&&(Q++,R=!0)}let Mt=x(()=>{let e=i.sessionIdsFor(r.workspaceId);if(!b.value)return e.length;let t=0;for(let n of e)E(n)&&t++;return t});l(Ae,async e=>{!e&&U.value&&await jt(),e||f(()=>{Xe.value=j.value?.getScrollTarget()??null,et()})}),l(Ne,(e,t)=>{!e&&t&&z&&U.value&&jt()}),p(()=>{window.addEventListener(`kobo:focus-history-event`,Ye),f(()=>{Xe.value=j.value?.getScrollTarget()??null,et()}),U.value&&jt(),b.value&&It();let e=new URLSearchParams(window.location.hash.split(`?`)[1]??``).get(`eventId`);e&&(Ye(new CustomEvent(`kobo:focus-history-event`,{detail:{workspaceId:r.workspaceId,sessionId:b.value,eventId:e}})),Je())}),l([Mt,()=>ie.value.length,()=>A.value.length],async([e,t,n])=>{N.value||z&&e+t+n>0&&await jt()}),l([Qe,()=>k.value.length],()=>{f(et)});let Nt=x(()=>i.liveAppendCountFor(r.workspaceId,E)),Pt=()=>`${r.workspaceId}\u0000${d.selectedSessionId??``}`;l([Nt,Pt],([e,t],[n,r])=>{t===r&&e>n&&M.value&&!N.value&&Ke()}),c(()=>{Q++,z=!1,Ue(),window.removeEventListener(`kobo:focus-history-event`,Ye),J!=null&&(cancelAnimationFrame(J),J=null),Z!==null&&cancelAnimationFrame(Z)}),l([()=>r.workspaceId,()=>d.selectedSessionId],()=>{Q++,z=!0,B=null,M.value=!0,R=!1,It(),U.value&&jt()});let Ft=new Set;async function It(){let e=r.workspaceId,t=b.value;if(!t||Mt.value>0)return;let n=W(e,t);if(Ft.has(n))return;Ft.add(n),V.value.add(n);let a=we.begin();H.set(n,a),P.value=``;try{let n=await O(`/api/workspaces/${e}/events?session=${encodeURIComponent(t)}&limit=500`,{signal:a});if(!n.ok)throw await ce(n);let r=await n.json();if(!we.isCurrent(a))return;let o=r.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,r.hasMore),l.length>0&&i.prepend(e,l,u,{oldestId:o[0].id,hasMoreOlder:i.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:ye(n.source)}})}}catch(e){if(ge(e)||!we.isCurrent(a)){(!H.has(n)||H.get(n)===a)&&Ft.delete(n);return}P.value=e instanceof Error?e.message:String(e),console.error(`[ActivityFeed] fetchSessionIfMissing failed:`,e),Ft.delete(n)}finally{H.get(n)===a&&(H.delete(n),V.value.delete(n))}}let Lt=x(()=>ie.value.filter(e=>e.sender===`user`).length),Rt=x(()=>(d.activityFeeds[r.workspaceId]??[]).filter(e=>e.meta?.sender===`user`&&e.meta.pending&&E(e.sessionId)).length);l([Lt,Rt,Pt],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 zt(){M.value=!0,await q(250)}return(t,n)=>Ae.value?(u(),S(`div`,it,[g(be,{size:`40px`,color:`primary`})])):(u(),S(`div`,at,[e(d).sessionsErrors[r.workspaceId]?(u(),S(`div`,ot,[y(a(t.$t(`activity.sessionsError`,{message:e(d).sessionsErrors[r.workspaceId]}))+` `,1),g(D,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:n[0]||=t=>e(d).fetchSessions(r.workspaceId)},null,8,[`label`])])):v(``,!0),P.value?(u(),S(`div`,st,[y(a(t.$t(`activity.historyError`,{message:P.value}))+` `,1),g(D,{flat:``,dense:``,label:t.$t(`common.retry`),onClick:We},null,8,[`label`])])):v(``,!0),w(`div`,{"data-testid":`activity-live-region`,class:`sr-only`,role:`log`,"aria-live":`polite`,"aria-atomic":`true`,"aria-label":t.$t(`activity.a11y.region`)},a(Se.value),9,ct),g(re,{name:`fade`},{default:h(()=>[ee.value?(u(),S(`div`,lt,[g(be,{size:`18px`,color:`primary`}),w(`span`,ut,a(t.$t(`activity.compacting`)),1)])):v(``,!0)]),_:1}),g(Te,{ref_key:`scrollRef`,ref:j,class:`activity-feed-scroll`,onScroll:Pe,onWheelPassive:$,onTouchstartPassive:$,onKeydown:$},{default:h(()=>[N.value?(u(),S(`div`,dt,[g(se,{size:`sm`}),y(` `+a(t.$t(`activity.loading_older`)),1)])):v(``,!0),g(Me,{ref_key:`virtualScrollRef`,ref:Y,class:`q-pa-md`,items:k.value,"scroll-target":Xe.value??void 0,"virtual-scroll-item-size":160,"virtual-scroll-slice-size":20,onVirtualScroll:Et},{default:h(({item:t,index:n})=>[(u(),_(rt,{key:e(Ie)(t),turn:t,"workspace-id":r.workspaceId,"data-turn-index":n,highlighted:t.items.some(e=>e.eventIds?.includes(L.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(),S(`div`,ft,[g(oe,{name:`forum`,size:`28px`}),w(`div`,pt,a(t.$t(`activity.empty`)),1),w(`div`,mt,a(t.$t(`activity.emptyHint`)),1)])):v(``,!0),A.value.length?(u(),S(`div`,ht,[g(Ce,{label:t.$t(`activity.raw_lines`,{n:A.value.length}),dense:``},{default:h(()=>[(u(!0),S(C,null,te(A.value,(e,t)=>(u(),S(`div`,{key:t,class:`text-caption text-kobo-3 q-pa-xs`},a(e),1))),128))]),_:1},8,[`label`])])):v(``,!0)]),_:1},512),nt.value?(u(),S(`button`,{key:2,type:`button`,class:`activity-feed-last-user`,"data-testid":`latest-user-message`,title:nt.value.content,onClick:Dt},[g(oe,{name:`person`,size:`16px`}),w(`span`,_t,a(nt.value.content),1)],8,gt)):v(``,!0),w(`div`,vt,[M.value?v(``,!0):(u(),_(D,{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:zt},null,8,[`title`,`aria-label`])),g(D,{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:Ot.value,disable:Ot.value,onClick:kt},null,8,[`title`,`aria-label`,`loading`,`disable`])])]))}}),[[`__scopeId`,`data-v-58324159`]]);export{Et as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{lt as e,pt as t,v as n}from"./reactivity.esm-bundler-DY1JkAEA.js";import{J as r,L as i,P as ee,Y as a,_ as o,d as te,f as s,g as c,l,p as u,r as ne,u as d,y as f,z as re}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{t as p}from"./QBtn-BUSdPaf4.js";import{Ht as m,Zt as h,a as ie,at as ae}from"./index-DCpe-Tfm.js";import{t as oe}from"./QMarkupTable-UhP7fVUp.js";import{a as g,i as _}from"./use-tours-CWafZt-m.js";var v=[`workspace`,`engine`,`model`,`status`,`branch`,`tasks_done`,`tasks_total`,`commits`,`files_changed`,`insertions`,`deletions`,`agent_messages`,`user_messages`,`injected_prompts`,`questions`,`tool_calls`,`errors`,`input_tokens`,`output_tokens`,`sessions`,`duration_seconds`];function y(e){if(e==null)return``;let t=String(e);return/[",\r\n]/.test(t)?`"${t.replace(/"/g,`""`)}"`:t}function b(e){let t=e.map(e=>{let t=e.gitStats,n=e.activity;return[e.workspace.name,e.workspace.engine,e.workspace.model,e.workspace.status,e.workspace.workingBranch,e.tasks.done,e.tasks.total,t?.commitCount??null,t?.filesChanged??null,t?.insertions??null,t?.deletions??null,n.agentMessages,n.userMessages,n.injectedPrompts,n.questions,n.toolCalls,n.errors,n.inputTokens,n.outputTokens,n.sessions,Math.round(n.durationMs/1e3)].map(y).join(`,`)});return`${[v.join(`,`),...t].join(`\r
|
|
2
|
-
`)}`}var x={key:0,class:`comparison-panel q-pa-md`},S={class:`row items-center q-mb-sm`},C={class:`text-subtitle2`},w={class:`text-caption text-kobo-3 q-mb-sm`},T={class:`text-left`},E={class:`text-left`},D={class:`text-right`},O={class:`text-right`},k={class:`text-right`},A={class:`text-right`},j={class:`text-right`},M={class:`text-right`},N={class:`text-right`},P={class:`text-right`},F={class:`text-right`},I={class:`text-right`},L={class:`text-right`},R={class:`text-caption text-kobo-3 comparison-mono`},z={key:0,class:`text-caption text-kobo-3`},B={class:`text-right comparison-mono`},V={class:`text-right`},H={class:`text-right`},U={class:`text-right`},se={key:0,class:`comparison-mono`},W={class:`text-kobo-success`},G={class:`text-kobo-danger q-ml-xs`},K={key:1,class:`text-kobo-3`},ce={class:`text-right comparison-mono`},le=[`title`],ue={class:`text-right`},de={class:`text-right`},fe={class:`text-right comparison-mono`},pe=[`title`],me={class:`text-right`},he={class:`text-right comparison-mono`},ge={class:`text-right`},_e={key:1,class:`text-caption text-kobo-3`},ve={key:0,class:`text-caption text-kobo-warning q-mt-sm`},q=g(f({__name:`ComparisonPanel`,props:{workspaceId:{}},setup(f){let g=f;function v(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function y(e){if(e<=0)return`-`;let t=Math.round(e/1e3);if(t<60)return J(`reliability.durationSeconds`,{s:t});let n=Math.floor(t/60);return n<60?J(`reliability.durationMinutes`,{m:n,s:t%60}):J(`reliability.durationHours`,{h:Math.floor(n/60),m:n%60})}let q=ie(),ye=ae(),{t:J}=h(),Y=n([]),X=n(!1),be={created:`workspaceStatus.created`,extracting:`workspaceStatus.extracting`,brainstorming:`workspaceStatus.brainstorming`,executing:`workspaceStatus.executing`,compacting:`workspaceStatus.compacting`,"awaiting-user":`workspaceStatus.awaitingUser`,completed:`workspaceStatus.completed`,idle:`workspaceStatus.idle`,error:`workspaceStatus.error`,quota:`workspaceStatus.quota`,retrying:`workspaceStatus.retrying`},Z=n({});function xe(e){return Z.value[e]??e}async function Se(){try{let e=await m(`/api/engines`);if(!e.ok)return;let t=await e.json();Z.value=Object.fromEntries(t.map(e=>[e.id,e.displayName]))}catch{}}function Ce(e){let t=be[e];return t?J(t):e}let we=l(()=>g.workspaceId);function Q(e){return e.workspace.id===we.value}function Te(e){ye.selectWorkspace(e),q.push({name:`workspace`,params:{id:e}})}function Ee(){let e=b(Y.value),t=new Blob([e],{type:`text/csv;charset=utf-8`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`kobo-comparison-${Y.value[0]?.workspace.comparisonId??`comparison`}.csv`,r.click(),URL.revokeObjectURL(n)}async function $(){X.value=!0;try{let e=await m(`/api/workspaces/${g.workspaceId}/comparison`);if(!e.ok){Y.value=[];return}let t=await e.json();Y.value=t.members??[]}catch{Y.value=[]}finally{X.value=!1}}return ee(()=>{Se(),$()}),r(()=>g.workspaceId,$),(n,r)=>Y.value.length>0?(i(),u(`div`,x,[d(`div`,S,[d(`div`,C,t(n.$t(`comparison.title`)),1),o(_),o(p,{flat:``,dense:``,round:``,size:`sm`,icon:`download`,title:n.$t(`comparison.exportCsv`),onClick:Ee},null,8,[`title`]),o(p,{flat:``,dense:``,round:``,size:`sm`,icon:`refresh`,loading:X.value,onClick:$},null,8,[`loading`])]),d(`div`,w,t(n.$t(`comparison.hint`)),1),o(oe,{flat:``,dense:``,dark:``,class:`comparison-table`},{default:a(()=>[d(`thead`,null,[d(`tr`,null,[d(`th`,T,t(n.$t(`comparison.engine`)),1),d(`th`,E,t(n.$t(`comparison.status`)),1),d(`th`,D,t(n.$t(`comparison.tasks`)),1),d(`th`,O,t(n.$t(`comparison.commits`)),1),d(`th`,k,t(n.$t(`comparison.files`)),1),d(`th`,A,t(n.$t(`comparison.diff`)),1),d(`th`,j,t(n.$t(`comparison.messages`)),1),d(`th`,M,t(n.$t(`comparison.questions`)),1),d(`th`,N,t(n.$t(`comparison.tools`)),1),d(`th`,P,t(n.$t(`comparison.errors`)),1),d(`th`,F,t(n.$t(`comparison.tokens`)),1),d(`th`,I,t(n.$t(`comparison.sessions`)),1),d(`th`,L,t(n.$t(`comparison.duration`)),1),r[0]||=d(`th`,null,null,-1)])]),d(`tbody`,null,[(i(!0),u(ne,null,re(Y.value,r=>(i(),u(`tr`,{key:r.workspace.id,class:e({"comparison-current":Q(r)})},[d(`td`,null,[d(`div`,null,t(xe(r.workspace.engine)),1),d(`div`,R,t(r.workspace.model),1)]),d(`td`,null,[c(t(Ce(r.workspace.status))+` `,1),r.workspace.archivedAt?(i(),u(`span`,z,` · `+t(n.$t(`comparison.archived`)),1)):s(``,!0)]),d(`td`,B,t(r.tasks.done)+`/`+t(r.tasks.total),1),d(`td`,V,t(r.gitStats?.commitCount??`-`),1),d(`td`,H,t(r.gitStats?.filesChanged??`-`),1),d(`td`,U,[r.gitStats?(i(),u(`span`,se,[d(`span`,W,`+`+t(r.gitStats.insertions),1),d(`span`,G,`-`+t(r.gitStats.deletions),1)])):(i(),u(`span`,K,`-`))]),d(`td`,ce,[d(`span`,{title:n.$t(`comparison.messagesTitle`)},t(r.activity.agentMessages)+` / `+t(r.activity.userMessages),9,le)]),d(`td`,ue,t(r.activity.questions),1),d(`td`,de,t(r.activity.toolCalls),1),d(`td`,{class:e([`text-right`,r.activity.errors>0?`text-kobo-danger`:``])},t(r.activity.errors),3),d(`td`,fe,[d(`span`,{title:n.$t(`comparison.tokensTitle`)},t(v(r.activity.inputTokens))+` / `+t(v(r.activity.outputTokens)),9,pe)]),d(`td`,me,t(r.activity.sessions),1),d(`td`,he,t(y(r.activity.durationMs)),1),d(`td`,ge,[Q(r)?(i(),u(`span`,_e,t(n.$t(`comparison.current`)),1)):(i(),te(p,{key:0,flat:``,dense:``,"no-caps":``,size:`sm`,label:n.$t(`comparison.open`),onClick:e=>Te(r.workspace.id)},null,8,[`label`,`onClick`]))])],2))),128))])]),_:1}),Y.value.length<2?(i(),u(`div`,ve,t(n.$t(`comparison.incomplete`)),1)):s(``,!0)])):s(``,!0)}}),[[`__scopeId`,`data-v-bda71e6d`]]);export{q as default};
|