feat: import Excel via chat Léa, suppression nœuds VWB, fix temperature 0.1

- Chat Léa : "importe patients.xlsx" → preview → confirmation → table SQLite
  Bouton 📎 pour upload fichier, "montre les tables", "info table X"
- VWB : suppression nœuds via touche Suppr/Backspace + bouton croix rouge
- Fix : toutes les températures VLM à 0.1 (qwen3-vl bloque à 0.0)
- Fix : capture VWB avec DISPLAY=:1

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-03-17 07:18:51 +01:00
parent 97cb2957d5
commit 928b9e1065
8 changed files with 820 additions and 58 deletions

View File

@@ -133,7 +133,7 @@ function App() {
id: step.id,
type: 'step',
position: step.position || { x: 100, y: 100 + index * 120 },
data: { step },
data: { step, onDelete: handleDeleteStep },
}));
setNodes(newNodes);
@@ -475,10 +475,13 @@ function App() {
onEdgesChange={onEdgesChange}
onConnect={onConnect}
onEdgesDelete={onEdgesDelete}
onNodesDelete={(deleted) => {
deleted.forEach((node) => handleDeleteStep(node.id));
}}
onNodeClick={(_, node) => handleSelectStep(node.id)}
onNodeDragStop={handleNodeDragStop}
nodeTypes={nodeTypes}
deleteKeyCode="Delete"
deleteKeyCode={['Delete', 'Backspace']}
fitView
>
<Controls />

View File

@@ -5,7 +5,7 @@ import { ACTIONS } from '../types';
import { getAnchorThumbnailUrl } from '../services/api';
interface StepNodeProps {
data: { step: Step };
data: { step: Step; onDelete?: (id: string) => void };
selected?: boolean;
}
@@ -18,6 +18,20 @@ function StepNode({ data, selected }: StepNodeProps) {
return (
<div className={`step-node ${selected ? 'selected' : ''} ${isConditional ? 'conditional' : ''} ${isDataLoop ? 'data-loop' : ''} ${isImport ? 'data-import' : ''}`}>
{/* Bouton supprimer */}
{selected && (
<button
className="step-node-delete"
title="Supprimer (Suppr)"
onClick={(e) => {
e.stopPropagation();
data.onDelete?.(step.id);
}}
>
×
</button>
)}
{/* Entrée: haut */}
<Handle
type="target"

View File

@@ -415,6 +415,32 @@ body {
padding: 0.5rem;
font-size: 12px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
position: relative;
}
.step-node-delete {
position: absolute;
top: -8px;
right: -8px;
width: 20px;
height: 20px;
border-radius: 50%;
background: #e53935;
color: white;
border: 2px solid white;
font-size: 14px;
line-height: 1;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
box-shadow: 0 1px 3px rgba(0,0,0,0.3);
}
.step-node-delete:hover {
background: #c62828;
transform: scale(1.1);
}
.step-node.selected {