From 4e1f1fbc4518cf2ea5d099467f1dc76855a10df7 Mon Sep 17 00:00:00 2001 From: Nicole Date: Thu, 3 Sep 2026 20:19:04 +0200 Subject: [PATCH] First commit --- NexusDaemon.qml | 48 + README.md | 34 + plugin.json | 12 + resources/attachments/chat.png | Bin 0 -> 215070 bytes resources/attachments/coding.png | Bin 0 -> 352644 bytes resources/attachments/preview.png | Bin 0 -> 75241 bytes resources/attachments/settings.png | Bin 0 -> 105951 bytes resources/icons/dark/anthropic.svg | 1 + resources/icons/dark/groq.svg | 1 + resources/icons/dark/lmstudio.svg | 1 + resources/icons/dark/moonshot.svg | 1 + resources/icons/dark/ollama.svg | 1 + resources/icons/dark/openai.svg | 1 + resources/icons/dark/openrouter.svg | 1 + resources/icons/dark/perplexity.svg | 1 + resources/icons/dark/zai.svg | 1 + resources/icons/light/anthropic.svg | 1 + resources/icons/light/custom.svg | 1 + resources/icons/light/deepseek.svg | 1 + resources/icons/light/google.svg | 1 + resources/icons/light/groq.svg | 1 + resources/icons/light/lmstudio.svg | 1 + resources/icons/light/moonshot.svg | 1 + resources/icons/light/ollama.svg | 1 + resources/icons/light/openai.svg | 1 + resources/icons/light/openrouter.svg | 1 + resources/icons/light/perplexity.svg | 1 + resources/icons/light/zai.svg | 1 + resources/icons/models/claude.svg | 1 + resources/icons/models/deepseek.svg | 1 + resources/icons/models/gemini.svg | 1 + resources/icons/models/gemma.svg | 1 + resources/icons/models/groq.svg | 1 + resources/icons/models/kimi.svg | 1 + resources/icons/models/llama.svg | 1 + resources/icons/models/minimax.svg | 1 + resources/icons/models/mistral.svg | 1 + resources/icons/models/nemotron.svg | 1 + resources/icons/models/openai.svg | 1 + resources/icons/models/qwen.svg | 1 + resources/placeholders.txt | 255 ++++ resources/pondering.txt | 100 ++ src/components/BrandIcon.qml | 65 + src/components/BubbleTip.qml | 135 ++ src/components/ChatComposer.qml | 703 +++++++++ src/components/ContextMeter.qml | 158 ++ src/components/HexSphereLogo.qml | 316 ++++ src/components/MCPSection.qml | 711 +++++++++ src/components/MessageBubble.qml | 1294 ++++++++++++++++ src/components/MessageList.qml | 227 +++ src/components/ModelSelector.qml | 883 +++++++++++ src/components/NativeToolsSection.qml | 197 +++ src/components/NexusChat.qml | 416 ++++++ src/components/NexusPanel.qml | 252 ++++ src/components/NexusSettings.qml | 204 +++ src/components/ProvidersSection.qml | 993 +++++++++++++ src/lib/ContextWindows.js | 109 ++ src/lib/ErrorHints.js | 35 + src/lib/FuzzyMatch.js | 18 + src/lib/Markdown.js | 303 ++++ src/lib/McpTools.js | 64 + src/lib/ModelIcons.js | 78 + src/lib/PromptPresets.js | 34 + src/lib/Providers.js | 705 +++++++++ src/lib/StreamParser.js | 392 +++++ src/lib/SyntaxHighlight.js | 70 + src/lib/WebTools.js | 350 +++++ src/services/KeyringService.qml | 159 ++ src/services/MCPService.qml | 341 +++++ src/services/NativeToolsService.qml | 168 +++ src/services/NexusService.qml | 1967 +++++++++++++++++++++++++ src/services/StreamingService.qml | 426 ++++++ 72 files changed, 12255 insertions(+) create mode 100644 NexusDaemon.qml create mode 100644 README.md create mode 100644 plugin.json create mode 100644 resources/attachments/chat.png create mode 100644 resources/attachments/coding.png create mode 100644 resources/attachments/preview.png create mode 100644 resources/attachments/settings.png create mode 100644 resources/icons/dark/anthropic.svg create mode 100644 resources/icons/dark/groq.svg create mode 100644 resources/icons/dark/lmstudio.svg create mode 100644 resources/icons/dark/moonshot.svg create mode 100644 resources/icons/dark/ollama.svg create mode 100644 resources/icons/dark/openai.svg create mode 100644 resources/icons/dark/openrouter.svg create mode 100644 resources/icons/dark/perplexity.svg create mode 100644 resources/icons/dark/zai.svg create mode 100644 resources/icons/light/anthropic.svg create mode 100644 resources/icons/light/custom.svg create mode 100644 resources/icons/light/deepseek.svg create mode 100644 resources/icons/light/google.svg create mode 100644 resources/icons/light/groq.svg create mode 100644 resources/icons/light/lmstudio.svg create mode 100644 resources/icons/light/moonshot.svg create mode 100644 resources/icons/light/ollama.svg create mode 100644 resources/icons/light/openai.svg create mode 100644 resources/icons/light/openrouter.svg create mode 100644 resources/icons/light/perplexity.svg create mode 100644 resources/icons/light/zai.svg create mode 100644 resources/icons/models/claude.svg create mode 100644 resources/icons/models/deepseek.svg create mode 100644 resources/icons/models/gemini.svg create mode 100644 resources/icons/models/gemma.svg create mode 100644 resources/icons/models/groq.svg create mode 100644 resources/icons/models/kimi.svg create mode 100644 resources/icons/models/llama.svg create mode 100644 resources/icons/models/minimax.svg create mode 100644 resources/icons/models/mistral.svg create mode 100644 resources/icons/models/nemotron.svg create mode 100644 resources/icons/models/openai.svg create mode 100644 resources/icons/models/qwen.svg create mode 100644 resources/placeholders.txt create mode 100644 resources/pondering.txt create mode 100644 src/components/BrandIcon.qml create mode 100644 src/components/BubbleTip.qml create mode 100644 src/components/ChatComposer.qml create mode 100644 src/components/ContextMeter.qml create mode 100644 src/components/HexSphereLogo.qml create mode 100644 src/components/MCPSection.qml create mode 100644 src/components/MessageBubble.qml create mode 100644 src/components/MessageList.qml create mode 100644 src/components/ModelSelector.qml create mode 100644 src/components/NativeToolsSection.qml create mode 100644 src/components/NexusChat.qml create mode 100644 src/components/NexusPanel.qml create mode 100644 src/components/NexusSettings.qml create mode 100644 src/components/ProvidersSection.qml create mode 100644 src/lib/ContextWindows.js create mode 100644 src/lib/ErrorHints.js create mode 100644 src/lib/FuzzyMatch.js create mode 100644 src/lib/Markdown.js create mode 100644 src/lib/McpTools.js create mode 100644 src/lib/ModelIcons.js create mode 100644 src/lib/PromptPresets.js create mode 100644 src/lib/Providers.js create mode 100644 src/lib/StreamParser.js create mode 100644 src/lib/SyntaxHighlight.js create mode 100644 src/lib/WebTools.js create mode 100644 src/services/KeyringService.qml create mode 100644 src/services/MCPService.qml create mode 100644 src/services/NativeToolsService.qml create mode 100644 src/services/NexusService.qml create mode 100644 src/services/StreamingService.qml diff --git a/NexusDaemon.qml b/NexusDaemon.qml new file mode 100644 index 0000000..8a36520 --- /dev/null +++ b/NexusDaemon.qml @@ -0,0 +1,48 @@ +import QtQuick +import Quickshell +import Quickshell.Io +import qs.Common +import qs.Widgets +import "./src/services" +import "./src/components" + +Item { + id: root + + property var pluginService: null + property string pluginId: "nexusAI" + + function toggle() { + if (variants.instances.length > 0) + variants.instances[0].toggle(); + } + + IpcHandler { + target: "nexus" + + function toggle(): string { + root.toggle(); + return "NEXUS_TOGGLE_SUCCESS"; + } + } + + NexusService { + id: nexusService + pluginId: root.pluginId + } + + Variants { + id: variants + model: Quickshell.screens + + delegate: NexusPanel { + id: nexusPanel + panelOnLeft: nexusService.panelEdge === "left" + service: nexusService + content: NexusChat { + service: nexusService + panel: nexusPanel + } + } + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..bc366dc --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# Nexus AI DMS + +AI assistant plugin for [DankMaterialShell](https://github.com/AvengeMedia/DankMaterialShell), made with love and care. + + +![alt text](resources/attachments/preview.png) + +| Chat | Rich live markdown | Settings | +|-|-|-| +|![alt text](resources/attachments/chat.png) | ![alt text](resources/attachments/coding.png) | ![alt text](resources/attachments/settings.png) + + +## Features +- **Multi-Provider Ready:** Connect to standard cloud APIs or local providers. +- **Vision Support:** Models with vision can be used with image attachments, even from clipboard +- **Native Web Search:** Built-in zero-config web search with DuckDuckGo, as well as webpage fetch +- **MCP Support:** Full Model Context Protocol (MCP) tool integration with per-tool toggling. +- **Bells and whistles:** All the pretty things that our eyes like, or that we enjoy when bored + +## Requirements +- `curl` +- `wl-copy` +- That's it, you probably already have them + +## Roadmap + +- Multiple formats attachment (txt, pdf etc..) +- erm... I'll think about it along the way +- Ok fine, agentic capabilities with bash support + +## ❤️ Gratitude +Thanks to the following tools developing this project is possible: +- models.dev +- lobehub.com \ No newline at end of file diff --git a/plugin.json b/plugin.json new file mode 100644 index 0000000..d323368 --- /dev/null +++ b/plugin.json @@ -0,0 +1,12 @@ +{ + "id": "nexusAI", + "name": "Nexus AI", + "description": "AI assistant, made to be useful", + "version": "1.0.0", + "author": "myNicole98", + "type": "daemon", + "capabilities": ["slideout"], + "component": "./NexusDaemon.qml", + "icon": "smart_toy", + "permissions": ["settings_read", "settings_write"] +} diff --git a/resources/attachments/chat.png b/resources/attachments/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..ead66ed4ac3b274f66ce773cdacf5526fc6ff8f0 GIT binary patch literal 215070 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�!MrM0rL2w{7lZuVnC7;k$vQzAUMwl*cI`S0Q(9hg)9(?WTJ?J9U_ z(ol0y?`i4*;{Jc&dUtmZpyhC#pWqGi@$w+gfv#;D6Hh|27Jb9(mgOP@XqXGn`TADE zqQmbXF6_BCJ=H^YQu2Z-9Fl5X&elijrl&912Nln0 z$7?;c z6K!RI37`*_s;GJV^Y|>a1GaFMGd1O)^{uqtentwu(IjLfnss*n^;_^rPVi0uq*0hT zhz^|YnDBTMnBVG83y#^0doVf-xKT~fe$uGqQ92)+}0d>My}>Klh+SVEXJf;ca%DP2(7 z^rTMD1Ay`XfHQn)NSj?*S_!hYzv<=ejcS1Rx@k2-y~luEMkWyD3WM=&*?;b&Sy@l4 zK&nt;{y8ttB$k;5VRbISh!)3=BRbvFH?_3v>wf*c#(wKK(eQHY!0NZDjGRw|i zVzQ6t_;C7Q?`y9P>u+zM&buUrd8Lr+StRc=7aNCuU1LFitK|Wv6fnbR*LHd^H0v(; zSV>MUM9&Bs^7F&>V08)sk7Lol-!3mNL3*(kCrWk1!6|6Foj>uML%y1^ai74si3Yl zEI9t>9>~}p067!5v`(GN46(_{Nqml*QM=50U}_${98E#+ z)N-8oCIU%nJzc%dv4@2d0>Bw+^N)^BoGDjK9LbTNTUxsFCA(#BZ%;0yx7O_a=g<_P zh2tU^%%X}E#KaIH@6ABV@t0h{=6%>i>>CgrMx3Qu9c1}ot4k_-u661HtyKkUq-%nX zhQ??*4!V3bH4-AC9H-YH4l0?d_Pn-CZ4^dQHBg!$=T1XBw1Tw~5()p4FE6gL2ThS& zov&vNHe6&+?JjD!N-z*R?P6nNsJ}z+OExn%_@(1PA_1!OJIGd0@Ic@$v{)RgeQC-h z@g(o#{u_K_0Xtud!w3bjOfa{wh#p`1s8>~(`56ILBdOV626t&tD?#Ur{ApuptdsYc z1NJW1yuk}9m)Eavdcl^xy-512Rv7dkf7k!<{E@i(IrDu*vD1W7rh{NgEH={BMF+lR zn^u#6ZNc=9zFcH1H!BaSG%c2MJ)Gb%3jdbB!^H#$H#Q2mymzG6>UP@GPz!(^M*#lY)9x%ZuOP;FGhNa_Zs`3lJ);-9Y z8y*~*!=m8!f%4UH9Y1j~fVBe!(Zi7HQKr;P1>mr7pNZ zMaQewrKhDXV+N=Y0RaIG=%awp0`Uw?_eb5roM9rJZs5GU{@Rwq76SW{rXSqfU)#%w zVU}={mTytDfhq<0V=~QgY3|?9-)kuoFuDMm1SaP z)|#I*KM>Kr3^O$`4Ys!5GS&NOzzXz2!g8xI3Q)ro-P(Lgx1g_fh^- zdwN>y8wBc-QED$V|GbGt2a0&4%gV z@?yuZh>;IuBKCB5@1EXyD4eh+G_T%s%Ca~|X&NZD0CiL^cAUTN+lAUzsNXKPGff+2 z@hD@v!j2xrwxD~_MG8hQsJ`KvyG8{aMfk!T&@kCQ2L&o{a%x+6E!tGcqI1~&Wp9&# z8ze5sD7y||QLtuxrcIY5m&0v9wv>`sSD%ITDg{c2|J797E-zLLQdS6)&sG=**z6uH z4|7-#WJxf^+(Qi5*qi45}1PLQ&O?VFdA@UreOq8&gwunS&EgYhHGN1nhs|mkb zNL$;JFUAMhSm(!o(GU%0BBWbdW=|O`wR71r$V*( zIZ+~S()QK#ey0G*$KMJp;$l)YX|@;J88na1Y#}24#qHE12k#6}OO)M0d8Jb&Kml5z zlDP2$ibxuZ*&4q#z4$xqb7h9MGGdX^SziW2RjAs8+p@oX1DI!BRqZwHJ2J&dvd58} z=6Ulr&IoI-t@Os8x<7P#h1s}3eXXm?yn#TfKxAa1h52ybkp6x!8TZA>#vKH7ac@f2 zdi$-M9F9)2X=QQYWbm&1ss?!?;sq2ltc~5t)S*O2vK-%tqn?E@JcDY0t?vbjXACO* z8_;%Z6UWy`+}K$yvcpOtruDveiKG^0i>E0(iD0p)1>c#q=TZVpjOT+KkV6NdQ)oz) zc}R`8&%AFBEzv0{X)s(KYm=9ZF$RW43&!Arq2I6lTm}n_H6PzqroH`BklB{oZ{)qF zlG6F|axY7#1V%!F_Wk4DDQ>2$1AaWr#=*AE%o3yICLxzgr@#A#osS`rF*7?~t(N8q z=W9CBl0_C~x;HpWM1;g7#O`MoLq9{ zLLc(RBu5@CO_YL$;oK$sV;V~Nax@=Bth(A!G_N7dT#*kvw~tt&r9EvOBU4voP8cF3 zQBtLKm6KJx(b;(sP|&m`2`OtR{kI&HlnmC?xL~|~O}`~`ykt|oAjBIk8l+1+$R8IM zmn3kkEN8h5CIda)JphC9)zrNA`|^SY7}4qd+ONf|rEW2s9t;mVnVL$Yy_b{YitIwX zoDY1weY~I6$j2=%GT>qA^>vufG!$(0PAmu4JX`QM3*m{Wc82CQXdWMm9@ zj|*7;;$ZnHsiZ%1SUOrCAW&VP#Z7pR`DR*)5nqO_Nug(KWZ*NeYePxNB`}78+G}rr z#KraUH`xp$Y~nb4?h^}HUp}6lIWrQHK@(V!zK?0R=@_-A-QFlNjPBJU5!$L1WLP}m zIrviS}Vo)fE?6{nKyLJlflL`UlbUc=bBYwmqaIE}@{ z;d-etpU~-16DZ!lH~rJXEAu*9+`??kVPz96y5QF z%7Vv~l}z90*WSK;8U>)QKFfovzi(w6P4xNcn3y(3N{MEJQN6OW(UCvh6{T#(^~TN< zlj9W}rcWb#K0Gv@6LnUL|M)RYFQ8a4uqN0ltEL7Efe04cgX4m^6E-x!|MVtoo(Z@~ zN;UU*oURRwFuZ{U+@lkZ!GQ7}fvwixcWV0eU5$jzy}iBRN$!uhxTx5nJpa%2qiz4b zMgQyMpDp0By1h7!q-K^G)YZDGImdshY4@qs=8}(%=ECeC=X;j%nUR_9Us}r@gw?hp zHuac$G#p8VO)N9>t+H~UbjHNg?T(WaMOqaMS692s-MyD>GKY4DyZW%j*(oT#{=B0b zQ2l{oF3~SzP4_u{bSgO|X62scdzF6=U5&{J+m5++Ii|2{?fktkiHQSHXui1IBzU4S z_*^O)4_{qGQ6)3Hq_%#r-Zy#ti%V9muIsEYdW@l3OxvmE979S+hjBcw?aHrsf;rw* zG8iA#+g}jkfGqdHvv@12s-=S7URE6Hch8f2zR@R>S7)zcXi0Q5F1Av#@zSyJO2LFz z+p}(taPIe?Fz4*L^~r#wZ`tgbh}}-Qq>L1IxgB;!_ZR8u*xYZqWtEOU-sZ2w7$Hpq zfBtwd`S9jDY5+r_c)B}+1DA)N7h6($ZajCuwpU$Fju81>#Gk#RU!E+OET?U0(zj=> zZ)Tya_#~>f>&R>jMnKG!Wq-^Ecz7*O&yTPXuRb04{M_7Q;)JN^8ng1e;^KmWUXNh3 zxumJd$zzPoxraZr)zl34(#7O9xQDs9lKAXRn?lD3LR3C*(-qIPDk&)i5;9IU*mlgc z%Hh)le)s-=E`VNN5^qu|9*z!DbvwN?Q|O5%f<#Lj0ubm^nv~DT{s?ysLNd9yD)6uv zOIcS>jf%_4%r`F3@*4`jisvwCHU#bbdoCk`9a@w3?TgKhfhXzpO-&2m_Uvr!lRXt> zb>%m2jC6IIZ8e@FkDrK%Z8OE4d0xRDW3Am+YC~5|aQKvRO6h9<@Qi~n(6AxMu|UP? zE#qipjy&l4PrH*x0M@cE$0oA>UbhiCCUG3?krXQ?hJ!vdm=ub}?v?MXkk{E!%vx4a z5fkO1t~05r!mBnhpx-{-2vW4&?G}EROxH_~#p*^PF!fg+QUc+8Iv5X4%?}9A{WGz$ z(k^+=wi+;iLmfh4;OctuUl>YE!j%(0U7ac=Jw2a@C+cda^!I2xzAFe~=}duL^`_s= z;|d4p>n0{9=7>z5P%|hy4%3D>6a@ryZcdb*OM{2ZTSgjV-8^mj@87@zoC#y_Gv24$ zL+^A=mY3(_?YK=s_8vgeSBt+luJzsNSF)l)a>v_~7>Lu!wxF?Xopz^Y&-W3|5r8DU zo*r5zF=>8xaalZs{R&>^-M1li?#El?xvQ(IzA`n^H0{Rg=p7MZ6&($^;kpSeqlH?* z9R$E{3JD2m+lLr6xh0yR#+63b>uuPjz#TlVs3=iiptjoYxrC?FpdO3gY5# z)YYE~JiCXl+vs)`(Q!W%4N1+&;4nTm$3fSBrcYCnsi~^1s;Ky1^U+$I`qwRTbd+mp z6bu!j!lSjSZT!5>$kY;UBE!Qf&8+#Ena^x#icYNQgV6z%kb=|!5Hf^CMq5~#obB$R zfh<|eqbt1)(y3)+dWKtXAWa5r@KKXvTL>abr6~92jjXKf^Mr@~LyT~b(?-=*DepnY z*Q(W`qv;Oz-A4;;Gt^$+*6}Quwp=yNWuORr;uvf~jAQg=e%P4hD=H!_BLfL&1^G_G ze{LRP-eUWFevaO^LCo*)pmM|n1f;On+cMb@5fXOxbU{9kZAku)GH7p^nJ%8#X8HO$ zDccfA^ih0EOG{6uI=zd#u&{7+`zT3*tbjj3AAAO@uK&!|@gDFb0DtKl-{g$LI&ai8 zn|?bb%}-Pa_YVFN0<13LE_v6uF5sSnF9X`7S0*aHq9XF#S?q+6;G|X5m=*ZJ_|fz? zs52Dc)5ZvDwmA`He)qG%`%Yn0YY&l+*($1Ya+Q6wdDFyCXo<}S8Do#tMdyD?2I5V}b{R+WpY3@~f=!j^C=-Aj;ilB4% z`%mE!CHo4ugO`nZ?&_V@#z2^Bz?aWj7CV2o<~ddLbK!3@KSw&8Zn3VHu;71cYWcXJ zw{Xk)RwRv_l8VCb(NTvVrNZ|;zbI3*bbTV5;r{kL?-g5;4ddFH{6NGF1iUeP#Xc2i z6c0KE_Orfv_2fy`=W~K9x60m>F}fR#?$?&HN!2p3jLG@}5^+!YDDJYWyj)DZZl34k zBRG26D%vraTQ=@{V@V4t#|o|L?(UyTVq%7U=K8BgeRlJ8@t+>vDJ?B0%g&=?dCG0r z9R+lxBCY!MEyJK@og@MG!QocB@~ibn-(JGZx7zAN%hE8;3k}8e<*=Nn_(m{UPHrlz z-f6(m#)HtC_Et2Q6LJws5%7SxY<3ny(g6(htNChwCGxY(4@=RSTt^TEHOp9z zh(TkLkZVoJxAlbyY%|rOVl5N*`OWH6Unc~aK6nT=EB{o$ie(_8Es(I6jfZ^n%orJ)!B;{M$O5yTSvtNvvz0?d zPxd$%y^SEa{xGzzvnejhf8MV^!;18$2uo;vKS0l^t-S7&m0z7G!9bQA)r5R+Jd~G_ z=CxV-pdDXXS=s1*f{U<<+DjU}a}hVKiS~O^nS_Pr)ZZXz9(NlVUuyX4;nD1K>8i@2 z)vjZWc$tk^3Ai8QAUX}x0^AI%$H9pcB=II)c^jjLCcG|3ljR%Sg=ol!x8_YA*ZF0K zkmo~<;`r_RcTMg+Q&U0Lf0yrn4_uu2rFFavqt>0DXT{+l#%WzmhFRv!RHgC`P1f|Q zx>#*u4}l=B7VKPkX`!2E`1qvOs~~h7vszi+BmE-abci5c;u$Po`BP$|^zLv9J#Xr+Hc;xe|8!@X86d-$<;_EV3;>G z#dpt>d1d2_{~4nJq+hu@Y{Q`ctAMqVtbvNH?ZIDLW1d?!bi4!M;TiT4P_p@=KO`cc zmJk&~17HZ3$EoQV~U`OCAh{(itW?AR0YnSe%IRP0|>i)e#@ z^SO%VtC_xbaVfP(-R#`8?T5|`3B7Nxq7t@pS8vka*$DbMR{9%b|*E!mi(^j1;SW#Da`@`~z4`|b; zaZZR17umndWsZf1UM#Zci-*-i&HkZZ!bJHe`Hs(bdV9Ajgyu(+(7|E1BB6+NZhec) z=?^8ApSNyRS{g+$;fp`TNdcdO^9l+yH-5Aa{=AFCH5)XzTqO_)Wt1d2wuDG$>@&)^ zU#)&`!wM`=ulVHW`vTD`oq(X8r1}B|)uIR~z5f=D(h4(E%R^z}KRU+!o9dFwYSbnc zX8K2m2ior@3pQ*(Kk%u>MWVyL=T}S%V#KBf;vK0CQf|kcnfkV&slN6%Dx&xBNlb7^ z`_td)D-%qY+ebs}cjZujZyS01JIH^rs-0}8*tkNc5V|4qn~-IP3Hg?re>k~bZ{|-~ zD%nSN{pOvXq2=GDDwJUHQe6jK-T6Yn+A}R1DlYWU4t|UAKkJ)H>go_U(Pq17M%O{Rb5W>D}wx(*aS3`jJuY5?ZWJ7@-i4@ADeBSY)!a6Tf_YIiJy-Ttfla@ zNghxLxV+U;Y}RAvwQR$G_s;dk==}RuhqB2$-_TvoGXle(PY&v9@CabbltGu(4Xw=~p{)|z$6Iig4uT+m-cye7;Y z_E!62nY9+smZ>BYK7N4N+D}SYF7AI()jDd$`lS0qJ zfJS>SQbwY&uI|Beyt^;b>(YNtbxid;CYF^2B_(Mn*(}s!+yQLNdi4X)H%Un1o!f0Y z4cMTb7JvE8OTWK~iO6!Yj&AMuJX8si0Wx*hyB?m;pDXB4lKL#)_(WUh>FIa$t=Eza zG@Rgzi_-$$8aU{%thelvc9fGn7)xa0jEoM)r;a4SIbUVbhVr?{JD^7@^f)FwdY6q+6V)~Mzj{i*Ttj5T_=IauFKV_N`hjxJQF(2`&iK@`0FJ~ zm@*}}^yPkYZ;((m%xJl-L2%0P`cla0H#o?y9C;JCLGSO8ewv3s)FV#R%jCF#wuK~a z9wt^zMCA9zf8i>c)h~U^9PRGiBNUeq#ow)hY`5O86b}Le0J1iAB)a1ms=Rj#X=3EM zP`2LlD~u~odX)T9R3)=4Dk`+{PGYaAxjB}=y{h)+kG98)9gu#xRrcdY9H%W|uv~w4 zU$#;n*Kx(g@#bwoitbMn1x!pI{qJbjxP2bd>*ONztIb;aK@oJw1a=L%3%Jxt+PVIB$~k znwwelkW_VdORK&unp|q=GK#hrd!03h+X%G&N_#QvbR~X9)pwSA#}kc?!eIOa3rR5> zH82(sw5s|H{juYjw-3;7rcF*xh4}kT*R%<5m&_e+QBY8P-%<_4`>Y$Tn<|_K-8Wu1 z78GGOWNzZnv`iWIY-`raJx$UpehVIWL4l!*?`2UCRNNcT#GdU;^&7B4sNcr&7758L zxjP*fGhygcMzylH8XA{|13kZf{Q@nWi<2|_N#=9Di~2j3MSGO5km>LF_WIh|pU-ly zCuL@$hCW+PSLLPW*UVa9p?BN{m98%Sd}**zF{W(afs3;%|M-NJ!<_GnGzuXn$t=Yg zt{QMF1EW;S*)o!9O%dHk?CB7mUSzLP={fh$cif3EGCC1HVI;njTcTO2|L**2_Oq``gC{ZV0IlG1XM6*KbByBoepKfVjn z*09-I=Odip3}H^Z%`#1c723j~hSQL?^MU69X)s}fBx2(G_Ca9pX1zT%HFaWi3@*~y z*E_LPOfrEFH?7+g8EJ6);;t;A@`p3$uYQt`D?DSr(GK>+frp6p1EJlbb}5Mrd@@7Q zevHT3aHNU73wf7iOT*xHwmn`>z~;C@mUJKSYSS%#&lpXk5(=k|hf(g7#|;m8%ZTpN z4vrh$z5U;eq2F-w{^NRd6U*;KyHs-*M39>**#ME@tGi%&#I3mJu=HTPxJv)y_fzsF z{GN|p2K%>p;enk0fFSc1a0iEWv>@3-=pSxrhp~w?-D@X8{feN)6&dCKd3tq?N_w}O zheAZvfiAIo&UNu&&9^J+-y}GX>fb`B1M#+*`7(CsPRKuOjxeDvB9!Ehy++r3ykwU_ zKW(XX?EY=z_Uj#y95y&gH?xGmb-wK#OzFlyf58Z8%|6ZMcD5jXX|##HrYa6QJvXnn zJ5w@z9Zej+sj~_&TvdTbgK)$nZS>*KH!>i{ujl<}E$1u4acq(`3dP^IfuLD#3 zgQV>Zu0*Ei56(hnoArwM-o6mLiPM7mHMULfXk$7O1LAxaX(XM(w9ru=HR$|X{qdG@ zK1Jq-SEpX-jYDhneFdTw||p+;TM3w;H=VUaD&Ti8-7HnRW7yj%3PETF|U z=eii*)0fm}5kV(e5^hH&Q10N|z+3f#NnnG=6kctB2>RI-i3;V}6H1{6-Q7;ndKe_W zi76v;P?J$&ek&@vrjscJIrC#_Zxjt}?S3o%i>I_^2pT4E?s4p)Ehg(E>bCt{gEW>#Y}`4L`$^cX!=;m47%xMy9%Io^@>J=1xj zw6sE@7sjG5_0hDkC848*5l<&UFo~d1Zu@UACky$6j_XgxWgd6TYC&RR5`vb0eH+?u z@^3{NXwob9&Tkj$2a2b)+zZYt!n=lauw}zjb6P9-reRw z*Z8d+*7E1u6y-IaaB;O<0;_evIv$FC$-DuY8t+7d1{Zp77C4vXH zQXMWe0@p=67!<;O%!5?hCcQHFO|?wtohPVdJ;l8JFvP6rmDZMs&KE`jLBuR47oITD<9%nzF*xar(R zpg3>?^_nSXrq+RlRnzP8jjD3smw=_#XmHAvl93a1-T&2$hH>Z{aPz=+U|=8w6I&v~ z^Zhd~mn&%1CML5V)A;%MlJDMul&PKkBfoyahcZ2VO~D{(d77SXE$Ab3*_w{KHg{)s zL-ohZ7|UKC`O;jujB5H%DlQ(reP4-x_KX@jd{*1j*S+=sWG<(VvvYDPKYYx~4e0E* zD4gbvOZYWc>w0HjUG9y;JgRbmZc7!*9U%wvZzw60-jYI=g@xbAA9(yYxf=9%M%mih zCNC-$DSA^(VTVXiu>K~tteB{W9P5gRhdR30mgh&98GsDtyix`Q_+G)ry$;s4@w(;) zC7n^?8JZ0a)is~ERc5b0-3}o$I>8ZBS5)-)Tax<2^Sa2y%q%cCbUB}jzfesgYcQMi z6$krQ`~AZ%&q{OQaG3R`2zpvh{`yfZseeZshfHX#V%j~ES z6E74PXR32V-ldVE5%Ro;xIUuq{z8mTfB=I95NlLt1H#BT*Wwbw1 zz?1$6)6`;F`;I$`2wwQ}Rvk9*x^$;g3V}aH$D9^d;Hj~=C`(g3ks7T1@FOMUlI+=M zz&0XjU?bt`YIR-C^FS`@@#Mg4vob{EeUYVNQ!_V}z>t^3en7}TMNgmlhK(5Kv#6x}G}dVGu_ZDTQ|fd^~om43?)p!#)SczRJB%8Gt9oN^GaC zX%aT~McC}MYv5Q+CjVz~jv#g=j*_8LD1uRu_8c$zZz9Gf(>z0&q{874^3BiNa0OJ^up&@;blPCnG9mjv@#+$&* ziNu<%_~*2Yl+<5Q6}v}SluW$ktUI&SL&nxT0yd@t-hS{FUXtpl&FR|89b#GbKN`_^ zWDm(nEKGF66O$9e6SO4hG%DNidGF(sdeE}sAs?0(mXm&&FKKIW8Ae{vY-2EX_V&nj z{mNM?P%q`;qdK>{q+5#WrQbM=vJ3eKGoYzAb1+;J_b|g9$uv-=kx#OtnYZ(h`&Y10 zi6DeMy;fSa;VH?nUnAZ~c7@`GM&J=i49+!JtHU(s_XjK`P}pywAm(;caS3rhyR=2L zgdTCtYiWsyON)zG{uAeR?91aV4KC#<5f2@#_c$}PG?Ejs^w5xH{79K!^K;(Ef4}6Q zgrfw`E}dHSu?CA}+4g&BE-`ueonLtzQTfxCNtc1EEYeca)^~Gnlh|B!A5H&C%0K+2 zZ2h#@N%yFRkVPXZ`s?S8#V3zjIfmFj-5DDo=VX7%!T*$6CP-F%eRuP3sb7?LP*j=s zv>Q71|pZC!K#trwfn`flc3;sX`ftQwOTdY7u9OKu!8o) z#6Rk==9zAAzrZ@c8jMha|AtWTcAKb(Qn4{UE(=o%ONf*0>gxsn77k-v8`Js>>L*XR zshI@%sWT{rg`0#C-Ubj7ZKxJ1+0eoe)Gw+oZteZ{C%fgJ%c)H-47Nz+(WH-Y*+lfp)k!mHK8>-R5D?W>7vnhS;{Y+dpA- zZ52u z&L&dY5B)%wcIIS7m$_v4IA^+tB>*chEG+7Ih`x1I{$UV62i~Z6mRFVFt|-!~VPtwz zz-c}n{C&)podcWh?BZm5aY?__^tFrhKW=s7&U-R-S#q3 z_LH0yBg0jrPlOC>n?d28?o%*+~Mu7NRVbk&$s>V_W^3Gk zd*t`?5XgHv9DcU(dd9UAuqobnAR6?E{u8+G$xg*M4bU9G9UM$8xyBeGursocM8Fp`3xac~VS7O!U|2uMr+Bu$Y#v zB8bdcJtu-tgr1z7u%s^K&}7|Px&MIof$vVjc1JK-Y-BWt?oVGCB4&65i2AkHH2;Wr zy!==7+5#9uxQ*l(Xm{$acD1ZF!7X+xKCnYX`*;p z4TX+FJL9__og*{lX=&ColbmET(^yysvkk695AFh&{jP(+utf%cxtYn5LG0t(VBv4I zP;7kwZrFXAJo1FpTeHQG)3*JD5Jt>jZEVa6qyhr1CaXS2NKAO@H2PLOM!-jX9i&qL z=A{p<0fiebz%4-v)5=MRm;bxveED`4RE6oT%&uXQ$#*GmL;2nJVf>&~tE&l|W$&}> z07)WJicgQjVj_e{?VdfOI{aI@nqhB`hK6f-us2h070No&qr=YaVtIMIMHVipQS$!t zm{I>=#NED#Qs1gmT>eADElRYP{T?D6kioXAN9kEzBZgBWph#yA6C#f9)^|e4NtY zAUAh6Fm$-=0`S)N7C}0721jYBn_K1R$k_MWikc?ncaaZ&yPv3=C8~*+4sr~Js}sv{ zg~7+z{k@BL$x><8e8{V>?``Wn1DWX{J39oYd!O=bqop;c!I453*xo`LHk=K#e<*AN zYzzge$8w+B^k9%hg@?J3G^!dEeRVXZO_3-7>)Bq|B6$CL9xp7H%f!C?`2uWPPshBX zhX0ltgJHRB&H(5Gk2fa?Yy?_8%6)e21D;bw8fF^)-X~Va;HUBV3!=qFM^9Z5l#qadHs>6#+fxT%NXj-)EEB^dGA*++-C%oGVkqGgnw^!U`+=vvSih~d^=f>L zSWHZe<>3x@(Hss5`_k{`rXRmqJB~sSFN=mL@r{t#KkF)&XQj}cz$TPQ^HeqtM&>T8 zyE>5T#;oU(oQ?p=_vIqk0Dm;3O^D%+m)X@<|wGvxF8A^3_^q(1R{hTj5f z)!jAg%gTnYE>2)%yGU@CC)C7P|N5whXue*r^lkq1v_@%`ky3MUkC)U$C(7Zm3O7mAu_7n4QHq#<+KH79L0xq?3X6hQD8(+u7Yu zx}Z7}6l~f!^kc>2U}?ChDSEWl!gZ3o%A$>KKS_fY9{4+fuW9S&dcL$HF!5* zHeXv+6B85tIUwL&9LwC_%0(F8hEfQlBa%|mntYDMHQ6r7L!XMY8@ju@;+V9&8T~^B z$jJ%ZsW_QNri^7=B|1v7jA|=(%+1Yzb^hAC>J;ZNrVw_xwA5Q@_kGpN#00`WhMINH zj*2b9l@*LTZ)z)1?sd2?}JVNAEBhC zcKtVfR%tc+Zfat9WVAPqcgE`b!(=(=qFxr>C!hv!#!19HTb9V>!l{vw{^#P47XQ#cgaN#urBZmI;r45d?d0J! z1|plxo>lYB=9qEu@)9*ungqw?b!-|JRk&(YtgDmDS3!59lLo>2%h3oDvXT~4@kYYc z|7vo?oU6|L`%apVztJ!D7um!D6dg;GL_OQAQVG{%l4AdLNZ3kP4j->0R z{aSap_6=x2gwi=r0LGuW#?fSesngqDS2s@nZ2 zj!wtzjWEkHZBDc~PvD4@>BxIvU! zC8L`WCu94PHN=d(%V5x^XPL7c(4zBC=PeR^v8K~Wn!@*qF3hLCT>f2JdC}Ev{jO0r zu;`8rpv?HT{}OyUAN<2Wm0d~v#h!3Ejn=<9FO(4ZoapK0_fj?KO12k817EmtpbLvd1ag`0m) zd#l${Gf^)NM)x3IgAoydvCNZir&1N)6DAt!>Cv;W^wYh5@8tBtye^D;xk;~B=)R*6 z=c<2Vpt`F>ZD1`!$(G02`h7sHT-E)3m7nSoAMZ`?FK-aZTgi*&1MA53_>vchgqce~ z^LOB?c%V4dH@dwcd=26vQsl>Evxu~kX>i&7a%`#f2S_f0jP?sxvYr^T{tZ& zqQknDwEE(Y1)P^)6R$5G{jjiRQ^Io$Qi{!urpk9D^J=v(m z9|qG4CznRI*Gpp~88Cte1pp2LZNW1*nezrevlvtn1c+`P{1txwzWrZ0vAZx(@lfP> z+zv63KO4e-7M5lD$dW3c3rrGpUXN;HKd81{u@SYvK__@Xnk3VOhQKPE%PHH_H_H5& zu`DmItGSuN`}aoDgK)#x`hOSgAtYPt3+?#jVxpqSGc#X>UC|L9+vEH$w@7E(6{_@# zz(@`saYt)MG10<}F)La+x`~NNK$fX@{6wkvYpd&>&QR&1|7vH0KV-ezk*S*6L?=Eq zf@B#!c@P~9zSC~>|KcJOeJ<4$)#8&QXKDw53I;c6kP*p@=Lc;Nr-+NMz(FKMpXMoN z3%Rs@*O{3deK)261(k`(qVo>DG<{D2W7r(ZM~p)4YA%OgaiHxzY+yks`M7A<*lrzi zzt?WCnP{GE9v|o7S)i%^0WhEN; zL=QW-xhW3YLlQ5>1Pp%tB{y@32_G0QUQE(RhN!|jphfG9Xr4T+t*(lYGO)B4q`0@V49H4^ za_tD&zq4a`2sCOo@bM7a+R-^5Hem_;g2$Uk#)u0ZsLuN;mG?DWU8jat`wu%DYk!=c z_p63{eU>a|WojM~8NGE9;`G2H;G3zrTjgUgd%7rCn)3RR91+uQYp~ziRchS-MoFbL z72tPFZ)j5e!oOz|%fTY_^6@)gbw|r9&K;Il!D+yh5DB?=Z^ah8^7jq5H+gCAePekg zVY%y6HxZGwc+?J-{g5adyfBfGv!uw=DC~LW-7>#>!_C#TcHY3Jy`5%TDJwHe_IJwf z9r6ocm(hVxm$ZnR!VW9@KcKX&we#-6!WOxTg~e7b!GPNcGbo-3?z(9Ja+selD=lsM zWj?Cu<;TuE@Sgx4R)w~F2uDsoMETG@155w~_&IpK-f^<+o%k6pfs@L&ZIV|58`zql4ZmP6j?stlgxd6a|oZ7R)v&e#SPAb!>w^Pr!E0>m5aC6^**k$btZ`9ZL;u)*jtZFeyCt{?jxi9V1 zcF+ILOu@-n;A#?Ie*QP0F-`0H4FrKdM_*WUxLC$-1QEcMr-~#aBR#LNhkDz&znz9& z`dx)x*EpNLn3yOE!kSpXCwiNg)4jV4D4=5}SjV5+bnPYnig$>T{SQrN9hX%WZsCs* zL6KCtQyS?;8bLq-MOu{Z?odKNq`Of{x}>`Vq$H$6kd*F*`#SgD(Vzd!$b1~m*=O(d zuJtV2#wO@!g{<%4_ADOWB6EJe$w2y+ZUU~55X8QMEjrj6T+#<#KTYFFq%Ehls6!9x zKKi{NH2??;b4@d|Z4vH@y5{frYEk5ySRn*T)SDJJp9 zbw{)lF%?bCL`c`|d;A^EgTx&%zcty~-&6hOYbl0EI(quZ(;#pZ|Ju-)9e){f?>YJK zg&Qt~i0AHjLo+fq*`@H_PCUm))IL*e3b7P(Q*=ZEr-7ulhqi>o`}n}zm>8bqe%0qM zF~UEsZM4maxE=c+)Hi(b?Kf8Jl|PEDDJ^|>pxu(8tM`2G_X3Kx1*!BXpT6~gVfpr4 zBMNM2)$iluD=KVnx1~3G0#b>KhZ9G2^!j{@5(#DCo7u?p^fZNt>x2ff0k~K#%&daZ z?+W|uwKcX~&}aJ^4?}vDpO5EbaIk|c1ttLs;^*+#V$c*s2*p*?B(6^`?Y=mBXp@@Y z-$6X4i4^lZZAnGoJ`ARjMnb_4eu{?J6__Z_&tJ48y3*->vlLEwHW7!rhl+`&raRqk zB5!84zV;jr5!4mN7Ao9ge3(+m{Rudw0<0vV#rfNj4!Tz4!>a*VRmE`^DwHK`P!HsG z<_13kGgDKTTdUa|c78wvdWzhc>G#B(S%38M`2?e6< zXWLg7;E#TuDckeo@RVeMk1v~hEyLnRd_;t)=_a*#Ozb_XK6CxYIMNJ}U17u_tZH@- z+1OfPmJLauuTU0>=U}a8EhXi5^zlVtI9eiyHeBCp<%W%`cE0AE z_N=m}1Vw=^`mBZ|A|__(k+G!C-;YO|=w6M%Y{&AW)e z&IN&3=rib7d%nt^GGAs@593e|kFK^`cVRN#N?h;n=$s>{j*oa3DtO=nXe(GQ(u<5LrI#oI$ z5Ox?C=!i#L>*+Q(w#^wnO)^kdkV_7 zLecMOydZ`US^sbwmoVd9O)9BA`M-bNd8+>YWwv`{u)0_`rG;c-lx+l3On_!NF4+C+ z8~yyca{9q$g{m*9q~v7kdYan2v#SJ70a_Y`nWmzyZZ*~YP!H5%($hB`R5$ECDPQ}g z6cr1=zkY%%bL$q-2jQt(g4uFtnm`urQlW6bQc!rpJL=+uAbMR(hlcwcmzrL@iHDcB zr{};fQZZWB}of8R}TLDSz>xuVJ&=L3j-@I2w zxtU|On}NApEXzv@3^Df=%hhe@oj}>8(4Bu)lF6NN5%lR3D zZsi*zQ`dy-fEUIu(N={&!@@SAToRygR^zcy}De*Xq{BIWs(UzOqHC!ZEnR^1_B4HlAnu4<0>wgo5G+W9M*k zu{V|GGCPJ)mm=|Pmr*In@l+lMvmFFZuB1l*dydmk_v~UHQOV87$jGTOUREe5+_ZEP z1j%%ewky)c_=Qm{JU$M1iVE^CUplz+d}?3}$!JP*|A3xe}^c9wBN#u@*?@s$Ke0GU`Rc9E?$xn`x{!tv}`dXS= zdt`ETeW1l6FymPDW-i(`Q^-Ip>4|2<7-%jo-Ueeod^qsVD_0>9%(3SHizp4^#0#dQ zX9{Rvc=YP2jN6G`2Oc#=oNVTm7r$NhuRGcn)A2GKiVBM7js7Skp>s|BDq0Fc%vIBR zUm6-N_oBP7oR2}oV=~KY)a~56wVsfzV`GjxPQs1Z4jkOKtuus+cu`=LArsVw)3IE= z#};3Fl(6&Wt6IHBE^ChG8yY2XtU8|vYJ9_fPK?4LJf0nLroK7tVxwtE&{d6zXfgec ziTwVVYf0(6z(D2lai>=7hQ7}b82e^+1OxE#A5!}+_Nk6{QMl+-ZK+rhgFBW4sQk;9vNE&v;cfnc?Chfae645C zz~NT*3Up1W+LWfjH9^7?MQc6wNcj{oFRkWI3v+Xl{2|fx!QU;QO`O7BXZHms zW}vKpI4S?Y;JAuKLL8i6z6O1TQ{UZqA*)a2_T`{QvFg6b`CQxt8u;AzuzM~(p9vb> zvjrW$HWtm2{SkEd1k<1(={E{*KGsjmUI%;%FDNJxCU&u3`9uuIU3Yi)dY5g6-x!E@ zza#$a@9%eo-wG#tq^hFA!5~E7o6(IgE}<{7Hi3(Q(Q{xjpslGTWMg~hE{4bM*XeJ| zLx1ET+2?c8^r$ZLsB1&cUxup6#cOC{LS0L%Zm8c2CSibiRoYI567pL726tT^3H|vW zZBc5BGc!t;7ur455t-D$!qCuAb8&IvhY=e)b(rkxj%`d}!rFvG?%D3Z`sEAB0}4UwzJFsaSi)~n-doYp*4FUYnQLsUclKd9JC3qY zyIxvXi+%9|qYMMwuuM!$p`^mrf%90ZC41yXdv$MXOUA3ZyZV4SCV3M4vK2(yv|4Z>2xA z+GCX+9!`20dMF>{P$`LJ(Lh1~pJY&1WT&BZ(#$V<3Wt}Ct>{7A%OH!=l$n&aixbH( z^6K($>Mw}7q+j&A9&hgcw6(K)gm|p;bQ3^-PP|U^GMxa_SK>|aO*pBot*foC4J8p& zP=0AW+Wq`r)^t=|V|?^mRi*dUDkY&weA(OY`S+f~Mp2EZ+X9vDSUv@;>DgYsm779fqBVa-~YDps0k8Z%kGUCoxS-jHiW_#q8p8Hazy= zs`eS28%txs1tJY^nw4dh<2u>fw|_J*#fQ^GeV9S|t#K}jiW-*ox&lX9z)77^O~OP% zPR@5VI}ErJpaY1cB)8gRoZaxzu=s99gRkUfF#h?UqX!S}gV#Z`+FeQ7lxV&lmEsOr zaVEY!t1En4py9y8flQnLifS#*>umQH?JJhS1W)lrsKa!n59Rtcj0uyah!eJjZv(Wg zVQ#&|?Eq|%tZaQ6#jl+HX?*xh)YP9dGeuWAFhC`yoY z^%~uOjccvLAsfsa>d*DU9=;XvzI-Jq2~-^RkaT)_L`H3GZPVwuxv>H8bWKdWlF3fD zIi+0vdt?EYFMypi*q-67QYH6?1!1LUlr;b9GD%qBgtvTmY0y;Nlwy1d6$T)n2$EP| zHJA=T@b3Z3%ZWlA!3?(f%Z5u3s8Gr8XjSz+g_Ip=+3W)YWQ=|@hQ=oSsoXA;T>oyG zyAB7u1sV?d?!z6yP$7|+AujP;Lc(F~rxGcD`Q#?hIgz|=*q~wpkaPxJQf#b!z@z!~ z;cI^)HzSvb?@ZVD=25|TI4U{rbuikQ#_6B?us8PD4EQxVHX$?t^y&*~X&%gWr=ufp z;j5ZP6_9`Iyft1r-2lQ$h$K|2*}4(b8ywWehwji-mR40Yz}7}9=Lg!8%lX!8E@DbC zFGqWau;5KSZ6S~C!UUq8(GGP+Ilc0RtEwuCUsc+#hLKAI`XVqV zERQQz2XQ8^TH9|^=>7YZtCHr6I0TR`ZeN7iCE9$lnK7psA@uBK&90$TG zl!GW2$ct|mU$Ghw6=>YXzJ-QHwv-}DL4u4hZ0eJI`YA>KS;Rl^l&R?&D-h6^{k?;CG45*C8yA5x6RQv| z{y^Mv?V0tx&5!naM;pWJMsf_%weGV?8B!9@ai6miY+U=@CS=zi-Lx;6OOA`9@D(`m zwZ2{HCp;#r>op5wk0!By4R--l=pQC|D=W!%Zp)N>91|#>T&$#L5JLMf>4?T%o!epi zw=WOwciqLL2pDLXcil;TAbjPFMj?QX=rFF(2hHjXxp2u{Ur%g~l#G93da72i9vMie zQ+|Obd6#Vu!DV*AdkpyuQ4&W~<91l*3~&wX_GWhiN)}niLmQBf&$>E0Xq0Gne^Ogh zwu1|BhPeniWoGZyEd(OJpspVin%riGhc~zXTARPQgXnuxHt%!#ZUU~SZy4&o8>_G! zBCRd(P4M#C=?YO4gGIEs7{)Ln{2s`NDd8zVjRBGqk)CimYcW`kYnU` zgisM*iwd->4A&tl4wVKU767vXd-uSnTXWj*(QbE0r@t;wfcFBhj$qpMK1K5Qf%9tb zcnMr9p3z^mp}VK5YT6bRKhT&=tgQMwdkJl3n`Y}tR|xNqj*ao~RyTN@6q}ImYw2pZ z+;dT9{^hX|r|T^|m@3q6_~_u^fJ3*okhjo7$^GQoOIt+L>g8mFv1p z1Li(?_nzz5yKmK1ZU{|H!w3tLfz)<$C|O&p@MX~q3~68ee9n3MjllnV0Xp*5Ab^L2 ziGrAG_GxbWKGikN!Yo2&R&8XI&A+pY{lj6W)eB-bB}x>Ge-;fAlro38D};+E{K6<8 zRj+MTJp~d5SopG+py(@}*6D@%uCqhh@z~HDR?sX<4JX1nnGftejEpQ$#=)-J=*d}n zUmK5)l!RecTx-3CUce4+j(b_2n7&wqd_gst`9TL2vs=@8o2Un;$+_$n<6zp>?lGy^O)<(o0B61%3J-kj3Eowf?qs zWvdi#v);2?Jq+hKFHEXI`3nMZ-6sHpZkS9Urdar>8Ag3gBQ!GlcZG(BXQs z6WF={KYjYP69<5?z4K5~ zksdUX$ZI(?VX9KJ^EZnf!A$FU$V-3<#%xFN!m;+Aeb&vdE^r&tENhddb^<8?m@KO7 zkKNEXzvI~V=F#+2K)%#Mvq&N^w>*sEDJ}8ZMj+>fi{sN&q6U|0r(wXjVtV>)x@BnH zk=p1Dq_`yCl8qO48rYR#G%%yi@5uzUFOkYj408pXIB;2n2u_1Q$yC@5IiG=360Vsogp zvN-r~Nm>)OSUTH?yZBwwU}D~DlWLW}agJ>hllXtB8e(Z2sJWqIR(Q)v^7qEe zN5$_jq`aIfRd$DbYi;}hWq|dD(_bedEoD-G;Iy%rK@MxoPbIqa|l<>+Ij(TC{!#m3RgXM=0=fqzQu=1OO z_HAa~)BPg|C%FB?J-}3);`)$4x*!4qGfYf*%6fOEDjvhB414yu9Ogv7WL z8N5ItnI3o3X6F&%{a9k+8sCYUQHacVpa0z@zD8v(2}zo$TU~_ev&T#shRf$WvmEsF zM>d3ay5)OQf<6*ZU;F>oet#QlAdOA^TXTB%W%Kn^y+=4FQyGz^p{sw6tO+Vd^ce$4 zK&Jup7yYlQ#~z(o+nd^&ws`v>zrQiY4-~8bSWNgI41YNJlyeRHaxC<=z5^cD^?BIc z8Tf{m}6S>Y<)TMoNwTickZb#^m;D;N?qIRjtw%01Rwh{NS`q zFgA2WWt9AD6BPC3jh5<@^sB z)1$cgR|nGSJyr*H7lgz`SDQFNpX9x|c3Eh)xzYJkD_#Z*qBhK+sz%&%!P3ecTJ>wt zC3WO{!oMbw`x8umI>}X?BJ}TI{;u(_iDTDrtS}}KEOEJZ2{{x;@y&2581JC(P~uJ! z^GLI6AKYc#^FXvC4zEutz82?+d0ey3tEG!QmQ1j= zc@A+uCs!IdDdnJH=_3B(me($E))=M~4V~6N&n|2F~Tu%&-bZ23=jD;FldT z;srlta9|BgMMw3OroqA*{(c7wB+MbxCF#xbCvq+A)UCcuI}z0H_|~g zJS0j~I06@l$jAOTIODW$xq?wqYMOms7rtXPTJbZ0^hFQ<_D{7f3zz;+Yw%d>|xkrT7C z{ZBr+?)!Tgg*CgI@(jk`>BnxR#gm?Y1t(lvf!&Q-h$R>?lgzUz~ zA3WQS(sZqyGqdfD+oqUF@>F3D5~4#-{ryjON=j*VGKL`#mhgCLJNh z_wGT~9Mzwwpat3kf}zl@YhSYcM?-Ym)m>g>RAg8jj*gE)@zVF9GoaD8i32I_fTU_5hyy|b}3ba1@4GPV3nUR~oPL5B)264mcf^Jn}`UGV@G2?^Tb zOWW%uRJ2gIxL#LR(aM3>gL^we=Dn=?*Ihe4IKdruhM%yAhfEJg-scK(@bOmzf5%{~ zFVSLY3=Tf%3LjN?#0)nV*HWS*QTn!A08c!Kqet7>ffKyBUt1j9d%)k zsdQ3PAej@j7-i2@?#F(6?_e+V1rhG^p|9Ov50?&O{Fio1ZCMF~C0l;9adETJ3bG3d zi?Upv_XB9UtT)Vq0S--X~`>pKUEaNOg5%*nr^MQoDmTD#@#xBMj`fTH@tY+7J z&#ffh!i_kBxL~_rxcSutR@U$O%&Qg7LrZJ?fG!l328Rdt_xA~IdJ`?aUb0r3f~ZH* z{rHr)n7^hw0%Id`D1NP3bPNSd1;_~Y)aDxNtvWc0(=*b+Z_!WgEsaGvD%kh1diwjG z1O*TF_c<@R&RjQM;J?9-Q{eF0ThdgJR8W?6e*KsV`O#>Zn_JIk32MQ0O&ASmt`i5B zVb~Wey&4~hQsuLn=@>9s`IJb^MC`DNmC7a-?CrVP{oF#aAf;~;t_OgQP!Lttk>OtF zG@|ruypMR9#MZ;-Z(h$A=X{AvN=S)Hh$2hBP$hcyfiqn)G_3dR>}*7B_4etA+fcF^ zn{KM4GAE>^)EOWB1?}A!?ylS{QJ+i0<3ddYf-5*CC8EZ3;mfUqm0bGV(i<+-;T&{K zyN~kHs@<^}o1gl!YW#D60f<=L&MerD>w^@tnRny+YPw6wS=s?zNdqAxn=SOOJ_8Tt4^uDMoIU z+V|}+%Rj5|@Tr5^2-LB7M7n%8Hx%=}zH2hLY-|X^&XVy8nW%_JH56?G%%k@z^auIi zCa0zmpNJT@UY-@w5t^*d6k5J4FwQo4rL9%QJ^E}uF(o1)DJ3c`>U^=M0*2D1(Qnd3 z9PD70UE1B>t^7p(hrH7Kaj3rChViNI+1-`?O00x*Nao zY|9J`&x)5f$ucek#kNMY@|z~MlFAbgvMYJ_Jv?VsNgdzX#6-VFDQDT23X=9(_EYc) zUOjp4vJKPWe;I>9Y8=}iln73rxdu7xOjve64TPK@g`7CJIF;QeGb?hlvJ4$hT?o`) zs7K*P%lhR1^925#Nvy#BLeZDZkBy+>@^Y8AwN*BD_I#?NY#f)_*#4?0D>oM=lnsrI zf?kc-SXk$$=dh5c&VOG|osP`CLOI@=O-_u9BubBnP5XRRWKs^}T$~FUJ~lx%dM0`? zzBC8x+t34q{vvkkQ5nY6w9iIJoz%rsXeEY&^NH*@N+fIB%W#hm_nM{*pj8&2Oe) z0xxvICBftRvJC@dMHMCedS|v(85YG}ST$eLiide`u5fjPY17v;FTOC1Mifg; zS?R@*!RXbeZ=X&lPT`*Yok4|ked7_g=|g;jS9JV5JhRZoL{2VnYG4aCBAG@w=p9^U z>ndmI?y|S+;f{57vYRb6@Y*iWK_C*P(}0%v_@;%z3m7yM?AF&}xnnkSEyE=Vi3v$W ziKqdnqTc(c2-gMQfV(T$d%u*^h1ghFJT^P_{&fW2#c)g8Z6NV{A!RYX)H5lbBGtoXo#$M=H7|)IDU&5CDeidxsNllo%caT%At7M}J07}! zqDmKdI^Q?vG2A@&I z^E{^c&GH>e6&oSHg@pwGGVE<%)r(F|MY_;Twz)$|T&GO`OrZy_%htZ_K~PYG*XrDC zYisLdg^AT%X>jcQHOf-!Eurf6ZRoIxjMUuTSZ3jr`5jUAh$S{X-6#Ee?$Xz{rNRVW zQOalMsmIt8pUW!hbGs%+JNhRd1W2R{2s%FG2Sn%N8-vc)0EgAp{!|NVqw6!pA!bd@ zL3~C54RzEud0y1SL)~b+U}*<@?&{2Kuy3%$aiAb}_x61_9+#JYbGCQNv$341RGafyGzG=sx z+}u=VKAHfo=Iksk&SK5#lL0(?Wvr(RrDfGH^#A_H&in^6-^($8+hPO<>lAzshE1Vv zgQwt5`)!!NSgsGhl?yv}b(X)#i+$!_64FUX-l4(9!E!3MOG!K z`oY1Wof$&_q}7lr$+y-pN@R|b@6hBn88YRWZ9GSO&`n9b^1S4;oEn{?_aQp#jqV%0QJZUPNPoF}Q zl9Hd$sTxWfTIp_y`CUP!T!BV!nepZbnarEFS2oQc3&m)tf2v74p|*Mb`t`_%PzZ;C zWjF11sAP%u$u#xb%9Y z@P*{lwt+D|9szZOWEu^6Axg^mE#b(Lxd!63jdbX<9cq_j*KPQkd9j+u8hsja%5Pc; zA@eZuY0YMMMkYOe480K`OS5Q@0-93pNRA32@i`^(;+Mr@ief19p{MWE^PUqR3p1jS zrisGDCYq}ybrW1ufRK-ul$5H%en2lF5+a0vJ!-zZ^Qu%^$5Tg9(LuuCeX8FqAc!^1 zM{!TRHg>+ed4m;poW6emMiyU5U%_zn&dyF==k3G8{g2-FXD3G0)zuBHOlavIo?eU@ z+{M64^gQodhpEe;zS#8C^zOmI&P0>fp&x4>D{}$!Rw@~YZHfvX`&s);ze#YvRfB8` zM2ZUH&+E=D7aH9?Ha0d6_V*EpIw22#)Z8S^BnVZ40fjC%=k!*}RB>IZll5zJOEA!q z>81c0xhc-8vb;>I^|Ne}03g*T#9#Sj8ewgUziVH3%J%f`ox4CeOY3T=ab5mW6~~9h zeMl|$_UE>osOqpPDGBM0j7+1~iStHWQ6XKPpemCY6QoNro;?J+I(8;yllzsquaS0z zduVX2*<2vD(eiRY`d#v^Ep9GuWp|I4>MzHDV}IdJc%OiXoCh3d!5<}Y?t5>%R8vy} zqqUt~S#I^}8m5K01qmrBz}K!&^m~6a#o6U;rlX)rFa&-Y9v(p+OwB7OxJbC^nHdJb zV*T%0xsjovVc}LG;PYAFf{}04*L!@zCPqQ{2jqSp`kGwb1|NJ{cnTo+o>zfkyl`RN zFWmcC`ys8WrIoZZ8(!yhF(!6(WqFH^BXQGtf=!S&yQz3v22jYBtf>RPHv@%Tz5>yp ze85mmRgIR`M&pHsi{m$+%hT3hvsOu^yI%s@U%EIL_g9rwo~a&YH+^osafEiY$h=k&y12ganLUSoNy<$8{X6v3kM`X9LV~L)5RcW>N2glFgoSgf zs#YNCk$EdeDcRV{F9dfA%Fi5qFHR(O*6wk0DP2D4oK+LC-5TMo(>N6EAmpckJ@2s{*j-b zl=K%rjZvXFjzUDhldne3Lq*2ONX7`_X4a#+#KgoB5}!ZE#YE^-JL|S2wj3TFf=U0= zr%%GqT_*Wq1V*Zuyw(*ypf8}WtEQ{@V%d8lGq23<=6ZpSG?SVe|sXXvgUU6OvA!i2^S6PiczW6fTTGvZ$g zkC38UW94qObNWBVq*Q?*PtsL=adB9W;T@$1$Ou-g8uS23QTHDKKdP>)=S_Kp{91L` zs!0$CBy``$K0Y^~3CMBmyzK2cI&@qmBq%NE==ff!%bnF68LbOnG&{O&;11&F&=7m0 zD~9lQSINcQQJt51bHh{Rpykv*KM_dxmCXdAaIcxl*!cVjJO<0Xfla>f$ojGCCJMfl zl`*1Ed^-2d;7@JHs^*hqeyi*AO3$&v$qM6sY%Qs(Ako)$gTJM-o{W5%2b!A~#(^u@wELzX{Y`XX0}h>HUuVQFhRGR0=;Pi}Z& zwycZ{eW>i+T0BqKcFv4*+?;XRkN5|`{_M@4KNA}H`2~MBHZ*#Rn#g#htNSl@-z#}! z53NDKNUzF~3Hn_C=2gG39}rT#BfYY;WWOylUaWhu(odSW%=J3R{@x39b+F%x>CIu? zxrN}A&ukndwLaV4-u_hhNmtlK7rPz_k-%@0mQZv0Buw{T@&VjobaeEbU#X{}z9yKq zRzLqaI-~PK)Dk5oA;#3&IIQd7Q0ZN)00HphG8w~1s|(VFec)$ZtXm(a|Cowv|5%_J zw6zMKu8s~8ViLAj0^;1<8|{JEyp_B#zhf^h24(Bq9o`RulY*HJ36G?rr0GQ6_gx)_ z_m_KL6DdD^Vxa#-{;8vjlYW`~Ep3$e$i!Atf$3g`XtKaA?+#56HBa(LO% z*I}8WEeor9T+ID&TFAkG=Wp_ckC(rkk6ND2eqeL*IrfL~+q$~C+4_n@rrTOuY{^yX zFJJaW#2BW&lS2I6-u^%(uPVvaOeMbaClJEc29LlJ`He$Hef?q~tZAT1NatO}^#Vns1{K z9T`cD-vc9LG|?BY|Dx{9mU>_1+)MWNM~y@W#$u@C!QMV^H4nTL+c{IB+t13QK4At1 z1s$vmfXpt_DPvE@d#jN%^Q=5F?8 zBM+HSqKigCY>DF&B|N5@X?Eae5uWbsk1f(O>Yunvz-o9U?EZZP6&1ng7e=@ zS^_4xi7E>Ua&tB0pP?hD=pG7qogWtP7u)e^0QWq}#*$1=Zw~xy>DSJ8evsJx6?TTz z4&YAgTBrzlMa8$`59yr}@cw1oySkE37Enx9(nCT7oKVls(kGm3%*;LynM(TNZ|M%E ziB?pWKUY<6xcQBQc&x2h|G8`r?th&C@Wq#8Wjqv=iW2qt82k}tC+`b(K|fhut`2%i zD3b{eVRYXd3=DqWt3WcBYn6rh(ovX8u;11#uln|ZYEA7rH+L}I{=vr14kZy$L|2Q4{e9STz;5pIjltuEiNgv8WOO7X#ObY5B!rcf4nt<1+O0@=|By`l)y}ao0%SWn zDFmXWt4rl)Xr)l)GF$6ahy_s`656v>?iT) z=vX&v{Clu}EzHE%f{WSR<50ytedco&9NbQOXyXzP;^OZg@7g;3X{fHN`xw~b_n2zW zbq2k87KSN4BdW>a@!|4xp$~z>#*4*2O5!M#Dod#+HA0MeeCc_)6nuP)1(sG|Uc7(* zzNW(!;t3e;>^A1shBpkja97QW(qjL9NKXDQ#&8U(L?K&|PO2`@Nu}Pt{XN-o8d>$i zhc<`~5AnJq#M<0^aXF)7^p{UHlBuQTt9p0PksBM~RlHMCQB_%8>EO~@`Hd&N*>$g{ zf)NKbGAJv17_c^{1L+!8R`-(U=ch-w+XR@HnVC-&B4S2ohKKRCX0^bK2H20uEi;Ra z8UdlkL5~|Tj*`a4R9F!-E6{okn17yoiJZZ03slsuh3g-xqzGGB=s?^i9kY>FRGBWw z)qklsFdSunE4nAkp4D9Qnt#I4ciM%9+;S5`B+XGscMrQW8FxWP#m3Fe4GGcTujA+h z5)lNq1KZ1ite?y$pWJ50uCmM-kTrzX+L00${iMNBs4?D;T<-JbYbP;e9XFR0B7+Px z?$=|50JwuXo`aL^YCyYv7{q7}eD@APNx8FD8_?o+8zE3%GcomQ=b0L}h;3WL@=L9cwkJ^=1&)2)8X9pN* zXp9$47?%g4r&i;bn72C;J z0;(kb1Ki~Xn*FQhW}MW~f#a%U6j@rv`rvoUx#@x~(Avf=>Feurc^#P9Nb42hJad4G z*^Yy1m*gMiCTFcKFf==I3sK|#=lrd8zQTVo^3eXLKOY`mo*lr9&GAPUhxiTt>ap3= z7EZ?O2T;uxAuh_SIgepyw^zM0SI)727v0hJ;a6#yW)F#x+~CsG)tK1$L~U(QTWeJv zus8Vy+%BaT;s^Dcu}vJN$va+!~sfA|RiwR&R%|H3<$ zjfRFRP6Jax?sjy~OkQ3quhVPWmXlGYd9_>s%;hv#CC3K5P*EA2yt|5ofT+30`6h9s ze2i}GaR20y&Tq}-t$fzXZVV2UwB=$f1wfDD=&IbtzYA@dotGpyN)adSt@Q$b`d#Y;x% zMJSBGmRZn!s|xbNqWz-U_>OIu@@fH}+dn{2`vM%fGBWyAKYA-f?Qt+V=EsWv=tPLR zI#LEm=H-2b3XZut^46xbq&Q}JUY9}vbOxM6wJ!?hn!I`wG5lIjRS!F-2jRSLvGNo;pp}o$=f~hJ795ZIAIu*T zFU2=jqVEHDInR-L!#RwmY0Mt*r+Y+FI0 z(>NKN6duMX--B-Ccep-oI|pF>&Nts=G0)G(LA^RMS_C8-5+a4?O`~XC3bK_|Q50S~ z`&~G8mFEUDqZ575Z*(jAn$hi?%_U|3-SoDAWmZ;pUm9=7fv$s$)Z0HmzJfibZjCMV zZz7}F+1WfZGlS|jV2i+R!_AF2b}G9<+oNMk=jzudG&r)kX$c^EdU{@=T*WBg+0e%e z?p{<2y>)CskLQX&9623rvP{4DHG#~b--wJb{fceFC!o^TbpOH8(aF}FsA~VCRuU)Y z=W?Xl|C(mNSaU}Nf8y7##t3bqcyMw|)oBrjl?+S&UjF06|93la)L5K2@7uun zI=FFlbaezQ0)bAPssj=erN~lK^0M?>H8rWXw7vbfjIW3XVv|^?*%#I~t^%WwFI1q` zI9lP?&=3-$!Q&>a$MCP|y%S1uEM-rl7xV#=L+9&ryx)2^vz~dct%%dog0`>yHupnV z+*p?iC26gl2;}5i4|wdJ3jC4&-uk)}*0j&wuH~}>{bB#T#zYmjf`2a;#E;wPjE@c1 zxo-Q;FxNt^$jp4x-E~LoPH4G9d3un=Fc?=9CE|H`odu_a2hw;wjteKJUsP*rzCuRq z-@TL8>}t2!J%oaG8^+=wW%3u!US*a`~)nHuO1xmwX+x(1$ z_fp!+AiK{CX;Cei%R4Cc_LK5g1N|Mk=iq@lA{Q=kILP5A;V%h*#X&(q{$o(kSLOmZ zb~Jk);UOO9j_5bLRjBxsT&}RGsyc*X6SHaaMEhpI*pirSNc(9)xoJ2Gg?I zyfcI9cEr1)eQi;lS);h#r}zYMNwh{5W=feuvKBnGH0)yD>v(4EfCC#y`200vZE@+6 z(KDls)AM?`)2KJDwzlR;f20;|_4$u%7C62}x&+P|W#wd}={A&ubs*p_tk1T%;a&O| zSjdR(o?@{2)NJ1QSFGNj#@qY-M^cX=!Tlwm_@)T+3kVQ-(|SUW`G}0P@nBL>qxMB$ z$&tjN6wQ0r*Xa_VS}pS{J&5jMWn~>5`K3?K0*?6nqN2>)OyM^j5adk}_wZi+5nEx> zFXX)R75to?iiAG-fcr?90qH$bGM}}G_u<-1?SZlU z!0FY=Ja#=L1dG*QGBD65B`0jFYY^h%K7aANth#crua7Kngi8YQ^RvNq7Uq_Ve;2=e z&G_xKzZA2B67s#Xi$lNZGUI(K=93;P1%tXBzpI- zo;)EPL2_7{tv6aW8kZ`zR#OG0L^8FYlu`2j(a!?tRtT2$vZDAh^C6dJi*V;4-Dxs>_=+R9|Yd_LDAk?SMz zY}&>)7S$>~beZp1U@yKZ|73k*-6}SIo>_dD7Y>4yuDc>}#w+mD!21RJ-koK`;c&mY z5AF&kxv8mJ4e_*j{he9&L<=Kv+3M5&Sdh@^nj0 zi^Z8rgWa!~8)Gbn1<(b^ah$nXf8Ov|ToJnSeyh!D^i8W|CDw~OUfb;uyZqv>rFYvhK$=D!27ZZIm*6q zR##WtMr;lZeZDt5LE=IHunAAkluH6PRszM(&#Y%KN5)4^Y)_u4stVbk?q1e9Ose7g zweB9BOoOu4gU?9Vm(IcEbzYv`YiVVPMMRb$-wMkX+})KL`sqjPH9vl?eXBWjb*dy+ z%#NQ6`MAi8(rycz`LM77b3s8Emle%I0p+xK9Lmmi+BQUtxz#G*07_3!2R@Vd@Otr- z4)J$B81D@i1w0mXyd|1~BYT$b##5soVjr%qtemGGug)lhF$CJ?mlOx;?)=^6;t}|o zR~CZ7%|ss4T`#r$b{4Dtg?h}+(C{NcLrerjU_1|wdB^c>p?!GwXDdSdrk9ZY5z!~u zT?c&lU|UCgd?5ZpTRXQTckui*=I|P&*wS;sQ$v+>u^0ct)>(#CwSUoigGeY+QX(ZF zNH@|U-5^MZba!`2iL`X72na}*G>Cv8jdX*6(j^^tdj9u*yX*18QO@41z4ltam~)JG zXlT^?F(QX_CBG#UXsj={JLRSKb69AGZM1v23wopfEo2q2#fs&IFtJM7&SJLKyG31I zT`b&l29!%~!HVUs=Vbq_XsHf1g}mo#&l9y>RIIEbYf7SvqilYa%)q3HTjv1IraG4) zeNRtxubeL#HV6c-?!})&i)X=K;n7CEykxd3fgB_1S3W*I9yT`oeEdE>-j8r(h{Nc~ z$o6GBO4Fqdxh6l4hIOGnw0S6q6)Q@Gii%22SSVD*z%7SpxU7DleMg2YJqbDU3!i&JhOV;Gm2><voN zc0kGSc+GPq*Up;H(ECPIB;h*C%E9ldyysPHnS;LFw)@z&b7ir!;aXT|xJZ*n>+a0J z_F9Q!A)gEMc3`%f_&LtY--vRWwcPi*q|q#Q)#uo^`$Rvz>)pL0Z02!T@YcAUOloQW z+1wa=%EQ~(sFR+4660Lli=3sjkXyEHX|cPu943})gitHghaTeR`n;0n{;6TG+Ed{~ zT+d%G4lO=>>VORENQSYWwG_OLh)B_|Y=;0u3y-BRGdn%%JS^R@2U*hI=4(V7CTi8k zYOc$1MU4$h*5Q7|4o=_6{tOi4*j^q2s6Q`{7$>XRuGH}i_V_*UJbn|u^aw;ApdEQ? zKaX?&{yOFX|9ITTdn2Toq%mHk7_Cl;?Js||ct0Q{@A`v2H9AwAUn`|3={8n0##hg0 zwDfeMM8DhIL3*xL`Og*?C%c-O>TN_mC!lCMfn*`RYxedBmXe=^iVPcS)ZF{pkd&0Z z568gHrBJ4z!3(C8piA1=-pq<`Z$6o?_mP&C_i4YpZTPySywnjdrTye8dbEEvG>Yir z0*$Gk$x+MqDA$sCdoCtM$)tah8i(xaQ&ZE|uHLS}8SEff0l#UA^riJiYncH+;+oRgH<8+UwYbfB*=xJiEJ| zkxt^V{Zp&ncooVhv01#=zn7@p-=t1XPG)D5Gu|yO-!y`YOj}i5%_V63eF_n!)*G3; zwlq(Giz`NZzmDE+Wn~qD4&{}UP-h))#C}e5+xTpFC#bdDU*yVhbn!SjKH&FRV+t7n zIX^oGJD(WlI?#YM|qw-H8~C#eJPhzJO>c%5bkyFHkeWG`<8Mx4eE7|Td(Q8s56 zbDc0z?yPm(tcd0gJ>jx``EpUY+x@F?1zRHDcV-q!!l>JbbQ#-cOsGFzJy=1}>@co? zT8A}1s3zRKlS`WIoUQLb<}4-7{fa~Q8C0LgOvt!+U)o!<+=Tn0)r~zu5#wcwX*YFj zCW>8uK>V9xI1CKigXBVElO?KWLRUMi$U&ljir^2qR*R8<2vDv&krGa0geGjnhz>o& zW#0Pt!>KUk;)Wf5US=nreYhd*^&wv77i;97(C#G&jnm?WbZ;#t_iA&ZU`lW~nsU?= zX1ft(NnI3%E#KiHxkqV9%DRPvQt_GI-|ljKC{6{*A1Rvsv^_VdWBE7c`R@o<6!K>} za@L*_r=d~zN4`{TAxYISAP2Rr>|gm^Vbb2Z6pC*cQ-2{8n=^aRt&yDKLMRMw_N7z`^G`~`%AVj98X>nlUuwO8P^X${+$0X zd>y@Gugsh9t`??-d1zlzQf2LNtw{29*l?6880#dcz$J!+5<1t!*Y4Z3@p46C=6ZB! zcpO?|EKisM)5^DclLoMqV6XX0&*GMb@~zhV0w-8Ul5??no?m)NqnY*MBl$ek6&4m& zItkE2>TtXvo=f8S-kb^9&zbHIH%tHRkLmExG8nr^G@vkQ_@l+2zu7TR`h)K29kivkJ$5T)HK`OUBGB6(OUsv7Uz z)kOR*WePY`SdxUdHum>NyNB})1JriU=`Vj;EE92jqunRkU(mO{35YhVDOP$T4@I-$ zPoFW-F;5>qsKmK?!Vj|!Yo8-t;;Bn2EfeVl6=9Gl?ARSgRIgEB6;8HI3Uc{^I-&xb z@*Dch1HRA>V@j0Z_LohdMnk(V5*1nhG~?Ss$MN+# zd;7%I$qV<&Rz+jH#Fs0Y%r!T<1J|_dk+KT#52^6KvquJC%3ykb%<*DE?Rba}xK#9!px8yebOU_i=AD#J6$Q z7>K#(HfD#GRH;%tl(ilw`gr?H8L$l#a|MOBjom|r;K!wPP1OXEs}y5Ya%#79@`q%M~b8FD+!MuBmg9sRNIn#!Q!69iarr-9JMaX3Va7#(kyZ7*GTUtq;7K!^~J@ zX2L;7K_E0~dvYudFi|_i7yo>8btaRh!Na(ozv1HAF$X#KGsFf7xA`MpZkdA@w%yZKf(n z(awh@kiqeVpQ>-mk;XM7^1Vh#J2ykg;^^<+t8&9f@iJ6Fq6M5^8kB<&D6t&erv38j z3~p5W5@5!|3g7wio4S*un^cSPt($by0caU3@B|~|B zcG^>_hta`yC)(P<=H&21ei=Qb;pKHOXmz1zWXzEU5S@t*kbyX5CAlvDu6Qh;Y=G6U zwX`fn6A#O;v?_}oi8-OIwF-SZfjgnrw$_#9m8Uw#NspB&aRik;?e$uN{;~rlJ*^;? zXtRUOW2eccUDJ-#mPw&6g-JX3S*{!ur%IU8b<>d$rg#{LAr6K`HoDJDOf~K{M#EYt zc&aKYi(6~6Lz7S1SaIA=$Wg?OYu(`w0s(FFpGRDXw!{MESaRX79UUEit4?Mb7Qj7b z(VvNd1o|Wb|Ff-)onH3?3KCLe1U?0Yg^3x!4UAGBcyH@CTC!cZciajKL&N%@@@c-M zg|S_;D}WwK^wL5xucIQ{*%Y=v7<}<$Ki~H-Xdt*&addK~#Y4wIkreWDWO(_c1;Tb6 z19NV^p4|nK0&)<<*H={6urM=&hHlu>L$l8A^$aD-D+$Uf=SscVS*@U4ZAH6XO9v~X z3di;jSaKK8)#0D!XP6n|rIufaYLfo5#m2*(M#c8{{90U^s9?gu;1sXKw<+ar#Gr4GDLv3wsQ->B%VFu+Se*C}P+< zz*I$G78f~K6riG_lM2_gMlJCIH{h<2$pR$&Jvd-TJ z=T4}zi@Tbth7=_w3UXRv;>z;U^xWJ%M5>U@akR}-(kxPNh!8RBDCD`@U;D}XD)=hc zV%~}TIXn&)&bc|EZlPGZ$8;4rHPZ6kzlR=C#bb)St1Ug=i>J=HbAXF3;j2K(n)W%r zsHn;AA!6}56J&*26tde~Ap%1d|?xEC$cr0W!RJFoUWk zs--IAzfQL{G+Y4X{9LAf=&M&RiS2iP^Ab2R&|7^v2ZND>gd_-81t$4%B3}IfiT1)5 zb}C)@yLZX#$nfvnewo_-5=y0H0$$4_XLo-jvw#Mu2O|;~+@T*Tbk(c}NIi(^LhllN zWrJ`!Mrg2+3h1anuM0c^I(6n`X(^d+0WkD?XJ@`ejSNA_z~H?+SpilIPGU^jzBdg4 zH%Do06%0=vbDu;sUVzjKZbrPI^F8{(q3;pRP6-Q5Qyu+T5>(;{?^E9C8ILC@SD?eO z`&clEGj)&*3LB}vz~yY{-K}sE5>hrn z%Lu9We=xmOWQL||Y;e)PwTp{qmO_splh@mJ_(SJE1z~}-gcRVqBa^rS<^>HMD4bNC zP!qvey1B7=LbA2JMe1N9^xwKH02gLz3{AmUub|GC;GMumh*G`>;pP?E31gxCOpPul z-P85zn?DZ{IJFX%jq&Qf+JltPr)dPj%Wtn$1ta}c43&LRPC(3ZM^L1k{1 zxUpN-9oyq<1kZ(zNEQ)2F) z<0bV72gW&Eh*H#0cQ@6)#~W5#^M65C2ZMC4!_-$o5Xgb8=2!`9M*YQrVbi-h>50=g zTt@mfsD{z}*`ByD$@r=S0jx8)Ta7G+P1QzMs1}+;k5}zb!?6akIG>)5l$)ogq}V!G zfGn@DM*2s8$JKr!9msKB-??K8DU21j57(tdyuY2NfHmgJ4lff{xY~1d4(_LF3whab zsg@>IV2VyjDk>=U7+QS!yGF%~+suUXzL35jIWl?BA_v^M0TiCcn3x?JJmXTdT~hh9 zTU8NrB#p%kj5WuWy8`9dNMcC-*ISKEO5Ok_Ki)rtuX%i?K$$ARUav7m;*GS}{)tdt zi}>7Fhn)nQ$bejhC=Cwp4M09)qGDf6m73d{Q$1qAb$*O~ZZ7G*KidgSqsE3th9X-| zHbFKpw=Vt=+j@BB=~Ytl*~MVZa?_fxp7$0)hUUY^SKj~;?t1cPdp`HYLCxggkCbqW z-%b}tCs2KztM~BeE+tE!PEUG~H1Vtqz>XYgm})MgV1@ZpWzj`T3x8x~L9_+%b_(U) zUvGb9r3;LCZ2O)uoP3=+gvIhL1gL)Ny+$Bljr7S@ zEjlt9DDDvr0Rd@8&q2xTr1M-)kM#11poN7+ctxa>wwKp@c$2tP_#4GH7Z(?KDKdt< zJ}s3Ea=IR|$K>0Pk2hL?tWm1fK6TI){s!cqMZ42e)BGb;?kioUvCd;+d?D$Tk(4)f6^^YwHg-%lTecUD94TXb zat0L&YHIsY%OfG5zqN&*P%`=aUbY6szkkH|cQ(zX#I7WrUnjs;ZRF>;H|}9(6@Ma6 z{C`_7ECrSt_}m{Vkr8ZAEkGcWrU`I}_s)K#93LOUShSK&$4{SC#30@vq-(PYibB{* zB_u58udV6UQIktaQ?T)VACQw#`Q9~fJa^#%m^Gw=DY<48){nCZLTL@G%G;nT!6(zm3v&_oY+LY~qe6pjVHR$jq<|99smRj#x-s~-f zL}eVh;>N>MUUhqIFvG&$Y#)4H8|l^#hPy4-EzB9=Z;1L8`h@+@J&!M^!n(SGzamRp zbi>g9<}VA@19Dh}hbz1hCh`OLzUyDd;*!D&E{f}s#GYUGv%42s0~SW6@yMMRAF;Q; z%t5kgWfyl|iy|6q#rJ!!@&wXSz_O>!u+8mUylT2inn|WMs-`=mBjSI#_-liSx!DzJ zxLdY&@7@(J3-xEdI6v>-Odd}@@!GB74);)L{KwoWJrQ3Su~%ha@_2hQBph4uCC%G(CoHNdQFLkl!nzh=MB6rVLaH0~WA9cMOr zwt$19_1$7$s7nG~LU8aiL?9^23mJ+@g`BpaQKQ)34;cfs?&SmoxO3G`D_Z@H?te)_ zMew(>NR5pHrtwNkYk35hHEe8t0I_#2*0V27$YOgMq6VjuDxp*F7|$h;ciGJp|4emKR1F6I_XAf#$LJ2y4`LL0_LLPSPJhHy=@MC()k zijes5?p@r+SHF-#Zb4JO#plG{H|t5X)Qye?&rftSGjI^SBX3yBNihQi;ToXT{X4Cqp49`uYsh54=Vg%Ynq*&9{D+Y32<&SI%$Nc z*V#}Agg9vhAOb<7U24#HUi10Qh#1IH!MoVGvfo;wi-veo_Jm?CH4N?E@RPTNpo&Jk(Fb2fuvuvFKZ(d90Q9Z-|GS}9wbbFUymnyyKy@}i_XF0MJT0~(Q_IU6)= z`Z+Xt3h<2b1o+e)4s%7Hi?)9MK2?v~U0$PtfuJ%^eu{4}lYR8-GzTkdS#5q7Yg=no zB17wo>?BiT(*(n~fOCbHU|UmFtw@T#=R+xuNXA5)vZhNbGpTG3m43v**EEa=g?yzxotFm^lEEs?TpVh>*^+sOwrRd0-H>Z&a7tE+MN$1hR{@gU=bt< zhQpBRLbYzLZJj2^_~76VkWhvi3KDP}8U}{ryiXBHI{IoI<{z*}EXm05$DQLOs3JiI z*5Z^1j6DM@Dvur#hA;#=d7kh+g zYpOqVUZV$AT15(;l%AfTD_>>{0&jcwJ^UDIUeBuT(s(QYLlZxf{TLD zs9SzZ4Cyw8Dh7s?tQCp`#w`i;a-53h4T6>FiJhGW9vSozxAU!&*y!+EnIZ2c7Mf44 zb_Q2gTqb?YkGH1o+nA5*xG>Z5tod}(h6IJ6>bE#+e<-HLi!3#0<(d2WR+RGPxyjhr zSc0siF1e8R*6w;MJLl#}QwMC!&v%C3Ky|&!TnBP$J|@s3DDhsqHg5LZ6|`FZMmLy^ zMLJ~a`5N(DOI;%GIpkCJ2|E(W0Bhxw4nak`KCxD~3 zF*SjE_t$8FFHcn7=g$yWbauQwlgI9a+HelMN1v0O?VIWS6<%K68}u)q?jhclIUwN4 z{$(KKvoqIR2SM%Ae>ano2n5Lu_4T7AXkn<7_`qpt5)BF9e9!s4RaGB_Ds)Lb{4-~Y zFR6-OQd}Ibhl}xQufJMeQaiNU#%L^@th)5`NK>pKs~P^JsRK>T@pFAOmxG^$i3LhX zZKMK?UsAt>?vUGzmqP7G8i&T$>60rhA1PMI@O-^AdN7o&vPlIVSx6U@cN#&Ej_1*- zs+n05F+nVuK(bsOmqksI6%j+%Pa0xZegr;24e`exKUS^NIMezLlF)lei14n%2%gxI8M|4 zwcKmOVnbWr*x#@)DNt3?J00o~mwy*wp^bU=h=_o&)F9CvPW{23Cr^kUJRs-wY?~_V zFwPGn^2=ks@iSaj}VRh z{3+M^-CxDT&+jQS^B=}^{l?dw#w-Or7`GBTsSw%B>W^D$*rQ{zkll#G5e;_X_vuUh7tNKgRl0IXP(YKu(#+AB0>l6@G`?A z>$n{}mbO}~b}#7r6X{}wngpNVJKwZi`T6;dj*cs236~TpGFFwR%F^IO7ZA%E{@V9c z!ipLBz!TnK6<~GQ2xUr^lo@?#>2qVvdx}AU3*&y_f-F#X-2W=cpC#=2d+7UKgxiD7 z{B+_UN8-zXO#!d~t0BdfGD8vxF5$dVZ;hK9*y|JawxM57viY!Dr*<4`dHataINv`# zRzz;DtaNrY4L`q+6;6$V?p9rs$7*fq+Ubt`Z-^@Urwdvh>g34P)O^v|)kTFqqF>Mm zocf$t2PfGc3OjXIM>wvf9QEz?98ZXW?BB9*Y_b{p`nBBH*oy?Q;(*p`>xJ3X4}qY# zn3?n>F;_oIoUQjk6T<X-4>5SqtlT6O^`qtTjH86=>=(pvzFChm zX{!dYE=EaEK`&#F92FHk80@TNcKBeic{eK8!X-~!#boaPG?CctuUpRDyM5-VvK9uC z+L8vRGbcNk4+JGtRaKokt@BqePIe#9+&1N~nw@k?XiQE{h8KiNN{&S0r@S>?x4qcg zH@We@LR#!i`T-r_uU|08`Z&9S#L?iMd?WQxDNFFLqrvUWX^5Ja|5y>hViqqiLaGS}5LqxaF!BJ%4lKQ4W# zFrj~&FR6zYX=-eIaCBCMbrx)^jSq{t>1wm8%F4=MhzxAg9%hB*-W-u32uJ{o-e{HCbVM_Ckjo6Lm%Y4^dCf+Vd;%i@n>ybjmqe z+5@z>8RLxlDFifRWmT1s0n_vvVnzze6v0xyyHHoiy8WSaK5y0P z*1w@A;O`xxs=Id_k+dA%=xPrKPvG-8v_?@rV$2wr%Bn8~F3 zjjXbKiblGEyfSrSgn)~C3_D3~Ug1=+g)$vlH`$C%dE0sO+2VOWP2_^z`(U2EY%Tt@oX`#rOO{*FN#;l^k!mGU{lbLRq@qs{8 z&&x{8XKeb^&W=u6+DG6brkKy%ewNp`?V0JurzcNWNylz6PeHg`&@~dYpm#-lkEM_r%spJHqBMAch#v$*|bfp~J5 z)Me#Uu*rEXzwO~_KdhWCT`q>COCRq)mL555{?Fu$N5G-5GYc_&9y@dOj(?Une!WnN zQJQmW@R;}`Y&P=t&Cwf{?S|brwAgNW!wh>q7Y$nl+cJY@?wV>TObYS`r-*cieTGQB7PFPLME|B2@%Qmeg zsOfcM_gkbYX7InLve7(zVE(@S(Fhd6Tl{;BD}0;%@*g}@=Hx*Q?ANV>DP?D%KTFUl z0d5D>^YhyA@tG2q%u)l#H>SvtaVBV{#u9k`>j?aAivt`%ijm2QjU{%gj`#16V z$>XE~0@x>^Wc%~c@eQ;u6koVOvih;h+UeP;>Blm^y~UtkJ7IkaO4Jq>I|C2~3{IrK zY;5IqIaPkTScp$gia!r(JvI7@Qer>n>e|rQ@TF2qVXIFEMJ$GlFF7-Fwq0-$4%f^Z zzS{{2tcIDSnFvn9;zD7+wWEEJnARKfdThiL-^|akMkXvQ3@pr|!V*P!Q~oR3j6*lmtpd0i+U5O7hg>UU#iR# z5PtNqIu1|&G}mm@Bd;r#^mh7xT7aZQeSI~?Yj^d2=xn}CdU4t02Tih#&5iNW!Bjh| z&Xqdh!Dk2KcW3pIyE+}_stF{ALAMKBUla%+)0A98(_-2m@|%j4^N1Q@j(7lH#8^ogc1kwg>;~Q=IQN)gQ40_>{t{+ z))po{;HcGDQ04c9yye)LWqn9-p*f7x^|1Hx^f`y@^afVni=C|SI?dy?5{|(Dq`=BD zv-e9zcQf^arQb-PquBO;v77%`2J}Wk-vN)*-7iD^_YkMPOCi!Ht9dsydBW#29=l+S zn5zo@}P-6p%Fzw)hIWlpd$C~wH`8tfi)USmS2Kf!DE zznXv>zq}C?&PGukr0aa;TA!P8r2&2s0E=@9k%hQ-i?en!NGcUtmpfPCS7^sbi11Nf z&!Lx$@{9`C7e{{*3sNj}2ltQNkHIXn&YBrcNLNouA?)u90g=&3f8j<)dPg>fixsP; zNv9bd{$t7UOMmxJlix+x=!}i5LSOBc9m29Fh1EYODqAjV+(2zKdwVNogcSn224V() z_9{6HwsV%dSY7s4PRkNRZufu(L}0dBMzFfhs;8CxRw8#;Eg>QFnW~kxwxz`B!7KBt zIz~-M)zG!GHy556DFXV*W$0b-fx92BNrXw3Drg7g8NPVoRU7?+Q3}KYg3{rWsgECW zj7O=mGf1)b5acEq+)o)K@Y|FzF;4j`qhtU%CMr)Dn3#?Xex+njZ{2>ugjZ7;U}yb1Gc?eWdDbQ&=ThU8F}PC zzpcLoKouVPN?-J*!sn3?fO&gvg^Z+3c{+8gq2eQNW)}rpc!A0jV3KsN^yuCP#vOWa z^&u58by)28={UYoXARv$ZYvOQQGWLr>`KH4rc5>VMl(!&mPZ*_Eo7twV&(Py(`6o) zTO6SZG&rlx9MN*(NOp8nhOg6$rt3#7)JC75P+V^BDyGThQ3ZY%$gfyo`;EyGI}<~D zEA5#Sj>J5>Pk_Vz^C$RJLEl%M1avH(nBqnDt=0~JHUHi7!e{a2hcD`GF;FeEYH-_gm^i=sqNQxL;BE#OBYCC$9KBk}S6bjYnS zi>Ug_LCmup-LV}?J>9XQ_V_z)!aFwO+?}AZ&QCq9AvP?%r{ITYaJ-Cg6x@Tv5Zood8Nb> zDRZZUI`LkRD6lU11(-vL4=_STJ}tZJkv<+~^NDfpd_zsdVlx1D($+Gy4U za0kdI+Up`8BwV%9Gm=ER|8mSuFCuv+`Y&vTik)x2EBfI=bOg9~M(M9hU)bsW>}o$- zEuXR_jOtucHJr+!M_|*#-YE<@#{-<>ELcZ2=e z_1YgmXkl373{stLZdp$hFhbCb*J`&rQFjC~2C$_sk-CUuhR4Udvbk+1+5GgcT2Ja*Pxaw< z;b+aXz(~PHYWL~mN3G+(n<8=VZ+3~E9_EIRsL zR(}}$YksmhO#T+s*Yd<1mgOz5LQ28IzjBfdk)a`p;epdXJr{SI0c(kFqpp!EF5+lw zIM-uW7^;lENH^gS5VT~mF?NHF@@jU!O+VF7^}X$_?*Zm7X8Z>-6T5GQwu;VT1+Q*U z2@{*mM$N%36@$W)VZ<}~_1U?c$J`Dyh5(eu(ZN`*O{PpLot{QWII381LmivVGv=8e zdOMiwDL-M=h7GYtLI3-W5)D_?GoF3V3?X)K2%P;$r zyO1Pd_OVRzT4SG^pP{#F`ke0m8Cr2KHk7o_E**6UKk0pP|Srs9%JV^752Jfkv9oNv)(+ZG^*!#EmPdX3~j4@~Mj9OOb^bD4T z^_c2trDBtDe7t&j=e3-OUYR3*r%1l&hupcV9PgvnIQm4|3-2>`!6q4|`GjUknuLnQ z=uzRNM@HhP0R^|tC0%z*GjLKwDY<^UHIBEGKPHUVI*R?Zeq*AP!*@7g7;t4uHHRy?>>EuYk~+BYlA8=r2d}%!i&gzgrr_LvcG<<_CW1! zgh)A4@GtN?0~q9Q2tW^5Yqt<~ZKJ1mNAfH4l0Bqk*#&0y1Z&EKX7 z{3R|L7ju)VM$g2rxCZ=&DiMw}$iM=anZ$=(Umy63DF^(;Y(o=)fPU!nC)_nP93ELX zD5~lzi;nezxx{m(kvmYiQbTRIsvtpcz9@f|yeQZ(g&-KVTTs9YWg@tcMQ{xteTdQ;lOvB}A{ z^_qE=+|fVk40-udQnHn)OjMDR->vZXZjVgR~0rP_A|{@jLqDd$k7g2afA4d>(hf)Z2^_>*h=$>Ebj23Am@ z%z>_+-t2~eF$9W1cABN-3wr?0JbN@TeqEFvCPsq?7%)?RdyddPQ#L+QmRP!r&A1*K zLf!YZQd0NxpBHkGlxQebS>KM7Fs_)&?CPpzuBPTT9Zgo`D67)4tu|9TPo_=kF?HsR zPT<0Lb)5VNq?O1S%w@OYF_NC;jXX)>A)4R;8a8Mw!0J;6dM}{!*F@EG1 zJ*;E8AW;<+m48bmbd+uBw-`wAs#!b^Q%s!Y$Qk|Xcc)v@-^AUqeXl~ZJNg|A1{J9a zEtf5&WZ&^QGI~mj%MvvKXL?^O?)*HzR5_?$3Tf5ZOGLvS;Rs1ua39n)Ls;}5u5{OM zCeV!&M$r?#zbEpZ2(Ivyt%kU`c=7bX-V!jeC~EI1zgHnvkWzG0oVf~uZ0r=sU{YK-%OvfBsd1UiVq zt0q6g16pT4)4*WXIa#qnZ^{uVVgHM3ZRh)3i;0hgp@@y&+R!6$E3Ro^h@>He@Em$J% z3N`Jn(20k(^^PzMiBNLzb69C7K*CUx+|}V_&Ts{Ls>E2ULo0y5!opaw?qF`r6c|dH zg%-jC*`uJ7&1LmfLc#fb>-BveX zw*2-99Rcu6{R;1~ob?;q3o2YAT-s3u{7GB9cpALBH@sdP^p7!YE}`U2K6#<5Vz~zz z^@=ue)O!PZIouOY_8=pwA63H8Iq#HyaVt;VfRsS9@nQ583AUwMe z3OGad$;=JO4ZnB>$?<_)JkG}ylXX@<%n>p=*}P7duoRY~im%t($@Xh}+Vh~`v8CJQ z@l5tr@u)@?uh(Dri#|MmBLXz_d zgJdWvUqSm#k~uQrjf+?KfkBJ+*_liGv${|kj>zuS{QR;Wfdo2P9u6kom@J{!AE2_! zs99!BHvkHNv%h!_-vz(ZXMhn&E7ZAtWu z)z#HcOnYlKCxXSr%dH1rvW;luk;HI(8~I#Ptf(FDe72DU*8E!^afP=CF6lyNB(GbQJlV3-k z)8OTo$U%}I4GuaDUSVmAz4%&K6SXwr<#e?b6vEJhw`QuaY_N>gz*FO?ZcXQtkQa{t8EH zVOEJyvl z3j(uMSdeLUpeqb^9+4lR9pC+pwf&qFfv!txZDAu#iHEoyq~drqS@E-49g)i6<*aU6 z{kpPJi-`(P#$ll~Yxjw`ruDZ7+&{$=Ojw4b1h|C-1=3XUtOiZQgb(b^d8j$Kf_uy( zUwx>qu?olHj#g~lzSxG|-mtte4Sgn`*Ew9fH0`vJ9%$@u_s#`TejoYbxh3bSaMXNp zg1sYhdOSDt*hwDovb4E5yixin;rGXHrjI2h?<6^|^-WElYI)hn+S}Wg4zR#H_lRtXE^AyYIX6Gl)ih(t5$KT;=bQb8?DEFKtLwJ{Qwj>2=Q6dcN_aEPBeyN* zOPgaghT|LQjS)3YJ}O~&!1czf>ca`wpN!T_H)%Y=bJU7 z$QF!@#fyQWgi*|dQ5Y!8P+e^HZEDTvsO`(P+umKb5FQO4Tu-Ej2Uyw6zK=xMb@I(0 zP8k|w(1Mw|{=7v$H8Jz!hfxc4mXtWo$J$bN`QzjeH0&BV&ZibWpi&T3dG|AeygA^; z;JF;f@%rT%R+O(_AwEM&_e=$~CjZVS)!Y${e1H}wX}-PHmZoN*lqD=lg||MKp-h9f zx%n{pF>|Bi5;9?`3=J)dq41n*g9;@)NxI3^Of0na3)js89^2Lz`C7LO(;65au^5P{ zVyJN09CncbaF7`*%SI$cf(k+(QNmGLPkFQuqB4%(Np%GvT96WlT*Ql%fb6Q~vN$ZP zD_g%27eyPd%2c)w4-pX++vs+|Gj3j7RFp}Y6@l`hxbb25kGbrum5rTqC{Z)D^DsND z59kXZQBnzh9iK*hL>U+?O39m zEf^VE-X_=H+xqppddSXbt*g(ZJGQXcLsm(F77rug@e?8a=B#=Fh%zP1z|qxJ<1{&c z6ZbAItSd~s^(i+GVH6oL4n8i~i_5%k16^Gm{VVfxjq9uih(Ks;2{=20GMt=@NLN$S z#@?Kq1W(6sA}*N;vBJI?>P{F8L_!_8_rP$8sGOdjk}g0_?8V~iS)S(RVEiTt_)3_yujp*g}H z?td!ttcx}fmxXM^F#jU2U zjzHi``d#|gI?TBr^!@4Z3V-ZDwk8mUg1S3dztXmgHm0tgn3&*UzhGo>{)(8ekuy3wWcb zR70@$Ei|mJ_P994TBfJ)f$6!5&W;`+MIpEN(hE6nMKodGLv%_?!V(U^A<2X_>-}jy zH`hX5&OAv{S^QS7%UYHF{F>_uJWiMQY$nQ#s4HH-?j4wG+?j9fUf;hs+R4JnDHk@m zLVilbL>1NfA+85j5l;HQyH=e;LV}l5zUeo*Z`+({{<9FcyE^J5HJs0$xq#P`F;N4j z$Jr;_E~5%on&Q-74VpZMVI2uKfm!L`(cVGez)u|15c+1OlKi6D$2Kk_y}#B6bD~MO z`Pq%U+CBup#ClDciH|5ejv(?Y;yn<<+V76k?Zy0wD~9?}CbP|sD$=6@_3E=t2e ztU!mh9`PvxDDXxd;X&&1Zz)R<0Da|px!49JaWAaHR0WNVjh{(9J=WG6X&D?jf?oXg zvy+ci<=3VMg&g<55bpY?(&Ho>S|5BYjzyn7Wpa2uSC_z#?Vib=;hL->z+X05NqI~Q zX%G(ZNd2bR`@O$HEqwrOT3GKVcLLEF_2ASOv3TeOGh=1Zh)2936ceI)G9d|J5hjO-H5Dxk+RLr4?(QbQsMn>ff{*s3L-p;YxGnIyT&89I~bFW`8 zvgkK_E-0v@wd+6LA{DscgXw;Dwy$THo`>c5I7@&APu0*cpzG*?mWG;UKDmgKpn%20 zlpg?m&$8pzHTbLcT;sJqUPhJB`ckg6lvJ3!Ns70(ce(;MmLBPI{TBp_yA<~cT>dPZ zDfAh$5tmp)fVzE#xtEuhip=-}VD#Pt9!$o(z~GDW}w zwD9f$UHdV6+OzzwZ#;^eKh?)ZGz!e@1{wl(jmiv!U|EN^oNT`k@3IGN37OCN`TX7X zN*7)>XuwwMaR6!y#9aa|z274fc4o*?kUfO)nT#Xy(?V`{HT@|6(W+z1ei=>;(#xOU<7v(FCzbjuKd!3L zDwA`XZ^h@9JjOu5QGOZ=1CiZa@;yYJnORiFvzSZ&|3lYXMpfB;;ociWclv+F8RL98d~gg!aqoNI_gZt!d0oE? zCgCKw53e9BzU7OsRaK+Wn1Z)}H&*pWT%~%;v7)b>Z&C!kk>4GYajM7lzTkM)F1Gz8 zwH*{0t!aEA=xHM7mMNQ}^!42K%$UdB?3S zUPg=N+r6fd@T^$zFTGk^DT0oq2!%vm9{0f|`lzf59h|MAjDN#@@A^_7z{PuM46?iT ziDDaTDR7=N!IWsO!MU4CubIPgsJrQ_0n#HupXhRd`v^$M7V=oi5xH~!ZUD+mgEJl? z?4dyVjQo^iT4&vZ%@EmOa`J~2FF2SB3k8>bkwNwIyPAwsKgb{DZcME2F&1Xa=nvQ3 znT+iG-JL4C+xK($_~SCc!Ja2O^mM=OzuVZbu+kwxT%7DU9*!0QOX`lWv#Kg27c^A2 zjJ{{XB)`#7mhJAaaFL{$unr*=!KP3w?p9-gVI2BDH%SQc)h)Njw0+ZJN3T4e<(>N& zFA_|`3gd03E1n533%IU^&0#)5yh~3P?fzDtrNGf4wmmpFc>GPiSXotrgp7g@X6x%& zS@owoU97)4U%TDjG|Gh%(R^43WzgUL)}By}@fZNuhQzWMG#f3%tNkf+ta|Ve3=MyZ zyp_lhE<2NzkBu6WiyobX24GRlg5<-hP>tsL@|Y{x#?LyQwordvpwu+N%ssu|85LfFBgF*Q*|Lqijn)A-9)=}ES|(mSClcjvwS zG@F^aTJHLlo$>dokD#U1EZzkAam2gCZJrfV(<~Yq$*?5?0zynuZfpb^nvm?t&PP!L zLkC_TZWA)Ca?%428>!QJG1Tz5y<+?<}192r4X>h9o2`6)cM4^lM8z853C zOaJjh9O;HOJjKq%Y5L2AiclaXi3R7-!~7oUuAtRFiDUvE!{45pO@3_|-LmT1eG?-o ztuf*JUUnyJ+L~vo1Tome4y{d9<(L8yI(o*biAkHj8K1v@MG$nCnuK^{NwqAFzoY4i zShUxs>TNYNCW4gZ@w!JXSDK=N^)ryb~BsQSZ_j<^ApdXaTl)`+RIxI^??I?K|sH&9APnW_{1Tl$EXH zK-!@~68G`ZgtGhm0}K!KDNYgtNUnRx<7K?|MTE=RoJtNuO=NNjXC@^d15Q8*#STOV+LN6(BNG9{{@2v1Ijmu#D9r&q93~6k`v0;%UiG zkM)XsdwU>GoAY2~bhOER=*MWVXqu*$#sdmL?f02brlV=di+4P{2&{G9tXgvQ5xIeo z>ZyQMvFfefiA$_2m(!gjScOi8_!&9yxE)VEH_xTRf~;HPRJyJ6^5v7XSD(5jho*_a2D&i1<&^st3>!xULv5nbe)|(e~{SWxcW!XcYmSY9KzmUadY{t z^?SziG@jy`hXV2ae%=D>Q;)j3@m-i#&DOixj+YqpSNsU@x;pzWA?b}On9gFmz0WsP z9j6x-ibx9^D`nbDOAF1k9z1#x*QJmAPKtVPWc`akU0r;9a4;HYUnd?Y@uyLaz?(5&N%kOYZeZ&qLb$WZ2&_-QS09e5lpJwt2(>V%dr8+Ihy z*()H|%4K~sUNtt-nS-4Q=!s7M`zi_KjZ< zJ5%raRFuqgeYkZHrd3`|7=a$3>WsXCoWA=A0@V?q!eCMeVjvV`tQW2k#%L2QsggU8 zff@mi(~ln~57`Ahj-+@?q^Msj?;;~0zze#AzR9*XS%W;W{{?otU(0v=b*Ke(xniua*p)D>1I!5>L*nKTUE}_EKPh^+DVu{^`Kl3&h!l^?!sf(+}Y>SaZ7gX%B~I z66yPN3=H4Dbj9V&{Psg3Nc)%I03Dx<0UE`4c7rRF^?yfWV~405ouNTwh@^RVE&yQ) z$<0pl#ay4HZL9o0WImhsufnPV|PtiZ?XS8ZGlCZRNZkcF@>9haa z(Q(0hLI7D=Is!8==x}#;W5(3g)=@4O;4r1xm-_%#InL^0u|*)jr}6slBroVhjXuqUpgHc-5VyWyW+6rSiZTphz`-<>=+VA z!hru4$?g;rm(_zOwa4^%+H;QY1i(ewE<=W7kOp_9If7;sgEj+-T)Iy5O%exj2ULJRGl|G`^xM$S(w(Ez-MuwPFd@AdSBb zlmg7;2;J*rkMjeQ;@gXm?&Z3gS}5vSF)`D`#eJD?<7=PEriagdy+?0pS}OH3qKrJc zXxx`iGz|!t=Oe!v84$u6GHOUK<>ko{;J4M%0qez_w}0bxV%)DdNdOPIot2d3$uQwU z{F73XIE15!K-pg&rL65WEr*T{AS{jfH*gYAdJ`5J7NJm>N}1BCFLe`Lv>rQJ68oDdRr7`Eb9GC7q6;aG4c9_;12UZeDO6 zF+ul>=q+w1hEOpo0>UbFOjc&br`@|90E~Rv{7itb;4w_n5MLhIL9_F6Q-q&IvF?2a z-K1dw4jK}|ktn|?OMw!bO0?~J#@OfxTU?LJAS?4F)$SWU=KaBCS=j}{B=V%OB8@u; zAg;-&H)$JIy&uB4VNQ3s-zxSV%4F#xu%l$<9h@*D5G$`2FM7#f(8iZg_KFT14`8n{ zpEH#u1s&gm2cfw%9g&l@JhD}DAM|>M%oGJ01t4blpJ$>05}b6OTh|52rG>u3j*gCQ z@-nxu{VkIRM}fzliHyZ`W^8c~9%4wBk&}ahfSr5%)?$PGjjNa_PHbDf_o|C%x|P6J z(7o^FfPgKvIGd}_=Vsw=`}z6Z*dlFFr5BdUZ$`72R8>cS7$PPqc1QTFn0o#iXj4de z4405yiMlL;i(Shf&~aj=y^5D47tb6uig^*2nw639A@}JEf{ebnfx#;RUPXrA45SUY_QxXhu?@-OO~ zkltl~+d8GnrMGBCp06BE3A_5!laM0W-{0>RQaMN?`Lax)7Gf|RYP4k& zCfEyGdDUO?epF|g{ZeW0a`YaDDu>ZxuF|{`U9e06Q4{)`x$l7nnJ$}Jm(n9#!$O`n zO#JK%ov+`1jQVf~3XsZ_C-y3aW=2oe-g#1;aW)PQ3^X}ryK@PPYh+5u2YqM#pS5mLtN8j+8-hS!y|6;gl<)Fz1${$IFewabjt zAqlh^7du=2Qc^{X=c}=f-DT-sz|(E^37v?(#fUpDUs8mdewW%mOqePHUmcBLE_w!- zib$zt@~hgasz?YVk@s;p;@Nu#dl!pKK{aPJw&AZr!mN}=Kw=JoZ4JE6F>PL*TGh6) z_ab0b#0|1Cd7{?Y$lRyLe|ob2I7<5Z;^^?`NKPw;cgD)YTw_9ID3@GLWHKxBi5D|# z=e?TUI%ARc1xV_9in-3iU-XJ@cy#n@Q~rSX%UP=u@{;$jGeQE4>wdk_kD^cF#=VO$ zCI?jm96#Tu=PV+xx`Yc^lBw-5Wj8b+FIE49_}N5mcfT&<(1*`p4()I~iBbM-Wv-Vu z%>Q=0bqjPRyR*&Z)d`FmYS6ppuR`1bdjxbF#+>5mEAJd$z5%Zy^aJ|Xl4kdtUQ0^{ zbuY@8R#Qp_6%Yzm|>&^Wy_#cHSy$-g_Ej$?B3$KlqWq&dK z+Ah~++pSUl3g7!?p|&~nQw%EnloqvX#78f#Bou-_r#`=mfqI+m-N%hsCq1j!Y z8W^Cgy=eP` zV~4Wl(H4mAt==3qKt5GPULM4>xudQd^uJV8JB25G+gSHeFxr+wZp@9+6Uk?pqr_l2 z`A7Gos~>3eI1cVxotPN^E%io8i5govK!7yV^zGYW&Nw*+21f9DZ!9$EL*)tM+g2+9 zK6GGe;sy=MRE!=x=+@k?-E;JQdA+6aCXx}aL!L6iSn&YfT0u^#zVX{}pZM*uFBBOK z=~peSAAmT!HdW2)^096HR|2k7PEp~#cge4htv8nFg%Sf3xNPN!g&>SCgKrC%a4Jtw zMIS3;Beqh?A`NwP8pZyM4i0V%WbmXoS01DKy;^qSgNPLvdud5mqQlVV(LDhhCtb;M z>*a6OBiba%0-g-`{}mQm^F|JDjund;MpVil&WlCSD10Ay8yA`Io!08@+ZvbS$trRl zm=`#C9G2xvQF~lpaG0)|>F<5W{wAe-QmIm(5Vq8p_A=l%nV_3COK@cx+7^!D~@e&lhv;zp=zXae7Sdva>)>Ec4W zEOhuAJ)MVp8;)|0zzS5sVF~r+CGikz9yApHTAcq7NEcjXbjXkfpQDxY_)FsCEIBVXvkF6Vd!4?j`8EPmEDW=^$;Q}aSEvKHeb^|^xGb;lKC97A zR=>Kwpy@3)Q}m}wtE~L|P^Plrf>Diib!U12T1BKW_Yh2k`5|?6a+dlJ&2Nm-IT1kB zKiL|1;wf7dS}C9ED=eygb%{km?W&fYsboH!H04T6LTYYq0e<7|i2?J@s%aP8=n@8J z4v2+`h_d9Ke5I^hu2wvYo=CLyD}wB_Yp4^0_eo2i9@ux_3^I{Wt<&hDs{8l9MH&E1 zHwB7deRI`oa4Rax+L_2;fYvG`}=gsRp5Bz_!3`ligX8|>0IN9@)+3QPd$K#V3J`fZ=BDG1i?Ju@%2FncAYl76$(tThH3FUR2HBxFrSSBrJ!9tw4JOcF9$;ERu$nP8IhzMx^qQtQ)&{u`%>HSi9mPp6s` zyzhPn|1@zJskMoDW^OKz&(+!YW$CA{?@Uc`*`lI|e)0X%^&+ZD?_1lv)vwieF_CxmL6Mf6Ks215g}H2 zvAh|pOsiO#Y(1oqUr?0ib9rL@O1LHNnGsZ)6gZC*qMwJXp^|Kl9-d#p6t^>sEI&7M zq%E~m`?7YbdfAEE#>WRKI2|eEN?uOxb7-hE_237|@H&gPOiqqtgM*|T4ofQq@~+?U zM?-=`P(Y(4Yg$`rU-6WY(SOZYVYEGJ1+p%2*a~a%iUk00U`r-qdVRo-n|pX7f%t4 zv0NUt|C7iwRBcP4N1=De+uO)!@vMg1Jx}r>W_C@DanrRnI=UnLp>A0`oURU>PUD`n z$;m=Hx}&3O;Mwl4h$?0Xa&=kE3jGtNFrQ`sIu(5iE*b{YynWXwe?q_SVf^{M?#e7VZa3=tXgQT2_7hSPP)0fxY~DWhr0SJ683S7#^6= zfB*R%^u0I+^8g`m`TgTNIqb#0Yo~Kh+MYDCPrccNobVJf zEC#~{^R#S|XB(Uu1&j(~1G6(eJPGgYp7{pOy(finPp`wEhJbxM=4-A0BJIsudXa&Z zRY7{eRb~1^$C&=#9;5^rnI^phPlFt5rr+PWr}?MiXY?QR19bjIf#u^fy5NiZXRLZv z{1VRtt*5QdUgKc<2X5nJLDy z$bK2l3Ff?5vzE!%=lhFkruO5`bS#>MbADWQ>MH#MEpt}r~%CN#DVaoAxTdbr%{jtB} zoT$8zC^RkZ2)ga1mXv$}v@yTCh$tu;goj1zQ$>HuX40y-tk2!{o$SE$4QfSVpsZ>>V7azh4kqIU`zj#K1fgAxA5G;ywZ<7s+trA5 zQVJ`Nc2;`Xk3X|4>{RUD$D}ACuT-uo8?Gv%6~lu$J>+4{Kc{D5!3+T+F_==8>d)0SsfB=YsJpX%y@xSh`1{VAuKZ>uI z5*D!(0kBnkATaz9v%ESQ%xR>wWciG?HIYSyvA-|CbT~C{n(Bp(H0(K50P>K|R!4+FhO(&wK^=QGayX|VR=mW7oPT!M$t{Kajpt9ne8 z&VMN2KlHnb%J#_1%}e6*=Hy^@zHOcRUL5s_njz*l(Vp+$FL1CF%XE6d;-X0%c$st< zRb{riM6_hYaia#x#T=EqSJYOW8$W&zT4;Fr4V*pGW{H)_3>HfdOJw{H0jhkN%t`@o zd52hu414axs!MNmvG?!BHd+8dRFX7WrR)W5PO1p#X1Vrd81|F!3o6bkMW`^SG7-9N zYz~<_MM(X+9Z>FtKCKx0x1;CzL@Epf;_X+QDUl*(cJ9-EcA#mOlMLev7*4Yt4yC*o zO-rS_FuLCiesQ#qRNlf8mk>>WFYcQa;Pmj{{}ox&fSE<###E&IV51)U|M#w;`ZRG; zp^9b<@FWQly@CJ(yby6~OCz&$o8`3E=7yyuPb7KZ``JV1UOrREopn!GVrg+JcN|Lu zMY5DbQr?SE84w(p;eNBUrNAM4W;#vWBrKdc2!ATMf%{SPF*Yjyqhe+2_i{9MkPjr# z0?#p_c*uI5)jhqvrSi)$|PkQ9Eo(;4_ z&_x$k98x?FK|!bzs79I75V7b$eCTFYCIJy1BQ}~s<+pxxaZ!UsEKE;PgTOi-41CDg zY+wcr;NiIjnaRV}YuCqwA$%-9-!YL?lS7_t#uc6oyvCmL=&2w&W&a=GDIkwtnq)np z_~Mj_Rdr4B(-0^8RQXWR{oC%A$ZveKk787JnGRMRYA=1JZl7!XI3sx`PL1oF7yLU) zhgbI{@1MTxbJuNjqfcT)&@cD?Onr&QqqtS0x}�rnP4R1We2r*nmwll3_tyhWA#lK7TnkiKsyX4jP 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 literal 0 HcmV?d00001 diff --git a/resources/attachments/coding.png b/resources/attachments/coding.png new file mode 100644 index 0000000000000000000000000000000000000000..089d7e579ca0bfd344e583ebfc25a2cef6980ada GIT binary patch literal 352644 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

-~ON57<0uJSAI; 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

  • Is{>sLpp>$c@*T_Si7ct|84?HRYP5uY@OJT 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 g#V#b004<`F9qW}N^ literal 0 HcmV?d00001 diff --git a/resources/attachments/preview.png b/resources/attachments/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..c40178cc1436dbe9f6cb887580fec7c3eacc7135 GIT binary patch literal 75241 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 z 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
      Bh}SBLe>+xg|%4C7SK3 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 z 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

      6H8)pPn-m85KC6I7^)4Z}=gPIqK8=;SEvrp)tvP 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 a?dd+l?u+Anthropic \ No newline at end of file diff --git a/resources/icons/dark/groq.svg b/resources/icons/dark/groq.svg new file mode 100644 index 0000000..d6195b6 --- /dev/null +++ b/resources/icons/dark/groq.svg @@ -0,0 +1 @@ +Grok \ No newline at end of file diff --git a/resources/icons/dark/lmstudio.svg b/resources/icons/dark/lmstudio.svg new file mode 100644 index 0000000..b95e515 --- /dev/null +++ b/resources/icons/dark/lmstudio.svg @@ -0,0 +1 @@ +LM Studio \ No newline at end of file diff --git a/resources/icons/dark/moonshot.svg b/resources/icons/dark/moonshot.svg new file mode 100644 index 0000000..ed2441a --- /dev/null +++ b/resources/icons/dark/moonshot.svg @@ -0,0 +1 @@ +MoonshotAI \ No newline at end of file diff --git a/resources/icons/dark/ollama.svg b/resources/icons/dark/ollama.svg new file mode 100644 index 0000000..98725cc --- /dev/null +++ b/resources/icons/dark/ollama.svg @@ -0,0 +1 @@ +Ollama \ No newline at end of file diff --git a/resources/icons/dark/openai.svg b/resources/icons/dark/openai.svg new file mode 100644 index 0000000..1a56b9d --- /dev/null +++ b/resources/icons/dark/openai.svg @@ -0,0 +1 @@ +OpenAI \ No newline at end of file diff --git a/resources/icons/dark/openrouter.svg b/resources/icons/dark/openrouter.svg new file mode 100644 index 0000000..07aca9a --- /dev/null +++ b/resources/icons/dark/openrouter.svg @@ -0,0 +1 @@ +OpenRouter \ No newline at end of file diff --git a/resources/icons/dark/perplexity.svg b/resources/icons/dark/perplexity.svg new file mode 100644 index 0000000..5f5a5ab --- /dev/null +++ b/resources/icons/dark/perplexity.svg @@ -0,0 +1 @@ +Perplexity \ No newline at end of file diff --git a/resources/icons/dark/zai.svg b/resources/icons/dark/zai.svg new file mode 100644 index 0000000..4070cf3 --- /dev/null +++ b/resources/icons/dark/zai.svg @@ -0,0 +1 @@ +Z.ai \ No newline at end of file diff --git a/resources/icons/light/anthropic.svg b/resources/icons/light/anthropic.svg new file mode 100644 index 0000000..5b81844 --- /dev/null +++ b/resources/icons/light/anthropic.svg @@ -0,0 +1 @@ +Anthropic \ No newline at end of file diff --git a/resources/icons/light/custom.svg b/resources/icons/light/custom.svg new file mode 100644 index 0000000..e27f876 --- /dev/null +++ b/resources/icons/light/custom.svg @@ -0,0 +1 @@ +OpenAI \ No newline at end of file diff --git a/resources/icons/light/deepseek.svg b/resources/icons/light/deepseek.svg new file mode 100644 index 0000000..3fc2302 --- /dev/null +++ b/resources/icons/light/deepseek.svg @@ -0,0 +1 @@ +DeepSeek \ No newline at end of file diff --git a/resources/icons/light/google.svg b/resources/icons/light/google.svg new file mode 100644 index 0000000..e8e0f86 --- /dev/null +++ b/resources/icons/light/google.svg @@ -0,0 +1 @@ +Google \ No newline at end of file diff --git a/resources/icons/light/groq.svg b/resources/icons/light/groq.svg new file mode 100644 index 0000000..efb1a61 --- /dev/null +++ b/resources/icons/light/groq.svg @@ -0,0 +1 @@ +Grok \ No newline at end of file diff --git a/resources/icons/light/lmstudio.svg b/resources/icons/light/lmstudio.svg new file mode 100644 index 0000000..ea0816b --- /dev/null +++ b/resources/icons/light/lmstudio.svg @@ -0,0 +1 @@ +LM Studio \ No newline at end of file diff --git a/resources/icons/light/moonshot.svg b/resources/icons/light/moonshot.svg new file mode 100644 index 0000000..fb56ac1 --- /dev/null +++ b/resources/icons/light/moonshot.svg @@ -0,0 +1 @@ +MoonshotAI \ No newline at end of file diff --git a/resources/icons/light/ollama.svg b/resources/icons/light/ollama.svg new file mode 100644 index 0000000..cc887e3 --- /dev/null +++ b/resources/icons/light/ollama.svg @@ -0,0 +1 @@ +Ollama \ No newline at end of file diff --git a/resources/icons/light/openai.svg b/resources/icons/light/openai.svg new file mode 100644 index 0000000..78caf4f --- /dev/null +++ b/resources/icons/light/openai.svg @@ -0,0 +1 @@ +OpenAI \ No newline at end of file diff --git a/resources/icons/light/openrouter.svg b/resources/icons/light/openrouter.svg new file mode 100644 index 0000000..07aca9a --- /dev/null +++ b/resources/icons/light/openrouter.svg @@ -0,0 +1 @@ +OpenRouter \ No newline at end of file diff --git a/resources/icons/light/perplexity.svg b/resources/icons/light/perplexity.svg new file mode 100644 index 0000000..5f5a5ab --- /dev/null +++ b/resources/icons/light/perplexity.svg @@ -0,0 +1 @@ +Perplexity \ No newline at end of file diff --git a/resources/icons/light/zai.svg b/resources/icons/light/zai.svg new file mode 100644 index 0000000..04ba2d9 --- /dev/null +++ b/resources/icons/light/zai.svg @@ -0,0 +1 @@ +Z.ai \ No newline at end of file diff --git a/resources/icons/models/claude.svg b/resources/icons/models/claude.svg new file mode 100644 index 0000000..62dc0db --- /dev/null +++ b/resources/icons/models/claude.svg @@ -0,0 +1 @@ +Claude \ No newline at end of file diff --git a/resources/icons/models/deepseek.svg b/resources/icons/models/deepseek.svg new file mode 100644 index 0000000..3fc2302 --- /dev/null +++ b/resources/icons/models/deepseek.svg @@ -0,0 +1 @@ +DeepSeek \ No newline at end of file diff --git a/resources/icons/models/gemini.svg b/resources/icons/models/gemini.svg new file mode 100644 index 0000000..62681df --- /dev/null +++ b/resources/icons/models/gemini.svg @@ -0,0 +1 @@ +Gemini \ No newline at end of file diff --git a/resources/icons/models/gemma.svg b/resources/icons/models/gemma.svg new file mode 100644 index 0000000..92c3a52 --- /dev/null +++ b/resources/icons/models/gemma.svg @@ -0,0 +1 @@ +Gemma \ No newline at end of file diff --git a/resources/icons/models/groq.svg b/resources/icons/models/groq.svg new file mode 100644 index 0000000..efb1a61 --- /dev/null +++ b/resources/icons/models/groq.svg @@ -0,0 +1 @@ +Grok \ No newline at end of file diff --git a/resources/icons/models/kimi.svg b/resources/icons/models/kimi.svg new file mode 100644 index 0000000..83878fa --- /dev/null +++ b/resources/icons/models/kimi.svg @@ -0,0 +1 @@ +Kimi \ No newline at end of file diff --git a/resources/icons/models/llama.svg b/resources/icons/models/llama.svg new file mode 100644 index 0000000..a8a8d94 --- /dev/null +++ b/resources/icons/models/llama.svg @@ -0,0 +1 @@ +Meta \ No newline at end of file diff --git a/resources/icons/models/minimax.svg b/resources/icons/models/minimax.svg new file mode 100644 index 0000000..beb7adb --- /dev/null +++ b/resources/icons/models/minimax.svg @@ -0,0 +1 @@ +Minimax \ No newline at end of file diff --git a/resources/icons/models/mistral.svg b/resources/icons/models/mistral.svg new file mode 100644 index 0000000..8e03e24 --- /dev/null +++ b/resources/icons/models/mistral.svg @@ -0,0 +1 @@ +Mistral \ No newline at end of file diff --git a/resources/icons/models/nemotron.svg b/resources/icons/models/nemotron.svg new file mode 100644 index 0000000..a9683c2 --- /dev/null +++ b/resources/icons/models/nemotron.svg @@ -0,0 +1 @@ +Nvidia \ No newline at end of file diff --git a/resources/icons/models/openai.svg b/resources/icons/models/openai.svg new file mode 100644 index 0000000..78caf4f --- /dev/null +++ b/resources/icons/models/openai.svg @@ -0,0 +1 @@ +OpenAI \ No newline at end of file diff --git a/resources/icons/models/qwen.svg b/resources/icons/models/qwen.svg new file mode 100644 index 0000000..f2d0ada --- /dev/null +++ b/resources/icons/models/qwen.svg @@ -0,0 +1 @@ +Qwen \ No newline at end of file diff --git a/resources/placeholders.txt b/resources/placeholders.txt new file mode 100644 index 0000000..4147f0b --- /dev/null +++ b/resources/placeholders.txt @@ -0,0 +1,255 @@ +Ask anything... +What's on your mind? +How can I help you today? +What would you like to know? +Ask a question... +Where should we start? +What are we working on? +Start typing... +Need a hand with something? +Say something... +What's up? +I'm listening... +What's the topic today? +Fire away... +Ready when you are... +Let's talk... +Type here... +Ask away... +What are you thinking? +Curious about something? +Talk to me... +Input text... +Start a conversation... +Go ahead... +Start here... +What's on your radar? +Speak your mind... +Enter text... +How's it going? +What can I do for you? +Got a question? +Type your thought... +What's new? +Let's chat... +What's cooking? +What do you need? +Tell me something... +How can I assist? +What's on the schedule? +Type away... +Share a thought... +What's happening? +How are things? +Need anything? +What are we discussing? +Write something... +What's on your plate? +Got a query? +Say the word... +What are we diving into? +Ask anything you like... +Type your message here... +What's the plan? +I'm here to help... +What brings you here? +Let's get started... +What shall we talk about? +Anything on your mind? +Enter your prompt... +What's the story? +Pitch in... +Ask a quick question... +What are we exploring? +Start the conversation... +What's on your agenda? +How can I assist you? +What do you want to cover? +Tell me what's up... +Type your note... +What's next? +Let me know what you need... +Ask anything at all... +What are we looking at? +Enter your question... +What's on your wish list? +How can I serve you today? +What's the main focus? +Share your query... +What are we touching on today? +Type your request... +What's the topic of discussion? +Ask me anything... +What do you want to chat about? +Speak up... +What's the big idea? +What are we figuring out? +Let's hear it... +What's the question? +Anything I can clarify? +Drop your thoughts... +What's on your horizon? +How can I help right now? +Type a line... +What are we focusing on? +Open to anything... +Describe what you need... +What are we building today? +Outline your task... +What's the goal for this session? +What project are we tackling? +Describe the problem you're solving... +Enter a command or request... +Define your objective... +What needs to get done? +What are we organizing? +Summarize, rewrite, or analyze... +Describe your target outcome... +What are we fixing today? +Outline a process... +What's the priority task? +Give me an instruction... +What strategy are we planning? +Describe your requirements... +What need can I fill? +Enter a search query or command... +Specify your output format... +Help me complete a task... +What are we optimizing? +Outline your goal... +Tell me your step-by-step goal... +Define the problem statement... +Describe the desired output... +What checklist are we making? +Enter your specs... +Describe the workflow... +What's the main task on your desk? +Help me draft a response... +Provide your parameters... +Outline your main argument... +Input your functional needs... +What system are we designing? +Tell me what to research... +What action item comes next? +Describe your target audience... +What error or issue are we fixing? +Enter your key deliverables... +Help me format this content... +What milestone are we setting? +Give me your main takeaways... +What analysis do you need? +Outline your core feature... +What process are we streamlining? +Enter text to convert or format... +Define the scope of work... +Help me calculate or estimate... +What framework are we using? +What criteria should we apply? +Tell me what to extract... +Describe the user journey... +What checklist item is next? +Give me the primary objectives... +Enter your task parameters... +What summary format do you prefer? +Outline the next steps... +What solution are we building? +Input text to categorize... +What guidelines should I follow? +Describe the operational goal... +What roadmap are we building? +Give me the key parameters... +Outline the structure... +What workflow needs cleaning up? +Tell me the target output... +What deliverable are we tackling? +Enter your task execution prompt... +Inspire me... +Pitch an idea... +What are we creating? +Let's brainstorm... +Give me a concept... +What story are we telling? +Throw some ideas at me... +Outline your thought... +Need help writing? +Imagine a scenario... +What's the vision? +Paint me a picture... +Give me a plot twist... +What world are we building? +Drop a creative prompt... +Write an opening line... +What's the big artistic idea? +Spin me a tale... +Let's name something... +What character are we inventing? +Write a poem or song lyric... +What theme are we exploring? +Spark a new direction... +Give me five random concepts... +What's the creative angle? +Help me write a scene... +Describe a wild setting... +Let's invent a title... +What tagline should we write? +Pitch a brand identity... +Give me a fun hook... +What trope are we twisting? +Write a compelling headline... +Let me hear a metaphor... +Describe a dream project... +What aesthetic are we going for? +What's the wild card idea? +Spark your imagination... +Need a fresh perspective? +Compose a short story snippet... +What's a unique angle? +Give me a catchy phrase... +Let's write some dialogue... +Give me a creative metaphor... +Help me finish this verse... +What's your craziest idea? +Craft a unique character flaw... +Let's invent a world... +Describe a fantasy realm... +Give me a creative title option... +What's the narrative arc? +Brainstorm five catchy names... +Write a sci-fi premise... +Give me a fresh design direction... +What's the emotional core here? +Let's draft a slogan... +Imagine a world where... +Give me a unique plot device... +What's the artistic vision? +Describe a scene using all five senses... +Give me a punchy tagline... +Let's write a dramatic monologue... +What if...? +Invent a fictional brand name... +Write an opening paragraph... +What's the tone of this piece? +Give me an unconventional solution... +Describe a futuristic device... +Let's rethink this concept... +Give me a creative prompt... +What style should we try? +Write a song chorus... +What's the visual metaphor? +Give me a surreal concept... +Let's invent a backstory... +Write a micro-fiction piece... +What's the creative spark? +Describe a hero's dilemma... +Give me a fun creative challenge... +Write a compelling teaser... +Let's brainstorm logo concepts... +What's a novel approach? +Describe a unique atmosphere... +Give me a poetic description... +Help me write a dramatic reveal... +What's the underlying theme? +Write an intriguing riddle... +Give me an artistic concept... +Imagine a new genre... +What masterpiece are we starting? \ No newline at end of file diff --git a/resources/pondering.txt b/resources/pondering.txt new file mode 100644 index 0000000..1e8cfc0 --- /dev/null +++ b/resources/pondering.txt @@ -0,0 +1,100 @@ +Analyzing your input +Processing request +Synthesizing data +Generating response +Formulating answer +Brainstorming ideas +Connecting neural pathways +Parsing context +Sifting through data +Organizing thoughts +Aligning vectors +Computing probabilities +Structuring information +Refining output +Drafting response +Retrieving context +Evaluating variables +Constructing reply +Mapping semantic connections +Optimizing parameters +Reviewing data points +Deciphering intent +Deep learning in progress +Querying internal knowledge +Assessing optimal pathways +Compiling relevant insights +Weaving words together +Translating concepts +Polishing final draft +Formatting response +Calculating logic trees +Generating insights +Distilling complex ideas +Assembling the pieces +Laying out concepts +Sifting through possibilities +Generating solutions +Resolving query parameters +Navigating database +Running calculations +Contextualizing prompt +Deriving logical conclusions +Establishing connections +Scanning semantic network +Streamlining thoughts +Formatting output +Shaping perspective +Extracting key themes +Synthesizing multiple viewpoints +Processing natural language +Re-evaluating context +Running neural simulations +Constructing logical flow +Gathering relevant data +Analyzing syntax +Aligning with parameters +Determining ideal response +Crafting explanations +Formulating precise terminology +Processing semantic relationships +Decoding query +Integrating background knowledge +Building contextual framework +Mapping out thoughts +Developing comprehensive answer +Sorting information hierarchy +Tailoring output to request +Synthesizing structured response +Executing reasoning protocols +Performing sentiment analysis +Sifting through context windows +Evaluating syntax structure +Generating coherent thoughts +Refining language patterns +Checking for factual consistency +Organizing logical progression +Establishing narrative flow +Dissecting user prompt +Searching latent space +Querying semantic memory +Reconstructing concepts +Formulating strategic response +Balancing multiple constraints +Resolving ambiguous terms +Simulating potential outputs +Fine-tuning the phrasing +Preparing output stream +Consolidating knowledge bases +Reviewing semantic constraints +Running background processes +Generating appropriate tone +Parsing logical structures +Synthesizing abstract concepts +Calculating response weights +Conducting linguistic analysis +Polishing sentence structures +Finalizing response generation +Initiating final output stream +Structuring logical arguments +Compiling final insights \ No newline at end of file diff --git a/src/components/BrandIcon.qml b/src/components/BrandIcon.qml new file mode 100644 index 0000000..d7921b5 --- /dev/null +++ b/src/components/BrandIcon.qml @@ -0,0 +1,65 @@ +import QtQuick +import qs.Common + +// Theme-aware brand icon: stem resolved against icons//.svg +// then icons/models/.svg; nothing renders when absent. Theme is +// detected by surface luminance. +Item { + id: root + + property string stem: "" + property int size: 20 + + width: size + height: size + implicitWidth: size + implicitHeight: size + + readonly property bool dark: + (Theme.surface.r * 0.299 + Theme.surface.g * 0.587 + + Theme.surface.b * 0.114) < 0.5 + + readonly property string _primary: stem.length > 0 + ? Qt.resolvedUrl("../../resources/icons/" + + (dark ? "dark" : "light") + "/" + stem + ".svg").toString() + : "" + readonly property string _alt: stem.length > 0 + ? Qt.resolvedUrl("../../resources/icons/" + + (dark ? "light" : "dark") + "/" + stem + ".svg").toString() + : "" + readonly property string _model: stem.length > 0 + ? Qt.resolvedUrl("../../resources/icons/models/" + stem + ".svg").toString() + : "" + + Image { + id: primaryImg + anchors.fill: parent + source: root._primary + sourceSize: Qt.size(width * 2, height * 2) + fillMode: Image.PreserveAspectFit + mipmap: true + visible: status === Image.Ready + } + + Image { + id: altImg + anchors.fill: parent + source: root._alt + sourceSize: Qt.size(width * 2, height * 2) + fillMode: Image.PreserveAspectFit + mipmap: true + visible: primaryImg.status !== Image.Ready && status === Image.Ready + } + + Image { + id: modelImg + anchors.fill: parent + source: root._model + sourceSize: Qt.size(width * 2, height * 2) + fillMode: Image.PreserveAspectFit + mipmap: true + visible: primaryImg.status !== Image.Ready + && altImg.status !== Image.Ready && status === Image.Ready + } + +} diff --git a/src/components/BubbleTip.qml b/src/components/BubbleTip.qml new file mode 100644 index 0000000..ffb99b9 --- /dev/null +++ b/src/components/BubbleTip.qml @@ -0,0 +1,135 @@ +import QtQuick +import QtQuick.Controls +import qs.Common + +// Comic speech-bubble tooltip: rounded body with a tail that merges +// into the body outline (one continuous path, no seam line across the +// junction). Expects to be hosted as a Popup parented to the chip it +// describes, centered above it. Shows after hovering the anchor for +// `delay` ms and closes as soon as the pointer leaves — drive it via +// `hovering` from the anchor's HoverHandler.onHoveredChanged. +Popup { + id: tip + + property string tipText: "" + // Set from outside: true while the pointer is over the anchor. + property bool hovering: false + // Hover dwell time before the bubble pops. + property int delay: 500 + + readonly property real bodyHeight: bodyText.implicitHeight + 14 + readonly property real tailLength: 9 + + onHoveringChanged: { + if (hovering) { + armTimer.restart(); + } else { + armTimer.stop(); + if (opened) close(); + } + } + + Timer { + id: armTimer + interval: tip.delay + onTriggered: tip.open() + } + + width: Math.min(bodyText.implicitWidth + 20, 240) + height: bodyHeight + tailLength + padding: 0 + background: null + closePolicy: Popup.NoAutoClose + + // Centered above the anchor, parent-relative — the same proven + // coordinate pattern as the composer's popups (no popup-layer + // mapping, which evaluates unreliably while closed). + x: (parent.width - width) / 2 + y: -height - 1 + + enter: Transition { + NumberAnimation { + property: "opacity" + from: 0 + to: 1 + duration: 150 + easing.type: Easing.OutCubic + } + } + exit: Transition { + NumberAnimation { + property: "opacity" + to: 0 + duration: 120 + easing.type: Easing.InCubic + } + } + + // QColor → CSS rgba(): Canvas's fillStyle parses #rrggbb but not + // Qt's #aarrggbb toString form, so build the string manually. + function css(c) { + return "rgba(" + Math.round(c.r * 255) + "," + Math.round(c.g * 255) + + "," + Math.round(c.b * 255) + "," + c.a + ")"; + } + + contentItem: Item { + implicitWidth: tip.width + implicitHeight: tip.height + + Canvas { + id: bubble + anchors.fill: parent + antialiasing: true + + onPaint: { + var ctx = getContext("2d"); + ctx.clearRect(0, 0, width, height); + var w = width; + var bh = tip.bodyHeight; + var th = tip.tailLength; + var cx = w / 2; + var tw = 7; // tail half-width + var r = 10; // body corner radius + // One continuous outline: rounded rect whose bottom + // edge flows out into the tail and back — the tail + // reads as part of the bubble, not a glued-on arrow. + ctx.beginPath(); + ctx.moveTo(r, 0.5); + ctx.lineTo(w - r, 0.5); + ctx.arcTo(w, 0.5, w, r + 0.5, r); + ctx.lineTo(w, bh - r); + ctx.arcTo(w, bh + 0.5, w - r, bh + 0.5, r); + ctx.lineTo(cx + tw, bh + 0.5); + ctx.lineTo(cx, bh + th); + ctx.lineTo(cx - tw, bh + 0.5); + ctx.lineTo(r, bh + 0.5); + ctx.arcTo(0, bh + 0.5, 0, bh - r, r); + ctx.lineTo(0, r + 0.5); + ctx.arcTo(0, 0.5, r, 0.5, r); + ctx.closePath(); + ctx.fillStyle = tip.css(Theme.surfaceContainerHigh); + ctx.fill(); + ctx.lineWidth = 1; + ctx.strokeStyle = tip.css(Theme.outlineVariant); + ctx.stroke(); + } + // Canvas never auto-repaints on resize/show. + onWidthChanged: requestPaint() + onHeightChanged: requestPaint() + onVisibleChanged: if (visible) requestPaint() + Component.onCompleted: requestPaint() + } + + Text { + id: bodyText + x: (parent.width - width) / 2 + y: 7 + width: Math.min(implicitWidth, tip.width - 20) + text: tip.tipText + color: Theme.surfaceText + font.pixelSize: 12 + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + } + } +} diff --git a/src/components/ChatComposer.qml b/src/components/ChatComposer.qml new file mode 100644 index 0000000..7636395 --- /dev/null +++ b/src/components/ChatComposer.qml @@ -0,0 +1,703 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import Quickshell +import Quickshell.Io +import qs.Common +import qs.Widgets +import qs.Modals.FileBrowser +import "../lib/Providers.js" as Providers + + // Composer: transparent input, send/stop right; input grows to a + // cap then scrolls. Attachments stage above the input (clipboard + // or file picker) and pass Providers.sanitizeImages. +Item { + id: composer + + signal submitted(string text, var images) + signal escapePressed() + signal newChatRequested() + + property var service: null + property string placeholder: "Ask anything…" + readonly property bool busy: service ? service.isStreaming : false + + // Staged image attachments ([{mime, data}]), capped by + // sanitizeImages (4). attachHint surfaces a rejection reason + // briefly, then auto-clears. + readonly property int maxImages: 4 + property var attachments: [] + property string attachHint: "" + + // Input grows with content up to ~10 lines, then scrolls internally. + readonly property int maxInputHeight: 220 + + implicitHeight: divider.height + 12 + + (thumbStrip.visible ? thumbStrip.height + 8 : 0) + + Math.max(48, Math.min(input.implicitHeight, maxInputHeight)) + + function send() { + var text = input.text.trim(); + if (busy) return; + if (!text && composer.attachments.length === 0) return; + submitted(text, composer.attachments); + input.clear(); + composer.attachments = []; + attachHint = ""; + } + + function showAttachHint(msg) { + attachHint = String(msg || ""); + hintTimer.restart(); + } + + // Single ingest gate: sanitize (mime whitelist, base64 shape, size, + // cap) then stage. Reports a transient hint when the new image was + // rejected. + function addAttachment(mime, data) { + var before = composer.attachments.length; + var clean = Providers.sanitizeImages( + composer.attachments.concat([{ mime: mime, data: data }]), + composer.maxImages); + composer.attachments = clean; + showAttachHint(clean.length > before + ? "" : "Image dropped — unsupported type, over 10 MB, or limit of " + + composer.maxImages + " reached"); + } + + function removeAttachment(idx) { + var arr = composer.attachments.slice(); + if (idx < 0 || idx >= arr.length) return; + arr.splice(idx, 1); + composer.attachments = arr; + if (arr.length === 0) attachHint = ""; + } + + // Clipboard ingest: ask wl-paste for the offered types; on an + // image, re-read that type as base64. Without an image the key + // press falls through to a normal text paste. + function pasteFromClipboard() { + clipProc.phase = 1; + clipProc.command = ["wl-paste", "--list-types"]; + clipProc.running = true; + } + + function pickImageMime(typesText) { + var types = String(typesText).split("\n").map( + function (t) { return t.trim(); }); + var prefs = ["image/png", "image/jpeg", "image/webp", "image/gif"]; + for (var i = 0; i < prefs.length; i++) + if (types.indexOf(prefs[i]) >= 0) return prefs[i]; + return ""; + } + + // Magic-byte sniffing over the base64 head: PNG \x89PNG, JPEG + // \xFF\xD8\xFF, WEBP RIFF, GIF8. "" for anything else. + function sniffImageMime(b64) { + if (b64.indexOf("iVBOR") === 0) return "image/png"; + if (b64.indexOf("/9j/") === 0) return "image/jpeg"; + if (b64.indexOf("UklGR") === 0) return "image/webp"; + if (b64.indexOf("R0lGOD") === 0) return "image/gif"; + return ""; + } + + // File picker: DMS's native FileBrowser modal — Qt's FileDialog + // (GTK3 helper) aborts the whole shell process here. + function attachFromFile() { + imageBrowserLoader.active = true; + if (imageBrowserLoader.item) + imageBrowserLoader.item.open(); + } + + function ingestFilePath(path) { + if (!path || path.length === 0) return; + var p = String(path).replace(/'/g, "'\\''"); + fileProc.command = ["sh", "-c", "base64 -w0 '" + p + "'"]; + fileProc.running = true; + } + + // Discard an in-progress edit: leave edit mode and clear the + // draft, returning the composer to normal new-message state. + function discardEdit() { + if (service) service.cancelEditUserMessage(); + input.clear(); + focusInput(); + } + + function focusInput() { + input.forceActiveFocus(); + input.cursorPosition = input.text.length; + } + + // Modifier flags required for Enter to send. + readonly property int sendModifiers: { + var m = service ? service.sendModifier : "none"; + if (m === "shift") return Qt.ShiftModifier; + if (m === "ctrl") return Qt.ControlModifier; + if (m === "alt") return Qt.AltModifier; + return Qt.NoModifier; + } + + // Enter fires a send only for the configured chord; every other + // chord falls through (accepted = false) and inserts a newline. + // KeypadModifier is masked so numpad Enter matches Key_Enter. + function handleReturnKey(event) { + var mods = event.modifiers & ~Qt.KeypadModifier; + if (mods === composer.sendModifiers) composer.send(); + else event.accepted = false; + } + + // Load a draft into the input (used by message editing: the text + // of the edited user message lands here; submitting performs the + // edit — see NexusChat's onSubmitted routing). + function setText(t) { + input.text = String(t || ""); + input.cursorPosition = input.text.length; + } + + Rectangle { + id: divider + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + height: 1 + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 0.0; color: "transparent" } + GradientStop { position: 0.5; color: Theme.primary } + GradientStop { position: 1.0; color: "transparent" } + } + } + + // Staged attachment thumbnails + rejection hint. Zero-height while + // empty so the input row sits right under the divider. + Row { + id: thumbStrip + visible: composer.attachments.length > 0 || composer.attachHint.length > 0 + anchors.top: divider.bottom + anchors.topMargin: 8 + anchors.left: parent.left + anchors.leftMargin: 4 + anchors.right: parent.right + anchors.rightMargin: 4 + spacing: 8 + + Repeater { + model: composer.attachments.length + + delegate: Item { + id: thumb + required property int index + width: 92 + height: 68 + + Rectangle { + anchors.fill: parent + radius: 6 + color: Theme.withAlpha(Theme.surfaceContainerLowest, 0.6) + clip: true + + Image { + anchors.fill: parent + asynchronous: true + fillMode: Image.PreserveAspectCrop + source: composer.attachments[thumb.index] + ? "data:" + composer.attachments[thumb.index].mime + + ";base64," + composer.attachments[thumb.index].data + : "" + } + } + + // Remove badge: overlaps the top-right corner. + Item { + anchors.right: parent.right + anchors.top: parent.top + anchors.rightMargin: -6 + anchors.topMargin: -6 + width: 20 + height: 20 + + Rectangle { + anchors.fill: parent + radius: 10 + color: thumbRemoveHover.hovered + ? Theme.withAlpha(Theme.primary, 0.25) + : Theme.surfaceContainerHigh + border.width: 1 + border.color: Theme.outlineVariant + } + DankIcon { + anchors.centerIn: parent + name: "close" + size: 12 + color: thumbRemoveHover.hovered + ? Theme.primary : Theme.surfaceText + } + HoverHandler { + id: thumbRemoveHover + cursorShape: Qt.PointingHandCursor + } + TapHandler { + onTapped: composer.removeAttachment(thumb.index) + } + } + } + } + + Text { + visible: composer.attachHint.length > 0 + text: composer.attachHint + color: Theme.error + font.pixelSize: 11 + anchors.verticalCenter: parent.verticalCenter + } + } + + RowLayout { + anchors.top: thumbStrip.visible ? thumbStrip.bottom : divider.bottom + anchors.topMargin: 8 + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.leftMargin: 4 + anchors.rightMargin: 4 + anchors.bottomMargin: 4 + spacing: 8 + + Flickable { + id: inputScroll + Layout.fillWidth: true + Layout.alignment: Qt.AlignVCenter + Layout.maximumHeight: composer.maxInputHeight + Layout.preferredHeight: Math.min(input.implicitHeight, composer.maxInputHeight) + contentHeight: input.contentHeight + clip: true + interactive: contentHeight > height + flickableDirection: Flickable.VerticalFlick + + ScrollBar.vertical: DankScrollbar { _scrollBarActive: true } + + TextEdit { + id: input + width: inputScroll.width + textFormat: TextEdit.PlainText + wrapMode: TextEdit.Wrap + color: Theme.surfaceText + font.pixelSize: 14 + + // keep the cursor visible while typing past the cap + onCursorRectangleChanged: { + var y = cursorRectangle.y - inputScroll.contentY; + if (y < 0) + inputScroll.contentY += y; + else if (y + cursorRectangle.height > inputScroll.height) + inputScroll.contentY += y + cursorRectangle.height - inputScroll.height; + } + + Keys.onEscapePressed: (event) => { + event.accepted = true; + composer.escapePressed(); + } + Keys.onPressed: (event) => { + if ((event.modifiers & Qt.ControlModifier) && event.key === Qt.Key_N) { + event.accepted = true; + composer.newChatRequested(); + return; + } + // Ctrl+V: an image on the clipboard is staged as an + // attachment; plain text falls through to the + // normal paste inside pasteFromClipboard's flow. + if ((event.modifiers & Qt.ControlModifier) && event.key === Qt.Key_V) { + event.accepted = true; + composer.pasteFromClipboard(); + return; + } + // Up in an empty input = edit the last user message + // (Slack/Discord convention). Non-empty inputs keep + // normal cursor navigation. + if (event.key === Qt.Key_Up && input.text.length === 0 + && !busy && service && service.messageCount > 0) { + event.accepted = true; + service.beginEditLastUserMessage(); + } + } + Keys.onReturnPressed: (event) => handleReturnKey(event) + Keys.onEnterPressed: (event) => handleReturnKey(event) + } + + // Placeholder: sits exactly where typing starts, non- + // interactive so clicks land on the input. Shown only for a + // brand-new chat (no messages yet); re-rolled on clear. + Text { + anchors.left: parent.left + anchors.top: parent.top + width: input.width + text: composer.placeholder + color: Theme.surfaceVariantText + opacity: 0.5 + font.pixelSize: 14 + visible: input.text.length === 0 + && (!composer.service || composer.service.messageCount === 0) + } + } + + // Discard affordance while a message edit is in progress: + // drops the draft and leaves edit mode. + DankButton { + iconName: "close" + text: "" + buttonHeight: 36 + Layout.alignment: Qt.AlignVCenter + visible: !busy && service && service.editingMessageId.length > 0 + onClicked: composer.discardEdit() + } + + // Split send button: left half = send/stop/confirm-edit, right + // half = chord picker. Hover/press brightens only that half. + Rectangle { + id: splitSend + height: 36 + radius: Theme.cornerRadius + Layout.alignment: Qt.AlignVCenter + implicitWidth: sendZone.width + arrowZone.width + color: Theme.buttonBg + readonly property bool sendHover: sendArea.containsMouse + readonly property bool sendPressed: sendArea.pressed + readonly property bool arrowHover: arrowArea.containsMouse + readonly property bool arrowPressed: arrowArea.pressed + // Split line as a gradient position (0..1). + readonly property real splitPos: + sendZone.width / Math.max(1, width) + + // Rest shading: gradient hard-stops at the split line so + // the tint rounds cleanly into the corners. + Rectangle { + anchors.fill: parent + radius: splitSend.radius + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 0; color: "transparent" } + GradientStop { + position: splitSend.splitPos + color: "transparent" + } + GradientStop { + position: Math.min(1, splitSend.splitPos + 0.001) + color: Theme.withAlpha(Theme.buttonText, 0.10) + } + GradientStop { + position: 1 + color: Theme.withAlpha(Theme.buttonText, 0.10) + } + } + } + + // Disabled veil on the send half only (picker stays lit). + Rectangle { + anchors.fill: parent + radius: splitSend.radius + opacity: sendArea.enabled ? 0 : 0.55 + Behavior on opacity { NumberAnimation { duration: 180 } } + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 0; color: Theme.surfaceContainer } + GradientStop { + position: splitSend.splitPos + color: Theme.surfaceContainer + } + GradientStop { + position: Math.min(1, splitSend.splitPos + 0.001) + color: "transparent" + } + GradientStop { position: 1; color: "transparent" } + } + } + + // White hover/press wash (buttonText tints misbehave on + // some buttonBg modes); hard-stops at the split line. + Rectangle { + anchors.fill: parent + radius: splitSend.radius + opacity: splitSend.sendHover || splitSend.sendPressed ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 180 } } + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { + position: 0 + color: splitSend.sendPressed + ? Qt.rgba(1, 1, 1, 0.20) : Qt.rgba(1, 1, 1, 0.12) + } + GradientStop { + position: splitSend.splitPos + color: splitSend.sendPressed + ? Qt.rgba(1, 1, 1, 0.20) : Qt.rgba(1, 1, 1, 0.12) + } + GradientStop { + position: Math.min(1, splitSend.splitPos + 0.001) + color: "transparent" + } + GradientStop { position: 1; color: "transparent" } + } + } + + Rectangle { + anchors.fill: parent + radius: splitSend.radius + opacity: splitSend.arrowHover || splitSend.arrowPressed ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 180 } } + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 0; color: "transparent" } + GradientStop { + position: splitSend.splitPos + color: "transparent" + } + GradientStop { + position: Math.min(1, splitSend.splitPos + 0.001) + color: splitSend.arrowPressed + ? Qt.rgba(1, 1, 1, 0.20) : Qt.rgba(1, 1, 1, 0.12) + } + GradientStop { + position: 1 + color: splitSend.arrowPressed + ? Qt.rgba(1, 1, 1, 0.20) : Qt.rgba(1, 1, 1, 0.12) + } + } + } + + // Left half: send / stop streaming / confirm edit. Dimmed + // when there is nothing to do (empty input, idle). + Item { + id: sendZone + anchors.left: parent.left + width: 64 + height: parent.height + + DankIcon { + anchors.centerIn: parent + name: busy ? "stop_circle" + : (service && service.editingMessageId.length > 0 + ? "check" : "send") + size: 18 + color: Theme.buttonText + opacity: sendArea.enabled ? 1 : 0.4 + Behavior on opacity { NumberAnimation { duration: 180 } } + } + + MouseArea { + id: sendArea + anchors.fill: parent + hoverEnabled: true + enabled: busy || input.text.trim().length > 0 + || composer.attachments.length > 0 + cursorShape: enabled ? Qt.PointingHandCursor + : Qt.ArrowCursor + onClicked: { + if (busy) service.cancelStream(); + else composer.send(); + } + } + } + + // Right half: send-chord picker (always active). + Item { + id: arrowZone + anchors.right: parent.right + width: 30 + height: parent.height + + DankIcon { + anchors.centerIn: parent + name: "arrow_drop_down" + size: 18 + color: Theme.buttonText + } + + MouseArea { + id: arrowArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: modPopup.visible ? modPopup.close() + : modPopup.open() + } + } + } + + // Send-chord picker: opens above the composer, right-aligned + // to the split button. + Popup { + id: modPopup + parent: arrowZone + x: parent.width - width + y: -height - 8 + width: 168 + height: modCol.implicitHeight + 12 + padding: 6 + + background: Rectangle { + radius: 8 + color: Theme.surfaceContainerHigh + border.width: 1 + border.color: Theme.outlineVariant + } + + contentItem: ColumnLayout { + id: modCol + spacing: 2 + + Repeater { + model: [ + { key: "none", label: "Return only", icon: "keyboard_return" }, + { key: "shift", label: "Shift", icon: "shift" }, + { key: "ctrl", label: "Ctrl", icon: "keyboard" }, + { key: "alt", label: "Alt", icon: "buttons_alt" } + ] + + delegate: Item { + id: modRow + required property var modelData + readonly property bool active: composer.service + && composer.service.sendModifier === modRow.modelData.key + readonly property bool hovered: modHover.hovered + width: modCol.width + height: 32 + + Rectangle { + anchors.fill: parent + radius: 6 + color: modRow.hovered + ? Theme.withAlpha(Theme.primary, 0.14) : "transparent" + Behavior on color { ColorAnimation { duration: 150 } } + } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 10 + anchors.rightMargin: 10 + spacing: 8 + + DankIcon { + name: modRow.modelData.icon + size: 16 + color: modRow.active || modRow.hovered + ? Theme.primary : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 150 } } + } + + Text { + Layout.fillWidth: true + text: modRow.modelData.label + color: modRow.active || modRow.hovered + ? Theme.primary : Theme.surfaceText + font.pixelSize: 13 + elide: Text.ElideRight + } + + DankIcon { + visible: modRow.active + name: "check" + size: 16 + color: Theme.primary + } + } + + HoverHandler { + id: modHover + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: { + if (composer.service) + composer.service.setSendModifier(modRow.modelData.key); + modPopup.close(); + } + } + } + } + } + } + + // ── Attachment ingest (clipboard) ────────────────────────── + Process { + id: clipProc + property int phase: 0 // 0 idle | 1 types | 2 data + property string _mime: "" + command: ["true"] + + stdout: StdioCollector { + id: clipOut + onStreamFinished: { + if (clipProc.phase === 1) { + var pick = composer.pickImageMime(clipOut.text); + if (pick.length === 0) { + clipProc.phase = 0; + input.paste(); + return; + } + clipProc._mime = pick; + clipProc.phase = 2; + clipProc.command = ["sh", "-c", + "wl-paste -t '" + pick + "' | base64 -w0"]; + clipProc.running = true; + } else if (clipProc.phase === 2) { + var b64 = clipOut.text.replace(/\s+/g, ""); + clipProc.phase = 0; + if (b64.length > 0) + composer.addAttachment(clipProc._mime, b64); + } + } + } + } + + // Picked file bytes → base64; the mime is sniffed from the + // magic bytes rather than trusting the extension. + Process { + id: fileProc + command: ["true"] + + stdout: StdioCollector { + id: fileOut + onStreamFinished: { + var b64 = fileOut.text.replace(/\s+/g, ""); + var mime = composer.sniffImageMime(b64); + if (mime.length > 0) + composer.addAttachment(mime, b64); + else + composer.showAttachHint("Unsupported image type"); + } + } + } + + // Native DMS file browser, lazily created on first use and + // dropped again when it closes (same pattern as Notepad). + LazyLoader { + id: imageBrowserLoader + active: false + + FileBrowserSurfaceModal { + browserTitle: "Attach image" + browserIcon: "attach_file" + browserType: "nexus_attach" + fileExtensions: ["*.png", "*.jpg", "*.jpeg", "*.webp", "*.gif"] + allowStacking: true + + onFileSelected: (path) => { + close(); + var p = String(path).replace(/^file:\/\//, ""); + try { p = decodeURIComponent(p); } + catch (e) { /* literal % in the name — keep raw */ } + composer.ingestFilePath(p); + } + onDialogClosed: imageBrowserLoader.active = false + } + } + + Timer { + id: hintTimer + interval: 4000 + onTriggered: composer.attachHint = "" + } + } +} diff --git a/src/components/ContextMeter.qml b/src/components/ContextMeter.qml new file mode 100644 index 0000000..bbe59b3 --- /dev/null +++ b/src/components/ContextMeter.qml @@ -0,0 +1,158 @@ +import QtQuick +import QtQuick.Shapes +import qs.Common +import "../lib/ContextWindows.js" as ContextWindows + +// Context usage meter (composer bar, far right): [pct][ring]; hover +// slides them left and fades in the token counts over an opaque +// backdrop. Width animates; anchored right OUTSIDE the RowLayout so +// the chat box is never re-flowed. + +Item { + id: meter + + property var service: null + + readonly property var usage: service ? service.lastUsage : null + readonly property int usedTokens: usage + ? (usage.input || 0) + (usage.output || 0) : 0 + readonly property int window_: service ? service.contextWindow : 0 + readonly property real pct: window_ > 0 + ? Math.max(0, Math.min(usedTokens / window_, 0.999)) : 0 + readonly property bool showPct: window_ > 0 + readonly property bool expanded: meterHover.hovered + + readonly property int ringSize: 20 + readonly property int gap: 5 + readonly property int tokensWidth: expanded && tokensLabel.implicitWidth > 0 + ? tokensLabel.implicitWidth + gap : 0 + + visible: usage !== null + + // Anchored raw Items don't size from implicitWidth — unpinned, + // the meter collapses to width 0 and the layer crops the ring. + implicitWidth: (showPct ? pctLabel.implicitWidth + gap : 0) + + ringSize + tokensWidth + width: implicitWidth + implicitHeight: ringSize + height: implicitHeight + Behavior on implicitWidth { + NumberAnimation { duration: 250; easing.type: Easing.OutCubic } + } + + // Opaque backdrop: keeps the meter legible over the bar's chips. + Rectangle { + id: hoverBackdrop + x: -4 + y: -4 + width: meter.width + 8 + height: meter.height + 8 + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainer, 0.97) + border.color: Theme.surfaceVariantAlpha + border.width: 1 + opacity: meter.expanded ? 1 : 0 + visible: opacity > 0.01 + Behavior on opacity { NumberAnimation { duration: 200 } } + } + + Text { + id: pctLabel + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + visible: meter.showPct + text: Math.round(meter.pct * 100) + "%" + color: Theme.surfaceText + font.pixelSize: 11 + } + + Item { + id: ring + x: pctLabel.visible ? pctLabel.implicitWidth + meter.gap : 0 + anchors.verticalCenter: parent.verticalCenter + width: meter.ringSize + height: meter.ringSize + + // Consumed fraction of the window; clamped to 99.9% (a 360° + // PathArc degenerates). + property real progress: meter.pct + Behavior on progress { + NumberAnimation { duration: 600; easing.type: Easing.OutCubic } + } + readonly property real cx: width / 2 + readonly property real cy: height / 2 + readonly property real rr: width / 2 - 2 + readonly property real sweep: Math.PI * 2 + * Math.max(progress, 0.02) + + Shape { + anchors.fill: parent + antialiasing: true + + // Track: mid-gray full circle (two 180° arcs) — legible + // on both themes. + ShapePath { + strokeColor: Theme.withAlpha( + Theme.surfaceVariantText, 0.55) + strokeWidth: 3 + fillColor: "transparent" + capStyle: ShapePath.Round + startX: ring.cx + startY: ring.cy - ring.rr + PathArc { + x: ring.cx; y: ring.cy + ring.rr + radiusX: ring.rr; radiusY: ring.rr + } + PathArc { + x: ring.cx; y: ring.cy - ring.rr + radiusX: ring.rr; radiusY: ring.rr + } + } + + // Progress arc from 12 o'clock, clockwise. + ShapePath { + strokeColor: Theme.primary + strokeWidth: 3 + fillColor: "transparent" + capStyle: ShapePath.Round + startX: ring.cx + startY: ring.cy - ring.rr + PathArc { + x: ring.cx + ring.rr * Math.cos( + -Math.PI / 2 + ring.sweep) + y: ring.cy + ring.rr * Math.sin( + -Math.PI / 2 + ring.sweep) + radiusX: ring.rr; radiusY: ring.rr + useLargeArc: ring.sweep > Math.PI + } + } + } + } + + // Exact counts, to the ring's right — revealed on hover as the + // meter's width grows leftward. + Text { + id: tokensLabel + anchors.left: ring.right + anchors.leftMargin: meter.gap + anchors.verticalCenter: parent.verticalCenter + opacity: meter.expanded ? 1 : 0 + visible: opacity > 0.01 + text: meter.window_ > 0 + ? ContextWindows.formatTokens(meter.usedTokens) + " / " + + ContextWindows.formatTokens(meter.window_) + : ContextWindows.formatTokens(meter.usedTokens) + " tok" + color: Theme.surfaceText + font.pixelSize: 11 + Behavior on opacity { NumberAnimation { duration: 200 } } + } + + // Padded so hovering the backdrop's overhang doesn't flicker. + Item { + x: -4 + y: -7 + width: meter.width + 8 + height: meter.height + 14 + HoverHandler { id: meterHover } + } +} diff --git a/src/components/HexSphereLogo.qml b/src/components/HexSphereLogo.qml new file mode 100644 index 0000000..1e1e27f --- /dev/null +++ b/src/components/HexSphereLogo.qml @@ -0,0 +1,316 @@ +import QtQuick +import qs.Common + + // Hexagonal sphere logo: a Goldberg polyhedron (12 pentagons + 80 + // hexagons, 270 edges), built once; a FrameAnimation tumbles it with + // an orthographic projection, edges drawn in three depth tiers. +Item { + id: root + + property real radius: 66 + property real strokeWidth: 1.5 + property color edgeColor: Theme.primary + property real yawRate: 10 + property real pitchRate: 3 + // Geodesic subdivision frequency: cells = 10F²+2 (12 pentagons + + // (10F²-10) hexagons), edges = 30F². Lower F = chunkier cells. + property int subdivisions: 3 + // false = decorative (status row): hover glow and tap disabled + property bool interactive: true + + width: radius * 2 + strokeWidth * 2 + height: radius * 2 + strokeWidth * 2 + + property var _geo: null + property var _baseVerts: [] // 180 unit centroids + property var _edges: [] // 270 × 2 centroid indices + property var _t: 0 + + // ── Hover ───────────────────────────────────────────────────── + // Hover: wander (random tumble target) + brighten; idle: calm spin. + property bool hovered: false + property real _hover: 0 + Behavior on _hover { NumberAnimation { duration: 250 } } + property real _vx: yawRate // current deg/s (yaw, pitch) + property real _vy: pitchRate + property real _angY: 0 + property real _angP: 0 + property real _lastT: -1 + // Hover phase: one direction, exponential speed profile + // base → peak → back to base, then a new direction kicks off. + property real _phaseT: 0 + property real _phaseDur: 2.4 + property real _dir: 0 + property real _peak: 550 + // Heartbeat pulse (0..1), tapped into a lub-dub swell that drives + // the effective drawn radius in _tick. + property real _pulse: 0 + SequentialAnimation { + id: heartbeat + running: false + NumberAnimation { target: root; property: "_pulse"; to: 1; duration: 120; easing.type: Easing.OutQuad } + NumberAnimation { target: root; property: "_pulse"; to: 0.25; duration: 110; easing.type: Easing.InQuad } + PauseAnimation { duration: 90 } + NumberAnimation { target: root; property: "_pulse"; to: 0.8; duration: 120; easing.type: Easing.OutQuad } + NumberAnimation { target: root; property: "_pulse"; to: 0; duration: 170; easing.type: Easing.InQuad } + } + + HoverHandler { + id: sphereHover + enabled: root.interactive + cursorShape: Qt.PointingHandCursor + } + readonly property bool _insideCircle: sphereHover.hovered && + Math.hypot(sphereHover.point.position.x - width / 2, + sphereHover.point.position.y - height / 2) <= radius + on_InsideCircleChanged: { + hovered = _insideCircle; + _hover = _insideCircle ? 1 : 0; + if (_insideCircle) { + _dir = Math.random() * Math.PI * 2; + _phaseT = 0; + _phaseDur = 2.2 + Math.random() * 0.8; + _peak = 550 + Math.random() * 250; + } + } + TapHandler { + enabled: root.interactive + // Easter egg hook — for now, a playful heartbeat. + onTapped: heartbeat.restart() + } + + // Per-frame tiered segments: [ax, ay, bx, by, ...] groups per + // depth tier, stroked by the Canvas on paint. 8 fine tiers make + // rim transitions visually continuous. + property var _tiers: [[], [], [], [], [], [], [], []] + + Component.onCompleted: { + _geo = _buildGeometry(subdivisions); + _baseVerts = _geo.cents; + _edges = _geo.edges; + _tick(0); + } + + function _buildGeometry(F) { + const PHI = (1 + Math.sqrt(5)) / 2; + const base = [ + [-1, PHI, 0], [1, PHI, 0], [-1, -PHI, 0], [1, -PHI, 0], + [0, -1, PHI], [0, 1, PHI], [0, -1, -PHI], [0, 1, -PHI], + [PHI, 0, -1], [PHI, 0, 1], [-PHI, 0, -1], [-PHI, 0, 1] + ]; + const verts = []; + for (var i = 0; i < 12; i++) { + var l0 = Math.hypot(base[i][0], base[i][1], base[i][2]); + verts.push([base[i][0] / l0, base[i][1] / l0, base[i][2] / l0]); + } + const icosaFaces = [ + [0, 11, 5], [0, 5, 1], [0, 1, 7], [0, 7, 10], [0, 10, 11], + [1, 5, 9], [5, 11, 4], [11, 10, 2], [10, 7, 6], [7, 1, 8], + [3, 9, 4], [3, 4, 2], [3, 2, 6], [3, 6, 8], [3, 8, 9], + [4, 9, 5], [2, 4, 11], [6, 2, 10], [8, 6, 7], [9, 8, 1] + ]; + const midCache = {}; + function edgePoint(a, b, i) { + var key = a < b ? a + "-" + b + "-" + i : b + "-" + a + "-" + (F - i); + if (midCache[key] !== undefined) return midCache[key]; + var va = verts[a], vb = verts[b]; + var x = (va[0] * (F - i) + vb[0] * i) / F; + var y = (va[1] * (F - i) + vb[1] * i) / F; + var z = (va[2] * (F - i) + vb[2] * i) / F; + var l = Math.hypot(x, y, z); + verts.push([x / l, y / l, z / l]); + midCache[key] = verts.length - 1; + return verts.length - 1; + } + const tris = []; + for (var q = 0; q < icosaFaces.length; q++) { + var fa = icosaFaces[q][0], fb = icosaFaces[q][1], fc = icosaFaces[q][2]; + var lat = {}; + var get = function (i, j) { + var key = i + "-" + j; + if (lat[key] !== undefined) return lat[key]; + var idx; + if (i === 0 && j === 0) idx = fa; + else if (i === F && j === 0) idx = fb; + else if (i === 0 && j === F) idx = fc; + else if (j === 0) idx = edgePoint(fa, fb, i); + else if (i === 0) idx = edgePoint(fa, fc, j); + else if (i + j === F) idx = edgePoint(fb, fc, j); + else { + var va = verts[fa], vb = verts[fb], vc = verts[fc]; + var k = F - i - j; + var x = (va[0] * k + vb[0] * i + vc[0] * j) / F; + var y = (va[1] * k + vb[1] * i + vc[1] * j) / F; + var z = (va[2] * k + vb[2] * i + vc[2] * j) / F; + var l = Math.hypot(x, y, z); + verts.push([x / l, y / l, z / l]); + idx = verts.length - 1; + } + lat[key] = idx; + return idx; + }; + for (var i = 0; i < F; i++) + for (var j = 0; j < F - i; j++) { + tris.push([get(i, j), get(i + 1, j), get(i, j + 1)]); + if (j < F - i - 1) + tris.push([get(i, j + 1), get(i + 1, j), get(i + 1, j + 1)]); + } + } + // Sphere-projected triangle centroids (dual face centers). + const cents = []; + for (i = 0; i < tris.length; i++) { + var sx = 0, sy = 0, sz = 0; + for (j = 0; j < 3; j++) { + sx += verts[tris[i][j]][0]; + sy += verts[tris[i][j]][1]; + sz += verts[tris[i][j]][2]; + } + var cl = Math.hypot(sx, sy, sz); + cents.push([sx / cl, sy / cl, sz / cl]); + } + // Dual faces: one per primal vertex, centroid loop wound by + // angle around the vertex direction. + const vTris = []; + for (i = 0; i < verts.length; i++) vTris.push([]); + for (i = 0; i < tris.length; i++) + for (j = 0; j < 3; j++) vTris[tris[i][j]].push(i); + const faceCenters = []; + for (var v = 0; v < verts.length; v++) { + var dir = verts[v]; + var ref = Math.abs(dir[1]) < 0.9 ? [0, 1, 0] : [1, 0, 0]; + var dp = ref[0] * dir[0] + ref[1] * dir[1] + ref[2] * dir[2]; + var e1 = [ref[0] - dp * dir[0], ref[1] - dp * dir[1], ref[2] - dp * dir[2]]; + var l1 = Math.hypot(e1[0], e1[1], e1[2]); + e1 = [e1[0] / l1, e1[1] / l1, e1[2] / l1]; + var e2 = [dir[1] * e1[2] - dir[2] * e1[1], + dir[2] * e1[0] - dir[0] * e1[2], + dir[0] * e1[1] - dir[1] * e1[0]]; + var withAng = []; + for (i = 0; i < vTris[v].length; i++) { + var c = cents[vTris[v][i]]; + withAng.push({ ti: vTris[v][i], + a: Math.atan2(c[0] * e2[0] + c[1] * e2[1] + c[2] * e2[2], + c[0] * e1[0] + c[1] * e1[1] + c[2] * e1[2]) }); + } + withAng.sort(function (p, qq) { return p.a - qq.a; }); + var loop = []; + for (i = 0; i < withAng.length; i++) loop.push(withAng[i].ti); + faceCenters.push(loop); + } + // Dual edges, deduped. + var eset = {}, edges = []; + for (i = 0; i < faceCenters.length; i++) + for (j = 0; j < faceCenters[i].length; j++) { + var p = faceCenters[i][j], r = faceCenters[i][(j + 1) % faceCenters[i].length]; + var lo = Math.min(p, r), hi = Math.max(p, r); + var ek = lo + "-" + hi; + if (eset[ek]) continue; + eset[ek] = true; + edges.push(lo, hi); + } + return { cents: cents, edges: edges }; + } + + function _tick(t) { + if (!_baseVerts || _baseVerts.length === 0) return; + var DEG = Math.PI / 180; + var dt = _lastT < 0 ? 0 : t - _lastT; + _lastT = t; + if (dt < 0) dt = 0; + if (dt > 0.1) dt = 0.1; // frame hitches must not kick the tumble + _t = t; + + if (hovered) { + // One direction per phase. Speed ramps up exponentially + // (multiple full revolutions at peak), then eases back to + // near-basic before the next direction kicks off. + _phaseT += dt; + if (_phaseT >= _phaseDur) { + var turn = (Math.PI * 0.4) + Math.random() * (Math.PI * 0.6); + _dir += (Math.random() < 0.5 ? -turn : turn); + _phaseT = 0; + _phaseDur = 2.2 + Math.random() * 0.8; + _peak = 550 + Math.random() * 250; + } + var ph = Math.min(1, _phaseT / _phaseDur); + var base = 18; + var spd; + if (ph < 0.65) spd = base + (_peak - base) * Math.pow(ph / 0.65, 2.6); + else { + var u = (ph - 0.65) / 0.35; + spd = base + (_peak - base) * Math.pow(1 - u, 1.8); + } + _vx = Math.cos(_dir) * spd; + _vy = Math.sin(_dir) * spd; + } else { + // Unhover: exponential settle back to the calm idle spin. + var s2 = Math.min(1, dt * 4); + _vx += (yawRate - _vx) * s2; + _vy += (pitchRate - _vy) * s2; + } + _angY += _vx * dt; + _angP += _vy * dt; + + var sa = Math.sin(_angP * DEG), ca = Math.cos(_angP * DEG); + var sb = Math.sin(_angY * DEG), cb = Math.cos(_angY * DEG); + var m20 = -sb, m21 = cb * sa, m22 = cb * ca; + var m00 = cb, m01 = sb * sa, m02 = sb * ca; + var m10 = 0, m11 = ca, m12 = -sa; + + var npx = [], npy = [], zs = []; + var R = (Math.min(width, height) / 2 - strokeWidth) * (1 + 0.08 * _pulse); + for (var i = 0; i < _baseVerts.length; i++) { + var v = _baseVerts[i]; + zs.push(m20 * v[0] + m21 * v[1] + m22 * v[2]); + npx.push(width / 2 + (m00 * v[0] + m01 * v[1] + m02 * v[2]) * R * 0.94); + npy.push(height / 2 - (m10 * v[0] + m11 * v[1] + m12 * v[2]) * R * 0.94); + } + var tiers = [[], [], [], [], [], [], [], []]; + for (var e = 0; e < _edges.length; e += 2) { + var a = _edges[e], b = _edges[e + 1]; + var zAvg = (zs[a] + zs[b]) / 2; + var tier = Math.floor((zAvg + 1) / 2 * 8); + if (tier < 0) tier = 0; + if (tier > 7) tier = 7; + tiers[tier].push(npx[a], npy[a], npx[b], npy[b]); + } + _tiers = tiers; + view.requestPaint(); + } + + onEdgeColorChanged: view.requestPaint() + + FrameAnimation { + running: root.visible && (root.yawRate > 0 || root.pitchRate > 0) + onTriggered: root._tick(elapsedTime) + } + + Canvas { + id: view + anchors.fill: parent + antialiasing: true + + onPaint: { + var ctx = getContext("2d"); + ctx.clearRect(0, 0, width, height); + ctx.lineWidth = root.strokeWidth; + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + for (var t = 0; t < 8; t++) { + var tierAlpha = 0.12 + 0.61 * (t + 0.5) / 8; + tierAlpha += (1 - tierAlpha) * root._hover; // hover glow + ctx.strokeStyle = Qt.rgba(root.edgeColor.r, root.edgeColor.g, + root.edgeColor.b, tierAlpha); + ctx.beginPath(); + var segs = root._tiers[t]; + for (var i = 0; i + 3 < segs.length; i += 4) { + ctx.moveTo(segs[i], segs[i + 1]); + ctx.lineTo(segs[i + 2], segs[i + 3]); + } + ctx.stroke(); + } + } + onWidthChanged: requestPaint() + onHeightChanged: requestPaint() + } +} diff --git a/src/components/MCPSection.qml b/src/components/MCPSection.qml new file mode 100644 index 0000000..03ab87f --- /dev/null +++ b/src/components/MCPSection.qml @@ -0,0 +1,711 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import qs.Common +import qs.Widgets + + // MCP servers settings: one collapsible row per instance with a + // name/URL/token editor, Connect action, and per-tool checkboxes. + // Tokens persist in the keyring when available, else memory-only. +Item { + id: root + + property var service: null + // Which instance is expanded — only one at a time. + property string expandedId: "" + + // Armed creation replay state for the tools-checkbox click + // animation (mirrors ProvidersSection's MiniToggle pattern). + property string animKey: "" + property bool animFrom: false + + implicitHeight: body.implicitHeight + + // Compact switch (enable/disable server). Plain Rectangle + + // MouseArea so the press is consumed here and never also toggles + // the row's expand/collapse TapHandler. + component MiniToggle : Rectangle { + id: mini + + property bool checked: true + signal toggled() + + width: 34 + height: 20 + radius: 10 + color: mini.shown ? Theme.primary + : Theme.withAlpha(Theme.outlineVariant, 0.5) + Behavior on color { ColorAnimation { duration: 220 } } + + Rectangle { + x: mini.shown ? mini.width - width - 2 : 2 + anchors.verticalCenter: parent.verticalCenter + width: 16 + height: 16 + radius: 8 + color: mini.shown ? Theme.surfaceContainerHighest + : Theme.surfaceVariantText + Behavior on x { NumberAnimation { duration: 220; easing.type: Easing.OutCubic } } + Behavior on color { ColorAnimation { duration: 220 } } + } + + property bool shown: checked + + function armFrom(state) { + shown = state; + armTimer.restart(); + } + + Timer { + id: armTimer + interval: 50 + onTriggered: mini.shown = Qt.binding(function () { return mini.checked; }) + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: mini.toggled() + } + } + + // Small neutral icon button (no accent): used for row actions + // (destructive delete). + component NeutralIconButton : Rectangle { + id: nib + + property string iconName: "" + property int buttonHeight: 20 + property int iconSize: 14 + signal clicked() + + width: buttonHeight + 10 + height: buttonHeight + radius: 6 + color: nibHover.hovered ? Theme.withAlpha(Theme.surfaceContainerHighest, 0.9) + : Theme.withAlpha(Theme.surfaceContainerHighest, 0.5) + Behavior on color { ColorAnimation { duration: 200 } } + + DankIcon { + anchors.centerIn: parent + name: nib.iconName + size: nib.iconSize + color: Theme.surfaceVariantText + } + + HoverHandler { id: nibHover; cursorShape: Qt.PointingHandCursor } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: nib.clicked() + } + } + + // Tool cell: checkbox + name + description (one per column). + component ToolCheckRow : Rectangle { + id: toolRow + + property string label: "" + property string description: "" + property bool checked: false + property string serverId: "" + // Armed creation replay state for the checkbox animation. + property bool shownChecked: checked + property real checkScale: 1.0 + signal toggled() + + function armFrom(state) { + shownChecked = state; + armTimer.restart(); + } + + Timer { + id: armTimer + interval: 50 + onTriggered: { + toolRow.shownChecked = Qt.binding(function () { return toolRow.checked; }); + checkBounce.restart(); + } + } + + height: 56 + radius: 8 + color: toolRow.checked + ? Theme.withAlpha(Theme.primary, 0.14) + : Theme.withAlpha(Theme.surfaceContainerHigh, 0.4) + + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.6) + opacity: toolHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + HoverHandler { id: toolHover; cursorShape: Qt.PointingHandCursor } + + SequentialAnimation { + id: checkBounce + NumberAnimation { + target: toolRow; property: "checkScale" + to: 1.15; duration: 140; easing.type: Easing.InOutQuad + } + NumberAnimation { + target: toolRow; property: "checkScale" + to: 1.0; duration: 240; easing.type: Easing.InOutQuad + } + } + + Item { + id: checkBox + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.verticalCenter: parent.verticalCenter + width: 20 + height: 20 + scale: toolRow.checkScale + + DankIcon { + anchors.fill: parent + name: "check_box_outline_blank" + size: 20 + visible: opacity > 0.01 + opacity: toolRow.shownChecked ? 0 : 1 + color: toolRow.shownChecked ? Theme.primary : Theme.surfaceVariantText + Behavior on opacity { NumberAnimation { duration: 220; easing.type: Easing.InOutQuad } } + } + + DankIcon { + anchors.fill: parent + name: "check_box" + size: 20 + visible: opacity > 0.01 + opacity: toolRow.shownChecked ? 1 : 0 + color: Theme.primary + Behavior on opacity { NumberAnimation { duration: 220; easing.type: Easing.InOutQuad } } + } + } + + ColumnLayout { + anchors.left: checkBox.right + anchors.leftMargin: 12 + anchors.right: parent.right + anchors.rightMargin: 12 + anchors.verticalCenter: parent.verticalCenter + spacing: 2 + + Text { + Layout.fillWidth: true + text: toolRow.label + color: Theme.surfaceText + font.pixelSize: 13 + font.family: Theme.monoFontFamily + elide: Text.ElideRight + } + + Text { + Layout.fillWidth: true + visible: toolRow.description.length > 0 + text: toolRow.description + color: Theme.surfaceVariantText + font.pixelSize: 11 + wrapMode: Text.Wrap + maximumLineCount: 2 + elide: Text.ElideRight + } + } + + TapHandler { + id: tapPoint + onTapped: { + checkBounce.restart(); + toolRow.toggled(); + } + } + } + + ColumnLayout { + id: body + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + spacing: 10 + + // ── Section header ──────────────────────────────────────── + RowLayout { + id: headerRow + Layout.fillWidth: true + + Text { + text: "MCP" + color: Theme.primary + font.pixelSize: 13 + font.bold: true + } + + Item { Layout.fillWidth: true } + + DankButton { + text: "Add MCP Server" + iconName: "add" + buttonHeight: 36 + onClicked: if (root.service) root.expandedId = root.service.addMcpServer() + } + } + + Text { + Layout.fillWidth: true + visible: !root.service || root.service.mcpServers.length === 0 + text: "No MCP servers yet — add one to expose its tools to the chat." + color: Theme.surfaceVariantText + font.pixelSize: 12 + } + + // ── Instance list ───────────────────────────────────────── + // Array model: the service's reassignment pattern rebuilds the + // rows on every write. State-change animations replay on the + // fresh row via the animKey/animFrom handoff. + Repeater { + model: root.service ? root.service.mcpServers : [] + + delegate: ColumnLayout { + id: block + + required property var modelData + + readonly property string sid: modelData && modelData.id ? String(modelData.id) : "" + readonly property bool expanded: root.expandedId === sid + readonly property string keyStatus: + root.service && sid.length > 0 ? root.service.mcpKeyStatus(sid) : "none" + readonly property string keyMessageText: + root.service && root.service.mcpKeyMessages && sid.length > 0 + ? (root.service.mcpKeyMessages[sid] ? String(root.service.mcpKeyMessages[sid]) : "") + : "" + readonly property bool connected: + root.service && root.service.mcpConnected && sid.length > 0 + && root.service.mcpConnected[sid] === true + readonly property string connectionErrorText: + root.service && root.service.mcpConnectionErrors && sid.length > 0 + ? (root.service.mcpConnectionErrors[sid] ? String(root.service.mcpConnectionErrors[sid]) : "") + : "" + readonly property bool connecting: + root.service && root.service._mcpConnectingId === sid + readonly property var serviceForRow: + root.service ? root.service._mcpServiceFor(sid) : null + readonly property string toolsCountText: { + var disc = (modelData && modelData.discovered) || []; + var en = (modelData && modelData.enabledTools) || []; + var shown = 0; + for (var t = 0; t < disc.length; t++) { + var tn = disc[t] && disc[t].name ? String(disc[t].name) : ""; + if (!tn) continue; + if (en.indexOf(tn) >= 0) shown++; + } + return disc.length > 0 ? shown + " of " + disc.length + " tools enabled" : ""; + } + + Layout.fillWidth: true + spacing: 4 + + // Collapsed row: chevron + name + enable toggle + delete. + Rectangle { + id: serverRow + + Layout.fillWidth: true + implicitHeight: 72 + radius: 6 + color: block.expanded + ? Theme.withAlpha(Theme.surfaceContainerHigh, 0.3) + : Theme.withAlpha(Theme.surfaceContainerHigh, 0.22) + Behavior on color { ColorAnimation { duration: 250 } } + + Rectangle { + anchors.fill: parent + radius: 6 + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.3) + opacity: rowHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + readonly property bool off: + block.modelData && block.modelData.enabled === false + + HoverHandler { + id: rowHover + cursorShape: Qt.PointingHandCursor + } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 10 + spacing: 8 + + DankIcon { + name: "expand_more" + size: 22 + color: Theme.surfaceVariantText + rotation: block.expanded ? 0 : -90 + opacity: serverRow.off ? 0.45 : 1 + Behavior on rotation { + RotationAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + Behavior on opacity { NumberAnimation { duration: 200 } } + } + + // MCP icon: a small filled square so the row is + // visually anchored (no brand stem to bind). + Rectangle { + width: 24 + height: 24 + radius: 6 + color: Theme.withAlpha(Theme.primary, 0.18) + opacity: serverRow.off ? 0.45 : 1 + Behavior on opacity { NumberAnimation { duration: 200 } } + DankIcon { + anchors.centerIn: parent + name: "handyman" + size: 16 + color: Theme.primary + } + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 1 + opacity: serverRow.off ? 0.45 : 1 + Behavior on opacity { NumberAnimation { duration: 200 } } + + Text { + Layout.fillWidth: true + text: block.modelData && block.modelData.name ? String(block.modelData.name) : "" + color: Theme.surfaceText + font.pixelSize: 13 + elide: Text.ElideRight + } + + Text { + Layout.fillWidth: true + text: { + if (block.connected) + return "Connected · " + block.toolsCountText; + if (block.connecting) + return "Connecting…"; + if (block.connectionErrorText.length > 0) + return "Not connected · " + block.connectionErrorText; + return "Not connected"; + } + color: block.connected ? Theme.primary + : (block.connectionErrorText.length > 0 ? Theme.error : Theme.surfaceVariantText) + font.pixelSize: 11 + elide: Text.ElideRight + } + } + + MiniToggle { + Layout.alignment: Qt.AlignVCenter + checked: block.modelData + ? block.modelData.enabled !== false : true + onToggled: { + if (!root.service || block.sid.length === 0) return; + root.animKey = "s:" + block.sid; + root.animFrom = block.modelData + ? block.modelData.enabled !== false : true; + root.service.setMcpServerEnabled(block.sid, !root.animFrom); + } + Component.onCompleted: { + if (root.animKey === "s:" + block.sid) { + armFrom(root.animFrom); + root.animKey = ""; + } + } + } + + NeutralIconButton { + iconName: "delete" + Layout.alignment: Qt.AlignVCenter + onClicked: { + if (root.expandedId === block.sid) root.expandedId = ""; + if (root.service && block.sid.length > 0) + root.service.removeMcpServer(block.sid); + } + } + } + + TapHandler { + onTapped: root.expandedId = block.expanded ? "" : block.sid + } + } + + // Expanded editor card. + Rectangle { + id: editorCard + Layout.fillWidth: true + readonly property int fullHeight: cardBody.implicitHeight + 24 + property real animHeight: block.expanded ? fullHeight : 0 + Behavior on animHeight { + NumberAnimation { + duration: 220 + easing.type: Easing.OutCubic + } + } + Layout.preferredHeight: animHeight + visible: animHeight > 0.5 + clip: true + opacity: block.expanded ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 160 } } + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.35) + + ColumnLayout { + id: cardBody + anchors.fill: parent + anchors.margins: 12 + spacing: 10 + + DankTextField { + Layout.fillWidth: true + labelText: "Name" + text: block.modelData && block.modelData.name ? String(block.modelData.name) : "" + onEditingFinished: if (root.service && block.sid.length > 0 + && text !== (block.modelData && block.modelData.name ? String(block.modelData.name) : "")) + root.service.renameMcpServer(block.sid, text) + } + + DankTextField { + Layout.fillWidth: true + labelText: "MCP server URL" + placeholderText: "https://example.test/mcp" + text: block.modelData && block.modelData.url ? String(block.modelData.url) : "" + onEditingFinished: if (root.service && block.sid.length > 0 + && text.trim() !== (block.modelData && block.modelData.url ? String(block.modelData.url) : "")) + root.service.setMcpServerUrl(block.sid, text) + } + + DankTextField { + Layout.fillWidth: true + labelText: "Auth token" + placeholderText: { + if (!root.service || block.sid.length === 0) return "Paste auth token"; + var inst = block.modelData; + var envName = inst ? root.service.mcpEnvVar(String(inst.name || "")) : ""; + return envName.length > 0 ? envName : "Paste auth token"; + } + text: root.service && root.service.mcpSessionTokens && block.sid.length > 0 + ? (root.service.mcpSessionTokens[block.sid] || "") : "" + echoMode: passwordVisible ? TextInput.Normal : TextInput.Password + showPasswordToggle: true + onEditingFinished: if (root.service && block.sid.length > 0 + && text.length > 0 + && text !== (root.service.mcpSessionTokens && root.service.mcpSessionTokens[block.sid] + ? String(root.service.mcpSessionTokens[block.sid]) : "")) { + root.service.setMcpServerToken(block.sid, text); + // Token just landed — try to connect now. + root.service._connectMcpServer(block.sid); + } + } + + Text { + Layout.fillWidth: true + visible: block.keyMessageText.length > 0 + text: block.keyMessageText + color: Theme.error + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + Text { + Layout.fillWidth: true + visible: block.keyStatus === "none" + text: { + if (!root.service || !block.modelData) return ""; + var inst = block.modelData; + var envName = root.service.mcpEnvVar(String(inst.name || "")); + return envName.length > 0 + ? "No token — set one or export " + envName + : "No token — set one above"; + } + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + Text { + Layout.fillWidth: true + visible: block.keyStatus.indexOf("env:") === 0 + text: "Using env var " + block.keyStatus.substring(4) + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + Text { + Layout.fillWidth: true + visible: !root.service || !root.service.keyringAvailable + text: "secret-tool not found — tokens last this session only; use env vars for persistence" + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + // Single Connect/Reconnect button (mirrors the + // providers' "Refresh models" placement; no + // Disconnect — disabling the row disconnects). + RowLayout { + Layout.fillWidth: true + spacing: 8 + + DankButton { + text: { + if (block.connecting) return "Connecting…"; + if (block.connected) return "Reconnect"; + return "Connect"; + } + iconName: "link" + buttonHeight: 36 + enabled: root.service && !block.connecting + && block.modelData && block.modelData.url + && String(block.modelData.url).length > 0 + onClicked: if (root.service && block.sid.length > 0) { + root.service._connectMcpServer(block.sid); + } + } + + Item { Layout.fillWidth: true } + } + + Text { + Layout.fillWidth: true + visible: block.connectionErrorText.length > 0 + text: block.connectionErrorText + color: Theme.error + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + Text { + text: "Available tools" + color: Theme.primary + font.pixelSize: 12 + font.bold: true + visible: block.connected + } + + // Bulk-select row. Sits next to the "Available + // tools" header so the affordance is obvious + // without growing the row height. Disabled when + // there are no tools to operate on. + RowLayout { + Layout.fillWidth: true + visible: block.connected + && block.modelData && block.modelData.discovered + && block.modelData.discovered.length > 0 + spacing: 6 + + Item { Layout.fillWidth: true } + + DankButton { + text: "Select all" + iconName: "done_all" + buttonHeight: 26 + backgroundColor: Theme.withAlpha( + Theme.surfaceContainerHighest, 0.5) + textColor: Theme.surfaceText + onClicked: if (root.service && block.sid.length > 0) + root.service.selectAllMcpTools(block.sid) + } + + DankButton { + text: "Deselect all" + iconName: "remove_done" + buttonHeight: 26 + backgroundColor: Theme.withAlpha( + Theme.surfaceContainerHighest, 0.5) + textColor: Theme.surfaceText + onClicked: if (root.service && block.sid.length > 0) + root.service.deselectAllMcpTools(block.sid) + } + } + + Text { + Layout.fillWidth: true + visible: !block.connected + text: "Connect to the server to list its tools." + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + Text { + Layout.fillWidth: true + visible: block.connected + && (!block.modelData || !block.modelData.discovered + || block.modelData.discovered.length === 0) + text: "No tools returned by the server." + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 4 + visible: block.connected + && block.modelData && block.modelData.discovered + && block.modelData.discovered.length > 0 + + Repeater { + model: { + if (!block.modelData || !block.modelData.discovered) return []; + var disc = block.modelData.discovered; + var en = block.modelData.enabledTools || []; + var out = []; + for (var i = 0; i < disc.length; i++) { + var t = disc[i]; + if (!t || !t.name) continue; + var checked = en.indexOf(String(t.name)) >= 0; + out.push({ + name: String(t.name), + description: String(t.description || ""), + checked: checked + }); + } + return out; + } + + delegate: ToolCheckRow { + required property var modelData + Layout.fillWidth: true + label: modelData && modelData.name ? String(modelData.name) : "" + description: modelData && modelData.description + ? String(modelData.description) : "" + checked: modelData ? !!modelData.checked : false + serverId: block.sid + onToggled: { + if (!root.service || block.sid.length === 0 + || !modelData || !modelData.name) return; + root.animKey = "t:" + block.sid + "/" + + String(modelData.name); + root.animFrom = !!modelData.checked; + root.service.toggleMcpTool(block.sid, String(modelData.name)); + } + Component.onCompleted: { + var key = "t:" + block.sid + "/" + + (modelData && modelData.name ? String(modelData.name) : ""); + if (root.animKey === key) { + armFrom(root.animFrom); + root.animKey = ""; + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/components/MessageBubble.qml b/src/components/MessageBubble.qml new file mode 100644 index 0000000..8015586 --- /dev/null +++ b/src/components/MessageBubble.qml @@ -0,0 +1,1294 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import Quickshell +import qs.Common +import qs.Widgets +import "../lib/Markdown.js" as Markdown +import "../lib/SyntaxHighlight.js" as SyntaxHighlight +import "../lib/ModelIcons.js" as ModelIcons + +Rectangle { + id: bubble + + property var service: null + // The owning ListView (wired by MessageList's delegate): used for + // viewport-relative sizing and tall-code-block copy registration. + property var listView: null + property real viewportHeight: listView ? listView.height : 0 + + // NOTE: plain (non-required) properties on purpose — MessageList binds + // them via the delegate's `model.*` context object, and a delegate that + // declares required properties loses context-property access (Qt 6). + property string msgId: "" + property string role: "" // "user" | "assistant" | "system" + property string content: "" + property string thinking: "" + property string modelUsed: "" // logical model id (what the API got) + // Provider the message was sent through — model renames are + // stored per provider instance, so resolving the display label + // needs both ids. + property string modelProviderId: "" + // JSON string of [{mime, data}] image attachments (user messages). + property string attachments: "[]" + // toolLog is a JSON string (QML ListModel does not persist JS + // object arrays in roles). The bubble parses it on the fly via + // the toolLogArr computed property below. + property string toolLog: "[]" + property string msgState: "" // streaming | done | error | cancelled + property string stats: "" + property real msgTimestamp: 0 // ms epoch, from the model role + + readonly property bool isUser: role === "user" + readonly property bool isStreaming: msgState === "streaming" + + // Display label for the assistant header: the user's custom + // rename when one exists, else the logical id. Resolves live, so + // later renames update existing bubbles too. + readonly property string modelLabel: + bubble.service + ? bubble.service.modelLabel(bubble.modelProviderId, bubble.modelUsed) + : bubble.modelUsed + + // Parsed attachments (safely [] on parse error). + readonly property var attachmentsArr: { + try { + var v = JSON.parse(bubble.attachments || "[]"); + return Array.isArray(v) ? v : []; + } catch (e) { return []; } + } + + // theme-driven palette for markdown + readonly property var mdColors: ({ + codeBg: Theme.surfaceContainerHigh, + inlineCodeBg: Theme.withAlpha(Theme.surfaceText, 0.10), + inlineCodeColor: Theme.primary, + blockquoteBg: Theme.withAlpha(Theme.surfaceContainerHighest, 0.5), + blockquoteBorder: Theme.outlineVariant, + blockquoteText: Theme.surfaceVariantText, + linkColor: Theme.primary, + headingColor: Theme.surfaceText, + tableHeaderBg: Theme.withAlpha(Theme.primary, 0.08), + tableRowAltBg: Theme.withAlpha(Theme.surfaceText, 0.03), + tableBorderColor: Theme.outlineVariant, + syntax: ({ + comment: Theme.surfaceVariantText, + string: Theme.success, + number: Theme.warning, + keyword: Theme.secondary, + "function": Theme.info, + type: Theme.tertiary + }) + }) + + // Small icon button used in message footers and the code-block + // sticky bar. Rest color follows surfaceVariantText; hover shifts + // to the accent (Theme.primary) and the cursor becomes a hand — + // mirrors the pondering-header pattern above. + component HoverIcon : Item { + id: hov + property string iconName: "" + property int iconSize: 16 + property string iconColor: Theme.surfaceVariantText + signal clicked() + property bool _hovered: false + HoverHandler { + id: hover + cursorShape: Qt.PointingHandCursor + onHoveredChanged: parent._hovered = hovered + } + TapHandler { onTapped: hov.clicked() } + DankIcon { + anchors.centerIn: parent + name: hov.iconName + size: hov.iconSize + color: hov._hovered ? Theme.primary : hov.iconColor + Behavior on color { ColorAnimation { duration: 180 } } + } + // 16px touch target — the icon paints at iconSize inside. + implicitWidth: 16 + implicitHeight: 16 + } + + function _highlight(code, lang) { + return SyntaxHighlight.highlightCode(code, lang, mdColors.syntax); + } + + // ── Thinking phase tracking ─────────────────────────────────── + // Auto-opens on stream start, auto-closes at first content token + // (manual re-open sticks). Wall time drives the "Pondered …" label. + property bool thinkingExpanded: false + property real _thinkStartMs: 0 + property real _thinkDurationMs: 0 + + // ── Interleaved pondering + tool chips ──────────────────────── + // Thinking renders split at each call's thinkingAt with chips in + // between. Fade/reveal applies to the TAIL only; head segments + // are frozen. + property int _thinkSplit: 0 + readonly property string thinkTail: + thinking.substring(Math.min(_thinkSplit, thinking.length)) + + onToolLogArrChanged: { + var mx = 0; + for (var i = 0; i < toolLogArr.length; i++) { + var e = toolLogArr[i]; + if (e && e.thinkingAt > mx) mx = e.thinkingAt; + } + if (mx > _thinkSplit) { + _thinkSplit = mx; + // Fresh tail — restart the progressive reveal so the + // post-call thinking streams in like any other round. + shownThinking = ""; + _thinkFadeTail = ""; + } + } + + // Segments split at each tool call's thinkingAt; only the trailing + // one is live. Count-based Repeater keeps delegates stable. + readonly property var thinkSegments: { + var segs = []; + var log = bubble.toolLogArr; + var prev = 0; + for (var i = 0; i < log.length; i++) { + var e = log[i]; + var at = e && e.thinkingAt ? e.thinkingAt : 0; + if (at > thinking.length) at = thinking.length; + if (at < prev) at = prev; + var txt = thinking.substring(prev, at); + if (txt.length > 0) + segs.push({ type: "text", text: txt, live: false }); + segs.push({ type: "tool", idx: i }); + prev = at; + } + var tail = thinking.substring(prev); + if (tail.length > 0 || segs.length === 0) + segs.push({ type: "text", text: tail, live: true }); + return segs; + } + + // Static markdown for frozen head segments (no fade machinery — + // those rounds are complete). + function staticThinkHtml(text) { + if (!text) return ""; + return Markdown.markdownToHtml(text, mdColors, _highlight); + } + + // Per-tool-entry expansion state (index in toolLog → bool). + // Reassigned on toggle so var-property bindings re-evaluate. + property var _expandedTools: ({}) + + // Parsed toolLog (the role is a JSON string because QML + // ListModel can't store JS object arrays in roles). Re-evaluates + // when toolLog changes; safely returns [] on parse error. + readonly property var toolLogArr: { + try { var v = JSON.parse(bubble.toolLog || "[]"); + return Array.isArray(v) ? v : []; } + catch (e) { return []; } + } + + function isToolExpanded(idx) { + return !!_expandedTools[idx]; + } + + function toggleToolExpand(idx) { + var m = Object.assign({}, _expandedTools); + m[idx] = !m[idx]; + _expandedTools = m; + } + + // Pretty-print a tool's raw detail: recursively unescape nested + // JSON strings, re-stringify with 2-space indent; raw text falls + // through. Never truncated (lives in a collapsible block). + function formatToolDetail(raw) { + if (!raw) return ""; + var text = String(raw); + function unescapeStrings(v) { + if (typeof v === "string") { + try { + var inner = JSON.parse(v); + if (inner && typeof inner === "object") + return unescapeStrings(inner); + } catch (e) { /* not JSON, keep as-is */ } + return v; + } + if (Array.isArray(v)) { + var out = []; + for (var i = 0; i < v.length; i++) + out.push(unescapeStrings(v[i])); + return out; + } + if (v && typeof v === "object") { + var r = {}; + for (var k in v) + if (Object.prototype.hasOwnProperty.call(v, k)) + r[k] = unescapeStrings(v[k]); + return r; + } + return v; + } + try { + var parsed = JSON.parse(text); + var unescaped = unescapeStrings(parsed); + text = JSON.stringify(unescaped, null, 2); + } catch (e) { /* not JSON, show as-is */ } + return text; + } + + readonly property bool thinkingDone: thinking.length > 0 && + (content.length > 0 || !isStreaming) + + function ponderedLabel() { + if (_thinkDurationMs < 5000) return "Pondered briefly"; + return "Pondered for " + Math.round(_thinkDurationMs / 1000) + " seconds"; + } + + // ── Segmented body rendering + batch reveal ─────────────────── + // Output flushes in discrete batches, each tinted via + // Markdown.spliceIntoLastBlock and brightening to full color over + // fadeMs (span-alpha re-render — the only way Qt rich text allows). + // Fragments are cached at batch landing; frames just rewrap. + property string renderedThinkingHtml: "" + property var segments: [] + property string shownText: "" + // Cap new chars per flush: giant stall-bursts would throw the + // ListView's anchor stale (flicker + dead follow). + readonly property int flushChars: 300 + property string shownThinking: "" + + readonly property int fadeMs: 240 + + // fade-span caches for the batches currently brightening: the + // content body (last text segment) and the thinking body. Empty + // tail = no active fade for that region. + property string _fadePrefix: "" + property string _fadeTail: "" + property string _fadeSuffix: "" + property real _fadeStartMs: 0 + property string _thinkFadePrefix: "" + property string _thinkFadeTail: "" + property string _thinkFadeSuffix: "" + property real _thinkFadeStartMs: 0 + + function _fadeColor(k) { + // dim → full, ease-out (surfaceText alpha) + return Theme.withAlpha(Theme.surfaceText, + 0.45 + 0.55 * (k * (2 - k))); + } + + function _thinkFadeColor(k) { + // thinking text settles at surfaceTextMedium (0.7 alpha); + // start bright enough to stay readable while scrolling in + return Theme.withAlpha(Theme.surfaceText, + 0.3 + 0.4 * (k * (2 - k))); + } + + // Splits rendered html at the batch start and returns the initial + // faded html; skips the fade when no safe anchor exists. + function _fadeSplit(cache, text, batchStart) { + var ph = "\x01F\x01"; // 3 chars — suffix must cut at ph.length + var i = batchStart; + if (i <= 0) i = 0; + while (i > 0 && !/\s/.test(text[i - 1])) i--; + var head = Markdown.markdownToHtml(text.substring(0, i), + mdColors, _highlight); + if (!head) return { prefix: "", tail: "", suffix: "", html: head }; + var tail = Markdown.escapeHtml(text.substring(i)); + var spliced = Markdown.spliceIntoLastBlock(head, ph); + var cut = spliced.indexOf(ph); + if (cut < 0) return { prefix: "", tail: "", suffix: "", html: head }; + var parts = { + prefix: spliced.substring(0, cut), + tail: tail, + suffix: spliced.substring(cut + ph.length), + html: "" + }; + parts.html = parts.prefix + + '' + + tail + "" + parts.suffix; + return parts; + } + + // fadeFrom: offset where the newest batch began (-1 = settled). + // Streaming renders at most shownText (advanced ≤flushChars/tick). + function flushBatches(contentFrom, thinkFrom) { + var streaming = msgState === "streaming"; + var renderText = streaming + ? content.substring(0, shownText.length) : content; + if (isUser || renderText.length === 0) { + segments = []; + } else if (streaming && contentFrom >= 0 && contentFrom < renderText.length) { + var segs = Markdown.splitCodeSegments(renderText); + for (var i = 0; i < segs.length; i++) { + if (segs[i].type !== "text") continue; + var rel = -1; + if (i === segs.length - 1 && contentFrom >= 0) { + rel = contentFrom - (renderText.length - segs[i].text.length); + if (rel < 0) rel = 0; + if (rel >= segs[i].text.length) rel = -1; + } + if (rel >= 0) { + var parts = _fadeSplit(_fadeColor, segs[i].text, rel); + _fadePrefix = parts.prefix; + _fadeTail = parts.tail; + _fadeSuffix = parts.suffix; + segs[i].html = parts.html; + } else { + segs[i].html = Markdown.markdownToHtml( + segs[i].text, mdColors, _highlight); + } + } + segments = segs; + } else { + segments = buildSegments(renderText); + } + if (shownThinking.length === 0) { + renderedThinkingHtml = ""; + } else if (streaming && thinkFrom >= 0 && thinkFrom < shownThinking.length) { + var tp = _fadeSplit(_thinkFadeColor, shownThinking, thinkFrom); + _thinkFadePrefix = tp.prefix; + _thinkFadeTail = tp.tail; + _thinkFadeSuffix = tp.suffix; + renderedThinkingHtml = tp.html; + } else { + renderedThinkingHtml = Markdown.markdownToHtml( + shownThinking, mdColors, _highlight); + } + } + + function buildSegments(text) { + var segs = Markdown.splitCodeSegments(text); + for (var i = 0; i < segs.length; i++) + if (segs[i].type === "text") + segs[i].html = Markdown.markdownToHtml( + segs[i].text, mdColors, _highlight); + return segs; + } + + // Read msgState directly, never the derived isStreaming binding — + // inside change handlers QML serves stale dependent values. + function revealTick() { + if (isUser || msgState !== "streaming") return; + if (shownText.length >= content.length + && shownThinking.length >= thinkTail.length) return; + var prevC = shownText.length; + var prevT = shownThinking.length; + // render cap: ≤flushChars new chars enter the layout per tick + shownText = content.substring( + 0, Math.min(content.length, shownText.length + flushChars)); + shownThinking = thinkTail.substring( + 0, Math.min(thinkTail.length, shownThinking.length + flushChars)); + flushBatches(prevC, prevT); + _fadeStartMs = Date.now(); + _thinkFadeStartMs = Date.now(); + fadeTimer.start(); + } + + // One brightening frame per active region; stops itself when both + // fades complete (before the next batch lands). + function fadeFrame() { + if (msgState !== "streaming") { fadeTimer.stop(); return; } + var now = Date.now(); + var active = false; + if (_fadeTail.length > 0) { + var k = Math.min(1, (now - _fadeStartMs) / fadeMs); + var html = _fadePrefix + + '' + + _fadeTail + "" + _fadeSuffix; + if (k >= 1) { + html = _fadePrefix + _fadeTail + _fadeSuffix; + _fadeTail = ""; + } else active = true; + var segs = segments.slice(); + var last = segs[segs.length - 1]; + var copy = {}; + for (var key in last) copy[key] = last[key]; + copy.html = html; + segs[segs.length - 1] = copy; + segments = segs; + } + if (_thinkFadeTail.length > 0) { + var kt = Math.min(1, (now - _thinkFadeStartMs) / fadeMs); + renderedThinkingHtml = _thinkFadePrefix + + '' + + _thinkFadeTail + "" + _thinkFadeSuffix; + if (kt >= 1) { + renderedThinkingHtml = _thinkFadePrefix + _thinkFadeTail + + _thinkFadeSuffix; + _thinkFadeTail = ""; + } else active = true; + } + if (!active) fadeTimer.stop(); + } + + onMsgStateChanged: { + var streaming = msgState === "streaming"; + if (streaming) { + _thinkStartMs = 0; + _thinkDurationMs = 0; + shownText = ""; + shownThinking = ""; + if (content.length === 0) thinkingExpanded = true; + } else { + if (_thinkStartMs > 0 && _thinkDurationMs === 0) + _thinkDurationMs = Date.now() - _thinkStartMs; + shownText = content; + shownThinking = thinkTail; + thinkingExpanded = false; // done → collapsed "Pondered …" + } + fadeTimer.stop(); + flushBatches(-1, -1); + } + onContentChanged: { + if (content.length > 0 && _thinkStartMs > 0 && _thinkDurationMs === 0) { + _thinkDurationMs = Date.now() - _thinkStartMs; + thinkingExpanded = false; // thinking done → hide it + } + if (msgState !== "streaming") flushBatches(-1, -1); + } + onThinkingChanged: { + if (thinking.length > 0 && _thinkStartMs === 0) _thinkStartMs = Date.now(); + if (msgState !== "streaming") { + shownThinking = thinkTail; + flushBatches(-1, -1); + } + } + onMdColorsChanged: { // live theme switch → recolor completed bubbles + shownText = content; + shownThinking = thinkTail; + flushBatches(-1, -1); + } + Component.onCompleted: { + if (msgState === "streaming") thinkingExpanded = true; + else { shownText = content; shownThinking = thinkTail; } + flushBatches(-1, -1); + _maybePlayEntrance(); + } + + // Batch ticker: one reveal per interval. The final render is + // synchronous via onMsgStateChanged, never the timer. Never for + // user rows: they are plain text and terminal from creation. + Timer { + id: renderTimer + interval: 20 + repeat: true + running: bubble.isStreaming && !bubble.isUser + onTriggered: bubble.revealTick() + } + + // Brightening frames while a batch fades in. + Timer { + id: fadeTimer + interval: 20 + repeat: true + running: false + onTriggered: bubble.fadeFrame() + } + + // User: hug-width bubble; assistant: bare content on the panel. + // Root stays full-width/transparent so footers align below. + readonly property real maxBubbleWidth: parent ? parent.width * 2 / 3 : 300 + + width: parent ? parent.width : 300 + // Rectangle defaults to solid white — must stay explicitly + // transparent; all painted surfaces live in the children. + color: "transparent" + implicitHeight: layout.implicitHeight + 20 + + // ── Entrance animation (fresh user messages) ────────────────── + // Fade + slide-up only for freshly appended delegates; recreated + // ones stay static. Imperative writes are safe here (no opacity + // binding on root; Translate never disturbs ListView layout). + transform: Translate { id: entranceShift } + + ParallelAnimation { + id: entranceAnim + NumberAnimation { + target: bubble; property: "opacity" + from: 0; to: 1 + duration: 300; easing.type: Easing.OutCubic + } + NumberAnimation { + target: entranceShift; property: "y" + from: 12; to: 0 + duration: 300; easing.type: Easing.OutCubic + } + } + + function _maybePlayEntrance() { + if (!isUser) return; + if (!(msgTimestamp > 0) || Date.now() - msgTimestamp > 2000) return; + bubble.opacity = 0; + entranceShift.y = 12; + entranceAnim.start(); + } + + ColumnLayout { + id: layout + anchors { left: parent.left; right: parent.right; top: parent.top } + anchors.margins: 10 + spacing: 6 + + // Model label (custom name if renamed) + brand logo keyed off + // the raw model id. + Row { + visible: !bubble.isUser && bubble.modelUsed.length > 0 + spacing: 5 + + BrandIcon { + anchors.verticalCenter: parent.verticalCenter + size: 13 + stem: ModelIcons.iconForModel(bubble.modelUsed, "") + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: bubble.modelLabel + color: Theme.surfaceVariantText + font.pixelSize: 11 + } + } + + // Thinking box (also hosts tool chips alone when there's no + // thinking text). + Loader { + active: thinking.length > 0 || bubble.toolLogArr.length > 0 + Layout.fillWidth: true + sourceComponent: thinkingBox + } + + + // Streaming indicator before first content: the tumbling hex + // sphere (same small config as the footer status row) with a + // plain status label. + Row { + visible: isStreaming && content.length === 0 && thinking.length === 0 + spacing: 8 + + HexSphereLogo { + radius: 11 + strokeWidth: 1.5 + subdivisions: 1 + yawRate: 20 + pitchRate: 8 + interactive: false + anchors.verticalCenter: parent.verticalCenter + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: "Processing prompt" + color: Theme.surfaceVariantText + font.pixelSize: 11 + } + } + + // Count-based Repeater — delegates are reused across ticks, + // each reading its segment by index. + Repeater { + model: bubble.segments ? bubble.segments.length : 0 + + delegate: Loader { + id: segLoader + required property int index + readonly property var seg: + (bubble.segments && index < bubble.segments.length) + ? bubble.segments[index] : null + Layout.fillWidth: true + sourceComponent: + seg && seg.type === "code" ? codeSegComp : textSegComp + onLoaded: item.seg = Qt.binding( + function () { return segLoader.seg; }) + } + } + + // User bubble: right-aligned, fades during edit; attachments + // render as thumbnails above the text. + Rectangle { + id: userBubble + visible: isUser + Layout.alignment: Qt.AlignRight + readonly property bool hasImages: bubble.attachmentsArr.length > 0 + // Hidden no-wrap Text measures the natural line width — + // the TextArea's own implicitWidth is circular and + // collapses under Qt's binding loop guard. + Text { + id: userTextMeasure + visible: false + text: bubble.content + font.pixelSize: 13 + } + Layout.preferredWidth: Math.min( + Math.max(userTextMeasure.implicitWidth, + thumbRow.implicitWidth) + 22, + bubble.maxBubbleWidth) + Layout.maximumWidth: bubble.maxBubbleWidth + implicitHeight: userCol.implicitHeight + 20 + radius: 16 + color: Theme.surfaceContainerHighest + opacity: bubble.service && bubble.msgId.length > 0 + && bubble.service.editingMessageId === bubble.msgId + ? 0.35 : 1 + Behavior on opacity { NumberAnimation { duration: 180 } } + + Column { + id: userCol + anchors { left: parent.left; right: parent.right; top: parent.top } + anchors.margins: 10 + spacing: 8 + + Row { + id: thumbRow + visible: userBubble.hasImages + spacing: 6 + + Repeater { + model: bubble.attachmentsArr.length + + delegate: Rectangle { + required property int index + width: 120 + height: 84 + radius: 6 + color: Theme.withAlpha(Theme.surfaceContainerLowest, 0.6) + clip: true + + Image { + anchors.fill: parent + asynchronous: true + fillMode: Image.PreserveAspectCrop + source: bubble.attachmentsArr[index] + ? "data:" + bubble.attachmentsArr[index].mime + + ";base64," + bubble.attachmentsArr[index].data + : "" + } + } + } + } + + TextArea { + id: userText + width: parent.width + text: bubble.content + textFormat: TextEdit.PlainText + wrapMode: TextEdit.Wrap + readOnly: true + selectByMouse: true + persistentSelection: true + color: Theme.surfaceText + font.pixelSize: 13 + background: null + leftPadding: 0 + rightPadding: 0 + topPadding: 0 + bottomPadding: 0 + } + } + } + + // Footer: assistant rows hug left, user rows hug right; the + // fillers carry the slack width. + RowLayout { + Layout.fillWidth: true + visible: !isStreaming && (bubble.content.length > 0 || stats.length > 0) + spacing: 8 + + Item { + Layout.fillWidth: true + visible: isUser + } + + // User: copy + edit (edit hands the text to the composer). + HoverIcon { + visible: isUser && bubble.content.length > 0 + iconName: "content_copy" + onClicked: Quickshell.execDetached( + ["wl-copy", "--", bubble.content]) + } + HoverIcon { + visible: isUser + iconName: "edit" + onClicked: if (bubble.service && bubble.msgId.length > 0) + bubble.service.beginEditUserMessage(bubble.msgId) + } + + // Assistant: regenerate (hidden on error — the Retry + // button covers that state) + copy. + HoverIcon { + visible: !isUser && msgState !== "error" + iconName: "restart_alt" + onClicked: if (bubble.service && bubble.msgId.length > 0) + bubble.service.regenerateMessage(bubble.msgId) + } + HoverIcon { + visible: !isUser && bubble.content.length > 0 + iconName: "content_copy" + onClicked: Quickshell.execDetached( + ["wl-copy", "--", bubble.content]) + } + + Text { + visible: stats.length > 0 + text: stats + color: Theme.surfaceVariantText + font.pixelSize: 11 + } + + Item { + Layout.fillWidth: true + visible: !isUser + } + } + + // Retry affordance for errors + DankButton { + visible: msgState === "error" + text: "Retry" + iconName: "refresh" + buttonHeight: 32 + onClicked: if (bubble.service) bubble.service.retryLast() + } + } + + // Markdown text segment (the proven themed rich-text TextArea) + Component { + id: textSegComp + TextArea { + property var seg: null + readOnly: true + textFormat: TextEdit.RichText + wrapMode: TextEdit.Wrap + text: seg ? seg.html : "" + color: bubble.msgState === "error" ? Theme.error : Theme.surfaceText + background: null + leftPadding: 0 + rightPadding: 0 + topPadding: 0 + bottomPadding: 0 + onLinkActivated: (link) => { + if (/^https?:\/\//i.test(link)) Qt.openUrlExternally(link); + } + } + } + + // Code segment: a sticky language bar (language + copy) that is + // ALWAYS visible — it sticks to the viewport top while a tall + // block is scrolled, with a touch of contrast so code slides + // under it legibly — and the code below it. + Component { + id: codeSegComp + Rectangle { + id: codeRect + property var seg: null + readonly property string rawCode: seg ? seg.code : "" + readonly property bool tall: bubble.viewportHeight > 0 + && height >= bubble.viewportHeight - 40 + readonly property int headerH: 34 + // block top in viewport coords: fully REACTIVE (delegate + // y + loader y − contentY) — a mapToItem ticker would lag + // the scroll by a frame and make the bar bounce + readonly property real _viewY: 10 + parent.y + + (bubble.parent ? bubble.parent.y : 0) + - (bubble.listView ? bubble.listView.contentY : 0) + // the bar sticks to the viewport top while the block is + // scrolled, clamped inside the block + readonly property real headerY: + Math.max(0, Math.min(height - headerH, -_viewY)) + + color: Theme.withAlpha(Theme.surfaceContainerLowest, 0.75) + radius: 8 + implicitHeight: codeCol.implicitHeight + headerH + 10 + clip: true + + ColumnLayout { + id: codeCol + anchors { left: parent.left; right: parent.right; top: parent.top } + anchors.margins: 6 + anchors.topMargin: headerH + 8 + spacing: 4 + + TextArea { + Layout.fillWidth: true + readOnly: true + textFormat: TextEdit.RichText + wrapMode: TextEdit.Wrap + // RichText collapses literal newlines; the pre-wrap + // block preserves them and still wraps long lines + // (same pattern as Markdown.js fenced blocks). + text: codeRect.seg + ? "

      "
      +                          + SyntaxHighlight.highlightCode(
      +                              codeRect.seg.code, codeRect.seg.lang,
      +                              bubble.mdColors.syntax) + "
      " + : "" + color: Theme.surfaceText + font.family: "monospace" + font.pixelSize: 12 + background: null + leftPadding: 0 + rightPadding: 0 + topPadding: 0 + bottomPadding: 0 + } + } + + // Sticky language bar: declared after the code so it sits + // on top while code slides under it. + Rectangle { + id: langBar + x: 0 + y: codeRect.headerY + width: parent.width + height: codeRect.headerH + radius: 8 + color: Theme.surfaceContainerHigh + + RowLayout { + anchors.fill: parent + anchors.margins: 4 + + Text { + visible: codeRect.seg && codeRect.seg.lang.length > 0 + text: codeRect.seg ? codeRect.seg.lang : "" + color: Theme.surfaceVariantText + font.pixelSize: 13 + } + Item { Layout.fillWidth: true } + HoverIcon { + iconName: "content_copy" + iconColor: Theme.surfaceVariantText + onClicked: Quickshell.execDetached( + ["wl-copy", "--", codeRect.rawCode]) + } + } + } + } + } + + Component { + id: thinkingBox + ColumnLayout { + id: thinkPane + spacing: 4 + // Thinking header chip: hovering tints it with the accent + // color and crossfades the bulb into an expand arrow; the + // whole chip is the toggle target. Hidden when the model + // produced no thinking — the box then hosts only the + // tool chips below. + Rectangle { + id: thinkHeader + visible: thinking.length > 0 + Layout.fillWidth: false + implicitWidth: headerRow.implicitWidth + 16 + implicitHeight: headerRow.implicitHeight + 8 + radius: 8 + color: thinkHeaderHover.hovered + ? Theme.withAlpha(Theme.primary, 0.14) : "transparent" + Behavior on color { ColorAnimation { duration: 220 } } + + HoverHandler { + id: thinkHeaderHover + cursorShape: Qt.PointingHandCursor + } + TapHandler { + onTapped: bubble.thinkingExpanded = + !bubble.thinkingExpanded + } + + RowLayout { + id: headerRow + anchors.centerIn: parent + spacing: 6 + + Item { + width: 16; height: 16 + DankIcon { + anchors.centerIn: parent + name: "emoji_objects" + size: 16 + color: Theme.surfaceVariantText + opacity: thinkHeaderHover.hovered ? 0 : 1 + Behavior on opacity { + NumberAnimation { duration: 220 } + } + } + DankIcon { + anchors.centerIn: parent + name: "expand_more" + size: 16 + color: Theme.primary + opacity: thinkHeaderHover.hovered ? 1 : 0 + Behavior on opacity { + NumberAnimation { duration: 220 } + } + } + } + + Text { + text: !bubble.thinkingDone ? "Pondering..." + : (bubble.thinkingExpanded ? "Hide thinking" + : bubble.ponderedLabel()) + color: thinkHeaderHover.hovered + ? Theme.primary : Theme.surfaceVariantText + font.pixelSize: 11 + Behavior on color { ColorAnimation { duration: 220 } } + } + } + } + + // Thinking content: 220px cap + smoothed height; auto-scroll + // pinned to the bottom while streaming, free after. Column + // so tool chips render inside the collapsible area. + Flickable { + id: thinkFlick + // Hidden when collapsed — unless there's no thinking + // text and the box hosts only the tool chips. + visible: bubble.thinkingExpanded || thinking.length === 0 + Layout.fillWidth: true + Layout.preferredHeight: smoothH + readonly property int maxH: 220 + property real smoothH: Math.min(contentHeight, maxH) + Behavior on smoothH { + NumberAnimation { duration: 150; easing.type: Easing.OutQuad } + } + contentHeight: thinkContent.implicitHeight + clip: true + + property bool pinned: true + + function chase() { + if (!pinned || !bubble.isStreaming) return; + if (height <= 0) return; + // Scroll ONLY on real overflow of the capped box. + // While the box is still growing, growth itself + // reveals the new text — chasing here would scroll + // content that the height animation is about to + // reveal (the per-flush nudge). + if (contentHeight - maxH < 10) return; + var target = contentHeight - maxH; + // huge backlog: snap (safe — plain Flickable has no + // item-anchor machinery to fight) + if (target - contentY > height) { + contentY = target; + return; + } + if (Math.abs(contentY - target) < 0.5) return; + thinkChaseAnim.to = target; + thinkChaseAnim.restart(); + } + + function unpin() { + pinned = false; + thinkChaseAnim.stop(); + } + + onContentHeightChanged: chase() + + onDraggingChanged: if (dragging) unpin() + onFlickingChanged: if (flicking) unpin() + onContentYChanged: { + // the chase only ever increases contentY; any + // decrease is the user scrolling up + if (contentY < thinkFlick._lastY - 2) unpin(); + thinkFlick._lastY = contentY; + if (atYEnd) pinned = true; + } + property real _lastY: 0 + + NumberAnimation { + id: thinkChaseAnim + target: thinkFlick + property: "contentY" + // Linear conveyor, same rationale as the message + // list follow: eased restarts spike per flush. + duration: 200 + easing.type: Easing.Linear + } + + WheelHandler { + onWheel: (event) => { + thinkFlick.unpin(); + event.accepted = false; + } + } + + // Box content: the pondering flow as interleaved + // segments — thinking text with the tool chips placed + // at the chronological point each call was issued: + // [text] [chip] [text] [chip] [live tail]. Everything + // lives inside the collapsible area, so it expands and + // collapses together with the box. + Column { + id: thinkContent + width: thinkFlick.width + spacing: 8 + + // Count-based model: delegates are reused while + // the count is stable; each reads its segment by + // index (same pattern as the body segments). + Repeater { + model: bubble.thinkSegments.length + + delegate: Loader { + id: segLoader + required property int index + readonly property var seg: + (bubble.thinkSegments + && index < bubble.thinkSegments.length) + ? bubble.thinkSegments[index] : null + width: thinkContent.width + sourceComponent: + seg && seg.type === "tool" + ? toolChipComp : thinkTextSegComp + onLoaded: { + if (seg && seg.type === "tool") { + item.index = Qt.binding(function () { + return segLoader.seg ? segLoader.seg.idx : 0; + }); + item.entry = Qt.binding(function () { + var s = segLoader.seg; + return s ? (bubble.toolLogArr[s.idx] || null) + : null; + }); + } else { + // Text segment: hand the segment + // record to the TextArea so it can + // switch between the live fade html + // and the static markdown render. + item.seg = Qt.binding(function () { + return segLoader.seg; + }); + } + } + } + } + } + + Component { + id: thinkTextSegComp + TextArea { + property var seg: null + width: thinkContent.width + readOnly: true + textFormat: TextEdit.RichText + wrapMode: TextEdit.Wrap + // The live tail streams through the fade/ + // reveal machinery; frozen heads render static + // markdown (their round is complete). + text: seg && seg.live + ? bubble.renderedThinkingHtml + : bubble.staticThinkHtml(seg ? seg.text : "") + color: Theme.surfaceTextMedium + font.pixelSize: 12 + background: null + leftPadding: 0 + rightPadding: 0 + topPadding: 0 + bottomPadding: 0 + } + } + } + + // One tool chip + its collapsible detail block. Generic + // label ("Calling Tool" / "Tool called for N seconds"); + // the actual tool name lives in the detail. index/entry are + // bound by the instantiating Loader so the chip updates + // live as the entry mutates. + Component { + id: toolChipComp + + ColumnLayout { + id: toolEntry + property int index: 0 + property var entry: null + readonly property bool expanded: bubble.isToolExpanded(index) + readonly property bool hasDetail: + entry && entry.detail && entry.detail.length > 0 + // Sub-second calls collapse to "(less than a + // second)" so the chip never shows 0 seconds. + readonly property string chipLabel: { + var e = toolEntry.entry; + if (!e || e.state === "running") return "Calling Tool"; + var ms = Math.max(0, + (e.endMs || 0) - (e.startMs || 0)); + if (ms < 1000) return "Tool called (less than a second)"; + return "Tool called for " + Math.round(ms / 1000) + " seconds"; + } + + Layout.fillWidth: true + spacing: 2 + + // Tool chip: generic label (real name is in the + // detail); hover crossfades the icon to a + // chevron; accent "breathing" while in flight. + Rectangle { + id: toolChip + Layout.fillWidth: false + implicitWidth: toolChipRow.implicitWidth + 16 + implicitHeight: toolChipRow.implicitHeight + 8 + radius: 8 + color: chipHover.hovered + ? Theme.withAlpha(Theme.primary, 0.14) : "transparent" + Behavior on color { ColorAnimation { duration: 220 } } + + // 0 → 1 → 0, only while the call is in + // flight. Lerps text/icon color toward + // the accent for the "breathing" effect. + property real breathe: 0 + SequentialAnimation on breathe { + running: toolEntry.entry + && toolEntry.entry.state === "running" + loops: Animation.Infinite + NumberAnimation { + from: 0; to: 1; duration: 750 + easing.type: Easing.InOutSine + } + NumberAnimation { + from: 1; to: 0; duration: 750 + easing.type: Easing.InOutSine + } + } + + function breatheColor(base, accent) { + var k = toolChip.breathe * 0.55; + return Qt.rgba( + base.r + (accent.r - base.r) * k, + base.g + (accent.g - base.g) * k, + base.b + (accent.b - base.b) * k, + 1 + ); + } + + // Icon follows the text color and breathes + // toward the accent while in flight. + function iconColor() { + var base = Theme.surfaceVariantText; + if (chipHover.hovered) return Theme.primary; + if (!toolEntry.entry + || toolEntry.entry.state !== "running") + return base; + return toolChip.breatheColor(base, Theme.primary); + } + + HoverHandler { id: chipHover; cursorShape: Qt.PointingHandCursor } + TapHandler { + onTapped: if (toolEntry.hasDetail) + bubble.toggleToolExpand(toolEntry.index) + } + + RowLayout { + id: toolChipRow + anchors.centerIn: parent + spacing: 6 + + // Left slot: handyman glyph crossfading + // to a chevron on hover. + Item { + width: 16; height: 16 + DankIcon { + anchors.centerIn: parent + name: "handyman" + size: 14 + color: toolChip.iconColor() + opacity: chipHover.hovered ? 0 : 1 + Behavior on opacity { + NumberAnimation { duration: 220 } + } + } + DankIcon { + anchors.centerIn: parent + name: "expand_more" + size: 14 + color: toolChip.iconColor() + opacity: chipHover.hovered ? 1 : 0 + rotation: toolEntry.expanded ? 180 : 0 + Behavior on opacity { + NumberAnimation { duration: 220 } + } + Behavior on rotation { + RotationAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + } + + Text { + text: toolEntry.chipLabel + color: { + if (chipHover.hovered) return Theme.primary; + return toolChip.breathe + ? toolChip.breatheColor( + Theme.surfaceVariantText, + Theme.primary) + : Theme.surfaceVariantText; + } + font.pixelSize: 11 + font.family: Theme.monoFontFamily + elide: Text.ElideRight + } + } + } + + // Collapsible detail: real tool name + pretty- + // printed response. Flickable caps the height; + // body is NoWrap to keep the JSON indent intact. + ColumnLayout { + id: toolDetail + visible: toolEntry.expanded && toolEntry.hasDetail + Layout.fillWidth: true + Layout.topMargin: 2 + spacing: 4 + + Text { + Layout.fillWidth: true + text: toolEntry.entry ? toolEntry.entry.name : "" + color: Theme.surfaceVariantText + font.pixelSize: 12 + font.family: Theme.monoFontFamily + font.bold: true + elide: Text.ElideRight + } + + Flickable { + id: toolFlick + Layout.fillWidth: true + property real smoothH: + Math.min(toolDetailBody.contentHeight, 260) + Behavior on smoothH { + NumberAnimation { duration: 150; easing.type: Easing.OutQuad } + } + Layout.preferredHeight: smoothH + contentHeight: toolDetailBody.contentHeight + contentWidth: toolDetailBody.contentWidth + clip: true + boundsBehavior: Flickable.StopAtBounds + + TextArea { + id: toolDetailBody + width: Math.max(toolFlick.width, + toolDetailBody.contentWidth) + readOnly: true + textFormat: TextEdit.PlainText + wrapMode: TextEdit.NoWrap + text: toolEntry.entry + ? bubble.formatToolDetail(toolEntry.entry.detail) + : "" + color: Theme.surfaceTextMedium + font.pixelSize: 12 + font.family: Theme.monoFontFamily + background: null + leftPadding: 8 + rightPadding: 8 + topPadding: 8 + bottomPadding: 8 + selectByMouse: true + } + } + } + } + } + } + } + } diff --git a/src/components/MessageList.qml b/src/components/MessageList.qml new file mode 100644 index 0000000..24b4d6b --- /dev/null +++ b/src/components/MessageList.qml @@ -0,0 +1,227 @@ +import QtQuick +import QtQuick.Controls +import qs.Common +import qs.Widgets + +ListView { + id: list + + property var service: null + model: service ? service.messagesModel : null + + clip: true + spacing: 10 + boundsBehavior: Flickable.StopAtBounds + + // Keep-alive window spans the full conversation: delegates are + // never destroyed at a cache boundary (finite buffers wobbled + // contentHeight and made bottom-follow flicker). + cacheBuffer: Math.max(500, contentHeight) + + // ── Bottom-follow ───────────────────────────────────────────── + // While streaming (and the user hasn't taken over), a frame + // conveyor eases contentY toward the end. Drag/wheel/scroll-away + // unpins; returning to the end, the pill, or a new message + // re-pins. After the stream the view is user-owned. + property bool pinned: true + property real _peakY: 0 + property real _lastY: 0 + property real _lastTarget: 0 + // frames left in a "force to end" re-assert window (pill press) + property int _assertTicks: 0 + + function unpin() { + pinned = false; + } + + // New rows (message sent, chat cleared) always re-pin: submitting + // a message means you want to see the response. + onCountChanged: { + pinned = true; + _peakY = contentY; + _lastY = contentY; + _lastTarget = Math.max(0, contentHeight - height); + } + + onDraggingChanged: if (dragging) unpin() + onFlickingChanged: if (flicking) unpin() + + // Render-frame conveyor: perfectly uniform steps (synced to the + // render loop — a Timer races/mismatches flush and frame timing, + // which read as choppy nudging). + FrameAnimation { + running: (list.pinned && list.service && list.service.isStreaming) + || list._assertTicks > 0 + onTriggered: list.step() + } + + function step() { + var target = Math.max(0, contentHeight - height); + // Pill "force to end" window: pin contentY to the end for a + // few frames so any polish pass re-asserting a stale anchor + // is overridden. + if (_assertTicks > 0) { + contentY = target; + _peakY = target; + _lastY = target; + _lastTarget = target; + _assertTicks--; + return; + } + var dY = contentY - _lastY; + var dTarget = target - _lastTarget; + // The conveyor only increases contentY; a drop >8px with a + // still end means the user scrolled — hand over control. + // Re-pin via return-to-end or the pill. + if (dY < -8 && dTarget > -2) { + unpin(); + return; + } + // Content shrank (thinking box collapse — the end itself moved + // up): re-anchor the high-water mark and keep following. + if (contentY < _peakY - 24 && target < _peakY - 24) + _peakY = target; + if (contentY > _peakY) _peakY = contentY; + var gap = target - contentY; + if (gap < 0.5) return; + contentY += Math.min(gap, gap * 0.15); + _lastY = contentY; + _lastTarget = target; + if (contentY > _peakY) _peakY = contentY; + } + + onContentYChanged: if (atYEnd) pinned = true + + // Streaming status strip: reserves space at the end of the + // content while a stream is live. + footer: Component { + Item { + width: list.width + height: list.service && list.service.isStreaming ? 34 : 0 + } + } + + // Streaming status chip on a solid surface — readable over text; + // sticks to the viewport bottom once its footer strip slips out. + // (Same pattern as the code block language bar.) + Rectangle { + id: statusRow + visible: list.service && list.service.isStreaming + && list.service.messageCount > 0 + anchors.left: parent.left + anchors.leftMargin: 6 + radius: 10 + implicitWidth: statusInner.implicitWidth + 20 + implicitHeight: statusInner.implicitHeight + 10 + color: Theme.withAlpha(Theme.surfaceContainer, 0.9) + y: Math.min( + list.contentHeight - list.contentY + 6, + list.height - height - 6) + + Row { + id: statusInner + anchors.centerIn: parent + spacing: 8 + + HexSphereLogo { + radius: 11 + strokeWidth: 1.5 + subdivisions: 1 + yawRate: 20 + pitchRate: 8 + interactive: false + anchors.verticalCenter: parent.verticalCenter + visible: statusRow.visible + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: list.service ? list.service.ponderingText : "" + visible: text.length > 0 + color: Theme.surfaceVariantText + font.pixelSize: 11 + } + } + } + + // Stream ended: the view is user-owned; the pill takes over. + Connections { + target: list.service + function onIsStreamingChanged() { + if (list.service && !list.service.isStreaming) + list.pinned = false; + } + } + + // Full-width wrapper: ListView resets delegate x during layout, so + // right-alignment must come from anchoring the bubble inside. + delegate: Item { + width: ListView.view ? ListView.view.width : 300 + implicitHeight: bubbleItem.height + + MessageBubble { + id: bubbleItem + anchors.right: parent.right + service: list.service + listView: list + msgId: model.id + role: model.role + content: model.content + thinking: model.thinking + toolLog: model.toolLog + attachments: model.attachments + modelUsed: model.modelUsed + modelProviderId: model.modelProviderId + msgState: model.state + stats: model.stats + msgTimestamp: model.timestamp + } + } + + ScrollBar.vertical: DankScrollbar { + onPressedChanged: if (pressed) list.unpin() + } + + // Scroll-to-end pill: shows while the user holds scroll control + // away from the end (streaming or not); re-pins the follow (or + // returns to the bottom after the stream). + Rectangle { + id: toEndButton + visible: !list.pinned && !list.atYEnd + && (list.contentHeight - list.height - list.contentY) > 80 + && list.contentHeight > list.height + 40 + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.margins: 14 + width: 34 + height: 34 + radius: 17 + color: toEndHover.hovered + ? Theme.withAlpha(Theme.primary, 0.25) + : Theme.surfaceContainerHigh + border.width: 1 + border.color: Theme.outlineVariant + + DankIcon { + anchors.centerIn: parent + name: "arrow_downward" + size: 18 + color: toEndHover.hovered ? Theme.primary : Theme.surfaceText + } + + HoverHandler { + id: toEndHover + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: { + // re-pin and force to end through a short re-assert + // window (a plain write can be reverted by the view's + // stale anchor after churn) + list.pinned = true; + list._assertTicks = 15; + } + } + } +} diff --git a/src/components/ModelSelector.qml b/src/components/ModelSelector.qml new file mode 100644 index 0000000..607409a --- /dev/null +++ b/src/components/ModelSelector.qml @@ -0,0 +1,883 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import qs.Common +import qs.Widgets +import "../lib/ModelIcons.js" as ModelIcons +import "../lib/FuzzyMatch.js" as FuzzyMatch + + // Bottom-bar chip, two zones: active model + chevron (model picker: + // pinned first, then per-provider groups), and tune icon (params + // popup). Popups open upward; picking a model from another instance + // switches the active provider too. +Rectangle { + id: selector + + property var service: null + + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.5) + implicitHeight: 34 + + // No-op placeholder while the service is missing; keep the chip + // visible so the layout is stable. + readonly property string modelLabel: + (service && service.activeModel && service.activeModel.length > 0) + ? service.modelLabel(service.activeProviderId, service.activeModel) + : "set model" + // Brand stem of the model in use ("" when none is active). + readonly property string activeStem: { + // Unused on purpose: reading modelIconStems is the QML + // dependency that re-runs this binding when the startup icon + // scan lands — iconForModel also matches AUTO_RULES, a plain + // lib var that cannot notify on its own. + var _scan = service ? service.modelIconStems : null; + return (service && service.activeModel && service.activeModel.length > 0) + ? ModelIcons.iconForModel(service.activeModel, + service.activeInstance && service.activeInstance.type + ? String(service.activeInstance.type) : "") + : ""; + } + + // Provider groups the user collapsed in the picker (pid → true). + property var collapsedProviders: ({}) + function toggleCollapsed(pid) { + var m = {}; + for (var k in collapsedProviders) m[k] = collapsedProviders[k]; + if (m[pid]) delete m[pid]; + else m[pid] = true; + collapsedProviders = m; + } + + // Flat rows for the picker list: header rows and model rows. + // Reads pinnedModels/providers (reassigned on every change) so the + // ListView model binding re-evaluates through the service's + // reassignment pattern. Stale pins (provider deleted) are skipped. + function buildRows(filter) { + if (!service) return []; + var f = String(filter || "").toLowerCase(); + var rows = []; + var pins = service.pinnedModels || []; + for (var i = 0; i < pins.length; i++) { + var rec = pins[i]; + if (!rec || !rec.providerId || !rec.model) continue; + var pinInst = service.getProvider(rec.providerId); + if (!pinInst || pinInst.enabled === false) continue; + if (rows.length === 0) + rows.push({ kind: "header", name: "Pinned", type: "" }); + rows.push({ kind: "model", providerId: String(rec.providerId), + model: String(rec.model), + type: String(pinInst.type) }); + } + var provs = service.providers || []; + for (var j = 0; j < provs.length; j++) { + var p = provs[j]; + if (!p || !p.id) continue; + // Disabled providers vanish from the picker. + if (p.enabled === false) continue; + var checked = p.checkedModels || []; + if (checked.length === 0) continue; + var collapsed = collapsedProviders[String(p.id)] === true; + rows.push({ kind: "header", + name: p.name && p.name.length > 0 ? String(p.name) : String(p.id), + type: String(p.type), pid: String(p.id), + collapsed: collapsed }); + if (collapsed && !f) continue; // search ignores collapse + for (var k = 0; k < checked.length; k++) + rows.push({ kind: "model", providerId: String(p.id), + model: String(checked[k]), + type: String(p.type) }); + } + + if (!f) return rows; + var out = []; + for (var r = 0; r < rows.length; r++) { + var row = rows[r]; + if (row.kind === "header") { out.push(row); continue; } + var lbl = service.modelLabel(row.providerId, row.model); + if (FuzzyMatch.matches(f, row.model) + || FuzzyMatch.matches(f, String(lbl))) out.push(row); + } + // drop headers left without any following model row + var pruned = []; + for (r = 0; r < out.length; r++) { + if (out[r].kind === "model") { pruned.push(out[r]); continue; } + if (r + 1 < out.length && out[r + 1].kind === "model") pruned.push(out[r]); + } + return pruned; + } + + // Model zone (left): label + chevron. Hover highlights the zone + // (not the tune section) and shows the pointing cursor. + Item { + id: modelArea + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.leftMargin: 12 + width: modelRow.implicitWidth + 8 + + Rectangle { + anchors.fill: parent + radius: 8 + // Fade via opacity: interpolating color toward "transparent" + // drifts the RGB toward black and reads as a dark flash. + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.5) + opacity: modelHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + RowLayout { + id: modelRow + anchors.centerIn: parent + spacing: 6 + + BrandIcon { + size: 16 + stem: selector.activeStem + } + + Text { + text: selector.modelLabel + color: Theme.surfaceVariantText + font.pixelSize: 12 + elide: Text.ElideRight + Layout.maximumWidth: 180 + } + + DankIcon { + name: modelPicker.visible ? "expand_more" : "expand_less" + size: 16 + color: Theme.surfaceVariantText + } + } + + HoverHandler { id: modelHover; cursorShape: Qt.PointingHandCursor } + + TapHandler { + onTapped: modelPicker.visible ? modelPicker.close() : modelPicker.open() + } + } + + // Zone divider + Rectangle { + id: zoneDivider + anchors.left: modelArea.right + anchors.leftMargin: 6 + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.margins: 8 + width: 1 + color: Theme.withAlpha(Theme.outlineVariant, 0.6) + } + + // Tune zone (right): generation params + Item { + id: tuneArea + anchors.left: zoneDivider.right + anchors.leftMargin: 6 + anchors.top: parent.top + anchors.bottom: parent.bottom + width: 36 + + DankIcon { + anchors.centerIn: parent + name: "instant_mix" + size: 18 + color: genPopup.visible || tuneHover.hovered + ? Theme.primary : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 250 } } + } + + HoverHandler { id: tuneHover; cursorShape: Qt.PointingHandCursor } + + TapHandler { + onTapped: genPopup.visible ? genPopup.close() : genPopup.open() + } + } + + // Width budget: left margin 12 + model area (row + 8) + divider + // (6 margin + 1 + 6 margin) + tune zone 36 + right padding 8. + implicitWidth: modelRow.implicitWidth + 77 + + // ── Unified model picker ───────────────────────────────────── + Popup { + id: modelPicker + y: -height - 8 + width: Math.min(selector.width + 220, 380) + height: Math.min(640, contentItem.implicitHeight + 24) + padding: 8 + + background: Rectangle { + radius: 12 + color: Theme.surfaceContainerHigh + border.color: Theme.outlineVariant + } + + contentItem: ColumnLayout { + id: pickerCol + spacing: 8 + + // Make a manual entry the active model; if the id is not + // already in the active instance's checked list, persist it + // there too so it reappears next time. + function pickModel(id) { + if (!selector.service || id.length === 0) return; + var svc = selector.service; + var models = svc.activeModels(); + var known = false; + for (var i = 0; i < models.length; i++) + if (models[i] === id) { known = true; break; } + if (!known) + svc.toggleModel(svc.activeProviderId, id); + svc.setActiveModel(id); + modelPicker.close(); + } + + // Cross-instance selection: switching provider resets the + // active model (setActiveProvider), so set it afterwards. + function selectModel(providerId, modelId) { + if (!selector.service || !modelId || modelId.length === 0) return; + selector.service.setActiveProvider(String(providerId)); + selector.service.setActiveModel(String(modelId)); + modelPicker.close(); + } + + ListView { + id: modelList + Layout.fillWidth: true + // Floor of 56 keeps the empty-state hint visible when + // no provider has checked models. + Layout.preferredHeight: Math.min(480, Math.max(contentHeight, 56)) + clip: true + spacing: 2 + model: selector.service + ? selector.buildRows(manualEntry.text) : [] + + delegate: Item { + id: rowDelegate + required property var modelData + readonly property bool isModelRow: + modelData && modelData.kind === "model" + readonly property string rowProviderId: + isModelRow ? String(modelData.providerId) : "" + readonly property string rowModelId: + isModelRow ? String(modelData.model) : "" + readonly property string rowIconStem: { + // Unused read — same dependency trick as + // activeStem above (subscribes to the icon scan). + var _scan = selector.service ? selector.service.modelIconStems : null; + return isModelRow + ? ModelIcons.iconForModel(rowModelId, + modelData && modelData.type ? String(modelData.type) : "") + : ""; + } + readonly property string headerIconStem: + !isModelRow && modelData && modelData.type + ? ModelIcons.providerIcon(String(modelData.type)) : "" + readonly property string rowPid: + !isModelRow && modelData && modelData.pid + ? String(modelData.pid) : "" + readonly property bool rowCollapsed: + rowPid.length > 0 + && selector.collapsedProviders[rowPid] === true + readonly property bool rowPinned: + selector.service && isModelRow + && selector.service.isPinned(rowProviderId, rowModelId) + readonly property bool rowActive: + selector.service && isModelRow + && rowProviderId === selector.service.activeProviderId + && rowModelId === selector.service.activeModel + + width: modelList.width + height: isModelRow ? 44 : 26 + + // Group header (or the "Pinned" section label): + // provider logo + name; tappable to collapse the + // group (except the Pinned label). + Row { + visible: !rowDelegate.isModelRow + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.verticalCenter: parent.verticalCenter + spacing: 6 + + BrandIcon { + anchors.verticalCenter: parent.verticalCenter + size: 14 + stem: rowDelegate.headerIconStem + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: rowDelegate.isModelRow ? "" + : (rowDelegate.modelData ? String(rowDelegate.modelData.name) : "") + color: Theme.withAlpha(Theme.surfaceVariantText, 0.6) + font.pixelSize: 11 + } + + TapHandler { + onTapped: if (rowDelegate.rowPid.length > 0) + selector.toggleCollapsed(rowDelegate.rowPid) + } + HoverHandler { + id: headerHover + enabled: rowDelegate.rowPid.length > 0 + cursorShape: Qt.PointingHandCursor + } + } + + // Collapse chevron (anchored right; the Row is a + // positioner and can't host it). + DankIcon { + visible: !rowDelegate.isModelRow + && rowDelegate.rowPid.length > 0 + anchors.right: parent.right + anchors.rightMargin: 12 + anchors.verticalCenter: parent.verticalCenter + name: rowDelegate.rowCollapsed ? "expand_more" : "expand_less" + size: 16 + color: headerHover.hovered ? Theme.primary : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 150 } } + } + + ItemDelegate { + id: modelDelegate + visible: rowDelegate.isModelRow + width: parent.width + height: parent.height + hoverEnabled: true + background: Rectangle { + radius: 6 + color: modelDelegate.hovered + ? Theme.withAlpha(Theme.primary, 0.14) : "transparent" + Behavior on color { ColorAnimation { duration: 150 } } + } + HoverHandler { cursorShape: Qt.PointingHandCursor } + + // Select area: everything left of the pin zone, + // so a tap on the pin never also selects. + Item { + id: selectArea + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: pinZone.left + anchors.leftMargin: 26 + anchors.rightMargin: 2 + + TapHandler { + onTapped: pickerCol.selectModel( + rowDelegate.rowProviderId, + rowDelegate.rowModelId) + } + + RowLayout { + anchors.fill: parent + spacing: 8 + + BrandIcon { + Layout.alignment: Qt.AlignVCenter + size: 16 + stem: rowDelegate.rowIconStem + } + + Text { + Layout.fillWidth: true + text: selector.service + ? selector.service.modelLabel( + rowDelegate.rowProviderId, + rowDelegate.rowModelId) + : rowDelegate.rowModelId + color: modelDelegate.hovered ? Theme.primary : Theme.surfaceText + font.pixelSize: 13 + elide: Text.ElideRight + } + DankIcon { + visible: rowDelegate.rowActive + name: "check" + size: 16 + color: Theme.primary + } + } + } + + // Pin zone: own TapHandler, no overlap with the + // select area — toggling must not select. Hover + // tints the pin to the accent color. + Item { + id: pinZone + width: 32 + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + + HoverHandler { + id: pinHover + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: if (selector.service && rowDelegate.isModelRow) + selector.service.togglePinned( + rowDelegate.rowProviderId, + rowDelegate.rowModelId) + } + + DankIcon { + anchors.centerIn: parent + name: "push_pin" + size: 16 + filled: rowDelegate.rowPinned + color: rowDelegate.rowPinned || pinHover.hovered + ? Theme.primary : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 250 } } + } + } + } + } + + Text { + anchors.centerIn: parent + visible: modelList.count === 0 + text: manualEntry.text.length > 0 + ? "No models match" + : "No models — enable some in settings" + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + width: parent.width - 16 + horizontalAlignment: Text.AlignHCenter + } + + } + + RowLayout { + Layout.fillWidth: true + spacing: 6 + DankTextField { + id: manualEntry + Layout.fillWidth: true + placeholderText: "Search model" + leftIconName: "search" + showClearButton: true + } + DankButton { + iconName: "check" + text: "" + buttonHeight: 36 + onClicked: pickerCol.pickModel(manualEntry.text.trim()) + } + } + } + } + + // ── Generation params (Common Settings) ────────────────────── + + // Checkbox card: checkbox center-left; title top-right with the + // number box beside it; slider below. Content grays when unchecked. + // Values are handled in raw slider units; `multiplier` converts to + // the real-world value (temperature uses 0.01). + component SettingCard : Rectangle { + id: card + + property string label: "" + property bool checked: false + property int rawValue: 0 + property int rawMin: 0 + property int rawMax: 100 + property int rawStep: 1 + property real multiplier: 1.0 + property int decimals: 0 + signal toggled(bool checked) + signal valueEdited(int rawValue) + + // True while the card syncs the slider from rawValue — suppresses + // the slider's onValueChanged side effects (focus steal + echo). + property bool _syncing: false + + // True when the point (card-relative) sits over one of the + // card's interactive children — taps there must NOT toggle + // the checkbox. + function overChild(child, p) { + if (!child || !child.visible) return false; + var tl = card.mapFromItem(child, 0, 0); + return p.x >= tl.x && p.x <= tl.x + child.width + && p.y >= tl.y && p.y <= tl.y + child.height; + } + + function displayValue() { + return (rawValue * multiplier).toFixed(decimals); + } + + width: parent ? parent.width : 260 + implicitHeight: cardContent.implicitHeight + 8 + radius: 6 + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.22) + + // Passive hover highlight: a soft wash that fades in under + // the pointer. HoverHandler only — input stays with the + // slider/checkbox/number box. + HoverHandler { id: cardHover } + + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.withAlpha(Theme.primary, 0.07) + opacity: cardHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 180 } } + } + + // Check toggle feedback: the box pops once, like the MCP + // tool rows. + SequentialAnimation { + id: checkBounce + NumberAnimation { + target: checkIcon; property: "scale" + to: 1.15; duration: 140; easing.type: Easing.InOutQuad + } + NumberAnimation { + target: checkIcon; property: "scale" + to: 1.0; duration: 240; easing.type: Easing.InOutQuad + } + } + + // Whole-card toggle: a tap anywhere that is not on the number + // box or the slider flips the checkbox (the checkbox graphic + // itself included — it has no separate handler). + TapHandler { + onTapped: (eventPoint) => { + if (card.overChild(valueBox, eventPoint.position)) return; + if (card.overChild(slider, eventPoint.position)) return; + checkBounce.restart(); + card.toggled(!card.checked); + } + } + + DankIcon { + id: checkIcon + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.verticalCenter: parent.verticalCenter + name: card.checked ? "check_box" : "check_box_outline_blank" + size: 20 + color: card.checked ? Theme.primary : Theme.surfaceVariantText + } + + ColumnLayout { + id: cardContent + anchors.left: checkIcon.right + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 10 + anchors.rightMargin: 10 + spacing: 2 + opacity: card.checked ? 1.0 : 0.35 + Behavior on opacity { NumberAnimation { duration: 200 } } + + RowLayout { + width: parent.width + spacing: 8 + + Text { + Layout.fillWidth: true + text: card.label + color: Theme.surfaceText + font.pixelSize: 12 + elide: Text.ElideRight + } + + // DankTextField hardcodes left alignment; this minimal + // field gives us right-aligned numeric input. + Rectangle { + id: valueBox + Layout.preferredWidth: 76 + Layout.preferredHeight: 24 + radius: 4 + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.6) + border.width: 1 + border.color: valueInput.activeFocus ? Theme.primary : Theme.outlineVariant + enabled: card.checked + + TextInput { + id: valueInput + anchors.fill: parent + anchors.margins: 4 + verticalAlignment: TextInput.AlignVCenter + horizontalAlignment: TextInput.AlignRight + text: card.displayValue() + color: Theme.surfaceText + font.pixelSize: 12 + clip: true + selectByMouse: true + // NOTE: never write card.rawValue here — it would + // break rawValue's binding to the service and the + // slider would snap back. Push through valueEdited; + // the rawValue binding updates the card. + onTextChanged: if (activeFocus && !isNaN(parseFloat(text))) { + card.valueEdited(Math.round(parseFloat(text) / card.multiplier)); + } + } + } + } + + BallSlider { + id: slider + Layout.fillWidth: true + Layout.preferredHeight: 20 + enabled: card.checked + minimum: card.rawMin + maximum: card.rawMax + step: card.rawStep + // No `value:` binding — the slider writes value + // imperatively on drag, which would break it. Sync both + // directions via onValueChanged + onRawValueChanged. + Component.onCompleted: value = card.rawValue + onValueChanged: { + if (card._syncing) return; + // Clicking the number box gives it activeFocus; a + // plain slider drag never clears it (the slider is + // not a focus scope), which would freeze the text. + // Steal focus back and always sync while dragging. + valueInput.focus = false; + card.valueEdited(value); + valueInput.text = card.displayValue(); + } + } + } + + Connections { + target: card + function onRawValueChanged() { + card._syncing = true; + slider.value = card.rawValue; + card._syncing = false; + if (!valueInput.activeFocus) + valueInput.text = card.displayValue(); + } + } + } + + // Local slider with a round thumb (DMS's DankSlider uses a bar + // handle, and shell widgets are read-only for plugins). Mirrors + // DankSlider's contract: int `value` written imperatively during + // drag, same position→value math and wheel stepping. + component BallSlider : Item { + id: bs + + property int value: 50 + property int minimum: 0 + property int maximum: 100 + property int step: 1 + + implicitHeight: 20 + + function updateValueFromPosition(x) { + var travel = Math.max(1, track.width - ball.width); + var ratio = Math.max(0, Math.min(1, (x - ball.width / 2) / travel)); + var raw = minimum + ratio * (maximum - minimum); + var v = step > 1 ? Math.round(raw / step) * step : Math.round(raw); + v = Math.max(minimum, Math.min(maximum, v)); + if (v !== value) value = v; + } + + // Track line. + Rectangle { + id: track + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + height: 4 + radius: 2 + color: bs.enabled + ? Theme.withAlpha(Theme.outlineVariant, 0.9) + : Theme.withAlpha(Theme.outlineVariant, 0.4) + } + + // Fill from the left edge to the ball's center. + Rectangle { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + height: 4 + radius: 2 + width: Math.max(0, Math.min(track.width, + ball.x + ball.width / 2)) + color: bs.enabled ? Theme.primary + : Theme.withAlpha(Theme.primary, 0.3) + } + + // Ball thumb: grows slightly on hover/press. + Rectangle { + id: ball + width: 16 + height: 16 + radius: 8 + anchors.verticalCenter: track.verticalCenter + x: { + var range = bs.maximum - bs.minimum; + var ratio = range === 0 + ? 0 : (bs.value - bs.minimum) / range; + var travel = track.width - width; + return Math.max(0, Math.min(travel, travel * ratio)); + } + color: bs.enabled ? Theme.primary + : Theme.withAlpha(Theme.primary, 0.3) + scale: area.pressed || area.containsMouse ? 1.15 : 1.0 + Behavior on scale { + NumberAnimation { duration: 150; easing.type: Easing.OutCubic } + } + } + + MouseArea { + id: area + anchors.fill: parent + // Generous vertical hit area, like DankSlider's. + anchors.topMargin: -8 + anchors.bottomMargin: -8 + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + preventStealing: true + enabled: bs.enabled + + onPressed: (mouse) => bs.updateValueFromPosition(mouse.x) + onPositionChanged: (mouse) => { + if (pressed) bs.updateValueFromPosition(mouse.x); + } + onWheel: (wheel) => { + var wheelStep = bs.step > 1 + ? bs.step : Math.max(1, (bs.maximum - bs.minimum) / 100); + var v = wheel.angleDelta.y > 0 + ? Math.min(bs.maximum, bs.value + wheelStep) + : Math.max(bs.minimum, bs.value - wheelStep); + if (bs.step > 1) v = Math.round(v / bs.step) * bs.step; + v = Math.round(v); + if (v !== bs.value) bs.value = v; + wheel.accepted = true; + } + } + } + + Popup { + id: genPopup + // Chip sits at the panel's bottom-left: align the popup's left + // edge to the chip so it opens rightward, inside the panel. + x: 0 + y: -height - 8 + width: 320 + height: Math.min(420, contentItem.implicitHeight + 24) + padding: 12 + // Gold-standard popup motion: rises out of the tune chip — + // fade + subtle scale anchored at the bottom edge — with a + // quicker, quieter exit. + transformOrigin: Popup.Bottom + + enter: Transition { + NumberAnimation { + property: "opacity" + from: 0; to: 1 + duration: 180 + easing.type: Easing.OutCubic + } + NumberAnimation { + property: "scale" + from: 0.94; to: 1 + duration: 180 + easing.type: Easing.OutCubic + } + } + exit: Transition { + NumberAnimation { + property: "opacity" + to: 0 + duration: 140 + easing.type: Easing.InCubic + } + NumberAnimation { + property: "scale" + to: 0.96 + duration: 140 + easing.type: Easing.InCubic + } + } + + background: Rectangle { + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainer, 0.97) + border.color: Theme.surfaceVariantAlpha + border.width: 1 + } + + contentItem: ColumnLayout { + spacing: 6 + + Text { + text: "Common Settings" + color: Theme.surfaceVariantText + font.pixelSize: 12 + font.bold: true + } + + SettingCard { + label: "Context Window Size" + visible: service ? service.activeIsOllama : false + rawMin: 1024 + rawMax: 32768 + rawStep: 1024 + rawValue: service ? service.numCtx : 8192 + checked: service ? service.useContextWindow : false + onToggled: (checked) => { + if (!service) return; + service.useContextWindow = checked; + service.saveSetting("useContextWindow", checked); + } + onValueEdited: (raw) => { + if (!service) return; + service.numCtx = raw; + service.saveSetting("numCtx", raw); + } + } + + SettingCard { + label: "Temperature" + decimals: 2 + multiplier: 0.01 + rawMin: 0 + rawMax: 200 + rawStep: 5 + rawValue: service ? Math.round(service.temperature * 100) : 70 + checked: service ? service.useTemperature : false + onToggled: (checked) => { + if (!service) return; + service.useTemperature = checked; + service.saveSetting("useTemperature", checked); + } + onValueEdited: (raw) => { + if (!service) return; + service.temperature = raw * multiplier; + service.saveSetting("temperature", raw * multiplier); + } + } + + SettingCard { + label: "Max Output Token" + rawMin: 0 + rawMax: 16384 + rawStep: 256 + rawValue: service ? service.maxTokens : 4096 + checked: service ? service.useMaxTokens : false + onToggled: (checked) => { + if (!service) return; + service.useMaxTokens = checked; + service.saveSetting("useMaxTokens", checked); + } + onValueEdited: (raw) => { + if (!service) return; + service.maxTokens = raw; + service.saveSetting("maxTokens", raw); + } + } + } + } +} diff --git a/src/components/NativeToolsSection.qml b/src/components/NativeToolsSection.qml new file mode 100644 index 0000000..1c73a6b --- /dev/null +++ b/src/components/NativeToolsSection.qml @@ -0,0 +1,197 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import qs.Common +import qs.Widgets + +// Native chat tools settings (web_search / webfetch): one toggle row +// per tool. Per-tool switches only — the master switch lives on the +// chat bar; rows dim and hint there when it is off. +Item { + id: root + + property var service: null + + readonly property bool masterOn: service ? service.webToolsEnabled : false + + implicitHeight: body.implicitHeight + + // Toggle row: checkbox + display name + description. Unlike + // the MCP tool rows there is no list rebuild behind these binds — + // the flags are plain service booleans — so the crossfade and + // bounce can drive straight off `checked`. + component NativeToolRow : Rectangle { + id: toolRow + + property string label: "" + property string description: "" + property bool checked: false + property bool rowEnabled: true + signal toggled() + + height: 56 + radius: 8 + color: toolRow.checked + ? Theme.withAlpha(Theme.primary, 0.14) + : Theme.withAlpha(Theme.surfaceContainerHigh, 0.4) + opacity: toolRow.rowEnabled ? 1 : 0.45 + Behavior on opacity { NumberAnimation { duration: 200 } } + Behavior on color { ColorAnimation { duration: 220 } } + + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.6) + opacity: toolHover.hovered && toolRow.rowEnabled ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + HoverHandler { + id: toolHover + enabled: toolRow.rowEnabled + cursorShape: Qt.PointingHandCursor + } + + SequentialAnimation { + id: checkBounce + NumberAnimation { + target: checkBox; property: "scale" + to: 1.15; duration: 140; easing.type: Easing.InOutQuad + } + NumberAnimation { + target: checkBox; property: "scale" + to: 1.0; duration: 240; easing.type: Easing.InOutQuad + } + } + + Item { + id: checkBox + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.verticalCenter: parent.verticalCenter + width: 20 + height: 20 + + DankIcon { + anchors.fill: parent + name: "check_box_outline_blank" + size: 20 + visible: opacity > 0.01 + opacity: toolRow.checked ? 0 : 1 + color: Theme.surfaceVariantText + Behavior on opacity { + NumberAnimation { + duration: 220 + easing.type: Easing.InOutQuad + } + } + } + + DankIcon { + anchors.fill: parent + name: "check_box" + size: 20 + visible: opacity > 0.01 + opacity: toolRow.checked ? 1 : 0 + color: Theme.primary + Behavior on opacity { + NumberAnimation { + duration: 220 + easing.type: Easing.InOutQuad + } + } + } + } + + ColumnLayout { + anchors.left: checkBox.right + anchors.leftMargin: 12 + anchors.right: parent.right + anchors.rightMargin: 12 + anchors.verticalCenter: parent.verticalCenter + spacing: 2 + + Text { + Layout.fillWidth: true + text: toolRow.label + color: Theme.surfaceText + font.pixelSize: 13 + elide: Text.ElideRight + } + + Text { + Layout.fillWidth: true + text: toolRow.description + color: Theme.surfaceVariantText + font.pixelSize: 11 + wrapMode: Text.Wrap + maximumLineCount: 2 + elide: Text.ElideRight + } + } + + TapHandler { + id: tapPoint + enabled: toolRow.rowEnabled + onTapped: { + checkBounce.restart(); + toolRow.toggled(); + } + } + } + + ColumnLayout { + id: body + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + spacing: 10 + + // ── Section header ──────────────────────────────────────── + RowLayout { + id: headerRow + Layout.fillWidth: true + + Text { + text: "Native Tools" + color: Theme.primary + font.pixelSize: 13 + font.bold: true + } + + Item { Layout.fillWidth: true } + } + + Text { + Layout.fillWidth: true + visible: !root.masterOn + text: "Native tools are switched off — use the language icon " + + "above the chat input to turn them on." + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + NativeToolRow { + Layout.fillWidth: true + label: "Web Search" + description: "Let the model search the web with DuckDuckGo." + checked: root.service ? root.service.webSearchEnabled : false + rowEnabled: root.masterOn + onToggled: if (root.service) + root.service.setNativeToolEnabled("web_search", + !root.service.webSearchEnabled) + } + + NativeToolRow { + Layout.fillWidth: true + label: "Web Fetch" + description: "Let the model open a URL and read its content." + checked: root.service ? root.service.webFetchEnabled : false + rowEnabled: root.masterOn + onToggled: if (root.service) + root.service.setNativeToolEnabled("webfetch", + !root.service.webFetchEnabled) + } + } +} diff --git a/src/components/NexusChat.qml b/src/components/NexusChat.qml new file mode 100644 index 0000000..b7f0ae9 --- /dev/null +++ b/src/components/NexusChat.qml @@ -0,0 +1,416 @@ +import QtQuick +import QtQuick.Layouts +import qs.Common +import qs.Widgets + +Item { + id: chat + + property var service: null + property var panel: null + + state: "chat" + states: [ + State { name: "chat" }, + State { name: "settings" } + ] + + // Called by NexusPanel when the panel finishes sliding in. + function focusInput() { + if (state === "chat" && composer.focusInput) + composer.focusInput(); + } + + ColumnLayout { + anchors.fill: parent + spacing: 8 + + // Chat box: same matugen hue as the panel, just more + // opaque — reads darker/more solid without graying out. + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainer, 0.9) + clip: true + + MessageList { + id: messageList + anchors.fill: parent + anchors.margins: 6 + service: chat.service + } + + // Centered plugin logo for the empty conversation. + HexSphereLogo { + anchors.centerIn: parent + radius: 66 + // Same opacity-driven visible pattern as the chip + // below: the empty-state fade-out must get to play. + opacity: (chat.service ? chat.service.messageCount === 0 : true) ? 1 : 0 + visible: opacity > 0.01 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + // Status chips, bottom-left of the chat box just above the + // composer gap: MCP toolset count and the native web tools + // indicator. Both only show on an empty conversation (they + // fade away once the chat starts). + Row { + id: statusChips + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.leftMargin: 10 + anchors.bottomMargin: 8 + spacing: 8 + + // Active-toolset chip: counts MCP servers currently + // contributing tools; only shows when that's > 0. + Rectangle { + id: toolsetChip + readonly property int count: chat.service + ? chat.service.activeToolsetCount() : 0 + // Freezes at the last non-zero count so the label + // doesn't flip to "0 Active Toolsets" mid fade-out. + readonly property int displayCount: count > 0 ? count : lastNonZero + property int lastNonZero: 0 + onCountChanged: if (count > 0) lastNonZero = count + readonly property bool chatEmpty: chat.service + ? chat.service.messageCount === 0 : true + readonly property bool shown: count > 0 && chatEmpty + width: chipRow.implicitWidth + 20 + height: 28 + radius: 8 + // visible derives from opacity (never from `shown`): + // flipping visible directly would hide the item before + // the fade-out animation could play. + opacity: shown ? 1 : 0 + visible: opacity > 0.01 + Behavior on opacity { NumberAnimation { duration: 220 } } + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.75) + border.width: 1 + border.color: Theme.withAlpha(Theme.outlineVariant, 0.7) + + Row { + id: chipRow + anchors.centerIn: parent + spacing: 6 + + DankIcon { + anchors.verticalCenter: parent.verticalCenter + name: "construction" + size: 14 + color: Theme.primary + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: toolsetChip.displayCount === 1 + ? "1 Active Toolset" + : toolsetChip.displayCount + " Active Toolsets" + color: Theme.surfaceVariantText + font.pixelSize: 12 + } + } + } + + // Web search chip: independent of the MCP count — shows + // while the native tools master switch is on (and at + // least one native tool is enabled). + Rectangle { + id: webSearchChip + readonly property bool nativeOn: chat.service + ? chat.service.webToolsEnabled + && (chat.service.webSearchEnabled + || chat.service.webFetchEnabled) + : false + readonly property bool chatEmpty: chat.service + ? chat.service.messageCount === 0 : true + readonly property bool shown: nativeOn && chatEmpty + width: webChipRow.implicitWidth + 20 + height: 28 + radius: 8 + opacity: shown ? 1 : 0 + visible: opacity > 0.01 + Behavior on opacity { NumberAnimation { duration: 220 } } + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.75) + border.width: 1 + border.color: Theme.withAlpha(Theme.outlineVariant, 0.7) + + Row { + id: webChipRow + anchors.centerIn: parent + spacing: 6 + + DankIcon { + anchors.verticalCenter: parent.verticalCenter + name: "language" + size: 14 + color: Theme.primary + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: "Web Search Enabled" + color: Theme.surfaceVariantText + font.pixelSize: 12 + } + } + } + } + } + + ChatComposer { + id: composer + Layout.fillWidth: true + service: chat.service + placeholder: chat.service ? chat.service.placeholder : "Ask anything…" + onSubmitted: (text, images) => { + // While a user message is being edited the composer + // submit performs the edit (drops everything after + // that message, regenerates); otherwise a normal send. + if (chat.service && chat.service.editingMessageId.length > 0) + chat.service.editUserMessage(chat.service.editingMessageId, text); + else + chat.service.sendMessage(text, images); + } + onEscapePressed: { + if (chat.state === "settings") + chat.state = "chat"; + else if (chat.service && chat.service.editingMessageId.length > 0) + chat.service.cancelEditUserMessage(); + else if (chat.panel) + chat.panel.hide(); + } + onNewChatRequested: { + if (chat.service) { + chat.service.clearChat(); + chat.state = "chat"; + } + } + + Connections { + target: chat.service + // Edit requested from a message bubble: the composer + // receives the message text and takes focus. + function onEditRequested(text) { + composer.setText(text); + composer.focusInput(); + } + } + } + + // Bottom bar: provider chip, model chip, MCP toggle, then + // optional-params popup bottom-left; context meter pinned to + // the far right as an overlay. The RowLayout is anchored + // inside a wrapper so the meter never participates in the + // row's minimum width — in a narrow panel the row may + // overflow (pre-existing), but the meter stays visible at + // the right edge. + Item { + id: bottomBarWrap + Layout.fillWidth: true + implicitHeight: bottomBar.implicitHeight + + RowLayout { + id: bottomBar + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + spacing: 8 + + ModelSelector { + service: chat.service + } + + // Image attach chip: opens the file picker (clipboard paste + // in the composer is the other ingest path). Same chip + // shape and hover treatment as the MCP toggle. + Rectangle { + id: attachChip + Layout.alignment: Qt.AlignVCenter + implicitWidth: 34 + implicitHeight: 34 + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.5) + + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.5) + opacity: attachHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + DankIcon { + anchors.centerIn: parent + name: "attach_file" + size: 18 + color: attachHover.hovered + ? Theme.primary : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 250 } } + } + + HoverHandler { + id: attachHover + cursorShape: Qt.PointingHandCursor + onHoveredChanged: attachTip.hovering = hovered + } + + TapHandler { + onTapped: { + attachTip.close(); + composer.attachFromFile(); + } + } + } + + // MCP tools master switch: construction icon, primary when + // tools are on. Same chip shape and hover treatment as the + // model selector's zones (overlay fade + pointing cursor). + Rectangle { + id: mcpChip + Layout.alignment: Qt.AlignVCenter + implicitWidth: 34 + implicitHeight: 34 + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.5) + + readonly property bool on: chat.service + ? chat.service.mcpToolsEnabled : false + + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.5) + opacity: mcpHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + DankIcon { + anchors.centerIn: parent + name: "construction" + size: 18 + filled: mcpChip.on + color: mcpChip.on || mcpHover.hovered + ? Theme.primary : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 250 } } + } + + HoverHandler { + id: mcpHover + cursorShape: Qt.PointingHandCursor + onHoveredChanged: mcpTip.hovering = hovered + } + + TapHandler { + onTapped: { + mcpTip.close(); + if (chat.service) + chat.service.setMcpToolsEnabled( + !chat.service.mcpToolsEnabled); + } + } + } + + // Native web tools switch (web_search / webfetch): language + // icon, primary when on. Same chip recipe as the MCP toggle. + Rectangle { + id: webChip + Layout.alignment: Qt.AlignVCenter + implicitWidth: 34 + implicitHeight: 34 + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.5) + + readonly property bool on: chat.service + ? chat.service.webToolsEnabled : false + + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.5) + opacity: webHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + DankIcon { + anchors.centerIn: parent + name: "language" + size: 18 + filled: webChip.on + color: webChip.on || webHover.hovered + ? Theme.primary : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 250 } } + } + + HoverHandler { + id: webHover + cursorShape: Qt.PointingHandCursor + onHoveredChanged: webTip.hovering = hovered + } + + TapHandler { + onTapped: { + webTip.close(); + if (chat.service) + chat.service.setWebToolsEnabled( + !chat.service.webToolsEnabled); + } + } + } + + Item { Layout.fillWidth: true } + } + + // Context usage meter: ring fills with conversation + // progress; hover opens an opaque token-count pill that + // overlays the chips to its left (constant layout + // footprint — narrow panels never re-flow). Pinned to the + // bar's right edge OUTSIDE the RowLayout so its width is + // never part of the row's minimum; z keeps it above. + ContextMeter { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + service: chat.service + z: 2 + } + } + } + + // Hover tooltips for the composer-bar chips: comic-bubble popups + // that open above their anchor after a 1s dwell and close when + // the pointer leaves (or the chip is pressed). + BubbleTip { + id: attachTip + parent: attachChip + tipText: "Attachments" + } + + BubbleTip { + id: mcpTip + parent: mcpChip + tipText: "MCP Toolsets" + } + + BubbleTip { + id: webTip + parent: webChip + tipText: "Enable Web Search" + } + + // Settings view: fills the panel, on top of the chat, opened from + // the panel bar's tune button (state: "settings"). Fades in/out on + // state changes; visible tracks opacity so the view drops out of + // interaction/rendering once the fade-out lands. + NexusSettings { + id: settingsView + anchors.fill: parent + opacity: chat.state === "settings" ? 1 : 0 + visible: opacity > 0.01 + Behavior on opacity { + NumberAnimation { duration: 220; easing.type: Easing.OutCubic } + } + service: chat.service + } +} diff --git a/src/components/NexusPanel.qml b/src/components/NexusPanel.qml new file mode 100644 index 0000000..e0d7b27 --- /dev/null +++ b/src/components/NexusPanel.qml @@ -0,0 +1,252 @@ +import QtQuick +import Quickshell +import Quickshell.Wayland +import qs.Common +import qs.Services +import qs.Widgets + +pragma ComponentBehavior: Bound + +// Slideout panel: transparent full-height window; the visible surface +// slides in from its screen edge and the mask confines input to it. +PanelWindow { + id: root + + property bool isVisible: false + property var modelData: null + property real panelWidth: 480 + property bool expandable: true + property bool expanded: false + property real expandedWidth: 960 + property Component content: null + property real gap: 6 + property bool panelOnLeft: false + property var service: null + + function show() { + visible = true; + isVisible = true; + } + + function hide() { + isVisible = false; + } + + function toggle() { + if (isVisible) hide(); + else show(); + } + + // Emitted after the slide-in animation finishes. + signal opened() + + onOpened: { + if (contentLoader.item && typeof contentLoader.item.focusInput === "function") + contentLoader.item.focusInput(); + } + + visible: isVisible + screen: modelData + color: "transparent" + + anchors.top: true + anchors.bottom: true + anchors.right: !panelOnLeft + anchors.left: panelOnLeft + + readonly property real activeWidth: expandable && expanded ? expandedWidth : panelWidth + implicitWidth: expandable ? expandedWidth + gap : panelWidth + gap + implicitHeight: modelData ? modelData.height : 800 + + WlrLayershell.namespace: "nexus:panel" + WlrLayershell.layer: WlrLayershell.Top + WlrLayershell.exclusiveZone: 0 + WlrLayershell.keyboardFocus: isVisible ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None + + readonly property real dpr: CompositorService.getScreenScale(root.screen) + readonly property real alignedWidth: Theme.px(activeWidth + gap, dpr) + + mask: Region { + item: Rectangle { + x: root.panelOnLeft ? 0 : root.width - root.alignedWidth + y: 0 + width: root.alignedWidth + height: root.height + } + } + + Item { + id: slide + anchors.top: parent.top + anchors.bottom: parent.bottom + // Conditional side anchors don't reset to undefined on + // re-evaluation — the slide kept both and stretched. Use x. + x: root.panelOnLeft ? 0 : parent.width - width + width: root.alignedWidth + + property real offset: root.panelOnLeft ? -alignedWidth : alignedWidth + + Connections { + target: root + function onIsVisibleChanged() { + slide.offset = root.isVisible ? 0 : (root.panelOnLeft ? -slide.width : slide.width); + } + + // offset's binding is dead after the imperative write + // above — re-derive on edge flips too, or the slide + // renders detached from the mask. + function onPanelOnLeftChanged() { + slide.offset = root.isVisible ? 0 + : (root.panelOnLeft ? -slide.width : slide.width); + } + } + + Behavior on offset { + NumberAnimation { + duration: 400 + easing.type: Easing.OutCubic + onRunningChanged: { + if (!running && !root.isVisible) root.visible = false; + if (!running && root.isVisible) root.opened(); + } + } + } + + Behavior on width { + NumberAnimation { duration: 250; easing.type: Easing.OutCubic } + } + + Item { + id: layeredContent + layer.enabled: Quickshell.env("DMS_DISABLE_LAYER") !== "true" + && Quickshell.env("DMS_DISABLE_LAYER") !== "1" + layer.smooth: false + layer.textureSize: Qt.size(width * root.dpr, height * root.dpr) + + anchors.top: parent.top + anchors.bottom: parent.bottom + width: parent.width + x: Theme.snap(slide.offset, root.dpr) + + Item { + anchors.fill: parent + anchors.topMargin: root.gap + anchors.bottomMargin: root.gap + anchors.rightMargin: root.panelOnLeft ? 0 : root.gap + anchors.leftMargin: root.panelOnLeft ? root.gap : 0 + + // ── Rounded translucent panel: bar + content ─────── + Rectangle { + id: panelSurface + anchors.fill: parent + radius: Theme.cornerRadius + color: Qt.rgba( + Theme.surfaceContainer.r, + Theme.surfaceContainer.g, + Theme.surfaceContainer.b, + SettingsData.popupTransparency + ) + border.width: 1 + border.color: Theme.surfaceVariantAlpha + + // Panel bar (title + expand + close), DankSlideout-style + Item { + id: panelBar + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: Theme.spacingL + height: 36 + + Text { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + text: "Nexus AI" + color: Theme.surfaceText + font.pixelSize: 16 + font.weight: Font.Medium + } + + Row { + id: barButtons + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingXS + + DankActionButton { + iconName: "delete_sweep" + iconSize: Theme.iconSize - 4 + iconColor: Theme.surfaceText + onClicked: if (root.service) root.service.clearChat() + } + + DankActionButton { + iconName: contentLoader.item + && contentLoader.item.state === "settings" + ? "arrow_back" : "tune" + iconSize: Theme.iconSize - 4 + iconColor: Theme.surfaceText + onClicked: { + if (!contentLoader.item) return; + contentLoader.item.state = + contentLoader.item.state === "settings" ? "chat" : "settings"; + } + } + + // Move the panel to the other screen edge; + // the arrow points where it will go. + DankActionButton { + iconName: root.service && root.service.panelEdge === "left" + ? "arrow_right" : "arrow_left" + iconSize: Theme.iconSize - 4 + iconColor: Theme.surfaceText + onClicked: { + if (!root.service) return; + root.service.panelEdge = + root.service.panelEdge === "left" ? "right" : "left"; + root.service.saveSetting("panelEdge", root.service.panelEdge); + } + } + + DankActionButton { + id: expandButton + iconName: root.expanded ? "unfold_less" : "unfold_more" + iconSize: Theme.iconSize - 4 + iconColor: Theme.surfaceText + transform: Rotation { + angle: 90 + origin.x: expandButton.width / 2 + origin.y: expandButton.height / 2 + } + onClicked: root.expanded = !root.expanded + } + + DankActionButton { + iconName: "close" + iconSize: Theme.iconSize - 4 + iconColor: Theme.surfaceText + onClicked: root.hide() + } + } + } + + Item { + anchors.top: panelBar.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.leftMargin: Theme.spacingL + anchors.rightMargin: Theme.spacingL + anchors.bottomMargin: Theme.spacingL + + Loader { + id: contentLoader + anchors.fill: parent + sourceComponent: root.content + } + } + } + } + } +} +} diff --git a/src/components/NexusSettings.qml b/src/components/NexusSettings.qml new file mode 100644 index 0000000..ffec20a --- /dev/null +++ b/src/components/NexusSettings.qml @@ -0,0 +1,204 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import qs.Common +import qs.Widgets +import "../lib/PromptPresets.js" as PromptPresets + +Item { + id: settings + + property var service: null + + // Construction-time and service-load-time binding evaluation must not + // write back to settings. Component.onCompleted fires bottom-up (before + // NexusService._loadSettings runs), so the flag flips via Qt.callLater — + // after the whole creation batch and its synchronous binding updates. + property bool _loading: true + // Custom write-in mode: the box is editable and the Custom chip + // stays highlighted even while the prompt is still empty. + property bool customMode: false + + Component.onCompleted: Qt.callLater(() => { settings._loading = false }) + + function persist(key, value) { + // property assignment happens at call site; persist immediately + if (_loading) return; + service.saveSetting(key, value); + } + + // Opaque-to-panel backdrop: same color as the panel container, so + // the chat below does not bleed through the settings page. + Rectangle { + anchors.fill: parent + radius: Theme.cornerRadius + color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, + Theme.surfaceContainer.b, SettingsData.popupTransparency) + } + + Flickable { + id: settingsScroll + + anchors.fill: parent + contentWidth: width + contentHeight: column.implicitHeight + 32 + clip: true + boundsBehavior: Flickable.StopAtBounds + + ColumnLayout { + id: column + width: settings.width - 32 + x: 16 + spacing: 16 + + // ── Header row ──────────────────────────────────────────── + RowLayout { + Layout.fillWidth: true + Text { + text: "Settings" + color: Theme.surfaceText + font.pixelSize: 18 + font.bold: true + } + } + + // ── Providers (multi-provider instances) ────────────────── + ProvidersSection { + Layout.fillWidth: true + service: settings.service + } + + // ── Native tools card (parked) ──────────────────────────── + // NativeToolsSection { + // Layout.fillWidth: true + // service: settings.service + // } + + // ── MCP card ────────────────────────────────────────────── + MCPSection { + Layout.fillWidth: true + service: settings.service + } + + // ── Prompt card ─────────────────────────────────────────── + ColumnLayout { + Layout.fillWidth: true + spacing: 10 + + Text { + text: "System Prompt" + color: Theme.primary + font.pixelSize: 13 + font.bold: true + } + + // Personality presets; "Custom" selects the write-in + // box (highlight follows the box content). + Row { + Layout.fillWidth: true + spacing: 6 + + Repeater { + model: PromptPresets.PRESETS + + delegate: Rectangle { + id: presetChip + required property var modelData + readonly property bool active: + settings.customMode + ? modelData.id === "custom" + : PromptPresets.detect(service ? service.systemPrompt : "") + === modelData.id + + width: presetLabel.implicitWidth + 20 + height: 26 + radius: 13 + color: presetChip.active + ? Theme.withAlpha(Theme.primary, 0.22) + : Theme.withAlpha(Theme.surfaceContainerHighest, 0.5) + Behavior on color { ColorAnimation { duration: 150 } } + + Text { + id: presetLabel + anchors.centerIn: parent + text: presetChip.modelData.name + color: presetChip.active ? Theme.primary : Theme.surfaceVariantText + font.pixelSize: 11 + font.bold: presetChip.active + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (!service) return; + if (presetChip.modelData.id !== "custom") { + settings.customMode = false; + service.systemPrompt = presetChip.modelData.text; + } else { + // Entering custom mode: blank the + // preset text so the user can write + // their own, then focus the box. + settings.customMode = true; + if (PromptPresets.detect(service.systemPrompt) + !== "custom") + service.systemPrompt = ""; + promptArea.forceActiveFocus(); + } + } + } + } + } + } + + Rectangle { + Layout.fillWidth: true + // Box hugs the pure text height: 13px visual padding + // above and below, exactly. + Layout.preferredHeight: Math.min(220, promptArea.contentHeight + 26) + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.4) + border.width: promptArea.activeFocus ? 1 : 0 + border.color: Theme.primary + clip: true + + TextArea { + id: promptArea + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: 13 + topPadding: 0 + bottomPadding: 0 + leftPadding: 0 + rightPadding: 0 + // Preset text is fixed; only Custom is editable. + readOnly: !settings.customMode + && PromptPresets.detect(service ? service.systemPrompt : "") + !== "custom" + text: service ? service.systemPrompt : "" + color: Theme.surfaceText + font.pixelSize: 13 + wrapMode: TextArea.Wrap + placeholderText: "You are a concise assistant…" + placeholderTextColor: Theme.surfaceVariantText + background: null + selectionColor: Theme.withAlpha(Theme.primary, 0.4) + selectedTextColor: Theme.surfaceText + onTextChanged: if (service && !settings._loading) { + service.systemPrompt = text; + settings.persist("systemPrompt", text); + } + } + } + } + + // ── Panel card ──────────────────────────────────────────── + // (Panel side toggle moved to the panel top bar.) + + Item { Layout.fillHeight: true } + } + + ScrollBar.vertical: DankScrollbar {} + } +} diff --git a/src/components/ProvidersSection.qml b/src/components/ProvidersSection.qml new file mode 100644 index 0000000..b701f32 --- /dev/null +++ b/src/components/ProvidersSection.qml @@ -0,0 +1,993 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import qs.Common +import qs.Widgets +import "../lib/Providers.js" as Providers +import "../lib/ModelIcons.js" as ModelIcons +import "../lib/FuzzyMatch.js" as FuzzyMatch + +// Provider settings: one collapsible row per instance with an editor +// card (name, base URL, key, models grid). Keys persist in the +// keyring when secret-tool is available, else memory-only. +Item { + id: root + + property var service: null + // Which instance is expanded — only one at a time. + property string expandedId: "" + // Expanded-card grid state, hoisted so it survives the delegate + // rebuilds every service write triggers. + property string modelFilterText: "" + property real modelGridY: 0 + property bool _gridRebuilding: false + function markGridRebuild() { + _gridRebuilding = true; + gridSettleTimer.restart(); + } + Timer { + id: gridSettleTimer + interval: 0 + onTriggered: { + root._gridRebuilding = false; + modelFlick.contentY = Math.min(root.modelGridY, + Math.max(0, modelFlick.contentHeight - modelFlick.height)); + } + } + // One-shot animation handoff: a click arms a key so the delegate + // recreated by the service write can replay the state change (it + // is born at the new value; replaying from the old one is the + // only way a rebuilt row can animate). + property string animKey: "" + property bool animFrom: false + + implicitHeight: body.implicitHeight + + // Add-provider row: brand icon + registry display name + subtle + // wire-format tag. + component AddRow : Rectangle { + id: addRow + + property string title: "" + property string tag: "" + property string iconStem: "" + signal chosen() + + width: parent ? parent.width : 280 + height: 48 + radius: 6 + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.22) + + // Hover state layer (model-selector chip pattern): fixed tint, + // opacity fade. MouseArea instead of HoverHandler — the + // reliable hover source inside a Popup. + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.45) + opacity: addHover.containsMouse ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + MouseArea { + id: addHover + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: addRow.chosen() + } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 10 + spacing: 10 + + BrandIcon { + Layout.alignment: Qt.AlignVCenter + size: 20 + stem: addRow.iconStem + } + + Text { + Layout.fillWidth: true + text: addRow.title + color: Theme.surfaceText + font.pixelSize: 13 + elide: Text.ElideRight + } + + Text { + text: addRow.tag + color: Theme.surfaceVariantText + font.pixelSize: 11 + } + } + } + + // Compact switch (enable/disable provider). Plain Rectangle + + // MouseArea so the press is consumed here and never also toggles + // the row's expand/collapse TapHandler. + component MiniToggle : Rectangle { + id: mini + + property bool checked: true + signal toggled() + + width: 34 + height: 20 + radius: 10 + color: mini.shown ? Theme.primary + : Theme.withAlpha(Theme.outlineVariant, 0.5) + Behavior on color { ColorAnimation { duration: 220 } } + + Rectangle { + x: mini.shown ? mini.width - width - 2 : 2 + anchors.verticalCenter: parent.verticalCenter + width: 16 + height: 16 + radius: 8 + color: mini.shown ? Theme.surfaceContainerHighest + : Theme.surfaceVariantText + Behavior on x { NumberAnimation { duration: 220; easing.type: Easing.OutCubic } } + Behavior on color { ColorAnimation { duration: 220 } } + } + + // Armed creation replay: the click that toggles this provider + // rebuilds the row, so the fresh toggle starts from the + // pre-click state and rebinds 50ms later — the knob slide and + // color fade play on the new row. + property bool shown: checked + + function armFrom(state) { + shown = state; + armTimer.restart(); + } + + Timer { + id: armTimer + interval: 50 + onTriggered: mini.shown = Qt.binding(function() { return mini.checked; }) + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: mini.toggled() + } + } + + // Small neutral icon button (no accent): used for destructive and + // additive row actions. + component NeutralIconButton : Rectangle { + id: nib + + property string iconName: "" + property int buttonHeight: 20 + property int iconSize: 14 + // Accent mode: primary fill + strong icon (e.g. the custom + // model "+" once the field has text). + property bool accent: false + signal clicked() + + width: buttonHeight + 10 + height: buttonHeight + radius: 6 + color: nib.accent ? (nibHover.hovered ? Theme.primary + : Theme.withAlpha(Theme.primary, 0.85)) + : (nibHover.hovered ? Theme.withAlpha(Theme.surfaceContainerHighest, 0.9) + : Theme.withAlpha(Theme.surfaceContainerHighest, 0.5)) + Behavior on color { ColorAnimation { duration: 200 } } + + DankIcon { + anchors.centerIn: parent + name: nib.iconName + size: nib.iconSize + color: nib.accent ? Theme.surfaceText : Theme.surfaceVariantText + } + + HoverHandler { id: nibHover; cursorShape: Qt.PointingHandCursor } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: nib.clicked() + } + } + + // Model cell: checkbox icon + brand icon + display label, with a + // pencil to rename the model visually (the logical id stays + // untouched — display labels live on the provider instance). + component ModelCheckRow : Rectangle { + id: modelRow + + property string label: "" + property string iconStem: "" + property bool checked: false + property string providerId: "" + property string displayLabel: label + property bool editing: false + property bool removable: false + signal removed() + // 1.0 at rest; entrance replay bounces it. + property real checkScale: 1.0 + // Armed creation replay state (see MiniToggle.shown). + property bool shownChecked: checked + signal toggled() + signal renamed(string text) + + function armFrom(state) { + shownChecked = state; + armTimer.restart(); + } + + function commitRename() { + if (!editing) return; + editing = false; + renamed(editInput.text); + } + + Timer { + id: armTimer + interval: 50 + onTriggered: { + modelRow.shownChecked = Qt.binding(function() { return modelRow.checked; }); + checkBounce.restart(); + } + } + + height: 56 + radius: 8 + color: modelRow.checked + ? Theme.withAlpha(Theme.primary, 0.14) + : Theme.withAlpha(Theme.surfaceContainerHigh, 0.4) + + // Hover state layer, same as the chip: tint + opacity fade. + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.withAlpha(Theme.surfaceContainerHigh, 0.6) + opacity: modelHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + HoverHandler { id: modelHover; cursorShape: Qt.PointingHandCursor } + + SequentialAnimation { + id: checkBounce + NumberAnimation { + target: modelRow; property: "checkScale" + to: 1.15; duration: 140; easing.type: Easing.InOutQuad + } + NumberAnimation { + target: modelRow; property: "checkScale" + to: 1.0; duration: 240; easing.type: Easing.InOutQuad + } + } + + // Checkbox: crossfades between the empty and checked boxes so + // the tick itself animates (the icon swap alone is instant). + Item { + id: checkBox + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.verticalCenter: parent.verticalCenter + width: 20 + height: 20 + scale: modelRow.checkScale + + DankIcon { + anchors.fill: parent + name: "check_box_outline_blank" + size: 20 + visible: opacity > 0.01 + opacity: modelRow.shownChecked ? 0 : 1 + color: modelRow.shownChecked ? Theme.primary : Theme.surfaceVariantText + Behavior on opacity { NumberAnimation { duration: 220; easing.type: Easing.InOutQuad } } + } + + DankIcon { + anchors.fill: parent + name: "check_box" + size: 20 + visible: opacity > 0.01 + opacity: modelRow.shownChecked ? 1 : 0 + color: Theme.primary + Behavior on opacity { NumberAnimation { duration: 220; easing.type: Easing.InOutQuad } } + } + } + + BrandIcon { + size: 22 + anchors.left: checkBox.right + anchors.leftMargin: 10 + anchors.verticalCenter: parent.verticalCenter + stem: modelRow.iconStem + } + + Text { + id: labelText + visible: !modelRow.editing + anchors.left: parent.left + anchors.leftMargin: 72 + anchors.right: modelRow.removable ? removeZone.left : editZone.left + anchors.rightMargin: 4 + anchors.verticalCenter: parent.verticalCenter + text: modelRow.displayLabel + color: Theme.surfaceText + font.pixelSize: 13 + elide: Text.ElideRight + } + + // Remove: custom models only. + Item { + id: removeZone + visible: modelRow.removable + anchors.right: editZone.left + anchors.verticalCenter: parent.verticalCenter + width: 26 + height: parent.height + + DankIcon { + anchors.centerIn: parent + name: "close" + size: 14 + color: removeZoneHover.hovered ? Theme.error : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 200 } } + } + + HoverHandler { + id: removeZoneHover + cursorShape: Qt.PointingHandCursor + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: modelRow.removed() + } + } + + // Inline rename editor: Enter commits, Escape cancels, focus + // loss commits. Typing the logical id clears the rename. + TextInput { + id: editInput + visible: modelRow.editing + anchors.left: parent.left + anchors.leftMargin: 72 + anchors.right: editZone.left + anchors.rightMargin: 4 + anchors.verticalCenter: parent.verticalCenter + color: Theme.surfaceText + font.pixelSize: 13 + clip: true + selectByMouse: true + onAccepted: modelRow.commitRename() + onActiveFocusChanged: if (!activeFocus) modelRow.commitRename() + Keys.onEscapePressed: modelRow.editing = false + } + + // Pencil: opens the inline rename editor. + Item { + id: editZone + width: 26 + anchors.right: parent.right + anchors.rightMargin: 6 + anchors.verticalCenter: parent.verticalCenter + height: parent.height + + DankIcon { + anchors.centerIn: parent + name: "edit" + size: 14 + color: editZoneHover.hovered ? Theme.primary + : Theme.surfaceVariantText + Behavior on color { ColorAnimation { duration: 200 } } + } + + HoverHandler { + id: editZoneHover + cursorShape: Qt.PointingHandCursor + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (modelRow.editing) return; + modelRow.editing = true; + editInput.text = modelRow.displayLabel; + editInput.forceActiveFocus(); + editInput.cursorPosition = editInput.text.length; + } + } + } + + TapHandler { + id: tapPoint + onTapped: { + // Taps over the action zones rename/remove, not toggle. + var exclude = 32 + (modelRow.removable ? 26 : 0); + if (tapPoint.point.position.x > modelRow.width - exclude) return; + checkBounce.restart(); + modelRow.toggled(); + } + } + + } + + ColumnLayout { + id: body + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + spacing: 10 + + // ── Section header ──────────────────────────────────────── + RowLayout { + id: headerRow + Layout.fillWidth: true + + Text { + text: "Providers" + color: Theme.primary + font.pixelSize: 13 + font.bold: true + } + + Item { Layout.fillWidth: true } + + DankButton { + text: "Add provider" + iconName: "add" + buttonHeight: 36 + onClicked: addPicker.visible ? addPicker.close() : addPicker.open() + } + } + + Text { + Layout.fillWidth: true + visible: !root.service || root.service.providers.length === 0 + text: "No providers yet — add one to start." + color: Theme.surfaceVariantText + font.pixelSize: 12 + } + + // ── Instance list ───────────────────────────────────────── + // Array model: the service's reassignment pattern rebuilds the + // rows on every write. State-change animations replay on the + // fresh row via the animKey/animFrom handoff (see MiniToggle + // and ModelCheckRow armFrom). + Repeater { + model: root.service ? root.service.providers : [] + + delegate: ColumnLayout { + id: block + + required property var modelData + + readonly property string pid: modelData && modelData.id ? String(modelData.id) : "" + readonly property var reg: + modelData && Providers.REGISTRY[modelData.type] ? Providers.REGISTRY[modelData.type] : null + readonly property bool needsKey: reg ? !!reg.needsKey : false + readonly property string keyStatus: + root.service && pid.length > 0 ? root.service.keyStatus(pid) : "none" + readonly property bool missingKey: keyStatus === "none" && needsKey + readonly property bool expanded: root.expandedId === pid + readonly property string envVarName: + reg && reg.envVar ? String(reg.envVar) + : (modelData && modelData.type === "custom" && modelData.name + ? Providers.customEnvVar(String(modelData.name)) : "") + readonly property string keyStatusLine: + keyStatus === "keyring" ? "Stored in system keyring" + : keyStatus === "session" ? "Key set for this session" + : keyStatus.indexOf("env:") === 0 ? "Using env var " + keyStatus.substring(4) + : missingKey ? "No key — set one or export " + (envVarName.length > 0 ? envVarName : "an env var") + : "No key required" + readonly property string modelsErrorText: { + if (!root.service || !root.service.modelsErrors || pid.length === 0) return ""; + var m = root.service.modelsErrors[pid]; + return m ? String(m) : ""; + } + readonly property string keyMessageText: + root.service && root.service.keyMessages && pid.length > 0 + ? (root.service.keyMessages[pid] ? String(root.service.keyMessages[pid]) : "") + : "" + // Provider brand logo (providerIcon resolves the type, + // e.g. google → the Gemini spark in icons/models/). + // Provider logo stem — BrandIcon resolves the theme + // folder (icons/dark|light), e.g. claude → anthropic. + readonly property string iconStem: + modelData && modelData.type + ? ModelIcons.providerIcon(String(modelData.type)) : "" + + Layout.fillWidth: true + spacing: 4 + + // Collapsed row: chevron + brand icon + name, a + // right-side enable toggle, (+ missing-key dot). + // Disabled providers dim their identity. + Rectangle { + id: providerRow + + Layout.fillWidth: true + implicitHeight: 72 + radius: 6 + // Expanded tint swaps the base (restart-free: it + // only changes on the expand click). + color: block.expanded + ? Theme.withAlpha(Theme.surfaceContainerHigh, 0.3) + : Theme.withAlpha(Theme.surfaceContainerHigh, 0.22) + Behavior on color { ColorAnimation { duration: 250 } } + + // Hover state layer (model-selector chip pattern): + // fixed tint, opacity fade. + Rectangle { + anchors.fill: parent + radius: 6 + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.3) + opacity: rowHover.hovered ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + } + + readonly property bool off: + block.modelData && block.modelData.enabled === false + + HoverHandler { + id: rowHover + cursorShape: Qt.PointingHandCursor + } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 10 + spacing: 8 + + // Chevron: right when collapsed, rotates down + // when expanded (matches the card opening + // below the row). + DankIcon { + name: "expand_more" + size: 22 + color: Theme.surfaceVariantText + rotation: block.expanded ? 0 : -90 + opacity: providerRow.off ? 0.45 : 1 + Behavior on rotation { + RotationAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + Behavior on opacity { NumberAnimation { duration: 200 } } + } + + // Brand icon (theme folders via BrandIcon); + // hidden when no file exists for this type. + BrandIcon { + size: 24 + stem: block.iconStem + Layout.alignment: Qt.AlignVCenter + opacity: providerRow.off ? 0.45 : 1 + Behavior on opacity { NumberAnimation { duration: 200 } } + } + + Text { + Layout.fillWidth: true + text: block.modelData && block.modelData.name ? String(block.modelData.name) : "" + color: Theme.surfaceText + font.pixelSize: 13 + elide: Text.ElideRight + opacity: providerRow.off ? 0.45 : 1 + Behavior on opacity { NumberAnimation { duration: 200 } } + } + + MiniToggle { + Layout.alignment: Qt.AlignVCenter + checked: block.modelData + ? block.modelData.enabled !== false : true + onToggled: { + if (!root.service || block.pid.length === 0) return; + root.animKey = "p:" + block.pid; + root.animFrom = block.modelData + ? block.modelData.enabled !== false : true; + root.service.setProviderEnabled(block.pid, !root.animFrom); + } + Component.onCompleted: { + if (root.animKey === "p:" + block.pid) { + armFrom(root.animFrom); + root.animKey = ""; + } + } + } + + NeutralIconButton { + iconName: "delete" + Layout.alignment: Qt.AlignVCenter + onClicked: { + if (root.expandedId === block.pid) root.expandedId = ""; + if (root.service && block.pid.length > 0) + root.service.removeProvider(block.pid); + } + } + + Rectangle { + visible: block.missingKey + width: 8 + height: 8 + radius: 4 + color: Theme.error + } + } + + TapHandler { + onTapped: root.expandedId = block.expanded ? "" : block.pid + } + } + + // Expanded editor card. The height/opacity animate so + // the card slides open instead of popping in; content + // clips during the transition. + Rectangle { + id: editorCard + Layout.fillWidth: true + readonly property int fullHeight: cardBody.implicitHeight + 24 + property real animHeight: block.expanded ? fullHeight : 0 + Behavior on animHeight { + NumberAnimation { + duration: 220 + easing.type: Easing.OutCubic + } + } + Layout.preferredHeight: animHeight + visible: animHeight > 0.5 + clip: true + opacity: block.expanded ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 160 } } + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainerHighest, 0.35) + + ColumnLayout { + id: cardBody + anchors.fill: parent + anchors.margins: 12 + spacing: 10 + + // Persist on editingFinished, not per keystroke: + // every service write resets this Repeater and + // would kill the focused field. + DankTextField { + Layout.fillWidth: true + labelText: "Name" + text: block.modelData && block.modelData.name ? String(block.modelData.name) : "" + onEditingFinished: if (root.service && block.pid.length > 0 + && text !== (block.modelData && block.modelData.name ? String(block.modelData.name) : "")) + root.service.renameProvider(block.pid, text) + } + + DankTextField { + Layout.fillWidth: true + labelText: "Base URL" + placeholderText: "https://api.openai.com/v1" + text: block.modelData && block.modelData.baseUrl ? String(block.modelData.baseUrl) : "" + onEditingFinished: if (root.service && block.pid.length > 0 + && text.trim() !== (block.modelData && block.modelData.baseUrl ? String(block.modelData.baseUrl) : "")) + root.service.setProviderUrl(block.pid, text) + } + + DankTextField { + Layout.fillWidth: true + labelText: "API key" + placeholderText: block.envVarName + text: root.service && root.service.sessionKeys && block.pid.length > 0 + ? (root.service.sessionKeys[block.pid] || "") : "" + echoMode: passwordVisible ? TextInput.Normal : TextInput.Password + showPasswordToggle: true + onEditingFinished: if (root.service && block.pid.length > 0 + && text.length > 0 + && text !== (root.service.sessionKeys && root.service.sessionKeys[block.pid] ? String(root.service.sessionKeys[block.pid]) : "")) { + root.service.setInstanceKey(block.pid, text); + root.service.refreshModels(block.pid); + } + } + + Text { + Layout.fillWidth: true + visible: block.keyMessageText.length > 0 + text: block.keyMessageText + color: Theme.error + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + Text { + Layout.fillWidth: true + visible: block.needsKey && root.service + && !root.service.keyringAvailable + text: "secret-tool not found — keys last this session only; use env vars for persistence" + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + RowLayout { + Layout.fillWidth: true + spacing: 8 + + DankButton { + text: root.service && root.service.modelsRefreshing + ? "Refreshing…" : "Refresh models" + iconName: "refresh" + buttonHeight: 36 + enabled: root.service && !root.service.modelsRefreshing + onClicked: if (root.service && block.pid.length > 0) + root.service.refreshModels(block.pid) + } + + Item { Layout.fillWidth: true } + } + + Text { + text: "Models" + color: Theme.primary + font.pixelSize: 12 + font.bold: true + } + + // Manually register a model id the discovery + // endpoint doesn't list; auto-checked so it's + // immediately usable. + RowLayout { + Layout.fillWidth: true + spacing: 8 + + DankTextField { + id: customModelField + Layout.fillWidth: true + placeholderText: "Add custom model" + } + + NeutralIconButton { + iconName: "add" + buttonHeight: 36 + iconSize: 18 + accent: customModelField.text.trim().length > 0 + onClicked: { + var name = customModelField.text.trim(); + if (!root.service || block.pid.length === 0 || !name) + return; + root.service.addCustomModel(block.pid, name); + customModelField.text = ""; + } + } + } + + DankTextField { + id: modelFilterField + Layout.fillWidth: true + placeholderText: "Search models" + showClearButton: true + text: root.modelFilterText + onTextChanged: root.modelFilterText = text + } + + Text { + Layout.fillWidth: true + visible: block.modelsErrorText.length > 0 + text: block.modelsErrorText + color: Theme.error + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + Text { + Layout.fillWidth: true + visible: (!block.modelData || !block.modelData.discovered + || block.modelData.discovered.length === 0) + && (!block.modelData || !block.modelData.customModels + || block.modelData.customModels.length === 0) + text: "No models discovered — set URL/key, refresh, or add a custom model id" + color: Theme.surfaceVariantText + font.pixelSize: 12 + wrapMode: Text.Wrap + } + + Item { + Layout.fillWidth: true + visible: block.modelData + && ((block.modelData.discovered && block.modelData.discovered.length > 0) + || (block.modelData.customModels && block.modelData.customModels.length > 0)) + Layout.preferredHeight: 352 + + Flickable { + id: modelFlick + anchors.fill: parent + clip: true + contentHeight: modelGrid.implicitHeight + boundsBehavior: Flickable.StopAtBounds + // Remember scroll only outside rebuild + // cycles — delegate add/remove clamps + // contentY transiently. + onContentYChanged: { + if (root._gridRebuilding) return; + root.modelGridY = contentY; + } + // While the rebuild cycle is live, keep + // the view pinned to the stored position + // as rows stream back in. + onContentHeightChanged: if (root._gridRebuilding) + contentY = Math.min(root.modelGridY, + Math.max(0, contentHeight - modelFlick.height)) + + Grid { + id: modelGrid + width: parent.width + columns: 2 + columnSpacing: Theme.spacingS + rowSpacing: Theme.spacingXS + + Repeater { + onItemAdded: root.markGridRebuild() + onItemRemoved: root.markGridRebuild() + // Discovered ∪ custom models (deduped). + model: { + if (!block.modelData) return []; + var fl = root.modelFilterText.toLowerCase(); + var out = [], seen = {}; + var disc = block.modelData.discovered || []; + var cus = block.modelData.customModels || []; + for (var i = 0; i < disc.length; i++) { + if (!disc[i] || !disc[i].id || seen[String(disc[i].id)]) continue; + var did = String(disc[i].id); + var disp = root.service + ? root.service.modelLabel(block.pid, did) : did; + if (fl && !FuzzyMatch.matches(fl, did) + && !FuzzyMatch.matches(fl, + String(disp))) continue; + seen[did] = true; + out.push(disc[i]); + } + for (i = 0; i < cus.length; i++) { + var cid = String(cus[i] || ""); + if (!cid || seen[cid]) continue; + var cdisp = root.service + ? root.service.modelLabel(block.pid, cid) : cid; + if (fl && !FuzzyMatch.matches(fl, cid) + && !FuzzyMatch.matches(fl, + String(cdisp))) continue; + seen[cid] = true; + out.push({ id: cid, custom: true }); + } + return out; + } + + delegate: ModelCheckRow { + required property var modelData + + width: (cardBody.width - Theme.spacingS) / 2 + label: modelData && modelData.id ? String(modelData.id) : "" + providerId: block.pid + displayLabel: root.service && modelData && modelData.id + ? root.service.modelLabel(block.pid, String(modelData.id)) + : (modelData && modelData.id ? String(modelData.id) : "") + iconStem: { + // Unused read — dependency trick (see + // ModelSelector.activeStem): subscribes + // this binding to modelIconStems so it + // re-runs when the icon scan lands. + var _scan = root.service ? root.service.modelIconStems : null; + return modelData && modelData.id && block.modelData + ? ModelIcons.iconForModel(String(modelData.id), + String(block.modelData.type || "")) + : ""; + } + checked: block.modelData && block.modelData.checkedModels + && modelData && modelData.id + ? block.modelData.checkedModels.indexOf(String(modelData.id)) >= 0 + : false + onRenamed: (text) => { + if (!root.service || block.pid.length === 0 + || !modelData || !modelData.id) return; + var clean = String(text || "").trim(); + if (clean === String(modelData.id)) clean = ""; + root.service.setModelLabel(block.pid, String(modelData.id), clean); + } + removable: modelData ? modelData.custom === true : false + onRemoved: { + if (!root.service || block.pid.length === 0 + || !modelData || !modelData.id) return; + root.service.removeCustomModel(block.pid, String(modelData.id)); + } + onToggled: { + if (!root.service || block.pid.length === 0 + || !modelData || !modelData.id) return; + root.animKey = "m:" + block.pid + "/" + + String(modelData.id); + root.animFrom = block.modelData.checkedModels + ? block.modelData.checkedModels.indexOf(String(modelData.id)) >= 0 + : false; + root.service.toggleModel(block.pid, String(modelData.id)); + } + Component.onCompleted: { + var key = "m:" + block.pid + "/" + + (modelData && modelData.id ? String(modelData.id) : ""); + if (root.animKey === key) { + armFrom(root.animFrom); + root.animKey = ""; + } + } + } + } + } + } + + // Scroll indicator: pill sized/positioned by + // the viewport ratio. + Item { + anchors.right: parent.right + anchors.rightMargin: 2 + anchors.top: parent.top + anchors.bottom: parent.bottom + width: 3 + visible: modelFlick.contentHeight > modelFlick.height + 1 + + Rectangle { + radius: width / 2 + width: parent.width + color: Theme.withAlpha(Theme.surfaceVariantText, 0.5) + readonly property real maxScroll: Math.max( + 1, modelFlick.contentHeight - modelFlick.height) + height: Math.max(24, + parent.height * (modelFlick.height + / Math.max(1, modelFlick.contentHeight))) + y: (modelFlick.contentY / maxScroll) * (parent.height - height) + } + } + } + } + } + } + } + } + + // ── Add-provider picker (below the header button) ───────────── + Popup { + id: addPicker + parent: root + y: headerRow.height + 4 + x: Math.max(0, root.width - width) + width: 300 + // The taller branded rows no longer fit the old 420 cap — + // grow the popup instead of scrolling it (a Flickable here + // broke row hover; rows must sit directly in contentItem). + height: Math.min(640, contentItem.implicitHeight + 16) + padding: 8 + + background: Rectangle { + radius: 8 + color: Theme.withAlpha(Theme.surfaceContainer, 0.97) + border.color: Theme.surfaceVariantAlpha + border.width: 1 + } + + contentItem: ColumnLayout { + spacing: 4 + + Repeater { + model: Providers.REGISTRY_TYPES + + delegate: AddRow { + required property var modelData + + title: Providers.REGISTRY[modelData] ? Providers.REGISTRY[modelData].name : String(modelData) + tag: Providers.REGISTRY[modelData] ? Providers.REGISTRY[modelData].format : "" + iconStem: ModelIcons.providerIcon(String(modelData)) + onChosen: { + if (!root.service) return; + root.expandedId = root.service.addProvider(String(modelData)); + addPicker.close(); + } + } + } + } + } +} diff --git a/src/lib/ContextWindows.js b/src/lib/ContextWindows.js new file mode 100644 index 0000000..58bec17 --- /dev/null +++ b/src/lib/ContextWindows.js @@ -0,0 +1,109 @@ +.pragma library + +// Context windows from a models.dev snapshot + token formatting. +// Pure JS. NexusService fetches/slims/caches the snapshot; ollama is +// dynamic (num_ctx / /api/ps) and never registry-matched. + +// Plugin registry type → models.dev provider key. Absent → no lookup. +var PROVIDER_KEYS = { + openai: "openai", + claude: "anthropic", + google: "google", + groq: "groq", + deepseek: "deepseek", + openrouter: "openrouter", + perplexity: "perplexity", + zai: "zai", + moonshot: "moonshotai" +}; + +// Reduce a full models.dev snapshot to { key: { id: context } }, +// keeping only models that actually declare limit.context. Bad JSON +// or malformed shapes degrade to {} — the meter then shows tokens +// without a window. + +function slim(apiJson) { + var out = {}; + var root = null; + try { root = JSON.parse(apiJson); } catch (e) { return out; } + if (!root || typeof root !== "object") return out; + for (var key in root) { + var prov = root[key]; + var models = prov && prov.models; + if (!models || typeof models !== "object") continue; + var entry = {}; + for (var id in models) { + var limit = models[id] && models[id].limit; + var ctx = limit && limit.context; + if (typeof ctx === "number" && ctx > 0) entry[id] = ctx; + } + if (Object.keys(entry).length > 0) out[key] = entry; + } + return out; +} + +// Drop one trailing "-segment" ("x-4-5-20250929" → "x-4-5"); suffix +// trimming never prefix-matches INTO longer keys. + +function trimSegment(id) { + var idx = id.lastIndexOf("-"); + return idx > 0 ? id.substring(0, idx) : ""; +} + +// Window for a model, or 0 when unknown. Exact id first, then +// progressively trimmed suffixes; exact entries always win over +// shorter bases. + +function lookup(slimMap, providerType, modelId) { + if (!slimMap || typeof slimMap !== "object") return 0; + var key = PROVIDER_KEYS[providerType]; + if (!key) return 0; + var models = slimMap[key]; + if (!models) return 0; + var id = String(modelId || "").trim(); + if (!id) return 0; + for (;;) { + if (typeof models[id] === "number") return models[id]; + id = trimSegment(id); + if (!id) return 0; + } +} + +// Human token counts: 0 → "0", 999 → "999", 8192 → "8.2k", +// 1000000 → "1M", 1183232 → "1.2M". Negative/non-numeric → "". + +function formatTokens(n) { + if (typeof n !== "number" || !isFinite(n) || n < 0) return ""; + if (n === 0) return "0"; + function trim1(v) { + var s = v.toFixed(1); + return s.charAt(s.length - 1) === "0" ? s.substring(0, s.length - 2) : s; + } + if (n >= 1e6) return trim1(n / 1e6) + "M"; + if (n >= 1e3) return trim1(n / 1e3) + "k"; + return String(Math.round(n)); +} + +// Context window from ollama /api/ps (the loaded runner's real +// context). Exact name match, then colon-less base; 0 when unknown. +function ollamaWindowFromPs(psJson, model) { + var root = null; + try { root = JSON.parse(psJson); } catch (e) { return 0; } + var models = root && Array.isArray(root.models) ? root.models : []; + var wanted = String(model || "").trim(); + if (!wanted) return 0; + var base = wanted.split(":")[0]; + var exact = null; + var loose = null; + for (var i = 0; i < models.length; i++) { + var m = models[i]; + if (!m) continue; + var name = (typeof m.name === "string" && m.name) + || (typeof m.model === "string" && m.model) || ""; + if (name === wanted) { exact = m; break; } + if (!loose && base && name.split(":")[0] === base) loose = m; + } + var hit = exact || loose; + return (hit && typeof hit.context_length === "number" + && hit.context_length > 0) ? hit.context_length : 0; +} diff --git a/src/lib/ErrorHints.js b/src/lib/ErrorHints.js new file mode 100644 index 0000000..39b8704 --- /dev/null +++ b/src/lib/ErrorHints.js @@ -0,0 +1,35 @@ +.pragma library + +// Map HTTP status codes from OpenAI-compatible endpoints to short, +// human-readable hints appended to error bubbles. + +function httpErrorHint(status) { + switch (status) { + case 400: return "Bad request — the provider rejected the request. Check the model name."; + case 401: return "Unauthorized — the API key is missing or invalid."; + case 403: return "Forbidden — this key lacks permission for the model."; + case 404: return "Not found — check the base URL and model name."; + case 413: return "Payload too large — the conversation exceeds the provider's limit."; + case 422: return "Unprocessable request — check the model name and parameters."; + case 429: return "Rate limited or quota exceeded — wait a moment and retry."; + case 500: + case 502: + case 503: + case 504: return "The provider is having trouble (server error). Try again shortly."; + default: return ""; + } +} + +// Map curl exit codes (non-zero) to connection-level hints. + +function curlExitHint(exitCode) { + switch (exitCode) { + case 6: return "Could not resolve the server address — check the base URL and network."; + case 7: return "Could not connect to the server — is it running and reachable?"; + case 28: return "The request timed out."; + case 35: + case 53: return "TLS handshake failed — check the base URL scheme."; + case 60: return "TLS certificate verification failed."; + default: return ""; + } +} diff --git a/src/lib/FuzzyMatch.js b/src/lib/FuzzyMatch.js new file mode 100644 index 0000000..e4df567 --- /dev/null +++ b/src/lib/FuzzyMatch.js @@ -0,0 +1,18 @@ +.pragma library + +// Fuzzy model-search matcher: case-insensitive subsequence test with +// whitespace stripped from both sides, so "gpt4o" and "gpt 4o" both +// match "gpt-4o", "c45" matches "claude-sonnet-4-5", and plain +// substrings keep working. Pure JS — must stay node-testable. + +function matches(query, target) { + if (typeof query !== "string" || typeof target !== "string") + return false; + var q = query.replace(/\s+/g, "").toLowerCase(); + if (q.length === 0) return true; // no filter → everything passes + var t = target.replace(/\s+/g, "").toLowerCase(); + var i = 0; + for (var j = 0; j < t.length && i < q.length; j++) + if (t.charCodeAt(j) === q.charCodeAt(i)) i++; + return i === q.length; +} diff --git a/src/lib/Markdown.js b/src/lib/Markdown.js new file mode 100644 index 0000000..b242856 --- /dev/null +++ b/src/lib/Markdown.js @@ -0,0 +1,303 @@ +.pragma library + +// Markdown → Qt rich-text HTML. Built for live rendering: unterminated +// constructs (open code fences, unclosed bold) degrade to plain text +// instead of breaking. All input is HTML-escaped; link schemes are +// restricted to http(s). + +function escapeHtml(s) { + if (typeof s !== "string") return ""; + return s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); +} + +function safeUrl(url) { + var u = (url || "").trim(); + return /^https?:\/\//i.test(u) ? u : ""; +} + +// Split message text into text / code segments for the bubble +// renderer. Mirrors markdownToHtml's fenced-block grammar exactly +// (including mid-stream unterminated fences) so both render paths +// never disagree; no input character is dropped. +function splitCodeSegments(text) { + var segs = []; + if (typeof text !== "string" || text.length === 0) return segs; + + var re = /```([^\n`]*)\n([\s\S]*?)(?:```|$)/g; + var last = 0; + var m; + while ((m = re.exec(text)) !== null) { + if (m.index > last) { + var between = text.substring(last, m.index); + if (between.length > 0) segs.push({ type: "text", text: between }); + } + segs.push({ + type: "code", + lang: m[1].trim(), + code: m[2].replace(/\n$/, "") + }); + last = m.index + m[0].length; + } + if (last < text.length) { + var tail = text.substring(last); + if (tail.length > 0) segs.push({ type: "text", text: tail }); + } + return segs; +} + +function styleAttr(colors, key, cssProp) { + if (!colors || !colors[key]) return ""; + return ' style="' + cssProp + ": " + colors[key] + ';"'; +} + +// ── Inline formatting (run on escaped text) ────────────────────── + +function fmtInline(escaped, colors) { + var s = escaped; + + // inline code first; stash rendered spans behind \x01 placeholders so + // later rules (emphasis, links, autolinks) cannot reach inside them + var codeSpans = []; + s = s.replace(/`([^`\n]+)`/g, function (_, code) { + codeSpans.push('' + code + ""); + return "\x01C" + (codeSpans.length - 1) + "\x01"; + }); + + s = s.replace(/\*\*\*([^*\n]+)\*\*\*/g, "$1"); + s = s.replace(/\*\*([^*\n]+)\*\*/g, "$1"); + s = s.replace(/\*([^*\n]+)\*/g, "$1"); + s = s.replace(/__([^_\n]+)__/g, "$1"); + s = s.replace(/~~([^~\n]+)~~/g, "$1"); + + // links: [text](url) — text already escaped, url re-validated + s = s.replace(/\[([^\]\n]+)\]\(([^)\s]+)\)/g, function (_, text, url) { + var u = safeUrl(url.replace(/&/g, "&")); + if (!u) return text; + return '
      " + text + ""; + }); + + // autolink bare http(s) URLs + s = s.replace(/(^|[\s(])(https?:\/\/[^\s<)]+)/g, function (_, pre, url) { + var u = url.replace(/&/g, "&"); + return pre + '" + url + ""; + }); + + return s.replace(/\x01C(\d+)\x01/g, function (_, idx) { + return codeSpans[parseInt(idx, 10)]; + }); +} + +// ── Block pipeline ──────────────────────────────────────────────── + +function markdownToHtml(text, colors, highlightFn) { + if (typeof text !== "string" || text.length === 0) return ""; + + // NUL/SOH are reserved as internal placeholder sentinels (\x00B…\x00 + // fenced blocks, \x01C…\x01 inline code); strip them from raw input so + // literal control chars in message text cannot collide with them. + text = text.replace(/[\x00\x01]/g, ""); + + // 1. Pull out fenced code blocks before anything else so their + // content never sees inline formatting. An unterminated fence + // (mid-stream) still captures to end-of-text. + var blocks = []; + var src = text.replace(/```([^\n`]*)\n([\s\S]*?)(?:```|$)/g, function (_, lang, code) { + var language = lang.trim(); + var rendered; + if (language && highlightFn) + rendered = highlightFn(code.replace(/\n$/, ""), language); + else + rendered = escapeHtml(code.replace(/\n$/, "")); + var html = (language + ? '
      ' + + escapeHtml(language) + "
      " + : "") + + '
      ' +
      +            '' +
      +            rendered + "
      "; + blocks.push(html); + return "\x00B" + (blocks.length - 1) + "\x00"; + }); + + // 2. Escape everything that remains. + src = escapeHtml(src); + + // 3. Split into lines and group into blocks. + var lines = src.split("\n"); + var html = ""; + var i = 0; + + function flushParagraph(buf) { + if (buf.length === 0) return; + // fmtInline per line: the autolink prefix (^|[\s(]) must see each + // line start, which the "
      " join would otherwise hide + html += "

      " + buf.map(function (l) { return fmtInline(l, colors); }) + .join("
      ") + "

      "; + } + + var para = []; + while (i < lines.length) { + var line = lines[i]; + + // placeholder-only line → emit code block directly + var bm = line.match(/^\x00B(\d+)\x00$/); + if (bm) { + flushParagraph(para); para = []; + html += blocks[parseInt(bm[1], 10)]; + i++; + continue; + } + + // heading + var hm = line.match(/^(#{1,6})\s+(.*)$/); + if (hm) { + flushParagraph(para); para = []; + var level = hm[1].length; + var sizes = ["xx-large", "x-large", "large", "medium", "medium", "medium"]; + html += "' + + fmtInline(hm[2].trim(), colors) + ""; + i++; + continue; + } + + // horizontal rule + if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(line)) { + flushParagraph(para); para = []; + html += "
      "; + i++; + continue; + } + + // blockquote (consecutive lines) + if (/^\s*>\s?/.test(line)) { + flushParagraph(para); para = []; + var quote = []; + while (i < lines.length && /^\s*>\s?/.test(lines[i])) { + quote.push(lines[i].replace(/^\s*>\s?/, "")); + i++; + } + html += '
      ' + + quote.map(function (l) { return fmtInline(l, colors); }) + .join("
      ") + "
      "; + continue; + } + + // table (header + separator + rows) + if (line.indexOf("|") >= 0 && i + 1 < lines.length && + /^\s*\|?[\s:|-]+\|[\s:|-]*$/.test(lines[i + 1]) && + lines[i + 1].indexOf("-") >= 0) { + flushParagraph(para); para = []; + function cells(row) { + return row.replace(/^\s*\|/, "").replace(/\|\s*$/, "").split("|") + .map(function (c) { return c.trim(); }); + } + var head = cells(line); + i += 2; + var rows = []; + while (i < lines.length && lines[i].indexOf("|") >= 0 && + lines[i].trim().length > 0) { + rows.push(cells(lines[i])); + i++; + } + html += '" + + "" + + head.map(function (h) { + return ""; + }).join("") + ""; + for (var r = 0; r < rows.length; r++) { + html += "" + + rows[r].map(function (c) { + return ""; + }).join("") + ""; + } + html += "
      " + fmtInline(h, colors) + "
      " + fmtInline(c, colors) + "
      "; + continue; + } + + // lists (consecutive -/* items; "1." renders ordered) + if (/^\s*[-*]\s+/.test(line) || /^\s*\d+\.\s+/.test(line)) { + flushParagraph(para); para = []; + var ordered = /^\s*\d+\.\s/.test(line); + var items = []; + while (i < lines.length && + (ordered ? /^\s*\d+\.\s+/.test(lines[i]) : /^\s*[-*]\s+/.test(lines[i]))) { + var item = lines[i].replace(/^\s*(?:\d+\.|[-*])\s+/, ""); + var check = item.match(/^\[([ xX])\]\s+(.*)$/); + items.push(check + ? (check[1] === " " ? "\u2610 " : "\u2611 ") + fmtInline(check[2], colors) + : fmtInline(item, colors)); + i++; + } + html += (ordered ? "
        " : "
          ") + + items.map(function (it) { return "
        • " + it + "
        • "; }).join("") + + (ordered ? "
      " : ""); + continue; + } + + // blank line ends paragraph + if (line.trim().length === 0) { + flushParagraph(para); para = []; + i++; + continue; + } + + para.push(line); + i++; + } + flushParagraph(para); + + // 4. Inline code blocks that ended up inside paragraphs (rare but + // possible mid-stream when the fence placeholder shares a line). + html = html.replace(/\x00B(\d+)\x00/g, function (_, idx) { + return blocks[parseInt(idx, 10)]; + }); + + return html; +} + + // ── Streaming fade tail ─────────────────────────────────────────── + // Append spanHtml inside the LAST block of html; refuses (returns + // input unchanged) unless the anchor is a trailing block closer, so + // mid-structure injections are impossible. + +function spliceIntoLastBlock(html, spanHtml) { + if (typeof html !== "string" || html.length === 0) return html; + if (typeof spanHtml !== "string" || spanHtml.length === 0) return html; + + var closers = ["

      ", "", "", "", "", + "", "", "", ""]; + var best = -1; + for (var i = 0; i < closers.length; i++) { + var idx = html.lastIndexOf(closers[i]); + if (idx > best) best = idx; + } + if (best < 0) return html; + + // only closing tags / whitespace may follow the anchor + var suffix = html.substring(best); + if (!/^(<\/(p|li|ul|ol|blockquote|h[1-6])>\s*)+$/.test(suffix)) + return html; + + return html.substring(0, best) + spanHtml + suffix; +} diff --git a/src/lib/McpTools.js b/src/lib/McpTools.js new file mode 100644 index 0000000..1cbbc0f --- /dev/null +++ b/src/lib/McpTools.js @@ -0,0 +1,64 @@ +.pragma library + +// MCP tool-selection bookkeeping shared by connect + tools/list_changed. +// enabledTools is ALWAYS the complete positive list of enabled names — +// an empty list means "none enabled", never "all on". Since off-toggles +// are absent from the list, reconnects treat the PREVIOUS discovered set +// as "known" and only default-enable genuinely new tools. + +// Merge an incoming tool list: previously enabled stay on, genuinely +// new tools default on. Returns {discovered, enabledTools}. +function mergeToolSelection(previousDiscovered, enabledTools, incomingTools) { + var prev = Array.isArray(previousDiscovered) ? previousDiscovered : []; + var en = Array.isArray(enabledTools) ? enabledTools : []; + var incoming = Array.isArray(incomingTools) ? incomingTools : []; + + var known = {}; + for (var i = 0; i < prev.length; i++) + if (prev[i] && prev[i].name !== undefined && prev[i].name !== null) + known[String(prev[i].name)] = true; + + var discovered = []; + var seen = {}; + var nextEnabled = []; + var enabledSet = {}; + for (var e = 0; e < en.length; e++) + enabledSet[String(en[e])] = true; + + for (var t = 0; t < incoming.length; t++) { + var tool = incoming[t]; + if (!tool || tool.name === undefined || tool.name === null) continue; + var name = String(tool.name); + if (seen[name]) continue; + seen[name] = true; + discovered.push({ + name: name, + description: tool.description ? String(tool.description) : "", + inputSchema: tool.inputSchema || { type: "object", properties: {} } + }); + // Enabled iff the user kept it on, or it was never known before. + if (enabledSet[name] || !known[name]) nextEnabled.push(name); + } + + return { discovered: discovered, enabledTools: nextEnabled }; +} + +// Normalize a persisted server record; legacy records (no v2 marker) +// expand an empty enabledTools to "all on" — v2+ keep it as "none". +function normalizeLoadedServer(rec) { + if (!rec) return rec; + if (rec.enabled === undefined) rec.enabled = true; + if (!rec.url) rec.url = ""; + if (!rec.name) rec.name = "MCP Server"; + if (!Array.isArray(rec.discovered)) rec.discovered = []; + if (!Array.isArray(rec.enabledTools)) rec.enabledTools = []; + if (rec.toolSelectionV2 !== true + && rec.enabledTools.length === 0 && rec.discovered.length > 0) { + var all = []; + for (var i = 0; i < rec.discovered.length; i++) + if (rec.discovered[i] && rec.discovered[i].name) + all.push(String(rec.discovered[i].name)); + rec.enabledTools = all; + } + return rec; +} diff --git a/src/lib/ModelIcons.js b/src/lib/ModelIcons.js new file mode 100644 index 0000000..1f5cbf2 --- /dev/null +++ b/src/lib/ModelIcons.js @@ -0,0 +1,78 @@ +.pragma library + +// Brand icon resolution: returns a bare file stem; BrandIcon resolves +// it against resources/icons//.svg, falling back to +// resources/icons/models/.svg (nothing when absent). + +// Fixed model-icon bindings for brand providers: every model shows +// this brand, no regex consulted. Deliberately distinct from +// providerIcon — Google's models use the Gemini spark while the +// provider row shows the G logo. +var PROVIDER_MODEL_ICON = { + openai: "openai", + google: "gemini", + claude: "claude", + groq: "groq", + deepseek: "deepseek", + moonshot: "kimi", + zai: "zai" +}; + +// Provider type → logo file stem, only where it differs from the +// type (Anthropic's logo file is anthropic). +var PROVIDER_FILE = { claude: "anthropic" }; + +function providerIcon(type) { + var t = String(type || ""); + if (!t) return ""; + return PROVIDER_FILE[t] || t; +} + +// Regex rules over the model id, first match wins. Used for +// multi-brand runtimes (ollama, lmstudio, custom) whose own logo +// says nothing about the individual model. Extend by dropping a +// { pattern: /.../i, icon: "" } entry plus the svg. +var RULES = [ + { pattern: /glm/i, icon: "zai" }, + { pattern: /qwen/i, icon: "qwen" }, + { pattern: /gemini/i, icon: "gemini" }, + { pattern: /gemma/i, icon: "gemma" }, + { pattern: /claude/i, icon: "claude" }, + { pattern: /deepseek/i, icon: "deepseek" }, + { pattern: /kimi|moonshot/i, icon: "kimi" }, + { pattern: /mistral|magistral|devstral|codestral|ministral|pixtral/i, icon: "mistral" }, + { pattern: /gpt|chatgpt/i, icon: "openai" } +]; + +function iconForModel(modelId, providerType) { + var type = String(providerType || ""); + // Fixed brand: always the bound stem, no regex. + if (PROVIDER_MODEL_ICON[type]) return PROVIDER_MODEL_ICON[type]; + var id = String(modelId || ""); + // Folder-driven rules: every resources/icons/models/.svg auto- + // binds //i (longest first). Dropping a file into the + // folder is enough to theme its models. + for (var a = 0; a < AUTO_RULES.length; a++) + if (AUTO_RULES[a].pattern.test(id)) return AUTO_RULES[a].icon; + for (var i = 0; i < RULES.length; i++) + if (RULES[i].pattern.test(id)) return RULES[i].icon; + // No rule matched: the runtime's own logo. + return type; +} + +// Auto rules built from the models folder at startup (longest stem +// first, "generic" excluded — it is the no-icon fallback). +var AUTO_RULES = []; + +function setAutoIcons(stems) { + var list = []; + for (var i = 0; i < stems.length; i++) { + var s = String(stems[i] || "").trim(); + if (!s || s === "generic") continue; + list.push(s); + } + list.sort(function (a, b) { return b.length - a.length; }); + AUTO_RULES = []; + for (i = 0; i < list.length; i++) + AUTO_RULES.push({ pattern: new RegExp(list[i], "i"), icon: list[i] }); +} diff --git a/src/lib/PromptPresets.js b/src/lib/PromptPresets.js new file mode 100644 index 0000000..1897b87 --- /dev/null +++ b/src/lib/PromptPresets.js @@ -0,0 +1,34 @@ +.pragma library + +// System-prompt personality presets. "Serious" is the default +// personality (fresh installs start with it); "custom" means the +// user wrote their own prompt in the box. + +var PRESETS = [ + { id: "serious", name: "Serious", + text: "You are a helpful and professional assistant. Maintain a serious tone, provide concise responses, and avoid using emojis or excessive emphasis" }, + { id: "playful", name: "Playful", + text: "Deliver accurate knowledge with whimsical enthusiasm; maintain a lighthearted, engaging conversational tone." }, + { id: "socratic", name: "Socratic Teacher", + text: "Never provide direct answers; guide the user toward self-discovery using only probing questions and logical inquiry." }, + { id: "engineer", name: "Engineer", + text: "Maintain maximum objectivity; structure all responses systematically using precise inputs, processes, and defined outputs." }, + { id: "custom", name: "Custom", text: "" } +]; + +function textFor(id) { + for (var i = 0; i < PRESETS.length; i++) + if (PRESETS[i].id === id) return PRESETS[i].text; + return ""; +} + +// Which preset does this prompt correspond to? Exact (trimmed) match +// → that preset; empty → serious (the default personality); +// anything else → custom. +function detect(text) { + var t = String(text || "").trim(); + if (!t) return "serious"; + for (var i = 0; i < PRESETS.length; i++) + if (PRESETS[i].text && PRESETS[i].text === t) return PRESETS[i].id; + return "custom"; +} diff --git a/src/lib/Providers.js b/src/lib/Providers.js new file mode 100644 index 0000000..cbd106c --- /dev/null +++ b/src/lib/Providers.js @@ -0,0 +1,705 @@ +.pragma library + +// Multi-provider registry + wire-format request builders (openai, +// anthropic, gemini, ollama). All secrets travel via curl stdin +// config — never argv. + +var STATUS_TRAILER = "\\nNEXUS_STATUS:%{http_code}\\n"; + +// Built-in provider types. Instances are {id, type, name, baseUrl, +// checkedModels[], envVar?}; format/baseUrl/envVar below are the +// defaults a new instance starts from. `custom` takes its base URL +// (and optional env-var name) from the instance itself. +var REGISTRY = { + openai: { name: "OpenAI", format: "openai", baseUrl: "https://api.openai.com/v1", envVar: "OPENAI_API_KEY", needsKey: true }, + claude: { name: "Anthropic", format: "anthropic", baseUrl: "https://api.anthropic.com", envVar: "ANTHROPIC_API_KEY", needsKey: true }, + google: { name: "Google Generative AI", format: "gemini", baseUrl: "https://generativelanguage.googleapis.com", envVar: "GEMINI_API_KEY", needsKey: true }, + groq: { name: "Groq", format: "openai", baseUrl: "https://api.groq.com/openai/v1", envVar: "GROQ_API_KEY", needsKey: true }, + deepseek: { name: "DeepSeek", format: "openai", baseUrl: "https://api.deepseek.com/v1", envVar: "DEEPSEEK_API_KEY", needsKey: true }, + openrouter: { name: "OpenRouter", format: "openai", baseUrl: "https://openrouter.ai/api/v1", envVar: "OPENROUTER_API_KEY", needsKey: true }, + perplexity: { name: "Perplexity", format: "openai", baseUrl: "https://api.perplexity.ai", envVar: "PERPLEXITY_API_KEY", needsKey: true }, + zai: { name: "Z.ai", format: "openai", baseUrl: "https://api.z.ai/api/paas/v4", envVar: "ZAI_API_KEY", needsKey: true }, + moonshot: { name: "Moonshot", format: "openai", baseUrl: "https://api.moonshot.ai/v1", envVar: "MOONSHOT_API_KEY", needsKey: true }, + ollama: { name: "Ollama", format: "ollama", baseUrl: "http://localhost:11434/v1", envVar: "", needsKey: false }, + lmstudio: { name: "LM Studio", format: "openai", baseUrl: "http://localhost:1234/v1", envVar: "", needsKey: false }, + custom: { name: "OpenAI Compatible", format: "openai", baseUrl: "", envVar: "", needsKey: false } +}; + +var REGISTRY_TYPES = ["openai", "claude", "google", "groq", "deepseek", + "openrouter", "perplexity", "zai", "moonshot", "ollama", + "lmstudio", "custom"]; + +function normalizeBaseUrl(url) { + if (typeof url !== "string") return ""; + var u = url.trim(); + if (u.length === 0 || u.length > 2048) return ""; + if (!/^https?:\/\/.+/ .test(u)) return ""; + if (u[u.length - 1] === "/") u = u.substring(0, u.length - 1); + return u; +} + +// Dynamic per-instance env var for custom providers so several +// custom setups don't share one key: "My Proxy" -> CUSTOM_MY_PROXY_KEY. +function customEnvVar(name) { + var s = String(name || "").toUpperCase().replace(/[^A-Z0-9]+/g, "_"); + s = s.replace(/^_+|_+$/g, ""); + if (!s) s = "CUSTOM"; + return "CUSTOM_" + s + "_KEY"; +} + +function sanitizeApiKey(key) { + if (typeof key !== "string") return ""; + // Strip control chars anywhere (blocks config/header injection), trim ends + return key.replace(/[\x00-\x1f\x7f]/g, "").trim(); +} + +// Escape a value for a double-quoted curl config directive. +function escapeCurlConfig(s) { + if (typeof s !== "string") return ""; + return s.replace(/\\/g, "\\\\") + .replace(/"/g, '\\"') + .replace(/\n/g, "\\n") + .replace(/\r/g, "\\r") + .replace(/\t/g, "\\t"); +} + +function curlCmd(timeoutSeconds) { + return ["curl", "-K", "-", "-N", "-sS", "--no-buffer", "--show-error", + "--connect-timeout", "5", + "--max-time", String(Math.max(5, Math.floor(timeoutSeconds || 300))), + "-w", STATUS_TRAILER]; +} + +function endsWithVersion(u) { + return /\/v\d+$/.test(u); +} + +// Strip a trailing version segment from a normalized base so the +// versioned path appended below never doubles it (…/v1/v1/messages). +// anthropic bases may end in /v; gemini bases in /v or /vbeta. +function stripVersion(base, allowBeta) { + return base.replace(allowBeta ? /\/v\d+(beta)?$/ : /\/v\d+$/, ""); +} + +// OpenAI-compatible chat endpoint: append /v1 unless the base already +// ends in a version segment. +function chatUrl(baseUrl) { + var base = normalizeBaseUrl(baseUrl); + if (!base) return ""; + return endsWithVersion(base) ? base + "/chat/completions" + : base + "/v1/chat/completions"; +} + +function noEnv() { return ""; } + +// Wire format for an instance: explicit instance.format wins, else the +// registry entry for its type, else openai. +function formatOf(instance) { + if (instance && instance.format) return instance.format; + var reg = instance ? REGISTRY[instance.type] : null; + return (reg && reg.format) || "openai"; +} + +// API key resolution per instance: +// session key (memory) → registry env var → (custom only) instance +// envVar → NEXUS_API_KEY → "". envLookup(name) returns the raw env +// string; results are sanitized before use. +function resolveInstanceKey(instance, sessionKey, envLookup) { + var k = sanitizeApiKey(sessionKey); + if (k) return k; + if (!instance) return ""; + var reg = REGISTRY[instance.type] || {}; + if (reg.envVar) { + k = sanitizeApiKey(envLookup ? envLookup(reg.envVar) : ""); + if (k) return k; + } + if (instance.type === "custom") { + var dyn = customEnvVar(instance.name); + k = sanitizeApiKey(envLookup ? envLookup(dyn) : ""); + if (k) return k; + if (instance.envVar) { + k = sanitizeApiKey(envLookup ? envLookup(instance.envVar) : ""); + if (k) return k; + } + k = sanitizeApiKey(envLookup ? envLookup("NEXUS_API_KEY") : ""); + if (k) return k; + } + return ""; +} + +// ── Images (vision) ─────────────────────────────────────────────── +// Neutral shape: images: [{mime, data}] (raw base64, no data: +// prefix). sanitizeImages is the single validation gate, applied at +// payload build AND in each wire builder. + +var IMAGE_MIMES = ["image/png", "image/jpeg", "image/webp", "image/gif"]; +var DEFAULT_MAX_IMAGES = 4; +var DEFAULT_MAX_IMAGE_BYTES = 10 * 1024 * 1024; + +// "IMAGE/PNG;charset=x" → "image/png"; garbage → "" +function normalizeMime(m) { + var s = String(m || "").toLowerCase(); + var semi = s.indexOf(";"); + if (semi >= 0) s = s.substring(0, semi); + return s.trim(); +} + +function isBase64(s) { + return /^[A-Za-z0-9+/]*={0,2}$/.test(s); +} + +// Returns a clean array (at most maxImages entries); entries with an +// unsupported mime, non-base64 data, or a decoded size over maxBytes +// are dropped silently — the caller compares lengths if it needs to +// surface a rejection hint. +function sanitizeImages(images, maxImages, maxBytes) { + var max = typeof maxImages === "number" && maxImages > 0 + ? Math.floor(maxImages) : DEFAULT_MAX_IMAGES; + var bytes = typeof maxBytes === "number" && maxBytes > 0 + ? maxBytes : DEFAULT_MAX_IMAGE_BYTES; + if (!Array.isArray(images)) return []; + var out = []; + for (var i = 0; i < images.length && out.length < max; i++) { + var e = images[i]; + if (!e || typeof e !== "object") continue; + var mime = normalizeMime(e.mime); + if (IMAGE_MIMES.indexOf(mime) < 0) continue; + var data = String(e.data || "").replace(/\s+/g, ""); + if (!data || !isBase64(data)) continue; + if (Math.floor(data.length * 3 / 4) > bytes) continue; + out.push({ mime: mime, data: data }); + } + return out; +} + +// Per-format content builders: images first, then the text part when +// non-empty (image-only turns omit the text part entirely). + +function openaiImageParts(images, text) { + var parts = []; + for (var i = 0; i < images.length; i++) + parts.push({ type: "image_url", + image_url: { url: "data:" + images[i].mime + + ";base64," + images[i].data } }); + if (text) parts.push({ type: "text", text: text }); + return parts; +} + +function anthropicContent(images, text) { + var blocks = []; + for (var i = 0; i < images.length; i++) + blocks.push({ type: "image", + source: { type: "base64", + media_type: images[i].mime, + data: images[i].data } }); + if (text) blocks.push({ type: "text", text: text }); + return blocks; +} + +function geminiParts(images, text) { + var parts = []; + for (var i = 0; i < images.length; i++) + parts.push({ inline_data: { mime_type: images[i].mime, + data: images[i].data } }); + if (text) parts.push({ text: text }); + return parts; +} + +// Ollama takes bare base64 strings in a per-message images array +// (mime is inferred by the server). + +function imagesForOllama(images) { + var out = []; + for (var i = 0; i < images.length; i++) + if (images[i] && images[i].data) out.push(images[i].data); + return out; +} + +// Map conversation records ({role, content, state}) to a format- +// agnostic payload: trimmed system string + history messages. User +// messages always pass; assistant messages only when state === "done". +// Role mapping (gemini assistant → "model") happens in the builders. +function buildApiPayload(instance, opts) { + opts = opts || {}; + var out = { system: (opts.systemPrompt || "").trim(), messages: [] }; + var hist = opts.messages || []; + for (var i = 0; i < hist.length; i++) { + var m = hist[i]; + if (!m) continue; + if (m.role === "user") { + // Image-only turns (empty text) must survive the filter. + var imgs = sanitizeImages(m.images); + if (!m.content && imgs.length === 0) continue; + var rec = { role: "user", content: m.content }; + if (imgs.length > 0) rec.images = imgs; + out.messages.push(rec); + } + else if (m.role === "assistant" && m.state === "done" && m.content) + out.messages.push({ role: "assistant", content: m.content }); + } + return out; +} + +// ── Tool calling (MCP) ──────────────────────────────────────────── +// Neutral shapes flowing through the request builders: +// tools: [{ type: "function", function: { name, description, parameters } }] +// assistant: { role: "assistant", content, tool_calls: [{id, function: {name, arguments}}] } +// results: { role: "tool", tool_call_id, name, content } + +// Tool-call arguments may be a JSON string (OpenAI wire) or an object +// (Gemini/Ollama shapes) — normalize to an object. + +function parseToolArgs(args) { + if (typeof args !== "string") return args || {}; + try { return JSON.parse(args); } catch (e) { return {}; } +} + +// Unwrap an MCP result envelope to model-visible text: +// string → as-is; {content:[{text}]} → blocks joined; isError → +// "[Tool error]: " prefix; else JSON.stringify. Raw envelopes can +// prompt duplicate tool calls on long responses. +function unwrapMcpResult(result) { + if (result === null || result === undefined) return ""; + if (typeof result === "string") return result; + if (typeof result !== "object") return String(result); + if (Array.isArray(result.content)) { + var parts = []; + for (var i = 0; i < result.content.length; i++) { + var c = result.content[i]; + if (!c || typeof c !== "object") continue; + if (c.type === "text" && typeof c.text === "string") + parts.push(c.text); + } + var joined = parts.join("\n\n"); + if (result.isError === true) joined = "[Tool error]: " + joined; + return joined; + } + return JSON.stringify(result); +} + +// OpenAI wire: assistant tool calls serialize their arguments as a +// JSON string; plain messages pass through unchanged. + +function messagesForOpenai(messages) { + var out = []; + for (var i = 0; i < messages.length; i++) { + var m = messages[i]; + if (m.tool_calls && m.tool_calls.length > 0) { + var tcs = []; + for (var t = 0; t < m.tool_calls.length; t++) { + var fn = m.tool_calls[t].function || {}; + tcs.push({ + // OpenAI-compat spec requires a non-empty id; + // some providers omit it on streaming deltas. + id: m.tool_calls[t].id || ("call_" + t), + type: "function", + function: { + name: fn.name || "", + arguments: typeof fn.arguments === "string" + ? fn.arguments : JSON.stringify(fn.arguments || {}) + } + }); + } + out.push({ role: "assistant", content: m.content || "", tool_calls: tcs }); + } else { + out.push(m); + } + } + return out; +} + +// OpenAI-shaped tool definitions → Anthropic `tools` field. + +function toolsForAnthropic(tools) { + var out = []; + for (var i = 0; i < tools.length; i++) { + var fn = tools[i].function || {}; + out.push({ + name: fn.name, + description: fn.description || "", + input_schema: fn.parameters || { type: "object", properties: {} } + }); + } + return out; +} + +// OpenAI-shaped tool definitions → Gemini `tools` field. Gemini +// 400s on non-Gemini schema keywords, so schemas are deep-sanitized. + +// Fields Gemini's Schema proto actually accepts. Everything else in +// the input schema is dropped. +var GEMINI_SCHEMA_KEYS = { + type: 1, format: 1, description: 1, nullable: 1, enum: 1, + items: 1, properties: 1, required: 1, minItems: 1, maxItems: 1, + minLength: 1, maxLength: 1, minimum: 1, maximum: 1, pattern: 1, + anyOf: 1 +}; + +var GEMINI_SCHEMA_TYPES = ["string", "number", "integer", "boolean", + "array", "object"]; + +function sanitizeGeminiSchema(schema) { + if (!schema || typeof schema !== "object" || Array.isArray(schema)) + return null; + var out = {}; + for (var k in schema) { + if (!Object.prototype.hasOwnProperty.call(GEMINI_SCHEMA_KEYS, k)) + continue; + var v = schema[k]; + if (k === "type") { + var t = String(v).toLowerCase(); + if (GEMINI_SCHEMA_TYPES.indexOf(t) >= 0) out.type = t; + } else if (k === "items") { + out.items = sanitizeGeminiSchema(v) || { type: "string" }; + } else if (k === "properties") { + var props = {}; + if (v && typeof v === "object" && !Array.isArray(v)) + for (var p in v) + props[p] = sanitizeGeminiSchema(v[p]) || { type: "string" }; + out.properties = props; + } else if (k === "anyOf") { + if (Array.isArray(v)) + out.anyOf = v.map(sanitizeGeminiSchema); + } else if (k === "required" || k === "enum") { + if (Array.isArray(v)) out[k] = v; + } else { + out[k] = v; // scalars: format, description, nullable, bounds, pattern + } + } + return out; +} + +function toolsForGemini(tools) { + var decls = []; + for (var i = 0; i < tools.length; i++) { + var fn = tools[i].function || {}; + var params = sanitizeGeminiSchema(fn.parameters) + || { type: "object", properties: {} }; + if (!params.type) params.type = "object"; + decls.push({ + name: fn.name, + description: fn.description || "", + parameters: params + }); + } + return [{ functionDeclarations: decls }]; +} + +// Build { cmd, body } for a streaming chat request on the instance's +// wire format. opts: {sessionKey, model, messages, systemPrompt, +// temperature (number|null), maxTokens (0 = default), numCtx +// (0 = omit; ollama only), timeoutSeconds, envLookup?, tools?, +// rawMessages?}. Null when base/model unusable. +function buildChatRequest(instance, opts) { + opts = opts || {}; + var base = normalizeBaseUrl(instance && instance.baseUrl); + var model = (opts.model || "").trim(); + if (!base || !model) return null; + + var format = formatOf(instance); + var payload = opts.rawMessages + ? { system: (opts.systemPrompt || "").trim(), messages: opts.messages || [] } + : buildApiPayload(instance, opts); + if (opts.tools && opts.tools.length > 0) payload.tools = opts.tools; + var key = resolveInstanceKey(instance, opts.sessionKey, opts.envLookup || noEnv); + + var url; + var body; + var i; + if (format === "anthropic") { + url = stripVersion(base, false) + "/v1/messages"; + // max_tokens is required by the Anthropic API — default 4096. + // Tool rounds carry tool/tool_use messages that map to + // user tool_result blocks and assistant tool_use blocks. + var amsgs = []; + for (i = 0; i < payload.messages.length; i++) { + var tm = payload.messages[i]; + if (tm.role === "tool") { + amsgs.push({ role: "user", content: [{ + type: "tool_result", + tool_use_id: tm.tool_call_id || "", + content: tm.content || "" + }] }); + } else if (tm.tool_calls && tm.tool_calls.length > 0) { + var blocks = []; + if (tm.content && tm.content.length > 0) + blocks.push({ type: "text", text: tm.content }); + for (var t = 0; t < tm.tool_calls.length; t++) { + var tfn = tm.tool_calls[t].function || {}; + blocks.push({ + type: "tool_use", + id: tm.tool_calls[t].id || "", + name: tfn.name || "", + input: parseToolArgs(tfn.arguments) + }); + } + amsgs.push({ role: "assistant", content: blocks }); + } else if (tm.role === "user" + && sanitizeImages(tm.images).length > 0) { + amsgs.push({ role: "user", + content: anthropicContent( + sanitizeImages(tm.images), tm.content) }); + } else { + amsgs.push({ role: tm.role === "assistant" ? "assistant" : "user", + content: tm.content }); + } + } + body = { model: model, + max_tokens: opts.maxTokens > 0 ? opts.maxTokens : 4096, + messages: amsgs, stream: true }; + if (typeof opts.temperature === "number") body.temperature = opts.temperature; + if (payload.system) body.system = payload.system; + if (payload.tools && payload.tools.length > 0) + body.tools = toolsForAnthropic(payload.tools); + } else if (format === "gemini") { + url = stripVersion(base, true) + "/v1beta/models/" + model + ":streamGenerateContent?alt=sse"; + var contents = []; + for (i = 0; i < payload.messages.length; i++) { + var gm = payload.messages[i]; + var parts = []; + if (gm.role === "assistant" && gm.tool_calls && gm.tool_calls.length > 0) { + for (var g = 0; g < gm.tool_calls.length; g++) { + var gfn = gm.tool_calls[g].function || {}; + var part = { + functionCall: { + name: gfn.name || "", + args: parseToolArgs(gfn.arguments) + } + }; + if (g === 0) { + var raw = gm.tool_calls[g].thoughtSignature; + var sig = (typeof raw === "string" && raw.length > 0) + ? raw + : "skip_thought_signature_validator"; + part.thoughtSignature = sig; + } + parts.push(part); + } + contents.push({ role: "model", parts: parts }); + } else if (gm.role === "tool") { + parts.push({ functionResponse: { + name: gm.name || "", + response: { result: gm.content || "" } + } }); + contents.push({ role: "user", parts: parts }); + } else if (gm.role === "user" + && sanitizeImages(gm.images).length > 0) { + parts = geminiParts(sanitizeImages(gm.images), gm.content); + contents.push({ role: "user", parts: parts }); + } else { + parts.push({ text: gm.content }); + contents.push({ role: gm.role === "assistant" ? "model" : "user", + parts: parts }); + } + } + var gen = {}; + if (typeof opts.temperature === "number") gen.temperature = opts.temperature; + if (opts.maxTokens > 0) gen.maxOutputTokens = opts.maxTokens; + body = { contents: contents, generationConfig: gen }; + if (payload.system) + body.systemInstruction = { parts: [{ text: payload.system }] }; + if (payload.tools && payload.tools.length > 0) + body.tools = toolsForGemini(payload.tools); + } else if (format === "ollama") { + // Native /api/chat — the only Ollama endpoint honoring + // options.num_ctx (/v1 pins the default context). + url = stripVersion(base, false) + "/api/chat"; + var omsgs = []; + if (payload.system) omsgs.push({ role: "system", content: payload.system }); + for (i = 0; i < payload.messages.length; i++) { + var nm = payload.messages[i]; + if (nm.role === "assistant" && nm.tool_calls + && nm.tool_calls.length > 0) { + var ocalls = []; + for (var oc = 0; oc < nm.tool_calls.length; oc++) { + var nfn = nm.tool_calls[oc].function || {}; + ocalls.push({ function: { + name: nfn.name || "", + arguments: parseToolArgs(nfn.arguments) + } }); + } + omsgs.push({ role: "assistant", content: nm.content || "", + tool_calls: ocalls }); + } else if (nm.role === "tool") { + // Results ride as plain tool messages in call order — + // ollama matches them by order, not by id. + omsgs.push({ role: "tool", content: nm.content || "" }); + } else if (nm.role === "user" + && sanitizeImages(nm.images).length > 0) { + omsgs.push({ role: "user", content: nm.content || "", + images: imagesForOllama(sanitizeImages(nm.images)) }); + } else { + omsgs.push({ role: nm.role === "assistant" ? "assistant" : "user", + content: nm.content }); + } + } + body = { model: model, messages: omsgs, stream: true }; + var oopts = {}; + if (opts.numCtx > 0) oopts.num_ctx = opts.numCtx; + if (typeof opts.temperature === "number") + oopts.temperature = opts.temperature; + if (opts.maxTokens > 0) oopts.num_predict = opts.maxTokens; + if (Object.keys(oopts).length > 0) body.options = oopts; + if (payload.tools && payload.tools.length > 0) body.tools = payload.tools; + } else { + url = chatUrl(base); + var msgs = []; + if (payload.system) msgs.push({ role: "system", content: payload.system }); + // User turns with images become multipart content arrays; the + // neutral `images` key itself never rides into the wire body. + for (i = 0; i < payload.messages.length; i++) { + var om = payload.messages[i]; + var oi = om.role === "user" ? sanitizeImages(om.images) : []; + if (oi.length > 0) + msgs.push({ role: "user", + content: openaiImageParts(oi, om.content) }); + else + msgs.push(om); + } + body = { model: model, messages: messagesForOpenai(msgs), stream: true, + stream_options: { include_usage: true } }; + if (typeof opts.temperature === "number") body.temperature = opts.temperature; + if (opts.maxTokens > 0) body.max_tokens = opts.maxTokens; + // No options block on openai: /v1 pins context to the server + // default no matter what is sent — see the ollama branch. + if (payload.tools && payload.tools.length > 0) body.tools = payload.tools; + } + + var config = 'url = "' + escapeCurlConfig(url) + '"\n'; + config += 'request = "POST"\n'; + config += 'header = "Content-Type: application/json"\n'; + config += 'header = "Accept: application/json"\n'; + + if (format === "anthropic") { + config += 'header = "anthropic-version: 2023-06-01"\n'; + if (key) config += 'header = "x-api-key: ' + escapeCurlConfig(key) + '"\n'; + } else if (format === "gemini") { + if (key) config += 'header = "x-goog-api-key: ' + escapeCurlConfig(key) + '"\n'; + } else if (key) { + config += 'header = "Authorization: Bearer ' + escapeCurlConfig(key) + '"\n'; + } + + config += 'data = "' + escapeCurlConfig(JSON.stringify(body)) + '"\n'; + return { cmd: curlCmd(opts.timeoutSeconds), body: config }; +} + +// Build { cmd, body } for GET . Null when base invalid. +function buildModelsRequest(instance, sessionKey) { + var base = normalizeBaseUrl(instance && instance.baseUrl); + if (!base) return null; + var format = formatOf(instance); + var key = sanitizeApiKey(sessionKey || ""); + + var url; + if (format === "anthropic") url = stripVersion(base, false) + "/v1/models"; + else if (format === "gemini") url = stripVersion(base, true) + "/v1beta/models"; + else url = endsWithVersion(base) ? base + "/models" : base + "/v1/models"; + + var config = 'url = "' + escapeCurlConfig(url) + '"\n'; + config += 'request = "GET"\n'; + + if (format === "anthropic") { + config += 'header = "anthropic-version: 2023-06-01"\n'; + if (key) config += 'header = "x-api-key: ' + escapeCurlConfig(key) + '"\n'; + } else if (format === "gemini") { + if (key) config += 'header = "x-goog-api-key: ' + escapeCurlConfig(key) + '"\n'; + } else if (key) { + config += 'header = "Authorization: Bearer ' + escapeCurlConfig(key) + '"\n'; + } + + return { cmd: curlCmd(30), body: config }; +} + +// models.dev registry snapshot — NexusService slims + caches it. +function buildRegistryRequest(timeoutSeconds) { + var url = "https://models.dev/api.json"; + var config = 'url = "' + escapeCurlConfig(url) + '"\n'; + config += 'request = "GET"\n'; + return { cmd: curlCmd(timeoutSeconds), body: config }; +} + +// Ollama loaded-model probe; models[].context_length is the real +// loaded context (server default without num_ctx). Empty list when +// the model isn't loaded. +function buildOllamaPsRequest(instance, timeoutSeconds) { + var base = normalizeBaseUrl(instance && instance.baseUrl); + if (!base) return null; + var url = stripVersion(base, false) + "/api/ps"; + var config = 'url = "' + escapeCurlConfig(url) + '"\n'; + config += 'request = "GET"\n'; + return { cmd: curlCmd(timeoutSeconds), body: config }; +} + +// Parse a model list per wire format → sorted, deduped [{ id, label }]. +// openai: {data:[{id}]}; anthropic: {data:[{id, display_name}]}; +// gemini: {models:[{name: "models/x", displayName}]} — the leading +// "models/" is stripped from ids. Bad/absent shapes → []. +function parseModelList(json, format) { + var fmt = format || "openai"; + var out = []; + try { + var obj = JSON.parse(json); + var arr = fmt === "gemini" ? (obj && obj.models) : (obj && obj.data); + if (!Array.isArray(arr)) return []; + var seen = {}; + for (var i = 0; i < arr.length; i++) { + var e = arr[i]; + if (!e) continue; + var id; + var label; + if (fmt === "gemini") { + if (typeof e.name !== "string" || e.name.length === 0) continue; + id = e.name.replace(/^models\//, ""); + if (!id) continue; + label = (typeof e.displayName === "string" && e.displayName) || id; + } else { + if (typeof e.id !== "string" || e.id.length === 0) continue; + id = e.id; + label = (fmt === "anthropic" && + typeof e.display_name === "string" && e.display_name) || id; + } + if (seen[id]) continue; + seen[id] = true; + out.push({ id: id, label: label }); + } + } catch (err) { return []; } + out.sort(function (a, b) { return a.id < b.id ? -1 : a.id > b.id ? 1 : 0; }); + return out; +} + +// Drop per-instance model state for models the provider no longer +// serves (ghost picker entries). Pure: returns {removed, +// checkedModels, labels}. extraIds (pins) widen the stale scan; +// customModels are never pruned. +function pruneStaleModels(inst, discovered, extraIds) { + if (!inst) return { removed: [], checkedModels: [], labels: {} }; + var avail = {}; + var disc = Array.isArray(discovered) ? discovered : []; + for (var i = 0; i < disc.length; i++) + if (disc[i] && typeof disc[i].id === "string" && disc[i].id) + avail[disc[i].id] = true; + var custom = Array.isArray(inst.customModels) ? inst.customModels : []; + for (var c = 0; c < custom.length; c++) + if (typeof custom[c] === "string" && custom[c]) avail[custom[c]] = true; + + var known = {}; + var checked = Array.isArray(inst.checkedModels) ? inst.checkedModels : []; + for (var k = 0; k < checked.length; k++) + if (typeof checked[k] === "string" && checked[k]) known[checked[k]] = true; + var labelsIn = inst.modelLabels || {}; + for (var lk in labelsIn) known[lk] = true; + if (Array.isArray(extraIds)) + for (var e = 0; e < extraIds.length; e++) + if (typeof extraIds[e] === "string" && extraIds[e]) known[extraIds[e]] = true; + + var removed = []; + for (var kid in known) if (!avail[kid]) removed.push(kid); + + var kept = []; + for (var j = 0; j < checked.length; j++) + if (typeof checked[j] === "string" && avail[checked[j]]) kept.push(checked[j]); + var labels = {}; + for (var mk in labelsIn) if (avail[mk]) labels[mk] = labelsIn[mk]; + + return { removed: removed, checkedModels: kept, labels: labels }; +} diff --git a/src/lib/StreamParser.js b/src/lib/StreamParser.js new file mode 100644 index 0000000..d662446 --- /dev/null +++ b/src/lib/StreamParser.js @@ -0,0 +1,392 @@ +.pragma library + +// SSE / NDJSON parsing for OpenAI, Anthropic, Gemini and Ollama +// native streaming endpoints, plus tag routing and the +// NEXUS_STATUS trailer handling. + +var OPEN_TAG = ""; +var CLOSE_TAG = ""; + +// Split a raw stdout chunk into complete lines, carrying any partial +// line across reads. CRLF tolerated; blank lines dropped. + +function splitLines(chunk, carry) { + var combined = (carry || "") + (chunk || ""); + var lines = []; + var start = 0; + for (var i = 0; i < combined.length; i++) { + if (combined[i] === "\n") { + var end = i; + if (end > start && combined[end - 1] === "\r") end--; + if (end > start) lines.push(combined.substring(start, end)); + start = i + 1; + } + } + return { lines: lines, buffer: combined.substring(start) }; +} + +// Parse one stream chunk. `format` picks the wire protocol; `acc` +// accumulates fragmented tool calls across chunks of one round. +// Returns content/thinking deltas, token counts, done flag, toolCalls. + +function parseDelta(jsonPart, format, acc) { + acc = acc || {}; + if (format === "anthropic") return parseAnthropicDelta(jsonPart, acc); + if (format === "gemini") return parseGeminiDelta(jsonPart); + if (format === "ollama") return parseOllamaDelta(jsonPart); + return parseOpenAiDelta(jsonPart, acc); +} + +function newDelta() { + // toolCalls is added only when a provider actually emits calls — + // consumers treat "absent" as "none". + return { content: "", thinking: "", inputTokens: 0, + outputTokens: 0, done: false }; +} + +function parseOpenAiDelta(jsonPart, acc) { + var out = newDelta(); + var obj = null; + try { obj = JSON.parse(jsonPart); } catch (e) { return out; } + if (!obj || typeof obj !== "object" || obj.error) return out; + + if (obj.usage && typeof obj.usage.completion_tokens === "number") + out.outputTokens = obj.usage.completion_tokens; + if (obj.usage && typeof obj.usage.prompt_tokens === "number") + out.inputTokens = obj.usage.prompt_tokens; + + var choice = (obj.choices && obj.choices.length > 0) ? obj.choices[0] : null; + if (!choice) return out; + + if (choice.delta) { + if (typeof choice.delta.content === "string") out.content = choice.delta.content; + if (typeof choice.delta.reasoning_content === "string") + out.thinking = choice.delta.reasoning_content; + else if (typeof choice.delta.reasoning === "string") + out.thinking = choice.delta.reasoning; + // Tool calls stream as fragments — merge by index in the accumulator + if (Array.isArray(choice.delta.tool_calls)) { + acc.openaiTools = acc.openaiTools || {}; + for (var ti = 0; ti < choice.delta.tool_calls.length; ti++) { + var tc = choice.delta.tool_calls[ti]; + if (!tc) continue; + var idx = (tc.index !== undefined) ? tc.index : 0; + if (!acc.openaiTools[idx]) + acc.openaiTools[idx] = { id: "", name: "", arguments: "" }; + if (tc.id) acc.openaiTools[idx].id = tc.id; + if (tc.function) { + if (tc.function.name && !acc.openaiTools[idx].name) + acc.openaiTools[idx].name = tc.function.name; + if (tc.function.arguments) { + var arg = tc.function.arguments; + acc.openaiTools[idx].arguments += (typeof arg === "string") + ? arg : JSON.stringify(arg); + } + } + } + } + } else if (choice.message && typeof choice.message.content === "string") { + out.content = choice.message.content; + // Non-streaming shape: complete tool calls ride on the message + if (Array.isArray(choice.message.tool_calls) && choice.message.tool_calls.length > 0) + out.toolCalls = choice.message.tool_calls; + } + + if (choice.finish_reason) { + out.done = true; + // Materialize accumulated fragments on completion + if (acc.openaiTools) { + var calls = []; + var idxs = Object.keys(acc.openaiTools).sort(function (a, b) { return a - b; }); + for (var oi = 0; oi < idxs.length; oi++) { + var t = acc.openaiTools[idxs[oi]]; + if (t.name) + calls.push({ id: t.id, function: { name: t.name, arguments: t.arguments } }); + } + if (calls.length > 0) out.toolCalls = calls; + } + } + return out; +} + +// Anthropic streaming payloads are single JSON objects; the `event:` SSE +// lines never reach the parser (splitLines/handler drops them). + +function parseAnthropicDelta(jsonPart, acc) { + var out = newDelta(); + var obj = null; + try { obj = JSON.parse(jsonPart); } catch (e) { return out; } + if (!obj || typeof obj !== "object") return out; + + // Error events carry the provider's message; surface it and finish. + if (obj.type === "error") { + var msg = (obj.error && typeof obj.error.message === "string") + ? obj.error.message : "unknown error"; + out.content = "API error: " + msg; + out.done = true; + return out; + } + if (obj.error) return out; + + // message_start carries the prompt-side usage (input_tokens); + // the cumulative output count arrives later on message_delta. + if (obj.type === "message_start" && obj.message && obj.message.usage + && typeof obj.message.usage.input_tokens === "number") + out.inputTokens = obj.message.usage.input_tokens; + + if (obj.type === "content_block_start" && obj.content_block + && obj.content_block.type === "tool_use") { + // Tool use block: remember id/name, input arrives as fragments + acc.anthropicBlocks = acc.anthropicBlocks || {}; + acc.anthropicBlocks[obj.index] = { + id: obj.content_block.id || "", + name: obj.content_block.name || "", + json: "" + }; + } else if (obj.type === "content_block_delta" && obj.delta) { + if (obj.delta.type === "text_delta" && typeof obj.delta.text === "string") + out.content = obj.delta.text; + else if (obj.delta.type === "thinking_delta" && typeof obj.delta.thinking === "string") + out.thinking = obj.delta.thinking; + else if (obj.delta.type === "input_json_delta" && obj.delta.partial_json) { + acc.anthropicBlocks = acc.anthropicBlocks || {}; + if (acc.anthropicBlocks[obj.index]) + acc.anthropicBlocks[obj.index].json += obj.delta.partial_json; + } + } else if (obj.type === "content_block_stop") { + var blk = (acc.anthropicBlocks || {})[obj.index]; + if (blk) { + acc.anthropicTools = acc.anthropicTools || []; + var args = {}; + try { args = blk.json ? JSON.parse(blk.json) : {}; } catch (e) { args = {}; } + acc.anthropicTools.push({ id: blk.id, function: { name: blk.name, arguments: args } }); + } + } else if (obj.type === "message_delta") { + out.done = true; + if (obj.delta && obj.delta.stop_reason === "tool_use" + && acc.anthropicTools && acc.anthropicTools.length > 0) + out.toolCalls = acc.anthropicTools.slice(); + if (obj.usage && typeof obj.usage.output_tokens === "number") + out.outputTokens = obj.usage.output_tokens; + } else if (obj.type === "message_stop") { + out.done = true; + } + // message_start / ping → empty + return out; +} + +function parseGeminiDelta(jsonPart) { + var out = newDelta(); + var obj = null; + try { obj = JSON.parse(jsonPart); } catch (e) { return out; } + if (!obj || typeof obj !== "object" || obj.error) return out; + + if (obj.usageMetadata) { + if (typeof obj.usageMetadata.candidatesTokenCount === "number") + out.outputTokens = obj.usageMetadata.candidatesTokenCount; + if (typeof obj.usageMetadata.promptTokenCount === "number") + out.inputTokens = obj.usageMetadata.promptTokenCount; + } + + var cand = (obj.candidates && obj.candidates.length > 0) ? obj.candidates[0] : null; + if (!cand) return out; + + var parts = (cand.content && cand.content.parts) || []; + var text = ""; + var think = ""; + for (var i = 0; i < parts.length; i++) { + if (!parts[i]) continue; + // Gemini emits function calls complete (never fragmented) — + // check before the text guard: these parts carry no text. + if (parts[i].functionCall) { + if (!Array.isArray(out.toolCalls)) + out.toolCalls = []; + // thoughtSignature must be echoed back on relaunch or + // Gemini 400s; accept both spellings. + var sig = parts[i].thoughtSignature + || parts[i].thought_signature + || null; + out.toolCalls.push({ + id: "", + function: { + name: parts[i].functionCall.name || "", + arguments: parts[i].functionCall.args || {} + }, + thoughtSignature: sig + }); + } + if (typeof parts[i].text !== "string") continue; + if (parts[i].thought === true) think += parts[i].text; + else text += parts[i].text; + } + out.content = text; + out.thinking = think; + + if (cand.finishReason) out.done = true; + return out; +} + +// Ollama native /api/chat: NDJSON lines; deltas in message.content / +// message.thinking; tool calls arrive complete (object arguments); +// final line has done:true + token counts. + +function parseOllamaDelta(jsonPart) { + var out = newDelta(); + var obj = null; + try { obj = JSON.parse(jsonPart); } catch (e) { return out; } + if (!obj || typeof obj !== "object" || obj.error) return out; + + var msg = obj.message; + if (msg && typeof msg === "object") { + if (typeof msg.content === "string") out.content = msg.content; + if (typeof msg.thinking === "string") out.thinking = msg.thinking; + if (Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0) { + out.toolCalls = []; + for (var i = 0; i < msg.tool_calls.length; i++) { + var tc = msg.tool_calls[i]; + var fn = (tc && tc.function) || {}; + out.toolCalls.push({ + id: tc.id || "", + function: { name: fn.name || "", arguments: fn.arguments || {} } + }); + } + } + } + + if (obj.done === true) { + out.done = true; + if (typeof obj.eval_count === "number") out.outputTokens = obj.eval_count; + if (typeof obj.prompt_eval_count === "number") + out.inputTokens = obj.prompt_eval_count; + } + return out; +} + +function couldStartTag(tail, tag) { + return tail.length < tag.length && tag.indexOf(tail) === 0; +} + +// Route streamed text into content vs thinking, tracking tags +// that may be split across chunks. Newlines directly after a tag are +// stripped. tagBuffer/insideThinkTag are carried between calls. + +function routeThinkTags(text, tagBuffer, insideThinkTag) { + var res = { + contentParts: [], + thinkingParts: [], + tagBuffer: "", + insideThinkTag: !!insideThinkTag + }; + var input = (tagBuffer || "") + (text || ""); + + function emit(s) { + if (s.length === 0) return; + if (res.insideThinkTag) res.thinkingParts.push(s); + else res.contentParts.push(s); + } + + var plain = ""; + var i = 0; + while (i < input.length) { + if (input[i] === "<") { + var rest = input.substring(i); + if (!res.insideThinkTag && rest.indexOf(OPEN_TAG) === 0) { + emit(plain); plain = ""; + res.insideThinkTag = true; + i += OPEN_TAG.length; + if (input[i] === "\n") i++; + continue; + } + if (res.insideThinkTag && rest.indexOf(CLOSE_TAG) === 0) { + emit(plain); plain = ""; + res.insideThinkTag = false; + i += CLOSE_TAG.length; + if (input[i] === "\n") i++; + continue; + } + // Not a full tag — might be a tag split across chunks + var relevant = res.insideThinkTag ? CLOSE_TAG : OPEN_TAG; + if (couldStartTag(rest, relevant)) { + emit(plain); plain = ""; + res.tagBuffer = rest; + return res; + } + } + plain += input[i]; + i++; + } + emit(plain); + return res; +} + +// Extract the HTTP status appended by curl -w "NEXUS_STATUS:%{http_code}". +// Returns { status, body } — status 0 when the marker is absent. + +function extractHttpStatus(text) { + var out = { status: 0, body: text || "" }; + if (!text) return out; + var marker = "NEXUS_STATUS:"; + var idx = text.lastIndexOf(marker); + if (idx < 0) return out; + var tail = text.substring(idx + marker.length).trim(); + var status = parseInt(tail, 10); + if (isNaN(status)) return out; + out.status = status; + out.body = text.substring(0, idx); + if (out.body.length > 0 && out.body[out.body.length - 1] === "\n") + out.body = out.body.substring(0, out.body.length - 1); + return out; +} + +// Pull assistant text out of a non-streaming completion response +// (used when a "streaming" endpoint answers with a single JSON body). + +function extractNonStreamingText(body, format) { + if (format === "anthropic") return extractAnthropicText(body); + if (format === "gemini") return extractGeminiText(body); + if (format === "ollama") return extractOllamaText(body); + try { + var obj = JSON.parse(body); + if (obj && obj.choices && obj.choices.length > 0 && obj.choices[0].message) + return typeof obj.choices[0].message.content === "string" + ? obj.choices[0].message.content : ""; + } catch (e) {} + return ""; +} + +function extractAnthropicText(body) { + try { + var obj = JSON.parse(body); + if (obj && Array.isArray(obj.content)) { + var text = ""; + for (var i = 0; i < obj.content.length; i++) + if (obj.content[i] && typeof obj.content[i].text === "string") + text += obj.content[i].text; + return text; + } + } catch (e) {} + return ""; +} + +function extractOllamaText(body) { + try { + var obj = JSON.parse(body); + if (obj && obj.message && typeof obj.message.content === "string") + return obj.message.content; + } catch (e) {} + return ""; +} + +function extractGeminiText(body) { + try { + var obj = JSON.parse(body); + var parts = (obj && obj.candidates && obj.candidates.length > 0 && + obj.candidates[0].content && obj.candidates[0].content.parts) || []; + var text = ""; + for (var i = 0; i < parts.length; i++) + if (parts[i] && typeof parts[i].text === "string" && + parts[i].thought !== true) text += parts[i].text; + return text; + } catch (e) {} + return ""; +} diff --git a/src/lib/SyntaxHighlight.js b/src/lib/SyntaxHighlight.js new file mode 100644 index 0000000..d88ba1f --- /dev/null +++ b/src/lib/SyntaxHighlight.js @@ -0,0 +1,70 @@ +.pragma library + +// Tiny multi-language syntax highlighter producing Qt rich-text spans. +// Tokenizes raw code, escapes each chunk, wraps matches in color spans. + +var KEYWORDS = { + js: "const let var function return if else for while do switch case break continue new class extends import from export default try catch finally throw typeof instanceof in of await async yield null undefined true false this super static get set", + ts: "const let var function return if else for while do switch case break continue new class extends implements interface type enum import from export default try catch finally throw typeof instanceof in of await async yield null undefined true false this super static readonly public private protected as", + python: "def return if elif else for while break continue class import from as pass raise try except finally with lambda global nonlocal yield assert del in is not and or None True False self async await match case", + bash: "if then else elif fi for while do done case esac function return in local export readonly declare unset shift source alias echo exit read cd set trap", + json: "true false null", + c: "if else for while do switch case break continue return struct enum union typedef static const void int char float double long short unsigned signed sizeof goto extern inline volatile default", + cpp: "if else for while do switch case break continue return struct enum union typedef static const void int char float double long short unsigned signed sizeof goto extern inline virtual override public private protected class new delete template typename namespace using try catch throw nullptr true false auto constexpr", + rust: "fn let mut const if else match for while loop break continue return struct enum impl trait pub use mod crate self super where async await move ref static type unsafe dyn true false Some None Ok Err", + go: "func var const if else for range switch case break continue return struct interface map chan go defer select package import type nil true false" +}; + +var ALIAS = { javascript: "js", jsx: "js", tsx: "ts", typescript: "ts", + py: "python", python3: "python", sh: "bash", shell: "bash", + zsh: "bash", console: "bash", "c++": "cpp", "c++11": "cpp", + golang: "go", rs: "rust" }; + +function esc(s) { + return s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); +} + +function span(color, text) { + if (!color) return esc(text); + return '' + esc(text) + ""; +} + +// One combined regex pass, longest-priority tokens first. +function highlightCode(code, lang, palette) { + if (typeof code !== "string") return ""; + code = code.replace(/[\x00\x01]/g, ""); + palette = palette || {}; + var l = ALIAS[lang] || lang; + var keywords = KEYWORDS[l]; + + if (!keywords) { + // Known structural languages with no keyword set, or unknown: + // highlight nothing but escape everything. + return esc(code); + } + + var re = new RegExp( + "(\\/\\*[\\s\\S]*?\\*\\/|\\/\\/[^\\n]*|#[^\\n]*)" + // 1 comments (//, /* */, #) + "|(\"(?:\\\\.|[^\"\\\\\\n])*\"|'(?:\\\\.|[^'\\\\\\n])*'|`(?:\\\\.|[^`\\\\])*`)" + // 2 strings + "|\\b(\\d+(?:\\.\\d+)?)\\b" + // 3 numbers + "|\\b(" + keywords.trim().split(/\s+/).join("|") + ")\\b" + // 4 keywords + "|\\b([A-Za-z_][A-Za-z0-9_]*)(?=\\s*\\()", // 5 function calls + "g" + ); + + var out = ""; + var last = 0; + var m; + while ((m = re.exec(code)) !== null) { + out += esc(code.substring(last, m.index)); + if (m[1] !== undefined) out += span(palette.comment, m[1]); + else if (m[2] !== undefined) out += span(palette.string, m[2]); + else if (m[3] !== undefined) out += span(palette.number, m[3]); + else if (m[4] !== undefined) out += span(palette.keyword, m[4]); + else if (m[5] !== undefined) out += span(palette["function"], m[5]); + last = m.index + m[0].length; + } + out += esc(code.substring(last)); + return out; +} diff --git a/src/lib/WebTools.js b/src/lib/WebTools.js new file mode 100644 index 0000000..292b98d --- /dev/null +++ b/src/lib/WebTools.js @@ -0,0 +1,350 @@ +.pragma library + +// Native (built-in) chat tools: web_search + webfetch. Pure JS; +// NativeToolsService.qml is the transport. Never log with nested +// parens — the test harness strips console.* naively. + +// Append trailer for `curl -w` so the collected stdout carries the HTTP +// status (and content type) after the body. Same convention as the +// provider fetchers' NEXUS_STATUS trailer; extractHttpStatus splits it. +var STATUS_TRAILER = "\\nNEXUS_STATUS:%{http_code}|%{content_type}\\n"; + +var MAX_SEARCH_RESULTS = 8; +var MAX_QUERY_LENGTH = 400; +// webfetch returns at most FETCH_CHUNK characters per call; the model +// pages through long content with start_index. +var FETCH_CHUNK = 16000; +// Guard before any regex work on untrusted bodies (perf). +var MAX_BODY_BYTES = 2 * 1024 * 1024; +// Pinned empirically: DDG captcha-challenges modern/curl-ish UAs; +// this string passes. Regression test guards it — don't "modernize". +var USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"; + +function isNativeTool(name) { + return name === "web_search" || name === "webfetch"; +} + +// Tool defs for chat requests. `enabledNames` (optional array) keeps +// only those tools; absent/null → the full registry. +function toolDefs(enabledNames) { + var all = [ + { + type: "function", + function: { + name: "web_search", + description: "Search the web via DuckDuckGo. Returns " + + "numbered results with title, URL and snippet.", + parameters: { + type: "object", + properties: { + query: { type: "string", description: "Search query" } + }, + required: ["query"] + } + } + }, + { + type: "function", + function: { + name: "webfetch", + description: "Fetch a URL (http/https) and return its " + + "readable text content.", + parameters: { + type: "object", + properties: { + url: { type: "string", description: "The URL to fetch" }, + start_index: { + type: "integer", + description: "Optional character offset to " + + "continue reading a long page (from the " + + "truncation marker of the previous call)" + } + }, + required: ["url"] + } + } + } + ]; + if (!enabledNames) return all; + return all.filter(function (d) { + return enabledNames.indexOf(d.function.name) >= 0; + }); +} + +// Escape a value for a double-quoted curl config directive. Local copy +// of Providers.escapeCurlConfig — this lib must stay import-free for +// the node test harness. +function escapeCurlConfig(s) { + if (typeof s !== "string") return ""; + return s.replace(/\\/g, "\\\\") + .replace(/"/g, '\\"') + .replace(/\n/g, "\\n") + .replace(/\r/g, "\\r") + .replace(/\t/g, "\\t"); +} + +// Validate + normalize native-tool arguments. Returns +// {ok:true, args:{…}} or {ok:false, error:"…"}. webfetch allows any +// http/https URL — no private-range filtering (deliberate). +function validateArgs(name, args) { + args = args || {}; + if (name === "web_search") { + var q = typeof args.query === "string" ? args.query.trim() : ""; + if (!q) return { ok: false, error: "Missing required argument: query" }; + if (q.length > MAX_QUERY_LENGTH) q = q.substring(0, MAX_QUERY_LENGTH); + return { ok: true, args: { query: q } }; + } + if (name === "webfetch") { + var u = typeof args.url === "string" ? args.url.trim() : ""; + if (!u) return { ok: false, error: "Missing required argument: url" }; + if (!/^https?:\/\//i.test(u)) + return { ok: false, + error: "Unsupported URL scheme — only http and https are allowed" }; + var s = 0; + if (typeof args.start_index === "number" + && isFinite(args.start_index)) + s = Math.max(0, Math.floor(args.start_index)); + else if (typeof args.start_index === "string" + && args.start_index.trim() !== "" + && isFinite(parseInt(args.start_index, 10))) + s = Math.max(0, parseInt(args.start_index, 10)); + return { ok: true, args: { url: u, start_index: s } }; + } + return { ok: false, error: "Unknown native tool: " + String(name) }; +} + +// Split the STATUS_TRAILER off collected curl stdout. +function extractHttpStatus(text) { + var out = { status: 0, contentType: "", body: text || "" }; + if (!text) return out; + var marker = "NEXUS_STATUS:"; + var idx = text.lastIndexOf(marker); + if (idx < 0) return out; + var tail = text.substring(idx + marker.length).trim(); + var pipe = tail.indexOf("|"); + var statusPart = pipe >= 0 ? tail.substring(0, pipe) : tail; + if (pipe >= 0) out.contentType = tail.substring(pipe + 1).trim().toLowerCase(); + var status = parseInt(statusPart, 10); + if (isNaN(status)) return out; + out.status = status; + out.body = text.substring(0, idx); + if (out.body.length > 0 && out.body[out.body.length - 1] === "\n") + out.body = out.body.substring(0, out.body.length - 1); + return out; +} + +function _baseCmd(maxTime) { + return ["curl", "-K", "-", "-sS", "--show-error", + "--connect-timeout", "5", "--max-time", String(maxTime), + "-w", STATUS_TRAILER]; +} + +// curl argv + stdin config for a search POST to the DuckDuckGo HTML +// endpoint. encodeURIComponent output never contains ", \ or newlines, +// so the data directive needs no further escaping. +function buildSearchRequest(args) { + var v = validateArgs("web_search", args); + if (!v.ok) return v; + var config = 'url = "https://html.duckduckgo.com/html/"\n' + + 'user-agent = "' + USER_AGENT + '"\n' + + 'data = "q=' + encodeURIComponent(v.args.query) + '"\n'; + return { ok: true, cmd: _baseCmd(15), config: config, args: v.args }; +} + +// curl argv + stdin config for a page fetch. Model-provided URLs are +// config-escaped (they may contain quotes/newlines). +function buildFetchRequest(args) { + var v = validateArgs("webfetch", args); + if (!v.ok) return v; + var config = 'url = "' + escapeCurlConfig(v.args.url) + '"\n' + + 'user-agent = "' + USER_AGENT + '"\n' + + 'location\n'; + return { ok: true, cmd: _baseCmd(20), config: config, args: v.args }; +} + +// ── Text helpers (shared with htmlToText) ──────────────────────── + +function _fromCodePoint(c) { + if (String.fromCodePoint) return String.fromCodePoint(c); + if (c <= 0xffff) return String.fromCharCode(c); + c -= 0x10000; + return String.fromCharCode(0xd800 + (c >> 10), 0xdc00 + (c & 0x3ff)); +} + +var NAMED_ENTITIES = { + amp: "&", lt: "<", gt: ">", quot: "\"", apos: "'", nbsp: " ", + hellip: "…", mdash: "—", ndash: "–", + lsquo: "\u2018", rsquo: "\u2019", ldquo: "\u201C", rdquo: "\u201D", + copy: "©", reg: "®", trade: "™", laquo: "«", raquo: "»", + middot: "·", bull: "•", sect: "§", para: "¶", deg: "°", + plusmn: "±", times: "×", divide: "÷", micro: "µ", euro: "€", + pound: "£", yen: "¥", cent: "¢", + eacute: "é", egrave: "è", agrave: "à", ccedil: "ç", uuml: "ü", + ouml: "ö", auml: "ä", szlig: "ß" +}; + +function decodeEntities(s) { + return String(s || "") + .replace(/&#x([0-9a-fA-F]+);/g, function (m, h) { + var c = parseInt(h, 16); + return isFinite(c) && c > 0 && c <= 0x10ffff ? _fromCodePoint(c) : m; + }) + .replace(/&#(\d+);/g, function (m, d) { + var c = parseInt(d, 10); + return isFinite(c) && c > 0 && c <= 0x10ffff ? _fromCodePoint(c) : m; + }) + .replace(/&([a-zA-Z][a-zA-Z0-9]*);/g, function (m, name) { + return Object.prototype.hasOwnProperty.call(NAMED_ENTITIES, name) + ? NAMED_ENTITIES[name] : m; + }); +} + +function _stripTags(s) { + return String(s || "").replace(/<[^>]*>/g, " "); +} + +// Tags off, entities decoded, all whitespace runs collapsed. +function collapse(s) { + return decodeEntities(_stripTags(s)).replace(/\s+/g, " ").trim(); +} + +// ── DuckDuckGo HTML search parsing ─────────────────────────────── + +// Collect tags carrying exactly `className` in their class list +// (word match, so result__a never matches result__ad). Returns +// [{href, inner}] in document order. +function _collectAnchors(html, className) { + var out = []; + var re = /]*)>([\s\S]*?)<\/a>/g; + var m; + while ((m = re.exec(html)) !== null) { + var attrs = m[1]; + if (attrs.indexOf(className) < 0) continue; + var cm = /\bclass\s*=\s*"([^"]*)"/.exec(attrs) + || /\bclass\s*=\s*'([^']*)'/.exec(attrs); + if (!cm) continue; + if (cm[1].split(/\s+/).indexOf(className) < 0) continue; + var hm = /\bhref\s*=\s*"([^"]*)"/.exec(attrs) + || /\bhref\s*=\s*'([^']*)'/.exec(attrs); + out.push({ href: hm ? hm[1] : "", inner: m[2] }); + } + return out; +} + +// DDG wraps result hrefs in a redirect: //duckduckgo.com/l/?uddg=&rut=… +// Direct http(s) hrefs pass through; anything else → "". +function _resolveHref(href) { + if (!href) return ""; + var abs = href.charAt(0) === "/" && href.charAt(1) === "/" + ? "https:" + href : href; + var uddg = /[?&]uddg=([^&]+)/.exec(abs); + if (uddg) { + try { return decodeURIComponent(uddg[1]); } catch (e) { return ""; } + } + return /^https?:\/\//i.test(abs) ? abs : ""; +} + +function parseSearchResults(html) { + if (typeof html !== "string" || html.length === 0) + return { ok: false, error: "Empty response from DuckDuckGo." }; + + // Sponsored blocks are removed before collection so their anchors + // never appear as results. Lazy two-close-div match: best-effort by + // design — if a mutated layout defeats it, an occasional sponsored + // result may surface (cosmetic, titles/urls still correct). + var clean = html.replace( + /]*result--ad[^>]*>[\s\S]*?<\/div>\s*<\/div>/g, ""); + + var anchors = _collectAnchors(clean, "result__a"); + if (anchors.length === 0) { + // Only consult block-page markers when there are no results at + // all — "anomaly" inside a snippet must not false-positive. + var lower = clean.toLowerCase(); + if (lower.indexOf("anomaly") >= 0 + || lower.indexOf("unfortunately, bots") >= 0 + || lower.indexOf("captcha") >= 0) + return { ok: false, + error: "DuckDuckGo blocked this search — try again shortly." }; + return { ok: true, results: [] }; + } + + var snippets = _collectAnchors(clean, "result__snippet"); + var results = []; + var seen = {}; + for (var i = 0; i < anchors.length && results.length < MAX_SEARCH_RESULTS; i++) { + var url = _resolveHref(anchors[i].href); + var title = collapse(anchors[i].inner); + if (!url || !title || seen[url]) continue; + seen[url] = true; + results.push({ + title: title, + url: url, + snippet: snippets[i] ? collapse(snippets[i].inner) : "" + }); + } + return { ok: true, results: results }; +} + +// True when the body should go through HTML extraction: an explicit +// html content-type wins; with no type, sniff a leading tag. +function isHtmlContent(contentType, body) { + if (contentType) return contentType.indexOf("html") >= 0; + return /^\s*]*>([\s\S]*?)<\/title>/i.exec(html); + var title = tm ? collapse(tm[1]) : ""; + if (html.length > MAX_BODY_BYTES) html = html.substring(0, MAX_BODY_BYTES); + var s = html + .replace(//g, " ") + .replace(/<(script|style|noscript|svg|head)\b[^>]*>[\s\S]*?<\/\1>/gi, " ") + .replace(//gi, "\n") + .replace(/<\/(p|div|li|h[1-6]|tr|blockquote|pre|section|article|header|footer|table|ul|ol|dl|dt|dd)>/gi, "\n") + .replace(/<[^>]*>/g, " "); + s = decodeEntities(s); + s = s.replace(/[ \t]+/g, " "); + s = s.replace(/ ?\n ?/g, "\n"); + s = s.replace(/\n{3,}/g, "\n\n").trim(); + return { title: title, text: s }; +} + +// Numbered plain-text listing the model reads. Zero results is a +// normal outcome, not an error. +function formatSearchResults(results, query) { + if (!results || results.length === 0) + return "No results found for \"" + String(query || "") + "\"."; + var lines = []; + for (var i = 0; i < results.length; i++) { + var r = results[i]; + lines.push((i + 1) + ". " + r.title + "\n " + r.url + + (r.snippet ? "\n " + r.snippet : "")); + } + return lines.join("\n"); +} + +// Final webfetch body: optional title header + a FETCH_CHUNK slice of +// content starting at startIndex, with a continuation marker when cut. +// Header/offsets are independent: the marker counts characters of the +// content itself so start_index paging is header-agnostic. +function pageContent(text, startIndex, title) { + text = String(text || ""); + var start = typeof startIndex === "number" + && isFinite(startIndex) && startIndex > 0 ? Math.floor(startIndex) : 0; + if (start >= text.length) + return "[start_index " + start + " is beyond the end of the " + + "content (length " + text.length + ").]"; + var slice = text.substring(start, start + FETCH_CHUNK); + var end = start + slice.length; + var body = (title ? "# " + title + "\n\n" : "") + slice; + if (end < text.length) + body += "\n\n[Truncated at character " + end + " of " + + text.length + " — call webfetch again with start_index=" + + end + " to continue.]"; + return body; +} diff --git a/src/services/KeyringService.qml b/src/services/KeyringService.qml new file mode 100644 index 0000000..2258fab --- /dev/null +++ b/src/services/KeyringService.qml @@ -0,0 +1,159 @@ +import QtQuick +import Quickshell.Io +import "../lib/Providers.js" as Providers + +// Per-instance API keys in the system keyring via secret-tool. One +// item per provider instance id; secrets never touch argv. The +// in-memory keys map mirrors the keyring for the session; without +// secret-tool, lookups are "" and store/clear are no-ops (env vars +// remain the fallback). +Item { + id: root + + // secret-tool presence, checked once at startup. + property bool available: false + // account id → key, mirrored from keyring lookups + local stores. + property var keys: ({}) + + // --- Lookup queue (one secret-tool run at a time) --- + property var _lookupQueue: [] // [accountId] + property string _currentLookupId: "" + + // --- Mutation queue (store + clear jobs, sequential) --- + property var _mutationQueue: [] // [{op: "store"|"clear", account, secret?}] + property var _activeMutation: null + + // Fired when a secret-tool store failed; the optimistic in-memory + // entry has already been rolled back when this fires. + signal keyStoreFailed(string account) + + Component.onCompleted: availabilityCheck.running = true + + // ── Public API ──────────────────────────────────────────────── + + // Queue a keyring lookup for one account id. Idempotent — ids + // already queued or in flight are skipped. No-op when unavailable. + function lookupKey(account) { + if (!available) return; + var id = String(account || ""); + if (id.length === 0 || _isLookupQueued(id)) return; + _lookupQueue.push(id); + _pumpLookup(); + } + + // Store a key for an account. Optimistic map update, rolled back + // if secret-tool fails. No-op when unavailable. + function storeKey(account, secret) { + if (!available) return; + var id = String(account || ""); + var safe = Providers.sanitizeApiKey(secret); + if (id.length === 0 || !safe) return; + _setKey(id, safe); + _mutationQueue.push({ op: "store", account: id, secret: safe }); + _pumpMutations(); + } + + // Remove an account's key from the keyring; the map entry drops + // immediately. No-op when unavailable. + function clearKey(account) { + if (!available) return; + var id = String(account || ""); + if (id.length === 0) return; + _setKey(id, ""); + _mutationQueue.push({ op: "clear", account: id }); + _pumpMutations(); + } + + // ── Internal ────────────────────────────────────────────────── + + // Reassign (new object) so var-property bindings re-evaluate. + // Passing "" deletes the entry. + function _setKey(account, key) { + var m = {}; + for (var k in keys) m[k] = keys[k]; + if (key) m[account] = key; + else delete m[account]; + keys = m; + } + + function _isLookupQueued(account) { + if (lookupProc.running && _currentLookupId === account) return true; + return _lookupQueue.indexOf(account) >= 0; + } + + function _pumpLookup() { + if (lookupProc.running || _lookupQueue.length === 0) return; + _currentLookupId = _lookupQueue.shift(); + lookupProc.command = ["secret-tool", "lookup", + "service", "nexus", "provider", _currentLookupId]; + lookupProc.running = true; + } + + function _pumpMutations() { + if (mutationProc.running || _mutationQueue.length === 0) return; + _activeMutation = _mutationQueue.shift(); + // Only stores open stdin (the secret rides in on it); clears + // take attributes from argv alone. + mutationProc.stdinEnabled = (_activeMutation.op === "store"); + mutationProc.command = _activeMutation.op === "store" + ? ["secret-tool", "store", "--label=Nexus AI — " + _activeMutation.account, + "service", "nexus", "provider", _activeMutation.account] + : ["secret-tool", "clear", "service", "nexus", "provider", _activeMutation.account]; + mutationProc.running = true; + } + + // ── Processes ───────────────────────────────────────────────── + + // libsecret's secret-tool has no --version flag; presence is all + // we need, so probe via which (exit 0 = available). + Process { + id: availabilityCheck + running: false + command: ["which", "secret-tool"] + onExited: exitCode => { root.available = (exitCode === 0); } + } + + // streamFinished has no params and fires before onExited — + // attribute via _currentLookupId. + Process { + id: lookupProc + running: false + stdout: StdioCollector { + id: lookupOut + onStreamFinished: { + var cur = root._currentLookupId; + if (!cur) return; + var secret = Providers.sanitizeApiKey(lookupOut.text); + if (secret.length > 0) root._setKey(cur, secret); + } + } + onExited: { + root._currentLookupId = ""; + root._pumpLookup(); + } + } + + Process { + id: mutationProc + running: false + stdinEnabled: false + + onRunningChanged: { + if (running && root._activeMutation + && root._activeMutation.op === "store") { + mutationProc.write(root._activeMutation.secret); + mutationProc.stdinEnabled = false; + } + } + + onExited: exitCode => { + var job = root._activeMutation; + root._activeMutation = null; + if (job && job.op === "store" && exitCode !== 0) { + root._setKey(job.account, ""); // roll back optimistic store + root.keyStoreFailed(job.account); + } + root._pumpMutations(); + } + } +} diff --git a/src/services/MCPService.qml b/src/services/MCPService.qml new file mode 100644 index 0000000..863598c --- /dev/null +++ b/src/services/MCPService.qml @@ -0,0 +1,341 @@ +import QtQuick +import Quickshell +import Quickshell.Io + +// MCP client: JSON-RPC over stdio to `mcp-remote` (which bridges a +// remote MCP server). Start → initialize → tools/list → connected; +// requests correlated by id; non-JSON stdout lines are status noise. +Item { + id: root + + // --- Configuration --- + property string mcpUrl: "" + property string mcpToken: "" + + // --- State --- + property bool isConnected: false + property bool connecting: false + property string connectionError: "" + property var tools: [] // tool objects from tools/list + property int _nextId: 1 + property var _pendingRequests: ({}) // id → { resolve, reject } + property string _readBuffer: "" + property bool _initialized: false + + // Result delivery callbacks (set by NexusService); called + // directly from resolve()/reject() — signal-to-signal connects + // proved unreliable here. + property var onToolResult: null + property var onToolFailure: null + + // --- Signals --- + signal toolCallCompleted(var callId, string result) + signal toolCallFailed(var callId, string error) + signal mcpToolsUpdated() + signal mcpConnectionStateChanged() + + // --- Public API --- + + function connectToServer() { + console.warn("NEXUS_MCP: connect requested — url:", mcpUrl, + "token len:", mcpToken.length, "enabled-guard pass"); + if (connecting || isConnected) { + console.warn("NEXUS_MCP: ignored — connecting:", connecting, "connected:", isConnected); + return; + } + if (!mcpUrl || !mcpToken) { + connectionError = "MCP URL and token are required."; + console.warn("NEXUS_MCP: missing url/token — url len:", mcpUrl.length); + return; + } + connectionError = ""; + connecting = true; + _initialized = false; + _readBuffer = ""; + _pendingRequests = ({}); + _nextId = 1; + tools = []; + // Kill leftovers from a previous session/attempt first — + // mcp-remote spawns children that survive a plain SIGTERM to + // npx and keep the pipes/port busy. The real start is delayed + // so the kill lands first. + _killStragglers(); + connectDelay.restart(); + mcpConnectionStateChanged(); + } + + function disconnectFromServer() { + if (mcpProcess.running) + mcpProcess.running = false; + _killStragglers(); + _reset(); + } + + function reconnectToServer() { + disconnectFromServer(); + Qt.callLater(connectToServer); + } + + function _startProcess() { + console.warn("NEXUS_MCP: spawning mcp-remote"); + mcpProcess.command = [ + "npx", "-y", "mcp-remote", + mcpUrl, + "--allow-http", + "--header", "Authorization: Bearer " + mcpToken + ]; + mcpProcess.running = true; + } + + // Call a tool by name with arguments. Returns the request id; the + // result arrives via onToolResult / onToolFailure callbacks + // (preferred), or toolCallCompleted / toolCallFailed signals as + // a fallback for any leftover listener. + function callTool(toolName, args) { + var id = _nextId++; + console.warn("NEXUS_MCP_CALL: id=", id, "tool=", toolName); + _pendingRequests[id] = { + resolve: function (result) { + var text = typeof result === "string" + ? result : JSON.stringify(result); + console.warn("NEXUS_MCP_CALL: id=", id, "resolved len=", text.length); + if (root.onToolResult) { + try { root.onToolResult(id, text); } + catch (e) { console.warn("NEXUS_MCP_CALL: onToolResult threw:", e); } + } + root.toolCallCompleted(id, text); + }, + reject: function (err) { + console.warn("NEXUS_MCP_CALL: id=", id, "rejected:", err); + if (root.onToolFailure) { + try { root.onToolFailure(id, err); } + catch (e) { console.warn("NEXUS_MCP_CALL: onToolFailure threw:", e); } + } + root.toolCallFailed(id, err); + } + }; + _sendRequest(id, { + jsonrpc: "2.0", + id: id, + method: "tools/call", + params: { + name: toolName, + arguments: args || {} + } + }); + return id; + } + + // Tools formatted for chat requests (OpenAI tool shape — accepted + // natively by Ollama and converted per format by Providers.js). + function getTools() { + var result = []; + for (var i = 0; i < tools.length; i++) { + var t = tools[i]; + result.push({ + type: "function", + function: { + name: t.name, + description: t.description || "", + parameters: t.inputSchema || { type: "object", properties: {} } + } + }); + } + return result; + } + + // --- Internal --- + + function _reset() { + isConnected = false; + connecting = false; + _initialized = false; + _readBuffer = ""; + _pendingRequests = ({}); + tools = []; + mcpConnectionStateChanged(); + } + + function _sendRequest(id, req) { + mcpProcess.write(JSON.stringify(req) + "\n"); + } + + function _sendNotification(method, params) { + var msg = { jsonrpc: "2.0", method: method }; + if (params) msg.params = params; + mcpProcess.write(JSON.stringify(msg) + "\n"); + } + + function _handleLine(line) { + line = line.trim(); + if (!line) return; + if (line.indexOf("{") !== 0) + console.warn("NEXUS_MCP: non-json line:", line.substring(0, 160)); + + var msg; + try { + msg = JSON.parse(line); + } catch (e) { + // Not JSON — mcp-remote status output, ignore + return; + } + + // Response to one of our requests + if (msg.id !== undefined && msg.id !== null) { + var pending = _pendingRequests[msg.id]; + if (pending) { + delete _pendingRequests[msg.id]; + if (msg.error) + pending.reject(msg.error.message || JSON.stringify(msg.error)); + else + pending.resolve(msg.result); + } + return; + } + + // Server notification + if (msg.method) _handleNotification(msg.method, msg.params); + } + + function _handleNotification(method, params) { + if (method === "notifications/tools/list_changed") _listTools(); + } + + function _sendInitialize() { + console.warn("NEXUS_MCP: sending initialize"); + var id = _nextId++; + _pendingRequests[id] = { + resolve: function (result) { _onInitialized(result); }, + reject: function (err) { + connectionError = "Initialize failed: " + err; + connecting = false; + mcpConnectionStateChanged(); + } + }; + _sendRequest(id, { + jsonrpc: "2.0", + id: id, + method: "initialize", + params: { + protocolVersion: "2024-11-05", + capabilities: { tools: {} }, + clientInfo: { name: "nexus", version: "1.0.0" } + } + }); + } + + function _onInitialized(result) { + _sendNotification("notifications/initialized"); + _initialized = true; + _listTools(); + } + + function _listTools() { + console.warn("NEXUS_MCP: listing tools"); + var id = _nextId++; + _pendingRequests[id] = { + resolve: function (result) { + tools = (result && result.tools) ? result.tools : []; + isConnected = true; + connecting = false; + connectionError = ""; + mcpConnectionStateChanged(); + mcpToolsUpdated(); + }, + reject: function (err) { + connectionError = "Failed to list tools: " + err; + connecting = false; + mcpConnectionStateChanged(); + } + }; + _sendRequest(id, { + jsonrpc: "2.0", + id: id, + method: "tools/list", + params: {} + }); + } + + function _processBuffer() { + var lines = _readBuffer.split("\n"); + // Last element may be incomplete — keep it in the buffer + _readBuffer = lines.pop(); + for (var i = 0; i < lines.length; i++) + _handleLine(lines[i]); + } + + // --- Process --- + + Timer { + id: connectDelay + interval: 350 + onTriggered: root._startProcess() + } + + // Kills mcp-remote children orphaned by an earlier session — + // they hold the stdio pipes and local port otherwise. + Process { + id: stragglerKill + command: ["pkill", "-f", "mcp-remote"] + } + + function _killStragglers() { + console.warn("NEXUS_MCP: killing stragglers"); + stragglerKill.running = true; + } + + Process { + id: mcpProcess + running: false + stdinEnabled: true + + onRunningChanged: { + console.warn("NEXUS_MCP: process running =", running); + // StdioCollector.text accumulates across runs — re-arm the + // read cursor or run 2's output is invisible. + mcpStdout.lastLen = 0; + mcpStderr.lastLen = 0; + if (running) { + // Send initialize once the process starts + Qt.callLater(root._sendInitialize); + } else if (root.isConnected || root.connecting) { + root.connectionError = "MCP process exited unexpectedly."; + root._reset(); + } + } + + stderr: StdioCollector { + id: mcpStderr + waitForEnd: false + property int lastLen: 0 + onTextChanged: { + var fresh = text.substring(lastLen); + lastLen = text.length; + var t = fresh.trim(); + if (t.length > 0) console.warn("NEXUS_MCP_STDERR:", t.substring(0, 300)); + } + } + + stdout: StdioCollector { + id: mcpStdout + waitForEnd: false + property int lastLen: 0 + + onTextChanged: { + // Defensive: a shorter text means the collector reset + if (lastLen > text.length) lastLen = 0; + var fresh = text.substring(lastLen); + lastLen = text.length; + root._readBuffer += fresh; + root._processBuffer(); + } + } + + onExited: exitCode => { + console.warn("NEXUS_MCP: process exited, code:", exitCode); + if (exitCode !== 0 && (root.isConnected || root.connecting)) + root.connectionError = "MCP process exited with code " + exitCode + "."; + root._reset(); + } + } +} diff --git a/src/services/NativeToolsService.qml b/src/services/NativeToolsService.qml new file mode 100644 index 0000000..61fbfb1 --- /dev/null +++ b/src/services/NativeToolsService.qml @@ -0,0 +1,168 @@ +import QtQuick +import Quickshell.Io +import "../lib/WebTools.js" as WebTools +import "../lib/ErrorHints.js" as ErrorHints +import "../lib/Providers.js" as Providers + + // Native chat tools executor (web_search + webfetch): one curl + // process at a time, config via stdin. All validation/parsing + // lives in WebTools.js; this file is transport + delivery only. +Item { + id: root + + // Assigned by NexusService: (callId, modelText) — text the model sees. + property var onResult: null + // Assigned by NexusService: (callId, errorText). + property var onError: null + + property var _queue: [] // {callId, toolName, args} + property bool _busy: false + property int _currentId: -1 + property string _currentTool: "" + property var _currentArgs: null + property string _stdin: "" + readonly property int _maxBytes: 4 * 1024 * 1024 + + function execute(callId, toolName, argsJson) { + _queue.push({ callId: callId, toolName: String(toolName || ""), + args: Providers.parseToolArgs(argsJson) }); + _pump(); + } + + function _pump() { + if (_busy || _queue.length === 0) return; + // Previous curl still dying (async exit): starting now would + // skip the stdin write and hang the job. Queue it; onExited + // drains the queue. + if (fetcher.running) return; + var job = _queue.shift(); + // Claim the id first so even an invalid-args rejection is + // delivered against the right callId. + _currentId = job.callId; + _currentTool = job.toolName; + var req = job.toolName === "web_search" + ? WebTools.buildSearchRequest(job.args) + : WebTools.buildFetchRequest(job.args); + if (!req || !req.ok) { + _deliverError(req && req.error ? req.error : "Unknown native tool"); + return; + } + _busy = true; + _currentArgs = req.args || job.args; + _stdin = req.config; + collector.lastLen = 0; // re-arm: collector text accumulates + fetcher.stdinEnabled = true; // re-arm for every request + fetcher.command = req.cmd; + fetcher.running = true; + } + + function _deliverOk(text) { + var id = _currentId; + _busy = false; + _currentId = -1; + _currentTool = ""; + _currentArgs = null; + if (root.onResult) { + try { root.onResult(id, text); } + catch (e) { console.warn("NEXUS_NATIVE: onResult threw:", e); } + } + _pump(); + } + + function _deliverError(message) { + var id = _currentId; + _busy = false; + _currentId = -1; + _currentTool = ""; + _currentArgs = null; + if (root.onError) { + try { root.onError(id, message); } + catch (e) { console.warn("NEXUS_NATIVE: onError threw:", e); } + } + _pump(); + } + + function _handleFinished(raw) { + var parsed = WebTools.extractHttpStatus(raw); + // status 0 → no trailer: curl failed; onExited attributes it. + if (parsed.status === 0) return; + if (parsed.status >= 400) { + _deliverError("HTTP " + parsed.status + + " — the site returned an error for this request."); + return; + } + var body = parsed.body || ""; + if (_currentTool === "web_search") { + var r = WebTools.parseSearchResults(body); + if (!r.ok) { _deliverError(r.error); return; } + _deliverOk(WebTools.formatSearchResults( + r.results, _currentArgs ? _currentArgs.query : "")); + return; + } + // webfetch + var text; + var title = ""; + if (WebTools.isHtmlContent(parsed.contentType, body)) { + var page = WebTools.htmlToText(body); + text = page.text; + title = page.title; + } else { + text = body; + if (text.length > WebTools.MAX_BODY_BYTES) + text = text.substring(0, WebTools.MAX_BODY_BYTES); + } + _deliverOk(WebTools.pageContent( + text, _currentArgs ? _currentArgs.start_index : 0, title)); + } + + Process { + id: fetcher + running: false + stdinEnabled: true + + onRunningChanged: { + if (running && root._stdin) { + fetcher.write(root._stdin); + fetcher.stdinEnabled = false; + root._stdin = ""; + } + } + + stdout: StdioCollector { + id: collector + waitForEnd: false + property int lastLen: 0 + + onTextChanged: { + if (text.length > root._maxBytes) { + fetcher.running = false; + if (root._busy) + root._deliverError( + "Response exceeded the 4 MB download cap."); + return; + } + } + + onStreamFinished: { + // No params — must read collector.text by id. + root._handleFinished(collector.text); + } + } + + onExited: (exitCode, exitStatus) => { + // onStreamFinished ran first; a still-busy state here means + // it deliberately deferred (status 0) for this handler. + if (root._busy) { + var msg = exitCode !== 0 + ? "Connection failed (curl exit " + exitCode + ")" + : "No response received."; + var hint = exitCode !== 0 + ? ErrorHints.curlExitHint(exitCode) : ""; + if (hint) msg += "\n" + hint; + root._deliverError(msg); + } + // Old process fully dead — safe to start the next job. + root._pump(); + } + } +} diff --git a/src/services/NexusService.qml b/src/services/NexusService.qml new file mode 100644 index 0000000..8c6a489 --- /dev/null +++ b/src/services/NexusService.qml @@ -0,0 +1,1967 @@ +import QtQuick +import Quickshell +import Quickshell.Io +import qs.Services +import "../lib/Providers.js" as Providers +import "../lib/StreamParser.js" as StreamParser +import "../lib/ErrorHints.js" as ErrorHints +import "../lib/ModelIcons.js" as ModelIcons +import "../lib/PromptPresets.js" as PromptPresets +import "../lib/McpTools.js" as McpTools +import "../lib/WebTools.js" as WebTools +import "../lib/ContextWindows.js" as ContextWindows + +Item { + id: root + + property string pluginId: "nexusAI" + + // ── Conversation state ──────────────────────────────────────── + + property ListModel messagesModel: ListModel {} + readonly property int messageCount: messagesModel.count + property int _idCounter: 0 + property alias isStreaming: streaming.isStreaming + + // ── Multi-provider state ────────────────────────────────────── + // Instances are records {id, type, name, baseUrl, checkedModels[], + // envVar?, discovered[]}; keys live in sessionKeys (keyring-fed, + // memory only). + + property var providers: [] // persisted as JSON "providers" + property string activeProviderId: "" // persisted + property string activeModel: "" // persisted + // Model/provider switches invalidate the meter window (probe and + // registry lookups are per model). + onActiveProviderIdChanged: { + ollamaContextLength = 0; + _recalcContextWindow(); + } + onActiveModelChanged: { + ollamaContextLength = 0; + _recalcContextWindow(); + } + property var pinnedModels: [] // persisted as JSON "pinnedModels"; items {providerId, model} + property var sessionKeys: ({}) // per-instance keys, memory only, never persisted here + // Per-instance keyring store failures (account → message); absent + // means no failure. Cleared on the next setInstanceKey attempt. + property var keyMessages: ({}) + property int _providerCounter: 0 + + // ── Multi-MCP-server state ──────────────────────────────────── + // One instance per server {id, name, url, enabled, discovered[], + // enabledTools[]}; token in the keyring under account "m". + property var mcpServers: [] // persisted as JSON "mcpServers" + property int _mcpCounter: 0 + // Per-server session tokens (memory; keyring is the durable store). + property var mcpSessionTokens: ({}) + // Per-server token store failures. + property var mcpKeyMessages: ({}) + // Per-server connection errors from the MCPService instances. + property var mcpConnectionErrors: ({}) + // Per-server connection state (boolean mirror of mcpService.isConnected + // — QML bindings against per-instance Item properties don't notify + // reliably from a Repeater's model scope). + property var mcpConnected: ({}) + + readonly property var activeInstance: getProvider(activeProviderId) + readonly property string activeFormat: Providers.formatOf(activeInstance) + readonly property bool activeIsOllama: !!activeInstance && activeInstance.type === "ollama" + readonly property bool keyringAvailable: keyring.available + + // ── Generation settings (shared across all providers) ───────── + // use* flag off → param omitted from the request. + property bool useTemperature: false + property real temperature: 0.7 + property bool useMaxTokens: false + property int maxTokens: 4096 + property bool useContextWindow: false + onUseContextWindowChanged: _recalcContextWindow() + property int numCtx: 8192 + onNumCtxChanged: _recalcContextWindow() + property string systemPrompt: "" + property int timeoutSeconds: 300 + property string panelEdge: "right" + + // ── Context meter ───────────────────────────────────────────── + // Last response's token usage ({input, output}); reset on + // clearChat. + property var lastUsage: null + // Context window in tokens; 0 unknown. Ollama: numCtx setting or + // /api/ps context_length; others: models.dev snapshot lookup. + property int contextWindow: 0 + // Slimmed models.dev snapshot: {providerKey: {modelId: window}}. + property var registryMap: ({}) + property real registryFetchedAt: 0 + // Loaded ollama runner context (/api/ps); 0 unknown. + property int ollamaContextLength: 0 + + // Which chord sends from the composer: "none" (bare Enter) | + // "shift" | "ctrl" | "alt". Any other chord inserts a newline. + property string sendModifier: "none" + // MCP tools master switch (composer bar icon). + property bool mcpToolsEnabled: true + + // Native web tools master switch (composer bar icon); opt-in. + property bool webToolsEnabled: false + + // Per-tool switches; gated by the master switch in + // getChatTools / callTool. + property bool webSearchEnabled: true + property bool webFetchEnabled: true + + property bool modelsRefreshing: false + + // Message being edited (memory only); submit regenerates from it. + property string editingMessageId: "" + signal editRequested(string text) + + // Random composer placeholder, re-rolled for every new chat. + property string placeholder: "Ask anything…" + property var _placeholderLines: [] + + // Rotating status phrase shown next to the streaming snake; + // re-rolled every 2 s while a stream is active, using the same + // randomization rules as the composer placeholder. + property string ponderingText: "" + property var _ponderingLines: [] + + // Startup icon-folder scan: each resources/icons/models/.svg + // auto-binds a //i rule (ModelIcons.setAutoIcons), so + // dropping a file into the folder themes its models without any + // code change. + Component.onCompleted: { + _loadSettings(); + iconScan.running = true; + _connectAllEnabledMcpServers(); + } + + Process { + id: iconScan + command: { + // decodeURIComponent: resolvedUrl percent-encodes the + // space in "Nexus AI", and ls would target a nonexistent + // directory. + var dir = decodeURIComponent( + Qt.resolvedUrl("../../resources/icons/models").toString().replace("file://", "")); + return ["sh", "-c", "ls -1 '" + dir + "' | grep '\\.svg$' | sed 's/\\.svg$//'"]; + } + stdout: StdioCollector { + onStreamFinished: { + var stems = text.split("\n").map(function (x) { return x.trim(); }) + .filter(function (x) { return x.length > 0; }); + ModelIcons.setAutoIcons(stems); + root.modelIconStems = stems; + } + } + } + + // ── Settings persistence ────────────────────────────────────── + + function saveSetting(key, value) { + PluginService.savePluginData(pluginId, key, value); + } + + function _loadSettings() { + temperature = PluginService.loadPluginData(pluginId, "temperature", 0.7); + maxTokens = PluginService.loadPluginData(pluginId, "maxTokens", 4096); + numCtx = PluginService.loadPluginData(pluginId, "numCtx", 8192); + useTemperature = PluginService.loadPluginData(pluginId, "useTemperature", false); + useMaxTokens = PluginService.loadPluginData(pluginId, "useMaxTokens", false); + useContextWindow = PluginService.loadPluginData(pluginId, "useContextWindow", false); + // Context meter: cached slim models.dev snapshot + fetch age. + try { + registryMap = JSON.parse(String(PluginService.loadPluginData( + pluginId, "contextWindows", "{}"))); + } catch (e) { registryMap = {}; } + registryFetchedAt = Number(PluginService.loadPluginData( + pluginId, "contextWindowsFetchedAt", 0)) || 0; + fetchContextRegistry(false); + // Fresh install (no stored prompt): start on the default + // Serious personality and persist it. + var storedPrompt = PluginService.loadPluginData(pluginId, "systemPrompt", "__missing__"); + if (storedPrompt === "__missing__") { + systemPrompt = PromptPresets.textFor("serious"); + saveSetting("systemPrompt", systemPrompt); + } else { + systemPrompt = String(storedPrompt); + } + timeoutSeconds = PluginService.loadPluginData(pluginId, "timeoutSeconds", 300); + panelEdge = String(PluginService.loadPluginData(pluginId, "panelEdge", "right")); + // Self-heal a stale/foreign stored chord value. + var storedSendModifier = String(PluginService.loadPluginData(pluginId, "sendModifier", "none")); + sendModifier = ["none", "shift", "ctrl", "alt"].indexOf(storedSendModifier) >= 0 + ? storedSendModifier : "none"; + mcpToolsEnabled = PluginService.loadPluginData(pluginId, "mcpToolsEnabled", true) === true; + webToolsEnabled = PluginService.loadPluginData(pluginId, "webToolsEnabled", false) === true; + webSearchEnabled = PluginService.loadPluginData(pluginId, "webSearchEnabled", true) === true; + webFetchEnabled = PluginService.loadPluginData(pluginId, "webFetchEnabled", true) === true; + // Legacy single-server MCP keys → one multi-instance entry. + var legacyMcpUrl = String(PluginService.loadPluginData(pluginId, "mcpUrl", "")).trim(); + var legacyMcpEnabled = PluginService.loadPluginData(pluginId, "mcpEnabled", false) === true; + try { + var praw = PluginService.loadPluginData(pluginId, "providers", "[]"); + var plist = JSON.parse(String(praw)); + if (Array.isArray(plist)) + for (var ni = 0; ni < plist.length; ni++) + if (plist[ni] && plist[ni].enabled === undefined) + plist[ni].enabled = true; + providers = Array.isArray(plist) ? plist : []; + } catch (e) { providers = []; } + try { + var mraw = PluginService.loadPluginData(pluginId, "mcpServers", "[]"); + var mlist = JSON.parse(String(mraw)); + if (!Array.isArray(mlist)) mlist = []; + // Default new fields on older persisted entries; the legacy + // "empty = all" expansion only applies to records persisted + // before the toolSelectionV2 marker (see McpTools). + for (var mi = 0; mi < mlist.length; mi++) + mlist[mi] = McpTools.normalizeLoadedServer(mlist[mi]); + // One-shot legacy migration; the old "mcp" keyring token + // stays put (users re-key per server on first connect). + if (mlist.length === 0 && legacyMcpUrl.length > 0) { + mlist.push({ id: "m1", name: "MCP Server", url: legacyMcpUrl, + enabled: legacyMcpEnabled, discovered: [], + enabledTools: [] }); + } + mcpServers = mlist; + } catch (e) { mcpServers = []; } + activeProviderId = String(PluginService.loadPluginData(pluginId, "activeProviderId", "")); + activeModel = String(PluginService.loadPluginData(pluginId, "activeModel", "")).trim(); + try { + var piraw = PluginService.loadPluginData(pluginId, "pinnedModels", "[]"); + var pilist = JSON.parse(String(piraw)); + var valid = []; + if (Array.isArray(pilist)) { + for (var pi = 0; pi < pilist.length; pi++) { + var rec = pilist[pi]; + if (rec && rec.providerId && rec.model) + valid.push({ providerId: String(rec.providerId), model: String(rec.model) }); + } + } + pinnedModels = valid; + } catch (e) { pinnedModels = []; } + _providerCounter = 0; + for (var i = 0; i < providers.length; i++) { + var m = /^p(\d+)$/.exec(providers[i] ? String(providers[i].id) : ""); + if (m) _providerCounter = Math.max(_providerCounter, parseInt(m[1], 10)); + } + // Self-heal a stale persisted selection (e.g. id from an older dataset). + if (activeProviderId && !getProvider(activeProviderId)) + activeProviderId = providers.length > 0 ? providers[0].id : ""; + _mcpCounter = 0; + var ids = []; + for (var mi2 = 0; mi2 < mcpServers.length; mi2++) { + var srv = mcpServers[mi2]; + if (srv && srv.id) ids.push(String(srv.id)); + var m2 = /^m(\d+)$/.exec(srv ? String(srv.id) : ""); + if (m2) _mcpCounter = Math.max(_mcpCounter, parseInt(m2[1], 10)); + } + _mcpServiceIds = ids; + } + + // ── Provider instances ──────────────────────────────────────── + + function _persistProviders() { + saveSetting("providers", JSON.stringify(providers)); + } + + // Reassign with CLONED instances: only a new object reference + // re-evaluates delegate bindings (rows animate instead of + // rebuilding). + function _touchProviders() { + var clones = []; + for (var i = 0; i < providers.length; i++) + clones.push(providers[i] ? Object.assign({}, providers[i]) : null); + providers = clones; + } + + function getProvider(id) { + for (var i = 0; i < providers.length; i++) + if (providers[i] && providers[i].id === id) return providers[i]; + return null; + } + + function addProvider(type) { + var reg = Providers.REGISTRY[type] || Providers.REGISTRY.custom; + _providerCounter++; + var id = "p" + _providerCounter; + var name = reg.name; + var taken = {}; + for (var i = 0; i < providers.length; i++) + if (providers[i]) taken[providers[i].name] = true; + if (taken[name]) { + var n = 2; + while (taken[name + " " + n]) n++; + name = name + " " + n; + } + providers.push({ id: id, type: String(type), name: name, + baseUrl: reg.baseUrl, checkedModels: [], + enabled: true }); + _touchProviders(); + _persistProviders(); + // Pick up any keyring entry left by an earlier instance that + // reused this id. + keyring.lookupKey(id); + return id; + } + + function removeProvider(id) { + var list = []; + for (var i = 0; i < providers.length; i++) + if (providers[i] && providers[i].id !== id) list.push(providers[i]); + providers = list; + _touchProviders(); + var keys = {}; + for (var k in sessionKeys) if (k !== id) keys[k] = sessionKeys[k]; + sessionKeys = keys; + _setKeyMessage(id, ""); // no stale failure text on id reuse + keyring.clearKey(id); // no-op when the keyring is unavailable + if (activeProviderId === id) { + activeProviderId = list.length > 0 ? list[0].id : ""; + activeModel = ""; + saveSetting("activeProviderId", activeProviderId); + saveSetting("activeModel", ""); + } + _persistProviders(); + } + + function renameProvider(id, name) { + var inst = getProvider(id); + if (!inst) return; + var trimmed = String(name || "").trim(); + if (!trimmed) return; + inst.name = trimmed; + _touchProviders(); + _persistProviders(); + } + + function setProviderUrl(id, url) { + var inst = getProvider(id); + if (!inst) return; + inst.baseUrl = String(url || "").trim(); + _touchProviders(); + _persistProviders(); + } + + // Enable/disable an instance; disabled providers disappear from + // the model picker. Disabling the active one hands the selection + // to the first enabled instance (or clears it). + function setProviderEnabled(id, enabled) { + var inst = getProvider(id); + if (!inst) return; + inst.enabled = !!enabled; + if (!inst.enabled && id === activeProviderId) { + var nextId = ""; + for (var i = 0; i < providers.length; i++) + if (providers[i] && providers[i].id !== id + && providers[i].enabled !== false) { + nextId = providers[i].id; + break; + } + activeProviderId = nextId; + activeModel = ""; + saveSetting("activeProviderId", activeProviderId); + saveSetting("activeModel", ""); + } + _touchProviders(); + _persistProviders(); + } + + // Non-empty key → keyring store (session seeded optimistically — + // storeKey is async, an unseeded sessionKeys would 401 mid-race); + // empty → clear both. Without a keyring: session-only. + function setInstanceKey(id, key) { + var k = Providers.sanitizeApiKey(key); + _setKeyMessage(id, ""); // new attempt — clear any prior failure + if (keyringAvailable) { + if (k) keyring.storeKey(id, k); + else keyring.clearKey(id); + } + _setSessionKey(id, k); + } + + function _setSessionKey(id, k) { + var keys = {}; + for (var kk in sessionKeys) keys[kk] = sessionKeys[kk]; + if (k) keys[id] = k; + else delete keys[id]; + sessionKeys = keys; + } + + // Reassignment pattern, mirroring _setModelsError(). + // Empty msg deletes the entry. + function _setKeyMessage(id, msg) { + var m = {}; + for (var k in keyMessages) m[k] = keyMessages[k]; + if (msg) m[id] = msg; + else delete m[id]; + keyMessages = m; + } + + // Keyring hits land in sessionKeys. Merge, not replace: keys + // typed before the async probe finished must survive. + function _syncFromKeyring() { + var m = {}; + for (var k in sessionKeys) m[k] = sessionKeys[k]; + for (var kk in keyring.keys) + if (keyring.keys[kk]) m[kk] = keyring.keys[kk]; + sessionKeys = m; + } + + function _queueAllKeyLookups() { + for (var i = 0; i < providers.length; i++) + if (providers[i]) keyring.lookupKey(providers[i].id); + } + + function _syncFromKeyringMcp() { + var m = {}; + for (var k in mcpSessionTokens) m[k] = mcpSessionTokens[k]; + for (var kk in keyring.keys) + if (keyring.keys[kk]) m[kk] = keyring.keys[kk]; + mcpSessionTokens = m; + // Keyring values may have just landed for an MCP account; + // push them onto the backing services. + for (var id in m) _pushMcpServerConfig(id); + } + + function _queueAllMcpKeyLookups() { + for (var i = 0; i < mcpServers.length; i++) + if (mcpServers[i]) keyring.lookupKey(mcpServers[i].id); + } + + // "keyring" | "session" | "env:" | "none" — never returns + // the key itself. A sessionKeys value is "keyring" when the + // keyring is available (stores and lookups both route through it) + // and "session" otherwise (memory-only value). + function keyStatus(id) { + var inst = getProvider(id); + if (!inst) return "none"; + if (Providers.sanitizeApiKey(sessionKeys[inst.id] || "")) + return keyringAvailable ? "keyring" : "session"; + var reg = Providers.REGISTRY[inst.type] || {}; + if (reg.envVar && Providers.sanitizeApiKey(Quickshell.env(reg.envVar))) + return "env:" + reg.envVar; + if (inst.type === "custom") { + var dyn = Providers.customEnvVar(String(inst.name || "")); + if (Providers.sanitizeApiKey(Quickshell.env(dyn))) + return "env:" + dyn; + if (inst.envVar && Providers.sanitizeApiKey(Quickshell.env(inst.envVar))) + return "env:" + inst.envVar; + if (Providers.sanitizeApiKey(Quickshell.env("NEXUS_API_KEY"))) + return "env:NEXUS_API_KEY"; + } + return "none"; + } + + // Remove a manually-added custom model: unregisters it, unchecks + // and unpins it, drops its display label, and clears the active + // selection if it was active. + function removeCustomModel(id, modelName) { + var inst = getProvider(id); + if (!inst || !modelName) return; + var clean = String(modelName); + var custom = inst.customModels || []; + var idx = custom.indexOf(clean); + if (idx >= 0) { + custom.splice(idx, 1); + inst.customModels = custom; + } + var checked = inst.checkedModels || []; + var ci = checked.indexOf(clean); + if (ci >= 0) { + checked.splice(ci, 1); + inst.checkedModels = checked; + } + var labels = {}; + for (var k in inst.modelLabels || {}) + if (k !== clean) labels[k] = inst.modelLabels[k]; + inst.modelLabels = labels; + var pins = []; + for (var p = 0; p < pinnedModels.length; p++) { + var rec = pinnedModels[p]; + if (rec.providerId === id && rec.model === clean) continue; + pins.push(rec); + } + if (pins.length !== pinnedModels.length) { + pinnedModels = pins; + saveSetting("pinnedModels", JSON.stringify(pins)); + } + if (id === activeProviderId && activeModel === clean) { + activeModel = ""; + saveSetting("activeModel", ""); + } + _touchProviders(); + _persistProviders(); + } + + // Manually register a model id the discovery endpoint doesn't + // list. Stored on the instance (customModels[]) so refreshes + // can't wipe it, and auto-checked so it's immediately usable. + function addCustomModel(id, modelName) { + var inst = getProvider(id); + if (!inst || !modelName) return; + var clean = String(modelName).trim(); + if (!clean) return; + var discovered = inst.discovered || []; + for (var i = 0; i < discovered.length; i++) + if (discovered[i] && String(discovered[i].id) === clean) return; + var custom = inst.customModels || []; + for (i = 0; i < custom.length; i++) + if (String(custom[i]) === clean) return; + custom.push(clean); + inst.customModels = custom; + var checked = inst.checkedModels || []; + if (checked.indexOf(clean) < 0) { + checked.push(clean); + inst.checkedModels = checked; + } + _touchProviders(); + _persistProviders(); + } + + // Visual-only model rename: display labels live on the instance + // (modelLabels[logicalId] = display). The logical id is what gets + // sent to the API, stored in checkedModels/pins/activeModel. + // Empty label clears the rename. + function setModelLabel(id, modelId, label) { + var inst = getProvider(id); + if (!inst || !modelId) return; + var labels = {}; + for (var k in inst.modelLabels || {}) + labels[k] = String(inst.modelLabels[k]); + var clean = String(label || "").trim(); + if (clean) labels[String(modelId)] = clean; + else delete labels[String(modelId)]; + inst.modelLabels = labels; + _touchProviders(); + _persistProviders(); + } + + // Display name for a model under a provider: the renamed label + // when one exists, otherwise the logical id. + function modelLabel(providerId, modelId) { + var inst = getProvider(providerId); + if (inst && inst.modelLabels && inst.modelLabels[modelId]) + return String(inst.modelLabels[modelId]); + return modelId; + } + + function toggleModel(id, modelName) { + var inst = getProvider(id); + if (!inst || !modelName) return; + var checked = inst.checkedModels || []; + var idx = checked.indexOf(modelName); + if (idx >= 0) { + checked.splice(idx, 1); + // Unchecking the active instance's active model must not + // leave a stale selection behind. + if (id === activeProviderId && activeModel === modelName) { + activeModel = ""; + saveSetting("activeModel", ""); + } + } else { + checked.push(modelName); + } + inst.checkedModels = checked; + _touchProviders(); + _persistProviders(); + } + + // Checked model ids of the active instance. Resolves via ids (not + // the var property) so bindings re-evaluate on _touchProviders(); + // returns a copy so ListView models always reset. + function activeModels() { + var inst = getProvider(activeProviderId); + var checked = inst ? (inst.checkedModels || []) : []; + return checked.slice(); + } + + function setActiveProvider(id) { + if (activeProviderId === id) return; + activeProviderId = String(id || ""); + activeModel = ""; + saveSetting("activeProviderId", activeProviderId); + saveSetting("activeModel", ""); + } + + function setActiveModel(m) { + activeModel = String(m || ""); + saveSetting("activeModel", activeModel); + } + + function isPinned(providerId, model) { + for (var i = 0; i < pinnedModels.length; i++) { + var p = pinnedModels[i]; + if (p && p.providerId === providerId && p.model === model) return true; + } + return false; + } + + // Reassigns pinnedModels (not in-place) so var-property bindings + // re-evaluate, mirroring the _touchProviders() pattern. + function togglePinned(providerId, model) { + if (!providerId || !model) return; + var list = []; + var removed = false; + for (var i = 0; i < pinnedModels.length; i++) { + var p = pinnedModels[i]; + if (p && p.providerId === providerId && p.model === model) { + removed = true; + continue; + } + list.push(p); + } + if (!removed) list.push({ providerId: String(providerId), model: String(model) }); + pinnedModels = list; + saveSetting("pinnedModels", JSON.stringify(pinnedModels)); + } + + // ── MCP server instances ────────────────────────────────────── + + function _persistMcpServers() { + saveSetting("mcpServers", JSON.stringify(mcpServers)); + } + + // Reassign so var-property bindings re-evaluate (mirrors + // _touchProviders; same deep-clone rationale). Each write also + // stamps toolSelectionV2 so the loader trusts an empty + // enabledTools as an intentional "none enabled" selection. + function _touchMcpServers() { + var clones = []; + for (var i = 0; i < mcpServers.length; i++) { + if (!mcpServers[i]) { clones.push(null); continue; } + var clone = Object.assign({}, mcpServers[i]); + clone.toolSelectionV2 = true; + clones.push(clone); + } + mcpServers = clones; + } + + function getMcpServer(id) { + for (var i = 0; i < mcpServers.length; i++) + if (mcpServers[i] && mcpServers[i].id === id) return mcpServers[i]; + return null; + } + + function _nextMcpId() { + _mcpCounter++; + return "m" + _mcpCounter; + } + + function _uniqueMcpName(base) { + var taken = {}; + for (var i = 0; i < mcpServers.length; i++) + if (mcpServers[i]) taken[mcpServers[i].name] = true; + if (!taken[base]) return base; + var n = 2; + while (taken[base + " " + n]) n++; + return base + " " + n; + } + + function addMcpServer() { + var id = _nextMcpId(); + mcpServers.push({ + id: id, + name: _uniqueMcpName("MCP Server"), + url: "", + enabled: true, + discovered: [], + enabledTools: [] + }); + _touchMcpServers(); + _persistMcpServers(); + // Append the new id to the Instantiator model — the + // Instantiator creates a new MCPService Item, which picks + // up url/token from mcpServers[id] on next read. + var ids = _mcpServiceIds.slice(); + ids.push(id); + _mcpServiceIds = ids; + // Pull any keyring entry left over from an instance that + // previously reused this id. + keyring.lookupKey(id); + return id; + } + + function removeMcpServer(id) { + var list = []; + for (var i = 0; i < mcpServers.length; i++) + if (mcpServers[i] && mcpServers[i].id !== id) list.push(mcpServers[i]); + mcpServers = list; + _touchMcpServers(); + // Drop session token + keyring entry + any live connection. + var toks = {}; + for (var k in mcpSessionTokens) if (k !== id) toks[k] = mcpSessionTokens[k]; + mcpSessionTokens = toks; + _setMcpKeyMessage(id, ""); + keyring.clearKey(id); + var svc = _mcpServiceFor(id); + if (svc && svc.isConnected) svc.disconnectFromServer(); + _setMcpConnected(id, false); + _setMcpConnectionError(id, ""); + // Remove the id from the Instantiator model so the backing + // MCPService Item is destroyed. + var ids = []; + for (var j = 0; j < _mcpServiceIds.length; j++) + if (_mcpServiceIds[j] !== id) ids.push(_mcpServiceIds[j]); + _mcpServiceIds = ids; + _persistMcpServers(); + } + + function setMcpServerUrl(id, url) { + var inst = getMcpServer(id); + if (!inst) return; + var clean = String(url || "").trim(); + if (inst.url === clean) return; + inst.url = clean; + // URL changed — drop the previous tool list (the names come + // from this server's discovery). + inst.discovered = []; + inst.enabledTools = []; + _touchMcpServers(); + _persistMcpServers(); + _pushMcpServerConfig(id); + // Disconnect the live connection if it pointed at the old URL. + var svc = _mcpServiceFor(id); + if (svc && svc.isConnected) svc.disconnectFromServer(); + } + + function renameMcpServer(id, name) { + var inst = getMcpServer(id); + if (!inst) return; + var trimmed = String(name || "").trim(); + if (!trimmed) return; + inst.name = trimmed; + _touchMcpServers(); + _persistMcpServers(); + // Token env-var name derives from the server name; push the + // resolved token onto the backing service so it sees the new + // env lookup result. + _pushMcpServerConfig(id); + } + + function setMcpServerEnabled(id, enabled) { + var inst = getMcpServer(id); + if (!inst) return; + inst.enabled = !!enabled; + if (!inst.enabled) { + // Disabling an MCP server should immediately drop its + // connection so we don't keep spawning mcp-remote processes. + var svc = _mcpServiceFor(id); + if (svc && svc.isConnected) svc.disconnectFromServer(); + } + _touchMcpServers(); + _persistMcpServers(); + } + + // Dynamic env var name for an MCP server, mirroring + // Providers.customEnvVar: "My Server" -> NEXUS_MCP_MY_SERVER_TOKEN. + function mcpEnvVar(name) { + var s = String(name || "").toUpperCase().replace(/[^A-Z0-9]+/g, "_"); + s = s.replace(/^_+|_+$/g, ""); + if (!s) s = "SERVER"; + return "NEXUS_MCP_" + s + "_TOKEN"; + } + + // Token resolution per server: session value → dynamic env var. + function resolveMcpToken(serverId, name) { + var inst = getMcpServer(serverId); + var session = Providers.sanitizeApiKey( + mcpSessionTokens[serverId] || ""); + if (session) return session; + var envName = mcpEnvVar(name || (inst ? inst.name : "")); + return Providers.sanitizeApiKey(Quickshell.env(envName)); + } + + // "keyring" | "session" | "env:" | "none" — same vocabulary + // as keyStatus so the UI text mirrors provider-key statuses. + function mcpKeyStatus(serverId) { + if (Providers.sanitizeApiKey(mcpSessionTokens[serverId] || "")) + return keyringAvailable ? "keyring" : "session"; + var inst = getMcpServer(serverId); + if (!inst) return "none"; + var envName = mcpEnvVar(inst.name); + if (Providers.sanitizeApiKey(Quickshell.env(envName))) + return "env:" + envName; + return "none"; + } + + // Non-empty token → keyring store (optimistic, like API keys) + + // session map; empty token → clear both. Resolution order ends + // up: keyring/session → env var → none. + function setMcpServerToken(id, token) { + var k = Providers.sanitizeApiKey(token); + _setMcpKeyMessage(id, ""); + if (keyringAvailable) { + if (k) keyring.storeKey(id, k); + else keyring.clearKey(id); + } + _setMcpSessionToken(id, k); + // Push the resolved token onto the backing service so its + // next connect uses the latest value (the keyring store is + // async — this closes the same race fixed in providers). + _pushMcpServerConfig(id); + } + + function _setMcpSessionToken(id, k) { + var toks = {}; + for (var kk in mcpSessionTokens) toks[kk] = mcpSessionTokens[kk]; + if (k) toks[id] = k; + else delete toks[id]; + mcpSessionTokens = toks; + } + + function _setMcpKeyMessage(id, msg) { + var m = {}; + for (var k in mcpKeyMessages) m[k] = mcpKeyMessages[k]; + if (msg) m[id] = msg; + else delete m[id]; + mcpKeyMessages = m; + } + + function _setMcpConnected(id, connected) { + var m = {}; + for (var k in mcpConnected) m[k] = mcpConnected[k]; + if (connected) m[id] = true; + else delete m[id]; + mcpConnected = m; + } + + function _setMcpConnectionError(id, msg) { + var m = {}; + for (var k in mcpConnectionErrors) m[k] = mcpConnectionErrors[k]; + if (msg) m[id] = msg; + else delete m[id]; + mcpConnectionErrors = m; + } + + // enabledTools is a complete positive list — empty means "none + // enabled", NOT "all on" (the dual meaning once let one click + // turn everything off). Select/deselect-all materialize the list. + function toggleMcpTool(serverId, toolName) { + var inst = getMcpServer(serverId); + if (!inst || !toolName) return; + var clean = String(toolName); + var list = (inst.enabledTools || []).slice(); + var idx = list.indexOf(clean); + if (idx >= 0) list.splice(idx, 1); + else list.push(clean); + inst.enabledTools = list; + _touchMcpServers(); + _persistMcpServers(); + } + + // Enable every discovered tool on a server (replaces the list with + // the full positive set — see toggleMcpTool). + function selectAllMcpTools(serverId) { + var inst = getMcpServer(serverId); + if (!inst) return; + var disc = inst.discovered || []; + var next = []; + var seen = {}; + for (var i = 0; i < disc.length; i++) { + var t = disc[i]; + if (!t || !t.name || seen[String(t.name)]) continue; + seen[String(t.name)] = true; + next.push(String(t.name)); + } + inst.enabledTools = next; + _touchMcpServers(); + _persistMcpServers(); + } + + // Disable every discovered tool on a server (empty positive list). + function deselectAllMcpTools(serverId) { + var inst = getMcpServer(serverId); + if (!inst) return; + inst.enabledTools = []; + _touchMcpServers(); + _persistMcpServers(); + } + + // Chat-request tool list: enabled MCP tools (gated by + // mcpToolsEnabled) + native web tools, OpenAI-shaped. + function getChatTools() { + var out = []; + if (mcpToolsEnabled) { + for (var i = 0; i < mcpServers.length; i++) { + var inst = mcpServers[i]; + if (!inst || inst.enabled === false) continue; + var svc = _mcpServiceFor(inst.id); + if (!svc || !svc.isConnected) continue; + var disc = inst.discovered || []; + var enabled = inst.enabledTools || []; + for (var t = 0; t < disc.length; t++) { + var tool = disc[t]; + if (!tool || !tool.name) continue; + if (enabled.indexOf(String(tool.name)) < 0) continue; + out.push({ + type: "function", + function: { + name: tool.name, + description: tool.description || "", + parameters: tool.inputSchema || { type: "object", properties: {} } + } + }); + } + } + } + if (webToolsEnabled) { + var enabledNames = []; + if (webSearchEnabled) enabledNames.push("web_search"); + if (webFetchEnabled) enabledNames.push("webfetch"); + out = out.concat(WebTools.toolDefs(enabledNames)); + } + return out; + } + + // Connected MCP toolsets contributing to chat requests (native + // web tools have their own chip and don't count). + function activeToolsetCount() { + var n = 0; + if (!mcpToolsEnabled) return n; + for (var i = 0; i < mcpServers.length; i++) { + var inst = mcpServers[i]; + if (!inst || inst.enabled === false) continue; + if (!mcpConnected[inst.id]) continue; + var disc = inst.discovered || []; + var enabled = inst.enabledTools || []; + for (var t = 0; t < disc.length; t++) { + var tool = disc[t]; + if (tool && tool.name + && enabled.indexOf(String(tool.name)) >= 0) { + n++; + break; + } + } + } + return n; + } + + // Per-server MCP service lookup. Created lazily on first access; + // see the Item block at the bottom of this service for the + // backing Item instances. + function _mcpServiceFor(id) { + if (!id) return null; + var item = mcpServiceInstances[id]; + return item || null; + } + + // ── Conversation ────────────────────────────────────────────── + + function sendMessage(text, images) { + editingMessageId = ""; + var cleanImgs = Providers.sanitizeImages(images); + var trimmed = String(text || "").trim(); + if ((!trimmed && cleanImgs.length === 0) || isStreaming) return; + if (!activeInstance || !activeModel) { + messagesModel.append({ + id: _nextId(), role: "system", content: + "Add a provider and pick a model in settings.", + thinking: "", toolLog: "[]", attachments: "[]", usage: "", + modelUsed: "", modelProviderId: "", + state: "error", stats: "", timestamp: Date.now() + }); + return; + } + var userMsg = _msg("user", trimmed, "done"); + if (cleanImgs.length > 0) + userMsg.attachments = JSON.stringify(cleanImgs); + messagesModel.append(userMsg); + var assistantId = _nextId(); + messagesModel.append(_msg("assistant", "")); + messagesModel.setProperty(messagesModel.count - 1, "id", assistantId); + _request(assistantId); + } + + function retryLast() { + if (isStreaming) return; + // drop trailing assistant messages back to the last user message + while (messagesModel.count > 0) { + var last = messagesModel.get(messagesModel.count - 1); + if (last.role === "assistant") { messagesModel.remove(messagesModel.count - 1); continue; } + break; + } + if (messagesModel.count === 0) return; + var lastUser = messagesModel.get(messagesModel.count - 1); + if (lastUser.role !== "user") return; + var assistantId = _nextId(); + messagesModel.append(_msg("assistant", "")); + messagesModel.setProperty(messagesModel.count - 1, "id", assistantId); + _request(assistantId); + } + + // Re-run the assistant turn for a specific (already-rendered) + // assistant message. Drops every message after it (including any + // assistant turns that followed), so the conversation re-fans out + // from the same user prompt that produced the targeted reply. + function regenerateMessage(assistantMsgId) { + if (isStreaming) return; + var i = _indexOfId(assistantMsgId); + if (i < 0) return; + var target = messagesModel.get(i); + if (!target || target.role !== "assistant") return; + // Drop everything from the targeted message to the end — same + // shape as retryLast() but anchored on a specific id, not the + // most-recent assistant turn. + while (messagesModel.count > i) + messagesModel.remove(messagesModel.count - 1); + if (messagesModel.count === 0) return; + var lastUser = messagesModel.get(messagesModel.count - 1); + if (lastUser.role !== "user") return; + var newAssistantId = _nextId(); + messagesModel.append(_msg("assistant", "")); + messagesModel.setProperty(messagesModel.count - 1, "id", newAssistantId); + _request(newAssistantId); + } + + // Start editing a sent user message: record the id (the owning + // bubble fades itself) and hand the text to the composer via + // editRequested. Refused while a stream is live. + function beginEditUserMessage(msgId) { + if (isStreaming) return; + var i = _indexOfId(msgId); + if (i < 0) return; + var m = messagesModel.get(i); + if (!m || m.role !== "user") return; + editingMessageId = msgId; + editRequested(m.content); + } + + // Up-arrow affordance: edit the most recent user message (the + // composer calls this only while its input is empty). No-op when + // the conversation has no user turns or a stream is live. + function beginEditLastUserMessage() { + if (isStreaming) return; + for (var i = messagesModel.count - 1; i >= 0; i--) { + var m = messagesModel.get(i); + if (m && m.role === "user") { + beginEditUserMessage(m.id); + return; + } + } + } + + // ── Send-modifier setting ───────────────────────────────────── + + function setSendModifier(m) { + var v = ["none", "shift", "ctrl", "alt"].indexOf(m) >= 0 ? String(m) : "none"; + if (sendModifier === v) return; + sendModifier = v; + saveSetting("sendModifier", v); + } + + // ── MCP tools master switch ─────────────────────────────────── + + function setMcpToolsEnabled(enabled) { + var v = !!enabled; + if (mcpToolsEnabled === v) return; + mcpToolsEnabled = v; + saveSetting("mcpToolsEnabled", v); + } + + // ── Native web tools master switch ──────────────────────────── + + function setWebToolsEnabled(enabled) { + var v = !!enabled; + if (webToolsEnabled === v) return; + webToolsEnabled = v; + saveSetting("webToolsEnabled", v); + } + + // ── Native per-tool switches ────────────────────────────────── + + // "web_search" | "webfetch". Unknown names are ignored. These only + // gate the native tools inside a master-on state — flipping them + // never touches webToolsEnabled. + function setNativeToolEnabled(name, enabled) { + var v = !!enabled; + if (name === "web_search") { + if (webSearchEnabled === v) return; + webSearchEnabled = v; + saveSetting("webSearchEnabled", v); + } else if (name === "webfetch") { + if (webFetchEnabled === v) return; + webFetchEnabled = v; + saveSetting("webFetchEnabled", v); + } + } + + function nativeToolEnabled(name) { + if (name === "web_search") return webSearchEnabled; + if (name === "webfetch") return webFetchEnabled; + return false; + } + + // Abandon an in-progress edit; the bubble un-fades and the + // composer text is left for the user to clear or send. + function cancelEditUserMessage() { + editingMessageId = ""; + } + + // Edit a sent user message: drop everything after it, update the + // text, regenerate. No-op while a stream is live. + function editUserMessage(userMsgId, newText) { + editingMessageId = ""; + if (isStreaming) return; + var trimmed = String(newText || "").trim(); + if (!trimmed) return; + var i = _indexOfId(userMsgId); + if (i < 0) return; + var target = messagesModel.get(i); + if (!target || target.role !== "user") return; + // Drop everything after the user message. + while (messagesModel.count > i + 1) + messagesModel.remove(messagesModel.count - 1); + // Update content in place. Keep id (any references in the UI + // still resolve); the message itself persists. + _setMsg(userMsgId, { content: trimmed }); + var newAssistantId = _nextId(); + messagesModel.append(_msg("assistant", "")); + messagesModel.setProperty(messagesModel.count - 1, "id", newAssistantId); + _request(newAssistantId); + } + + function cancelStream() { + streaming.cancel(); + } + + function clearChat() { + if (isStreaming) streaming.reset(); + editingMessageId = ""; + messagesModel.clear(); + lastUsage = null; + placeholder = pickPlaceholder(); + } + + function pickPlaceholder() { + var lines = _placeholderLines; + if (!lines || lines.length === 0) return "Ask anything…"; + return lines[Math.floor(Math.random() * lines.length)]; + } + + function pickPondering() { + var lines = _ponderingLines; + if (!lines || lines.length === 0) return ""; + return lines[Math.floor(Math.random() * lines.length)]; + } + + FileView { + id: placeholdersFile + path: decodeURIComponent( + Qt.resolvedUrl("../../resources/placeholders.txt").toString() + .replace(/^file:\/\//, "")) + + onLoaded: { + try { + var lines = String(text()).split("\n"); + var cleaned = []; + for (var i = 0; i < lines.length; i++) { + var line = lines[i].trim(); + if (line.length > 0) cleaned.push(line); + } + root._placeholderLines = cleaned; + } catch (e) {} + root.placeholder = root.pickPlaceholder(); + } + + onLoadFailed: (error) => { + console.warn("NexusAI: placeholders file failed to load (" + error + ")"); + } + } + + FileView { + id: ponderingsFile + path: decodeURIComponent( + Qt.resolvedUrl("../../resources/pondering.txt").toString() + .replace(/^file:\/\//, "")) + + onLoaded: { + try { + var lines = String(text()).split("\n"); + var cleaned = []; + for (var i = 0; i < lines.length; i++) { + var line = lines[i].trim(); + if (line.length > 0) cleaned.push(line); + } + root._ponderingLines = cleaned; + } catch (e) {} + if (root.isStreaming) root.ponderingText = root.pickPondering(); + } + + onLoadFailed: (error) => { + console.warn("NexusAI: pondering file failed to load (" + error + ")"); + } + } + + // Pondering phrase rotation: only ticks while a stream is live. + Timer { + id: ponderingTicker + interval: 2000 + repeat: true + running: root.isStreaming + onTriggered: root.ponderingText = root.pickPondering() + } + + function _msg(role, content, state) { + return { + id: _nextId(), role: role, content: content, thinking: "", + // JSON strings — ListModel can't hold JS object arrays. + toolLog: "[]", + attachments: "[]", + usage: "", + modelUsed: activeModel, + modelProviderId: activeProviderId, + state: state || "streaming", stats: "", timestamp: Date.now() + }; + } function _nextId() { return "m" + (++_idCounter); } + + function _historyForRequest() { + var out = []; + for (var i = 0; i < messagesModel.count; i++) { + var m = messagesModel.get(i); + var rec = { role: m.role, content: m.content, state: m.state }; + // Attachments become neutral images for the payload. + if (m.role === "user" && m.attachments && m.attachments.length > 2) { + try { + var arr = JSON.parse(m.attachments); + if (Array.isArray(arr) && arr.length > 0) rec.images = arr; + } catch (e) {} + } + out.push(rec); + } + return out; + } + + function _request(streamId) { + var inst = activeInstance; + if (!inst || !activeModel) { + _setMsg(streamId, { state: "error", content: "No provider selected — add one in settings." }); + return; + } + // Raw history — buildApiPayload filters unfinished turns; the + // same payload messages feed MCP tool rounds. + var payloadMsgs = Providers.buildApiPayload(inst, { + systemPrompt: systemPrompt, + messages: _historyForRequest() + }).messages; + streaming.begin(streamId); + // Seed tool-round memory: without it a relaunch would start + // with the assistant turn, which Gemini/Z.AI reject (400). + streaming._conversationMessages = payloadMsgs; + _launch(streamId, payloadMsgs); + } + + // Tool rounds relaunch with rawMessages (they bypass the + // history filter); no begin() — state persists across rounds. + function _launch(streamId, payloadMsgs) { + var inst = activeInstance; + if (!inst || !activeModel) { + _setMsg(streamId, { state: "error", content: "No provider selected — add one in settings." }); + return; + } + var chatTools = getChatTools(); + var toolsLive = chatTools.length > 0; + var req = Providers.buildChatRequest(inst, { + sessionKey: sessionKeys[inst.id] || "", + model: activeModel, + messages: payloadMsgs, + rawMessages: true, + tools: toolsLive ? chatTools : null, + systemPrompt: systemPrompt, + temperature: useTemperature ? temperature : null, + maxTokens: useMaxTokens ? maxTokens : 0, + numCtx: (activeIsOllama && useContextWindow) ? numCtx : 0, + timeoutSeconds: timeoutSeconds, + envLookup: function (name) { return Quickshell.env(name); } + }); + if (!req) { + _setMsg(streamId, { state: "error", content: "Could not build the request — check the provider base URL and model." }); + return; + } + streaming.format = activeFormat; + streaming.mcpService = toolsLive ? mcpRouter : null; + streamWatchdog.start(); + ponderingText = pickPondering(); + streaming.launchCurl(req); + } + + function _indexOfId(id) { + for (var i = 0; i < messagesModel.count; i++) + if (messagesModel.get(i).id === id) return i; + return -1; + } + + function _setMsg(id, patch) { + var i = _indexOfId(id); + if (i < 0) return; + for (var k in patch) messagesModel.setProperty(i, k, patch[k]); + } + + // ── Streaming wiring ────────────────────────────────────────── + + function _appendContent(id, delta) { + var i = _indexOfId(id); + if (i < 0) return; + messagesModel.setProperty(i, "content", messagesModel.get(i).content + delta); + } + + function _appendThinking(id, delta) { + var i = _indexOfId(id); + if (i < 0) return; + messagesModel.setProperty(i, "thinking", messagesModel.get(i).thinking + delta); + } + + // Tool call log: one entry per call, running → ok | error. + // toolLog is a JSON string (ListModel role limitation). + function _appendToolLog(id, toolName, phase, detail) { + var i = _indexOfId(id); + if (i < 0) return; + var raw = messagesModel.get(i).toolLog; + var log; + try { log = raw ? JSON.parse(raw) : []; } + catch (e) { log = []; } + if (!Array.isArray(log)) log = []; + var next = log.slice(); + var name = String(toolName || ""); + if (phase === "call") { + // thinkingAt interleaves the chip into the pondering flow. + next.push({ name: name, state: "running", detail: "", + startMs: Date.now(), endMs: 0, + thinkingAt: messagesModel.get(i).thinking.length }); + } else { + // finalize: most recent running entry with this name + var idx = -1; + for (var t = next.length - 1; t >= 0; t--) + if (next[t] && next[t].state === "running" + && next[t].name === name) { idx = t; break; } + var entry = idx >= 0 ? JSON.parse(JSON.stringify(next[idx])) + : { name: name, state: "running", detail: "", + startMs: Date.now(), endMs: 0 }; + entry.state = phase === "error" ? "error" : "ok"; + entry.endMs = Date.now(); + var text = String(detail || ""); + entry.detail = text.length > 20000 ? text.substring(0, 20000) + "…" : text; + if (idx >= 0) next[idx] = entry; + else next.push(entry); + } + messagesModel.setProperty(i, "toolLog", JSON.stringify(next)); + } + + function _stopWatchdog() { streamWatchdog.stop(); } + + // Tool router for MCP + native tools (see AGENTS.md "Native + // tools"). Declared before the Instantiator so the id exists when + // MCPService delegates connect in onObjectAdded. + Item { + id: mcpRouter + signal toolCallCompleted(var callId, string result) + signal toolCallFailed(var callId, string error) + // Connected for routing purposes when any MCP server is up OR + // the native web tools are enabled (master on + at least one + // per-tool on) — native execution needs no connection. + property bool isConnected: { + if (root.webToolsEnabled + && (root.webSearchEnabled || root.webFetchEnabled)) return true; + var n = 0; + for (var k in root.mcpServiceInstances) { + var svc = root.mcpServiceInstances[k]; + if (svc && svc.isConnected) n++; + } + return n > 0; + } + // Native tool call ids come from a negative counter so they can + // never collide with MCPService's positive request ids. + property int _nativeCallCounter: 0 + function getTools() { + return root.getChatTools(); + } + function callTool(name, args) { + if (WebTools.isNativeTool(name)) { + // Defense in depth: a disabled native tool never + // reaches the model's tool list, but a stale or + // replayed call must not execute either. + if (!root.nativeToolEnabled(name)) return -1; + _nativeCallCounter++; + var nativeId = -_nativeCallCounter; + nativeTools.execute(nativeId, name, args); + return nativeId; + } + for (var i = 0; i < root.mcpServers.length; i++) { + var inst = root.mcpServers[i]; + if (!inst || inst.enabled === false) continue; + var svc = root._mcpServiceFor(inst.id); + if (!svc || !svc.isConnected) continue; + var found = false; + var disc = inst.discovered || []; + for (var t = 0; t < disc.length; t++) { + if (disc[t] && disc[t].name === name) { found = true; break; } + } + if (!found) continue; + return svc.callTool(name, args); + } + return -1; + } + } + + // One MCPService per configured server. The Instantiator model is + // the stable id list — a mcpServers-driven model would tear down + // live connections on every array reassignment. Config changes + // flow through _pushMcpServerConfig. + Instantiator { + id: mcpInstantiator + model: root._mcpServiceIds + delegate: MCPService { + id: mcpSvc + property string serverId: modelData ? String(modelData) : "" + // Defaults: empty until onObjectAdded pushes values in. + mcpUrl: "" + mcpToken: "" + onMcpConnectionStateChanged: root._onMcpConnectionStateChanged(serverId) + onMcpToolsUpdated: root._onMcpToolsUpdated(serverId) + // toolCallCompleted / toolCallFailed are wired at the JS + // level in onObjectAdded (signal-to-signal connect) — the + // inline parameterized handlers here did not deliver. + } + onObjectAdded: (idx, obj) => { + var sid = String(obj.serverId || ""); + if (!sid) return; + var map = {}; + for (var k in root.mcpServiceInstances) map[k] = root.mcpServiceInstances[k]; + map[sid] = obj; + root.mcpServiceInstances = map; + root._pushMcpServerConfig(sid); + // Direct delivery into streaming (signal-to-signal + // connects are unreliable inside Instantiator delegates). + obj.onToolResult = function(callId, result) { + console.warn("NEXUS_MCP_RESULT: completed id=", callId, + "from=", sid, "len=", (result || "").length); + streaming._onToolCallCompleted(callId, result); + }; + obj.onToolFailure = function(callId, err) { + console.warn("NEXUS_MCP_RESULT: failed id=", callId, + "from=", sid, "err=", err); + streaming._onToolCallFailed(callId, err); + }; + console.warn("NEXUS_MCP_WIRE: callbacks set for id=", sid); + } + onObjectRemoved: (idx, obj) => { + var sid = String(obj.serverId || ""); + if (!sid) return; + var map = {}; + for (var k in root.mcpServiceInstances) + if (k !== sid) map[k] = root.mcpServiceInstances[k]; + root.mcpServiceInstances = map; + } + } + + // Push url/token changes to a server's backing service without + // re-creating it. + function _pushMcpServerConfig(serverId) { + var svc = _mcpServiceFor(serverId); + if (!svc) return; + var inst = getMcpServer(serverId); + if (!inst) return; + svc.mcpUrl = String(inst.url || ""); + svc.mcpToken = resolveMcpToken(serverId, String(inst.name || "")); + } + + NativeToolsService { + id: nativeTools + // Callback assignment (not declarative bindings): mirrors how + // MCPService delegates get wired in onObjectAdded. + Component.onCompleted: { + onResult = function (callId, text) { + streaming._onToolCallCompleted(callId, text); + }; + onError = function (callId, err) { + streaming._onToolCallFailed(callId, err); + }; + } + } + + StreamingService { + id: streaming + timeoutSeconds: root.timeoutSeconds + + onStreamContentUpdated: (streamId, delta) => root._appendContent(streamId, delta) + onStreamThinkingUpdated: (streamId, delta) => root._appendThinking(streamId, delta) + onStreamToolRoundReady: (streamId, messages) => root._launch(streamId, messages) + onToolActivity: (streamId, toolName, phase, detail) => + root._appendToolLog(streamId, toolName, phase, detail) + + onStreamFinalized: (streamId, stats, usage) => { + root._stopWatchdog(); + root._setMsg(streamId, { + state: "done", stats: stats, + usage: usage ? JSON.stringify(usage) : "" + }); + if (usage) root.lastUsage = usage; + root._afterResponseProbe(); + } + + onStreamError: (streamId, message) => { + root._stopWatchdog(); + root._setMsg(streamId, { state: "error", content: message, stats: "" }); + } + + onStreamCancelled: (streamId, stats) => { + root._stopWatchdog(); + root._setMsg(streamId, { state: "cancelled", stats: stats }); + } + } + + // Static router → streaming wiring (bindings to the reassignable + // mcpService property miss signals); id guards absorb strays. + Connections { + target: mcpRouter + function onToolCallCompleted(callId, result) { + console.warn("NEXUS_MCP_RESULT: completed id=", callId, + "len=", (result || "").length); + streaming._onToolCallCompleted(callId, result); + } + function onToolCallFailed(callId, error) { + console.warn("NEXUS_MCP_RESULT: failed id=", callId, "err=", error); + streaming._onToolCallFailed(callId, error); + } + } + + KeyringService { + id: keyring + // Keyring readiness lands after settings load (async probe) — + // queue lookups for every known instance (providers + MCP + // servers), then attempt the first MCP connect. + onAvailableChanged: if (keyring.available) { + root._queueAllKeyLookups() + root._queueAllMcpKeyLookups() + root._connectAllEnabledMcpServers() + } + // Stores, clears and lookup results all land here; mirroring + // keeps sessionKeys (what resolveInstanceKey reads) in step. + onKeysChanged: { + root._syncFromKeyring() + root._syncFromKeyringMcp() + // Newly-landed MCP tokens can trigger the first connect. + root._connectAllEnabledMcpServers() + } + // A rejected store already rolled back the keyring mirror — + // drop the session-side entry too (keyStatus falls back to + // env/none) and surface the failure under the key field. + onKeyStoreFailed: (account) => { + if (root.getMcpServer(account)) { + root._setMcpSessionToken(account, ""); + var inst = root.getMcpServer(account); + root._setMcpKeyMessage(account, + "Keyring rejected the token for " + + (inst && inst.name ? String(inst.name) : String(account))); + return; + } + var pinst = root.getProvider(account); + var name = pinst && pinst.name ? String(pinst.name) : String(account); + root._setSessionKey(account, ""); + root._setKeyMessage(account, "Keyring rejected the key for " + name); + } + } + + Timer { + id: streamWatchdog + interval: (root.timeoutSeconds + 30) * 1000 + repeat: false + onTriggered: { + if (!streaming.isStreaming) return; + var id = streaming.activeStreamId; + var i = root._indexOfId(id); + if (i < 0 || messagesModel.get(i).state !== "streaming") return; + root._setMsg(id, { + state: "error", + content: "Request watchdog fired — the provider never responded. Check that curl is installed and the provider is reachable." + }); + streaming.reset(); + } + } + + // ── Model discovery ─────────────────────────────────────────── + + property string _modelsStdin: "" + // Instance the running fetch belongs to. + property string _modelsTargetId: "" + // Fetch target kept across the result handlers (unlike + // _modelsTargetId, which onStreamFinished clears first) so onExited + // can attribute a curl exit failure to the right instance. + property string _modelsFetchId: "" + // Per-instance discovery errors; "" / absent means success. + property var modelsErrors: ({}) + + // ── MCP (Model Context Protocol) ────────────────────────────── + // One backing instance per server; reconnect after keyring + // updates so new tokens connect without a settings visit. + property var mcpServiceInstances: ({}) + property var _mcpServiceIds: [] // stable id list for Instantiator model + property string _mcpConnectingId: "" + + function _connectMcpServer(id) { + var inst = getMcpServer(id); + if (!inst) return; + if (inst.enabled === false) return; + var svc = _mcpServiceFor(id); + if (!svc) { + // Instantiator delegate hasn't been added yet (or the + // service map hasn't caught up). Surface the gate so the + // user understands why nothing seems to happen. + _setMcpConnectionError(id, "Service not ready — try again in a moment."); + return; + } + // The backing service gets url/token via _pushMcpServerConfig; + // we only gate on user-facing conditions here. + if (!inst.url) { + _setMcpConnectionError(id, "Set a URL to connect."); + return; + } + if (!resolveMcpToken(id, inst.name)) { + _setMcpConnectionError(id, "Set an auth token to connect."); + return; + } + if (svc.isConnected || svc.connecting) return; + _setMcpConnectionError(id, ""); + _mcpConnectingId = id; + svc.connectToServer(); + } + + function _disconnectMcpServer(id) { + var svc = _mcpServiceFor(id); + if (svc && svc.isConnected) svc.disconnectFromServer(); + } + + function _connectAllEnabledMcpServers() { + for (var i = 0; i < mcpServers.length; i++) { + var inst = mcpServers[i]; + if (inst && inst.enabled !== false) _connectMcpServer(inst.id); + } + } + + function _onMcpConnectionStateChanged(serverId) { + var svc = _mcpServiceFor(serverId); + if (!svc) return; + _setMcpConnected(serverId, !!svc.isConnected); + if (svc.isConnected) { + _setMcpConnectionError(serverId, ""); + // Pull the latest tool list from the service onto the + // persisted instance through the shared merge: previously + // disabled tools stay off; genuinely new tools default on. + var inst = getMcpServer(serverId); + if (inst) { + var merged = McpTools.mergeToolSelection( + inst.discovered, inst.enabledTools, svc.tools || []); + inst.discovered = merged.discovered; + inst.enabledTools = merged.enabledTools; + _touchMcpServers(); + _persistMcpServers(); + } + } else { + _setMcpConnectionError(serverId, svc.connectionError || ""); + if (_mcpConnectingId === serverId) _mcpConnectingId = ""; + } + } + + function _onMcpToolsUpdated(serverId) { + // Live tool-list changes (notifications/tools/list_changed) — + // mirror them onto the instance through the shared merge (same + // rule as connect: off-toggles persist, new tools default on). + var svc = _mcpServiceFor(serverId); + var inst = getMcpServer(serverId); + if (!svc || !inst) return; + var merged = McpTools.mergeToolSelection( + inst.discovered, inst.enabledTools, svc.tools || []); + inst.discovered = merged.discovered; + inst.enabledTools = merged.enabledTools; + _touchMcpServers(); + _persistMcpServers(); + } + // Stems scanned from resources/icons/models — notifies so icon bindings + // re-resolve after the startup scan lands. + property var modelIconStems: [] + + function _setModelsError(id, msg) { + var m = {}; + for (var k in modelsErrors) m[k] = modelsErrors[k]; + if (msg) m[id] = msg; + else delete m[id]; + modelsErrors = m; + } + + function refreshModels(instanceId) { + if (modelsRefreshing) return; // one fetch at a time — no result/instance mixups + var inst = getProvider(instanceId); + if (!inst) return; // unknown/missing id → no-op + var req = Providers.buildModelsRequest( + inst, + Providers.resolveInstanceKey(inst, sessionKeys[inst.id] || "", + function (name) { return Quickshell.env(name); })); + if (!req) { + _setModelsError(inst.id, "Invalid base URL — fix it in the provider settings."); + return; + } + _modelsTargetId = inst.id; + _modelsFetchId = inst.id; + _setModelsError(inst.id, ""); + console.warn("NexusAI models: fetching for " + inst.name + " from " + inst.baseUrl); + modelsRefreshing = true; + _modelsStdin = req.body; + modelsFetcher.stdinEnabled = true; // re-arm for every fetch + modelsFetcher.command = req.cmd; + modelsFetcher.running = true; + } + + Process { + id: modelsFetcher + running: false + stdinEnabled: true + + onRunningChanged: { + if (running && root._modelsStdin) { + modelsFetcher.write(root._modelsStdin); + modelsFetcher.stdinEnabled = false; + root._modelsStdin = ""; + } + } + + // onStreamFinished has no params — declaring (text) would + // shadow the collector's text with undefined. + stdout: StdioCollector { + id: modelsOut + onStreamFinished: { + root.modelsRefreshing = false; + var text = modelsOut.text; + var parsed = StreamParser.extractHttpStatus(text); + console.warn("NexusAI models: finished status=" + parsed.status + + " bodyLen=" + (parsed.body ? parsed.body.length : 0)); + var targetId = root._modelsTargetId; + root._modelsTargetId = ""; + if (!targetId) return; + root._handleInstanceModelsResult(targetId, parsed); + } + } + + onExited: (exitCode, exitStatus) => { + root.modelsRefreshing = false; + console.warn("NexusAI models: exited code=" + exitCode); + if (exitCode !== 0 && root._modelsFetchId.length > 0) { + var id = root._modelsFetchId; + root._modelsFetchId = ""; + if ((root.modelsErrors[id] || "").length === 0) { + var hint = ErrorHints.curlExitHint(exitCode); + root._setModelsError(id, "Connection failed (curl exit " + exitCode + ")" + + (hint ? "\n" + hint : "")); + } + } + } + + // Same no-parameter rule: read the collector's text by id. + stderr: StdioCollector { + id: modelsErr + onStreamFinished: { + if (modelsErr.text.length > 0) + console.warn("NexusAI models: curl stderr = " + modelsErr.text); + } + } + } + + // ── Context meter data ──────────────────────────────────────── + + function _recalcContextWindow() { + var inst = activeInstance; + if (!inst || !activeModel) { contextWindow = 0; return; } + if (activeIsOllama) { + contextWindow = (useContextWindow && numCtx > 0) + ? numCtx : ollamaContextLength; + return; + } + contextWindow = ContextWindows.lookup(registryMap, inst.type, + activeModel); + } + + // Static window for the active provider from the cached + // models.dev snapshot. Fetches in the background when the cache + // is empty or older than a week; failures are silent (meter + // degrades to tokens-only until the next attempt). + function fetchContextRegistry(force) { + if (registryFetcher.running) return; + var week = 7 * 24 * 3600 * 1000; + if (!force && registryFetchedAt > 0 && Date.now() - registryFetchedAt < week) + return; + var req = Providers.buildRegistryRequest(60); + _registryStdin = req.body; + registryFetcher.stdinEnabled = true; // re-arm for every fetch + registryFetcher.command = req.cmd; + registryFetcher.running = true; + console.warn("NexusAI ctx: fetching models.dev snapshot"); + } + + // Post-response probe: ollama's loaded runner reports its REAL + // context via /api/ps — the dynamic half of the meter's window + // (server default when the num_ctx setting is off). Other + // providers only recalc (registry may have just loaded). + function _afterResponseProbe() { + if (!activeIsOllama || !activeInstance || psFetcher.running) { + _recalcContextWindow(); + return; + } + var req = Providers.buildOllamaPsRequest(activeInstance, 15); + if (!req) { _recalcContextWindow(); return; } + _psTargetModel = activeModel; + _psStdin = req.body; + psFetcher.stdinEnabled = true; + psFetcher.command = req.cmd; + psFetcher.running = true; + } + + property string _psStdin: "" + property string _psTargetModel: "" + + Process { + id: psFetcher + running: false + stdinEnabled: true + + onRunningChanged: { + if (running && root._psStdin) { + psFetcher.write(root._psStdin); + psFetcher.stdinEnabled = false; + root._psStdin = ""; + } + } + + stdout: StdioCollector { + id: psOut + onStreamFinished: { + var parsed = StreamParser.extractHttpStatus(psOut.text); + var target = root._psTargetModel; + root._psTargetModel = ""; + if (!target) return; + if (parsed.status >= 200 && parsed.status < 400) { + root.ollamaContextLength = + ContextWindows.ollamaWindowFromPs(parsed.body, target); + } + root._recalcContextWindow(); + } + } + + onExited: (exitCode, exitStatus) => { + if (exitCode !== 0) + console.warn("NexusAI ctx: ps probe curl exit " + exitCode); + } + + stderr: StdioCollector { + id: psErr + onStreamFinished: { + if (psErr.text.length > 0) + console.warn("NexusAI ctx: ps stderr = " + psErr.text); + } + } + } + + property string _registryStdin: "" + + Process { + id: registryFetcher + running: false + stdinEnabled: true + + onRunningChanged: { + if (running && root._registryStdin) { + registryFetcher.write(root._registryStdin); + registryFetcher.stdinEnabled = false; + root._registryStdin = ""; + } + } + + stdout: StdioCollector { + id: regOut + onStreamFinished: { + var parsed = StreamParser.extractHttpStatus(regOut.text); + if (parsed.status < 200 || parsed.status >= 400) { + console.warn("NexusAI ctx: registry HTTP " + parsed.status); + return; + } + var slim = ContextWindows.slim(parsed.body); + var n = Object.keys(slim).length; + if (n === 0) { + console.warn("NexusAI ctx: registry snapshot unusable"); + return; + } + root.registryMap = slim; + root.registryFetchedAt = Date.now(); + root.saveSetting("contextWindows", JSON.stringify(slim)); + root.saveSetting("contextWindowsFetchedAt", root.registryFetchedAt); + console.warn("NexusAI ctx: snapshot cached (" + n + " providers)"); + root._recalcContextWindow(); + } + } + + onExited: (exitCode, exitStatus) => { + if (exitCode !== 0) + console.warn("NexusAI ctx: registry curl exit " + exitCode); + } + + stderr: StdioCollector { + id: regErr + onStreamFinished: { + if (regErr.text.length > 0) + console.warn("NexusAI ctx: registry stderr = " + regErr.text); + } + } + } + + function _handleInstanceModelsResult(targetId, parsed) { + var inst = getProvider(targetId); + if (!inst) return; + if (parsed.status >= 200 && parsed.status < 400) { + var list = Providers.parseModelList(parsed.body, Providers.formatOf(inst)); + inst.discovered = list; + // Prune ghost state for models the provider retired — + // only on a non-empty list, so a transient empty + // response can't wipe selections. + if (list.length > 0) { + var pinIds = []; + for (var pp = 0; pp < pinnedModels.length; pp++) { + var prec = pinnedModels[pp]; + if (prec && prec.providerId === targetId) + pinIds.push(String(prec.model)); + } + var pruned = Providers.pruneStaleModels(inst, list, pinIds); + if (pruned.removed.length > 0) { + inst.checkedModels = pruned.checkedModels; + inst.modelLabels = pruned.labels; + var pins = []; + for (var pq = 0; pq < pinnedModels.length; pq++) { + var p = pinnedModels[pq]; + if (p && p.providerId === targetId + && pruned.removed.indexOf(String(p.model)) >= 0) continue; + pins.push(p); + } + if (pins.length !== pinnedModels.length) { + pinnedModels = pins; + saveSetting("pinnedModels", JSON.stringify(pins)); + } + if (targetId === activeProviderId + && pruned.removed.indexOf(activeModel) >= 0) { + activeModel = ""; + saveSetting("activeModel", ""); + } + } + } + _touchProviders(); + _persistProviders(); + _setModelsError(targetId, list.length > 0 ? "" : "Provider returned an empty model list."); + } else if (parsed.status > 0) { + var msg = "HTTP " + parsed.status; + var hint = ErrorHints.httpErrorHint(parsed.status); + if (hint) msg += " — " + hint; + _setModelsError(targetId, msg); + } + // status === 0 (no HTTP status parsed): leave modelsError empty — + // onStreamFinished fires before onExited, so the specific + // curl-exit hint (7 refused, 6 DNS, 28 timeout) is attributed + // by onExited, which only fills in when the error is still empty. + } +} diff --git a/src/services/StreamingService.qml b/src/services/StreamingService.qml new file mode 100644 index 0000000..cd08d0b --- /dev/null +++ b/src/services/StreamingService.qml @@ -0,0 +1,426 @@ +import QtQuick +import Quickshell.Io +import "../lib/StreamParser.js" as StreamParser +import "../lib/ErrorHints.js" as ErrorHints +import "../lib/Providers.js" as Providers + +Item { + id: root + + property int timeoutSeconds: 300 + property bool isStreaming: false + property string activeStreamId: "" + // Wire format of the active provider ("openai" | "anthropic" | + // "gemini" | "ollama"); set before begin() so chunks parse right. + property string format: "openai" + + // stream-scoped accumulators + property string _content: "" + property string _thinking: "" + property string _lineBuffer: "" + property string _tagBuffer: "" + property bool _insideThinkTag: false + property real _startMs: 0 + property int _deltaCount: 0 + property int _apiTokens: 0 + + signal streamContentUpdated(string streamId, string delta) + signal streamThinkingUpdated(string streamId, string delta) + // usage: {input, output} token counts for the request, or null + // when the provider reported nothing. + signal streamFinalized(string streamId, string stats, var usage) + signal streamError(string streamId, string message) + signal streamCancelled(string streamId, string stats) + + readonly property int maxStreamBytes: 5 * 1024 * 1024 + property string _pendingStdin: "" + property var _queuedReq: null + property int _gen: 0 + property int _launchGen: -1 + + // ── MCP tool rounds ─────────────────────────────────────────── + // Model answers with tool calls → execute over MCP → relaunch + // with results appended, until a round ends without calls. + property var mcpService: null + property bool _seenToolCalls: false + property var _pendingToolCalls: [] + property var _allToolCalls: [] + property var _toolResults: [] + property var _toolAcc: ({}) // per-round parse accumulator + property var _conversationMessages: [] // neutral payload messages + // Token usage reported by the provider ({input, output}), latest + // wins. Not reset across tool rounds — the last round reports + // the full conversation position. + property var _usage: null + property int _pendingCallId: -1 + property var _pendingToolCallMeta: null + // True while an MCP call is in flight; completion handlers clear + // it and drive the loop. Guards _executeNextToolCall against + // re-entry (which used to drop the in-flight result). + property bool _toolExecActive: false + + signal streamToolRoundReady(string streamId, var messages) + signal toolActivity(string streamId, string toolName, string phase, string detail) + + // Tool-call results arrive via NexusService calling + // _onToolCallCompleted / _onToolCallFailed directly. + + function begin(streamId) { + _gen++; + activeStreamId = streamId; + isStreaming = true; + _content = ""; + _thinking = ""; + _lineBuffer = ""; + _tagBuffer = ""; + _insideThinkTag = false; + _startMs = 0; + _deltaCount = 0; + _apiTokens = 0; + _seenToolCalls = false; + _pendingToolCalls = []; + _allToolCalls = []; + _toolResults = []; + _toolAcc = {}; + _conversationMessages = []; + _usage = null; + _pendingCallId = -1; + _pendingToolCallMeta = null; + _toolExecActive = false; + } + + function launchCurl(req) { + if (!req) return; + if (fetcher.running) { + _queuedReq = req; + fetcher.running = false; // stop the old process; queued req starts from onExited + return; + } + _startFetch(req); + } + + // Cancel → relaunch race: cancel() flushes and marks dead + // (_gen changes), the old curl's callbacks no-op, and its + // onExited drains the queued request under the new generation. + function _startFetch(req) { + _launchGen = _gen; + collector.lastLen = 0; // re-arm collector for this run + _pendingStdin = req.body; + fetcher.stdinEnabled = true; // re-arm for every request + fetcher.command = req.cmd; + fetcher.running = true; + } + + function cancel() { + if (!isStreaming) return; + var id = activeStreamId; + _flushTagBuffer(); + _queuedReq = null; // a Stop must never launch a parked request later + isStreaming = false; + activeStreamId = ""; + fetcher.running = false; + streamCancelled(id, _stats()); + } + + function reset() { + if (fetcher.running) fetcher.running = false; + isStreaming = false; + activeStreamId = ""; + _lineBuffer = ""; + _pendingStdin = ""; + _queuedReq = null; + } + + function _live() { + return isStreaming && _launchGen === _gen; + } + + // ── internals ───────────────────────────────────────────────── + + function _flushTagBuffer() { + if (_tagBuffer.length === 0) return; + if (_insideThinkTag) { _thinking += _tagBuffer; streamThinkingUpdated(activeStreamId, _tagBuffer); } + else { _content += _tagBuffer; streamContentUpdated(activeStreamId, _tagBuffer); } + _tagBuffer = ""; + } + + function _contentDelta(id, text) { + if (!text) return; + if (_startMs === 0) _startMs = Date.now(); + _deltaCount++; + _content += text; + streamContentUpdated(id, text); + } + + function _thinkingDelta(id, text) { + if (!text) return; + if (_startMs === 0) _startMs = Date.now(); + _thinking += text; + streamThinkingUpdated(id, text); + } + + function _handleChunk(chunk) { + if (!_live()) return; + var split = StreamParser.splitLines(chunk, _lineBuffer); + _lineBuffer = split.buffer; + + for (var i = 0; i < split.lines.length; i++) { + var line = split.lines[i]; + var jsonPart; + if (line.indexOf("data:") === 0) jsonPart = line.substring(5).trim(); + else if (line.indexOf("{") === 0) jsonPart = line; + else continue; + + var d = StreamParser.parseDelta(jsonPart, root.format, _toolAcc); + if (d.outputTokens > 0) _apiTokens = d.outputTokens; + if (d.inputTokens > 0 || d.outputTokens > 0) { + var prev = _usage || { input: 0, output: 0 }; + _usage = { + input: d.inputTokens > 0 ? d.inputTokens : prev.input, + output: d.outputTokens > 0 ? d.outputTokens : prev.output + }; + } + + if (d.toolCalls && d.toolCalls.length > 0) { + _seenToolCalls = true; + for (var tc = 0; tc < d.toolCalls.length; tc++) { + var call = d.toolCalls[tc]; + // Synthesize missing ids (Z.AI omits them); the + // round-trip 400s if assistant/result ids differ. + if (!call.id) + call.id = "call_" + _allToolCalls.length; + _pendingToolCalls.push(call); + _allToolCalls.push(call); + } + } + + if (d.thinking) _thinkingDelta(activeStreamId, d.thinking); + + if (d.content) { + var routed = StreamParser.routeThinkTags(d.content, _tagBuffer, _insideThinkTag); + _tagBuffer = routed.tagBuffer; + _insideThinkTag = routed.insideThinkTag; + for (var t = 0; t < routed.thinkingParts.length; t++) + _thinkingDelta(activeStreamId, routed.thinkingParts[t]); + for (var c = 0; c < routed.contentParts.length; c++) + _contentDelta(activeStreamId, routed.contentParts[c]); + } + + // Tool calls end the round — execute them, then the + // coordinator relaunches with the results appended. + if (d.done && _seenToolCalls && _pendingToolCalls.length > 0) { + _executeNextToolCall(); + return; + } + } + } + + function _handleFinished(raw) { + if (!_live()) return; + var parsed = StreamParser.extractHttpStatus(raw); + + if (isStreaming && _content.length === 0 && _thinking.length === 0 && + parsed.status >= 200 && parsed.status < 400 && parsed.body) { + var fallback = StreamParser.extractNonStreamingText(parsed.body, root.format); + if (fallback) { + var routed = StreamParser.routeThinkTags(fallback, "", false); + for (var t = 0; t < routed.thinkingParts.length; t++) + _thinkingDelta(activeStreamId, routed.thinkingParts[t]); + for (var c = 0; c < routed.contentParts.length; c++) + _contentDelta(activeStreamId, routed.contentParts[c]); + _finalize(); + return; + } + } + + if (parsed.status >= 400) { + var msg = "Request failed (HTTP " + parsed.status + ")"; + var hint = ErrorHints.httpErrorHint(parsed.status); + if (hint) msg += "\n" + hint; + var preview = parsed.body.length > 600 + ? parsed.body.substring(0, 600) + "\u2026" : parsed.body.trim(); + if (preview) msg += "\n\n" + preview; + _fail(msg); + return; + } + + // Tool calls were seen but execution never started (provider + // ended the stream without a completion event we recognize). + if (isStreaming && _seenToolCalls && _pendingToolCalls.length > 0) { + _executeNextToolCall(); + return; + } + + if (isStreaming) { + if (!_seenToolCalls && _content.length === 0 && _thinking.length === 0) { + _fail("No response received.\nCheck the base URL and model, and that the server is reachable."); + return; + } + _finalize(); + } + } + + function _finalize() { + if (!isStreaming) return; + // A tool round is never final — the coordinator relaunches. + if (_seenToolCalls) return; + var id = activeStreamId; + _flushTagBuffer(); + _insideThinkTag = false; + isStreaming = false; + activeStreamId = ""; + streamFinalized(id, _stats(), _usage); + } + + function _fail(message) { + if (!isStreaming) return; + var id = activeStreamId; + isStreaming = false; + activeStreamId = ""; + streamError(id, message); + } + + // ── MCP tool round execution ────────────────────────────────── + + function _executeNextToolCall() { + // One MCP call in flight at a time. + if (_toolExecActive) return; + if (_pendingToolCalls.length === 0) { + _resumeWithToolResults(); + return; + } + var call = _pendingToolCalls.shift(); + var toolName = call.function ? call.function.name : call.name; + var toolArgs = Providers.parseToolArgs( + call.function ? call.function.arguments : call.arguments); + if (!mcpService || !mcpService.isConnected) { + _toolResults.push({ tool_call_id: call.id || toolName, name: toolName, + role: "tool", content: "Error: MCP service not connected" }); + _executeNextToolCall(); + return; + } + toolActivity(activeStreamId, toolName, "call", ""); + var callId = mcpService.callTool(toolName, toolArgs); + _toolExecActive = true; + _pendingCallId = callId; + _pendingToolCallMeta = { id: call.id || ("call_" + callId), name: toolName }; + } + + function _onToolCallCompleted(callId, result) { + if (callId !== _pendingCallId) return; + _pendingCallId = -1; + _toolExecActive = false; + var meta = _pendingToolCallMeta; + // Full envelope for the UI log, unwrapped text for the model + // (Providers.unwrapMcpResult; the raw envelope can prompt + // duplicate tool calls on long responses). + var rawText = (typeof result === "string") ? result : JSON.stringify(result); + toolActivity(activeStreamId, meta.name, "result", rawText); + var modelText = Providers.unwrapMcpResult(result); + _toolResults.push({ + role: "tool", + tool_call_id: meta.id, + name: meta.name, + content: modelText + }); + _pendingToolCallMeta = null; + _executeNextToolCall(); + } + + function _onToolCallFailed(callId, error) { + if (callId !== _pendingCallId) return; + _pendingCallId = -1; + _toolExecActive = false; + var meta = _pendingToolCallMeta; + toolActivity(activeStreamId, meta ? meta.name : "", "error", error); + _toolResults.push({ + role: "tool", + tool_call_id: meta ? meta.id : String(callId), + name: meta ? meta.name : "", + content: "Error: " + error + }); + _pendingToolCallMeta = null; + _executeNextToolCall(); + } + + function _resumeWithToolResults() { + _toolExecActive = false; + if (_toolResults.length === 0) { _finalize(); return; } + // Append the assistant tool_calls turn + results, then + // relaunch. Everything else persists across rounds. + var updated = _conversationMessages.slice(); + updated.push({ + role: "assistant", + content: _content || "", + tool_calls: _allToolCalls.slice() + }); + for (var i = 0; i < _toolResults.length; i++) + updated.push(_toolResults[i]); + _toolResults = []; + _seenToolCalls = false; + _pendingToolCalls = []; + _allToolCalls = []; + _toolAcc = {}; + streamToolRoundReady(activeStreamId, updated); + } + + function _stats() { + if (_startMs === 0) return ""; + var seconds = (Date.now() - _startMs) / 1000; + var label = seconds.toFixed(1) + "s"; + var tokens = _apiTokens > 0 ? _apiTokens : _deltaCount; + if (tokens > 0 && seconds > 0.5) + label += " \u00b7 " + (_apiTokens > 0 ? "" : "~") + + (tokens / seconds).toFixed(1) + " tok/s"; + return label; + } + + Process { + id: fetcher + running: false + stdinEnabled: true + + onRunningChanged: { + if (running && root._pendingStdin) { + fetcher.write(root._pendingStdin); + fetcher.stdinEnabled = false; + root._pendingStdin = ""; + } + } + + stdout: StdioCollector { + id: collector + waitForEnd: false + property int lastLen: 0 + + onTextChanged: { + if (text.length > root.maxStreamBytes) { + fetcher.running = false; + root._fail("Response exceeded the 5 MB stream cap."); + return; + } + var fresh = text.substring(lastLen); + lastLen = text.length; + root._handleChunk(fresh); + } + + onStreamFinished: { + root._handleFinished(text); + } + } + + onExited: (exitCode, exitStatus) => { + if (exitCode !== 0 && root._live()) { + var msg = "Connection failed (curl exit " + exitCode + ")"; + var hint = ErrorHints.curlExitHint(exitCode); + if (hint) msg += "\n" + hint; + root._fail(msg); + } + if (root._queuedReq) { + var queued = root._queuedReq; + root._queuedReq = null; + root._startFetch(queued); + } + } + } +}