diff --git a/cmd/loki/resource_windows_amd64.syso b/cmd/loki/resource_windows_amd64.syso index ba18d1f..d1f6d1c 100644 Binary files a/cmd/loki/resource_windows_amd64.syso and b/cmd/loki/resource_windows_amd64.syso differ diff --git a/cmd/loki/resource_windows_arm64.syso b/cmd/loki/resource_windows_arm64.syso index af598cb..763df1c 100644 Binary files a/cmd/loki/resource_windows_arm64.syso and b/cmd/loki/resource_windows_arm64.syso differ diff --git a/cmd/loki/versioninfo.json b/cmd/loki/versioninfo.json index 7e669dc..554e29c 100644 --- a/cmd/loki/versioninfo.json +++ b/cmd/loki/versioninfo.json @@ -3,13 +3,13 @@ "FileVersion": { "Major": 0, "Minor": 12, - "Patch": 1, + "Patch": 2, "Build": 0 }, "ProductVersion": { "Major": 0, "Minor": 12, - "Patch": 1, + "Patch": 2, "Build": 0 }, "FileFlagsMask": "3f", @@ -25,7 +25,7 @@ "LegalCopyright": "Copyright (c) 2026 Loki contributors. MIT License.", "OriginalFilename": "loki.exe", "ProductName": "Loki", - "ProductVersion": "0.12.1", + "ProductVersion": "0.12.2", "Comments": "https://github.com/R0m1k3/Loki — projet open source (MIT)" }, "VarFileInfo": { diff --git a/internal/loki/run.go b/internal/loki/run.go index 0e6a7e0..deb3868 100644 --- a/internal/loki/run.go +++ b/internal/loki/run.go @@ -10,7 +10,7 @@ import ( "strings" ) -const Version = "0.12.1" +const Version = "0.12.2" // Main est le vrai main() du binaire (cmd/loki ne fait que l'appeler). func Main() { diff --git a/internal/loki/ui/index.html b/internal/loki/ui/index.html index 44a3711..1f099e3 100644 --- a/internal/loki/ui/index.html +++ b/internal/loki/ui/index.html @@ -693,6 +693,10 @@ textarea.sctl{min-height:76px;resize:vertical;line-height:1.5} défilant toute seule (voir flushRender, 09-stream.js). L'animation de repli garde son overflow:hidden via la hauteur inline — les deux cohabitent. */ .msg.reasoning .bodywrap,.msg.tool .bodywrap{max-height:280px;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin} +/* Une capture d'écran ne se lit pas par le trou d'une serrure : la carte qui en + porte une échappe au plafond (l'image a déjà son propre max-height à 420 px, + cliquable plein écran via la visionneuse). */ +.msg.tool .bodywrap:has(.tool-shot){max-height:none} .msg.collapsible .bodywrap>.body{min-width:0} .msg.collapsible.collapsed .bodywrap{opacity:0;margin-top:0} /* Composer = un seul bloc cohérent : barre de contexte intégrée en tête (fine @@ -6611,8 +6615,14 @@ function handleDelta(d){ // tour continue, et rien d'autre n'est visible). Sinon, comportement inchangé. if(!tu.done || viewOn('hide-tools')) showTyping('tool'); // Résultat arrivé : la carte est finie, elle se replie tout de suite (en - // direct seulement — au rejeu elle est déjà née repliée). - if(tu.done){ if(!REPLAYING && T.pendingToolEl) collapseBody(T.pendingToolEl); T.pendingToolEl=null; if(tu.name==='mem_add'||tu.name==='mem_edit') loadMem(); } + // direct seulement — au rejeu elle est déjà née repliée). SAUF une capture + // d'écran : l'image EST le résultat, la replier la cacherait sitôt prise. + if(tu.done){ + if(!REPLAYING && T.pendingToolEl && !tu.image) collapseBody(T.pendingToolEl); + // Carte à image : retirée de la liste du tour, sinon le repli de fin de + // tour (collapseAll) la fermerait quand même. + if(tu.image && T.pendingToolEl){ const i=T.turnCollapsibles.indexOf(T.pendingToolEl); if(i>=0) T.turnCollapsibles.splice(i,1); } + T.pendingToolEl=null; if(tu.name==='mem_add'||tu.name==='mem_edit') loadMem(); } return; } if(d.drop_reasoning){ smoothReset(); cancelRender(); // le bloc raisonnement disparaît : rien à rendre diff --git a/internal/loki/ui/src/js/09-stream.js b/internal/loki/ui/src/js/09-stream.js index 6b4a20f..2603256 100644 --- a/internal/loki/ui/src/js/09-stream.js +++ b/internal/loki/ui/src/js/09-stream.js @@ -485,8 +485,14 @@ function handleDelta(d){ // tour continue, et rien d'autre n'est visible). Sinon, comportement inchangé. if(!tu.done || viewOn('hide-tools')) showTyping('tool'); // Résultat arrivé : la carte est finie, elle se replie tout de suite (en - // direct seulement — au rejeu elle est déjà née repliée). - if(tu.done){ if(!REPLAYING && T.pendingToolEl) collapseBody(T.pendingToolEl); T.pendingToolEl=null; if(tu.name==='mem_add'||tu.name==='mem_edit') loadMem(); } + // direct seulement — au rejeu elle est déjà née repliée). SAUF une capture + // d'écran : l'image EST le résultat, la replier la cacherait sitôt prise. + if(tu.done){ + if(!REPLAYING && T.pendingToolEl && !tu.image) collapseBody(T.pendingToolEl); + // Carte à image : retirée de la liste du tour, sinon le repli de fin de + // tour (collapseAll) la fermerait quand même. + if(tu.image && T.pendingToolEl){ const i=T.turnCollapsibles.indexOf(T.pendingToolEl); if(i>=0) T.turnCollapsibles.splice(i,1); } + T.pendingToolEl=null; if(tu.name==='mem_add'||tu.name==='mem_edit') loadMem(); } return; } if(d.drop_reasoning){ smoothReset(); cancelRender(); // le bloc raisonnement disparaît : rien à rendre diff --git a/internal/loki/ui/src/styles.css b/internal/loki/ui/src/styles.css index 3fed88b..20cefa1 100644 --- a/internal/loki/ui/src/styles.css +++ b/internal/loki/ui/src/styles.css @@ -662,6 +662,10 @@ textarea.sctl{min-height:76px;resize:vertical;line-height:1.5} défilant toute seule (voir flushRender, 09-stream.js). L'animation de repli garde son overflow:hidden via la hauteur inline — les deux cohabitent. */ .msg.reasoning .bodywrap,.msg.tool .bodywrap{max-height:280px;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin} +/* Une capture d'écran ne se lit pas par le trou d'une serrure : la carte qui en + porte une échappe au plafond (l'image a déjà son propre max-height à 420 px, + cliquable plein écran via la visionneuse). */ +.msg.tool .bodywrap:has(.tool-shot){max-height:none} .msg.collapsible .bodywrap>.body{min-width:0} .msg.collapsible.collapsed .bodywrap{opacity:0;margin-top:0} /* Composer = un seul bloc cohérent : barre de contexte intégrée en tête (fine